@logixjs/devtools-react 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/dist/DevtoolsLayer.cjs +10 -9
- package/dist/DevtoolsLayer.d.cts +2 -2
- package/dist/DevtoolsLayer.d.ts +2 -2
- package/dist/DevtoolsLayer.js +1 -1
- package/dist/LogixDevtools.cjs +201 -70
- package/dist/LogixDevtools.js +2 -2
- package/dist/{chunk-WTZBDE4J.js → chunk-H5JD2DNC.js} +191 -42
- package/dist/{chunk-FNWHBEXD.js → chunk-NH3EYAZ6.js} +11 -10
- package/dist/index.cjs +201 -51
- package/dist/index.js +2 -2
- package/package.json +10 -4
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
getInstanceLabel,
|
|
9
9
|
hasDevtoolsSnapshotOverride,
|
|
10
10
|
setDevtoolsSnapshotOverride
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-NH3EYAZ6.js";
|
|
12
12
|
import {
|
|
13
13
|
StateTraitGraphView,
|
|
14
14
|
ensureDevtoolsStyles
|
|
@@ -24,14 +24,15 @@ import * as Logix7 from "@logixjs/core";
|
|
|
24
24
|
|
|
25
25
|
// src/internal/ui/hooks/DevtoolsHooks.tsx
|
|
26
26
|
import React, { useSyncExternalStore } from "react";
|
|
27
|
-
import { Effect as
|
|
27
|
+
import { Effect as Effect3, Fiber, Stream as Stream2 } from "effect";
|
|
28
28
|
|
|
29
29
|
// src/internal/state/runtime.ts
|
|
30
30
|
import * as Logix4 from "@logixjs/core";
|
|
31
|
+
import { Effect as Effect2 } from "effect";
|
|
31
32
|
|
|
32
33
|
// src/internal/state/logic.ts
|
|
33
34
|
import * as Logix3 from "@logixjs/core";
|
|
34
|
-
import { Effect, Stream } from "effect";
|
|
35
|
+
import { Effect, Queue, Stream } from "effect";
|
|
35
36
|
|
|
36
37
|
// src/internal/state/compute.ts
|
|
37
38
|
import * as Logix from "@logixjs/core";
|
|
@@ -68,7 +69,7 @@ var OperationSummarySchema = Schema.Struct({
|
|
|
68
69
|
top3: Schema.Array(
|
|
69
70
|
Schema.Struct({
|
|
70
71
|
stepId: Schema.String,
|
|
71
|
-
kind: Schema.
|
|
72
|
+
kind: Schema.Literals(["computed", "link"]),
|
|
72
73
|
fieldPath: Schema.String,
|
|
73
74
|
durationMs: Schema.Number,
|
|
74
75
|
changed: Schema.Boolean,
|
|
@@ -84,7 +85,7 @@ var TriggerLayoutSchema = Schema.Struct({
|
|
|
84
85
|
isDragging: Schema.Boolean
|
|
85
86
|
});
|
|
86
87
|
var DevtoolsSettingsSchema = Schema.Struct({
|
|
87
|
-
mode: Schema.
|
|
88
|
+
mode: Schema.Literals(["basic", "deep"]),
|
|
88
89
|
showTraitEvents: Schema.Boolean,
|
|
89
90
|
showReactRenderEvents: Schema.Boolean,
|
|
90
91
|
enableTimeTravelUI: Schema.Boolean,
|
|
@@ -125,7 +126,7 @@ var DevtoolsStateSchema = Schema.Struct({
|
|
|
125
126
|
moduleId: Schema.String,
|
|
126
127
|
instanceId: Schema.String,
|
|
127
128
|
txnId: Schema.String,
|
|
128
|
-
mode: Schema.
|
|
129
|
+
mode: Schema.Literals(["before", "after"])
|
|
129
130
|
})
|
|
130
131
|
),
|
|
131
132
|
runtimes: Schema.Array(
|
|
@@ -154,7 +155,7 @@ var DevtoolsStateSchema = Schema.Struct({
|
|
|
154
155
|
isDragging: Schema.Boolean,
|
|
155
156
|
trigger: Schema.optional(TriggerLayoutSchema)
|
|
156
157
|
}),
|
|
157
|
-
theme: Schema.
|
|
158
|
+
theme: Schema.Literals(["system", "light", "dark"]),
|
|
158
159
|
settings: DevtoolsSettingsSchema
|
|
159
160
|
});
|
|
160
161
|
var defaultSettings = {
|
|
@@ -224,13 +225,11 @@ var gateDirtyRootPathsByDigest = (meta) => {
|
|
|
224
225
|
}
|
|
225
226
|
const dirtySet = meta.dirtySet;
|
|
226
227
|
if (!isRecord(dirtySet)) return meta;
|
|
227
|
-
if (!
|
|
228
|
+
if (!Object.prototype.hasOwnProperty.call(dirtySet, "rootPaths")) return meta;
|
|
229
|
+
const { rootPaths: _rootPaths, ...dirtySetWithoutRootPaths } = dirtySet;
|
|
228
230
|
return {
|
|
229
231
|
...meta,
|
|
230
|
-
dirtySet:
|
|
231
|
-
...dirtySet,
|
|
232
|
-
rootPaths: void 0
|
|
233
|
-
}
|
|
232
|
+
dirtySet: dirtySetWithoutRootPaths
|
|
234
233
|
};
|
|
235
234
|
};
|
|
236
235
|
var getEventTimestamp = (event) => event.timestamp;
|
|
@@ -761,23 +760,21 @@ var persistSettingsToStorage = (settings) => {
|
|
|
761
760
|
import * as Logix2 from "@logixjs/core";
|
|
762
761
|
import { Schema as Schema2 } from "effect";
|
|
763
762
|
var ResizePayload = Schema2.Struct({
|
|
764
|
-
edge: Schema2.
|
|
763
|
+
edge: Schema2.Literals(["top", "left", "right"])
|
|
764
|
+
});
|
|
765
|
+
var UpdateLayoutPayload = Schema2.Struct({
|
|
766
|
+
height: Schema2.optional(Schema2.Number),
|
|
767
|
+
marginLeft: Schema2.optional(Schema2.Number),
|
|
768
|
+
marginRight: Schema2.optional(Schema2.Number),
|
|
769
|
+
isDragging: Schema2.optional(Schema2.Boolean),
|
|
770
|
+
trigger: Schema2.optional(
|
|
771
|
+
Schema2.Struct({
|
|
772
|
+
x: Schema2.Number,
|
|
773
|
+
y: Schema2.Number,
|
|
774
|
+
isDragging: Schema2.Boolean
|
|
775
|
+
})
|
|
776
|
+
)
|
|
765
777
|
});
|
|
766
|
-
var UpdateLayoutPayload = Schema2.partial(
|
|
767
|
-
Schema2.Struct({
|
|
768
|
-
height: Schema2.Number,
|
|
769
|
-
marginLeft: Schema2.Number,
|
|
770
|
-
marginRight: Schema2.Number,
|
|
771
|
-
isDragging: Schema2.Boolean,
|
|
772
|
-
trigger: Schema2.optional(
|
|
773
|
-
Schema2.Struct({
|
|
774
|
-
x: Schema2.Number,
|
|
775
|
-
y: Schema2.Number,
|
|
776
|
-
isDragging: Schema2.Boolean
|
|
777
|
-
})
|
|
778
|
-
)
|
|
779
|
-
})
|
|
780
|
-
);
|
|
781
778
|
var DevtoolsModule = Logix2.Module.make("LogixDevtoolsModule", {
|
|
782
779
|
state: DevtoolsStateSchema,
|
|
783
780
|
actions: {
|
|
@@ -811,8 +808,8 @@ var DevtoolsModule = Logix2.Module.make("LogixDevtoolsModule", {
|
|
|
811
808
|
clearImportedEvidence: Schema2.Void,
|
|
812
809
|
resizeStart: ResizePayload,
|
|
813
810
|
updateLayout: UpdateLayoutPayload,
|
|
814
|
-
setTheme: Schema2.
|
|
815
|
-
setMode: Schema2.
|
|
811
|
+
setTheme: Schema2.Literals(["system", "light", "dark"]),
|
|
812
|
+
setMode: Schema2.Literals(["basic", "deep"]),
|
|
816
813
|
updateSettings: Schema2.Any
|
|
817
814
|
},
|
|
818
815
|
reducers: {
|
|
@@ -1047,15 +1044,165 @@ var normalizeRuntimeDebugEventRef = (value) => {
|
|
|
1047
1044
|
}
|
|
1048
1045
|
return { ...value, instanceId };
|
|
1049
1046
|
};
|
|
1050
|
-
var
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1047
|
+
var readConvergeFieldPathsByDigest = (summary) => {
|
|
1048
|
+
if (!isRecord2(summary)) return /* @__PURE__ */ new Map();
|
|
1049
|
+
const converge = isRecord2(summary.converge) ? summary.converge : void 0;
|
|
1050
|
+
const byDigest = converge && isRecord2(converge.staticIrByDigest) ? converge.staticIrByDigest : void 0;
|
|
1051
|
+
if (!byDigest) return /* @__PURE__ */ new Map();
|
|
1052
|
+
const out = /* @__PURE__ */ new Map();
|
|
1053
|
+
for (const [digest, ir] of Object.entries(byDigest)) {
|
|
1054
|
+
if (!isRecord2(ir)) continue;
|
|
1055
|
+
const fieldPathsRaw = ir.fieldPaths;
|
|
1056
|
+
if (!Array.isArray(fieldPathsRaw)) continue;
|
|
1057
|
+
const fieldPaths = [];
|
|
1058
|
+
for (const pathRaw of fieldPathsRaw) {
|
|
1059
|
+
if (!Array.isArray(pathRaw) || pathRaw.length === 0) {
|
|
1060
|
+
fieldPaths.length = 0;
|
|
1061
|
+
break;
|
|
1062
|
+
}
|
|
1063
|
+
if (!pathRaw.every((seg) => typeof seg === "string" && seg.length > 0)) {
|
|
1064
|
+
fieldPaths.length = 0;
|
|
1065
|
+
break;
|
|
1066
|
+
}
|
|
1067
|
+
fieldPaths.push(pathRaw);
|
|
1068
|
+
}
|
|
1069
|
+
if (fieldPaths.length > 0) {
|
|
1070
|
+
out.set(digest, fieldPaths);
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
return out;
|
|
1074
|
+
};
|
|
1075
|
+
var isPrefixPath = (prefix, path) => {
|
|
1076
|
+
if (prefix.length > path.length) return false;
|
|
1077
|
+
for (let i = 0; i < prefix.length; i++) {
|
|
1078
|
+
if (prefix[i] !== path[i]) return false;
|
|
1079
|
+
}
|
|
1080
|
+
return true;
|
|
1081
|
+
};
|
|
1082
|
+
var minimizeRootPaths = (paths) => {
|
|
1083
|
+
const roots = [];
|
|
1084
|
+
for (const path of paths) {
|
|
1085
|
+
let redundant = false;
|
|
1086
|
+
for (const existing of roots) {
|
|
1087
|
+
if (isPrefixPath(existing, path)) {
|
|
1088
|
+
redundant = true;
|
|
1089
|
+
break;
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
if (redundant) continue;
|
|
1093
|
+
let nextLen = 0;
|
|
1094
|
+
for (let i = 0; i < roots.length; i++) {
|
|
1095
|
+
const existing = roots[i];
|
|
1096
|
+
if (isPrefixPath(path, existing)) continue;
|
|
1097
|
+
roots[nextLen] = existing;
|
|
1098
|
+
nextLen += 1;
|
|
1099
|
+
}
|
|
1100
|
+
roots.length = nextLen;
|
|
1101
|
+
roots.push(path);
|
|
1102
|
+
}
|
|
1103
|
+
return roots;
|
|
1104
|
+
};
|
|
1105
|
+
var resolveRootPaths = (args) => {
|
|
1106
|
+
const ids = args.ids;
|
|
1107
|
+
if (!Array.isArray(ids) || ids.length === 0) return void 0;
|
|
1108
|
+
const candidates = [];
|
|
1109
|
+
for (const rawId of ids) {
|
|
1110
|
+
if (!Number.isInteger(rawId)) continue;
|
|
1111
|
+
const id = rawId;
|
|
1112
|
+
if (id < 0 || id >= args.fieldPaths.length) continue;
|
|
1113
|
+
candidates.push(args.fieldPaths[id]);
|
|
1114
|
+
}
|
|
1115
|
+
if (candidates.length === 0) return void 0;
|
|
1116
|
+
const minimized = minimizeRootPaths(candidates);
|
|
1117
|
+
return minimized.length > 0 ? minimized : void 0;
|
|
1118
|
+
};
|
|
1119
|
+
var stripRootPathsField = (value) => {
|
|
1120
|
+
const { rootPaths: _rootPaths, ...rest } = value;
|
|
1121
|
+
return rest;
|
|
1122
|
+
};
|
|
1123
|
+
var stripLegacyDirtyRootPathsFromEvent = (event) => {
|
|
1124
|
+
const meta = isRecord2(event.meta) ? event.meta : void 0;
|
|
1125
|
+
if (!meta) return event;
|
|
1126
|
+
if (event.kind === "state" && event.label === "state:update") {
|
|
1127
|
+
const dirtySet = isRecord2(meta.dirtySet) ? meta.dirtySet : void 0;
|
|
1128
|
+
if (!dirtySet || !Object.prototype.hasOwnProperty.call(dirtySet, "rootPaths")) return event;
|
|
1129
|
+
return {
|
|
1130
|
+
...event,
|
|
1131
|
+
meta: {
|
|
1132
|
+
...meta,
|
|
1133
|
+
dirtySet: stripRootPathsField(dirtySet)
|
|
1134
|
+
}
|
|
1135
|
+
};
|
|
1136
|
+
}
|
|
1137
|
+
if (event.kind === "trait:converge") {
|
|
1138
|
+
const dirty = isRecord2(meta.dirty) ? meta.dirty : void 0;
|
|
1139
|
+
if (!dirty || !Object.prototype.hasOwnProperty.call(dirty, "rootPaths")) return event;
|
|
1140
|
+
return {
|
|
1141
|
+
...event,
|
|
1142
|
+
meta: {
|
|
1143
|
+
...meta,
|
|
1144
|
+
dirty: stripRootPathsField(dirty)
|
|
1145
|
+
}
|
|
1146
|
+
};
|
|
1147
|
+
}
|
|
1148
|
+
return event;
|
|
1149
|
+
};
|
|
1150
|
+
var materializeDirtyRootPathsFromCanonical = (args) => {
|
|
1151
|
+
if (args.fieldPathsByDigest.size === 0) return args.event;
|
|
1152
|
+
const meta = isRecord2(args.event.meta) ? args.event.meta : void 0;
|
|
1153
|
+
if (!meta) return args.event;
|
|
1154
|
+
const staticIrDigest = asNonEmptyString(meta.staticIrDigest);
|
|
1155
|
+
if (!staticIrDigest) return args.event;
|
|
1156
|
+
const fieldPaths = args.fieldPathsByDigest.get(staticIrDigest);
|
|
1157
|
+
if (!fieldPaths) return args.event;
|
|
1158
|
+
if (args.event.kind === "state" && args.event.label === "state:update") {
|
|
1159
|
+
const dirtySet = isRecord2(meta.dirtySet) ? meta.dirtySet : void 0;
|
|
1160
|
+
if (!dirtySet) return args.event;
|
|
1161
|
+
const ids = Object.prototype.hasOwnProperty.call(dirtySet, "pathIds") ? dirtySet.pathIds : dirtySet.rootIds;
|
|
1162
|
+
const rootPaths = resolveRootPaths({ ids, fieldPaths });
|
|
1163
|
+
if (!rootPaths) return args.event;
|
|
1164
|
+
return {
|
|
1165
|
+
...args.event,
|
|
1166
|
+
meta: {
|
|
1167
|
+
...meta,
|
|
1168
|
+
dirtySet: {
|
|
1169
|
+
...dirtySet,
|
|
1170
|
+
rootPaths
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
};
|
|
1174
|
+
}
|
|
1175
|
+
if (args.event.kind === "trait:converge") {
|
|
1176
|
+
const dirty = isRecord2(meta.dirty) ? meta.dirty : void 0;
|
|
1177
|
+
if (!dirty) return args.event;
|
|
1178
|
+
const rootPaths = resolveRootPaths({ ids: dirty.rootIds, fieldPaths });
|
|
1179
|
+
if (!rootPaths) return args.event;
|
|
1180
|
+
return {
|
|
1181
|
+
...args.event,
|
|
1182
|
+
meta: {
|
|
1183
|
+
...meta,
|
|
1184
|
+
dirty: {
|
|
1185
|
+
...dirty,
|
|
1186
|
+
rootPaths
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
};
|
|
1190
|
+
}
|
|
1191
|
+
return args.event;
|
|
1192
|
+
};
|
|
1193
|
+
var fromDomEvent = (event) => Stream.callback(
|
|
1194
|
+
(queue) => Effect.gen(function* () {
|
|
1195
|
+
const handler = (e) => {
|
|
1196
|
+
Queue.offerUnsafe(queue, e);
|
|
1197
|
+
};
|
|
1198
|
+
window.addEventListener(event, handler);
|
|
1199
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => window.removeEventListener(event, handler)));
|
|
1200
|
+
})
|
|
1201
|
+
);
|
|
1055
1202
|
var DevtoolsLogic = DevtoolsModule.logic(($) => ({
|
|
1056
1203
|
setup: $.lifecycle.onStart(
|
|
1057
1204
|
Effect.gen(function* () {
|
|
1058
|
-
const snapshotStore = yield* DevtoolsSnapshotStore;
|
|
1205
|
+
const snapshotStore = yield* $.use(DevtoolsSnapshotStore);
|
|
1059
1206
|
const initialSnapshot = yield* snapshotStore.get;
|
|
1060
1207
|
yield* $.state.update(
|
|
1061
1208
|
(prev) => computeDevtoolsState(prev, initialSnapshot, {
|
|
@@ -1066,7 +1213,7 @@ var DevtoolsLogic = DevtoolsModule.logic(($) => ({
|
|
|
1066
1213
|
),
|
|
1067
1214
|
// run section: initialize snapshot subscription + register all onAction watchers and dragging logic.
|
|
1068
1215
|
run: Effect.gen(function* () {
|
|
1069
|
-
const snapshotStore = yield* DevtoolsSnapshotStore;
|
|
1216
|
+
const snapshotStore = yield* $.use(DevtoolsSnapshotStore);
|
|
1070
1217
|
yield* $.on(snapshotStore.changes).runFork(
|
|
1071
1218
|
(snapshot) => $.state.update(
|
|
1072
1219
|
(prev) => computeDevtoolsState(prev, snapshot, {
|
|
@@ -1165,13 +1312,15 @@ var DevtoolsLogic = DevtoolsModule.logic(($) => ({
|
|
|
1165
1312
|
return;
|
|
1166
1313
|
}
|
|
1167
1314
|
const evidence = Logix3.Observability.importEvidencePackage(parsed);
|
|
1315
|
+
const fieldPathsByDigest = readConvergeFieldPathsByDigest(evidence.summary);
|
|
1168
1316
|
const events = [];
|
|
1169
1317
|
for (const envelope of evidence.events) {
|
|
1170
1318
|
if (envelope.type !== "debug:event") continue;
|
|
1171
1319
|
const payload = envelope.payload;
|
|
1172
1320
|
const normalized = normalizeRuntimeDebugEventRef(payload);
|
|
1173
1321
|
if (!normalized) continue;
|
|
1174
|
-
|
|
1322
|
+
const canonicalEvent = stripLegacyDirtyRootPathsFromEvent(normalized);
|
|
1323
|
+
events.push(materializeDirtyRootPathsFromCanonical({ event: canonicalEvent, fieldPathsByDigest }));
|
|
1175
1324
|
}
|
|
1176
1325
|
const snapshot = {
|
|
1177
1326
|
snapshotToken: 0,
|
|
@@ -1263,14 +1412,14 @@ var devtoolsRuntime = Logix4.Runtime.make(DevtoolsImpl, {
|
|
|
1263
1412
|
// so Logic can subscribe to Snapshot changes via Tag.
|
|
1264
1413
|
layer: devtoolsSnapshotLayer
|
|
1265
1414
|
});
|
|
1266
|
-
var devtoolsModuleRuntime = devtoolsRuntime.runSync(DevtoolsModule.tag);
|
|
1415
|
+
var devtoolsModuleRuntime = devtoolsRuntime.runSync(Effect2.service(DevtoolsModule.tag).pipe(Effect2.orDie));
|
|
1267
1416
|
|
|
1268
1417
|
// src/internal/ui/hooks/DevtoolsHooks.tsx
|
|
1269
1418
|
var subscribe = (onStoreChange) => {
|
|
1270
1419
|
const fiber = devtoolsRuntime.runFork(
|
|
1271
1420
|
Stream2.runForEach(
|
|
1272
1421
|
devtoolsModuleRuntime.changes((state) => state),
|
|
1273
|
-
() =>
|
|
1422
|
+
() => Effect3.sync(onStoreChange)
|
|
1274
1423
|
)
|
|
1275
1424
|
);
|
|
1276
1425
|
return () => {
|
|
@@ -1602,9 +1751,9 @@ var makeTraitConvergeOverrideSnippets = (params) => {
|
|
|
1602
1751
|
[moduleId]: patch
|
|
1603
1752
|
}
|
|
1604
1753
|
})})`;
|
|
1605
|
-
const moduleOverride = `Logix.Runtime.setTraitConvergeOverride(runtime, ${stableStringify(moduleId)}, ${stableStringify(
|
|
1754
|
+
const moduleOverride = `await Effect.runPromise(Logix.Runtime.setTraitConvergeOverride(runtime, ${stableStringify(moduleId)}, ${stableStringify(
|
|
1606
1755
|
patch
|
|
1607
|
-
)})`;
|
|
1756
|
+
)}))`;
|
|
1608
1757
|
return [
|
|
1609
1758
|
{
|
|
1610
1759
|
kind: "provider_override",
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// src/internal/snapshot/index.ts
|
|
2
2
|
import * as Logix from "@logixjs/core";
|
|
3
|
-
import {
|
|
4
|
-
var clearDevtoolsEvents =
|
|
3
|
+
import { Effect, Layer, PubSub, ServiceMap, Stream } from "effect";
|
|
4
|
+
var clearDevtoolsEvents = () => {
|
|
5
|
+
Logix.Debug.clearDevtoolsEvents();
|
|
6
|
+
notify();
|
|
7
|
+
};
|
|
5
8
|
var setInstanceLabel = Logix.Debug.setInstanceLabel;
|
|
6
9
|
var getInstanceLabel = Logix.Debug.getInstanceLabel;
|
|
7
10
|
var snapshotOverride;
|
|
@@ -46,7 +49,9 @@ var normalizeDevtoolsSnapshot = (snapshot) => {
|
|
|
46
49
|
};
|
|
47
50
|
var listeners = /* @__PURE__ */ new Set();
|
|
48
51
|
var unsubscribeCore;
|
|
52
|
+
var snapshotPubSub = Effect.runSync(PubSub.unbounded());
|
|
49
53
|
var notify = () => {
|
|
54
|
+
PubSub.publishUnsafe(snapshotPubSub, getDevtoolsSnapshot());
|
|
50
55
|
for (const listener of listeners) {
|
|
51
56
|
listener();
|
|
52
57
|
}
|
|
@@ -88,17 +93,13 @@ var subscribeDevtoolsSnapshot = (listener) => {
|
|
|
88
93
|
};
|
|
89
94
|
var subscribeDevtoolsSnapshotToken = subscribeDevtoolsSnapshot;
|
|
90
95
|
var devtoolsLayer = Logix.Debug.devtoolsHubLayer();
|
|
91
|
-
var DevtoolsSnapshotStore = class extends
|
|
96
|
+
var DevtoolsSnapshotStore = class extends ServiceMap.Service()(
|
|
97
|
+
"Logix/DevtoolsSnapshotStore"
|
|
98
|
+
) {
|
|
92
99
|
};
|
|
93
100
|
var devtoolsSnapshotService = {
|
|
94
101
|
get: Effect.sync(() => getDevtoolsSnapshot()),
|
|
95
|
-
changes: Stream.
|
|
96
|
-
const listener = () => {
|
|
97
|
-
emit.single(getDevtoolsSnapshot());
|
|
98
|
-
};
|
|
99
|
-
const unsubscribe = subscribeDevtoolsSnapshot(listener);
|
|
100
|
-
return Effect.sync(unsubscribe);
|
|
101
|
-
})
|
|
102
|
+
changes: Stream.fromPubSub(snapshotPubSub)
|
|
102
103
|
};
|
|
103
104
|
var devtoolsSnapshotLayer = Layer.succeed(
|
|
104
105
|
DevtoolsSnapshotStore,
|