@livestore/adapter-web 0.3.0-dev.19 → 0.3.0-dev.21

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 (50) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/web-worker/client-session/client-session-devtools.d.ts +1 -1
  3. package/dist/web-worker/client-session/client-session-devtools.d.ts.map +1 -1
  4. package/dist/web-worker/client-session/client-session-devtools.js +7 -97
  5. package/dist/web-worker/client-session/client-session-devtools.js.map +1 -1
  6. package/dist/web-worker/client-session/index.d.ts +10 -0
  7. package/dist/web-worker/client-session/index.d.ts.map +1 -1
  8. package/dist/web-worker/client-session/index.js +51 -17
  9. package/dist/web-worker/client-session/index.js.map +1 -1
  10. package/dist/web-worker/common/persisted-sqlite.d.ts +1 -1
  11. package/dist/web-worker/common/worker-schema.d.ts +9 -3
  12. package/dist/web-worker/common/worker-schema.d.ts.map +1 -1
  13. package/package.json +7 -14
  14. package/src/web-worker/client-session/client-session-devtools.ts +8 -155
  15. package/src/web-worker/client-session/index.ts +79 -16
  16. package/dist/devtools-bridge/background-browser-channel.d.ts +0 -9
  17. package/dist/devtools-bridge/background-browser-channel.d.ts.map +0 -1
  18. package/dist/devtools-bridge/background-browser-channel.js +0 -31
  19. package/dist/devtools-bridge/background-browser-channel.js.map +0 -1
  20. package/dist/devtools-bridge/background-message.d.ts +0 -75
  21. package/dist/devtools-bridge/background-message.d.ts.map +0 -1
  22. package/dist/devtools-bridge/background-message.js +0 -53
  23. package/dist/devtools-bridge/background-message.js.map +0 -1
  24. package/dist/devtools-bridge/bridge-shared.d.ts +0 -14
  25. package/dist/devtools-bridge/bridge-shared.d.ts.map +0 -1
  26. package/dist/devtools-bridge/bridge-shared.js +0 -67
  27. package/dist/devtools-bridge/bridge-shared.js.map +0 -1
  28. package/dist/devtools-bridge/browser-extension-bridge.d.ts +0 -3
  29. package/dist/devtools-bridge/browser-extension-bridge.d.ts.map +0 -1
  30. package/dist/devtools-bridge/browser-extension-bridge.js +0 -59
  31. package/dist/devtools-bridge/browser-extension-bridge.js.map +0 -1
  32. package/dist/devtools-bridge/iframe-message.d.ts +0 -16
  33. package/dist/devtools-bridge/iframe-message.d.ts.map +0 -1
  34. package/dist/devtools-bridge/iframe-message.js +0 -11
  35. package/dist/devtools-bridge/iframe-message.js.map +0 -1
  36. package/dist/devtools-bridge/index.d.ts +0 -6
  37. package/dist/devtools-bridge/index.d.ts.map +0 -1
  38. package/dist/devtools-bridge/index.js +0 -5
  39. package/dist/devtools-bridge/index.js.map +0 -1
  40. package/dist/devtools-bridge/web-bridge.d.ts +0 -31
  41. package/dist/devtools-bridge/web-bridge.d.ts.map +0 -1
  42. package/dist/devtools-bridge/web-bridge.js +0 -131
  43. package/dist/devtools-bridge/web-bridge.js.map +0 -1
  44. package/src/devtools-bridge/background-browser-channel.ts +0 -57
  45. package/src/devtools-bridge/background-message.ts +0 -42
  46. package/src/devtools-bridge/bridge-shared.ts +0 -97
  47. package/src/devtools-bridge/browser-extension-bridge.ts +0 -64
  48. package/src/devtools-bridge/iframe-message.ts +0 -9
  49. package/src/devtools-bridge/index.ts +0 -9
  50. package/src/devtools-bridge/web-bridge.ts +0 -169
