@livestore/sync-cf 0.3.0-dev.5 → 0.3.0-dev.50

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.
Files changed (51) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/cf-worker/durable-object.d.ts +60 -46
  3. package/dist/cf-worker/durable-object.d.ts.map +1 -1
  4. package/dist/cf-worker/durable-object.js +230 -148
  5. package/dist/cf-worker/durable-object.js.map +1 -1
  6. package/dist/cf-worker/mod.d.ts +3 -0
  7. package/dist/cf-worker/mod.d.ts.map +1 -0
  8. package/dist/cf-worker/mod.js +3 -0
  9. package/dist/cf-worker/mod.js.map +1 -0
  10. package/dist/cf-worker/worker.d.ts +12 -0
  11. package/dist/cf-worker/worker.d.ts.map +1 -0
  12. package/dist/cf-worker/worker.js +58 -0
  13. package/dist/cf-worker/worker.js.map +1 -0
  14. package/dist/common/mod.d.ts +7 -0
  15. package/dist/common/mod.d.ts.map +1 -0
  16. package/dist/common/mod.js +7 -0
  17. package/dist/common/mod.js.map +1 -0
  18. package/dist/common/ws-message-types.d.ts +148 -98
  19. package/dist/common/ws-message-types.d.ts.map +1 -1
  20. package/dist/common/ws-message-types.js +19 -24
  21. package/dist/common/ws-message-types.js.map +1 -1
  22. package/dist/sync-impl/mod.d.ts +2 -0
  23. package/dist/sync-impl/mod.d.ts.map +1 -0
  24. package/dist/sync-impl/mod.js +2 -0
  25. package/dist/sync-impl/mod.js.map +1 -0
  26. package/dist/sync-impl/ws-impl.d.ts +3 -15
  27. package/dist/sync-impl/ws-impl.d.ts.map +1 -1
  28. package/dist/sync-impl/ws-impl.js +89 -36
  29. package/dist/sync-impl/ws-impl.js.map +1 -1
  30. package/package.json +15 -13
  31. package/src/cf-worker/durable-object.ts +311 -165
  32. package/src/cf-worker/mod.ts +2 -0
  33. package/src/cf-worker/worker.ts +85 -0
  34. package/src/common/mod.ts +8 -0
  35. package/src/common/ws-message-types.ts +22 -36
  36. package/src/sync-impl/ws-impl.ts +146 -100
  37. package/dist/cf-worker/index.d.ts +0 -8
  38. package/dist/cf-worker/index.d.ts.map +0 -1
  39. package/dist/cf-worker/index.js +0 -67
  40. package/dist/cf-worker/index.js.map +0 -1
  41. package/dist/common/index.d.ts +0 -2
  42. package/dist/common/index.d.ts.map +0 -1
  43. package/dist/common/index.js +0 -2
  44. package/dist/common/index.js.map +0 -1
  45. package/dist/sync-impl/index.d.ts +0 -2
  46. package/dist/sync-impl/index.d.ts.map +0 -1
  47. package/dist/sync-impl/index.js +0 -2
  48. package/dist/sync-impl/index.js.map +0 -1
  49. package/src/cf-worker/index.ts +0 -84
  50. package/src/common/index.ts +0 -1
  51. /package/src/sync-impl/{index.ts → mod.ts} +0 -0
@@ -1,45 +1,58 @@
1
- import { DbSchema, type MutationEvent } from '@livestore/common/schema';
2
- import { Option, Schema } from '@livestore/utils/effect';
1
+ import { State } from '@livestore/common/schema';
2
+ import { Effect, Option, Schema } from '@livestore/utils/effect';
3
3
  import { DurableObject } from 'cloudflare:workers';
4
- import type { SyncMetadata } from '../common/ws-message-types.js';
4
+ import { WSMessage } from '../common/mod.js';
5
5
  export interface Env {
6
- WEBSOCKET_SERVER: DurableObjectNamespace<WebSocketServer>;
6
+ WEBSOCKET_SERVER: DurableObjectNamespace;
7
7
  DB: D1Database;
8
8
  ADMIN_SECRET: string;
9
9
  }
