@pluv/platform-cloudflare 4.0.1 → 4.0.2

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.
@@ -1,16 +1,16 @@
1
-
2
- > @pluv/platform-cloudflare@4.0.1 build /home/runner/work/pluv/pluv/packages/platform-cloudflare
3
- > tsdown
4
-
5
- ℹ tsdown v0.20.0-beta.4 powered by rolldown v1.0.0-beta.60
1
+ $ tsdown
2
+ ℹ tsdown v0.22.2 powered by rolldown v1.1.0
6
3
  ℹ config file: /home/runner/work/pluv/pluv/packages/platform-cloudflare/tsdown.config.ts
7
4
  ℹ entry: src/index.ts
8
5
  ℹ target: esnext
9
6
  ℹ tsconfig: tsconfig.json
7
+
8
+  WARN  `external` is deprecated. Use `deps.neverBundle` instead.
9
+
10
10
  ℹ Build start
11
- ℹ dist/index.mjs  6.30 kB │ gzip: 1.81 kB
12
- ℹ dist/index.mjs.map 18.41 kB │ gzip: 4.57 kB
13
- ℹ dist/index.d.mts.map  3.10 kB │ gzip: 0.99 kB
11
+ ℹ dist/index.mjs  6.19 kB │ gzip: 1.77 kB
12
+ ℹ dist/index.mjs.map 18.45 kB │ gzip: 4.52 kB
13
+ ℹ dist/index.d.mts.map  3.07 kB │ gzip: 0.99 kB
14
14
  ℹ dist/index.d.mts  5.79 kB │ gzip: 1.47 kB
15
- ℹ 4 files, total: 33.60 kB
16
- ✔ Build complete in 712ms
15
+ ℹ 4 files, total: 33.50 kB
16
+ ✔ Build complete in 704ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @pluv/platform-cloudflare
2
2
 
3
+ ## 4.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - e1913b3: Upgraded internal dependencies
8
+ - Updated dependencies [e1913b3]
9
+ - @pluv/persistence-cloudflare-transactional-storage@4.0.2
10
+ - @pluv/types@4.0.2
11
+ - @pluv/crdt@4.0.2
12
+ - @pluv/io@4.0.2
13
+
3
14
  ## 4.0.1
4
15
 
5
16
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/CloudflareWebSocket.ts","../src/CloudflarePlatform.ts","../src/utils/identity.ts","../src/infer.ts","../src/platformCloudflare.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/CloudflareWebSocket.ts","../src/CloudflarePlatform.ts","../src/utils/identity.ts","../src/infer.ts","../src/platformCloudflare.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,9 +1,7 @@
1
1
  import { AbstractPlatform, AbstractWebSocket } from "@pluv/io";
2
2
  import { PersistenceCloudflareTransactionalStorage } from "@pluv/persistence-cloudflare-transactional-storage";
3
-
4
3
  //#region src/infer.ts
5
4
  const infer = (callback) => callback;
6
-
7
5
  //#endregion
8
6
  //#region src/CloudflareWebSocket.ts
9
7
  var CloudflareWebSocket = class extends AbstractWebSocket {
@@ -103,11 +101,6 @@ var CloudflareWebSocket = class extends AbstractWebSocket {
103
101
  return this.webSocket.close(code, "Terminated");
104
102
  }
105
103
  };
106
-
107
- //#endregion
108
- //#region src/constants.ts
109
- const DEFAULT_REGISTRATION_MODE = "detached";
110
-
111
104
  //#endregion
112
105
  //#region src/CloudflarePlatform.ts
