export class MyDurableObject extends DurableObject<Env> {
encoder = new TextEncoder()
writers: Map<string, WritableStreamDefaultWriter<Uint8Array>> = new Map()
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
}
subscribe(request: Request): Response {
const stream = new IdentityTransformStream()
const writer = stream.writable.getWriter()
const id = crypto.randomUUID()
this.writers.set(id, writer)
const headers = {
'Connection': 'keep-alive',
'Cache-Control': 'no-cache',
'Content-Type': 'text/event-stream',
'Access-Control-Allow-Origin': request.headers.get('Origin')!, // secured @ worker (outside world portal)
}
// initial comment
writer.write(this.encoder.encode(`: connected\n\n`))
// clean up on abort
request.signal.addEventListener('abort', () => {
writer.close()
this.writers.delete(id)
})
return new Response(stream.readable, { headers })
}
async message(request: Request): Promise<Response> {
const data = await request.text()
for (const [_, writer] of this.writers) {
writer.write(this.encoder.encode(`data: ${data}\n\n`))
}
return new Response('good', {
status: 200,
headers: {
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Origin': request.headers.get('Origin')!,
},
})
}
}
export class MyDurableObject extends DurableObject<Env> {
encoder = new TextEncoder()
writers: Map<string, WritableStreamDefaultWriter<Uint8Array>> = new Map()
constructor(ctx: DurableObjectState, env: Env) {
super(ctx, env);
}
subscribe(request: Request): Response {
const stream = new IdentityTransformStream()
const writer = stream.writable.getWriter()
const id = crypto.randomUUID()
this.writers.set(id, writer)
const headers = {
'Connection': 'keep-alive',
'Cache-Control': 'no-cache',
'Content-Type': 'text/event-stream',
'Access-Control-Allow-Origin': request.headers.get('Origin')!, // secured @ worker (outside world portal)
}
// initial comment
writer.write(this.encoder.encode(`: connected\n\n`))
// clean up on abort
request.signal.addEventListener('abort', () => {
writer.close()
this.writers.delete(id)
})
return new Response(stream.readable, { headers })
}
async message(request: Request): Promise<Response> {
const data = await request.text()
for (const [_, writer] of this.writers) {
writer.write(this.encoder.encode(`data: ${data}\n\n`))
}
return new Response('good', {
status: 200,
headers: {
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Origin': request.headers.get('Origin')!,
},
})
}
}