@livestore/common 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 (82) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/adapter-types.d.ts +4 -3
  3. package/dist/adapter-types.d.ts.map +1 -1
  4. package/dist/adapter-types.js +1 -0
  5. package/dist/adapter-types.js.map +1 -1
  6. package/dist/debug-info.d.ts +1 -1
  7. package/dist/devtools/devtools-messages-client-session.d.ts +41 -22
  8. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  9. package/dist/devtools/devtools-messages-client-session.js +26 -7
  10. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  11. package/dist/devtools/devtools-messages-common.d.ts +16 -12
  12. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  13. package/dist/devtools/devtools-messages-common.js +15 -5
  14. package/dist/devtools/devtools-messages-common.js.map +1 -1
  15. package/dist/devtools/devtools-messages-leader.d.ts +74 -106
  16. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  17. package/dist/devtools/devtools-messages-leader.js +52 -37
  18. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  19. package/dist/devtools/devtools-sessioninfo.d.ts +28 -0
  20. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
  21. package/dist/devtools/devtools-sessioninfo.js +34 -0
  22. package/dist/devtools/devtools-sessioninfo.js.map +1 -0
  23. package/dist/devtools/devtools-sessions-channel.d.ts +28 -0
  24. package/dist/devtools/devtools-sessions-channel.d.ts.map +1 -0
  25. package/dist/devtools/devtools-sessions-channel.js +34 -0
  26. package/dist/devtools/devtools-sessions-channel.js.map +1 -0
  27. package/dist/devtools/index.d.ts +27 -49
  28. package/dist/devtools/index.d.ts.map +1 -1
  29. package/dist/devtools/index.js +10 -55
  30. package/dist/devtools/index.js.map +1 -1
  31. package/dist/devtools/mod.d.ts +39 -0
  32. package/dist/devtools/mod.d.ts.map +1 -0
  33. package/dist/devtools/mod.js +27 -0
  34. package/dist/devtools/mod.js.map +1 -0
  35. package/dist/index.d.ts +1 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  40. package/dist/leader-thread/leader-worker-devtools.js +73 -31
  41. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  42. package/dist/otel.d.ts +2 -0
  43. package/dist/otel.d.ts.map +1 -1
  44. package/dist/otel.js +5 -0
  45. package/dist/otel.js.map +1 -1
  46. package/dist/query-builder/impl.d.ts +3 -3
  47. package/dist/query-builder/impl.d.ts.map +1 -1
  48. package/dist/rehydrate-from-mutationlog.js.map +1 -1
  49. package/dist/schema/db-schema/dsl/field-defs.d.ts.map +1 -1
  50. package/dist/schema/db-schema/dsl/field-defs.js.map +1 -1
  51. package/dist/schema/db-schema/dsl/mod.js.map +1 -1
  52. package/dist/schema/system-tables.d.ts +2 -2
  53. package/dist/sync/ClientSessionSyncProcessor.d.ts +6 -1
  54. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  55. package/dist/sync/ClientSessionSyncProcessor.js +2 -2
  56. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  57. package/dist/util.d.ts +2 -2
  58. package/dist/util.d.ts.map +1 -1
  59. package/dist/version.d.ts +1 -1
  60. package/dist/version.js +1 -1
  61. package/package.json +3 -3
  62. package/src/adapter-types.ts +2 -1
  63. package/src/devtools/devtools-messages-client-session.ts +26 -10
  64. package/src/devtools/devtools-messages-common.ts +38 -13
  65. package/src/devtools/devtools-messages-leader.ts +61 -46
  66. package/src/devtools/devtools-sessioninfo.ts +99 -0
  67. package/src/devtools/mod.ts +36 -0
  68. package/src/index.ts +1 -1
  69. package/src/leader-thread/leader-worker-devtools.ts +83 -36
  70. package/src/leader-thread/make-leader-thread-layer.ts +1 -1
  71. package/src/otel.ts +8 -0
  72. package/src/rehydrate-from-mutationlog.ts +1 -1
  73. package/src/schema/db-schema/dsl/field-defs.ts +2 -1
  74. package/src/schema/db-schema/dsl/mod.ts +1 -1
  75. package/src/sync/ClientSessionSyncProcessor.ts +7 -1
  76. package/src/version.ts +1 -1
  77. package/dist/devtools/devtools-bridge.d.ts +0 -16
  78. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  79. package/dist/devtools/devtools-bridge.js +0 -2
  80. package/dist/devtools/devtools-bridge.js.map +0 -1
  81. package/src/devtools/devtools-bridge.ts +0 -17
  82. package/src/devtools/index.ts +0 -76
