@livestore/adapter-web 0.0.0-snapshot-a953343ad2d7468c6573bcb5e26f0eab4302078f

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 (111) hide show
  1. package/.eslintrc.cjs +6 -0
  2. package/README.md +12 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/common/connection.d.ts +7 -0
  5. package/dist/common/connection.d.ts.map +1 -0
  6. package/dist/common/connection.js +25 -0
  7. package/dist/common/connection.js.map +1 -0
  8. package/dist/devtools-bridge/background-browser-channel.d.ts +9 -0
  9. package/dist/devtools-bridge/background-browser-channel.d.ts.map +1 -0
  10. package/dist/devtools-bridge/background-browser-channel.js +31 -0
  11. package/dist/devtools-bridge/background-browser-channel.js.map +1 -0
  12. package/dist/devtools-bridge/background-message.d.ts +75 -0
  13. package/dist/devtools-bridge/background-message.d.ts.map +1 -0
  14. package/dist/devtools-bridge/background-message.js +53 -0
  15. package/dist/devtools-bridge/background-message.js.map +1 -0
  16. package/dist/devtools-bridge/bridge-shared.d.ts +14 -0
  17. package/dist/devtools-bridge/bridge-shared.d.ts.map +1 -0
  18. package/dist/devtools-bridge/bridge-shared.js +67 -0
  19. package/dist/devtools-bridge/bridge-shared.js.map +1 -0
  20. package/dist/devtools-bridge/browser-extension-bridge.d.ts +3 -0
  21. package/dist/devtools-bridge/browser-extension-bridge.d.ts.map +1 -0
  22. package/dist/devtools-bridge/browser-extension-bridge.js +59 -0
  23. package/dist/devtools-bridge/browser-extension-bridge.js.map +1 -0
  24. package/dist/devtools-bridge/iframe-message.d.ts +16 -0
  25. package/dist/devtools-bridge/iframe-message.d.ts.map +1 -0
  26. package/dist/devtools-bridge/iframe-message.js +11 -0
  27. package/dist/devtools-bridge/iframe-message.js.map +1 -0
  28. package/dist/devtools-bridge/index.d.ts +6 -0
  29. package/dist/devtools-bridge/index.d.ts.map +1 -0
  30. package/dist/devtools-bridge/index.js +5 -0
  31. package/dist/devtools-bridge/index.js.map +1 -0
  32. package/dist/devtools-bridge/web-bridge.d.ts +31 -0
  33. package/dist/devtools-bridge/web-bridge.d.ts.map +1 -0
  34. package/dist/devtools-bridge/web-bridge.js +131 -0
  35. package/dist/devtools-bridge/web-bridge.js.map +1 -0
  36. package/dist/in-memory/index.d.ts +4 -0
  37. package/dist/in-memory/index.d.ts.map +1 -0
  38. package/dist/in-memory/index.js +50 -0
  39. package/dist/in-memory/index.js.map +1 -0
  40. package/dist/index.d.ts +4 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +4 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/opfs-utils.d.ts +5 -0
  45. package/dist/opfs-utils.d.ts.map +1 -0
  46. package/dist/opfs-utils.js +43 -0
  47. package/dist/opfs-utils.js.map +1 -0
  48. package/dist/web-worker/client-session/client-session-devtools.d.ts +7 -0
  49. package/dist/web-worker/client-session/client-session-devtools.d.ts.map +1 -0
  50. package/dist/web-worker/client-session/client-session-devtools.js +107 -0
  51. package/dist/web-worker/client-session/client-session-devtools.js.map +1 -0
  52. package/dist/web-worker/client-session/index.d.ts +41 -0
  53. package/dist/web-worker/client-session/index.d.ts.map +1 -0
  54. package/dist/web-worker/client-session/index.js +299 -0
  55. package/dist/web-worker/client-session/index.js.map +1 -0
  56. package/dist/web-worker/client-session/trim-batch.d.ts +4 -0
  57. package/dist/web-worker/client-session/trim-batch.d.ts.map +1 -0
  58. package/dist/web-worker/client-session/trim-batch.js +13 -0
  59. package/dist/web-worker/client-session/trim-batch.js.map +1 -0
  60. package/dist/web-worker/client-session/trim-batch.test.d.ts +2 -0
  61. package/dist/web-worker/client-session/trim-batch.test.d.ts.map +1 -0
  62. package/dist/web-worker/client-session/trim-batch.test.js +38 -0
  63. package/dist/web-worker/client-session/trim-batch.test.js.map +1 -0
  64. package/dist/web-worker/common/persisted-sqlite.d.ts +23 -0
  65. package/dist/web-worker/common/persisted-sqlite.d.ts.map +1 -0
  66. package/dist/web-worker/common/persisted-sqlite.js +92 -0
  67. package/dist/web-worker/common/persisted-sqlite.js.map +1 -0
  68. package/dist/web-worker/common/shutdown-channel.d.ts +7 -0
  69. package/dist/web-worker/common/shutdown-channel.d.ts.map +1 -0
  70. package/dist/web-worker/common/shutdown-channel.js +7 -0
  71. package/dist/web-worker/common/shutdown-channel.js.map +1 -0
  72. package/dist/web-worker/common/worker-schema.d.ts +226 -0
  73. package/dist/web-worker/common/worker-schema.d.ts.map +1 -0
  74. package/dist/web-worker/common/worker-schema.js +176 -0
  75. package/dist/web-worker/common/worker-schema.js.map +1 -0
  76. package/dist/web-worker/leader-worker/make-leader-worker.d.ts +15 -0
  77. package/dist/web-worker/leader-worker/make-leader-worker.d.ts.map +1 -0
  78. package/dist/web-worker/leader-worker/make-leader-worker.js +144 -0
  79. package/dist/web-worker/leader-worker/make-leader-worker.js.map +1 -0
  80. package/dist/web-worker/shared-worker/make-shared-worker.d.ts +2 -0
  81. package/dist/web-worker/shared-worker/make-shared-worker.d.ts.map +1 -0
  82. package/dist/web-worker/shared-worker/make-shared-worker.js +160 -0
  83. package/dist/web-worker/shared-worker/make-shared-worker.js.map +1 -0
  84. package/dist/web-worker/vite-dev-polyfill.d.ts +2 -0
  85. package/dist/web-worker/vite-dev-polyfill.d.ts.map +1 -0
  86. package/dist/web-worker/vite-dev-polyfill.js +37 -0
  87. package/dist/web-worker/vite-dev-polyfill.js.map +1 -0
  88. package/package.json +78 -0
  89. package/src/common/connection.ts +32 -0
  90. package/src/devtools-bridge/background-browser-channel.ts +57 -0
  91. package/src/devtools-bridge/background-message.ts +42 -0
  92. package/src/devtools-bridge/bridge-shared.ts +97 -0
  93. package/src/devtools-bridge/browser-extension-bridge.ts +64 -0
  94. package/src/devtools-bridge/iframe-message.ts +9 -0
  95. package/src/devtools-bridge/index.ts +9 -0
  96. package/src/devtools-bridge/web-bridge.ts +169 -0
  97. package/src/in-memory/index.ts +66 -0
  98. package/src/index.ts +3 -0
  99. package/src/opfs-utils.ts +61 -0
  100. package/src/web-worker/ambient.d.ts +37 -0
  101. package/src/web-worker/client-session/client-session-devtools.ts +167 -0
  102. package/src/web-worker/client-session/index.ts +537 -0
  103. package/src/web-worker/client-session/trim-batch.test.ts +48 -0
  104. package/src/web-worker/client-session/trim-batch.ts +15 -0
  105. package/src/web-worker/common/persisted-sqlite.ts +136 -0
  106. package/src/web-worker/common/shutdown-channel.ts +8 -0
  107. package/src/web-worker/common/worker-schema.ts +206 -0
  108. package/src/web-worker/leader-worker/make-leader-worker.ts +276 -0
  109. package/src/web-worker/shared-worker/make-shared-worker.ts +300 -0
  110. package/src/web-worker/vite-dev-polyfill.ts +36 -0
  111. package/tsconfig.json +17 -0