113
106
  var CloudflarePlatform = class CloudflarePlatform extends AbstractPlatform {
@@ -122,7 +115,7 @@ var CloudflarePlatform = class CloudflarePlatform extends AbstractPlatform {
122
115
  this._config = {
123
116
  authorize: { secret: true },
124
117
  handleMode: "io",
125
- registrationMode: config.mode ?? DEFAULT_REGISTRATION_MODE,
118
+ registrationMode: config.mode ?? "detached",
126
119
  requireAuth: false,
127
120
  listeners: {
128
121
  onRoomDestroyed: true,
@@ -211,7 +204,6 @@ var CloudflarePlatform = class CloudflarePlatform extends AbstractPlatform {
211
204
  return this._roomContext?.state ?? null;
212
205
  }
213
206
  };
214
-
215
207
  //#endregion
216
208
  //#region src/platformCloudflare.ts
217
209
  const platformCloudflare = (config = {}) => {
@@ -225,7 +217,7 @@ const platformCloudflare = (config = {}) => {
225
217
  platform: () => new CloudflarePlatform(config)
226
218
  };
227
219
  };
228
-
229
220
  //#endregion
230
221
  export { infer, platformCloudflare };
222
+
231
223
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/infer.ts","../src/CloudflareWebSocket.ts","../src/constants.ts","../src/CloudflarePlatform.ts","../src/platformCloudflare.ts"],"sourcesContent":["import type { Json } from \"@pluv/types\";\nimport type { identity } from \"./utils\";\n\nexport type InferCallback<\n TEnv extends Record<string, any> = {},\n TMeta extends Record<string, Json> = {},\n> = (i: typeof identity) => {\n env?: (io: TEnv) => TEnv;\n meta?: (io: TMeta) => TMeta;\n};\n\nexport const infer = <\n TEnv extends Record<string, any> = {},\n TMeta extends Record<string, Json> = {},\n>(\n callback: InferCallback<TEnv, TMeta>,\n) => callback;\n","import type {\n AbstractEventMap,\n AbstractListener,\n AbstractWebSocketConfig,\n WebSocketSerializedState,\n WebSocketSession,\n} from \"@pluv/io\";\nimport { AbstractWebSocket } from \"@pluv/io\";\nimport type { InferIOAuthorizeUser, IOAuthorize, JsonObject } from \"@pluv/types\";\n\nexport interface CloudflareWebSocketEventMap {\n close: CloseEvent;\n message: MessageEvent;\n open: Event;\n error: ErrorEvent;\n}\n\nexport type CloudflareWebSocketConfig = AbstractWebSocketConfig;\n\nexport class CloudflareWebSocket<\n TAuthorize extends IOAuthorize<any, any> | null = null,\n> extends AbstractWebSocket<WebSocket, TAuthorize> {\n public set presence(presence: JsonObject | null) {\n const deserialized = this.webSocket.deserializeAttachment();\n const state = deserialized.state;\n\n this.webSocket.serializeAttachment({\n ...this.webSocket.deserializeAttachment(),\n state: { ...state, presence },\n });\n }\n\n public get readyState(): 0 | 1 | 2 | 3 {\n return this.webSocket.readyState as 0 | 1 | 2 | 3;\n }\n\n public get session(): WebSocketSession<TAuthorize> {\n const deserialized = this.webSocket.deserializeAttachment();\n const sessionId = deserialized.sessionId as string;\n const state = this.state;\n const user = (deserialized.user ?? null) as InferIOAuthorizeUser<TAuthorize>;\n\n return {\n ...state,\n id: sessionId,\n user,\n webSocket: this,\n };\n }\n\n public get sessionId(): string {\n const deserialized = this.webSocket.deserializeAttachment() ?? {};\n const sessionId = deserialized.sessionId ?? `p_${crypto.randomUUID()}`;\n\n if (typeof deserialized.sessionId !== \"string\") {\n this.webSocket.serializeAttachment({ ...deserialized, sessionId });\n }\n\n return sessionId;\n }\n\n public get state(): WebSocketSerializedState {\n const deserialized = this.webSocket.deserializeAttachment();\n const state = deserialized?.state ?? null;\n\n if (!state) throw new Error(\"Could not get websocket state\");\n\n const currentPing = state.timers.ping;\n const lastPing = this._platform.getLastPing(this);\n\n if (!lastPing) return state;\n if (currentPing >= lastPing) return state;\n\n const newState: WebSocketSerializedState = {\n ...state,\n timers: { ...state.timers, ping: lastPing },\n };\n\n return this._platform.setSerializedState(this, newState);\n }\n\n public set state(state: WebSocketSerializedState) {\n const deserialized = this.webSocket.deserializeAttachment();\n\n this.webSocket.serializeAttachment({ ...deserialized, state });\n }\n\n public set user(user: InferIOAuthorizeUser<TAuthorize>) {\n const deserialized = this.webSocket.deserializeAttachment();\n\n this.webSocket.serializeAttachment({ ...deserialized, user });\n }\n\n constructor(webSocket: WebSocket, config: CloudflareWebSocketConfig) {\n const { room } = config;\n\n super(webSocket, config);\n\n const state: WebSocketSerializedState = {\n presence: null,\n quit: false,\n room,\n timers: {\n ping: new Date().getTime(),\n presence: null,\n },\n };\n\n webSocket.serializeAttachment({\n state,\n ...webSocket.deserializeAttachment(),\n });\n }\n\n public addEventListener<TType extends keyof AbstractEventMap>(\n type: TType,\n handler: AbstractListener<TType>,\n ) {\n this.webSocket.addEventListener(type, handler as any);\n }\n\n public close(code?: number | undefined, reason?: string | undefined): void {\n const canClose = [this.CONNECTING, this.OPEN].some(\n (readyState) => readyState === this.readyState,\n );\n\n if (!canClose) return;\n\n this.webSocket.close(code, reason);\n }\n\n public send(message: string | ArrayBuffer | ArrayBufferView): void {\n if (this.readyState !== this.OPEN) return;\n\n this.webSocket.send(message);\n }\n\n public terminate(code: number = 1011): void {\n return this.webSocket.close(code, \"Terminated\");\n }\n}\n","import type { WebSocketRegistrationMode } from \"@pluv/io\";\n\nexport const DEFAULT_REGISTRATION_MODE: WebSocketRegistrationMode = \"detached\";\nexport const GARBAGE_COLLECT_INTERVAL_MS = 60_000;\n","import type {\n AbstractPlatformConfig,\n ConvertWebSocketConfig,\n WebSocketRegistrationMode,\n WebSocketSerializedState,\n} from \"@pluv/io\";\nimport { AbstractPlatform } from \"@pluv/io\";\nimport { PersistenceCloudflareTransactionalStorage } from \"@pluv/persistence-cloudflare-transactional-storage\";\nimport type { IOAuthorize, Json } from \"@pluv/types\";\nimport { CloudflareWebSocket } from \"./CloudflareWebSocket\";\nimport { DEFAULT_REGISTRATION_MODE } from \"./constants\";\n\nexport type CloudflarePlatformRoomContext<\n TEnv extends Record<string, any>,\n TMeta extends Record<string, Json>,\n> = {\n env: TEnv;\n state: DurableObjectState;\n} & (keyof TMeta extends never ? { meta?: undefined } : { meta: TMeta });\n\nexport type CloudflarePlatformConfig<\n TEnv extends Record<string, any> = {},\n TMeta extends Record<string, Json> = {},\n> = AbstractPlatformConfig<CloudflarePlatformRoomContext<TEnv, TMeta>> & {\n mode?: WebSocketRegistrationMode;\n};\n\nexport class CloudflarePlatform<\n TAuthorize extends IOAuthorize<any, any> | null = null,\n TEnv extends Record<string, any> = {},\n TMeta extends Record<string, Json> = {},\n> extends AbstractPlatform<\n CloudflareWebSocket<TAuthorize>,\n { env: TEnv; request: Request },\n CloudflarePlatformRoomContext<TEnv, TMeta>,\n {\n authorize: {\n secret: true;\n };\n handleMode: \"io\";\n requireAuth: false;\n registrationMode: WebSocketRegistrationMode;\n listeners: {\n onRoomDestroyed: true;\n onRoomMessage: true;\n onStorageDestroyed: true;\n onStorageUpdated: true;\n onUserConnected: true;\n onUserDisconnected: true;\n };\n router: true;\n }\n> {\n public readonly id = crypto.randomUUID();\n public readonly _config;\n public readonly _name = \"platformCloudflare\";\n\n constructor(config: CloudflarePlatformConfig<TEnv, TMeta>) {\n super({\n ...config,\n ...(config.roomContext && config.mode === \"detached\"\n ? {\n persistence:\n config.persistence ??\n new PersistenceCloudflareTransactionalStorage({ mode: \"sqlite\" }),\n }\n : {}),\n });\n\n this._config = {\n authorize: {\n secret: true as const,\n },\n handleMode: \"io\" as const,\n registrationMode: config.mode ?? DEFAULT_REGISTRATION_MODE,\n requireAuth: false as const,\n listeners: {\n onRoomDestroyed: true as const,\n onRoomMessage: true as const,\n onStorageDestroyed: true as const,\n onStorageUpdated: true as const,\n onUserConnected: true as const,\n onUserDisconnected: true as const,\n },\n router: true as const,\n };\n\n const detachedState = this._getDetachedState();\n\n if (!detachedState) return;\n\n detachedState.setWebSocketAutoResponse(\n new WebSocketRequestResponsePair(\n '{\"type\":\"$ping\",\"data\":{}}',\n JSON.stringify({ type: \"$pong\", data: {} }),\n ),\n );\n }\n\n public async acceptWebSocket(webSocket: CloudflareWebSocket<TAuthorize>): Promise<void> {\n const detachedState = this._getDetachedState();\n\n if (!detachedState) {\n webSocket.webSocket.accept();\n\n return;\n }\n\n detachedState.acceptWebSocket(webSocket.webSocket);\n }\n\n public convertWebSocket(\n webSocket: WebSocket,\n config: ConvertWebSocketConfig,\n ): CloudflareWebSocket<TAuthorize> {\n const { room } = config;\n\n return new CloudflareWebSocket<TAuthorize>(webSocket, {\n persistence: this.persistence,\n platform: this,\n room,\n });\n }\n\n public getLastPing(webSocket: CloudflareWebSocket<TAuthorize>): number | null {\n const detachedState = this._getDetachedState();\n\n if (!detachedState) return null;\n\n const timestamp = detachedState.getWebSocketAutoResponseTimestamp(webSocket.webSocket);\n\n return timestamp?.getTime() ?? null;\n }\n\n public getSerializedState(webSocket: WebSocket): WebSocketSerializedState | null {\n const deserialized = webSocket.deserializeAttachment();\n\n return deserialized?.state ?? null;\n }\n\n public getSessionId(webSocket: WebSocket): string | null {\n const deserialized = webSocket.deserializeAttachment() ?? {};\n const sessionId = deserialized.sessionId;\n\n if (typeof sessionId !== \"string\") return null;\n\n return sessionId;\n }\n\n public getWebSockets(): readonly WebSocket[] {\n const detachedState = this._getDetachedState();\n\n if (!detachedState) return [];\n\n const webSockets = detachedState.getWebSockets() ?? [];\n\n return webSockets;\n }\n\n public initialize(\n config: AbstractPlatformConfig<CloudflarePlatformRoomContext<TEnv, TMeta>>,\n ): this {\n const ctx = config.roomContext ?? { ...this._roomContext };\n\n if (!ctx.env || !ctx.state) throw new Error(\"Could not derive platform roomContext\");\n\n const roomContext = {\n env: ctx.env,\n meta: ctx.meta,\n state: ctx.state,\n } as CloudflarePlatformRoomContext<TEnv, TMeta>;\n\n return new CloudflarePlatform<TAuthorize, TEnv, TMeta>({\n roomContext,\n mode: this._config.registrationMode,\n persistence: this.persistence.initialize(roomContext),\n pubSub: this.pubSub,\n })._initialize() as this;\n }\n\n public parseData(data: string | ArrayBuffer): Record<string, any> {\n if (typeof data === \"string\") return JSON.parse(data);\n\n const decoder = new TextDecoder(\"utf8\");\n\n return JSON.parse(decoder.decode(data));\n }\n\n public randomUUID(): string {\n return crypto.randomUUID();\n }\n\n public setSerializedState(\n webSocket: CloudflareWebSocket<TAuthorize>,\n state: WebSocketSerializedState,\n ): WebSocketSerializedState {\n const deserialized = webSocket.webSocket.deserializeAttachment() ?? {};\n\n webSocket.webSocket.serializeAttachment({ ...deserialized, state });\n\n return state;\n }\n\n private _getDetachedState(): DurableObjectState | null {\n if (this._config.registrationMode !== \"detached\") return null;\n\n const detachedState = this._roomContext?.state ?? null;\n\n return detachedState;\n }\n}\n","import type { CrdtLibraryType, NoopCrdtDocFactory } from \"@pluv/crdt\";\nimport type { CreateIOParams, InferInitContextType, PluvContext, PluvIOAuthorize } from \"@pluv/io\";\nimport type { BaseUser, Id, IOAuthorize, Json } from \"@pluv/types\";\nimport type { CloudflarePlatformConfig } from \"./CloudflarePlatform\";\nimport { CloudflarePlatform } from \"./CloudflarePlatform\";\nimport type { InferCallback } from \"./infer\";\n\nexport type PlatformCloudflareCreateIOParams<\n TEnv extends Record<string, any> = {},\n TMeta extends Record<string, Json> = {},\n TContext extends Record<string, any> = {},\n TUser extends BaseUser | null = null,\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n> = Id<\n CloudflarePlatformConfig<TEnv, TMeta> &\n Omit<\n CreateIOParams<\n CloudflarePlatform<IOAuthorize<TUser, TContext>, TEnv, TMeta>,\n TContext,\n TUser,\n TCrdt\n >,\n \"authorize\" | \"context\" | \"platform\"\n > & {\n authorize?: PluvIOAuthorize<\n CloudflarePlatform<IOAuthorize<TUser, TContext>, TEnv, TMeta>,\n TUser,\n InferInitContextType<CloudflarePlatform<IOAuthorize<TUser, TContext>, TEnv, TMeta>>\n >;\n context?: PluvContext<\n CloudflarePlatform<IOAuthorize<TUser, any>, TEnv, TMeta>,\n TContext\n >;\n types?: InferCallback<TEnv, TMeta>;\n }\n>;\n\nexport const platformCloudflare = <\n TEnv extends Record<string, any> = {},\n TMeta extends Record<string, Json> = {},\n TContext extends Record<string, any> = {},\n TUser extends BaseUser | null = null,\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n>(\n config: PlatformCloudflareCreateIOParams<TEnv, TMeta, TContext, TUser, TCrdt> = {},\n): CreateIOParams<\n CloudflarePlatform<IOAuthorize<TUser, TContext>, TEnv, TMeta>,\n TContext,\n TUser,\n TCrdt\n> => {\n const { authorize, context, crdt, debug, limits } = config;\n\n return {\n authorize,\n context,\n crdt,\n debug,\n limits,\n platform: () => new CloudflarePlatform<IOAuthorize<TUser, TContext>, TEnv, TMeta>(config),\n };\n};\n"],"mappings":";;;;AAWA,MAAa,SAIT,aACC;;;;ACGL,IAAa,sBAAb,cAEU,kBAAyC;CAC/C,IAAW,SAAS,UAA6B;EAE7C,MAAM,QADe,KAAK,UAAU,uBAAuB,CAChC;AAE3B,OAAK,UAAU,oBAAoB;GAC/B,GAAG,KAAK,UAAU,uBAAuB;GACzC,OAAO;IAAE,GAAG;IAAO;IAAU;GAChC,CAAC;;CAGN,IAAW,aAA4B;AACnC,SAAO,KAAK,UAAU;;CAG1B,IAAW,UAAwC;EAC/C,MAAM,eAAe,KAAK,UAAU,uBAAuB;EAC3D,MAAM,YAAY,aAAa;EAC/B,MAAM,QAAQ,KAAK;EACnB,MAAM,OAAQ,aAAa,QAAQ;AAEnC,SAAO;GACH,GAAG;GACH,IAAI;GACJ;GACA,WAAW;GACd;;CAGL,IAAW,YAAoB;EAC3B,MAAM,eAAe,KAAK,UAAU,uBAAuB,IAAI,EAAE;EACjE,MAAM,YAAY,aAAa,aAAa,KAAK,OAAO,YAAY;AAEpE,MAAI,OAAO,aAAa,cAAc,SAClC,MAAK,UAAU,oBAAoB;GAAE,GAAG;GAAc;GAAW,CAAC;AAGtE,SAAO;;CAGX,IAAW,QAAkC;EAEzC,MAAM,QADe,KAAK,UAAU,uBAAuB,EAC/B,SAAS;AAErC,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,gCAAgC;EAE5D,MAAM,cAAc,MAAM,OAAO;EACjC,MAAM,WAAW,KAAK,UAAU,YAAY,KAAK;AAEjD,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,eAAe,SAAU,QAAO;EAEpC,MAAM,WAAqC;GACvC,GAAG;GACH,QAAQ;IAAE,GAAG,MAAM;IAAQ,MAAM;IAAU;GAC9C;AAED,SAAO,KAAK,UAAU,mBAAmB,MAAM,SAAS;;CAG5D,IAAW,MAAM,OAAiC;EAC9C,MAAM,eAAe,KAAK,UAAU,uBAAuB;AAE3D,OAAK,UAAU,oBAAoB;GAAE,GAAG;GAAc;GAAO,CAAC;;CAGlE,IAAW,KAAK,MAAwC;EACpD,MAAM,eAAe,KAAK,UAAU,uBAAuB;AAE3D,OAAK,UAAU,oBAAoB;GAAE,GAAG;GAAc;GAAM,CAAC;;CAGjE,YAAY,WAAsB,QAAmC;EACjE,MAAM,EAAE,SAAS;AAEjB,QAAM,WAAW,OAAO;EAExB,MAAM,QAAkC;GACpC,UAAU;GACV,MAAM;GACN;GACA,QAAQ;IACJ,uBAAM,IAAI,MAAM,EAAC,SAAS;IAC1B,UAAU;IACb;GACJ;AAED,YAAU,oBAAoB;GAC1B;GACA,GAAG,UAAU,uBAAuB;GACvC,CAAC;;CAGN,AAAO,iBACH,MACA,SACF;AACE,OAAK,UAAU,iBAAiB,MAAM,QAAe;;CAGzD,AAAO,MAAM,MAA2B,QAAmC;AAKvE,MAAI,CAJa,CAAC,KAAK,YAAY,KAAK,KAAK,CAAC,MACzC,eAAe,eAAe,KAAK,WACvC,CAEc;AAEf,OAAK,UAAU,MAAM,MAAM,OAAO;;CAGtC,AAAO,KAAK,SAAuD;AAC/D,MAAI,KAAK,eAAe,KAAK,KAAM;AAEnC,OAAK,UAAU,KAAK,QAAQ;;CAGhC,AAAO,UAAU,OAAe,MAAY;AACxC,SAAO,KAAK,UAAU,MAAM,MAAM,aAAa;;;;;;ACxIvD,MAAa,4BAAuD;;;;ACyBpE,IAAa,qBAAb,MAAa,2BAIH,iBAqBR;CACE,AAAgB,KAAK,OAAO,YAAY;CACxC,AAAgB;CAChB,AAAgB,QAAQ;CAExB,YAAY,QAA+C;AACvD,QAAM;GACF,GAAG;GACH,GAAI,OAAO,eAAe,OAAO,SAAS,aACpC,EACI,aACI,OAAO,eACP,IAAI,0CAA0C,EAAE,MAAM,UAAU,CAAC,EACxE,GACD,EAAE;GACX,CAAC;AAEF,OAAK,UAAU;GACX,WAAW,EACP,QAAQ,MACX;GACD,YAAY;GACZ,kBAAkB,OAAO,QAAQ;GACjC,aAAa;GACb,WAAW;IACP,iBAAiB;IACjB,eAAe;IACf,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;IACjB,oBAAoB;IACvB;GACD,QAAQ;GACX;EAED,MAAM,gBAAgB,KAAK,mBAAmB;AAE9C,MAAI,CAAC,cAAe;AAEpB,gBAAc,yBACV,IAAI,6BACA,oCACA,KAAK,UAAU;GAAE,MAAM;GAAS,MAAM,EAAE;GAAE,CAAC,CAC9C,CACJ;;CAGL,MAAa,gBAAgB,WAA2D;EACpF,MAAM,gBAAgB,KAAK,mBAAmB;AAE9C,MAAI,CAAC,eAAe;AAChB,aAAU,UAAU,QAAQ;AAE5B;;AAGJ,gBAAc,gBAAgB,UAAU,UAAU;;CAGtD,AAAO,iBACH,WACA,QAC+B;EAC/B,MAAM,EAAE,SAAS;AAEjB,SAAO,IAAI,oBAAgC,WAAW;GAClD,aAAa,KAAK;GAClB,UAAU;GACV;GACH,CAAC;;CAGN,AAAO,YAAY,WAA2D;EAC1E,MAAM,gBAAgB,KAAK,mBAAmB;AAE9C,MAAI,CAAC,cAAe,QAAO;AAI3B,SAFkB,cAAc,kCAAkC,UAAU,UAAU,EAEpE,SAAS,IAAI;;CAGnC,AAAO,mBAAmB,WAAuD;AAG7E,SAFqB,UAAU,uBAAuB,EAEjC,SAAS;;CAGlC,AAAO,aAAa,WAAqC;EAErD,MAAM,aADe,UAAU,uBAAuB,IAAI,EAAE,EAC7B;AAE/B,MAAI,OAAO,cAAc,SAAU,QAAO;AAE1C,SAAO;;CAGX,AAAO,gBAAsC;EACzC,MAAM,gBAAgB,KAAK,mBAAmB;AAE9C,MAAI,CAAC,cAAe,QAAO,EAAE;AAI7B,SAFmB,cAAc,eAAe,IAAI,EAAE;;CAK1D,AAAO,WACH,QACI;EACJ,MAAM,MAAM,OAAO,eAAe,EAAE,GAAG,KAAK,cAAc;AAE1D,MAAI,CAAC,IAAI,OAAO,CAAC,IAAI,MAAO,OAAM,IAAI,MAAM,wCAAwC;EAEpF,MAAM,cAAc;GAChB,KAAK,IAAI;GACT,MAAM,IAAI;GACV,OAAO,IAAI;GACd;AAED,SAAO,IAAI,mBAA4C;GACnD;GACA,MAAM,KAAK,QAAQ;GACnB,aAAa,KAAK,YAAY,WAAW,YAAY;GACrD,QAAQ,KAAK;GAChB,CAAC,CAAC,aAAa;;CAGpB,AAAO,UAAU,MAAiD;AAC9D,MAAI,OAAO,SAAS,SAAU,QAAO,KAAK,MAAM,KAAK;EAErD,MAAM,UAAU,IAAI,YAAY,OAAO;AAEvC,SAAO,KAAK,MAAM,QAAQ,OAAO,KAAK,CAAC;;CAG3C,AAAO,aAAqB;AACxB,SAAO,OAAO,YAAY;;CAG9B,AAAO,mBACH,WACA,OACwB;EACxB,MAAM,eAAe,UAAU,UAAU,uBAAuB,IAAI,EAAE;AAEtE,YAAU,UAAU,oBAAoB;GAAE,GAAG;GAAc;GAAO,CAAC;AAEnE,SAAO;;CAGX,AAAQ,oBAA+C;AACnD,MAAI,KAAK,QAAQ,qBAAqB,WAAY,QAAO;AAIzD,SAFsB,KAAK,cAAc,SAAS;;;;;;ACzK1D,MAAa,sBAOT,SAAgF,EAAE,KAMjF;CACD,MAAM,EAAE,WAAW,SAAS,MAAM,OAAO,WAAW;AAEpD,QAAO;EACH;EACA;EACA;EACA;EACA;EACA,gBAAgB,IAAI,mBAA8D,OAAO;EAC5F"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/infer.ts","../src/CloudflareWebSocket.ts","../src/constants.ts","../src/CloudflarePlatform.ts","../src/platformCloudflare.ts"],"sourcesContent":["import type { Json } from \"@pluv/types\";\nimport type { identity } from \"./utils\";\n\nexport type InferCallback<\n TEnv extends Record<string, any> = {},\n TMeta extends Record<string, Json> = {},\n> = (i: typeof identity) => {\n env?: (io: TEnv) => TEnv;\n meta?: (io: TMeta) => TMeta;\n};\n\nexport const infer = <\n TEnv extends Record<string, any> = {},\n TMeta extends Record<string, Json> = {},\n>(\n callback: InferCallback<TEnv, TMeta>,\n) => callback;\n","import type {\n AbstractEventMap,\n AbstractListener,\n AbstractWebSocketConfig,\n WebSocketSerializedState,\n WebSocketSession,\n} from \"@pluv/io\";\nimport { AbstractWebSocket } from \"@pluv/io\";\nimport type { InferIOAuthorizeUser, IOAuthorize, JsonObject } from \"@pluv/types\";\n\nexport interface CloudflareWebSocketEventMap {\n close: CloseEvent;\n message: MessageEvent;\n open: Event;\n error: ErrorEvent;\n}\n\nexport type CloudflareWebSocketConfig = AbstractWebSocketConfig;\n\nexport class CloudflareWebSocket<\n TAuthorize extends IOAuthorize<any, any> | null = null,\n> extends AbstractWebSocket<WebSocket, TAuthorize> {\n public set presence(presence: JsonObject | null) {\n const deserialized = this.webSocket.deserializeAttachment();\n const state = deserialized.state;\n\n this.webSocket.serializeAttachment({\n ...this.webSocket.deserializeAttachment(),\n state: { ...state, presence },\n });\n }\n\n public get readyState(): 0 | 1 | 2 | 3 {\n return this.webSocket.readyState as 0 | 1 | 2 | 3;\n }\n\n public get session(): WebSocketSession<TAuthorize> {\n const deserialized = this.webSocket.deserializeAttachment();\n const sessionId = deserialized.sessionId as string;\n const state = this.state;\n const user = (deserialized.user ?? null) as InferIOAuthorizeUser<TAuthorize>;\n\n return {\n ...state,\n id: sessionId,\n user,\n webSocket: this,\n };\n }\n\n public get sessionId(): string {\n const deserialized = this.webSocket.deserializeAttachment() ?? {};\n const sessionId = deserialized.sessionId ?? `p_${crypto.randomUUID()}`;\n\n if (typeof deserialized.sessionId !== \"string\") {\n this.webSocket.serializeAttachment({ ...deserialized, sessionId });\n }\n\n return sessionId;\n }\n\n public get state(): WebSocketSerializedState {\n const deserialized = this.webSocket.deserializeAttachment();\n const state = deserialized?.state ?? null;\n\n if (!state) throw new Error(\"Could not get websocket state\");\n\n const currentPing = state.timers.ping;\n const lastPing = this._platform.getLastPing(this);\n\n if (!lastPing) return state;\n if (currentPing >= lastPing) return state;\n\n const newState: WebSocketSerializedState = {\n ...state,\n timers: { ...state.timers, ping: lastPing },\n };\n\n return this._platform.setSerializedState(this, newState);\n }\n\n public set state(state: WebSocketSerializedState) {\n const deserialized = this.webSocket.deserializeAttachment();\n\n this.webSocket.serializeAttachment({ ...deserialized, state });\n }\n\n public set user(user: InferIOAuthorizeUser<TAuthorize>) {\n const deserialized = this.webSocket.deserializeAttachment();\n\n this.webSocket.serializeAttachment({ ...deserialized, user });\n }\n\n constructor(webSocket: WebSocket, config: CloudflareWebSocketConfig) {\n const { room } = config;\n\n super(webSocket, config);\n\n const state: WebSocketSerializedState = {\n presence: null,\n quit: false,\n room,\n timers: {\n ping: new Date().getTime(),\n presence: null,\n },\n };\n\n webSocket.serializeAttachment({\n state,\n ...webSocket.deserializeAttachment(),\n });\n }\n\n public addEventListener<TType extends keyof AbstractEventMap>(\n type: TType,\n handler: AbstractListener<TType>,\n ) {\n this.webSocket.addEventListener(type, handler as any);\n }\n\n public close(code?: number | undefined, reason?: string | undefined): void {\n const canClose = [this.CONNECTING, this.OPEN].some(\n (readyState) => readyState === this.readyState,\n );\n\n if (!canClose) return;\n\n this.webSocket.close(code, reason);\n }\n\n public send(message: string | ArrayBuffer | ArrayBufferView): void {\n if (this.readyState !== this.OPEN) return;\n\n this.webSocket.send(message);\n }\n\n public terminate(code: number = 1011): void {\n return this.webSocket.close(code, \"Terminated\");\n }\n}\n","import type { WebSocketRegistrationMode } from \"@pluv/io\";\n\nexport const DEFAULT_REGISTRATION_MODE: WebSocketRegistrationMode = \"detached\";\nexport const GARBAGE_COLLECT_INTERVAL_MS = 60_000;\n","import type {\n AbstractPlatformConfig,\n ConvertWebSocketConfig,\n WebSocketRegistrationMode,\n WebSocketSerializedState,\n} from \"@pluv/io\";\nimport { AbstractPlatform } from \"@pluv/io\";\nimport { PersistenceCloudflareTransactionalStorage } from \"@pluv/persistence-cloudflare-transactional-storage\";\nimport type { IOAuthorize, Json } from \"@pluv/types\";\nimport { CloudflareWebSocket } from \"./CloudflareWebSocket\";\nimport { DEFAULT_REGISTRATION_MODE } from \"./constants\";\n\nexport type CloudflarePlatformRoomContext<\n TEnv extends Record<string, any>,\n TMeta extends Record<string, Json>,\n> = {\n env: TEnv;\n state: DurableObjectState;\n} & (keyof TMeta extends never ? { meta?: undefined } : { meta: TMeta });\n\nexport type CloudflarePlatformConfig<\n TEnv extends Record<string, any> = {},\n TMeta extends Record<string, Json> = {},\n> = AbstractPlatformConfig<CloudflarePlatformRoomContext<TEnv, TMeta>> & {\n mode?: WebSocketRegistrationMode;\n};\n\nexport class CloudflarePlatform<\n TAuthorize extends IOAuthorize<any, any> | null = null,\n TEnv extends Record<string, any> = {},\n TMeta extends Record<string, Json> = {},\n> extends AbstractPlatform<\n CloudflareWebSocket<TAuthorize>,\n { env: TEnv; request: Request },\n CloudflarePlatformRoomContext<TEnv, TMeta>,\n {\n authorize: {\n secret: true;\n };\n handleMode: \"io\";\n requireAuth: false;\n registrationMode: WebSocketRegistrationMode;\n listeners: {\n onRoomDestroyed: true;\n onRoomMessage: true;\n onStorageDestroyed: true;\n onStorageUpdated: true;\n onUserConnected: true;\n onUserDisconnected: true;\n };\n router: true;\n }\n> {\n public readonly id = crypto.randomUUID();\n public readonly _config;\n public readonly _name = \"platformCloudflare\";\n\n constructor(config: CloudflarePlatformConfig<TEnv, TMeta>) {\n super({\n ...config,\n ...(config.roomContext && config.mode === \"detached\"\n ? {\n persistence:\n config.persistence ??\n new PersistenceCloudflareTransactionalStorage({ mode: \"sqlite\" }),\n }\n : {}),\n });\n\n this._config = {\n authorize: {\n secret: true as const,\n },\n handleMode: \"io\" as const,\n registrationMode: config.mode ?? DEFAULT_REGISTRATION_MODE,\n requireAuth: false as const,\n listeners: {\n onRoomDestroyed: true as const,\n onRoomMessage: true as const,\n onStorageDestroyed: true as const,\n onStorageUpdated: true as const,\n onUserConnected: true as const,\n onUserDisconnected: true as const,\n },\n router: true as const,\n };\n\n const detachedState = this._getDetachedState();\n\n if (!detachedState) return;\n\n detachedState.setWebSocketAutoResponse(\n new WebSocketRequestResponsePair(\n '{\"type\":\"$ping\",\"data\":{}}',\n JSON.stringify({ type: \"$pong\", data: {} }),\n ),\n );\n }\n\n public async acceptWebSocket(webSocket: CloudflareWebSocket<TAuthorize>): Promise<void> {\n const detachedState = this._getDetachedState();\n\n if (!detachedState) {\n webSocket.webSocket.accept();\n\n return;\n }\n\n detachedState.acceptWebSocket(webSocket.webSocket);\n }\n\n public convertWebSocket(\n webSocket: WebSocket,\n config: ConvertWebSocketConfig,\n ): CloudflareWebSocket<TAuthorize> {\n const { room } = config;\n\n return new CloudflareWebSocket<TAuthorize>(webSocket, {\n persistence: this.persistence,\n platform: this,\n room,\n });\n }\n\n public getLastPing(webSocket: CloudflareWebSocket<TAuthorize>): number | null {\n const detachedState = this._getDetachedState();\n\n if (!detachedState) return null;\n\n const timestamp = detachedState.getWebSocketAutoResponseTimestamp(webSocket.webSocket);\n\n return timestamp?.getTime() ?? null;\n }\n\n public getSerializedState(webSocket: WebSocket): WebSocketSerializedState | null {\n const deserialized = webSocket.deserializeAttachment();\n\n return deserialized?.state ?? null;\n }\n\n public getSessionId(webSocket: WebSocket): string | null {\n const deserialized = webSocket.deserializeAttachment() ?? {};\n const sessionId = deserialized.sessionId;\n\n if (typeof sessionId !== \"string\") return null;\n\n return sessionId;\n }\n\n public getWebSockets(): readonly WebSocket[] {\n const detachedState = this._getDetachedState();\n\n if (!detachedState) return [];\n\n const webSockets = detachedState.getWebSockets() ?? [];\n\n return webSockets;\n }\n\n public initialize(\n config: AbstractPlatformConfig<CloudflarePlatformRoomContext<TEnv, TMeta>>,\n ): this {\n const ctx = config.roomContext ?? { ...this._roomContext };\n\n if (!ctx.env || !ctx.state) throw new Error(\"Could not derive platform roomContext\");\n\n const roomContext = {\n env: ctx.env,\n meta: ctx.meta,\n state: ctx.state,\n } as CloudflarePlatformRoomContext<TEnv, TMeta>;\n\n return new CloudflarePlatform<TAuthorize, TEnv, TMeta>({\n roomContext,\n mode: this._config.registrationMode,\n persistence: this.persistence.initialize(roomContext),\n pubSub: this.pubSub,\n })._initialize() as this;\n }\n\n public parseData(data: string | ArrayBuffer): Record<string, any> {\n if (typeof data === \"string\") return JSON.parse(data);\n\n const decoder = new TextDecoder(\"utf8\");\n\n return JSON.parse(decoder.decode(data));\n }\n\n public randomUUID(): string {\n return crypto.randomUUID();\n }\n\n public setSerializedState(\n webSocket: CloudflareWebSocket<TAuthorize>,\n state: WebSocketSerializedState,\n ): WebSocketSerializedState {\n const deserialized = webSocket.webSocket.deserializeAttachment() ?? {};\n\n webSocket.webSocket.serializeAttachment({ ...deserialized, state });\n\n return state;\n }\n\n private _getDetachedState(): DurableObjectState | null {\n if (this._config.registrationMode !== \"detached\") return null;\n\n const detachedState = this._roomContext?.state ?? null;\n\n return detachedState;\n }\n}\n","import type { CrdtLibraryType, NoopCrdtDocFactory } from \"@pluv/crdt\";\nimport type { CreateIOParams, InferInitContextType, PluvContext, PluvIOAuthorize } from \"@pluv/io\";\nimport type { BaseUser, Id, IOAuthorize, Json } from \"@pluv/types\";\nimport type { CloudflarePlatformConfig } from \"./CloudflarePlatform\";\nimport { CloudflarePlatform } from \"./CloudflarePlatform\";\nimport type { InferCallback } from \"./infer\";\n\nexport type PlatformCloudflareCreateIOParams<\n TEnv extends Record<string, any> = {},\n TMeta extends Record<string, Json> = {},\n TContext extends Record<string, any> = {},\n TUser extends BaseUser | null = null,\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n> = Id<\n CloudflarePlatformConfig<TEnv, TMeta> &\n Omit<\n CreateIOParams<\n CloudflarePlatform<IOAuthorize<TUser, TContext>, TEnv, TMeta>,\n TContext,\n TUser,\n TCrdt\n >,\n \"authorize\" | \"context\" | \"platform\"\n > & {\n authorize?: PluvIOAuthorize<\n CloudflarePlatform<IOAuthorize<TUser, TContext>, TEnv, TMeta>,\n TUser,\n InferInitContextType<CloudflarePlatform<IOAuthorize<TUser, TContext>, TEnv, TMeta>>\n >;\n context?: PluvContext<\n CloudflarePlatform<IOAuthorize<TUser, any>, TEnv, TMeta>,\n TContext\n >;\n types?: InferCallback<TEnv, TMeta>;\n }\n>;\n\nexport const platformCloudflare = <\n TEnv extends Record<string, any> = {},\n TMeta extends Record<string, Json> = {},\n TContext extends Record<string, any> = {},\n TUser extends BaseUser | null = null,\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n>(\n config: PlatformCloudflareCreateIOParams<TEnv, TMeta, TContext, TUser, TCrdt> = {},\n): CreateIOParams<\n CloudflarePlatform<IOAuthorize<TUser, TContext>, TEnv, TMeta>,\n TContext,\n TUser,\n TCrdt\n> => {\n const { authorize, context, crdt, debug, limits } = config;\n\n return {\n authorize,\n context,\n crdt,\n debug,\n limits,\n platform: () => new CloudflarePlatform<IOAuthorize<TUser, TContext>, TEnv, TMeta>(config),\n };\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pluv/platform-cloudflare",
3
- "version": "4.0.1",
3
+ "version": "4.0.2",
4
4
  "description": "@pluv/io adapter for cloudflare workers",
5
5
  "author": {
6
6
  "email": "david@pluv.io",
@@ -20,19 +20,19 @@
20
20
  "access": "public"
21
21
  },
22
22
  "dependencies": {
23
- "path-to-regexp": "^8.3.0",
24
- "@pluv/crdt": "^4.0.1",
25
- "@pluv/io": "^4.0.1",
26
- "@pluv/persistence-cloudflare-transactional-storage": "^4.0.1",
27
- "@pluv/types": "^4.0.1"
23
+ "path-to-regexp": "^8.4.2",
24
+ "@pluv/crdt": "^4.0.2",
25
+ "@pluv/io": "^4.0.2",
26
+ "@pluv/persistence-cloudflare-transactional-storage": "^4.0.2",
27
+ "@pluv/types": "^4.0.2"
28
28
  },
29
29
  "devDependencies": {
30
- "@cloudflare/workers-types": "^4.20260120.0",
31
- "eslint": "^9.39.2",
32
- "tsdown": "0.20.0-beta.4",
30
+ "@cloudflare/workers-types": "^4.20260609.1",
31
+ "eslint": "^10.4.1",
32
+ "tsdown": "0.22.2",
33
33
  "typescript": "^5.9.3",
34
- "@pluv/tsconfig": "^4.0.1",
35
- "eslint-config-pluv": "^4.0.1"
34
+ "@pluv/tsconfig": "^4.0.2",
35
+ "eslint-config-pluv": "^4.0.2"
36
36
  },
37
37
  "exports": {
38
38
  ".": "./dist/index.mjs",