@superlayer/resumable-stream
v1.0.67
Published
Superlayer's drop-in replacement for Vercel's resumable-stream package.
Readme
@superlayer/resumable-stream
Superlayer's drop-in replacement for Vercel's resumable-stream package..
Maintained by Superlayer, based on the Instant source. See LICENSE.md and NOTICE for attribution.
Welcome to Superlayer’s resumable-stream library.
This is a drop-in replacement for Vercel's resumable-stream library using InstantDB streams.
Instant's streams have no dependency on Redis and they never expire.
Usage
You can provide your appId and adminToken as arguments to createResumableStreamContext or export INSTANT_APP_ID and INSTANT_APP_ADMIN_TOKEN.
Idempotent API
import { createResumableStreamContext } from '@superlayer/resumable-stream';
import { after } from 'next/server';
const streamContext = createResumableStreamContext({
waitUntil: after,
appId: YOUR_INSTANT_APP_ID, // or export INSTANT_APP_ID
adminToken: YOUR_INSTANT_APP_ADMIN_TOKEN, // or export INSTANT_APP_ADMIN_TOKEN
});
export async function GET(
req: NextRequest,
{ params }: { params: Promise<{ streamId: string }> },
) {
const { streamId } = await params;
const resumeAt = req.nextUrl.searchParams.get('resumeAt');
const stream = await streamContext.resumableStream(
streamId,
makeTestStream,
resumeAt ? parseInt(resumeAt) : undefined,
);
return new Response(stream, {
headers: {
'Content-Type': 'text/event-stream',
},
});
}Usage with explicit resumption
import { createResumableStreamContext } from '@superlayer/resumable-stream';
import { after } from 'next/server';
const streamContext = createResumableStreamContext({
waitUntil: after,
appId: YOUR_INSTANT_APP_ID, // or export INSTANT_APP_ID
adminToken: YOUR_INSTANT_APP_ADMIN_TOKEN, // or export INSTANT_APP_ADMIN_TOKEN
});
export async function POST(
req: NextRequest,
{ params }: { params: Promise<{ streamId: string }> },
) {
const { streamId } = await params;
const stream = await streamContext.createNewResumableStream(
streamId,
makeTestStream,
);
return new Response(stream, {
headers: {
'Content-Type': 'text/event-stream',
},
});
}
export async function GET(
req: NextRequest,
{ params }: { params: Promise<{ streamId: string }> },
) {
const { streamId } = await params;
const resumeAt = req.nextUrl.searchParams.get('resumeAt');
const stream = await streamContext.resumeExistingStream(
streamId,
resumeAt ? parseInt(resumeAt) : undefined,
);
return new Response(stream, {
headers: {
'Content-Type': 'text/event-stream',
},
});
}Questions?
If you have any questions, feel free to drop us a line on our issue tracker
