@rixl/sdk
v0.4.1
Published
Official TypeScript/JavaScript SDK for the Rixl REST API — typed client for managing images, videos, and feeds.
Readme
@rixl/sdk
Official TypeScript / JavaScript SDK for the Rixl REST API.
Published on npm as @rixl/sdk.
Install
| Tool | Command |
| --------- | ------------------ |
| npm | npm i @rixl/sdk |
| pnpm | pnpm i @rixl/sdk |
| bun | bun i @rixl/sdk |
| vite plus | vp i @rixl/sdk |
Requires Node.js 18+. ESM only.
Quick Start
import {createClient, getImages} from "@rixl/sdk";
const client = createClient({
baseUrl: "https://api.rixl.com",
auth: process.env.RIXL_API_KEY,
responseStyle: "data",
});
const page = await getImages({
client,
query: {limit: 10},
});
console.log(page.data?.map((image) => image.id));auth can be either a string or a function, so you can plug in API keys, bearer tokens, or runtime token refresh logic.
Feed API
Fetch a feed and read posts:
import {createClient, getFeedsByFeedId} from "@rixl/sdk";
const client = createClient({
baseUrl: "https://api.rixl.com",
auth: process.env.RIXL_API_KEY,
responseStyle: "data",
});
const feed = await getFeedsByFeedId({
client,
path: {feedId: "FD4y3QB38S"},
query: {limit: 20, offset: 0},
});
for (const post of feed.data ?? []) {
console.log(post.id, post.type);
}Image API
List images and fetch one by ID:
import {createClient, getImages, getImagesByImageId} from "@rixl/sdk";
const client = createClient({
baseUrl: "https://api.rixl.com",
auth: process.env.RIXL_API_KEY,
responseStyle: "data",
});
const page = await getImages({
client,
query: {limit: 25, offset: 0},
});
const image = await getImagesByImageId({
client,
path: {imageId: "PS5IMKoFLm"},
});
console.log(page.data?.length, image.id, image.width, image.height);Initialize an upload, PUT the bytes to storage, then complete the upload:
import {createClient, postImagesUploadComplete, postImagesUploadInit} from "@rixl/sdk";
const client = createClient({
baseUrl: "https://api.rixl.com",
auth: process.env.RIXL_API_KEY,
responseStyle: "data",
});
const init = await postImagesUploadInit({
client,
body: {
name: "photo.jpg",
format: "jpeg",
},
});
await fetch(init.presigned_url!, {
method: "PUT",
body: imageBytes,
headers: {"Content-Type": "image/jpeg"},
});
const image = await postImagesUploadComplete({
client,
body: {
image_id: init.image_id,
attached_to_video: false,
},
});
console.log(image.id);Video API
List videos and fetch one by ID:
import {createClient, getVideos, getVideosByVideoId} from "@rixl/sdk";
const client = createClient({
baseUrl: "https://api.rixl.com",
auth: process.env.RIXL_API_KEY,
responseStyle: "data",
});
const page = await getVideos({
client,
query: {limit: 25, offset: 0},
});
const video = await getVideosByVideoId({
client,
path: {videoId: "VI9VXQxWXQ"},
});
console.log(page.data?.length, video.id, video.duration);Video uploads follow the same pattern, but init returns both video and poster upload URLs:
import {createClient, postVideosUploadComplete, postVideosUploadInit} from "@rixl/sdk";
const client = createClient({
baseUrl: "https://api.rixl.com",
auth: process.env.RIXL_API_KEY,
responseStyle: "data",
});
const init = await postVideosUploadInit({
client,
body: {
file_name: "clip.mp4",
image_format: "jpeg",
},
});
await Promise.all([
fetch(init.video_presigned_url!, {
method: "PUT",
body: videoBytes,
headers: {"Content-Type": "video/mp4"},
}),
fetch(init.poster_presigned_url!, {
method: "PUT",
body: posterBytes,
headers: {"Content-Type": "image/jpeg"},
}),
]);
const video = await postVideosUploadComplete({
client,
body: {
video_id: init.video_id,
},
});
console.log(video.id);Development
This repository uses Vite+ as the unified toolchain and package manager wrapper, with Bun underneath.
vp install # Install dependencies
vp run pack # Build the library
vp check # Run formatting, linting, and type checks