@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.
- package/.eslintrc.cjs +6 -0
- package/README.md +12 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/common/connection.d.ts +7 -0
- package/dist/common/connection.d.ts.map +1 -0
- package/dist/common/connection.js +25 -0
- package/dist/common/connection.js.map +1 -0
- package/dist/devtools-bridge/background-browser-channel.d.ts +9 -0
- package/dist/devtools-bridge/background-browser-channel.d.ts.map +1 -0
- package/dist/devtools-bridge/background-browser-channel.js +31 -0
- package/dist/devtools-bridge/background-browser-channel.js.map +1 -0
- package/dist/devtools-bridge/background-message.d.ts +75 -0
- package/dist/devtools-bridge/background-message.d.ts.map +1 -0
- package/dist/devtools-bridge/background-message.js +53 -0
- package/dist/devtools-bridge/background-message.js.map +1 -0
- package/dist/devtools-bridge/bridge-shared.d.ts +14 -0
- package/dist/devtools-bridge/bridge-shared.d.ts.map +1 -0
- package/dist/devtools-bridge/bridge-shared.js +67 -0
- package/dist/devtools-bridge/bridge-shared.js.map +1 -0
- package/dist/devtools-bridge/browser-extension-bridge.d.ts +3 -0
- package/dist/devtools-bridge/browser-extension-bridge.d.ts.map +1 -0
- package/dist/devtools-bridge/browser-extension-bridge.js +59 -0
- package/dist/devtools-bridge/browser-extension-bridge.js.map +1 -0
- package/dist/devtools-bridge/iframe-message.d.ts +16 -0
- package/dist/devtools-bridge/iframe-message.d.ts.map +1 -0
- package/dist/devtools-bridge/iframe-message.js +11 -0
- package/dist/devtools-bridge/iframe-message.js.map +1 -0
- package/dist/devtools-bridge/index.d.ts +6 -0
- package/dist/devtools-bridge/index.d.ts.map +1 -0
- package/dist/devtools-bridge/index.js +5 -0
- package/dist/devtools-bridge/index.js.map +1 -0
- package/dist/devtools-bridge/web-bridge.d.ts +31 -0
- package/dist/devtools-bridge/web-bridge.d.ts.map +1 -0
- package/dist/devtools-bridge/web-bridge.js +131 -0
- package/dist/devtools-bridge/web-bridge.js.map +1 -0
- package/dist/in-memory/index.d.ts +4 -0
- package/dist/in-memory/index.d.ts.map +1 -0
- package/dist/in-memory/index.js +50 -0
- package/dist/in-memory/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/opfs-utils.d.ts +5 -0
- package/dist/opfs-utils.d.ts.map +1 -0
- package/dist/opfs-utils.js +43 -0
- package/dist/opfs-utils.js.map +1 -0
- package/dist/web-worker/client-session/client-session-devtools.d.ts +7 -0
- package/dist/web-worker/client-session/client-session-devtools.d.ts.map +1 -0
- package/dist/web-worker/client-session/client-session-devtools.js +107 -0
- package/dist/web-worker/client-session/client-session-devtools.js.map +1 -0
- package/dist/web-worker/client-session/index.d.ts +41 -0
- package/dist/web-worker/client-session/index.d.ts.map +1 -0
- package/dist/web-worker/client-session/index.js +299 -0
- package/dist/web-worker/client-session/index.js.map +1 -0
- package/dist/web-worker/client-session/trim-batch.d.ts +4 -0
- package/dist/web-worker/client-session/trim-batch.d.ts.map +1 -0
- package/dist/web-worker/client-session/trim-batch.js +13 -0
- package/dist/web-worker/client-session/trim-batch.js.map +1 -0
- package/dist/web-worker/client-session/trim-batch.test.d.ts +2 -0
- package/dist/web-worker/client-session/trim-batch.test.d.ts.map +1 -0
- package/dist/web-worker/client-session/trim-batch.test.js +38 -0
- package/dist/web-worker/client-session/trim-batch.test.js.map +1 -0
- package/dist/web-worker/common/persisted-sqlite.d.ts +23 -0
- package/dist/web-worker/common/persisted-sqlite.d.ts.map +1 -0
- package/dist/web-worker/common/persisted-sqlite.js +92 -0
- package/dist/web-worker/common/persisted-sqlite.js.map +1 -0
- package/dist/web-worker/common/shutdown-channel.d.ts +7 -0
- package/dist/web-worker/common/shutdown-channel.d.ts.map +1 -0
- package/dist/web-worker/common/shutdown-channel.js +7 -0
- package/dist/web-worker/common/shutdown-channel.js.map +1 -0
- package/dist/web-worker/common/worker-schema.d.ts +226 -0
- package/dist/web-worker/common/worker-schema.d.ts.map +1 -0
- package/dist/web-worker/common/worker-schema.js +176 -0
- package/dist/web-worker/common/worker-schema.js.map +1 -0
- package/dist/web-worker/leader-worker/make-leader-worker.d.ts +15 -0
- package/dist/web-worker/leader-worker/make-leader-worker.d.ts.map +1 -0
- package/dist/web-worker/leader-worker/make-leader-worker.js +144 -0
- package/dist/web-worker/leader-worker/make-leader-worker.js.map +1 -0
- package/dist/web-worker/shared-worker/make-shared-worker.d.ts +2 -0
- package/dist/web-worker/shared-worker/make-shared-worker.d.ts.map +1 -0
- package/dist/web-worker/shared-worker/make-shared-worker.js +160 -0
- package/dist/web-worker/shared-worker/make-shared-worker.js.map +1 -0
- package/dist/web-worker/vite-dev-polyfill.d.ts +2 -0
- package/dist/web-worker/vite-dev-polyfill.d.ts.map +1 -0
- package/dist/web-worker/vite-dev-polyfill.js +37 -0
- package/dist/web-worker/vite-dev-polyfill.js.map +1 -0
- package/package.json +78 -0
- package/src/common/connection.ts +32 -0
- package/src/devtools-bridge/background-browser-channel.ts +57 -0
- package/src/devtools-bridge/background-message.ts +42 -0
- package/src/devtools-bridge/bridge-shared.ts +97 -0
- package/src/devtools-bridge/browser-extension-bridge.ts +64 -0
- package/src/devtools-bridge/iframe-message.ts +9 -0
- package/src/devtools-bridge/index.ts +9 -0
- package/src/devtools-bridge/web-bridge.ts +169 -0
- package/src/in-memory/index.ts +66 -0
- package/src/index.ts +3 -0
- package/src/opfs-utils.ts +61 -0
- package/src/web-worker/ambient.d.ts +37 -0
- package/src/web-worker/client-session/client-session-devtools.ts +167 -0
- package/src/web-worker/client-session/index.ts +537 -0
- package/src/web-worker/client-session/trim-batch.test.ts +48 -0
- package/src/web-worker/client-session/trim-batch.ts +15 -0
- package/src/web-worker/common/persisted-sqlite.ts +136 -0
- package/src/web-worker/common/shutdown-channel.ts +8 -0
- package/src/web-worker/common/worker-schema.ts +206 -0
- package/src/web-worker/leader-worker/make-leader-worker.ts +276 -0
- package/src/web-worker/shared-worker/make-shared-worker.ts +300 -0
- package/src/web-worker/vite-dev-polyfill.ts +36 -0
- 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 @@
|
|
|
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|