@@ -0,0 +1,131 @@
1
+ import { Equal, Hash, Schema } from '@livestore/utils/effect';
2
+ export class WebBridgeInfo extends Schema.Class('WebBridgeChannelInfo')({
3
+ appHostId: Schema.String,
4
+ storeId: Schema.String,
5
+ webBridgeId: Schema.String,
6
+ isLeader: Schema.Boolean,
7
+ }) {
8
+ // eslint-disable-next-line prefer-arrow/prefer-arrow-functions
9
+ [Hash.symbol]() {
10
+ return Hash.string(this.appHostId);
11
+ }
12
+ // eslint-disable-next-line prefer-arrow/prefer-arrow-functions
13
+ [Equal.symbol](that) {
14
+ return this.appHostId === that.appHostId;
15
+ }
16
+ }
17
+ // const prepareWebDevtoolsBridge = (
18
+ // options: {
19
+ // sharedWorker: WebAdapterOptions['sharedWorker']
20
+ // appSchema: LiveStoreSchema
21
+ // } & WebBridgeOptions,
22
+ // ): Effect.Effect<Devtools.PrepareDevtoolsBridge, never, Scope.Scope> =>
23
+ // Effect.gen(function* () {
24
+ // const responsePubSub = yield* PubSub.unbounded<
25
+ // Devtools.MessageFromApp | Devtools.MessageFromApp
26
+ // >().pipe(Effect.acquireRelease(PubSub.shutdown))
27
+ // const devtoolsId = nanoid()
28
+ // const portForDevtoolsDeferred = yield* Deferred.make<MessagePort>()
29
+ // const webBridgeBroadcastChannel = yield* Devtools.WebBridge.makeBroadcastChannel()
30
+ // yield* webBridgeBroadcastChannel.listen.pipe(
31
+ // Stream.flatten(),
32
+ // Stream.filter(Schema.is(Devtools.WebBridge.AppHostReady)),
33
+ // Stream.tap(() => webBridgeBroadcastChannel.send(Devtools.WebBridge.DevtoolsReady.make({ devtoolsId }))),
34
+ // Stream.runDrain,
35
+ // Effect.withSpan(`@livestore/adapter-web:devtools:webBridgeChannel:listen`),
36
+ // Effect.ignoreLogged,
37
+ // Effect.forkScoped,
38
+ // )
39
+ // yield* webBridgeBroadcastChannel.send(Devtools.WebBridge.DevtoolsReady.make({ devtoolsId }))
40
+ // const connectionFiberSet = yield* FiberSet.make()
41
+ // yield* webBridgeBroadcastChannel.listen.pipe(
42
+ // Stream.flatten(),
43
+ // Stream.filter(Schema.is(Devtools.WebBridge.ConnectToDevtools)),
44
+ // Stream.tap((msg) =>
45
+ // Effect.gen(function* () {
46
+ // if (devtoolsId !== msg.devtoolsId) return
47
+ // const bridgeInfo = new WebBridgeInfo({
48
+ // appHostId: msg.appHostId,
49
+ // webBridgeId: msg.webBridgeId,
50
+ // isLeader: msg.isLeader,
51
+ // storeId: msg.storeId,
52
+ // })
53
+ // // Propagate disconnect event while connecting.
54
+ // // There's another disconnect handler below after the connection is established.
55
+ // yield* webBridgeBroadcastChannel.listen.pipe(
56
+ // Stream.flatten(),
57
+ // Stream.filter(Schema.is(Devtools.WebBridge.AppHostWillDisconnect)),
58
+ // Stream.filter((msg) => msg.appHostId === bridgeInfo.appHostId),
59
+ // Stream.tap(() => SubscriptionRef.getAndUpdate(options.bridgeInfos, HashSet.remove(bridgeInfo))),
60
+ // Stream.runDrain,
61
+ // Effect.withSpan(`@livestore/adapter-web:devtools:webBridgeChannel:listenForAppHostWillDisconnect`),
62
+ // Effect.tapCauseLogPretty,
63
+ // FiberSet.run(connectionFiberSet),
64
+ // )
65
+ // yield* SubscriptionRef.getAndUpdate(options.bridgeInfos, HashSet.add(bridgeInfo))
66
+ // }),
67
+ // ),
68
+ // Stream.runDrain,
69
+ // Effect.withSpan(`@livestore/adapter-web:devtools:webBridgeChannel:listen`),
70
+ // Effect.tapCauseLogPretty,
71
+ // FiberSet.run(connectionFiberSet),
72
+ // )
73
+ // const selectedChannelInfo = yield* Deferred.await(options.selectedChannelInfoDeferred)
74
+ // const sharedWorker = tryAsFunctionAndNew(options.sharedWorker, {
75
+ // name: `livestore-shared-worker-${selectedChannelInfo.storeId}`,
76
+ // })
77
+ // const sharedWorkerDeferred = yield* Worker.makeSerialized<typeof WorkerSchema.SharedWorker.Request.Type>({
78
+ // initialMessage: () => new WorkerSchema.SharedWorker.InitialMessage({ payload: { _tag: 'FromWebBridge' } }),
79
+ // }).pipe(
80
+ // Effect.provide(BrowserWorker.layer(() => sharedWorker)),
81
+ // Effect.tapCauseLogPretty,
82
+ // Effect.withSpan('@livestore/adapter-web:coordinator:setupSharedWorker'),
83
+ // Effect.toForkedDeferred,
84
+ // )
85
+ // yield* Effect.gen(function* () {
86
+ // const mc = new MessageChannel()
87
+ // const worker = yield* Deferred.await(sharedWorkerDeferred)
88
+ // yield* worker.executeEffect(
89
+ // new WorkerSchema.SharedWorker.DevtoolsWebBridgeOfferPort({
90
+ // port: mc.port1,
91
+ // webBridgeId: selectedChannelInfo.webBridgeId,
92
+ // }),
93
+ // )
94
+ // yield* Deferred.succeed(portForDevtoolsDeferred, mc.port2)
95
+ // // Stop listening for new connections and close `AppHostWillDisconnect` listeners
96
+ // yield* FiberSet.clear(connectionFiberSet)
97
+ // }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped)
98
+ // const { sendToAppHost, appHostId, isLeader } = yield* makeShared({ portForDevtoolsDeferred, responsePubSub })
99
+ // // NOTE we need a second listener here since we depend on the `appHostId` to be set
100
+ // yield* webBridgeBroadcastChannel.listen.pipe(
101
+ // Stream.flatten(),
102
+ // Stream.filter(Schema.is(Devtools.WebBridge.AppHostWillDisconnect)),
103
+ // Stream.filter((msg) => msg.appHostId === appHostId),
104
+ // Stream.tap(() => SubscriptionRef.getAndUpdate(options.bridgeInfos, HashSet.remove(selectedChannelInfo))),
105
+ // Stream.tap(() => PubSub.publish(responsePubSub, Devtools.Disconnect.make({ appHostId, liveStoreVersion }))),
106
+ // Stream.runDrain,
107
+ // Effect.withSpan(`@livestore/adapter-web:devtools:webBridgeChannel:listenForAppHostWillDisconnect`),
108
+ // Effect.ignoreLogged,
109
+ // Effect.forkScoped,
110
+ // )
111
+ // // NOTE this is not guaranteed to "go through" to the app host but at least we try 🤷
112
+ // yield* Stream.fromEventListener(window, 'beforeunload').pipe(
113
+ // Stream.tap(() => sendToAppHost(Devtools.Disconnect.make({ appHostId, liveStoreVersion }))),
114
+ // Stream.runDrain,
115
+ // Effect.ignoreLogged,
116
+ // Effect.forkScoped,
117
+ // )
118
+ // const copyToClipboard = (text: string) =>
119
+ // Effect.sync(() => {
120
+ // navigator.clipboard.writeText(text)
121
+ // })
122
+ // return {
123
+ // responsePubSub,
124
+ // sendToAppHost,
125
+ // appHostId,
126
+ // copyToClipboard,
127
+ // sendEscapeKey: Effect.void,
128
+ // isLeader,
129
+ // } satisfies Devtools.PrepareDevtoolsBridge
130
+ // }).pipe(Effect.orDie)
131
+ //# sourceMappingURL=web-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-bridge.js","sourceRoot":"","sources":["../../src/devtools-bridge/web-bridge.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,KAAK,EAAY,IAAI,EAAU,MAAM,EAAkB,MAAM,yBAAyB,CAAA;AAKtH,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,KAAK,CAAgB,sBAAsB,CAAC,CAAC;IACrF,SAAS,EAAE,MAAM,CAAC,MAAM;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,WAAW,EAAE,MAAM,CAAC,MAAM;IAC1B,QAAQ,EAAE,MAAM,CAAC,OAAO;CACzB,CAAC;IACA,+DAA+D;IAC/D,CAAC,IAAI,CAAC,MAAM,CAAC;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACpC,CAAC;IAED,+DAA+D;IAC/D,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAiB;QAC9B,OAAO,IAAI,CAAC,SAAS,KAAM,IAAsB,CAAC,SAAS,CAAA;IAC7D,CAAC;CACF;AAOD,qCAAqC;AACrC,eAAe;AACf,sDAAsD;AACtD,iCAAiC;AACjC,0BAA0B;AAC1B,0EAA0E;AAC1E,8BAA8B;AAC9B,sDAAsD;AACtD,0DAA0D;AAC1D,uDAAuD;AAEvD,kCAAkC;AAElC,0EAA0E;AAE1E,yFAAyF;AAEzF,oDAAoD;AACpD,0BAA0B;AAC1B,mEAAmE;AACnE,iHAAiH;AACjH,yBAAyB;AACzB,oFAAoF;AACpF,6BAA6B;AAC7B,2BAA2B;AAC3B,QAAQ;AAER,mGAAmG;AAEnG,wDAAwD;AAExD,oDAAoD;AACpD,0BAA0B;AAC1B,wEAAwE;AACxE,4BAA4B;AAC5B,oCAAoC;AACpC,sDAAsD;AAEtD,mDAAmD;AACnD,wCAAwC;AACxC,4CAA4C;AAC5C,sCAAsC;AACtC,oCAAoC;AACpC,eAAe;AAEf,4DAA4D;AAC5D,6FAA6F;AAC7F,0DAA0D;AAC1D,gCAAgC;AAChC,kFAAkF;AAClF,8EAA8E;AAC9E,+GAA+G;AAC/G,+BAA+B;AAC/B,kHAAkH;AAClH,wCAAwC;AACxC,gDAAgD;AAChD,cAAc;AAEd,8FAA8F;AAC9F,cAAc;AACd,WAAW;AACX,yBAAyB;AACzB,oFAAoF;AACpF,kCAAkC;AAClC,0CAA0C;AAC1C,QAAQ;AAER,6FAA6F;AAE7F,uEAAuE;AACvE,wEAAwE;AACxE,SAAS;AAET,iHAAiH;AACjH,oHAAoH;AACpH,eAAe;AACf,iEAAiE;AACjE,kCAAkC;AAClC,iFAAiF;AACjF,iCAAiC;AACjC,QAAQ;AAER,uCAAuC;AACvC,wCAAwC;AAExC,mEAAmE;AACnE,qCAAqC;AACrC,qEAAqE;AACrE,4BAA4B;AAC5B,0DAA0D;AAC1D,cAAc;AACd,UAAU;AAEV,mEAAmE;AAEnE,0FAA0F;AAC1F,kDAAkD;AAClD,2DAA2D;AAE3D,oHAAoH;AAEpH,0FAA0F;AAC1F,oDAAoD;AACpD,0BAA0B;AAC1B,4EAA4E;AAC5E,6DAA6D;AAC7D,kHAAkH;AAClH,qHAAqH;AACrH,yBAAyB;AACzB,4GAA4G;AAC5G,6BAA6B;AAC7B,2BAA2B;AAC3B,QAAQ;AAER,4FAA4F;AAC5F,oEAAoE;AACpE,oGAAoG;AACpG,yBAAyB;AACzB,6BAA6B;AAC7B,2BAA2B;AAC3B,QAAQ;AAER,gDAAgD;AAChD,4BAA4B;AAC5B,8CAA8C;AAC9C,WAAW;AAEX,eAAe;AACf,wBAAwB;AACxB,uBAAuB;AACvB,mBAAmB;AACnB,yBAAyB;AACzB,oCAAoC;AACpC,kBAAkB;AAClB,iDAAiD;AACjD,0BAA0B"}
@@ -0,0 +1,4 @@
1
+ import type { Adapter } from '@livestore/common';
2
+ /** NOTE: This adapter is currently only used for testing */
3
+ export declare const makeInMemoryAdapter: (initialData?: Uint8Array) => Adapter;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/in-memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAA+C,MAAM,mBAAmB,CAAA;AAc7F,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,iBACf,UAAU,KAAG,OAiDmB,CAAA"}
@@ -0,0 +1,50 @@
1
+ import { initializeSingletonTables, migrateDb, UnexpectedError } from '@livestore/common';
2
+ import { configureConnection } from '@livestore/common/leader-thread';
3
+ import { EventId } from '@livestore/common/schema';
4
+ import { sqliteDbFactory } from '@livestore/sqlite-wasm/browser';
5
+ import { loadSqlite3Wasm } from '@livestore/sqlite-wasm/load-wasm';
6
+ import { Effect, Stream, SubscriptionRef } from '@livestore/utils/effect';
7
+ import { nanoid } from '@livestore/utils/nanoid';
8
+ // TODO unify in-memory adapter with other in-memory adapter implementations
9
+ // NOTE we're starting to initialize the sqlite wasm binary here to speed things up
10
+ const sqlite3Promise = loadSqlite3Wasm();
11
+ /** NOTE: This adapter is currently only used for testing */
12
+ export const makeInMemoryAdapter = (initialData) => ({ schema,
13
+ // devtoolsEnabled, bootStatusQueue, shutdown, connectDevtoolsToStore
14
+ }) => Effect.gen(function* () {
15
+ const sqlite3 = yield* Effect.promise(() => sqlite3Promise);
16
+ const sqliteDb = yield* sqliteDbFactory({ sqlite3 })({ _tag: 'in-memory' });
17
+ let migrationsReport = { migrations: [] };
18
+ if (initialData === undefined) {
19
+ yield* configureConnection(sqliteDb, { foreignKeys: true });
20
+ migrationsReport = yield* migrateDb({ db: sqliteDb, schema });
21
+ initializeSingletonTables(schema, sqliteDb);
22
+ }
23
+ else {
24
+ sqliteDb.import(initialData);
25
+ yield* configureConnection(sqliteDb, { foreignKeys: true });
26
+ }
27
+ const lockStatus = SubscriptionRef.make('has-lock').pipe(Effect.runSync);
28
+ const clientSession = {
29
+ sqliteDb,
30
+ devtools: { enabled: false },
31
+ clientId: 'in-memory',
32
+ sessionId: nanoid(6),
33
+ leaderThread: {
34
+ mutations: {
35
+ pull: Stream.never,
36
+ push: () => Effect.void,
37
+ },
38
+ initialState: { leaderHead: EventId.ROOT, migrationsReport },
39
+ export: Effect.dieMessage('Not implemented'),
40
+ getMutationLogData: Effect.succeed(new Uint8Array()),
41
+ getSyncState: Effect.dieMessage('Not implemented'),
42
+ networkStatus: SubscriptionRef.make({ isConnected: false, timestampMs: Date.now(), latchClosed: false }).pipe(Effect.runSync),
43
+ sendDevtoolsMessage: () => Effect.dieMessage('Not implemented'),
44
+ },
45
+ lockStatus,
46
+ shutdown: () => Effect.dieMessage('TODO implement shutdown'),
47
+ };
48
+ return clientSession;
49
+ }).pipe(UnexpectedError.mapToUnexpectedError);
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/in-memory/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { makeAdapter, type WebAdapterOptions } from './web-worker/client-session/index.js';
2
+ export { makeInMemoryAdapter } from './in-memory/index.js';
3
+ export * as WorkerSchema from './web-worker/common/worker-schema.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAC1F,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,YAAY,MAAM,sCAAsC,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { makeAdapter } from './web-worker/client-session/index.js';
2
+ export { makeInMemoryAdapter } from './in-memory/index.js';
3
+ export * as WorkerSchema from './web-worker/common/worker-schema.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA0B,MAAM,sCAAsC,CAAA;AAC1F,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,YAAY,MAAM,sCAAsC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export declare const rootHandlePromise: Promise<FileSystemDirectoryHandle>;
2
+ export declare const getDirHandle: (absDirPath: string | undefined) => Promise<FileSystemDirectoryHandle>;
3
+ export declare const printTree: (directoryHandle_?: FileSystemDirectoryHandle | Promise<FileSystemDirectoryHandle>, depth?: number, prefix?: string) => Promise<void>;
4
+ export declare const deleteAll: (directoryHandle: FileSystemDirectoryHandle) => Promise<void>;
5
+ //# sourceMappingURL=opfs-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opfs-utils.d.ts","sourceRoot":"","sources":["../src/opfs-utils.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB,oCAYQ,CAAA;AAEtC,eAAO,MAAM,YAAY,eAAsB,MAAM,GAAG,SAAS,uCAWhE,CAAA;AAED,eAAO,MAAM,SAAS,sBACF,yBAAyB,GAAG,OAAO,CAAC,yBAAyB,CAAC,UACzE,MAAM,WACL,MAAM,KACb,OAAO,CAAC,IAAI,CAgBd,CAAA;AAED,eAAO,MAAM,SAAS,oBAA2B,yBAAyB,kBAMzE,CAAA"}
@@ -0,0 +1,43 @@
1
+ // NOTE we're already firing off this promise call here since we'll need it anyway and need it cached
2
+ import { prettyBytes } from '@livestore/utils';
3
+ // To improve LiveStore compatibility with e.g. Node.js we're guarding for `navigator` / `navigator.storage` to be defined.
4
+ export const rootHandlePromise = typeof navigator === 'undefined' || navigator.storage === undefined
5
+ ? // We're using a proxy here to make the promise reject lazy
6
+ new Proxy({}, {
7
+ get: () => Promise.reject(new Error(`Can't get OPFS root handle in this environment as navigator.storage is undefined`)),
8
+ })
9
+ : navigator.storage.getDirectory();
10
+ export const getDirHandle = async (absDirPath) => {
11
+ const rootHandle = await rootHandlePromise;
12
+ if (absDirPath === undefined)
13
+ return rootHandle;
14
+ let dirHandle = rootHandle;
15
+ const directoryStack = absDirPath?.split('/').filter(Boolean);
16
+ while (directoryStack.length > 0) {
17
+ dirHandle = await dirHandle.getDirectoryHandle(directoryStack.shift());
18
+ }
19
+ return dirHandle;
20
+ };
21
+ export const printTree = async (directoryHandle_ = rootHandlePromise, depth = Number.POSITIVE_INFINITY, prefix = '') => {
22
+ if (depth < 0)
23
+ return;
24
+ const directoryHandle = await directoryHandle_;
25
+ const entries = directoryHandle.values();
26
+ for await (const entry of entries) {
27
+ const isDirectory = entry.kind === 'directory';
28
+ const size = entry.kind === 'file' ? await entry.getFile().then((file) => prettyBytes(file.size)) : undefined;
29
+ console.log(`${prefix}${isDirectory ? '📁' : '📄'} ${entry.name} ${size ? `(${size})` : ''}`);
30
+ if (isDirectory) {
31
+ const nestedDirectoryHandle = await directoryHandle.getDirectoryHandle(entry.name);
32
+ await printTree(nestedDirectoryHandle, depth - 1, `${prefix} `);
33
+ }
34
+ }
35
+ };
36
+ export const deleteAll = async (directoryHandle) => {
37
+ if (directoryHandle.kind !== 'directory')
38
+ return;
39
+ for await (const entryName of directoryHandle.keys()) {
40
+ await directoryHandle.removeEntry(entryName, { recursive: true });
41
+ }
42
+ };
43
+ //# sourceMappingURL=opfs-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opfs-utils.js","sourceRoot":"","sources":["../src/opfs-utils.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAErG,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,2HAA2H;AAC3H,MAAM,CAAC,MAAM,iBAAiB,GAC5B,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS;IACjE,CAAC,CAAC,2DAA2D;QAC1D,IAAI,KAAK,CACR,EAAE,EACF;YACE,GAAG,EAAE,GAAG,EAAE,CACR,OAAO,CAAC,MAAM,CACZ,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAC9F;SACJ,CACQ;IACb,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,CAAA;AAEtC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,UAA8B,EAAE,EAAE;IACnE,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAA;IAC1C,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,UAAU,CAAA;IAE/C,IAAI,SAAS,GAAG,UAAU,CAAA;IAC1B,MAAM,cAAc,GAAG,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC7D,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,SAAS,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC,cAAc,CAAC,KAAK,EAAG,CAAC,CAAA;IACzE,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,mBAAmF,iBAAiB,EACpG,QAAgB,MAAM,CAAC,iBAAiB,EACxC,SAAiB,EAAE,EACJ,EAAE;IACjB,IAAI,KAAK,GAAG,CAAC;QAAE,OAAM;IAErB,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAAA;IAC9C,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,CAAA;IAExC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAA;QAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC7G,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAE7F,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,qBAAqB,GAAG,MAAM,eAAe,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAClF,MAAM,SAAS,CAAC,qBAAqB,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,eAA0C,EAAE,EAAE;IAC5E,IAAI,eAAe,CAAC,IAAI,KAAK,WAAW;QAAE,OAAM;IAEhD,IAAI,KAAK,EAAE,MAAM,SAAS,IAAI,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;QACrD,MAAM,eAAe,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACnE,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { ClientSession } from '@livestore/common';
2
+ import { Effect } from '@livestore/utils/effect';
3
+ export declare const bootDevtools: ({ clientSession, storeId, }: {
4
+ clientSession: ClientSession;
5
+ storeId: string;
6
+ }) => Effect.Effect<void, never, never>;
7
+ //# sourceMappingURL=client-session-devtools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-session-devtools.d.ts","sourceRoot":"","sources":["../../../src/web-worker/client-session/client-session-devtools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,mBAAmB,CAAA;AAKvE,OAAO,EAAE,MAAM,EAAoD,MAAM,yBAAyB,CAAA;AAKlG,eAAO,MAAM,YAAY,gCAKtB;IACD,aAAa,EAAE,aAAa,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;CAGhB,sCA6C6E,CAAA"}
@@ -0,0 +1,107 @@
1
+ import { Devtools } from '@livestore/common';
2
+ import { isDevEnv } from '@livestore/utils';
3
+ import { Effect, Stream, WebChannel } from '@livestore/utils/effect';
4
+ export const bootDevtools = ({ clientSession, storeId,
5
+ // waitForDevtoolsWebBridgePort,
6
+ // connectToDevtools,
7
+ }) => Effect.gen(function* () {
8
+ // const webBridgeFiberHandle = yield* FiberHandle.make()
9
+ // // NOTE we're not using the existing coordinator `shutdownChannel` as we won't be able to listen to messages emitted by the same coordinator
10
+ // const shutdownChannel = yield* makeShutdownChannel(storeId)
11
+ // const connectWebBridge = FiberHandle.run(
12
+ // webBridgeFiberHandle,
13
+ // listenToWebBridge({ coordinator, waitForDevtoolsWebBridgePort, connectToDevtools, storeId }),
14
+ // )
15
+ // yield* connectWebBridge
16
+ // // TODO Given we're listening to our own messages and given the leader will emit an initial
17
+ // // `DedicatedWorkerDisconnectBroadcast`, this will re-run and we should avoid it
18
+ // yield* shutdownChannel.listen.pipe(
19
+ // Stream.flatten(),
20
+ // Stream.filter(Schema.is(ShutdownChannel.DedicatedWorkerDisconnectBroadcast)),
21
+ // Stream.tap(() => connectWebBridge),
22
+ // Stream.runDrain,
23
+ // Effect.ignoreLogged,
24
+ // Effect.forkScoped,
25
+ // )
26
+ // yield* listenToBrowserExtensionBridge({ coordinator, connectToDevtools })
27
+ if (isDevEnv()) {
28
+ const searchParams = new URLSearchParams();
29
+ searchParams.set('clientId', clientSession.clientId);
30
+ searchParams.set('sessionId', clientSession.sessionId);
31
+ searchParams.set('storeId', storeId);
32
+ const url = `${location.origin}/_livestore?${searchParams.toString()}`;
33
+ // Check whether devtools are available and then log the URL
34
+ const response = yield* Effect.promise(() => fetch(url));
35
+ if (response.ok) {
36
+ const text = yield* Effect.promise(() => response.text());
37
+ if (text.includes('<meta name="livestore-devtools" content="true" />')) {
38
+ // NOTE the trailing `&` is intentional to avoid Chrome opening the URL in the sources pane
39
+ // as the browser already fetched it
40
+ yield* Effect.log(`[@livestore/adapter-web] Devtools ready on ${url}&`);
41
+ }
42
+ }
43
+ }
44
+ }).pipe(Effect.withSpan('@livestore/adapter-web:coordinator:devtools:boot'));
45
+ const listenToWebBridge = ({ clientSession, storeId, waitForDevtoolsWebBridgePort, connectToDevtools, }) => Effect.gen(function* () {
46
+ // const appHostId = clientSession.devtools.appHostId
47
+ const webBridgeBroadcastChannel = yield* Devtools.WebBridge.makeBroadcastChannel();
48
+ // const isLeader = yield* clientSession.lockStatus.get.pipe(Effect.map((_) => _ === 'has-lock'))
49
+ // yield* webBridgeBroadcastChannel.send(Devtools.WebBridge.AppHostReady.make({ appHostId, isLeader }))
50
+ const runtime = yield* Effect.runtime();
51
+ // window.addEventListener('beforeunload', () =>
52
+ // webBridgeBroadcastChannel
53
+ // .send(Devtools.WebBridge.AppHostWillDisconnect.make({ appHostId }))
54
+ // .pipe(Runtime.runFork(runtime)),
55
+ // )
56
+ // yield* Effect.addFinalizer(() =>
57
+ // webBridgeBroadcastChannel
58
+ // .send(Devtools.WebBridge.AppHostWillDisconnect.make({ appHostId }))
59
+ // .pipe(Effect.ignoreLogged),
60
+ // )
61
+ // yield* webBridgeBroadcastChannel.listen.pipe(
62
+ // Stream.flatten(),
63
+ // Stream.filter(Schema.is(Devtools.WebBridge.DevtoolsReady)),
64
+ // Stream.tap(({ devtoolsId }) =>
65
+ // Effect.gen(function* () {
66
+ // const webBridgeId = nanoid()
67
+ // yield* waitForDevtoolsWebBridgePort({ webBridgeId }).pipe(
68
+ // Effect.andThen(connectToDevtools),
69
+ // Effect.tapCauseLogPretty,
70
+ // Effect.forkScoped,
71
+ // )
72
+ // const isLeader = yield* clientSession.lockStatus.get.pipe(Effect.map((_) => _ === 'has-lock'))
73
+ // yield* webBridgeBroadcastChannel.send(
74
+ // Devtools.WebBridge.ConnectToDevtools.make({ appHostId, isLeader, devtoolsId, webBridgeId, storeId }),
75
+ // )
76
+ // }),
77
+ // ),
78
+ // Stream.runDrain,
79
+ // Effect.ignoreLogged,
80
+ // Effect.forkScoped,
81
+ // )
82
+ yield* Effect.never;
83
+ }).pipe(Effect.scoped);
84
+ const listenToBrowserExtensionBridge = ({ appHostId, connectToDevtools, }) => Effect.gen(function* () {
85
+ const windowChannel = yield* WebChannel.windowChannel({
86
+ window,
87
+ schema: {
88
+ listen: Devtools.DevtoolsWindowMessage.MessageForStore,
89
+ send: Devtools.DevtoolsWindowMessage.MessageForContentscript,
90
+ },
91
+ });
92
+ yield* windowChannel.send(Devtools.DevtoolsWindowMessage.LoadIframe.make({}));
93
+ yield* windowChannel.listen.pipe(Stream.flatten(), Stream.tap((message) => Effect.gen(function* () {
94
+ if (message._tag === 'LSD.WindowMessage.ContentscriptListening') {
95
+ // Send message to contentscript via window (which the contentscript iframe is listening to)
96
+ yield* windowChannel.send(Devtools.DevtoolsWindowMessage.StoreReady.make({ appHostId }));
97
+ return;
98
+ }
99
+ if (message.appHostId !== appHostId)
100
+ return;
101
+ if (message._tag === 'LSD.WindowMessage.MessagePortReady') {
102
+ yield* connectToDevtools(message.port);
103
+ }
104
+ }).pipe(Effect.ignoreLogged, Effect.forkScoped)), Stream.runDrain, Effect.ignoreLogged, Effect.forkScoped);
105
+ yield* windowChannel.send(Devtools.DevtoolsWindowMessage.StoreReady.make({ appHostId }));
106
+ });
107
+ //# sourceMappingURL=client-session-devtools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-session-devtools.js","sourceRoot":"","sources":["../../../src/web-worker/client-session/client-session-devtools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Adapter } from '@livestore/common';
2
+ import * as WorkerSchema from '../common/worker-schema.js';
3
+ export type WebAdapterOptions = {
4
+ worker: ((options: {
5
+ name: string;
6
+ }) => globalThis.Worker) | (new (options: {
7
+ name: string;
8
+ }) => globalThis.Worker);
9
+ /**
10
+ * This is mostly an implementation detail and needed to be exposed into app code
11
+ * due to a current Vite limitation (https://github.com/vitejs/vite/issues/8427).
12
+ *
13
+ * In most cases this should look like:
14
+ * ```ts
15
+ * import LiveStoreSharedWorker from '@livestore/adapter-web/shared-worker?sharedworker'
16
+ *
17
+ * const adapter = makeAdapter({
18
+ * sharedWorker: LiveStoreSharedWorker,
19
+ * // ...
20
+ * })
21
+ * ```
22
+ */
23
+ sharedWorker: ((options: {
24
+ name: string;
25
+ }) => globalThis.SharedWorker) | (new (options: {
26
+ name: string;
27
+ }) => globalThis.SharedWorker);
28
+ /**
29
+ * Specifies where to persist data for this adapter
30
+ */
31
+ storage: WorkerSchema.StorageTypeEncoded;
32
+ /**
33
+ * Warning: This will reset both the app and mutationlog database.
34
+ * This should only be used during development.
35
+ *
36
+ * @default false
37
+ */
38
+ resetPersistence?: boolean;
39
+ };
40
+ export declare const makeAdapter: (options: WebAdapterOptions) => Adapter;
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/web-worker/client-session/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAA4C,MAAM,mBAAmB,CAAA;AAkC1F,OAAO,KAAK,YAAY,MAAM,4BAA4B,CAAA;AAe1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,UAAU,CAAC,MAAM,CAAC,CAAA;IACnH;;;;;;;;;;;;;OAaG;IACH,YAAY,EACR,CAAC,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,UAAU,CAAC,YAAY,CAAC,GACxD,CAAC,KAAK,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,UAAU,CAAC,YAAY,CAAC,CAAA;IAChE;;OAEG;IACH,OAAO,EAAE,YAAY,CAAC,kBAAkB,CAAA;IACxC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,WAAW,YACZ,iBAAiB,KAAG,OAqZiB,CAAA"}