10
- type WebSocketClient = WebSocket;
11
- export declare const mutationLogTable: DbSchema.TableDef<{
12
- name: "__unused";
10
+ export declare const eventlogTable: State.SQLite.TableDef<{
11
+ name: "eventlog_${PERSISTENCE_FORMAT_VERSION}_${storeId}";
13
12
  columns: {
14
- id: {
13
+ readonly seqNum: {
15
14
  columnType: "integer";
16
- schema: Schema.Schema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
15
+ schema: Schema.Schema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
17
16
  default: Option.None<never>;
18
17
  nullable: false;
19
18
  primaryKey: true;
20
19
  };
21
- parentId: {
20
+ readonly parentSeqNum: {
22
21
  columnType: "integer";
23
- schema: Schema.Schema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
22
+ schema: Schema.Schema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
24
23
  default: Option.None<never>;
25
24
  nullable: false;
26
25
  primaryKey: false;
27
26
  };
28
- mutation: {
27
+ readonly name: {
29
28
  columnType: "text";
30
29
  schema: Schema.Schema<string, string, never>;
31
30
  default: Option.None<never>;
32
31
  nullable: false;
33
32
  primaryKey: false;
34
33
  };
35
- args: {
34
+ readonly args: {
36
35
  columnType: "text";
37
- schema: Schema.Schema<any, string, never>;
36
+ schema: Schema.Schema<any, string | null, never>;
37
+ default: Option.None<never>;
38
+ nullable: true;
39
+ primaryKey: false;
40
+ };
41
+ readonly createdAt: {
42
+ columnType: "text";
43
+ schema: Schema.Schema<string, string, never>;
38
44
  default: Option.None<never>;
39
45
  nullable: false;
40
46
  primaryKey: false;
41
47
  };
42
- createdAt: {
48
+ readonly clientId: {
49
+ columnType: "text";
50
+ schema: Schema.Schema<string, string, never>;
51
+ default: Option.None<never>;
52
+ nullable: false;
53
+ primaryKey: false;
54
+ };
55
+ readonly sessionId: {
43
56
  columnType: "text";
44
57
  schema: Schema.Schema<string, string, never>;
45
58
  default: Option.None<never>;
@@ -47,42 +60,43 @@ export declare const mutationLogTable: DbSchema.TableDef<{
47
60
  primaryKey: false;
48
61
  };
49
62
  };
50
- indexes?: ReadonlyArray<DbSchema.SqliteDsl.Index>;
51
- ast: import("@livestore/db-schema/dist/ast/sqlite.js").Table;
63
+ indexes?: ReadonlyArray<import("@livestore/common/dist/schema/state/sqlite/db-schema/dsl/mod.js").Index>;
64
+ ast: import("@livestore/common/dist/schema/state/sqlite/db-schema/ast/sqlite.js").Table;
52
65
  }, {
53
- isSingleton: false;
54
- disableAutomaticIdColumn: false;
55
- deriveMutations: never;
56
- isSingleColumn: false;
57
- requiredInsertColumnNames: "createdAt" | "mutation" | "args" | "id" | "parentId";
66
+ isClientDocumentTable: false;
67
+ requiredInsertColumnNames: "createdAt" | "name" | "seqNum" | "parentSeqNum" | "clientId" | "sessionId";
58
68
  }, Schema.Schema<{
59
- readonly id: number & import("effect/Brand").Brand<"GlobalEventId">;
60
- readonly parentId: number & import("effect/Brand").Brand<"GlobalEventId">;
61
- readonly mutation: string;
69
+ readonly seqNum: number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">;
70
+ readonly parentSeqNum: number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">;
71
+ readonly name: string;
62
72
  readonly args: any;
63
73
  readonly createdAt: string;
74
+ readonly clientId: string;
75
+ readonly sessionId: string;
64
76
  }, {
65
- readonly id: number;
66
- readonly parentId: number;
67
- readonly mutation: string;
68
- readonly args: string;
77
+ readonly seqNum: number;
78
+ readonly parentSeqNum: number;
79
+ readonly name: string;
80
+ readonly args: string | null;
69
81
  readonly createdAt: string;
82
+ readonly clientId: string;
83
+ readonly sessionId: string;
70
84
  }, never>>;
71
- export declare class WebSocketServer extends DurableObject<Env> {
72
- dbName: string;
73
- storage: {
74
- getLatestEvent: () => Promise<MutationEvent.AnyEncodedGlobal | undefined>;
75
- getEvents: (cursor: number | undefined) => Promise<ReadonlyArray<{
76
- mutationEventEncoded: MutationEvent.AnyEncodedGlobal;
77
- metadata: Option.Option<SyncMetadata>;
78
- }>>;
79
- appendEvent: (event: MutationEvent.AnyEncodedGlobal, createdAt: string) => Promise<void>;
80
- resetRoom: () => Promise<void>;
81
- };
82
- constructor(ctx: DurableObjectState, env: Env);
83
- fetch: (_request: Request) => Promise<Response>;
84
- webSocketMessage: (ws: WebSocketClient, message: ArrayBuffer | string) => Promise<undefined>;
85
- webSocketClose: (ws: WebSocketClient, code: number, _reason: string, _wasClean: boolean) => Promise<void>;
86
- }
87
- export {};
85
+ export declare const PULL_CHUNK_SIZE = 100;
86
+ /**
87
+ * Needs to be bumped when the storage format changes (e.g. eventlogTable schema changes)
88
+ *
89
+ * Changing this version number will lead to a "soft reset".
90
+ */
91
+ export declare const PERSISTENCE_FORMAT_VERSION = 6;
92
+ export type MakeDurableObjectClassOptions = {
93
+ onPush?: (message: WSMessage.PushReq) => Effect.Effect<void> | Promise<void>;
94
+ onPushRes?: (message: WSMessage.PushAck | WSMessage.Error) => Effect.Effect<void> | Promise<void>;
95
+ onPull?: (message: WSMessage.PullReq) => Effect.Effect<void> | Promise<void>;
96
+ onPullRes?: (message: WSMessage.PullRes | WSMessage.Error) => Effect.Effect<void> | Promise<void>;
97
+ };
98
+ export type MakeDurableObjectClass = (options?: MakeDurableObjectClassOptions) => {
99
+ new (ctx: DurableObjectState, env: Env): DurableObject<Env>;
100
+ };
101
+ export declare const makeDurableObject: MakeDurableObjectClass;
88
102
  //# sourceMappingURL=durable-object.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"durable-object.d.ts","sourceRoot":"","sources":["../../src/cf-worker/durable-object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAW,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAEhF,OAAO,EAA4B,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAEjE,MAAM,WAAW,GAAG;IAClB,gBAAgB,EAAE,sBAAsB,CAAC,eAAe,CAAC,CAAA;IACzD,EAAE,EAAE,UAAU,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,KAAK,eAAe,GAAG,SAAS,CAAA;AAOhC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAO3B,CAAA;AAUF,qBAAa,eAAgB,SAAQ,aAAa,CAAC,GAAG,CAAC;IACrD,MAAM,SAAyE;IAC/E,OAAO;8BA0K0B,OAAO,CAAC,aAAa,CAAC,gBAAgB,GAAG,SAAS,CAAC;4BAW1E,MAAM,GAAG,SAAS,KACzB,OAAO,CACR,aAAa,CAAC;YAAE,oBAAoB,EAAE,aAAa,CAAC,gBAAgB,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;SAAE,CAAC,CAC/G;6BAiBiC,aAAa,CAAC,gBAAgB,aAAa,MAAM;;MAzM7B;gBAE1C,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IAI7C,KAAK,aAAoB,OAAO,uBAsBsB;IAEtD,gBAAgB,OAAQ,eAAe,WAAW,WAAW,GAAG,MAAM,wBAmInE;IAEH,cAAc,OAAc,eAAe,QAAQ,MAAM,WAAW,MAAM,aAAa,OAAO,mBAG7F;CACF"}
1
+ {"version":3,"file":"durable-object.d.ts","sourceRoot":"","sources":["../../src/cf-worker/durable-object.ts"],"names":[],"mappings":"AACA,OAAO,EAA4C,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAE1F,OAAO,EAAE,MAAM,EAAoB,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAG5C,MAAM,WAAW,GAAG;IAClB,gBAAgB,EAAE,sBAAsB,CAAA;IACxC,EAAE,EAAE,UAAU,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;CACrB;AAQD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAaxB,CAAA;AAQF,eAAO,MAAM,eAAe,MAAM,CAAA;AAElC;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAE3C,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5E,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjG,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5E,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClG,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,6BAA6B,KAAK;IAChF,KAAK,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;CAC5D,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,sBAiO/B,CAAA"}
@@ -1,176 +1,258 @@
1
- import { makeColumnSpec } from '@livestore/common';
2
- import { DbSchema, EventId } from '@livestore/common/schema';
1
+ import { makeColumnSpec, UnexpectedError } from '@livestore/common';
2
+ import { EventSequenceNumber, State } from '@livestore/common/schema';
3
3
  import { shouldNeverHappen } from '@livestore/utils';
4
4
  import { Effect, Logger, LogLevel, Option, Schema } from '@livestore/utils/effect';
5
5
  import { DurableObject } from 'cloudflare:workers';
6
- import { WSMessage } from '../common/index.js';
6
+ import { WSMessage } from '../common/mod.js';
7
7
  const encodeOutgoingMessage = Schema.encodeSync(Schema.parseJson(WSMessage.BackendToClientMessage));
8
8
  const encodeIncomingMessage = Schema.encodeSync(Schema.parseJson(WSMessage.ClientToBackendMessage));
9
9
  const decodeIncomingMessage = Schema.decodeUnknownEither(Schema.parseJson(WSMessage.ClientToBackendMessage));
10
- // NOTE actual table name is determined at runtime by `WebSocketServer.dbName`
11
- export const mutationLogTable = DbSchema.table('__unused', {
12
- id: DbSchema.integer({ primaryKey: true, schema: EventId.GlobalEventId }),
13
- parentId: DbSchema.integer({ schema: EventId.GlobalEventId }),
14
- mutation: DbSchema.text({}),
15
- args: DbSchema.text({ schema: Schema.parseJson(Schema.Any) }),
16
- /** ISO date format. Currently only used for debugging purposes. */
17
- createdAt: DbSchema.text({}),
10
+ export const eventlogTable = State.SQLite.table({
11
+ // NOTE actual table name is determined at runtime
12
+ name: 'eventlog_${PERSISTENCE_FORMAT_VERSION}_${storeId}',
13
+ columns: {
14
+ seqNum: State.SQLite.integer({ primaryKey: true, schema: EventSequenceNumber.GlobalEventSequenceNumber }),
15
+ parentSeqNum: State.SQLite.integer({ schema: EventSequenceNumber.GlobalEventSequenceNumber }),
16
+ name: State.SQLite.text({}),
17
+ args: State.SQLite.text({ schema: Schema.parseJson(Schema.Any), nullable: true }),
18
+ /** ISO date format. Currently only used for debugging purposes. */
19
+ createdAt: State.SQLite.text({}),
20
+ clientId: State.SQLite.text({}),
21
+ sessionId: State.SQLite.text({}),
22
+ },
18
23
  });
24
+ const WebSocketAttachmentSchema = Schema.parseJson(Schema.Struct({
25
+ storeId: Schema.String,
26
+ }));
27
+ export const PULL_CHUNK_SIZE = 100;
19
28
  /**
20
- * Needs to be bumped when the storage format changes (e.g. mutationLogTable schema changes)
29
+ * Needs to be bumped when the storage format changes (e.g. eventlogTable schema changes)
21
30
  *
22
31
  * Changing this version number will lead to a "soft reset".
23
32
  */
24
- const PERSISTENCE_FORMAT_VERSION = 2;
25
- // Durable Object
26
- export class WebSocketServer extends DurableObject {
27
- dbName = `mutation_log_${PERSISTENCE_FORMAT_VERSION}_${this.ctx.id.toString()}`;
28
- storage = makeStorage(this.ctx, this.env, this.dbName);
29
- constructor(ctx, env) {
30
- super(ctx, env);
31
- }
32
- fetch = async (_request) => Effect.gen(this, function* () {
33
- const { 0: client, 1: server } = new WebSocketPair();
34
- // See https://developers.cloudflare.com/durable-objects/examples/websocket-hibernation-server
35
- this.ctx.acceptWebSocket(server);
36
- this.ctx.setWebSocketAutoResponse(new WebSocketRequestResponsePair(encodeIncomingMessage(WSMessage.Ping.make({ requestId: 'ping' })), encodeOutgoingMessage(WSMessage.Pong.make({ requestId: 'ping' }))));
37
- const colSpec = makeColumnSpec(mutationLogTable.sqliteDef.ast);
38
- this.env.DB.exec(`CREATE TABLE IF NOT EXISTS ${this.dbName} (${colSpec}) strict`);
39
- return new Response(null, {
40
- status: 101,
41
- webSocket: client,
42
- });
43
- }).pipe(Effect.tapCauseLogPretty, Effect.runPromise);
44
- webSocketMessage = (ws, message) => Effect.gen(this, function* () {
45
- const decodedMessageRes = decodeIncomingMessage(message);
46
- if (decodedMessageRes._tag === 'Left') {
47
- console.error('Invalid message received', decodedMessageRes.left);
48
- return;
33
+ export const PERSISTENCE_FORMAT_VERSION = 6;
34
+ export const makeDurableObject = (options) => {
35
+ return class WebSocketServerBase extends DurableObject {
36
+ /** Needed to prevent concurrent pushes */
37
+ pushSemaphore = Effect.makeSemaphore(1).pipe(Effect.runSync);
38
+ constructor(ctx, env) {
39
+ super(ctx, env);
49
40
  }
50
- const decodedMessage = decodedMessageRes.right;
51
- const requestId = decodedMessage.requestId;
52
- try {
53
- switch (decodedMessage._tag) {
54
- case 'WSMessage.PullReq': {
55
- const cursor = decodedMessage.cursor;
56
- const CHUNK_SIZE = 100;
57
- // TODO use streaming
58
- const remainingEvents = [...(yield* Effect.promise(() => this.storage.getEvents(cursor)))];
59
- // NOTE we want to make sure the WS server responds at least once with `InitRes` even if `events` is empty
60
- while (true) {
61
- const events = remainingEvents.splice(0, CHUNK_SIZE);
62
- ws.send(encodeOutgoingMessage(WSMessage.PullRes.make({ events, remaining: remainingEvents.length, requestId })));
63
- if (remainingEvents.length === 0) {
41
+ fetch = async (request) => Effect.gen(this, function* () {
42
+ const storeId = getStoreId(request);
43
+ const storage = makeStorage(this.ctx, this.env, storeId);
44
+ const { 0: client, 1: server } = new WebSocketPair();
45
+ // Since we're using websocket hibernation, we need to remember the storeId for subsequent `webSocketMessage` calls
46
+ server.serializeAttachment(Schema.encodeSync(WebSocketAttachmentSchema)({ storeId }));
47
+ // See https://developers.cloudflare.com/durable-objects/examples/websocket-hibernation-server
48
+ this.ctx.acceptWebSocket(server);
49
+ this.ctx.setWebSocketAutoResponse(new WebSocketRequestResponsePair(encodeIncomingMessage(WSMessage.Ping.make({ requestId: 'ping' })), encodeOutgoingMessage(WSMessage.Pong.make({ requestId: 'ping' }))));
50
+ const colSpec = makeColumnSpec(eventlogTable.sqliteDef.ast);
51
+ this.env.DB.exec(`CREATE TABLE IF NOT EXISTS ${storage.dbName} (${colSpec}) strict`);
52
+ return new Response(null, {
53
+ status: 101,
54
+ webSocket: client,
55
+ });
56
+ }).pipe(Effect.tapCauseLogPretty, Effect.runPromise);
57
+ webSocketMessage = (ws, message) => {
58
+ console.log('webSocketMessage', message);
59
+ const decodedMessageRes = decodeIncomingMessage(message);
60
+ if (decodedMessageRes._tag === 'Left') {
61
+ console.error('Invalid message received', decodedMessageRes.left);
62
+ return;
63
+ }
64
+ const decodedMessage = decodedMessageRes.right;
65
+ const requestId = decodedMessage.requestId;
66
+ return Effect.gen(this, function* () {
67
+ const { storeId } = yield* Schema.decode(WebSocketAttachmentSchema)(ws.deserializeAttachment());
68
+ const storage = makeStorage(this.ctx, this.env, storeId);
69
+ try {
70
+ switch (decodedMessage._tag) {
71
+ // TODO allow pulling concurrently to not block incoming push requests
72
+ case 'WSMessage.PullReq': {
73
+ if (options?.onPull) {
74
+ yield* Effect.tryAll(() => options.onPull(decodedMessage));
75
+ }
76
+ const respond = (message) => Effect.gen(function* () {
77
+ if (options?.onPullRes) {
78
+ yield* Effect.tryAll(() => options.onPullRes(message));
79
+ }
80
+ ws.send(encodeOutgoingMessage(message));
81
+ });
82
+ const cursor = decodedMessage.cursor;
83
+ // TODO use streaming
84
+ const remainingEvents = yield* storage.getEvents(cursor);
85
+ // Send at least one response, even if there are no events
86
+ const batches = remainingEvents.length === 0
87
+ ? [[]]
88
+ : Array.from({ length: Math.ceil(remainingEvents.length / PULL_CHUNK_SIZE) }, (_, i) => remainingEvents.slice(i * PULL_CHUNK_SIZE, (i + 1) * PULL_CHUNK_SIZE));
89
+ for (const [index, batch] of batches.entries()) {
90
+ const remaining = Math.max(0, remainingEvents.length - (index + 1) * PULL_CHUNK_SIZE);
91
+ yield* respond(WSMessage.PullRes.make({ batch, remaining, requestId: { context: 'pull', requestId } }));
92
+ }
64
93
  break;
65
94
  }
66
- }
67
- break;
68
- }
69
- case 'WSMessage.PushReq': {
70
- // TODO check whether we could use the Durable Object storage for this to speed up the lookup
71
- const latestEvent = yield* Effect.promise(() => this.storage.getLatestEvent());
72
- const expectedParentId = latestEvent?.id ?? EventId.ROOT.global;
73
- let i = 0;
74
- for (const mutationEventEncoded of decodedMessage.batch) {
75
- if (mutationEventEncoded.parentId !== expectedParentId + i) {
76
- const err = WSMessage.Error.make({
77
- message: `Invalid parent id. Received ${mutationEventEncoded.parentId} but expected ${expectedParentId}`,
78
- requestId,
95
+ case 'WSMessage.PushReq': {
96
+ const respond = (message) => Effect.gen(function* () {
97
+ if (options?.onPushRes) {
98
+ yield* Effect.tryAll(() => options.onPushRes(message));
99
+ }
100
+ ws.send(encodeOutgoingMessage(message));
79
101
  });
80
- yield* Effect.fail(err).pipe(Effect.ignoreLogged);
81
- ws.send(encodeOutgoingMessage(err));
82
- return;
102
+ if (decodedMessage.batch.length === 0) {
103
+ yield* respond(WSMessage.PushAck.make({ requestId }));
104
+ return;
105
+ }
106
+ yield* this.pushSemaphore.take(1);
107
+ if (options?.onPush) {
108
+ yield* Effect.tryAll(() => options.onPush(decodedMessage));
109
+ }
110
+ // TODO check whether we could use the Durable Object storage for this to speed up the lookup
111
+ const expectedParentNum = yield* storage.getHead;
112
+ // TODO handle clientId unique conflict
113
+ // Validate the batch
114
+ const firstEvent = decodedMessage.batch[0];
115
+ if (firstEvent.parentSeqNum !== expectedParentNum) {
116
+ const err = WSMessage.Error.make({
117
+ message: `Invalid parent event number. Received e${firstEvent.parentSeqNum} but expected e${expectedParentNum}`,
118
+ requestId,
119
+ });
120
+ yield* Effect.logError(err);
121
+ yield* respond(err);
122
+ yield* this.pushSemaphore.release(1);
123
+ return;
124
+ }
125
+ yield* respond(WSMessage.PushAck.make({ requestId }));
126
+ yield* this.pushSemaphore.release(1);
127
+ const createdAt = new Date().toISOString();
128
+ // NOTE we're not waiting for this to complete yet to allow the broadcast to happen right away
129
+ // while letting the async storage write happen in the background
130
+ const storeFiber = yield* storage.appendEvents(decodedMessage.batch, createdAt).pipe(Effect.fork);
131
+ const connectedClients = this.ctx.getWebSockets();
132
+ // console.debug(`Broadcasting push batch to ${this.subscribedWebSockets.size} clients`)
133
+ if (connectedClients.length > 0) {
134
+ // TODO refactor to batch api
135
+ const pullRes = WSMessage.PullRes.make({
136
+ batch: decodedMessage.batch.map((eventEncoded) => ({
137
+ eventEncoded,
138
+ metadata: Option.some({ createdAt }),
139
+ })),
140
+ remaining: 0,
141
+ requestId: { context: 'push', requestId },
142
+ });
143
+ const pullResEnc = encodeOutgoingMessage(pullRes);
144
+ // Only calling once for now.
145
+ if (options?.onPullRes) {
146
+ yield* Effect.tryAll(() => options.onPullRes(pullRes));
147
+ }
148
+ // NOTE we're also sending the pullRes to the pushing ws client as a confirmation
149
+ for (const conn of connectedClients) {
150
+ conn.send(pullResEnc);
151
+ }
152
+ }
153
+ // Wait for the storage write to complete before finishing this request
154
+ yield* storeFiber;
155
+ break;
83
156
  }
84
- // TODO handle clientId unique conflict
85
- const createdAt = new Date().toISOString();
86
- // NOTE we're currently not blocking on this to allow broadcasting right away
87
- const storePromise = this.storage.appendEvent(mutationEventEncoded, createdAt);
88
- ws.send(encodeOutgoingMessage(WSMessage.PushAck.make({ mutationId: mutationEventEncoded.id, requestId })));
89
- // console.debug(`Broadcasting mutation event to ${this.subscribedWebSockets.size} clients`)
90
- const connectedClients = this.ctx.getWebSockets();
91
- if (connectedClients.length > 0) {
92
- const broadcastMessage = encodeOutgoingMessage(
93
- // TODO refactor to batch api
94
- WSMessage.PushBroadcast.make({
95
- mutationEventEncoded,
96
- metadata: Option.some({ createdAt }),
97
- }));
98
- for (const conn of connectedClients) {
99
- console.log('Broadcasting to client', conn === ws ? 'self' : 'other');
100
- // if (conn !== ws) {
101
- conn.send(broadcastMessage);
102
- // }
157
+ case 'WSMessage.AdminResetRoomReq': {
158
+ if (decodedMessage.adminSecret !== this.env.ADMIN_SECRET) {
159
+ ws.send(encodeOutgoingMessage(WSMessage.Error.make({ message: 'Invalid admin secret', requestId })));
160
+ return;
103
161
  }
162
+ yield* storage.resetStore;
163
+ ws.send(encodeOutgoingMessage(WSMessage.AdminResetRoomRes.make({ requestId })));
164
+ break;
165
+ }
166
+ case 'WSMessage.AdminInfoReq': {
167
+ if (decodedMessage.adminSecret !== this.env.ADMIN_SECRET) {
168
+ ws.send(encodeOutgoingMessage(WSMessage.Error.make({ message: 'Invalid admin secret', requestId })));
169
+ return;
170
+ }
171
+ ws.send(encodeOutgoingMessage(WSMessage.AdminInfoRes.make({ requestId, info: { durableObjectId: this.ctx.id.toString() } })));
172
+ break;
173
+ }
174
+ default: {
175
+ console.error('unsupported message', decodedMessage);
176
+ return shouldNeverHappen();
104
177
  }
105
- yield* Effect.promise(() => storePromise);
106
- i++;
107
- }
108
- break;
109
- }
110
- case 'WSMessage.AdminResetRoomReq': {
111
- if (decodedMessage.adminSecret !== this.env.ADMIN_SECRET) {
112
- ws.send(encodeOutgoingMessage(WSMessage.Error.make({ message: 'Invalid admin secret', requestId })));
113
- return;
114
- }
115
- yield* Effect.promise(() => this.storage.resetRoom());
116
- ws.send(encodeOutgoingMessage(WSMessage.AdminResetRoomRes.make({ requestId })));
117
- break;
118
- }
119
- case 'WSMessage.AdminInfoReq': {
120
- if (decodedMessage.adminSecret !== this.env.ADMIN_SECRET) {
121
- ws.send(encodeOutgoingMessage(WSMessage.Error.make({ message: 'Invalid admin secret', requestId })));
122
- return;
123
178
  }
124
- ws.send(encodeOutgoingMessage(WSMessage.AdminInfoRes.make({ requestId, info: { durableObjectId: this.ctx.id.toString() } })));
125
- break;
126
179
  }
127
- default: {
128
- console.error('unsupported message', decodedMessage);
129
- return shouldNeverHappen();
180
+ catch (error) {
181
+ ws.send(encodeOutgoingMessage(WSMessage.Error.make({ message: error.message, requestId })));
130
182
  }
131
- }
132
- }
133
- catch (error) {
134
- ws.send(encodeOutgoingMessage(WSMessage.Error.make({ message: error.message, requestId })));
135
- }
136
- }).pipe(Effect.withSpan('@livestore/sync-cf:durable-object:webSocketMessage'), Effect.tapCauseLogPretty, Logger.withMinimumLogLevel(LogLevel.Debug), Effect.provide(Logger.pretty), Effect.runPromise);
137
- webSocketClose = async (ws, code, _reason, _wasClean) => {
138
- // If the client closes the connection, the runtime will invoke the webSocketClose() handler.
139
- ws.close(code, 'Durable Object is closing WebSocket');
140
- };
141
- }
142
- const makeStorage = (ctx, env, dbName) => {
143
- const getLatestEvent = async () => {
144
- const rawEvents = await env.DB.prepare(`SELECT * FROM ${dbName} ORDER BY id DESC LIMIT 1`).all();
145
- if (rawEvents.error) {
146
- throw new Error(rawEvents.error);
147
- }
148
- const events = Schema.decodeUnknownSync(Schema.Array(mutationLogTable.schema))(rawEvents.results);
149
- return events[0];
183
+ }).pipe(Effect.withSpan(`@livestore/sync-cf:durable-object:webSocketMessage:${decodedMessage._tag}`, {
184
+ attributes: { requestId },
185
+ }), Effect.tapCauseLogPretty, Effect.tapErrorCause((cause) => Effect.sync(() => ws.send(encodeOutgoingMessage(WSMessage.Error.make({ message: cause.toString(), requestId }))))), Logger.withMinimumLogLevel(LogLevel.Debug), Effect.provide(Logger.prettyWithThread('durable-object')), Effect.runPromise);
186
+ };
187
+ webSocketClose = async (ws, code, _reason, _wasClean) => {
188
+ // If the client closes the connection, the runtime will invoke the webSocketClose() handler.
189
+ ws.close(code, 'Durable Object is closing WebSocket');
190
+ };
150
191
  };
151
- const getEvents = async (cursor) => {
152
- const whereClause = cursor === undefined ? '' : `WHERE id > ${cursor}`;
153
- const sql = `SELECT * FROM ${dbName} ${whereClause} ORDER BY id ASC`;
192
+ };
193
+ const makeStorage = (ctx, env, storeId) => {
194
+ const dbName = `eventlog_${PERSISTENCE_FORMAT_VERSION}_${toValidTableName(storeId)}`;
195
+ const execDb = (cb) => Effect.tryPromise({
196
+ try: () => cb(env.DB),
197
+ catch: (error) => new UnexpectedError({ cause: error, payload: { dbName } }),
198
+ }).pipe(Effect.map((_) => _.results), Effect.withSpan('@livestore/sync-cf:durable-object:execDb'));
199
+ const getHead = Effect.gen(function* () {
200
+ const result = yield* execDb((db) => db.prepare(`SELECT seqNum FROM ${dbName} ORDER BY seqNum DESC LIMIT 1`).all());
201
+ return result[0]?.seqNum ?? EventSequenceNumber.ROOT.global;
202
+ }).pipe(UnexpectedError.mapToUnexpectedError);
203
+ const getEvents = (cursor) => Effect.gen(function* () {
204
+ const whereClause = cursor === undefined ? '' : `WHERE seqNum > ${cursor}`;
205
+ const sql = `SELECT * FROM ${dbName} ${whereClause} ORDER BY seqNum ASC`;
154
206
  // TODO handle case where `cursor` was not found
155
- const rawEvents = await env.DB.prepare(sql).all();
156
- if (rawEvents.error) {
157
- throw new Error(rawEvents.error);
158
- }
159
- const events = Schema.decodeUnknownSync(Schema.Array(mutationLogTable.schema))(rawEvents.results).map(({ createdAt, ...mutationEventEncoded }) => ({
160
- mutationEventEncoded,
207
+ const rawEvents = yield* execDb((db) => db.prepare(sql).all());
208
+ const events = Schema.decodeUnknownSync(Schema.Array(eventlogTable.rowSchema))(rawEvents).map(({ createdAt, ...eventEncoded }) => ({
209
+ eventEncoded,
161
210
  metadata: Option.some({ createdAt }),
162
211
  }));
163
212
  return events;
164
- };
165
- const appendEvent = async (event, createdAt) => {
166
- const sql = `INSERT INTO ${dbName} (id, parentId, args, mutation, createdAt) VALUES (?, ?, ?, ?, ?)`;
167
- await env.DB.prepare(sql)
168
- .bind(event.id, event.parentId, JSON.stringify(event.args), event.mutation, createdAt)
169
- .run();
170
- };
171
- const resetRoom = async () => {
172
- await ctx.storage.deleteAll();
173
- };
174
- return { getLatestEvent, getEvents, appendEvent, resetRoom };
213
+ }).pipe(UnexpectedError.mapToUnexpectedError);
214
+ const appendEvents = (batch, createdAt) => Effect.gen(function* () {
215
+ // If there are no events, do nothing.
216
+ if (batch.length === 0)
217
+ return;
218
+ // CF D1 limits:
219
+ // Maximum bound parameters per query 100, Maximum arguments per SQL function 32
220
+ // Thus we need to split the batch into chunks of max (100/7=)14 events each.
221
+ const CHUNK_SIZE = 14;
222
+ for (let i = 0; i < batch.length; i += CHUNK_SIZE) {
223
+ const chunk = batch.slice(i, i + CHUNK_SIZE);
224
+ // Create a list of placeholders ("(?, ?, ?, ?, ?, ?, ?)"), corresponding to each event.
225
+ const valuesPlaceholders = chunk.map(() => '(?, ?, ?, ?, ?, ?, ?)').join(', ');
226
+ const sql = `INSERT INTO ${dbName} (seqNum, parentSeqNum, args, name, createdAt, clientId, sessionId) VALUES ${valuesPlaceholders}`;
227
+ // Flatten the event properties into a parameters array.
228
+ const params = chunk.flatMap((event) => [
229
+ event.seqNum,
230
+ event.parentSeqNum,
231
+ event.args === undefined ? null : JSON.stringify(event.args),
232
+ event.name,
233
+ createdAt,
234
+ event.clientId,
235
+ event.sessionId,
236
+ ]);
237
+ yield* execDb((db) => db
238
+ .prepare(sql)
239
+ .bind(...params)
240
+ .run());
241
+ }
242
+ }).pipe(UnexpectedError.mapToUnexpectedError);
243
+ const resetStore = Effect.gen(function* () {
244
+ yield* Effect.promise(() => ctx.storage.deleteAll());
245
+ }).pipe(UnexpectedError.mapToUnexpectedError);
246
+ return { dbName, getHead, getEvents, appendEvents, resetStore };
247
+ };
248
+ const getStoreId = (request) => {
249
+ const url = new URL(request.url);
250
+ const searchParams = url.searchParams;
251
+ const storeId = searchParams.get('storeId');
252
+ if (storeId === null) {
253
+ throw new Error('storeId search param is required');
254
+ }
255
+ return storeId;
175
256
  };
257
+ const toValidTableName = (str) => str.replaceAll(/[^a-zA-Z0-9]/g, '_');
176
258
  //# sourceMappingURL=durable-object.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"durable-object.js","sourceRoot":"","sources":["../../src/cf-worker/durable-object.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"durable-object.js","sourceRoot":"","sources":["../../src/cf-worker/durable-object.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './durable-object.js';
2
+ export * from './worker.js';
3
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/cf-worker/mod.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA"}