@@ -1,59 +0,0 @@
1
- import { Effect } from '@livestore/utils/effect';
2
- // NOTE this code is running inside the devtools iframe, so will be re-running from scratch if the iframe is reloaded
3
- // TODO make sure this also works reliably for HMR
4
- export const prepareBrowserExtensionDevtoolsBridge = Effect.gen(function* () {
5
- // const iframeWindow = window
6
- // const iframeChannel = yield* WebChannel.windowChannel({
7
- // window: iframeWindow,
8
- // schema: {
9
- // listen: Schema.Union(MessagePortInit.PortForDevtools, BackgroundMessage.Disconnect),
10
- // send: Schema.Never,
11
- // },
12
- // })
13
- // const panelChannel = yield* WebChannel.windowChannel({
14
- // window: iframeWindow.parent,
15
- // schema: { listen: Schema.Never, send: MessageToPanel },
16
- // })
17
- // const responsePubSub = yield* PubSub.unbounded<
18
- // Devtools.MessageFromApp | Devtools.MessageFromApp
19
- // >().pipe(Effect.acquireRelease(PubSub.shutdown))
20
- // const portForDevtoolsDeferred = yield* Deferred.make<MessagePort>()
21
- // // Messages coming from the app host (i.e. contentscript) via the background script and the devtools panel window
22
- // yield* iframeChannel.listen.pipe(
23
- // Stream.flatten(),
24
- // Stream.tap((msg) =>
25
- // Effect.gen(function* () {
26
- // if (msg._tag === 'MessagePortInit.PortForDevtools') {
27
- // yield* Deferred.succeed(portForDevtoolsDeferred, msg.port)
28
- // } else {
29
- // // yield* PubSub.publish(
30
- // // responsePubSub,
31
- // // Devtools.Disconnect.make({ clientId: msg.clientId, sessionId: msg.sessionId, liveStoreVersion }),
32
- // // )
33
- // }
34
- // }),
35
- // ),
36
- // Stream.runDrain,
37
- // Effect.withSpan('iframeChannel.listen'),
38
- // Effect.tapCauseLogPretty,
39
- // Effect.forkScoped,
40
- // )
41
- // yield* panelChannel.send(IframeReady.make({})).pipe(Effect.ignoreLogged)
42
- // // NOTE When using the web bridge and browser extension bridge at the same time, both will show `isLeader: true`
43
- // // even though the page origin is the same, given the browser extension app is running in an iframe
44
- // // this will cause the origin to be "sandboxed" and thus the locks be isolated
45
- // const { sendToAppHost, appHostId, isLeader } = yield* makeShared({ portForDevtoolsDeferred, responsePubSub })
46
- // const copyToClipboard = (text: string) =>
47
- // panelChannel.send(BackgroundMessage.CopyToClipboard.make({ text })).pipe(Effect.ignoreLogged)
48
- // const sendEscapeKey = panelChannel.send(EscapeKey.make({})).pipe(Effect.ignoreLogged)
49
- // return {
50
- // responsePubSub,
51
- // sendToAppHost,
52
- // clientId,
53
- // sessionId,
54
- // copyToClipboard,
55
- // sendEscapeKey,
56
- // isLeader,
57
- // } satisfies Devtools.PrepareDevtoolsBridge
58
- });
59
- //# sourceMappingURL=browser-extension-bridge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-extension-bridge.js","sourceRoot":"","sources":["../../src/devtools-bridge/browser-extension-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,MAAM,EAAsC,MAAM,yBAAyB,CAAA;AAM9F,qHAAqH;AACrH,kDAAkD;AAClD,MAAM,CAAC,MAAM,qCAAqC,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACvE,8BAA8B;IAC9B,0DAA0D;IAC1D,0BAA0B;IAC1B,cAAc;IACd,2FAA2F;IAC3F,0BAA0B;IAC1B,OAAO;IACP,KAAK;IACL,yDAAyD;IACzD,iCAAiC;IACjC,4DAA4D;IAC5D,KAAK;IACL,kDAAkD;IAClD,sDAAsD;IACtD,mDAAmD;IACnD,sEAAsE;IACtE,oHAAoH;IACpH,oCAAoC;IACpC,sBAAsB;IACtB,wBAAwB;IACxB,gCAAgC;IAChC,8DAA8D;IAC9D,qEAAqE;IACrE,iBAAiB;IACjB,oCAAoC;IACpC,+BAA+B;IAC/B,iHAAiH;IACjH,eAAe;IACf,UAAU;IACV,UAAU;IACV,OAAO;IACP,qBAAqB;IACrB,6CAA6C;IAC7C,8BAA8B;IAC9B,uBAAuB;IACvB,IAAI;IACJ,2EAA2E;IAC3E,mHAAmH;IACnH,sGAAsG;IACtG,iFAAiF;IACjF,gHAAgH;IAChH,4CAA4C;IAC5C,kGAAkG;IAClG,wFAAwF;IACxF,WAAW;IACX,oBAAoB;IACpB,mBAAmB;IACnB,cAAc;IACd,eAAe;IACf,qBAAqB;IACrB,mBAAmB;IACnB,cAAc;IACd,6CAA6C;AAC/C,CAAC,CAAC,CAAA"}
@@ -1,16 +0,0 @@
1
- import { Schema } from '@livestore/utils/effect';
2
- import { BackgroundMessage } from './background-message.js';
3
- declare const IframeReady_base: Schema.TaggedStruct<"IframeReady", {}>;
4
- export declare class IframeReady extends IframeReady_base {
5
- }
6
- declare const EscapeKey_base: Schema.TaggedStruct<"EscapeKey", {}>;
7
- export declare class EscapeKey extends EscapeKey_base {
8
- }
9
- declare const MessageToIframeWindow_base: typeof Schema.Never;
10
- export declare class MessageToIframeWindow extends MessageToIframeWindow_base {
11
- }
12
- declare const MessageToPanel_base: Schema.Union<[typeof IframeReady, typeof EscapeKey, typeof BackgroundMessage.CopyToClipboard]>;
13
- export declare class MessageToPanel extends MessageToPanel_base {
14
- }
15
- export {};
16
- //# sourceMappingURL=iframe-message.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"iframe-message.d.ts","sourceRoot":"","sources":["../../src/devtools-bridge/iframe-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;;AAE3D,qBAAa,WAAY,SAAQ,gBAAsC;CAAG;;AAC1E,qBAAa,SAAU,SAAQ,cAAoC;CAAG;;AAEtE,qBAAa,qBAAsB,SAAQ,0BAAc;CAAG;;AAC5D,qBAAa,cAAe,SAAQ,mBAAuE;CAAG"}
@@ -1,11 +0,0 @@
1
- import { Schema } from '@livestore/utils/effect';
2
- import { BackgroundMessage } from './background-message.js';
3
- export class IframeReady extends Schema.TaggedStruct('IframeReady', {}) {
4
- }
5
- export class EscapeKey extends Schema.TaggedStruct('EscapeKey', {}) {
6
- }
7
- export class MessageToIframeWindow extends Schema.Union() {
8
- }
9
- export class MessageToPanel extends Schema.Union(IframeReady, EscapeKey, BackgroundMessage.CopyToClipboard) {
10
- }
11
- //# sourceMappingURL=iframe-message.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"iframe-message.js","sourceRoot":"","sources":["../../src/devtools-bridge/iframe-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,CAAC;CAAG;AAC1E,MAAM,OAAO,SAAU,SAAQ,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;CAAG;AAEtE,MAAM,OAAO,qBAAsB,SAAQ,MAAM,CAAC,KAAK,EAAE;CAAG;AAC5D,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,iBAAiB,CAAC,eAAe,CAAC;CAAG"}
@@ -1,6 +0,0 @@
1
- export { prepareBrowserExtensionDevtoolsBridge } from './browser-extension-bridge.js';
2
- export { type WebBridgeOptions, type WebBridgeInfo as WebBridgeChannelInfo, } from './web-bridge.js';
3
- export { BackgroundMessage, MessagePortInit } from './background-message.js';
4
- export { backgroundChannel } from './background-browser-channel.js';
5
- export * as IframeMessage from './iframe-message.js';
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devtools-bridge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qCAAqC,EAAE,MAAM,+BAA+B,CAAA;AACrF,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,aAAa,IAAI,oBAAoB,GAC3C,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAA"}
@@ -1,5 +0,0 @@
1
- export { prepareBrowserExtensionDevtoolsBridge } from './browser-extension-bridge.js';
2
- export { BackgroundMessage, MessagePortInit } from './background-message.js';
3
- export { backgroundChannel } from './background-browser-channel.js';
4
- export * as IframeMessage from './iframe-message.js';
5
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devtools-bridge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qCAAqC,EAAE,MAAM,+BAA+B,CAAA;AAMrF,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAA"}
@@ -1,31 +0,0 @@
1
- import type { Deferred, HashSet, SubscriptionRef } from '@livestore/utils/effect';
2
- import { Equal, Hash, Schema } from '@livestore/utils/effect';
3
- declare const WebBridgeInfo_base: Schema.Class<WebBridgeInfo, {
4
- appHostId: typeof Schema.String;
5
- storeId: typeof Schema.String;
6
- webBridgeId: typeof Schema.String;
7
- isLeader: typeof Schema.Boolean;
8
- }, Schema.Struct.Encoded<{
9
- appHostId: typeof Schema.String;
10
- storeId: typeof Schema.String;
11
- webBridgeId: typeof Schema.String;
12
- isLeader: typeof Schema.Boolean;
13
- }>, never, {
14
- readonly storeId: string;
15
- } & {
16
- readonly appHostId: string;
17
- } & {
18
- readonly isLeader: boolean;
19
- } & {
20
- readonly webBridgeId: string;
21
- }, {}, {}>;
22
- export declare class WebBridgeInfo extends WebBridgeInfo_base {
23
- [Hash.symbol](): number;
24
- [Equal.symbol](that: Equal.Equal): boolean;
25
- }
26
- export type WebBridgeOptions = {
27
- selectedChannelInfoDeferred: Deferred.Deferred<WebBridgeInfo>;
28
- bridgeInfos: SubscriptionRef.SubscriptionRef<HashSet.HashSet<WebBridgeInfo>>;
29
- };
30
- export {};
31
- //# sourceMappingURL=web-bridge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"web-bridge.d.ts","sourceRoot":"","sources":["../../src/devtools-bridge/web-bridge.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAS,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACxF,OAAO,EAAyB,KAAK,EAAY,IAAI,EAAU,MAAM,EAAkB,MAAM,yBAAyB,CAAA;;;;;;;;;;;;;;;;;;;;AAKtH,qBAAa,aAAc,SAAQ,kBAKjC;IAEA,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM;IAKvB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,OAAO;CAG3C;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,2BAA2B,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;IAC7D,WAAW,EAAE,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;CAC7E,CAAA"}
@@ -1,131 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,57 +0,0 @@
1
- import type { Either, ParseResult } from '@livestore/utils/effect'
2
- import { Chunk, Deferred, Effect, Exit, Runtime, Schema, Scope, Stream, WebChannel } from '@livestore/utils/effect'
3
-
4
- export const backgroundChannel = <MsgIn, MsgOut, MsgInEncoded, MsgOutEncoded>({
5
- schema: inputSchema,
6
- port,
7
- }: {
8
- schema:
9
- | Schema.Schema<MsgIn | MsgOut, MsgInEncoded | MsgOutEncoded>
10
- | { listen: Schema.Schema<MsgIn, MsgInEncoded>; send: Schema.Schema<MsgOut, MsgOutEncoded> }
11
- port: chrome.runtime.Port
12
- }): Effect.Effect<WebChannel.WebChannel<MsgIn, MsgOut>, never, Scope.Scope> =>
13
- Effect.scopeWithCloseable((scope) =>
14
- Effect.gen(function* () {
15
- const schema = WebChannel.mapSchema(inputSchema)
16
-
17
- const send = (msg: MsgOut) =>
18
- Effect.gen(function* () {
19
- const encoded = yield* Schema.encode(schema.send)(msg)
20
- port.postMessage(encoded)
21
- })
22
-
23
- const runtime = yield* Effect.runtime()
24
-
25
- const listen = Stream.async<Either.Either<MsgIn, ParseResult.ParseError>>((emit) => {
26
- const onMessage = (message: any) =>
27
- Effect.gen(function* () {
28
- const result = yield* Schema.decode(schema.listen)(message).pipe(Effect.either)
29
-
30
- emit(Effect.succeed(Chunk.make(result)))
31
- }).pipe(
32
- Effect.withSpan(`WebChannel:backgroundChannel:listen`),
33
- Effect.tapCauseLogPretty,
34
- Runtime.runFork(runtime),
35
- )
36
-
37
- port.onMessage.addListener(onMessage)
38
-
39
- return Effect.sync(() => {
40
- port.onMessage.removeListener(onMessage)
41
- })
42
- })
43
-
44
- const closedDeferred = yield* Deferred.make<void>().pipe(Effect.acquireRelease(Deferred.done(Exit.void)))
45
- const supportsTransferables = false
46
-
47
- return {
48
- [WebChannel.WebChannelSymbol]: WebChannel.WebChannelSymbol,
49
- listen,
50
- send,
51
- closedDeferred,
52
- schema,
53
- supportsTransferables,
54
- shutdown: Scope.close(scope, Exit.void),
55
- }
56
- }).pipe(Effect.withSpan(`WebChannel:backgroundChannel`)),
57
- )
@@ -1,42 +0,0 @@
1
- import { Devtools } from '@livestore/common'
2
- import { Schema, Transferable } from '@livestore/utils/effect'
3
-
4
- export namespace BackgroundMessage {
5
- export class CopyToClipboard extends Schema.TaggedStruct('Background.CopyToClipboard', {
6
- text: Schema.String,
7
- }) {}
8
-
9
- export class MessageFromAppHost extends Schema.TaggedStruct('Background.MessageFromAppHost', {
10
- msg: Devtools.Leader.MessageFromApp,
11
- }) {}
12
-
13
- export class MessageToAppHost extends Schema.TaggedStruct('Background.MessageToAppHost', {
14
- msg: Devtools.Leader.MessageToApp,
15
- }) {}
16
-
17
- export class RequestPortForDevtools extends Schema.TaggedStruct('Background.RequestPortForDevtools', {
18
- tabId: Schema.Number,
19
- }) {}
20
-
21
- export class RequestOneTimePortFromDevtools extends Schema.TaggedStruct('Background.RequestOneTimePortFromDevtools', {
22
- tabId: Schema.Number,
23
- }) {}
24
-
25
- export class Disconnect extends Schema.TaggedStruct('Background.Disconnect', { appHostId: Schema.String }) {}
26
- }
27
-
28
- export namespace MessagePortInit {
29
- /**
30
- * Message is first sent from contentscript-iframe to background and then posted to the devtools.
31
- */
32
- export class PortForDevtools extends Schema.TaggedStruct('MessagePortInit.PortForDevtools', {
33
- port: Transferable.MessagePort,
34
- tabId: Schema.Number,
35
- appHostId: Schema.String,
36
- }) {}
37
-
38
- export class OneTimePortFromDevtools extends Schema.TaggedStruct('MessagePortInit.OneTimePortFromDevtools', {
39
- port: Transferable.MessagePort,
40
- tabId: Schema.Number,
41
- }) {}
42
- }
@@ -1,97 +0,0 @@
1
- // @ts-nocheck
2
- import { Devtools, liveStoreVersion } from '@livestore/common'
3
- import { Deferred, Effect, PubSub, Schema, Stream, WebChannel } from '@livestore/utils/effect'
4
-
5
- /**
6
- * This code is running in the devtools window where it's assumed that message ports
7
- * can be transferred over the bridge.
8
- */
9
- export const makeShared = ({
10
- portForDevtoolsDeferred,
11
- responsePubSub,
12
- }: {
13
- portForDevtoolsDeferred: Deferred.Deferred<MessagePort>
14
- responsePubSub: PubSub.PubSub<Devtools.MessageFromApp | Devtools.MessageFromApp>
15
- }) =>
16
- Effect.gen(function* () {
17
- const appHostInfoDeferred = yield* Deferred.make<{ appHostId: string; isLeader: boolean }>()
18
-
19
- const appHostStoreChannelDeferred =
20
- yield* Deferred.make<
21
- WebChannel.WebChannel<typeof Devtools.MessageFromApp.Type, typeof Devtools.MessageToApp.Type>
22
- >()
23
-
24
- const portForDevtools = yield* Deferred.await(portForDevtoolsDeferred)
25
-
26
- const appHostCoordinatorChannel = yield* WebChannel.messagePortChannel({
27
- port: portForDevtools,
28
- schema: { listen: Devtools.MessageFromApp, send: Devtools.MessageToApp },
29
- })
30
-
31
- yield* appHostCoordinatorChannel.listen.pipe(
32
- Stream.flatten(),
33
- // Stream.tapLogWithLabel('appHostCoordinatorChannel.listen'),
34
- Stream.tap((msg) =>
35
- Effect.gen(function* () {
36
- // if (msg._tag === 'LSD.AppHostReady') {
37
- // const { appHostId, isLeader } = msg
38
- // yield* Deferred.succeed(appHostInfoDeferred, { appHostId, isLeader })
39
- // } else if (msg._tag === 'LSD.MessagePortForStoreReq') {
40
- // Here we're "duplicating" the message port since we need one for the coordinator
41
- // and one for the store
42
- const storeMessageChannel = new MessageChannel()
43
-
44
- // yield* sendToAppHost(
45
- // Devtools.MessagePortForStoreRes.make({
46
- // // appHostId: msg.appHostId,
47
- // liveStoreVersion: msg.liveStoreVersion,
48
- // port: storeMessageChannel.port1,
49
- // requestId: msg.requestId,
50
- // }),
51
- // )
52
-
53
- // const portForAppHostStoreChannel = yield* WebChannel.messagePortChannel({
54
- // port: storeMessageChannel.port2,
55
- // schema: { listen: Devtools.MessageFromApp, send: Devtools.MessageToApp },
56
- // })
57
-
58
- // yield* portForAppHostStoreChannel.listen.pipe(
59
- // Stream.flatten(),
60
- // Stream.tap((msg) => PubSub.publish(responsePubSub, msg)),
61
- // Stream.runDrain,
62
- // Effect.withSpan('portForStoreChannel.listen'),
63
- // Effect.tapCauseLogPretty,
64
- // Effect.forkScoped,
65
- // )
66
-
67
- // yield* Deferred.succeed(appHostStoreChannelDeferred, portForAppHostStoreChannel)
68
- // } else {
69
- yield* PubSub.publish(responsePubSub, msg)
70
- // }
71
- }),
72
- ),
73
- Stream.runDrain,
74
- Effect.withSpan('portForDevtoolsChannel.listen'),
75
- Effect.tapCauseLogPretty,
76
- Effect.forkScoped,
77
- )
78
-
79
- // Sends the message to the app host (i.e. contentscript) via the devtools panel window and the background script
80
- // const sendToAppHost: Devtools.PrepareDevtoolsBridge['sendToAppHost'] = (msg) =>
81
- // Effect.gen(function* () {
82
- // // console.log('bridge-shared: sendToAppHost', msg)
83
- // if (Schema.is(Devtools.MessageToApp)(msg)) {
84
- // yield* appHostCoordinatorChannel.send(msg)
85
- // } else {
86
- // // console.log('bridge-shared: sendToAppHostStore', msg)
87
- // const appHostStoreChannel = yield* Deferred.await(appHostStoreChannelDeferred)
88
- // yield* appHostStoreChannel.send(msg)
89
- // }
90
- // }).pipe(Effect.withSpan('sendToAppHost'), Effect.orDie)
91
-
92
- // yield* sendToAppHost(Devtools.DevtoolsReady.make({ liveStoreVersion }))
93
-
94
- const { appHostId, isLeader } = yield* Deferred.await(appHostInfoDeferred)
95
-
96
- return { appHostId, isLeader }
97
- })
@@ -1,64 +0,0 @@
1
- import { Devtools, liveStoreVersion } from '@livestore/common'
2
- import { Deferred, Effect, PubSub, Schema, Stream, WebChannel } from '@livestore/utils/effect'
3
-
4
- import { BackgroundMessage, MessagePortInit } from './background-message.js'
5
- import { makeShared } from './bridge-shared.js'
6
- import { EscapeKey, IframeReady, MessageToPanel } from './iframe-message.js'
7
-
8
- // NOTE this code is running inside the devtools iframe, so will be re-running from scratch if the iframe is reloaded
9
- // TODO make sure this also works reliably for HMR
10
- export const prepareBrowserExtensionDevtoolsBridge = Effect.gen(function* () {
11
- // const iframeWindow = window
12
- // const iframeChannel = yield* WebChannel.windowChannel({
13
- // window: iframeWindow,
14
- // schema: {
15
- // listen: Schema.Union(MessagePortInit.PortForDevtools, BackgroundMessage.Disconnect),
16
- // send: Schema.Never,
17
- // },
18
- // })
19
- // const panelChannel = yield* WebChannel.windowChannel({
20
- // window: iframeWindow.parent,
21
- // schema: { listen: Schema.Never, send: MessageToPanel },
22
- // })
23
- // const responsePubSub = yield* PubSub.unbounded<
24
- // Devtools.MessageFromApp | Devtools.MessageFromApp
25
- // >().pipe(Effect.acquireRelease(PubSub.shutdown))
26
- // const portForDevtoolsDeferred = yield* Deferred.make<MessagePort>()
27
- // // Messages coming from the app host (i.e. contentscript) via the background script and the devtools panel window
28
- // yield* iframeChannel.listen.pipe(
29
- // Stream.flatten(),
30
- // Stream.tap((msg) =>
31
- // Effect.gen(function* () {
32
- // if (msg._tag === 'MessagePortInit.PortForDevtools') {
33
- // yield* Deferred.succeed(portForDevtoolsDeferred, msg.port)
34
- // } else {
35
- // // yield* PubSub.publish(
36
- // // responsePubSub,
37
- // // Devtools.Disconnect.make({ clientId: msg.clientId, sessionId: msg.sessionId, liveStoreVersion }),
38
- // // )
39
- // }
40
- // }),
41
- // ),
42
- // Stream.runDrain,
43
- // Effect.withSpan('iframeChannel.listen'),
44
- // Effect.tapCauseLogPretty,
45
- // Effect.forkScoped,
46
- // )
47
- // yield* panelChannel.send(IframeReady.make({})).pipe(Effect.ignoreLogged)
48
- // // NOTE When using the web bridge and browser extension bridge at the same time, both will show `isLeader: true`
49
- // // even though the page origin is the same, given the browser extension app is running in an iframe
50
- // // this will cause the origin to be "sandboxed" and thus the locks be isolated
51
- // const { sendToAppHost, appHostId, isLeader } = yield* makeShared({ portForDevtoolsDeferred, responsePubSub })
52
- // const copyToClipboard = (text: string) =>
53
- // panelChannel.send(BackgroundMessage.CopyToClipboard.make({ text })).pipe(Effect.ignoreLogged)
54
- // const sendEscapeKey = panelChannel.send(EscapeKey.make({})).pipe(Effect.ignoreLogged)
55
- // return {
56
- // responsePubSub,
57
- // sendToAppHost,
58
- // clientId,
59
- // sessionId,
60
- // copyToClipboard,
61
- // sendEscapeKey,
62
- // isLeader,
63
- // } satisfies Devtools.PrepareDevtoolsBridge
64
- })
@@ -1,9 +0,0 @@
1
- import { Schema } from '@livestore/utils/effect'
2
-
3
- import { BackgroundMessage } from './background-message.js'
4
-
5
- export class IframeReady extends Schema.TaggedStruct('IframeReady', {}) {}
6
- export class EscapeKey extends Schema.TaggedStruct('EscapeKey', {}) {}
7
-
8
- export class MessageToIframeWindow extends Schema.Union() {}
9
- export class MessageToPanel extends Schema.Union(IframeReady, EscapeKey, BackgroundMessage.CopyToClipboard) {}
@@ -1,9 +0,0 @@
1
- export { prepareBrowserExtensionDevtoolsBridge } from './browser-extension-bridge.js'
2
- export {
3
- // prepareWebDevtoolsBridge,
4
- type WebBridgeOptions,
5
- type WebBridgeInfo as WebBridgeChannelInfo,
6
- } from './web-bridge.js'
7
- export { BackgroundMessage, MessagePortInit } from './background-message.js'
8
- export { backgroundChannel } from './background-browser-channel.js'
9
- export * as IframeMessage from './iframe-message.js'