@@ -0,0 +1,34 @@
1
+ import { Data, Duration, Effect, FiberMap, HashSet, Schedule, Schema, Stream, Subscribable, SubscriptionRef, } from '@livestore/utils/effect';
2
+ export const RequestSessions = Schema.TaggedStruct('RequestSessions', {});
3
+ export const SessionInfo = Schema.TaggedStruct('SessionInfo', {
4
+ storeId: Schema.String,
5
+ clientId: Schema.String,
6
+ sessionId: Schema.String,
7
+ });
8
+ export const Message = Schema.Union(RequestSessions, SessionInfo);
9
+ /** Usually called in client session */
10
+ export const provideSessionInfo = ({ webChannel, sessionInfo, }) => Effect.gen(function* () {
11
+ yield* webChannel.send(sessionInfo);
12
+ yield* webChannel.listen.pipe(Stream.flatten(), Stream.filter(Schema.is(RequestSessions)), Stream.tap(() => webChannel.send(sessionInfo)), Stream.runDrain);
13
+ });
14
+ /** Usually called in devtools */
15
+ export const requestSessionInfoSubscription = ({ webChannel, pollInterval = Duration.seconds(1), staleTimeout = Duration.seconds(5), }) => Effect.gen(function* () {
16
+ yield* webChannel
17
+ .send(RequestSessions.make({}))
18
+ .pipe(Effect.repeat(Schedule.spaced(pollInterval)), Effect.interruptible, Effect.tapCauseLogPretty, Effect.forkScoped);
19
+ const timeoutFiberMap = yield* FiberMap.make();
20
+ const sessionInfoSubRef = yield* SubscriptionRef.make(HashSet.empty());
21
+ yield* webChannel.listen.pipe(Stream.flatten(), Stream.filter(Schema.is(SessionInfo)), Stream.map(Data.struct), Stream.tap(Effect.fn(function* (sessionInfo) {
22
+ yield* SubscriptionRef.getAndUpdate(sessionInfoSubRef, HashSet.add(sessionInfo));
23
+ // Remove sessionInfo from cache after staleTimeout (unless a new identical item resets the timeout)
24
+ yield* FiberMap.run(timeoutFiberMap, sessionInfo, Effect.gen(function* () {
25
+ yield* Effect.sleep(staleTimeout);
26
+ yield* SubscriptionRef.getAndUpdate(sessionInfoSubRef, HashSet.remove(sessionInfo));
27
+ }));
28
+ })), Stream.runDrain, Effect.tapCauseLogPretty, Effect.forkScoped);
29
+ return Subscribable.make({
30
+ get: sessionInfoSubRef.get.pipe(Effect.map((sessionInfos) => new Set(sessionInfos))),
31
+ changes: sessionInfoSubRef.changes.pipe(Stream.map((sessionInfos) => new Set(sessionInfos))),
32
+ });
33
+ });
34
+ //# sourceMappingURL=devtools-sessioninfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-sessioninfo.js","sourceRoot":"","sources":["../../src/devtools/devtools-sessioninfo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { ParseResult, Scope, WebChannel } from '@livestore/utils/effect';
2
+ import { Duration, Effect, Schema, Subscribable } from '@livestore/utils/effect';
3
+ export declare const RequestSessions: Schema.TaggedStruct<"RequestSessions", {}>;
4
+ export type RequestSessions = typeof RequestSessions.Type;
5
+ export declare const SessionInfo: Schema.TaggedStruct<"SessionInfo", {
6
+ storeId: typeof Schema.String;
7
+ clientId: typeof Schema.String;
8
+ sessionId: typeof Schema.String;
9
+ }>;
10
+ export type SessionInfo = typeof SessionInfo.Type;
11
+ export declare const Message: Schema.Union<[Schema.TaggedStruct<"RequestSessions", {}>, Schema.TaggedStruct<"SessionInfo", {
12
+ storeId: typeof Schema.String;
13
+ clientId: typeof Schema.String;
14
+ sessionId: typeof Schema.String;
15
+ }>]>;
16
+ export type Message = typeof Message.Type;
17
+ /** Usually called in client session */
18
+ export declare const provideSessionInfo: ({ webChannel, sessionInfo, }: {
19
+ webChannel: WebChannel.WebChannel<Message, Message>;
20
+ sessionInfo: SessionInfo;
21
+ }) => Effect.Effect<void, ParseResult.ParseError>;
22
+ /** Usually called in devtools */
23
+ export declare const requestSessionInfoSubscription: ({ webChannel, pollInterval, staleTimeout, }: {
24
+ webChannel: WebChannel.WebChannel<Message, Message>;
25
+ pollInterval?: Duration.DurationInput;
26
+ staleTimeout?: Duration.DurationInput;
27
+ }) => Effect.Effect<Subscribable.Subscribable<Set<SessionInfo>>, ParseResult.ParseError, Scope.Scope>;
28
+ //# sourceMappingURL=devtools-sessions-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-sessions-channel.d.ts","sourceRoot":"","sources":["../../src/devtools/devtools-sessions-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EAEL,QAAQ,EACR,MAAM,EAIN,MAAM,EAEN,YAAY,EAEb,MAAM,yBAAyB,CAAA;AAEhC,eAAO,MAAM,eAAe,4CAA6C,CAAA;AACzE,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAA;AAEzD,eAAO,MAAM,WAAW;;;;EAItB,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA;AAEjD,eAAO,MAAM,OAAO;;;;IAA6C,CAAA;AACjE,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAEzC,uCAAuC;AACvC,eAAO,MAAM,kBAAkB,GAAI,8BAGhC;IACD,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACnD,WAAW,EAAE,WAAW,CAAA;CACzB,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,UAAU,CAU1C,CAAA;AAEJ,iCAAiC;AACjC,eAAO,MAAM,8BAA8B,GAAI,6CAI5C;IACD,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACnD,YAAY,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAA;IACrC,YAAY,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAA;CACtC,KAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CA2C9F,CAAA"}
@@ -0,0 +1,34 @@
1
+ import { Data, Duration, Effect, FiberMap, HashSet, Schedule, Schema, Stream, Subscribable, SubscriptionRef, } from '@livestore/utils/effect';
2
+ export const RequestSessions = Schema.TaggedStruct('RequestSessions', {});
3
+ export const SessionInfo = Schema.TaggedStruct('SessionInfo', {
4
+ storeId: Schema.String,
5
+ clientId: Schema.String,
6
+ sessionId: Schema.String,
7
+ });
8
+ export const Message = Schema.Union(RequestSessions, SessionInfo);
9
+ /** Usually called in client session */
10
+ export const provideSessionInfo = ({ webChannel, sessionInfo, }) => Effect.gen(function* () {
11
+ yield* webChannel.send(sessionInfo);
12
+ yield* webChannel.listen.pipe(Stream.flatten(), Stream.filter(Schema.is(RequestSessions)), Stream.tap(() => webChannel.send(sessionInfo)), Stream.runDrain);
13
+ });
14
+ /** Usually called in devtools */
15
+ export const requestSessionInfoSubscription = ({ webChannel, pollInterval = Duration.seconds(1), staleTimeout = Duration.seconds(5), }) => Effect.gen(function* () {
16
+ yield* webChannel
17
+ .send(RequestSessions.make({}))
18
+ .pipe(Effect.repeat(Schedule.spaced(pollInterval)), Effect.interruptible, Effect.tapCauseLogPretty, Effect.forkScoped);
19
+ const timeoutFiberMap = yield* FiberMap.make();
20
+ const sessionInfoSubRef = yield* SubscriptionRef.make(HashSet.empty());
21
+ yield* webChannel.listen.pipe(Stream.flatten(), Stream.filter(Schema.is(SessionInfo)), Stream.map(Data.struct), Stream.tap(Effect.fn(function* (sessionInfo) {
22
+ yield* SubscriptionRef.getAndUpdate(sessionInfoSubRef, HashSet.add(sessionInfo));
23
+ // Remove sessionInfo from cache after staleTimeout (unless a new identical item resets the timeout)
24
+ yield* FiberMap.run(timeoutFiberMap, sessionInfo, Effect.gen(function* () {
25
+ yield* Effect.sleep(staleTimeout);
26
+ yield* SubscriptionRef.getAndUpdate(sessionInfoSubRef, HashSet.remove(sessionInfo));
27
+ }));
28
+ })), Stream.runDrain, Effect.tapCauseLogPretty, Effect.forkScoped);
29
+ return Subscribable.make({
30
+ get: sessionInfoSubRef.get.pipe(Effect.map((sessionInfos) => new Set(sessionInfos))),
31
+ changes: sessionInfoSubRef.changes.pipe(Stream.map((sessionInfos) => new Set(sessionInfos))),
32
+ });
33
+ });
34
+ //# sourceMappingURL=devtools-sessions-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-sessions-channel.js","sourceRoot":"","sources":["../../src/devtools/devtools-sessions-channel.ts"],"names":[],"mappings":"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"}
@@ -1,61 +1,39 @@
1
- import type { Effect, Scope } from '@livestore/utils/effect';
2
- import { Schema, WebChannel } from '@livestore/utils/effect';
1
+ import { Schema } from '@livestore/utils/effect';
3
2
  export * from './devtools-messages.js';
