@livestore/sync-cf 0.0.58-dev.8 → 0.1.0-dev.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.
- package/.netlify/state.json +3 -0
- package/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/8ee300993f9a2c909aede59646369fa0cc28d25304b9b9af94f54d4543ad60f4.sqlite +0 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/cf-worker/durable-object.d.ts +9 -6
- package/dist/cf-worker/durable-object.d.ts.map +1 -1
- package/dist/cf-worker/durable-object.js +17 -15
- package/dist/cf-worker/durable-object.js.map +1 -1
- package/package.json +3 -3
- package/src/cf-worker/durable-object.ts +17 -15
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/23a5a193673cd4aa1f412953ff8ee7cf6169b146127a42e9b84ce79993672b0a.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/31569057f8ec82f1d479956671fe58b9f0f4e32a64a68c3ba9c3cb6744f74b3d.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/33d6e9d204e8c535d55150b9258a9388ddf594a89f30fc1d557e64546a59e731.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/354c1d4fbf3d44a1e359b6595b4e7f2e0c320e607cad72290b0f842246dea4c3.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/472d06f3610154b855a10d98212ec0ae8aa4022def5c932134cafe07ddca6cc4.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/472d06f3610154b855a10d98212ec0ae8aa4022def5c932134cafe07ddca6cc4.sqlite-shm +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/472d06f3610154b855a10d98212ec0ae8aa4022def5c932134cafe07ddca6cc4.sqlite-wal +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/56fc052bba96d75e557bb09c4826387d0d3500ab0eb8de9e9b7379b795277338.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/70a851401fda75ce3a534dacc3f979fceaff8234430fc6333f22112519388493.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/82afe32c9f3dfe706e088859636f9137e1824b12206e1c0870eef31abcb77d2e.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/83b7880fabbc105109963ee7d1b9b8560b31a560b6b06cf2c326f4f1eca6e80f.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/985f28c526c3fe0133b72007b09233c1a827ae9a588ca5cff0e740f2f5da7dd3.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/a0f452412c79c524292ab9f6895e09605492f5980d8ad6cfc34c0fb88ee6d1cd.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/a58eeee7c3798f238d9446895cd2d0f140b06589dcdf9a777ed79131eb83ea5b.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/baf2225931d572afb47e60d5e189ae58b9764ea0a8a501e0ac202a35c2b35084.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/c27c5b00d9c92102951df7d882fb0b9c9f1a9466e0752265b255041c6c3dc739.sqlite +0 -0
- package/.wrangler/state/v3/do/websocket-server-WebSocketServer/d2245ee36dd16e1f76180d89bd2503f0d4808a5986a58b8677f9a365a793acc6.sqlite +0 -0
- /package/.wrangler/state/v3/do/websocket-server-WebSocketServer/{037646d8e1e6ad005a1f4ff1c53fd716bec6a458a8b35ebffd9d5b78ec4ea8a3.sqlite → 2c3676d859102e448b271e1b4336b1e40778992b14728e2a2bd642c0f225e9c5.sqlite} +0 -0
- /package/.wrangler/state/v3/do/websocket-server-WebSocketServer/{1471dd2fd02c2d9eb229fcf3cad5fd330cd295bfdee44481714d91b883756b11.sqlite → 6eb1111cecdc6ae7e3a38c3d7db0f3ec7de5b318e682cdcf0ff0dc881cbbcee7.sqlite} +0 -0
|
@@ -8,14 +8,14 @@ export interface Env {
|
|
|
8
8
|
}
|
|
9
9
|
type WebSocketClient = WebSocket;
|
|
10
10
|
export declare const mutationLogTable: DbSchema.TableDef<DbSchema.SqliteDsl.TableDefinition<"__unused", {
|
|
11
|
-
|
|
11
|
+
idGlobal: {
|
|
12
12
|
columnType: "integer";
|
|
13
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
|
-
|
|
18
|
+
parentIdGlobal: {
|
|
19
19
|
columnType: "integer";
|
|
20
20
|
schema: Schema.Schema<number, number, never>;
|
|
21
21
|
default: import("effect/Option").None<never>;
|
|
@@ -36,21 +36,24 @@ export declare const mutationLogTable: DbSchema.TableDef<DbSchema.SqliteDsl.Tabl
|
|
|
36
36
|
nullable: false;
|
|
37
37
|
primaryKey: false;
|
|
38
38
|
};
|
|
39
|
+
id: DbSchema.SqliteDsl.ColumnDefinition<string, string>;
|
|
39
40
|
}>, false, {
|
|
40
41
|
isSingleton: false;
|
|
41
42
|
disableAutomaticIdColumn: false;
|
|
42
43
|
deriveMutations: never;
|
|
43
44
|
isSingleColumn: false;
|
|
44
45
|
}, Schema.Schema<{
|
|
45
|
-
readonly
|
|
46
|
-
readonly
|
|
46
|
+
readonly idGlobal: number;
|
|
47
|
+
readonly parentIdGlobal: number;
|
|
47
48
|
readonly mutation: string;
|
|
48
49
|
readonly args: any;
|
|
50
|
+
readonly id: string;
|
|
49
51
|
}, {
|
|
50
|
-
readonly
|
|
51
|
-
readonly
|
|
52
|
+
readonly idGlobal: number;
|
|
53
|
+
readonly parentIdGlobal: number;
|
|
52
54
|
readonly mutation: string;
|
|
53
55
|
readonly args: string;
|
|
56
|
+
readonly id: string;
|
|
54
57
|
}, never>>;
|
|
55
58
|
export declare class WebSocketServer extends DurableObject<Env> {
|
|
56
59
|
dbName: string;
|
|
@@ -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,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
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import { makeColumnSpec } from '@livestore/common';
|
|
1
|
+
import { makeColumnSpec, ROOT_ID } from '@livestore/common';
|
|
2
2
|
import { DbSchema, mutationEventSchemaAny } from '@livestore/common/schema';
|
|
3
3
|
import { shouldNeverHappen } from '@livestore/utils';
|
|
4
4
|
import { Effect, Schema } from '@livestore/utils/effect';
|
|
@@ -8,8 +8,8 @@ const encodeOutgoingMessage = Schema.encodeSync(Schema.parseJson(WSMessage.Backe
|
|
|
8
8
|
const encodeIncomingMessage = Schema.encodeSync(Schema.parseJson(WSMessage.ClientToBackendMessage));
|
|
9
9
|
const decodeIncomingMessage = Schema.decodeUnknownEither(Schema.parseJson(WSMessage.ClientToBackendMessage));
|
|
10
10
|
export const mutationLogTable = DbSchema.table('__unused', {
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
idGlobal: DbSchema.integer({ primaryKey: true }),
|
|
12
|
+
parentIdGlobal: DbSchema.integer({}),
|
|
13
13
|
mutation: DbSchema.text({}),
|
|
14
14
|
args: DbSchema.text({ schema: Schema.parseJson(Schema.Any) }),
|
|
15
15
|
});
|
|
@@ -62,10 +62,10 @@ export class WebSocketServer extends DurableObject {
|
|
|
62
62
|
case 'WSMessage.PushReq': {
|
|
63
63
|
// TODO check whether we could use the Durable Object storage for this to speed up the lookup
|
|
64
64
|
const latestEvent = await this.storage.getLatestEvent();
|
|
65
|
-
const expectedParentId = latestEvent?.id ??
|
|
66
|
-
if (decodedMessage.mutationEventEncoded.parentId !== expectedParentId) {
|
|
65
|
+
const expectedParentId = latestEvent?.id ?? ROOT_ID;
|
|
66
|
+
if (decodedMessage.mutationEventEncoded.parentId.global !== expectedParentId.global) {
|
|
67
67
|
ws.send(encodeOutgoingMessage(WSMessage.Error.make({
|
|
68
|
-
message: `Invalid parent id. Received ${decodedMessage.mutationEventEncoded.parentId} but expected ${expectedParentId}`,
|
|
68
|
+
message: `Invalid parent id. Received ${decodedMessage.mutationEventEncoded.parentId.global} but expected ${expectedParentId.global}`,
|
|
69
69
|
requestId,
|
|
70
70
|
})));
|
|
71
71
|
return;
|
|
@@ -127,34 +127,36 @@ export class WebSocketServer extends DurableObject {
|
|
|
127
127
|
}
|
|
128
128
|
const makeStorage = (ctx, env, dbName) => {
|
|
129
129
|
const getLatestEvent = async () => {
|
|
130
|
-
const rawEvents = await env.DB.prepare(`SELECT * FROM ${dbName} ORDER BY
|
|
130
|
+
const rawEvents = await env.DB.prepare(`SELECT * FROM ${dbName} ORDER BY idGlobal DESC LIMIT 1`).all();
|
|
131
131
|
if (rawEvents.error) {
|
|
132
132
|
throw new Error(rawEvents.error);
|
|
133
133
|
}
|
|
134
134
|
const events = Schema.decodeUnknownSync(Schema.Array(mutationLogTable.schema))(rawEvents.results).map((e) => ({
|
|
135
135
|
...e,
|
|
136
|
-
id: { global: e.
|
|
137
|
-
parentId: { global: e.
|
|
136
|
+
id: { global: e.idGlobal, local: 0 },
|
|
137
|
+
parentId: { global: e.parentIdGlobal, local: 0 },
|
|
138
138
|
}));
|
|
139
139
|
return events[0];
|
|
140
140
|
};
|
|
141
141
|
const getEvents = async (cursor) => {
|
|
142
|
-
const whereClause = cursor ? `WHERE
|
|
142
|
+
const whereClause = cursor ? `WHERE idGlobal > ${cursor}` : '';
|
|
143
143
|
// TODO handle case where `cursor` was not found
|
|
144
|
-
const rawEvents = await env.DB.prepare(`SELECT * FROM ${dbName} ${whereClause} ORDER BY
|
|
144
|
+
const rawEvents = await env.DB.prepare(`SELECT * FROM ${dbName} ${whereClause} ORDER BY idGlobal ASC`).all();
|
|
145
145
|
if (rawEvents.error) {
|
|
146
146
|
throw new Error(rawEvents.error);
|
|
147
147
|
}
|
|
148
148
|
const events = Schema.decodeUnknownSync(Schema.Array(mutationLogTable.schema))(rawEvents.results).map((e) => ({
|
|
149
149
|
...e,
|
|
150
|
-
id: { global: e.
|
|
151
|
-
parentId: { global: e.
|
|
150
|
+
id: { global: e.idGlobal, local: 0 },
|
|
151
|
+
parentId: { global: e.parentIdGlobal, local: 0 },
|
|
152
152
|
}));
|
|
153
153
|
return events;
|
|
154
154
|
};
|
|
155
155
|
const appendEvent = async (event) => {
|
|
156
|
-
const sql = `INSERT INTO ${dbName} (
|
|
157
|
-
await env.DB.prepare(sql)
|
|
156
|
+
const sql = `INSERT INTO ${dbName} (idGlobal, parentIdGlobal, args, mutation) VALUES (?, ?, ?, ?)`;
|
|
157
|
+
await env.DB.prepare(sql)
|
|
158
|
+
.bind(event.id.global, event.parentId.global, JSON.stringify(event.args), event.mutation)
|
|
159
|
+
.run();
|
|
158
160
|
};
|
|
159
161
|
const resetRoom = async () => {
|
|
160
162
|
await ctx.storage.deleteAll();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable-object.js","sourceRoot":"","sources":["../../src/cf-worker/durable-object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"durable-object.js","sourceRoot":"","sources":["../../src/cf-worker/durable-object.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/sync-cf",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0-dev.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
}
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@livestore/common": "0.0
|
|
13
|
-
"@livestore/utils": "0.0
|
|
12
|
+
"@livestore/common": "0.1.0-dev.0",
|
|
13
|
+
"@livestore/utils": "0.1.0-dev.0"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
16
|
"@cloudflare/workers-types": "4.20241022.0",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { makeColumnSpec } from '@livestore/common'
|
|
1
|
+
import { makeColumnSpec, ROOT_ID } from '@livestore/common'
|
|
2
2
|
import { DbSchema, type MutationEvent, mutationEventSchemaAny } from '@livestore/common/schema'
|
|
3
3
|
import { shouldNeverHappen } from '@livestore/utils'
|
|
4
4
|
import { Effect, Schema } from '@livestore/utils/effect'
|
|
@@ -19,8 +19,8 @@ const encodeIncomingMessage = Schema.encodeSync(Schema.parseJson(WSMessage.Clien
|
|
|
19
19
|
const decodeIncomingMessage = Schema.decodeUnknownEither(Schema.parseJson(WSMessage.ClientToBackendMessage))
|
|
20
20
|
|
|
21
21
|
export const mutationLogTable = DbSchema.table('__unused', {
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
idGlobal: DbSchema.integer({ primaryKey: true }),
|
|
23
|
+
parentIdGlobal: DbSchema.integer({}),
|
|
24
24
|
mutation: DbSchema.text({}),
|
|
25
25
|
args: DbSchema.text({ schema: Schema.parseJson(Schema.Any) }),
|
|
26
26
|
})
|
|
@@ -96,13 +96,13 @@ export class WebSocketServer extends DurableObject<Env> {
|
|
|
96
96
|
case 'WSMessage.PushReq': {
|
|
97
97
|
// TODO check whether we could use the Durable Object storage for this to speed up the lookup
|
|
98
98
|
const latestEvent = await this.storage.getLatestEvent()
|
|
99
|
-
const expectedParentId = latestEvent?.id ??
|
|
99
|
+
const expectedParentId = latestEvent?.id ?? ROOT_ID
|
|
100
100
|
|
|
101
|
-
if (decodedMessage.mutationEventEncoded.parentId !== expectedParentId) {
|
|
101
|
+
if (decodedMessage.mutationEventEncoded.parentId.global !== expectedParentId.global) {
|
|
102
102
|
ws.send(
|
|
103
103
|
encodeOutgoingMessage(
|
|
104
104
|
WSMessage.Error.make({
|
|
105
|
-
message: `Invalid parent id. Received ${decodedMessage.mutationEventEncoded.parentId} but expected ${expectedParentId}`,
|
|
105
|
+
message: `Invalid parent id. Received ${decodedMessage.mutationEventEncoded.parentId.global} but expected ${expectedParentId.global}`,
|
|
106
106
|
requestId,
|
|
107
107
|
}),
|
|
108
108
|
),
|
|
@@ -190,36 +190,38 @@ export class WebSocketServer extends DurableObject<Env> {
|
|
|
190
190
|
|
|
191
191
|
const makeStorage = (ctx: DurableObjectState, env: Env, dbName: string) => {
|
|
192
192
|
const getLatestEvent = async (): Promise<MutationEvent.Any | undefined> => {
|
|
193
|
-
const rawEvents = await env.DB.prepare(`SELECT * FROM ${dbName} ORDER BY
|
|
193
|
+
const rawEvents = await env.DB.prepare(`SELECT * FROM ${dbName} ORDER BY idGlobal DESC LIMIT 1`).all()
|
|
194
194
|
if (rawEvents.error) {
|
|
195
195
|
throw new Error(rawEvents.error)
|
|
196
196
|
}
|
|
197
197
|
const events = Schema.decodeUnknownSync(Schema.Array(mutationLogTable.schema))(rawEvents.results).map((e) => ({
|
|
198
198
|
...e,
|
|
199
|
-
id: { global: e.
|
|
200
|
-
parentId: { global: e.
|
|
199
|
+
id: { global: e.idGlobal, local: 0 },
|
|
200
|
+
parentId: { global: e.parentIdGlobal, local: 0 },
|
|
201
201
|
}))
|
|
202
202
|
return events[0]
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
const getEvents = async (cursor: number | undefined): Promise<ReadonlyArray<MutationEvent.Any>> => {
|
|
206
|
-
const whereClause = cursor ? `WHERE
|
|
206
|
+
const whereClause = cursor ? `WHERE idGlobal > ${cursor}` : ''
|
|
207
207
|
// TODO handle case where `cursor` was not found
|
|
208
|
-
const rawEvents = await env.DB.prepare(`SELECT * FROM ${dbName} ${whereClause} ORDER BY
|
|
208
|
+
const rawEvents = await env.DB.prepare(`SELECT * FROM ${dbName} ${whereClause} ORDER BY idGlobal ASC`).all()
|
|
209
209
|
if (rawEvents.error) {
|
|
210
210
|
throw new Error(rawEvents.error)
|
|
211
211
|
}
|
|
212
212
|
const events = Schema.decodeUnknownSync(Schema.Array(mutationLogTable.schema))(rawEvents.results).map((e) => ({
|
|
213
213
|
...e,
|
|
214
|
-
id: { global: e.
|
|
215
|
-
parentId: { global: e.
|
|
214
|
+
id: { global: e.idGlobal, local: 0 },
|
|
215
|
+
parentId: { global: e.parentIdGlobal, local: 0 },
|
|
216
216
|
}))
|
|
217
217
|
return events
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
const appendEvent = async (event: MutationEvent.Any) => {
|
|
221
|
-
const sql = `INSERT INTO ${dbName} (
|
|
222
|
-
await env.DB.prepare(sql)
|
|
221
|
+
const sql = `INSERT INTO ${dbName} (idGlobal, parentIdGlobal, args, mutation) VALUES (?, ?, ?, ?)`
|
|
222
|
+
await env.DB.prepare(sql)
|
|
223
|
+
.bind(event.id.global, event.parentId.global, JSON.stringify(event.args), event.mutation)
|
|
224
|
+
.run()
|
|
223
225
|
}
|
|
224
226
|
|
|
225
227
|
const resetRoom = async () => {
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
File without changes
|