@livestore/sync-cf 0.0.58-dev.6 → 0.0.58-dev.8

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 (44) hide show
  1. package/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/8ee300993f9a2c909aede59646369fa0cc28d25304b9b9af94f54d4543ad60f4.sqlite +0 -0
  2. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/037646d8e1e6ad005a1f4ff1c53fd716bec6a458a8b35ebffd9d5b78ec4ea8a3.sqlite +0 -0
  3. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/1471dd2fd02c2d9eb229fcf3cad5fd330cd295bfdee44481714d91b883756b11.sqlite +0 -0
  4. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/23a5a193673cd4aa1f412953ff8ee7cf6169b146127a42e9b84ce79993672b0a.sqlite +0 -0
  5. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/31569057f8ec82f1d479956671fe58b9f0f4e32a64a68c3ba9c3cb6744f74b3d.sqlite +0 -0
  6. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/354c1d4fbf3d44a1e359b6595b4e7f2e0c320e607cad72290b0f842246dea4c3.sqlite +0 -0
  7. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/472d06f3610154b855a10d98212ec0ae8aa4022def5c932134cafe07ddca6cc4.sqlite +0 -0
  8. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/472d06f3610154b855a10d98212ec0ae8aa4022def5c932134cafe07ddca6cc4.sqlite-shm +0 -0
  9. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/472d06f3610154b855a10d98212ec0ae8aa4022def5c932134cafe07ddca6cc4.sqlite-wal +0 -0
  10. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/56fc052bba96d75e557bb09c4826387d0d3500ab0eb8de9e9b7379b795277338.sqlite +0 -0
  11. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/70a851401fda75ce3a534dacc3f979fceaff8234430fc6333f22112519388493.sqlite +0 -0
  12. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/82afe32c9f3dfe706e088859636f9137e1824b12206e1c0870eef31abcb77d2e.sqlite +0 -0
  13. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/83b7880fabbc105109963ee7d1b9b8560b31a560b6b06cf2c326f4f1eca6e80f.sqlite +0 -0
  14. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/985f28c526c3fe0133b72007b09233c1a827ae9a588ca5cff0e740f2f5da7dd3.sqlite +0 -0
  15. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/a0f452412c79c524292ab9f6895e09605492f5980d8ad6cfc34c0fb88ee6d1cd.sqlite +0 -0
  16. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/a58eeee7c3798f238d9446895cd2d0f140b06589dcdf9a777ed79131eb83ea5b.sqlite +0 -0
  17. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/baf2225931d572afb47e60d5e189ae58b9764ea0a8a501e0ac202a35c2b35084.sqlite +0 -0
  18. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/c27c5b00d9c92102951df7d882fb0b9c9f1a9466e0752265b255041c6c3dc739.sqlite +0 -0
  19. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/c4aa0e61dcd784604bee52282348e0538ab69ec76e1652322bbccd539d9ff3ee.sqlite +0 -0
  20. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/d2245ee36dd16e1f76180d89bd2503f0d4808a5986a58b8677f9a365a793acc6.sqlite +0 -0
  21. package/.wrangler/state/v3/do/websocket-server-WebSocketServer/d87433156774c933da83e962eba16107cf02ade2f133d7205963558fe47db3ff.sqlite +0 -0
  22. package/.wrangler/tmp/dev-33iU4b/index.js +42167 -0
  23. package/.wrangler/tmp/dev-33iU4b/index.js.map +8 -0
  24. package/.wrangler/tmp/dev-rI63Kk/index.js +42165 -0
  25. package/.wrangler/tmp/dev-rI63Kk/index.js.map +8 -0
  26. package/.wrangler/tmp/dev-txPodK/index.js +42118 -0
  27. package/.wrangler/tmp/dev-txPodK/index.js.map +8 -0
  28. package/dist/.tsbuildinfo +1 -1
  29. package/dist/cf-worker/durable-object.d.ts +15 -5
  30. package/dist/cf-worker/durable-object.d.ts.map +1 -1
  31. package/dist/cf-worker/durable-object.js +100 -68
  32. package/dist/cf-worker/durable-object.js.map +1 -1
  33. package/dist/common/ws-message-types.d.ts +238 -50
  34. package/dist/common/ws-message-types.d.ts.map +1 -1
  35. package/dist/common/ws-message-types.js +4 -4
  36. package/dist/common/ws-message-types.js.map +1 -1
  37. package/dist/sync-impl/ws-impl.d.ts.map +1 -1
  38. package/dist/sync-impl/ws-impl.js +16 -13
  39. package/dist/sync-impl/ws-impl.js.map +1 -1
  40. package/package.json +5 -5
  41. package/src/cf-worker/durable-object.ts +123 -80
  42. package/src/common/ws-message-types.ts +15 -5
  43. package/src/sync-impl/ws-impl.ts +31 -20
  44. package/tsconfig.json +1 -0
@@ -9,12 +9,19 @@ export interface Env {
9
9
  type WebSocketClient = WebSocket;
10
10
  export declare const mutationLogTable: DbSchema.TableDef<DbSchema.SqliteDsl.TableDefinition<"__unused", {
11
11
  id: {
12
- columnType: "text";
13
- schema: Schema.Schema<string, string, never>;
12
+ columnType: "integer";
13
+ schema: Schema.Schema<number, number, never>;
14
14
  default: import("effect/Option").None<never>;
15
15
  nullable: false;
16
16
  primaryKey: true;
17
17
  };
18
+ parentId: {
19
+ columnType: "integer";
20
+ schema: Schema.Schema<number, number, never>;
21
+ default: import("effect/Option").None<never>;
22
+ nullable: false;
23
+ primaryKey: false;
24
+ };
18
25
  mutation: {
19
26
  columnType: "text";
20
27
  schema: Schema.Schema<string, string, never>;
@@ -35,18 +42,21 @@ export declare const mutationLogTable: DbSchema.TableDef<DbSchema.SqliteDsl.Tabl
35
42
  deriveMutations: never;
36
43
  isSingleColumn: false;
37
44
  }, Schema.Schema<{
38
- readonly id: string;
45
+ readonly id: number;
46
+ readonly parentId: number;
39
47
  readonly mutation: string;
40
48
  readonly args: any;
41
49
  }, {
42
- readonly id: string;
50
+ readonly id: number;
51
+ readonly parentId: number;
43
52
  readonly mutation: string;
44
53
  readonly args: string;
45
54
  }, never>>;
46
55
  export declare class WebSocketServer extends DurableObject<Env> {
47
56
  dbName: string;
48
57
  storage: {
49
- getEvents: (cursor: string | undefined) => Promise<ReadonlyArray<MutationEvent.Any>>;
58
+ getLatestEvent: () => Promise<MutationEvent.Any | undefined>;
59
+ getEvents: (cursor: number | undefined) => Promise<ReadonlyArray<MutationEvent.Any>>;
50
60
  appendEvent: (event: MutationEvent.Any) => Promise<void>;
51
61
  resetRoom: () => Promise<void>;
52
62
  };
@@ -1 +1 @@
1
- {"version":3,"file":"durable-object.d.ts","sourceRoot":"","sources":["../../src/cf-worker/durable-object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAEvE,OAAO,EAAU,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIlD,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;AAKhC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAK3B,CAAA;AAGF,qBAAa,eAAgB,SAAQ,aAAa,CAAC,GAAG,CAAC;IACrD,MAAM,SAA2C;IACjD,OAAO;4BAwI0B,MAAM,GAAG,SAAS,KAAG,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;6BAW7D,aAAa,CAAC,GAAG;;MAnJG;gBAE1C,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IAI7C,KAAK,aAAoB,OAAO,uBAsBsB;IAEtD,gBAAgB,OAAc,eAAe,WAAW,WAAW,GAAG,MAAM,wBAiG3E;IAED,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,EAAE,QAAQ,EAAE,KAAK,aAAa,EAA0B,MAAM,0BAA0B,CAAA;AAE/F,OAAO,EAAU,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIlD,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;AAMhC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAK3B,CAAA;AAGF,qBAAa,eAAgB,SAAQ,aAAa,CAAC,GAAG,CAAC;IACrD,MAAM,SAA2C;IACjD,OAAO;8BAiK0B,OAAO,CAAC,aAAa,CAAC,GAAG,GAAG,SAAS,CAAC;4BAatC,MAAM,GAAG,SAAS,KAAG,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;6BAe7D,aAAa,CAAC,GAAG;;MA7LG;gBAE1C,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IAI7C,KAAK,aAAoB,OAAO,uBAsBsB;IAEtD,gBAAgB,OAAc,eAAe,WAAW,WAAW,GAAG,MAAM,wBA0H3E;IAED,cAAc,OAAc,eAAe,QAAQ,MAAM,WAAW,MAAM,aAAa,OAAO,mBAG7F;CACF"}
@@ -1,16 +1,17 @@
1
1
  import { makeColumnSpec } from '@livestore/common';
2
- import { DbSchema } from '@livestore/common/schema';
2
+ import { DbSchema, mutationEventSchemaAny } from '@livestore/common/schema';
3
3
  import { shouldNeverHappen } from '@livestore/utils';
4
4
  import { Effect, Schema } from '@livestore/utils/effect';
5
5
  import { DurableObject } from 'cloudflare:workers';
6
6
  import { WSMessage } from '../common/index.js';
7
- const encodeMessage = Schema.encodeSync(Schema.parseJson(WSMessage.Message));
8
- const decodeMessage = Schema.decodeUnknownEither(Schema.parseJson(WSMessage.Message));
7
+ const encodeOutgoingMessage = Schema.encodeSync(Schema.parseJson(WSMessage.BackendToClientMessage));
8
+ const encodeIncomingMessage = Schema.encodeSync(Schema.parseJson(WSMessage.ClientToBackendMessage));
9
+ const decodeIncomingMessage = Schema.decodeUnknownEither(Schema.parseJson(WSMessage.ClientToBackendMessage));
9
10
  export const mutationLogTable = DbSchema.table('__unused', {
10
- // TODO add parent ids (see https://vlcn.io/blog/crdt-substrate)
11
- id: DbSchema.text({ primaryKey: true }),
12
- mutation: DbSchema.text({ nullable: false }),
13
- args: DbSchema.text({ nullable: false, schema: Schema.parseJson(Schema.Any) }),
11
+ id: DbSchema.integer({ primaryKey: true }),
12
+ parentId: DbSchema.integer({}),
13
+ mutation: DbSchema.text({}),
14
+ args: DbSchema.text({ schema: Schema.parseJson(Schema.Any) }),
14
15
  });
15
16
  // Durable Object
16
17
  export class WebSocketServer extends DurableObject {
@@ -23,7 +24,7 @@ export class WebSocketServer extends DurableObject {
23
24
  const { 0: client, 1: server } = new WebSocketPair();
24
25
  // See https://developers.cloudflare.com/durable-objects/examples/websocket-hibernation-server
25
26
  this.ctx.acceptWebSocket(server);
26
- this.ctx.setWebSocketAutoResponse(new WebSocketRequestResponsePair(encodeMessage(WSMessage.Ping.make({ requestId: 'ping' })), encodeMessage(WSMessage.Pong.make({ requestId: 'ping' }))));
27
+ this.ctx.setWebSocketAutoResponse(new WebSocketRequestResponsePair(encodeIncomingMessage(WSMessage.Ping.make({ requestId: 'ping' })), encodeOutgoingMessage(WSMessage.Pong.make({ requestId: 'ping' }))));
27
28
  const colSpec = makeColumnSpec(mutationLogTable.sqliteDef.ast);
28
29
  this.env.DB.exec(`CREATE TABLE IF NOT EXISTS ${this.dbName} (${colSpec}) strict`);
29
30
  return new Response(null, {
@@ -32,77 +33,92 @@ export class WebSocketServer extends DurableObject {
32
33
  });
33
34
  }).pipe(Effect.tapCauseLogPretty, Effect.runPromise);
34
35
  webSocketMessage = async (ws, message) => {
35
- const decodedMessageRes = decodeMessage(message);
36
+ const decodedMessageRes = decodeIncomingMessage(message);
36
37
  if (decodedMessageRes._tag === 'Left') {
37
38
  console.error('Invalid message received', decodedMessageRes.left);
38
39
  return;
39
40
  }
40
41
  const decodedMessage = decodedMessageRes.right;
41
42
  const requestId = decodedMessage.requestId;
42
- switch (decodedMessage._tag) {
43
- case 'WSMessage.PullReq': {
44
- const cursor = decodedMessage.cursor;
45
- const CHUNK_SIZE = 100;
46
- // TODO use streaming
47
- const remainingEvents = [...(await this.storage.getEvents(cursor))];
48
- // NOTE we want to make sure the WS server responds at least once with `InitRes` even if `events` is empty
49
- while (true) {
50
- const events = remainingEvents.splice(0, CHUNK_SIZE);
51
- const hasMore = remainingEvents.length > 0;
52
- ws.send(encodeMessage(WSMessage.PullRes.make({ events, hasMore, requestId })));
53
- if (hasMore === false) {
54
- break;
43
+ try {
44
+ switch (decodedMessage._tag) {
45
+ case 'WSMessage.PullReq': {
46
+ const cursor = decodedMessage.cursor;
47
+ const CHUNK_SIZE = 100;
48
+ // TODO use streaming
49
+ const remainingEvents = [...(await this.storage.getEvents(cursor))];
50
+ // NOTE we want to make sure the WS server responds at least once with `InitRes` even if `events` is empty
51
+ while (true) {
52
+ const events = remainingEvents.splice(0, CHUNK_SIZE);
53
+ const encodedEvents = Schema.encodeSync(Schema.Array(mutationEventSchemaAny))(events);
54
+ const hasMore = remainingEvents.length > 0;
55
+ ws.send(encodeOutgoingMessage(WSMessage.PullRes.make({ events: encodedEvents, hasMore, requestId })));
56
+ if (hasMore === false) {
57
+ break;
58
+ }
55
59
  }
60
+ break;
56
61
  }
57
- break;
58
- }
59
- case 'WSMessage.PushReq': {
60
- // NOTE we're currently not blocking on this to allow broadcasting right away
61
- // however we should do some mutation validation first (e.g. checking parent event id)
62
- const storePromise = decodedMessage.persisted
63
- ? this.storage.appendEvent(decodedMessage.mutationEventEncoded)
64
- : Promise.resolve();
65
- ws.send(encodeMessage(WSMessage.PushAck.make({ mutationId: decodedMessage.mutationEventEncoded.id, requestId })));
66
- // console.debug(`Broadcasting mutation event to ${this.subscribedWebSockets.size} clients`)
67
- const connectedClients = this.ctx.getWebSockets();
68
- if (connectedClients.length > 0) {
69
- const broadcastMessage = encodeMessage(WSMessage.PushBroadcast.make({
70
- mutationEventEncoded: decodedMessage.mutationEventEncoded,
71
- requestId,
72
- persisted: decodedMessage.persisted,
73
- }));
74
- for (const conn of connectedClients) {
75
- console.log('Broadcasting to client', conn === ws ? 'self' : 'other');
76
- if (conn !== ws) {
62
+ case 'WSMessage.PushReq': {
63
+ // TODO check whether we could use the Durable Object storage for this to speed up the lookup
64
+ const latestEvent = await this.storage.getLatestEvent();
65
+ const expectedParentId = latestEvent?.id ?? { global: 0, local: 0 };
66
+ if (decodedMessage.mutationEventEncoded.parentId !== expectedParentId) {
67
+ ws.send(encodeOutgoingMessage(WSMessage.Error.make({
68
+ message: `Invalid parent id. Received ${decodedMessage.mutationEventEncoded.parentId} but expected ${expectedParentId}`,
69
+ requestId,
70
+ })));
71
+ return;
72
+ }
73
+ // TODO handle clientId unique conflict
74
+ // NOTE we're currently not blocking on this to allow broadcasting right away
75
+ const storePromise = decodedMessage.persisted
76
+ ? this.storage.appendEvent(decodedMessage.mutationEventEncoded)
77
+ : Promise.resolve();
78
+ ws.send(encodeOutgoingMessage(WSMessage.PushAck.make({ mutationId: decodedMessage.mutationEventEncoded.id.global, requestId })));
79
+ // console.debug(`Broadcasting mutation event to ${this.subscribedWebSockets.size} clients`)
80
+ const connectedClients = this.ctx.getWebSockets();
81
+ if (connectedClients.length > 0) {
82
+ const broadcastMessage = encodeOutgoingMessage(WSMessage.PushBroadcast.make({
83
+ mutationEventEncoded: decodedMessage.mutationEventEncoded,
84
+ persisted: decodedMessage.persisted,
85
+ }));
86
+ for (const conn of connectedClients) {
87
+ console.log('Broadcasting to client', conn === ws ? 'self' : 'other');
88
+ // if (conn !== ws) {
77
89
  conn.send(broadcastMessage);
90
+ // }
78
91
  }
79
92
  }
93
+ await storePromise;
94
+ break;
80
95
  }
81
- await storePromise;
82
- break;
83
- }
84
- case 'WSMessage.AdminResetRoomReq': {
85
- if (decodedMessage.adminSecret !== this.env.ADMIN_SECRET) {
86
- ws.send(encodeMessage(WSMessage.Error.make({ message: 'Invalid admin secret', requestId })));
87
- return;
96
+ case 'WSMessage.AdminResetRoomReq': {
97
+ if (decodedMessage.adminSecret !== this.env.ADMIN_SECRET) {
98
+ ws.send(encodeOutgoingMessage(WSMessage.Error.make({ message: 'Invalid admin secret', requestId })));
99
+ return;
100
+ }
101
+ await this.storage.resetRoom();
102
+ ws.send(encodeOutgoingMessage(WSMessage.AdminResetRoomRes.make({ requestId })));
103
+ break;
88
104
  }
89
- await this.storage.resetRoom();
90
- ws.send(encodeMessage(WSMessage.AdminResetRoomRes.make({ requestId })));
91
- break;
92
- }
93
- case 'WSMessage.AdminInfoReq': {
94
- if (decodedMessage.adminSecret !== this.env.ADMIN_SECRET) {
95
- ws.send(encodeMessage(WSMessage.Error.make({ message: 'Invalid admin secret', requestId })));
96
- return;
105
+ case 'WSMessage.AdminInfoReq': {
106
+ if (decodedMessage.adminSecret !== this.env.ADMIN_SECRET) {
107
+ ws.send(encodeOutgoingMessage(WSMessage.Error.make({ message: 'Invalid admin secret', requestId })));
108
+ return;
109
+ }
110
+ ws.send(encodeOutgoingMessage(WSMessage.AdminInfoRes.make({ requestId, info: { durableObjectId: this.ctx.id.toString() } })));
111
+ break;
112
+ }
113
+ default: {
114
+ console.error('unsupported message', decodedMessage);
115
+ return shouldNeverHappen();
97
116
  }
98
- ws.send(encodeMessage(WSMessage.AdminInfoRes.make({ requestId, info: { durableObjectId: this.ctx.id.toString() } })));
99
- break;
100
- }
101
- default: {
102
- console.error('unsupported message', decodedMessage);
103
- return shouldNeverHappen();
104
117
  }
105
118
  }
119
+ catch (error) {
120
+ ws.send(encodeOutgoingMessage(WSMessage.Error.make({ message: error.message, requestId })));
121
+ }
106
122
  };
107
123
  webSocketClose = async (ws, code, _reason, _wasClean) => {
108
124
  // If the client closes the connection, the runtime will invoke the webSocketClose() handler.
@@ -110,23 +126,39 @@ export class WebSocketServer extends DurableObject {
110
126
  };
111
127
  }
112
128
  const makeStorage = (ctx, env, dbName) => {
129
+ const getLatestEvent = async () => {
130
+ const rawEvents = await env.DB.prepare(`SELECT * FROM ${dbName} ORDER BY id DESC LIMIT 1`).all();
131
+ if (rawEvents.error) {
132
+ throw new Error(rawEvents.error);
133
+ }
134
+ const events = Schema.decodeUnknownSync(Schema.Array(mutationLogTable.schema))(rawEvents.results).map((e) => ({
135
+ ...e,
136
+ id: { global: e.id, local: 0 },
137
+ parentId: { global: e.parentId, local: 0 },
138
+ }));
139
+ return events[0];
140
+ };
113
141
  const getEvents = async (cursor) => {
114
- const whereClause = cursor ? `WHERE id > '${cursor}'` : '';
142
+ const whereClause = cursor ? `WHERE id > ${cursor}` : '';
115
143
  // TODO handle case where `cursor` was not found
116
144
  const rawEvents = await env.DB.prepare(`SELECT * FROM ${dbName} ${whereClause} ORDER BY id ASC`).all();
117
145
  if (rawEvents.error) {
118
146
  throw new Error(rawEvents.error);
119
147
  }
120
- const events = Schema.decodeUnknownSync(Schema.Array(mutationLogTable.schema))(rawEvents.results);
148
+ const events = Schema.decodeUnknownSync(Schema.Array(mutationLogTable.schema))(rawEvents.results).map((e) => ({
149
+ ...e,
150
+ id: { global: e.id, local: 0 },
151
+ parentId: { global: e.parentId, local: 0 },
152
+ }));
121
153
  return events;
122
154
  };
123
155
  const appendEvent = async (event) => {
124
- const sql = `INSERT INTO ${dbName} (id, args, mutation) VALUES (?, ?, ?)`;
125
- await env.DB.prepare(sql).bind(event.id, JSON.stringify(event.args), event.mutation).run();
156
+ const sql = `INSERT INTO ${dbName} (id, parentId, args, mutation) VALUES (?, ?, ?, ?)`;
157
+ await env.DB.prepare(sql).bind(event.id, event.parentId, JSON.stringify(event.args), event.mutation).run();
126
158
  };
127
159
  const resetRoom = async () => {
128
160
  await ctx.storage.deleteAll();
129
161
  };
130
- return { getEvents, appendEvent, resetRoom };
162
+ return { getLatestEvent, getEvents, appendEvent, resetRoom };
131
163
  };
132
164
  //# 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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"}