4
3
  export * from './devtools-window-message.js';
5
- export * from './devtools-bridge.js';
6
- export declare namespace WebBridge {
7
- const AppHostReady_base: Schema.TaggedStruct<"LSD.WebBridge.AppHostReady", {
8
- appHostId: typeof Schema.String;
9
- isLeader: typeof Schema.Boolean;
10
- }>;
11
- export class AppHostReady extends AppHostReady_base {
12
- }
13
- const DevtoolsReady_base: Schema.TaggedStruct<"LSD.WebBridge.DevtoolsReady", {
14
- devtoolsId: typeof Schema.String;
15
- }>;
16
- export class DevtoolsReady extends DevtoolsReady_base {
17
- }
18
- const ConnectToDevtools_base: Schema.TaggedStruct<"LSD.WebBridge.ConnectToDevtools", {
19
- devtoolsId: typeof Schema.String;
20
- appHostId: typeof Schema.String;
21
- /**
22
- * Given the m:n relationship between devtools and app hosts and the fact that appHostIds are usually
23
- * sticky, we generate a new unique id for the lifetime of the web bridge.
24
- */
25
- webBridgeId: typeof Schema.String;
26
- isLeader: typeof Schema.Boolean;
27
- storeId: typeof Schema.String;
28
- }>;
29
- export class ConnectToDevtools extends ConnectToDevtools_base {
30
- }
31
- const AppHostWillDisconnect_base: Schema.TaggedStruct<"LSD.WebBridge.AppHostWillDisconnect", {
32
- appHostId: typeof Schema.String;
33
- }>;
34
- export class AppHostWillDisconnect extends AppHostWillDisconnect_base {
35
- }
36
- const All_base: Schema.Union<[typeof AppHostReady, typeof DevtoolsReady, typeof ConnectToDevtools, typeof AppHostWillDisconnect]>;
37
- export class All extends All_base {
38
- }
39
- export const makeBroadcastChannel: (key?: string) => Effect.Effect<WebChannel.WebChannel<typeof All.Type, typeof All.Type>, never, Scope.Scope>;
40
- export {};
41
- }
42
- export declare const DevtoolsMode: Schema.Union<[Schema.TaggedStruct<"from-search-params", {}>, Schema.TaggedStruct<"expo", {
4
+ export * as SessionsChannel from './devtools-sessions-channel.js';
5
+ export declare const ClientSessionInfo: Schema.Struct<{
43
6
  storeId: typeof Schema.String;
44
7
  clientId: typeof Schema.String;
45
8
  sessionId: typeof Schema.String;
9
+ }>;
10
+ export declare const DevtoolsMode: Schema.Union<[Schema.TaggedStruct<"expo", {
11
+ clientSessionInfo: Schema.UndefinedOr<Schema.Struct<{
12
+ storeId: typeof Schema.String;
13
+ clientId: typeof Schema.String;
14
+ sessionId: typeof Schema.String;
15
+ }>>;
46
16
  }>, Schema.TaggedStruct<"node", {
47
- storeId: typeof Schema.String;
48
- clientId: typeof Schema.String;
49
- sessionId: typeof Schema.String;
17
+ clientSessionInfo: Schema.UndefinedOr<Schema.Struct<{
18
+ storeId: typeof Schema.String;
19
+ clientId: typeof Schema.String;
20
+ sessionId: typeof Schema.String;
21
+ }>>;
50
22
  url: typeof Schema.String;
51
23
  }>, Schema.TaggedStruct<"web", {
52
- storeId: typeof Schema.String;
53
- clientId: typeof Schema.String;
54
- sessionId: typeof Schema.String;
24
+ clientSessionInfo: Schema.UndefinedOr<Schema.Struct<{
25
+ storeId: typeof Schema.String;
26
+ clientId: typeof Schema.String;
27
+ sessionId: typeof Schema.String;
28
+ }>>;
55
29
  }>, Schema.TaggedStruct<"browser-extension", {
56
- storeId: typeof Schema.String;
57
- clientId: typeof Schema.String;
58
- sessionId: typeof Schema.String;
30
+ clientSessionInfo: Schema.UndefinedOr<Schema.Struct<{
31
+ storeId: typeof Schema.String;
32
+ clientId: typeof Schema.String;
33
+ sessionId: typeof Schema.String;
34
+ }>>;
59
35
  }>]>;
60
36
  export type DevtoolsMode = typeof DevtoolsMode.Type;
37
+ export declare const DevtoolsModeTag: Schema.SchemaClass<"expo" | "node" | "web" | "browser-extension", "expo" | "node" | "web" | "browser-extension", never>;
38
+ export type DevtoolsModeTag = typeof DevtoolsModeTag.Type;
61
39
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE5D,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,sBAAsB,CAAA;AAEpC,yBAAiB,SAAS,CAAC;;;;;IACzB,MAAM,OAAO,YAAa,SAAQ,iBAIhC;KAAG;;;;IAEL,MAAM,OAAO,aAAc,SAAQ,kBAEjC;KAAG;;;;QAKH;;;WAGG;;;;;IANL,MAAM,OAAO,iBAAkB,SAAQ,sBAUrC;KAAG;;;;IAEL,MAAM,OAAO,qBAAsB,SAAQ,0BAEzC;KAAG;;IAML,MAAM,OAAO,GAAI,SAAQ,QAAmF;KAAG;IAE/G,MAAM,CAAC,MAAM,oBAAoB,GAC/B,MAAM,MAAM,KACX,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAIxF,CAAA;;CACL;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;IAwBxB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA;AAC5C,OAAO,KAAK,eAAe,MAAM,gCAAgC,CAAA;AACjE,eAAO,MAAM,iBAAiB;;;;EAI5B,CAAA;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;IAexB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAEnD,eAAO,MAAM,eAAe,yHAA6D,CAAA;AACzF,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAA"}
@@ -1,68 +1,23 @@
1
- import { Schema, WebChannel } from '@livestore/utils/effect';
1
+ import { Schema } from '@livestore/utils/effect';
2
2
  export * from './devtools-messages.js';
3
3
  export * from './devtools-window-message.js';
4
- export * from './devtools-bridge.js';
5
- export var WebBridge;
6
- (function (WebBridge) {
7
- class AppHostReady extends Schema.TaggedStruct('LSD.WebBridge.AppHostReady', {
8
- appHostId: Schema.String,
9
- // storeId: Schema.String,
10
- isLeader: Schema.Boolean,
11
- }) {
12
- }
13
- WebBridge.AppHostReady = AppHostReady;
14
- class DevtoolsReady extends Schema.TaggedStruct('LSD.WebBridge.DevtoolsReady', {
15
- devtoolsId: Schema.String,
16
- }) {
17
- }
18
- WebBridge.DevtoolsReady = DevtoolsReady;
19
- class ConnectToDevtools extends Schema.TaggedStruct('LSD.WebBridge.ConnectToDevtools', {
20
- devtoolsId: Schema.String,
21
- appHostId: Schema.String,
22
- /**
23
- * Given the m:n relationship between devtools and app hosts and the fact that appHostIds are usually
24
- * sticky, we generate a new unique id for the lifetime of the web bridge.
25
- */
26
- webBridgeId: Schema.String,
27
- isLeader: Schema.Boolean,
28
- storeId: Schema.String,
29
- }) {
30
- }
31
- WebBridge.ConnectToDevtools = ConnectToDevtools;
32
- class AppHostWillDisconnect extends Schema.TaggedStruct('LSD.WebBridge.AppHostWillDisconnect', {
33
- appHostId: Schema.String,
34
- }) {
35
- }
36
- WebBridge.AppHostWillDisconnect = AppHostWillDisconnect;
37
- // export class DevtoolsWillDisconnect extends Schema.TaggedStruct('LSD.WebBridge.DevtoolsWillDisconnect', {
38
- // appHostId: Schema.String,
39
- // }) {}
40
- class All extends Schema.Union(AppHostReady, DevtoolsReady, ConnectToDevtools, AppHostWillDisconnect) {
41
- }
42
- WebBridge.All = All;
43
- WebBridge.makeBroadcastChannel = (key) => WebChannel.broadcastChannel({
44
- channelName: `livestore-web-bridge-devtools${key ? `-${key}` : ''}`,
45
- schema: All,
46
- });
47
- })(WebBridge || (WebBridge = {}));
48
- export const DevtoolsMode = Schema.Union(Schema.TaggedStruct('from-search-params', {}), Schema.TaggedStruct('expo', {
4
+ export * as SessionsChannel from './devtools-sessions-channel.js';
5
+ export const ClientSessionInfo = Schema.Struct({
49
6
  storeId: Schema.String,
50
7
  clientId: Schema.String,
51
8
  sessionId: Schema.String,
9
+ });
10
+ export const DevtoolsMode = Schema.Union(Schema.TaggedStruct('expo', {
11
+ clientSessionInfo: Schema.UndefinedOr(ClientSessionInfo),
52
12
  }),
53
13
  // TODO add storeId, clientId and sessionId for Node
54
14
  Schema.TaggedStruct('node', {
55
- storeId: Schema.String,
56
- clientId: Schema.String,
57
- sessionId: Schema.String,
15
+ clientSessionInfo: Schema.UndefinedOr(ClientSessionInfo),
58
16
  url: Schema.String,
59
17
  }), Schema.TaggedStruct('web', {
60
- storeId: Schema.String,
61
- clientId: Schema.String,
62
- sessionId: Schema.String,
18
+ clientSessionInfo: Schema.UndefinedOr(ClientSessionInfo),
63
19
  }), Schema.TaggedStruct('browser-extension', {
64
- storeId: Schema.String,
65
- clientId: Schema.String,
66
- sessionId: Schema.String,
20
+ clientSessionInfo: Schema.UndefinedOr(ClientSessionInfo),
67
21
  }));
22
+ export const DevtoolsModeTag = DevtoolsMode.pipe(Schema.pluck('_tag'), Schema.typeSchema);
68
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE5D,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,sBAAsB,CAAA;AAEpC,MAAM,KAAW,SAAS,CAwCzB;AAxCD,WAAiB,SAAS;IACxB,MAAa,YAAa,SAAQ,MAAM,CAAC,YAAY,CAAC,4BAA4B,EAAE;QAClF,SAAS,EAAE,MAAM,CAAC,MAAM;QACxB,0BAA0B;QAC1B,QAAQ,EAAE,MAAM,CAAC,OAAO;KACzB,CAAC;KAAG;IAJQ,sBAAY,eAIpB,CAAA;IAEL,MAAa,aAAc,SAAQ,MAAM,CAAC,YAAY,CAAC,6BAA6B,EAAE;QACpF,UAAU,EAAE,MAAM,CAAC,MAAM;KAC1B,CAAC;KAAG;IAFQ,uBAAa,gBAErB,CAAA;IAEL,MAAa,iBAAkB,SAAQ,MAAM,CAAC,YAAY,CAAC,iCAAiC,EAAE;QAC5F,UAAU,EAAE,MAAM,CAAC,MAAM;QACzB,SAAS,EAAE,MAAM,CAAC,MAAM;QACxB;;;WAGG;QACH,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,QAAQ,EAAE,MAAM,CAAC,OAAO;QACxB,OAAO,EAAE,MAAM,CAAC,MAAM;KACvB,CAAC;KAAG;IAVQ,2BAAiB,oBAUzB,CAAA;IAEL,MAAa,qBAAsB,SAAQ,MAAM,CAAC,YAAY,CAAC,qCAAqC,EAAE;QACpG,SAAS,EAAE,MAAM,CAAC,MAAM;KACzB,CAAC;KAAG;IAFQ,+BAAqB,wBAE7B,CAAA;IAEL,4GAA4G;IAC5G,8BAA8B;IAC9B,QAAQ;IAER,MAAa,GAAI,SAAQ,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,qBAAqB,CAAC;KAAG;IAAlG,aAAG,MAA+F,CAAA;IAElG,8BAAoB,GAAG,CAClC,GAAY,EACgF,EAAE,CAC9F,UAAU,CAAC,gBAAgB,CAAC;QAC1B,WAAW,EAAE,gCAAgC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QACnE,MAAM,EAAE,GAAG;KACZ,CAAC,CAAA;AACN,CAAC,EAxCgB,SAAS,KAAT,SAAS,QAwCzB;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CACtC,MAAM,CAAC,YAAY,CAAC,oBAAoB,EAAE,EAAE,CAAC,EAC7C,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM;CACzB,CAAC;AACF,oDAAoD;AACpD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM;IACxB,GAAG,EAAE,MAAM,CAAC,MAAM;CACnB,CAAC,EACF,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM;CACzB,CAAC,EACF,MAAM,CAAC,YAAY,CAAC,mBAAmB,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM;CACzB,CAAC,CACH,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA;AAC5C,OAAO,KAAK,eAAe,MAAM,gCAAgC,CAAA;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM;CACzB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CACtC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE;IAC1B,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC;CACzD,CAAC;AACF,oDAAoD;AACpD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE;IAC1B,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC;IACxD,GAAG,EAAE,MAAM,CAAC,MAAM;CACnB,CAAC,EACF,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE;IACzB,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC;CACzD,CAAC,EACF,MAAM,CAAC,YAAY,CAAC,mBAAmB,EAAE;IACvC,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC;CACzD,CAAC,CACH,CAAA;AAID,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA"}
@@ -0,0 +1,39 @@
1
+ import { Schema } from '@livestore/utils/effect';
2
+ export * from './devtools-messages.js';
3
+ export * from './devtools-window-message.js';
4
+ export * as SessionInfo from './devtools-sessioninfo.js';
5
+ export declare const ClientSessionInfo: Schema.Struct<{
6
+ storeId: typeof Schema.String;
7
+ clientId: typeof Schema.String;
8
+ sessionId: typeof Schema.String;
9
+ }>;
10
+ export declare const DevtoolsMode: Schema.Union<[Schema.TaggedStruct<"expo", {
11
+ clientSessionInfo: Schema.optional<Schema.Struct<{
12
+ storeId: typeof Schema.String;
13
+ clientId: typeof Schema.String;
14
+ sessionId: typeof Schema.String;
15
+ }>>;
16
+ }>, Schema.TaggedStruct<"node", {
17
+ clientSessionInfo: Schema.UndefinedOr<Schema.Struct<{
18
+ storeId: typeof Schema.String;
19
+ clientId: typeof Schema.String;
20
+ sessionId: typeof Schema.String;
21
+ }>>;
22
+ url: typeof Schema.String;
23
+ }>, Schema.TaggedStruct<"web", {
24
+ clientSessionInfo: Schema.UndefinedOr<Schema.Struct<{
25
+ storeId: typeof Schema.String;
26
+ clientId: typeof Schema.String;
27
+ sessionId: typeof Schema.String;
28
+ }>>;
29
+ }>, Schema.TaggedStruct<"browser-extension", {
30
+ clientSessionInfo: Schema.UndefinedOr<Schema.Struct<{
31
+ storeId: typeof Schema.String;
32
+ clientId: typeof Schema.String;
33
+ sessionId: typeof Schema.String;
34
+ }>>;
35
+ }>]>;
36
+ export type DevtoolsMode = typeof DevtoolsMode.Type;
37
+ export declare const DevtoolsModeTag: Schema.SchemaClass<"expo" | "node" | "web" | "browser-extension", "expo" | "node" | "web" | "browser-extension", never>;
38
+ export type DevtoolsModeTag = typeof DevtoolsModeTag.Type;
39
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/devtools/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA;AAC5C,OAAO,KAAK,WAAW,MAAM,2BAA2B,CAAA;AACxD,eAAO,MAAM,iBAAiB;;;;EAI5B,CAAA;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;IAmBxB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAEnD,eAAO,MAAM,eAAe,yHAA6D,CAAA;AACzF,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { Schema } from '@livestore/utils/effect';
2
+ export * from './devtools-messages.js';
3
+ export * from './devtools-window-message.js';
4
+ export * as SessionInfo from './devtools-sessioninfo.js';
5
+ export const ClientSessionInfo = Schema.Struct({
6
+ storeId: Schema.String,
7
+ clientId: Schema.String,
8
+ sessionId: Schema.String,
9
+ });
10
+ export const DevtoolsMode = Schema.Union(Schema.TaggedStruct('expo', {
11
+ // TODO get rid of embedded `clientSessionInfo`
12
+ clientSessionInfo: Schema.optional(ClientSessionInfo),
13
+ }),
14
+ // TODO add storeId, clientId and sessionId for Node
15
+ Schema.TaggedStruct('node', {
16
+ // TODO get rid of embedded `clientSessionInfo`
17
+ clientSessionInfo: Schema.UndefinedOr(ClientSessionInfo),
18
+ url: Schema.String,
19
+ }), Schema.TaggedStruct('web', {
20
+ // TODO get rid of embedded `clientSessionInfo`
21
+ clientSessionInfo: Schema.UndefinedOr(ClientSessionInfo),
22
+ }), Schema.TaggedStruct('browser-extension', {
23
+ // TODO get rid of embedded `clientSessionInfo`
24
+ clientSessionInfo: Schema.UndefinedOr(ClientSessionInfo),
25
+ }));
26
+ export const DevtoolsModeTag = DevtoolsMode.pipe(Schema.pluck('_tag'), Schema.typeSchema);
27
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/devtools/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA;AAC5C,OAAO,KAAK,WAAW,MAAM,2BAA2B,CAAA;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM;CACzB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CACtC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE;IAC1B,+CAA+C;IAC/C,iBAAiB,EAAE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CACtD,CAAC;AACF,oDAAoD;AACpD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE;IAC1B,+CAA+C;IAC/C,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC;IACxD,GAAG,EAAE,MAAM,CAAC,MAAM;CACnB,CAAC,EACF,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE;IACzB,+CAA+C;IAC/C,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC;CACzD,CAAC,EACF,MAAM,CAAC,YAAY,CAAC,mBAAmB,EAAE;IACvC,+CAA+C;IAC/C,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC;CACzD,CAAC,CACH,CAAA;AAID,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA"}
package/dist/index.d.ts CHANGED
@@ -8,7 +8,7 @@ export * from './rehydrate-from-mutationlog.js';
8
8
  export * from './query-info.js';
9
9
  export * from './derived-mutations.js';
10
10
  export * from './sync/index.js';
11
- export * as Devtools from './devtools/index.js';
11
+ export * as Devtools from './devtools/mod.js';
12
12
  export * from './debug-info.js';
13
13
  export * from './bounded-collections.js';
14
14
  export * from './version.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,WAAW,CAAA;AACzB,cAAc,oBAAoB,CAAA;AAClC,cAAc,mCAAmC,CAAA;AACjD,cAAc,eAAe,CAAA;AAC7B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,cAAc,CAAA;AAC5B,cAAc,wBAAwB,CAAA;AACtC,OAAO,KAAK,SAAS,MAAM,qBAAqB,CAAA;AAChD,cAAc,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,WAAW,CAAA;AACzB,cAAc,oBAAoB,CAAA;AAClC,cAAc,mCAAmC,CAAA;AACjD,cAAc,eAAe,CAAA;AAC7B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAA;AAC7C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,cAAc,CAAA;AAC5B,cAAc,wBAAwB,CAAA;AACtC,OAAO,KAAK,SAAS,MAAM,qBAAqB,CAAA;AAChD,cAAc,WAAW,CAAA"}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ export * from './rehydrate-from-mutationlog.js';
8
8
  export * from './query-info.js';
9
9
  export * from './derived-mutations.js';
10
10
  export * from './sync/index.js';
11
- export * as Devtools from './devtools/index.js';
11
+ export * as Devtools from './devtools/mod.js';
12
12
  export * from './debug-info.js';
13
13
  export * from './bounded-collections.js';
14
14
  export * from './version.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,WAAW,CAAA;AACzB,cAAc,oBAAoB,CAAA;AAClC,cAAc,mCAAmC,CAAA;AACjD,cAAc,eAAe,CAAA;AAC7B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,cAAc,CAAA;AAC5B,cAAc,wBAAwB,CAAA;AACtC,OAAO,KAAK,SAAS,MAAM,qBAAqB,CAAA;AAChD,cAAc,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,WAAW,CAAA;AACzB,cAAc,oBAAoB,CAAA;AAClC,cAAc,mCAAmC,CAAA;AACjD,cAAc,eAAe,CAAA;AAC7B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAA;AAC7C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,cAAc,CAAA;AAC5B,cAAc,wBAAwB,CAAA;AACtC,OAAO,KAAK,SAAS,MAAM,qBAAqB,CAAA;AAChD,cAAc,WAAW,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"leader-worker-devtools.d.ts","sourceRoot":"","sources":["../../src/leader-thread/leader-worker-devtools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA6C,MAAM,yBAAyB,CAAA;AAE3F,OAAO,EAAwD,eAAe,EAAE,MAAM,aAAa,CAAA;AAEnG,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,YAAY,CAAA;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAK5C,eAAO,MAAM,YAAY,GAAI,SAAS,eAAe,4IAwCsB,CAAA"}
1
+ {"version":3,"file":"leader-worker-devtools.d.ts","sourceRoot":"","sources":["../../src/leader-thread/leader-worker-devtools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA6C,MAAM,yBAAyB,CAAA;AAG3F,OAAO,EAAwD,eAAe,EAAE,MAAM,aAAa,CAAA;AAEnG,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,YAAY,CAAA;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAK5C,eAAO,MAAM,YAAY,GAAI,SAAS,eAAe,4IAwCsB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { Effect, FiberMap, Option, Stream, SubscriptionRef } from '@livestore/utils/effect';
2
+ import { nanoid } from '@livestore/utils/nanoid';
2
3
  import { Devtools, IntentionalShutdownCause, liveStoreVersion, UnexpectedError } from '../index.js';
3
4
  import { MUTATION_LOG_META_TABLE, SCHEMA_META_TABLE, SCHEMA_MUTATIONS_META_TABLE } from '../schema/mod.js';
4
5
  import { LeaderThreadCtx } from './types.js';
@@ -29,13 +30,26 @@ export const bootDevtools = (options) => Effect.gen(function* () {
29
30
  const listenToDevtools = ({ incomingMessages, sendMessage, persistenceInfo, }) => Effect.gen(function* () {
30
31
  const { syncBackend, makeSqliteDb, dbReadModel, dbMutationLog, shutdownStateSubRef, shutdownChannel, syncProcessor, clientId, devtools, } = yield* LeaderThreadCtx;
31
32
  const subscriptionFiberMap = yield* FiberMap.make();
33
+ const handledRequestIds = new Set();
32
34
  yield* incomingMessages.pipe(Stream.tap((decodedEvent) => Effect.gen(function* () {
33
- // yield* Effect.logDebug('[@livestore/common:leader-thread:devtools] incomingMessage', decodedEvent)
35
+ const { requestId } = decodedEvent;
36
+ const reqPayload = { requestId, liveStoreVersion, clientId };
37
+ // yield* Effect.logDebug(
38
+ // `[@livestore/common:leader-thread:devtools] incomingMessage: ${decodedEvent._tag} (${requestId})`,
39
+ // decodedEvent,
40
+ // )
34
41
  if (decodedEvent._tag === 'LSD.Leader.Disconnect') {
35
42
  return;
36
43
  }
37
- const { requestId } = decodedEvent;
38
- const reqPayload = { requestId, liveStoreVersion, clientId };
44
+ // TODO we should try to move the duplicate message handling on the webmesh layer
45
+ // So far I could only observe this problem with webmesh proxy channels (e.g. for Expo)
46
+ // Proof: https://share.cleanshot.com/V9G87B0B
47
+ // Also see `store/devtools.ts` for same problem
48
+ if (handledRequestIds.has(requestId)) {
49
+ // yield* Effect.logWarning(`Duplicate message`, decodedEvent)
50
+ return;
51
+ }
52
+ handledRequestIds.add(requestId);
39
53
  switch (decodedEvent._tag) {
40
54
  case 'LSD.Leader.Ping': {
41
55
  yield* sendMessage(Devtools.Leader.Pong.make({ ...reqPayload }));
@@ -46,7 +60,7 @@ const listenToDevtools = ({ incomingMessages, sendMessage, persistenceInfo, }) =
46
60
  yield* sendMessage(Devtools.Leader.SnapshotRes.make({ snapshot, ...reqPayload }));
47
61
  return;
48
62
  }
49
- case 'LSD.Leader.LoadDatabaseFileReq': {
63
+ case 'LSD.Leader.LoadDatabaseFile.Request': {
50
64
  const { data } = decodedEvent;
51
65
  let tableNames;
52
66
  try {
@@ -56,28 +70,46 @@ const listenToDevtools = ({ incomingMessages, sendMessage, persistenceInfo, }) =
56
70
  tableNames = new Set(tableNameResults.map((_) => _.name));
57
71
  tmpDb.close();
58
72
  }
59
- catch (e) {
60
- yield* Effect.logError(`Error importing database file`, e);
61
- yield* sendMessage(Devtools.Leader.LoadDatabaseFileRes.make({ ...reqPayload, status: 'unsupported-file' }));
73
+ catch (cause) {
74
+ yield* Effect.logError(`Error importing database file`, cause);
75
+ yield* sendMessage(Devtools.Leader.LoadDatabaseFile.Error.make({
76
+ ...reqPayload,
77
+ cause: { _tag: 'unexpected-error', cause },
78
+ }));
62
79
  return;
63
80
  }
64
- if (tableNames.has(MUTATION_LOG_META_TABLE)) {
65
- yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down');
66
- dbMutationLog.import(data);
67
- dbReadModel.destroy();
68
- }
69
- else if (tableNames.has(SCHEMA_META_TABLE) && tableNames.has(SCHEMA_MUTATIONS_META_TABLE)) {
70
- yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down');
71
- dbReadModel.import(data);
72
- dbMutationLog.destroy();
81
+ try {
82
+ if (tableNames.has(MUTATION_LOG_META_TABLE)) {
83
+ // Is mutation log
84
+ yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down');
85
+ dbMutationLog.import(data);
86
+ dbReadModel.destroy();
87
+ }
88
+ else if (tableNames.has(SCHEMA_META_TABLE) && tableNames.has(SCHEMA_MUTATIONS_META_TABLE)) {
89
+ // Is read model
90
+ yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down');
91
+ dbReadModel.import(data);
92
+ dbMutationLog.destroy();
93
+ }
94
+ else {
95
+ yield* sendMessage(Devtools.Leader.LoadDatabaseFile.Error.make({
96
+ ...reqPayload,
97
+ cause: { _tag: 'unsupported-database' },
98
+ }));
99
+ return;
100
+ }
101
+ yield* sendMessage(Devtools.Leader.LoadDatabaseFile.Success.make({ ...reqPayload }));
102
+ yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-import' })) ?? Effect.void;
103
+ return;
73
104
  }
74
- else {
75
- yield* sendMessage(Devtools.Leader.LoadDatabaseFileRes.make({ ...reqPayload, status: 'unsupported-database' }));
105
+ catch (cause) {
106
+ yield* Effect.logError(`Error importing database file`, cause);
107
+ yield* sendMessage(Devtools.Leader.LoadDatabaseFile.Error.make({
108
+ ...reqPayload,
109
+ cause: { _tag: 'unexpected-error', cause },
110
+ }));
76
111
  return;
77
112
  }
78
- yield* sendMessage(Devtools.Leader.LoadDatabaseFileRes.make({ ...reqPayload, status: 'ok' }));
79
- yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-import' })) ?? Effect.void;
80
- return;
81
113
  }
82
114
  case 'LSD.Leader.ResetAllData.Request': {
83
115
  const { mode } = decodedEvent;
@@ -86,7 +118,7 @@ const listenToDevtools = ({ incomingMessages, sendMessage, persistenceInfo, }) =
86
118
  if (mode === 'all-data') {
87
119
  dbMutationLog.destroy();
88
120
  }
89
- yield* sendMessage(Devtools.Leader.ResetAllData.Response.make({ ...reqPayload }));
121
+ yield* sendMessage(Devtools.Leader.ResetAllData.Success.make({ ...reqPayload }));
90
122
  yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-reset' })) ?? Effect.void;
91
123
  return;
92
124
  }
@@ -120,10 +152,16 @@ const listenToDevtools = ({ incomingMessages, sendMessage, persistenceInfo, }) =
120
152
  return;
121
153
  }
122
154
  case 'LSD.Leader.SyncHistorySubscribe': {
123
- const { requestId } = decodedEvent;
155
+ const { subscriptionId } = decodedEvent;
124
156
  if (syncBackend !== undefined) {
125
157
  // TODO consider piggybacking on the existing leader-thread sync-pulling
126
- yield* syncBackend.pull(Option.none()).pipe(Stream.map((_) => _.batch), Stream.flattenIterables, Stream.tap(({ mutationEventEncoded, metadata }) => sendMessage(Devtools.Leader.SyncHistoryRes.make({ mutationEventEncoded, metadata, ...reqPayload }))), Stream.runDrain, Effect.acquireRelease(() => Effect.log('syncHistorySubscribe done')), Effect.interruptible, Effect.tapCauseLogPretty, FiberMap.run(subscriptionFiberMap, requestId));
158
+ yield* syncBackend.pull(Option.none()).pipe(Stream.map((_) => _.batch), Stream.flattenIterables, Stream.tap(({ mutationEventEncoded, metadata }) => sendMessage(Devtools.Leader.SyncHistoryRes.make({
159
+ mutationEventEncoded,
160
+ metadata,
161
+ subscriptionId,
162
+ ...reqPayload,
163
+ requestId: nanoid(10),
164
+ }))), Stream.runDrain, Effect.interruptible, Effect.tapCauseLogPretty, FiberMap.run(subscriptionFiberMap, subscriptionId));
127
165
  }
128
166
  return;
129
167
  }
@@ -143,15 +181,17 @@ const listenToDevtools = ({ incomingMessages, sendMessage, persistenceInfo, }) =
143
181
  }
144
182
  case 'LSD.Leader.NetworkStatusSubscribe': {
145
183
  if (syncBackend !== undefined) {
146
- const { requestId } = decodedEvent;
184
+ const { subscriptionId } = decodedEvent;
147
185
  // TODO investigate and fix bug. seems that when sending messages right after
148
186
  // the devtools have connected get sometimes lost
149
187
  // This is probably the same "flaky databrowser loading" bug as we're seeing in the playwright tests
150
188
  yield* Effect.sleep(1000);
151
189
  yield* Stream.zipLatest(syncBackend.isConnected.changes, devtools.enabled ? devtools.syncBackendLatchState.changes : Stream.make({ latchClosed: false })).pipe(Stream.tap(([isConnected, { latchClosed }]) => sendMessage(Devtools.Leader.NetworkStatusRes.make({
152
190
  networkStatus: { isConnected, timestampMs: Date.now(), latchClosed },
191
+ subscriptionId,
153
192
  ...reqPayload,
154
- }))), Stream.runDrain, Effect.interruptible, Effect.tapCauseLogPretty, FiberMap.run(subscriptionFiberMap, requestId));
193
+ requestId: nanoid(10),
194
+ }))), Stream.runDrain, Effect.interruptible, Effect.tapCauseLogPretty, FiberMap.run(subscriptionFiberMap, subscriptionId));
155
195
  }
156
196
  return;
157
197
  }
@@ -161,17 +201,19 @@ const listenToDevtools = ({ incomingMessages, sendMessage, persistenceInfo, }) =
161
201
  return;
162
202
  }
163
203
  case 'LSD.Leader.SyncHeadSubscribe': {
164
- const { requestId } = decodedEvent;
204
+ const { subscriptionId } = decodedEvent;
165
205
  yield* syncProcessor.syncState.changes.pipe(Stream.tap((syncState) => sendMessage(Devtools.Leader.SyncHeadRes.make({
166
206
  local: syncState.localHead,
167
207
  upstream: syncState.upstreamHead,
208
+ subscriptionId,
168
209
  ...reqPayload,
169
- }))), Stream.runDrain, Effect.interruptible, Effect.tapCauseLogPretty, FiberMap.run(subscriptionFiberMap, requestId));
210
+ requestId: nanoid(10),
211
+ }))), Stream.runDrain, Effect.interruptible, Effect.tapCauseLogPretty, FiberMap.run(subscriptionFiberMap, subscriptionId));
170
212
  return;
171
213
  }
172
214
  case 'LSD.Leader.SyncHeadUnsubscribe': {
173
- const { requestId } = decodedEvent;
174
- yield* FiberMap.remove(subscriptionFiberMap, requestId);
215
+ const { subscriptionId } = decodedEvent;
216
+ yield* FiberMap.remove(subscriptionFiberMap, subscriptionId);
175
217
  return;
176
218
  }
177
219
  case 'LSD.Leader.SetSyncLatch.Request': {
@@ -185,7 +227,7 @@ const listenToDevtools = ({ incomingMessages, sendMessage, persistenceInfo, }) =
185
227
  yield* devtools.syncBackendLatch.open;
186
228
  }
187
229
  yield* SubscriptionRef.set(devtools.syncBackendLatchState, { latchClosed: closeLatch });
188
- yield* sendMessage(Devtools.Leader.SetSyncLatch.Response.make({ ...reqPayload }));
230
+ yield* sendMessage(Devtools.Leader.SetSyncLatch.Success.make({ ...reqPayload }));
189
231
  return;
190
232
  }
191
233
  default: {