@livestore/sync-cf 0.3.0-dev.9 → 0.3.0

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