Skip to content

Instantly share code, notes, and snippets.

@sugoidogo
Created December 4, 2024 09:44
Show Gist options
  • Save sugoidogo/1e979a80f9301e869de5a5143e8ec061 to your computer and use it in GitHub Desktop.
Save sugoidogo/1e979a80f9301e869de5a5143e8ec061 to your computer and use it in GitHub Desktop.
import { DurableObject } from "cloudflare:workers";
export default {
/** @param {Request} request */
async fetch(request, env, ctx) {
if(request.headers.get('Accept')!='text/event-stream'){
return new Response()
}
let id = env.EVENT_SOURCE.idFromName('test');
let stub = env.EVENT_SOURCE.get(id);
return stub.fetch(request)
}
};
// Durable Object
export class EventSource extends DurableObject {
constructor(ctx, env) {
super(ctx, env)
this.ctx = ctx
ctx.storage.setAlarm(Date.now()+45000)
}
async alarm(){
const writer=this.encoderStream.writable.getWriter()
writer.write(': keepalive \n\n')
this.ctx.storage.setAlarm(Date.now()+45000)
}
async fetch(request) {
this.encoderStream=new TextEncoderStream()
return new Response(this.encoderStream.readable, {
headers: {
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
}
})
}
async send(data,event=undefined,id=undefined){
const writer=this.encoderStream.writable.getWriter()
if(event){
writer.write('event: '+event+'\n')
}
if(id){
writer.write('id: '+id+'\n')
}
for(const line of data.split('\n')){
writer.write('data: '+line+'\n')
}
writer.write('\n')
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment