@uploadista/event-emitter-durable-object 0.0.11 → 0.0.13-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
- package/src/do-event-emitter.ts +12 -7
- package/src/durable-object-impl.ts +7 -2
- package/src/index.ts +2 -2
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/event-emitter-durable-object.ts","../src/do-event-emitter.ts","../src/durable-object-impl.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAQA;AAAsD,KAA1C,gCAA0C,CAAA,CAAA,CAAA,GAAJ,GAAA,CAAI,oBAAA,GAAA;EAKpC;;;;EAYG,IAAA,EAAA,CAAA,OAAA,EAZH,CAYG,EAAA,GAZG,OAYH,CAAA,IAAA,CAAA;EAAO;AAQ5B;;;;EAAiE,SAAA,EAAA,CAAA,UAAA,EAbvC,mBAauC,EAAA,GAbf,OAae,CAAA,IAAA,CAAA;;;;ECxBrD,WAAA,EAAA,GAAA,GDgBS,OChBT,CAAA,IAAA,CAAA;AAgBZ,CAAA;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/event-emitter-durable-object.ts","../src/do-event-emitter.ts","../src/durable-object-impl.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAQA;AAAsD,KAA1C,gCAA0C,CAAA,CAAA,CAAA,GAAJ,GAAA,CAAI,oBAAA,GAAA;EAKpC;;;;EAYG,IAAA,EAAA,CAAA,OAAA,EAZH,CAYG,EAAA,GAZG,OAYH,CAAA,IAAA,CAAA;EAAO;AAQ5B;;;;EAAiE,SAAA,EAAA,CAAA,UAAA,EAbvC,mBAauC,EAAA,GAbf,OAae,CAAA,IAAA,CAAA;;;;ECxBrD,WAAA,EAAA,GAAA,GDgBS,OChBT,CAAA,IAAA,CAAA;AAgBZ,CAAA;;;;;AA0EA;AACU,KDnEE,yBCmEF,CAAA,CAAA,CAAA,GDnEiC,sBCmEjC,CDlER,gCCkEQ,CDlEyB,CCkEzB,CAAA,CAAA;;;KA3FE,+BAAA;iBACK;;ADFjB;;;;;;;;AAyBA;;;;AAAiE,iBCRjD,6BAAA,CDQiD;EAAA;AAAA,CAAA,ECN9D,+BDM8D,CAAA,ECN5B,gBDM4B;;;;ACxBjE;AAgBA;;;;;AA0EA;;;;;;cAAa,oCACH,oCAA+B,KAAA,CAAA,MAAA;;;;;;;AD5FzC;;;;;;;;AAyBA;;;;AAAiE,cETpD,2BAAA,SAAoC,aAAA,CFSgB;;;;ACxBjE;EAgBgB,KAAA,CAAA,OAAA,ECIO,ODJP,CAAA,ECIiB,ODJY,CCIJ,QDJI,CAAA;EAC3C;;;;AAyEF;EACU,IAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EC7CqB,OD6CrB,CAAA,IAAA,CAAA;EAA+B;;;;;;EC5E5B,SAAA,CAAA,WAAA,EAqDkB,mBArDU,CAAA,EAqDY,OArDZ,CAAA,IAAA,CAAA;EAKlB;;;;;EAgD8B,WAAA,CAAA,CAAA,EAW9B,OAX8B,CAAA,IAAA,CAAA;EAW9B;;;;;EA0BD,gBAAA,CAAA,GAAA,EAdQ,SAcR,EAAA,OAAA,EAd4B,WAc5B,GAAA,MAAA,CAAA,EAdgD,OAchD,CAAA,IAAA,CAAA;EAgBK;;;;;qBAnBnB,+DAGc;;;;;;qBAgBK,4BAAyB"}
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/event-emitter-durable-object.ts","../src/do-event-emitter.ts","../src/durable-object-impl.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAQA;AAAsD,KAA1C,gCAA0C,CAAA,CAAA,CAAA,GAAJ,GAAA,CAAI,oBAAA,GAAA;EAKpC;;;;EAYG,IAAA,EAAA,CAAA,OAAA,EAZH,CAYG,EAAA,GAZG,OAYH,CAAA,IAAA,CAAA;EAAO;AAQ5B;;;;EAAiE,SAAA,EAAA,CAAA,UAAA,EAbvC,mBAauC,EAAA,GAbf,OAae,CAAA,IAAA,CAAA;;;;ECxBrD,WAAA,EAAA,GAAA,GDgBS,OChBT,CAAA,IAAA,CAAA;AAgBZ,CAAA;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/event-emitter-durable-object.ts","../src/do-event-emitter.ts","../src/durable-object-impl.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAQA;AAAsD,KAA1C,gCAA0C,CAAA,CAAA,CAAA,GAAJ,GAAA,CAAI,oBAAA,GAAA;EAKpC;;;;EAYG,IAAA,EAAA,CAAA,OAAA,EAZH,CAYG,EAAA,GAZG,OAYH,CAAA,IAAA,CAAA;EAAO;AAQ5B;;;;EAAiE,SAAA,EAAA,CAAA,UAAA,EAbvC,mBAauC,EAAA,GAbf,OAae,CAAA,IAAA,CAAA;;;;ECxBrD,WAAA,EAAA,GAAA,GDgBS,OChBT,CAAA,IAAA,CAAA;AAgBZ,CAAA;;;;;AA0EA;AACU,KDnEE,yBCmEF,CAAA,CAAA,CAAA,GDnEiC,sBCmEjC,CDlER,gCCkEQ,CDlEyB,CCkEzB,CAAA,CAAA;;;KA3FE,+BAAA;iBACK;;ADFjB;;;;;;;;AAyBA;;;;AAAiE,iBCRjD,6BAAA,CDQiD;EAAA;AAAA,CAAA,ECN9D,+BDM8D,CAAA,ECN5B,gBDM4B;;;;ACxBjE;AAgBA;;;;;AA0EA;;;;;;cAAa,oCACH,oCAA+B,KAAA,CAAA,MAAA;;;;;;;AD5FzC;;;;;;;;AAyBA;;;;AAAiE,cETpD,2BAAA,SAAoC,aAAA,CFSgB;;;;ACxBjE;EAgBgB,KAAA,CAAA,OAAA,ECIO,ODJP,CAAA,ECIiB,ODJY,CCIJ,QDJI,CAAA;EAC3C;;;;AAyEF;EACU,IAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EC7CqB,OD6CrB,CAAA,IAAA,CAAA;EAA+B;;;;;;EC5E5B,SAAA,CAAA,WAAA,EAqDkB,mBArDU,CAAA,EAqDY,OArDZ,CAAA,IAAA,CAAA;EAKlB;;;;;EAgD8B,WAAA,CAAA,CAAA,EAW9B,OAX8B,CAAA,IAAA,CAAA;EAW9B;;;;;EA0BD,gBAAA,CAAA,GAAA,EAdQ,SAcR,EAAA,OAAA,EAd4B,WAc5B,GAAA,MAAA,CAAA,EAdgD,OAchD,CAAA,IAAA,CAAA;EAgBK;;;;;qBAnBnB,+DAGc;;;;;;qBAgBK,4BAAyB"}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/do-event-emitter.ts","../src/durable-object-impl.ts"],"sourcesContent":["import { UploadistaError } from \"@uploadista/core/errors\";\nimport type { WebSocketConnection } from \"@uploadista/core/types\";\nimport {\n type BaseEventEmitter,\n BaseEventEmitterService,\n} from \"@uploadista/core/types\";\nimport { Effect, Layer } from \"effect\";\nimport type { EventEmitterDurableObject } from \"./event-emitter-durable-object\";\n\nexport type DurableObjectEventEmitterConfig = {\n durableObject: EventEmitterDurableObject<string>;\n};\n\n/**\n * Creates a BaseEventEmitter implementation using Cloudflare Durable Objects.\n *\n * This implementation:\n * - Routes events to Durable Object instances by eventKey\n * - Each eventKey gets its own DO instance\n * - WebSocket connections are managed by the DO\n * - No external broadcaster needed - DO is single source of truth\n *\n * @param config - Configuration with Durable Object namespace\n * @returns BaseEventEmitter implementation\n */\nexport function durableObjectBaseEventEmitter({\n durableObject,\n}: DurableObjectEventEmitterConfig): BaseEventEmitter {\n function getStub(eventKey: string) {\n const id = durableObject.idFromName(eventKey);\n return durableObject.get(id);\n }\n\n return {\n emit: (eventKey: string, message: string) => {\n return Effect.tryPromise({\n try: async () => {\n console.log(`[DO EventEmitter] Emitting to eventKey: ${eventKey}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/do-event-emitter.ts","../src/durable-object-impl.ts"],"sourcesContent":["import { UploadistaError } from \"@uploadista/core/errors\";\nimport type { WebSocketConnection } from \"@uploadista/core/types\";\nimport {\n type BaseEventEmitter,\n BaseEventEmitterService,\n} from \"@uploadista/core/types\";\nimport { Effect, Layer } from \"effect\";\nimport type { EventEmitterDurableObject } from \"./event-emitter-durable-object\";\n\nexport type DurableObjectEventEmitterConfig = {\n durableObject: EventEmitterDurableObject<string>;\n};\n\n/**\n * Creates a BaseEventEmitter implementation using Cloudflare Durable Objects.\n *\n * This implementation:\n * - Routes events to Durable Object instances by eventKey\n * - Each eventKey gets its own DO instance\n * - WebSocket connections are managed by the DO\n * - No external broadcaster needed - DO is single source of truth\n *\n * @param config - Configuration with Durable Object namespace\n * @returns BaseEventEmitter implementation\n */\nexport function durableObjectBaseEventEmitter({\n durableObject,\n}: DurableObjectEventEmitterConfig): BaseEventEmitter {\n function getStub(eventKey: string) {\n const id = durableObject.idFromName(eventKey);\n return durableObject.get(id);\n }\n\n return {\n emit: (eventKey: string, message: string) => {\n return Effect.tryPromise({\n try: async () => {\n console.log(\n `[DO EventEmitter] Emitting to eventKey: ${eventKey}`,\n message.substring(0, 200),\n );\n const stub = getStub(eventKey);\n // Call the emit RPC method on the Durable Object\n await (stub as any).emit(message);\n console.log(\n `[DO EventEmitter] Successfully emitted to eventKey: ${eventKey}`,\n );\n },\n catch: (cause) => {\n console.error(\n `[DO EventEmitter] Failed to emit to eventKey: ${eventKey}`,\n cause,\n );\n return UploadistaError.fromCode(\"UNKNOWN_ERROR\", { cause });\n },\n });\n },\n subscribe: (eventKey: string, connection: WebSocketConnection) => {\n return Effect.tryPromise({\n try: async () => {\n const stub = getStub(eventKey);\n // Call the subscribe RPC method on the Durable Object\n await (stub as any).subscribe(connection);\n },\n catch: (cause) => {\n return UploadistaError.fromCode(\"UNKNOWN_ERROR\", { cause });\n },\n });\n },\n unsubscribe: (eventKey: string) => {\n return Effect.tryPromise({\n try: async () => {\n const stub = getStub(eventKey);\n // Call the unsubscribe RPC method on the Durable Object\n await (stub as any).unsubscribe();\n },\n catch: (cause) => {\n return UploadistaError.fromCode(\"UNKNOWN_ERROR\", { cause });\n },\n });\n },\n };\n}\n\n/**\n * Creates a Layer for BaseEventEmitterService using Durable Objects.\n *\n * Use this when creating an Uploadista server with Durable Objects:\n *\n * @example\n * ```typescript\n * const server = await createUploadistaServer({\n * eventEmitter: durableObjectEventEmitter({\n * durableObject: env.UPLOADISTA_DO,\n * }),\n * // ... other config\n * });\n * ```\n */\nexport const durableObjectEventEmitter = (\n config: DurableObjectEventEmitterConfig,\n) =>\n Layer.succeed(BaseEventEmitterService, durableObjectBaseEventEmitter(config));\n","import { DurableObject } from \"cloudflare:workers\";\nimport type { WebSocketConnection } from \"@uploadista/core/types\";\n\n// WebSocketPair is available globally in Cloudflare Workers\ndeclare const WebSocketPair: {\n new (): { 0: WebSocket; 1: WebSocket };\n};\n\n/**\n * Base Durable Object implementation for Uploadista event emission.\n *\n * This class provides:\n * - Hibernatable WebSocket connections\n * - Event broadcasting to all connected clients\n * - Automatic connection management\n * - RPC methods for emit/subscribe/unsubscribe\n *\n * Extend this class in your Worker to create event emitter Durable Objects:\n *\n * @example\n * ```typescript\n * export class UploadistaDurableObject extends UploadistaDurableObjectImpl {}\n * ```\n */\nexport class UploadistaDurableObjectImpl extends DurableObject {\n /**\n * Handles WebSocket upgrade requests.\n * Creates a hibernatable WebSocket connection.\n */\n async fetch(request: Request): Promise<Response> {\n console.log(`[DO fetch] WebSocket connection request: ${request.url}`);\n\n // Creates two ends of a WebSocket connection\n const pair = new WebSocketPair();\n const [client, server] = Object.values(pair);\n\n // Accept WebSocket with hibernation support\n // This allows the DO to be evicted from memory during idle periods\n this.ctx.acceptWebSocket(server);\n\n console.log(\n `[DO fetch] WebSocket accepted, total connections: ${this.ctx.getWebSockets().length}`,\n );\n\n return new Response(null, {\n status: 101,\n webSocket: client as unknown,\n } as ResponseInit);\n }\n\n /**\n * RPC method: Emit a message to all connected WebSocket clients.\n *\n * @param message - The message to broadcast (typically a JSON string)\n */\n async emit(message: string): Promise<void> {\n const websockets = this.ctx.getWebSockets();\n console.log(\n `[DO emit] Broadcasting message to ${websockets.length} WebSocket(s):`,\n message.substring(0, 200),\n );\n\n for (const ws of websockets) {\n try {\n ws.send(message);\n } catch (error) {\n console.error(\"Failed to send message to WebSocket:\", error);\n }\n }\n }\n\n /**\n * RPC method: Subscribe a WebSocket connection.\n *\n * Note: This is called via RPC, the actual WebSocket connection\n * is established via the fetch() handler.\n */\n async subscribe(_connection: WebSocketConnection): Promise<void> {\n // The connection is already established via fetch()\n // This method exists for API compatibility\n return;\n }\n\n /**\n * RPC method: Unsubscribe from events.\n *\n * Closes all WebSocket connections for this DO instance.\n */\n async unsubscribe(): Promise<void> {\n const websockets = this.ctx.getWebSockets();\n for (const ws of websockets) {\n ws.close(1000, \"Unsubscribed\");\n }\n }\n\n /**\n * Hibernation API: Handle incoming WebSocket messages.\n *\n * Called automatically when a message arrives on a hibernated WebSocket.\n */\n async webSocketMessage(_ws: WebSocket, message: ArrayBuffer | string) {\n // Log message for debugging\n console.log(`WebSocket message received: ${message}`);\n }\n\n /**\n * Hibernation API: Handle WebSocket close events.\n *\n * Called automatically when a WebSocket connection closes.\n */\n async webSocketClose(\n ws: WebSocket,\n code: number,\n _reason: string,\n _wasClean: boolean,\n ) {\n // Clean up the connection\n if (ws.readyState === WebSocket.OPEN) {\n // Use a valid close code instead of potentially reserved ones\n const validCloseCode =\n code === 1006 || code < 1000 || code > 4999 ? 1000 : code;\n ws.close(validCloseCode, \"Durable Object closing WebSocket\");\n }\n }\n\n /**\n * Hibernation API: Handle WebSocket errors.\n *\n * Called automatically when a WebSocket error occurs.\n */\n async webSocketError(ws: WebSocket, error: unknown) {\n console.error(\"WebSocket error:\", error);\n if (ws.readyState === WebSocket.OPEN) {\n ws.close(1011, \"WebSocket error occurred\");\n }\n }\n}\n"],"mappings":"yNAyBA,SAAgB,EAA8B,CAC5C,iBACoD,CACpD,SAAS,EAAQ,EAAkB,CACjC,IAAM,EAAK,EAAc,WAAW,EAAS,CAC7C,OAAO,EAAc,IAAI,EAAG,CAG9B,MAAO,CACL,MAAO,EAAkB,IAChB,EAAO,WAAW,CACvB,IAAK,SAAY,CACf,QAAQ,IACN,2CAA2C,IAC3C,EAAQ,UAAU,EAAG,IAAI,CAC1B,CAGD,MAFa,EAAQ,EAAS,CAEV,KAAK,EAAQ,CACjC,QAAQ,IACN,uDAAuD,IACxD,EAEH,MAAQ,IACN,QAAQ,MACN,iDAAiD,IACjD,EACD,CACM,EAAgB,SAAS,gBAAiB,CAAE,QAAO,CAAC,EAE9D,CAAC,CAEJ,WAAY,EAAkB,IACrB,EAAO,WAAW,CACvB,IAAK,SAAY,CAGf,MAFa,EAAQ,EAAS,CAEV,UAAU,EAAW,EAE3C,MAAQ,GACC,EAAgB,SAAS,gBAAiB,CAAE,QAAO,CAAC,CAE9D,CAAC,CAEJ,YAAc,GACL,EAAO,WAAW,CACvB,IAAK,SAAY,CAGf,MAFa,EAAQ,EAAS,CAEV,aAAa,EAEnC,MAAQ,GACC,EAAgB,SAAS,gBAAiB,CAAE,QAAO,CAAC,CAE9D,CAAC,CAEL,CAkBH,MAAa,EACX,GAEA,EAAM,QAAQ,EAAyB,EAA8B,EAAO,CAAC,CC9E/E,IAAa,EAAb,cAAiD,CAAc,CAK7D,MAAM,MAAM,EAAqC,CAC/C,QAAQ,IAAI,4CAA4C,EAAQ,MAAM,CAGtE,IAAM,EAAO,IAAI,cACX,CAAC,EAAQ,GAAU,OAAO,OAAO,EAAK,CAU5C,OANA,KAAK,IAAI,gBAAgB,EAAO,CAEhC,QAAQ,IACN,qDAAqD,KAAK,IAAI,eAAe,CAAC,SAC/E,CAEM,IAAI,SAAS,KAAM,CACxB,OAAQ,IACR,UAAW,EACZ,CAAiB,CAQpB,MAAM,KAAK,EAAgC,CACzC,IAAM,EAAa,KAAK,IAAI,eAAe,CAC3C,QAAQ,IACN,qCAAqC,EAAW,OAAO,gBACvD,EAAQ,UAAU,EAAG,IAAI,CAC1B,CAED,IAAK,IAAM,KAAM,EACf,GAAI,CACF,EAAG,KAAK,EAAQ,OACT,EAAO,CACd,QAAQ,MAAM,uCAAwC,EAAM,EAWlE,MAAM,UAAU,EAAiD,EAWjE,MAAM,aAA6B,CACjC,IAAM,EAAa,KAAK,IAAI,eAAe,CAC3C,IAAK,IAAM,KAAM,EACf,EAAG,MAAM,IAAM,eAAe,CASlC,MAAM,iBAAiB,EAAgB,EAA+B,CAEpE,QAAQ,IAAI,+BAA+B,IAAU,CAQvD,MAAM,eACJ,EACA,EACA,EACA,EACA,CAEA,GAAI,EAAG,aAAe,UAAU,KAAM,CAEpC,IAAM,EACJ,IAAS,MAAQ,EAAO,KAAQ,EAAO,KAAO,IAAO,EACvD,EAAG,MAAM,EAAgB,mCAAmC,EAShE,MAAM,eAAe,EAAe,EAAgB,CAClD,QAAQ,MAAM,mBAAoB,EAAM,CACpC,EAAG,aAAe,UAAU,MAC9B,EAAG,MAAM,KAAM,2BAA2B"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uploadista/event-emitter-durable-object",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.13-beta.1",
|
|
5
5
|
"description": "Durable Object event emitter for Uploadista",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Uploadista",
|
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@cloudflare/workers-types": "4.
|
|
18
|
-
"effect": "3.19.
|
|
19
|
-
"@uploadista/core": "0.0.
|
|
17
|
+
"@cloudflare/workers-types": "4.20251106.1",
|
|
18
|
+
"effect": "3.19.2",
|
|
19
|
+
"@uploadista/core": "0.0.13-beta.1"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"tsdown": "0.16.0",
|
|
23
|
-
"@uploadista/typescript-config": "0.0.
|
|
23
|
+
"@uploadista/typescript-config": "0.0.13-beta.1"
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
26
|
"build": "tsdown",
|
package/src/do-event-emitter.ts
CHANGED
|
@@ -35,14 +35,22 @@ export function durableObjectBaseEventEmitter({
|
|
|
35
35
|
emit: (eventKey: string, message: string) => {
|
|
36
36
|
return Effect.tryPromise({
|
|
37
37
|
try: async () => {
|
|
38
|
-
console.log(
|
|
38
|
+
console.log(
|
|
39
|
+
`[DO EventEmitter] Emitting to eventKey: ${eventKey}`,
|
|
40
|
+
message.substring(0, 200),
|
|
41
|
+
);
|
|
39
42
|
const stub = getStub(eventKey);
|
|
40
43
|
// Call the emit RPC method on the Durable Object
|
|
41
44
|
await (stub as any).emit(message);
|
|
42
|
-
console.log(
|
|
45
|
+
console.log(
|
|
46
|
+
`[DO EventEmitter] Successfully emitted to eventKey: ${eventKey}`,
|
|
47
|
+
);
|
|
43
48
|
},
|
|
44
49
|
catch: (cause) => {
|
|
45
|
-
console.error(
|
|
50
|
+
console.error(
|
|
51
|
+
`[DO EventEmitter] Failed to emit to eventKey: ${eventKey}`,
|
|
52
|
+
cause,
|
|
53
|
+
);
|
|
46
54
|
return UploadistaError.fromCode("UNKNOWN_ERROR", { cause });
|
|
47
55
|
},
|
|
48
56
|
});
|
|
@@ -92,7 +100,4 @@ export function durableObjectBaseEventEmitter({
|
|
|
92
100
|
export const durableObjectEventEmitter = (
|
|
93
101
|
config: DurableObjectEventEmitterConfig,
|
|
94
102
|
) =>
|
|
95
|
-
Layer.succeed(
|
|
96
|
-
BaseEventEmitterService,
|
|
97
|
-
durableObjectBaseEventEmitter(config),
|
|
98
|
-
);
|
|
103
|
+
Layer.succeed(BaseEventEmitterService, durableObjectBaseEventEmitter(config));
|
|
@@ -38,7 +38,9 @@ export class UploadistaDurableObjectImpl extends DurableObject {
|
|
|
38
38
|
// This allows the DO to be evicted from memory during idle periods
|
|
39
39
|
this.ctx.acceptWebSocket(server);
|
|
40
40
|
|
|
41
|
-
console.log(
|
|
41
|
+
console.log(
|
|
42
|
+
`[DO fetch] WebSocket accepted, total connections: ${this.ctx.getWebSockets().length}`,
|
|
43
|
+
);
|
|
42
44
|
|
|
43
45
|
return new Response(null, {
|
|
44
46
|
status: 101,
|
|
@@ -53,7 +55,10 @@ export class UploadistaDurableObjectImpl extends DurableObject {
|
|
|
53
55
|
*/
|
|
54
56
|
async emit(message: string): Promise<void> {
|
|
55
57
|
const websockets = this.ctx.getWebSockets();
|
|
56
|
-
console.log(
|
|
58
|
+
console.log(
|
|
59
|
+
`[DO emit] Broadcasting message to ${websockets.length} WebSocket(s):`,
|
|
60
|
+
message.substring(0, 200),
|
|
61
|
+
);
|
|
57
62
|
|
|
58
63
|
for (const ws of websockets) {
|
|
59
64
|
try {
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export {
|
|
2
|
-
durableObjectEventEmitter,
|
|
3
|
-
durableObjectBaseEventEmitter,
|
|
4
2
|
type DurableObjectEventEmitterConfig,
|
|
3
|
+
durableObjectBaseEventEmitter,
|
|
4
|
+
durableObjectEventEmitter,
|
|
5
5
|
} from "./do-event-emitter";
|
|
6
6
|
export { UploadistaDurableObjectImpl } from "./durable-object-impl";
|
|
7
7
|
export type { EventEmitterDurableObject } from "./event-emitter-durable-object";
|