@livestore/devtools-web-common 0.3.0-dev.5 → 0.3.0-dev.51

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.
@@ -1,25 +1,50 @@
1
- import { UnexpectedError } from '@livestore/common';
1
+ import { Devtools, UnexpectedError } from '@livestore/common';
2
2
  import type { Scope, Worker } from '@livestore/utils/effect';
3
- import { Effect, WebChannel } from '@livestore/utils/effect';
3
+ import { Effect, Schema, WebChannel } from '@livestore/utils/effect';
4
4
  import type { MeshNode } from '@livestore/webmesh';
5
5
  import * as WorkerSchema from '../worker/schema.js';
6
- export declare const makeWebDevtoolsConnectedMeshNode: ({ nodeName, target, worker, }: {
7
- nodeName: string;
8
- target: string;
9
- worker: Worker.SerializedWorkerPool<typeof WorkerSchema.Request.Type>;
10
- }) => Effect.Effect<MeshNode, UnexpectedError, Scope.Scope>;
11
- export declare const makeChannelForConnectedMeshNode: <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>({ target, node, schema, }: {
12
- node: MeshNode;
13
- target: string;
14
- schema: WebChannel.InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>;
15
- }) => Effect.Effect<WebChannel.WebChannel<MsgListen, MsgSend, never>, never, Scope.Scope>;
16
- export declare const makeWebDevtoolsChannel: <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>({ nodeName, target, schema, worker, workerTargetName, }: {
17
- nodeName: string;
18
- target: string;
19
- schema: WebChannel.InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>;
20
- worker: Worker.SerializedWorkerPool<typeof WorkerSchema.Request.Type>;
21
- workerTargetName: string;
22
- }) => Effect.Effect<WebChannel.WebChannel<MsgListen, MsgSend>, UnexpectedError, Scope.Scope>;
6
+ export * as WorkerSchema from '../worker/schema.js';
7
+ declare global {
8
+ var __debugWebmeshNode: any;
9
+ }
10
+ export declare const makeSessionInfoBroadcastChannel: Effect.Effect<WebChannel.WebChannel<Devtools.SessionInfo.Message, Devtools.SessionInfo.Message>, UnexpectedError, Scope.Scope>;
11
+ export declare const makeNodeName: {
12
+ sharedWorker: ({ storeId }: {
13
+ storeId: string;
14
+ }) => string;
15
+ browserExtension: {
16
+ contentscriptMain: (tabId: number) => string;
17
+ contentscriptIframe: (tabId: number) => string;
18
+ };
19
+ };
20
+ export declare const ClientSessionContentscriptMainReq: Schema.TaggedStruct<"ClientSessionContentscriptMainReq", {
21
+ storeId: typeof Schema.String;
22
+ clientId: typeof Schema.String;
23
+ sessionId: typeof Schema.String;
24
+ }>;
25
+ export declare const ClientSessionContentscriptMainRes: Schema.TaggedStruct<"ClientSessionContentscriptMainRes", {
26
+ tabId: typeof Schema.Number;
27
+ }>;
28
+ export declare const makeStaticClientSessionChannel: {
29
+ contentscriptMain: Effect.Effect<WebChannel.WebChannel<{
30
+ readonly _tag: "ClientSessionContentscriptMainReq";
31
+ readonly storeId: string;
32
+ readonly clientId: string;
33
+ readonly sessionId: string;
34
+ }, {
35
+ readonly _tag: "ClientSessionContentscriptMainRes";
36
+ readonly tabId: number;
37
+ }, never>, never, Scope.Scope>;
38
+ clientSession: Effect.Effect<WebChannel.WebChannel<{
39
+ readonly _tag: "ClientSessionContentscriptMainRes";
40
+ readonly tabId: number;
41
+ }, {
42
+ readonly _tag: "ClientSessionContentscriptMainReq";
43
+ readonly storeId: string;
44
+ readonly clientId: string;
45
+ readonly sessionId: string;
46
+ }, never>, never, Scope.Scope>;
47
+ };
23
48
  export declare const connectViaWorker: ({ node, target, worker, }: {
24
49
  node: MeshNode;
25
50
  target: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web-channel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAY,MAAM,EAAU,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAGlD,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAA;AAEnD,eAAO,MAAM,gCAAgC,kCAI1C;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAC,oBAAoB,CAAC,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE,0DAOG,CAAA;AAEJ,eAAO,MAAM,+BAA+B,GAAI,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,cAAc,6BAIjG;IACD,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAA;CACrF,wFAMG,CAAA;AAEJ,eAAO,MAAM,sBAAsB,GAAI,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,cAAc,2DAMxF;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAA;IACpF,MAAM,EAAE,MAAM,CAAC,oBAAoB,CAAC,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACrE,gBAAgB,EAAE,MAAM,CAAA;CACzB,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,KAAK,CAOjB,CAAA;AAExE,eAAO,MAAM,gBAAgB,8BAI1B;IACD,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAC,oBAAoB,CAAC,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE,sDA6B8C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web-channel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAE7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAY,MAAM,EAAE,MAAM,EAAU,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACtF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAGlD,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAA;AAEnD,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAA;AAEnD,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,kBAAkB,EAAE,GAAG,CAAA;CAC5B;AAED,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,MAAM,CACzD,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,EACjF,eAAe,EACf,KAAK,CAAC,KAAK,CAIX,CAAA;AAEF,eAAO,MAAM,YAAY;gCACK;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;;mCAIlB,MAAM;qCACJ,MAAM;;CAEtC,CAAA;AAED,eAAO,MAAM,iCAAiC;;;;EAI5C,CAAA;AAEF,eAAO,MAAM,iCAAiC;;EAE5C,CAAA;AAGF,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;CAqB1C,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,2BAI9B;IACD,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAC,oBAAoB,CAAC,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE,sDA+B8C,CAAA"}
@@ -1,35 +1,62 @@
1
- import { UnexpectedError } from '@livestore/common';
1
+ import { Devtools, UnexpectedError } from '@livestore/common';
2
2
  import { LS_DEV } from '@livestore/utils';
3
- import { Deferred, Effect, Stream, WebChannel } from '@livestore/utils/effect';
4
- import { makeMeshNode, WebmeshSchema } from '@livestore/webmesh';
3
+ import { Deferred, Effect, Schema, Stream, WebChannel } from '@livestore/utils/effect';
4
+ import { WebmeshSchema } from '@livestore/webmesh';
5
5
  import * as WorkerSchema from '../worker/schema.js';
6
- export const makeWebDevtoolsConnectedMeshNode = ({ nodeName, target, worker, }) => Effect.gen(function* () {
7
- const node = yield* makeMeshNode(nodeName);
8
- yield* connectViaWorker({ node, target, worker });
9
- return node;
6
+ export * as WorkerSchema from '../worker/schema.js';
7
+ export const makeSessionInfoBroadcastChannel = WebChannel.broadcastChannel({
8
+ channelName: 'session-info',
9
+ schema: Devtools.SessionInfo.Message,
10
10
  });
11
- export const makeChannelForConnectedMeshNode = ({ target, node, schema, }) => node.makeChannel({
12
- target,
13
- channelName: 'devtools:' + [node.nodeName, target].sort().join('_'),
14
- schema,
15
- mode: 'messagechannel',
11
+ export const makeNodeName = {
12
+ sharedWorker: ({ storeId }) => `shared-worker-${storeId}`,
13
+ // TODO refactor shared-worker setup so there's only a single shared-worker per origin
14
+ // sharedWorker: () => `shared-worker`,
15
+ browserExtension: {
16
+ contentscriptMain: (tabId) => `contentscript-main-${tabId}`,
17
+ contentscriptIframe: (tabId) => `contentscript-iframe-${tabId}`,
18
+ },
19
+ };
20
+ export const ClientSessionContentscriptMainReq = Schema.TaggedStruct('ClientSessionContentscriptMainReq', {
21
+ storeId: Schema.String,
22
+ clientId: Schema.String,
23
+ sessionId: Schema.String,
16
24
  });
17
- export const makeWebDevtoolsChannel = ({ nodeName, target, schema, worker, workerTargetName, }) => Effect.gen(function* () {
18
- const node = yield* makeWebDevtoolsConnectedMeshNode({ nodeName, target: workerTargetName, worker });
19
- const channel = yield* makeChannelForConnectedMeshNode({ node, target, schema });
20
- return channel;
21
- }).pipe(Effect.withSpan(`devtools-web-common:makeWebDevtoolsChannel`));
25
+ export const ClientSessionContentscriptMainRes = Schema.TaggedStruct('ClientSessionContentscriptMainRes', {
26
+ tabId: Schema.Number,
27
+ });
28
+ // Effect.suspend is needed since `window` is not available in the shared worker
29
+ export const makeStaticClientSessionChannel = {
30
+ contentscriptMain: Effect.suspend(() => WebChannel.windowChannel({
31
+ // eslint-disable-next-line unicorn/prefer-global-this
32
+ listenWindow: window,
33
+ // eslint-disable-next-line unicorn/prefer-global-this
34
+ sendWindow: window,
35
+ schema: { listen: ClientSessionContentscriptMainReq, send: ClientSessionContentscriptMainRes },
36
+ ids: { own: 'contentscript-main-static', other: 'client-session-static' },
37
+ })),
38
+ clientSession: Effect.suspend(() => WebChannel.windowChannel({
39
+ // eslint-disable-next-line unicorn/prefer-global-this
40
+ listenWindow: window,
41
+ // eslint-disable-next-line unicorn/prefer-global-this
42
+ sendWindow: window,
43
+ schema: { listen: ClientSessionContentscriptMainRes, send: ClientSessionContentscriptMainReq },
44
+ ids: { own: 'client-session-static', other: 'contentscript-main-static' },
45
+ })),
46
+ };
22
47
  export const connectViaWorker = ({ node, target, worker, }) => Effect.gen(function* () {
23
48
  const mc = new MessageChannel();
24
49
  const isConnected = yield* Deferred.make();
25
- yield* Effect.addFinalizerLog(`@livestore/devtools-web-common: closing message channel ${node.nodeName} → ${target}`);
50
+ if (LS_DEV) {
51
+ yield* Effect.addFinalizerLog(`@livestore/devtools-web-common: closing message channel ${node.nodeName} → ${target}`);
52
+ }
26
53
  yield* worker.execute(WorkerSchema.CreateConnection.make({ from: node.nodeName, port: mc.port1 })).pipe(Stream.tap(() => Deferred.succeed(isConnected, true)), Stream.runDrain, Effect.tapCauseLogPretty, Effect.forkScoped);
27
54
  yield* isConnected;
28
55
  const sharedWorkerConnection = yield* WebChannel.messagePortChannel({
29
56
  port: mc.port2,
30
57
  schema: WebmeshSchema.Packet,
31
58
  });
32
- yield* node.addConnection({ target, connectionChannel: sharedWorkerConnection, replaceIfExists: true });
59
+ yield* node.addEdge({ target, edgeChannel: sharedWorkerConnection, replaceIfExists: true });
33
60
  if (LS_DEV) {
34
61
  yield* Effect.logDebug(`@livestore/devtools-web-common: initiated connection: ${node.nodeName} → ${target}`);
35
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/web-channel/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/web-channel/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/worker/mod.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAU,KAAK,EAAE,MAAM,EAAc,MAAM,yBAAyB,CAAA;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAGlD,OAAO,KAAK,KAAK,kBAAkB,MAAM,aAAa,CAAA;AAEtD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;;UAI3B,QAAQ;;AAFlB,qBAAa,YAAa,SAAQ,iBAG/B;IACD,MAAM,CAAC,KAAK,iBAAkB;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,6CAQb;CACtC;AAED,eAAO,MAAM,gBAAgB,mBAAoB,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,2CAsBJ,CAAA"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/worker/mod.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAU,KAAK,EAAE,MAAM,EAAc,MAAM,yBAAyB,CAAA;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAGlD,OAAO,KAAK,KAAK,kBAAkB,MAAM,aAAa,CAAA;AAEtD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;;UAI3B,QAAQ;;AAFlB,qBAAa,YAAa,SAAQ,iBAG/B;IACD,MAAM,CAAC,KAAK,GAAI,cAAc;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,6CAOb;CACtC;AAED,eAAO,MAAM,gBAAgB,GAAI,gBAAgB,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,2CAsBJ,CAAA"}
@@ -5,20 +5,19 @@ export * as Schema from './schema.js';
5
5
  export class CacheService extends Context.Tag('@livestore/devtools-web-common:CacheService')() {
6
6
  static layer = ({ nodeName }) => Effect.gen(function* () {
7
7
  const node = yield* makeMeshNode(nodeName);
8
- // @ts-expect-error typing
9
- globalThis.__debugWebMeshNode = node;
8
+ globalThis.__debugWebmeshNode = node;
10
9
  return { node };
11
10
  }).pipe(Layer.scoped(CacheService));
12
11
  }
13
12
  export const CreateConnection = ({ from, port }) => Stream.asyncScoped((emit) => Effect.gen(function* () {
14
13
  const { node } = yield* CacheService;
15
14
  const messagePortChannel = yield* WebChannel.messagePortChannel({ port, schema: WebmeshSchema.Packet });
16
- yield* node.addConnection({ target: from, connectionChannel: messagePortChannel, replaceIfExists: true });
15
+ yield* node.addEdge({ target: from, edgeChannel: messagePortChannel, replaceIfExists: true });
17
16
  if (LS_DEV) {
18
- yield* Effect.logDebug(`@livestore/devtools-web-common: accepted connection: ${node.nodeName} ← ${from}`);
17
+ yield* Effect.logDebug(`@livestore/devtools-web-common: accepted edge: ${node.nodeName} ← ${from}`);
19
18
  }
20
19
  emit.single({});
21
- yield* Effect.spanEvent({ connectedTo: [...node.connectionKeys] });
20
+ yield* Effect.spanEvent({ connectedTo: [...node.edgeKeys] });
22
21
  // Keep connection alive
23
22
  // yield* Effect.never
24
23
  // return {}
@@ -1 +1 @@
1
- {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/worker/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIhE,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC,MAAM,OAAO,YAAa,SAAQ,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,EAGzF;IACD,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,QAAQ,EAAwB,EAAE,EAAE,CACpD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;QAE1C,0BAA0B;QAC1B,UAAU,CAAC,kBAAkB,GAAG,IAAI,CAAA;QAEpC,OAAO,EAAE,IAAI,EAAE,CAAA;IACjB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;;AAGvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAmD,EAAE,EAAE,CAClG,MAAM,CAAC,WAAW,CAA0B,CAAC,IAAI,EAAE,EAAE,CACnD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,YAAY,CAAA;IAEpC,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,CAAA;IAEvG,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAA;IAEzG,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,wDAAwD,IAAI,CAAC,QAAQ,MAAM,IAAI,EAAE,CAAC,CAAA;IAC3G,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAEf,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAA;IAElE,wBAAwB;IACxB,sBAAsB;IAEtB,YAAY;AACd,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CACtB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,2DAA2D,IAAI,EAAE,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/worker/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIhE,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC,MAAM,OAAO,YAAa,SAAQ,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,EAGzF;IACD,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,QAAQ,EAAwB,EAAE,EAAE,CACpD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;QAE1C,UAAU,CAAC,kBAAkB,GAAG,IAAI,CAAA;QAEpC,OAAO,EAAE,IAAI,EAAE,CAAA;IACjB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;;AAGvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAmD,EAAE,EAAE,CAClG,MAAM,CAAC,WAAW,CAA0B,CAAC,IAAI,EAAE,EAAE,CACnD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,YAAY,CAAA;IAEpC,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,CAAA;IAEvG,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAA;IAE7F,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,kDAAkD,IAAI,CAAC,QAAQ,MAAM,IAAI,EAAE,CAAC,CAAA;IACrG,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAEf,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAE5D,wBAAwB;IACxB,sBAAsB;IAEtB,YAAY;AACd,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CACtB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,2DAA2D,IAAI,EAAE,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@livestore/devtools-web-common",
3
- "version": "0.3.0-dev.5",
3
+ "version": "0.3.0-dev.51",
4
4
  "type": "module",
5
+ "sideEffects": false,
5
6
  "exports": {
6
7
  "./web-channel": {
7
8
  "types": "./dist/web-channel/index.d.ts",
@@ -10,18 +11,19 @@
10
11
  "./worker": {
11
12
  "types": "./dist/worker/mod.d.ts",
12
13
  "default": "./dist/worker/mod.js"
13
- },
14
- "./devtools-bridge": {
15
- "types": "./dist/devtools-bridge/index.d.ts",
16
- "default": "./dist/devtools-bridge/index.js"
17
14
  }
18
15
  },
19
16
  "dependencies": {
20
- "@livestore/common": "0.3.0-dev.5",
21
- "@livestore/utils": "0.3.0-dev.5",
22
- "@livestore/webmesh": "0.3.0-dev.5"
17
+ "@livestore/common": "0.3.0-dev.51",
18
+ "@livestore/utils": "0.3.0-dev.51",
19
+ "@livestore/webmesh": "0.3.0-dev.51"
23
20
  },
24
21
  "devDependencies": {},
22
+ "files": [
23
+ "package.json",
24
+ "src",
25
+ "dist"
26
+ ],
25
27
  "publishConfig": {
26
28
  "access": "public"
27
29
  },
@@ -1,65 +1,71 @@
1
- import { UnexpectedError } from '@livestore/common'
1
+ import { Devtools, UnexpectedError } from '@livestore/common'
2
2
  import { LS_DEV } from '@livestore/utils'
3
3
  import type { Scope, Worker } from '@livestore/utils/effect'
4
- import { Deferred, Effect, Stream, WebChannel } from '@livestore/utils/effect'
4
+ import { Deferred, Effect, Schema, Stream, WebChannel } from '@livestore/utils/effect'
5
5
  import type { MeshNode } from '@livestore/webmesh'
6
- import { makeMeshNode, WebmeshSchema } from '@livestore/webmesh'
6
+ import { WebmeshSchema } from '@livestore/webmesh'
7
7
 
8
8
  import * as WorkerSchema from '../worker/schema.js'
9
9
 
10
- export const makeWebDevtoolsConnectedMeshNode = ({
11
- nodeName,
12
- target,
13
- worker,
14
- }: {
15
- nodeName: string
16
- target: string
17
- worker: Worker.SerializedWorkerPool<typeof WorkerSchema.Request.Type>
18
- }) =>
19
- Effect.gen(function* () {
20
- const node = yield* makeMeshNode(nodeName)
21
-
22
- yield* connectViaWorker({ node, target, worker })
23
-
24
- return node
25
- })
26
-
27
- export const makeChannelForConnectedMeshNode = <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>({
28
- target,
29
- node,
30
- schema,
31
- }: {
32
- node: MeshNode
33
- target: string
34
- schema: WebChannel.InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>
35
- }) =>
36
- node.makeChannel({
37
- target,
38
- channelName: 'devtools:' + [node.nodeName, target].sort().join('_'),
39
- schema,
40
- mode: 'messagechannel',
41
- })
42
-
43
- export const makeWebDevtoolsChannel = <MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>({
44
- nodeName,
45
- target,
46
- schema,
47
- worker,
48
- workerTargetName,
49
- }: {
50
- nodeName: string
51
- target: string
52
- schema: WebChannel.InputSchema<MsgListen, MsgSend, MsgListenEncoded, MsgSendEncoded>
53
- worker: Worker.SerializedWorkerPool<typeof WorkerSchema.Request.Type>
54
- workerTargetName: string
55
- }): Effect.Effect<WebChannel.WebChannel<MsgListen, MsgSend>, UnexpectedError, Scope.Scope> =>
56
- Effect.gen(function* () {
57
- const node = yield* makeWebDevtoolsConnectedMeshNode({ nodeName, target: workerTargetName, worker })
58
-
59
- const channel = yield* makeChannelForConnectedMeshNode({ node, target, schema })
60
-
61
- return channel
62
- }).pipe(Effect.withSpan(`devtools-web-common:makeWebDevtoolsChannel`))
10
+ export * as WorkerSchema from '../worker/schema.js'
11
+
12
+ declare global {
13
+ // eslint-disable-next-line no-var
14
+ var __debugWebmeshNode: any
15
+ }
16
+
17
+ export const makeSessionInfoBroadcastChannel: Effect.Effect<
18
+ WebChannel.WebChannel<Devtools.SessionInfo.Message, Devtools.SessionInfo.Message>,
19
+ UnexpectedError,
20
+ Scope.Scope
21
+ > = WebChannel.broadcastChannel({
22
+ channelName: 'session-info',
23
+ schema: Devtools.SessionInfo.Message,
24
+ })
25
+
26
+ export const makeNodeName = {
27
+ sharedWorker: ({ storeId }: { storeId: string }) => `shared-worker-${storeId}`,
28
+ // TODO refactor shared-worker setup so there's only a single shared-worker per origin
29
+ // sharedWorker: () => `shared-worker`,
30
+ browserExtension: {
31
+ contentscriptMain: (tabId: number) => `contentscript-main-${tabId}`,
32
+ contentscriptIframe: (tabId: number) => `contentscript-iframe-${tabId}`,
33
+ },
34
+ }
35
+
36
+ export const ClientSessionContentscriptMainReq = Schema.TaggedStruct('ClientSessionContentscriptMainReq', {
37
+ storeId: Schema.String,
38
+ clientId: Schema.String,
39
+ sessionId: Schema.String,
40
+ })
41
+
42
+ export const ClientSessionContentscriptMainRes = Schema.TaggedStruct('ClientSessionContentscriptMainRes', {
43
+ tabId: Schema.Number,
44
+ })
45
+
46
+ // Effect.suspend is needed since `window` is not available in the shared worker
47
+ export const makeStaticClientSessionChannel = {
48
+ contentscriptMain: Effect.suspend(() =>
49
+ WebChannel.windowChannel({
50
+ // eslint-disable-next-line unicorn/prefer-global-this
51
+ listenWindow: window,
52
+ // eslint-disable-next-line unicorn/prefer-global-this
53
+ sendWindow: window,
54
+ schema: { listen: ClientSessionContentscriptMainReq, send: ClientSessionContentscriptMainRes },
55
+ ids: { own: 'contentscript-main-static', other: 'client-session-static' },
56
+ }),
57
+ ),
58
+ clientSession: Effect.suspend(() =>
59
+ WebChannel.windowChannel({
60
+ // eslint-disable-next-line unicorn/prefer-global-this
61
+ listenWindow: window,
62
+ // eslint-disable-next-line unicorn/prefer-global-this
63
+ sendWindow: window,
64
+ schema: { listen: ClientSessionContentscriptMainRes, send: ClientSessionContentscriptMainReq },
65
+ ids: { own: 'client-session-static', other: 'contentscript-main-static' },
66
+ }),
67
+ ),
68
+ }
63
69
 
64
70
  export const connectViaWorker = ({
65
71
  node,
@@ -75,9 +81,11 @@ export const connectViaWorker = ({
75
81
 
76
82
  const isConnected = yield* Deferred.make<boolean, never>()
77
83
 
78
- yield* Effect.addFinalizerLog(
79
- `@livestore/devtools-web-common: closing message channel ${node.nodeName} → ${target}`,
80
- )
84
+ if (LS_DEV) {
85
+ yield* Effect.addFinalizerLog(
86
+ `@livestore/devtools-web-common: closing message channel ${node.nodeName} → ${target}`,
87
+ )
88
+ }
81
89
 
82
90
  yield* worker.execute(WorkerSchema.CreateConnection.make({ from: node.nodeName, port: mc.port1 })).pipe(
83
91
  Stream.tap(() => Deferred.succeed(isConnected, true)),
@@ -93,7 +101,7 @@ export const connectViaWorker = ({
93
101
  schema: WebmeshSchema.Packet,
94
102
  })
95
103
 
96
- yield* node.addConnection({ target, connectionChannel: sharedWorkerConnection, replaceIfExists: true })
104
+ yield* node.addEdge({ target, edgeChannel: sharedWorkerConnection, replaceIfExists: true })
97
105
 
98
106
  if (LS_DEV) {
99
107
  yield* Effect.logDebug(`@livestore/devtools-web-common: initiated connection: ${node.nodeName} → ${target}`)
package/src/worker/mod.ts CHANGED
@@ -15,8 +15,7 @@ export class CacheService extends Context.Tag('@livestore/devtools-web-common:Ca
15
15
  Effect.gen(function* () {
16
16
  const node = yield* makeMeshNode(nodeName)
17
17
 
18
- // @ts-expect-error typing
19
- globalThis.__debugWebMeshNode = node
18
+ globalThis.__debugWebmeshNode = node
20
19
 
21
20
  return { node }
22
21
  }).pipe(Layer.scoped(CacheService))
@@ -29,15 +28,15 @@ export const CreateConnection = ({ from, port }: typeof SharedWorkerSchema.Creat
29
28
 
30
29
  const messagePortChannel = yield* WebChannel.messagePortChannel({ port, schema: WebmeshSchema.Packet })
31
30
 
32
- yield* node.addConnection({ target: from, connectionChannel: messagePortChannel, replaceIfExists: true })
31
+ yield* node.addEdge({ target: from, edgeChannel: messagePortChannel, replaceIfExists: true })
33
32
 
34
33
  if (LS_DEV) {
35
- yield* Effect.logDebug(`@livestore/devtools-web-common: accepted connection: ${node.nodeName} ← ${from}`)
34
+ yield* Effect.logDebug(`@livestore/devtools-web-common: accepted edge: ${node.nodeName} ← ${from}`)
36
35
  }
37
36
 
38
37
  emit.single({})
39
38
 
40
- yield* Effect.spanEvent({ connectedTo: [...node.connectionKeys] })
39
+ yield* Effect.spanEvent({ connectedTo: [...node.edgeKeys] })
41
40
 
42
41
  // Keep connection alive
43
42
  // yield* Effect.never
@@ -1,13 +0,0 @@
1
- import { Devtools } from '@livestore/common';
2
- import type { Scope, Worker } from '@livestore/utils/effect';
3
- import { Effect } from '@livestore/utils/effect';
4
- import type * as WorkerSchema from '../worker/schema.js';
5
- export declare const prepareWebDevtoolsBridge: ({ worker, workerTargetName, storeId, clientId, sessionId, }: {
6
- worker: Worker.SerializedWorkerPool<typeof WorkerSchema.Request.Type>;
7
- /** Usually `shared-worker` */
8
- workerTargetName: string;
9
- storeId: string;
10
- clientId: string;
11
- sessionId: string;
12
- }) => Effect.Effect<Devtools.PrepareDevtoolsBridge, never, Scope.Scope>;
13
- //# 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,QAAQ,EAAoB,MAAM,mBAAmB,CAAA;AAC9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAY,MAAM,EAA0B,MAAM,yBAAyB,CAAA;AAGlF,OAAO,KAAK,KAAK,YAAY,MAAM,qBAAqB,CAAA;AAIxD,eAAO,MAAM,wBAAwB,gEAMlC;IACD,MAAM,EAAE,MAAM,CAAC,oBAAoB,CAAC,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACrE,8BAA8B;IAC9B,gBAAgB,EAAE,MAAM,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB,KAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CA4G7C,CAAA"}
@@ -1,66 +0,0 @@
1
- import { Devtools, liveStoreVersion } from '@livestore/common';
2
- import { Deferred, Effect, PubSub, Schema, Stream } from '@livestore/utils/effect';
3
- import { makeChannelForConnectedMeshNode, makeWebDevtoolsConnectedMeshNode } from '../web-channel/index.js';
4
- // TODO use a unique bridgeId for each connection (similar to web bridge)
5
- // TODO refactor the bridge creation code to be re-used for both web and node and possibly expo
6
- export const prepareWebDevtoolsBridge = ({ worker, workerTargetName, storeId, clientId, sessionId, }) => Effect.gen(function* () {
7
- const meshNode = yield* makeWebDevtoolsConnectedMeshNode({
8
- nodeName: `devtools`,
9
- target: workerTargetName,
10
- worker,
11
- });
12
- // @ts-expect-error typing
13
- globalThis.__debugWebMeshNode = meshNode;
14
- // const appHostId = `${storeId}-${sessionId}`
15
- const isLeader = true; // For now we only support a single node instance, which always is the leader
16
- // TODO maybe we need a temporary channel to create a unique bridge channel e..g see appHostInfoDeferred below
17
- const webDevtoolsChannelStore = yield* makeChannelForConnectedMeshNode({
18
- node: meshNode,
19
- target: `client-session-${storeId}-${clientId}-${sessionId}`,
20
- schema: { listen: Devtools.MessageFromAppClientSession, send: Devtools.MessageToAppClientSession },
21
- });
22
- const webDevtoolsChannelCoordinator = yield* makeChannelForConnectedMeshNode({
23
- node: meshNode,
24
- target: `leader-${storeId}-${clientId}`,
25
- schema: { listen: Devtools.MessageFromAppLeader, send: Devtools.MessageToAppLeader },
26
- });
27
- const responsePubSub = yield* PubSub.unbounded().pipe(Effect.acquireRelease(PubSub.shutdown));
28
- // const appHostInfoDeferred = yield* Deferred.make<{ appHostId: string; isLeader: boolean }>()
29
- yield* webDevtoolsChannelCoordinator.listen.pipe(Stream.flatten(),
30
- // Stream.tapLogWithLabel('fromCoordinator.listen'),
31
- Stream.tap((msg) => Effect.gen(function* () {
32
- yield* PubSub.publish(responsePubSub, msg);
33
- })), Stream.runDrain, Effect.withSpan('portForDevtoolsChannelCoordinator.listen'), Effect.tapCauseLogPretty, Effect.forkScoped);
34
- yield* webDevtoolsChannelStore.listen.pipe(Stream.flatten(),
35
- // Stream.tapLogWithLabel('fromStore.listen'),
36
- Stream.tap((msg) => Effect.gen(function* () {
37
- yield* PubSub.publish(responsePubSub, msg);
38
- })), Stream.runDrain, Effect.withSpan('portForDevtoolsChannelStore.listen'), Effect.tapCauseLogPretty, Effect.forkScoped);
39
- // yield* webDevtoolsChannelCoordinator.send(Devtools.DevtoolsReady.make({ liveStoreVersion }))
40
- // const { appHostId, isLeader } = yield* Deferred.await(appHostInfoDeferred)
41
- // TODO improve disconnect handling
42
- yield* Deferred.await(webDevtoolsChannelCoordinator.closedDeferred).pipe(Effect.tap(() => PubSub.publish(responsePubSub, Devtools.Disconnect.make({ liveStoreVersion, clientId, sessionId }))), Effect.tapCauseLogPretty, Effect.forkScoped);
43
- // TODO improve disconnect handling
44
- yield* Deferred.await(webDevtoolsChannelStore.closedDeferred).pipe(Effect.tap(() => PubSub.publish(responsePubSub, Devtools.Disconnect.make({ liveStoreVersion, clientId, sessionId }))), Effect.tapCauseLogPretty, Effect.forkScoped);
45
- const sendToAppHost = (msg) => Effect.gen(function* () {
46
- // NOTE it's possible that a message is for both the coordinator and the store (e.g. Disconnect)
47
- if (Schema.is(Devtools.MessageToAppLeader)(msg)) {
48
- yield* webDevtoolsChannelCoordinator.send(msg);
49
- }
50
- if (Schema.is(Devtools.MessageToAppClientSession)(msg)) {
51
- yield* webDevtoolsChannelStore.send(msg);
52
- }
53
- }).pipe(Effect.withSpan('sendToAppHost'), Effect.orDie);
54
- const copyToClipboard = (text) => Effect.sync(() => {
55
- navigator.clipboard.writeText(text);
56
- });
57
- return {
58
- responsePubSub,
59
- sendToAppHost,
60
- clientId,
61
- sessionId,
62
- copyToClipboard,
63
- isLeader,
64
- };
65
- }).pipe(Effect.orDie);
66
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devtools-bridge/index.ts"],"names":[],"mappings":"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"}