svelte-effect-runtime 4.0.0 → 4.0.1
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/.dist/chunks/client-BrZka6DW.js +530 -0
- package/.dist/chunks/client-BrZka6DW.js.map +1 -0
- package/.dist/chunks/compiler-COVzgLYo.js +412 -0
- package/.dist/chunks/compiler-COVzgLYo.js.map +1 -0
- package/.dist/chunks/descriptors-B4otDlm1.js +216 -0
- package/.dist/chunks/descriptors-B4otDlm1.js.map +1 -0
- package/.dist/chunks/diagnostics-BDrky-Di.js +359 -0
- package/.dist/chunks/diagnostics-BDrky-Di.js.map +1 -0
- package/.dist/chunks/dispatcher-BA0PLQhA.js +16 -0
- package/.dist/chunks/dispatcher-BA0PLQhA.js.map +1 -0
- package/.dist/chunks/{dispatcher-DOx8iC6r.js → dispatcher-_x0MQZBS.js} +84 -258
- package/.dist/chunks/dispatcher-_x0MQZBS.js.map +1 -0
- package/.dist/chunks/{errors-IJjsUwrE.js → errors-CLsbGjIa.js} +39 -44
- package/.dist/chunks/errors-CLsbGjIa.js.map +1 -0
- package/.dist/chunks/live-BundLSoY.js +146 -0
- package/.dist/chunks/live-BundLSoY.js.map +1 -0
- package/.dist/chunks/live-CHK0RrZu.js +10 -0
- package/.dist/chunks/live-CHK0RrZu.js.map +1 -0
- package/.dist/chunks/{remote-client-CVI4t66c.js → remote-client-mkQAfP1G.js} +29 -23
- package/.dist/chunks/remote-client-mkQAfP1G.js.map +1 -0
- package/.dist/chunks/{runtime-GBQz32DZ.js → runtime-HDTlEnzp.js} +3 -27
- package/.dist/chunks/runtime-HDTlEnzp.js.map +1 -0
- package/.dist/chunks/{server-D1LcDnZE.js → server-BNrA1I-u.js} +15 -84
- package/.dist/chunks/server-BNrA1I-u.js.map +1 -0
- package/.dist/chunks/source-scan-9pZxnfct.js +1059 -0
- package/.dist/chunks/source-scan-9pZxnfct.js.map +1 -0
- package/.dist/chunks/{transform-jNUr65K9.js → transform-BXyYUAez.js} +184 -358
- package/.dist/chunks/transform-BXyYUAez.js.map +1 -0
- package/.dist/compiler/markup-identifiers.d.ts +2 -0
- package/.dist/compiler/remote-client.d.ts +1 -19
- package/.dist/compiler/source-scan.d.ts +11 -108
- package/.dist/compiler/sveltekit-remote-bridge.d.ts +3 -0
- package/.dist/compiler.d.ts +6 -0
- package/.dist/compiler.js +1 -1
- package/.dist/detect.d.ts +0 -31
- package/.dist/detect.js +0 -39
- package/.dist/detect.js.map +1 -1
- package/.dist/diagnostics.d.ts +0 -16
- package/.dist/dispatcher/deps.d.ts +3 -14
- package/.dist/dispatcher/fibers.d.ts +5 -46
- package/.dist/dispatcher/index.d.ts +1 -143
- package/.dist/dispatcher/types.d.ts +0 -151
- package/.dist/dispatcher.js +1 -1
- package/.dist/errors.d.ts +30 -42
- package/.dist/generated/dispatcher.d.ts +0 -50
- package/.dist/generators.d.ts +1 -12
- package/.dist/internal/descriptors.d.ts +0 -16
- package/.dist/internal/generators.js +13 -8
- package/.dist/internal/generators.js.map +1 -1
- package/.dist/internal/live.d.ts +9 -0
- package/.dist/internal/remote-client.js +2 -2
- package/.dist/internal/remote-server.js +2 -2
- package/.dist/internal/schema.d.ts +0 -54
- package/.dist/live.d.ts +9 -26
- package/.dist/markup/event-attributes.d.ts +0 -32
- package/.dist/markup/promise.d.ts +1 -23
- package/.dist/markup/promise.js +2 -18
- package/.dist/markup/promise.js.map +1 -1
- package/.dist/markup/run.d.ts +1 -10
- package/.dist/markup/run.js +2 -11
- package/.dist/markup/run.js.map +1 -1
- package/.dist/markup/transform/apply.d.ts +4 -4
- package/.dist/markup/transform/classify.d.ts +2 -11
- package/.dist/markup/transform/constants.d.ts +1 -1
- package/.dist/markup/transform/effect-bindings.d.ts +2 -26
- package/.dist/markup/transform/effect-callbacks.d.ts +0 -20
- package/.dist/markup/transform/emit.d.ts +2 -11
- package/.dist/markup/transform/expressions.d.ts +0 -35
- package/.dist/markup/transform/scan.d.ts +3 -22
- package/.dist/markup/transform/types.d.ts +1 -129
- package/.dist/markup/transform.js +1 -1
- package/.dist/markup/value.d.ts +1 -18
- package/.dist/markup/value.js +2 -19
- package/.dist/markup/value.js.map +1 -1
- package/.dist/mod.d.ts +3 -8
- package/.dist/mod.js +5 -5
- package/.dist/mod.js.map +1 -1
- package/.dist/remote/cause-codec.d.ts +3 -37
- package/.dist/remote/client/command.d.ts +3 -17
- package/.dist/remote/client/form-data.d.ts +0 -7
- package/.dist/remote/client/form-enhance.d.ts +0 -7
- package/.dist/remote/client/form-transport.d.ts +14 -20
- package/.dist/remote/client/form.d.ts +4 -24
- package/.dist/remote/client/index.d.ts +2 -1
- package/.dist/remote/client/prerender.d.ts +6 -0
- package/.dist/remote/client/query-result.d.ts +2 -14
- package/.dist/remote/client/query.d.ts +8 -48
- package/.dist/remote/client/responses.d.ts +3 -27
- package/.dist/remote/client/types.d.ts +16 -110
- package/.dist/remote/client/utils.d.ts +0 -8
- package/.dist/remote/client.d.ts +2 -2
- package/.dist/remote/client.js +2 -2
- package/.dist/remote/effect.d.ts +6 -0
- package/.dist/remote/failures.d.ts +4 -0
- package/.dist/remote/query-update.d.ts +2 -0
- package/.dist/remote/resource.d.ts +25 -0
- package/.dist/remote/server.d.ts +5 -50
- package/.dist/remote/server.js +2 -2
- package/.dist/remote/shared.d.ts +6 -145
- package/.dist/remote/shared.js +6 -127
- package/.dist/remote/shared.js.map +1 -1
- package/.dist/runtime/transform.js +5 -22
- package/.dist/runtime/transform.js.map +1 -1
- package/.dist/script-transform/ast.d.ts +0 -46
- package/.dist/script-transform/imports.d.ts +0 -38
- package/.dist/script-transform/lower.d.ts +0 -9
- package/.dist/script-transform/runes.d.ts +0 -10
- package/.dist/script-transform/runtime-block.d.ts +0 -17
- package/.dist/script-transform/source.d.ts +0 -24
- package/.dist/script-transform/types.d.ts +1 -126
- package/.dist/server/effects.d.ts +4 -53
- package/.dist/server/factories.d.ts +7 -7
- package/.dist/server/index.d.ts +1 -1
- package/.dist/server/invalid.d.ts +0 -7
- package/.dist/server/live-snapshot.d.ts +5 -0
- package/.dist/server/remote-handler-context.d.ts +5 -0
- package/.dist/server/runtime.d.ts +6 -24
- package/.dist/server/schema.d.ts +0 -14
- package/.dist/server/transport.d.ts +2 -0
- package/.dist/server/types.d.ts +49 -26
- package/.dist/server/wrappers.d.ts +3 -40
- package/.dist/server.d.ts +1 -1
- package/.dist/server.js +200 -215
- package/.dist/server.js.map +1 -1
- package/.dist/yieldable.d.ts +1 -35
- package/package.json +2 -2
- package/.dist/chunks/client-DcZUV4rR.js +0 -653
- package/.dist/chunks/client-DcZUV4rR.js.map +0 -1
- package/.dist/chunks/compiler-BBPNyXmQ.js +0 -460
- package/.dist/chunks/compiler-BBPNyXmQ.js.map +0 -1
- package/.dist/chunks/dispatcher-DOx8iC6r.js.map +0 -1
- package/.dist/chunks/dispatcher-H-Ia0Os4.js +0 -47
- package/.dist/chunks/dispatcher-H-Ia0Os4.js.map +0 -1
- package/.dist/chunks/errors-IJjsUwrE.js.map +0 -1
- package/.dist/chunks/live-BXAKre_4.js +0 -104
- package/.dist/chunks/live-BXAKre_4.js.map +0 -1
- package/.dist/chunks/remote-client-CVI4t66c.js.map +0 -1
- package/.dist/chunks/runtime-GBQz32DZ.js.map +0 -1
- package/.dist/chunks/schema-D9pct6Y5.js +0 -89
- package/.dist/chunks/schema-D9pct6Y5.js.map +0 -1
- package/.dist/chunks/server-D1LcDnZE.js.map +0 -1
- package/.dist/chunks/source-scan-C4PsggID.js +0 -341
- package/.dist/chunks/source-scan-C4PsggID.js.map +0 -1
- package/.dist/chunks/transform-jNUr65K9.js.map +0 -1
- package/.dist/remote/client/effect.d.ts +0 -29
- package/.dist/remote/client/failures.d.ts +0 -42
|
@@ -1,78 +1,59 @@
|
|
|
1
|
-
import { a as DispatcherDisposedError,
|
|
1
|
+
import { a as DispatcherDisposedError, b as RuntimeAlreadyInitializedError } from "./errors-CLsbGjIa.js";
|
|
2
2
|
import { Cause, Effect, Exit, Fiber, Layer, ManagedRuntime } from "effect";
|
|
3
3
|
import { createSubscriber } from "svelte/reactivity";
|
|
4
4
|
import { isRedirect } from "@sveltejs/kit";
|
|
5
5
|
//#region src/dispatcher/fibers.ts
|
|
6
|
-
|
|
7
|
-
*
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
* @example
|
|
28
|
-
* ```ts
|
|
29
|
-
* watch_fiber_exit({ runtime, fiber, on_complete: cleanup });
|
|
30
|
-
* ```
|
|
31
|
-
*
|
|
32
|
-
* @since 2.0.0
|
|
33
|
-
* @param options - Runtime, fiber, and callbacks used for the watcher.
|
|
34
|
-
* @returns Nothing.
|
|
35
|
-
* @internal
|
|
36
|
-
*/
|
|
37
|
-
function watch_fiber_exit(options) {
|
|
38
|
-
const { runtime, fiber, on_complete, on_success, on_failure, surface_failure = true } = options;
|
|
39
|
-
runtime.runFork(Effect.flatMap(Fiber.await(fiber), (exit) => Effect.sync(() => {
|
|
40
|
-
if (Exit.isSuccess(exit)) {
|
|
41
|
-
on_success?.(exit.value);
|
|
6
|
+
const InterruptFiber = (fiber) => Effect.gen(function* () {
|
|
7
|
+
yield* Fiber.interrupt(fiber);
|
|
8
|
+
});
|
|
9
|
+
/** Observes fiber completion and surfaces failures without taking ownership of the fiber. */
|
|
10
|
+
const WatchFiberExit = (options) => {
|
|
11
|
+
const { fiber, on_complete, on_success, on_failure, surface_failure = true } = options;
|
|
12
|
+
return Effect.gen(function* () {
|
|
13
|
+
const exit = yield* Fiber.await(fiber);
|
|
14
|
+
yield* Effect.sync(() => {
|
|
15
|
+
if (Exit.isSuccess(exit)) {
|
|
16
|
+
on_success?.(exit.value);
|
|
17
|
+
on_complete?.();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (!Cause.hasInterruptsOnly(exit.cause)) {
|
|
21
|
+
const error = Cause.squash(exit.cause);
|
|
22
|
+
on_failure?.(error);
|
|
23
|
+
if (surface_failure) queueMicrotask(() => {
|
|
24
|
+
throw error;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
42
27
|
on_complete?.();
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const error = Cause.squash(exit.cause);
|
|
47
|
-
on_failure?.(error);
|
|
48
|
-
if (surface_failure) queueMicrotask(() => {
|
|
49
|
-
throw error;
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
on_complete?.();
|
|
53
|
-
})));
|
|
54
|
-
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
};
|
|
55
31
|
//#endregion
|
|
56
32
|
//#region src/dispatcher/deps.ts
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
let
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
33
|
+
function make_dependency_hasher() {
|
|
34
|
+
const object_dep_ids = /* @__PURE__ */ new WeakMap();
|
|
35
|
+
const symbol_dep_ids = /* @__PURE__ */ new Map();
|
|
36
|
+
let next_object_dep_id = 0;
|
|
37
|
+
let next_symbol_dep_id = 0;
|
|
38
|
+
const hash_symbol_dep = (dep) => {
|
|
39
|
+
let id = symbol_dep_ids.get(dep);
|
|
40
|
+
if (id === void 0) {
|
|
41
|
+
next_symbol_dep_id += 1;
|
|
42
|
+
id = next_symbol_dep_id;
|
|
43
|
+
symbol_dep_ids.set(dep, id);
|
|
44
|
+
}
|
|
45
|
+
return `y:${id}`;
|
|
46
|
+
};
|
|
47
|
+
const hash_object_dep = (dep) => {
|
|
48
|
+
let id = object_dep_ids.get(dep);
|
|
49
|
+
if (id === void 0) {
|
|
50
|
+
next_object_dep_id += 1;
|
|
51
|
+
id = next_object_dep_id;
|
|
52
|
+
object_dep_ids.set(dep, id);
|
|
53
|
+
}
|
|
54
|
+
return `o:${id}`;
|
|
55
|
+
};
|
|
56
|
+
const hash_dep = (dep) => {
|
|
76
57
|
if (dep === null) return "l:null";
|
|
77
58
|
if (dep === void 0) return "u:undefined";
|
|
78
59
|
const type = typeof dep;
|
|
@@ -82,40 +63,12 @@ function hash_deps(deps) {
|
|
|
82
63
|
if (type === "boolean") return dep ? "t:true" : "f:false";
|
|
83
64
|
if (type === "symbol") return hash_symbol_dep(dep);
|
|
84
65
|
return hash_object_dep(dep);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
function hash_symbol_dep(dep) {
|
|
89
|
-
let id = symbol_dep_ids.get(dep);
|
|
90
|
-
if (id === void 0) {
|
|
91
|
-
next_symbol_dep_id += 1;
|
|
92
|
-
id = next_symbol_dep_id;
|
|
93
|
-
symbol_dep_ids.set(dep, id);
|
|
94
|
-
}
|
|
95
|
-
return `y:${id}`;
|
|
96
|
-
}
|
|
97
|
-
function hash_object_dep(dep) {
|
|
98
|
-
let id = object_dep_ids.get(dep);
|
|
99
|
-
if (id === void 0) {
|
|
100
|
-
next_object_dep_id += 1;
|
|
101
|
-
id = next_object_dep_id;
|
|
102
|
-
object_dep_ids.set(dep, id);
|
|
103
|
-
}
|
|
104
|
-
return `o:${id}`;
|
|
66
|
+
};
|
|
67
|
+
const hash_deps = (deps) => JSON.stringify(deps.map(hash_dep));
|
|
68
|
+
return hash_deps;
|
|
105
69
|
}
|
|
106
70
|
//#endregion
|
|
107
71
|
//#region src/dispatcher/types.ts
|
|
108
|
-
/**
|
|
109
|
-
* Stable operation codes used by transform-generated dispatcher events.
|
|
110
|
-
*
|
|
111
|
-
* @example
|
|
112
|
-
* ```ts
|
|
113
|
-
* const type = Code.Markup.Promise;
|
|
114
|
-
* ```
|
|
115
|
-
*
|
|
116
|
-
* @since 3.3.0
|
|
117
|
-
* @internal
|
|
118
|
-
*/
|
|
119
72
|
const Code = { Markup: {
|
|
120
73
|
Promise: "MarkupPromise",
|
|
121
74
|
Run: "MarkupRun",
|
|
@@ -123,30 +76,11 @@ const Code = { Markup: {
|
|
|
123
76
|
} };
|
|
124
77
|
//#endregion
|
|
125
78
|
//#region src/dispatcher/index.ts
|
|
126
|
-
/**
|
|
127
|
-
* Unified effect block dispatcher. Manages the fiber lifecycle of every
|
|
128
|
-
* effect block and wires results into reactive channels.
|
|
129
|
-
*
|
|
130
|
-
* @example
|
|
131
|
-
* ```ts
|
|
132
|
-
* const dispatcher = new Dispatcher();
|
|
133
|
-
* const cancel = dispatcher.fork(Effect.log("running"));
|
|
134
|
-
* cancel();
|
|
135
|
-
* ```
|
|
136
|
-
*
|
|
137
|
-
* @since 2.0.0
|
|
138
|
-
* @internal
|
|
139
|
-
*/
|
|
140
79
|
var Dispatcher = class Dispatcher {
|
|
141
|
-
/** The underlying Effect runtime that executes forked programs. */
|
|
142
80
|
#runtime;
|
|
143
|
-
/** Active fibers keyed by cache id or generated fork id. */
|
|
144
81
|
#fibers = /* @__PURE__ */ new Map();
|
|
145
|
-
/** Reactive value cells keyed by value cache id. */
|
|
146
82
|
#value_cells = /* @__PURE__ */ new Map();
|
|
147
|
-
/** Notifies subscribed Svelte template effects when value cells change. */
|
|
148
83
|
#notify_value_cells = () => {};
|
|
149
|
-
/** Subscribes the current Svelte tracking scope to value cell changes. */
|
|
150
84
|
#subscribe_value_cells = createSubscriber((update) => {
|
|
151
85
|
this.#notify_value_cells = update;
|
|
152
86
|
return () => {
|
|
@@ -154,29 +88,12 @@ var Dispatcher = class Dispatcher {
|
|
|
154
88
|
this.#notify_value_cells = () => {};
|
|
155
89
|
};
|
|
156
90
|
});
|
|
157
|
-
/** Pending promises keyed by promise cache id. */
|
|
158
91
|
#promise_values = /* @__PURE__ */ new Map();
|
|
159
|
-
/** Current cache key per value block id. */
|
|
160
92
|
#value_ids = /* @__PURE__ */ new Map();
|
|
161
|
-
/** Current cache key per promise block id. */
|
|
162
93
|
#promise_ids = /* @__PURE__ */ new Map();
|
|
163
|
-
|
|
94
|
+
#hash_deps = make_dependency_hasher();
|
|
164
95
|
#disposed = false;
|
|
165
|
-
/** Monotonically increasing counter for unnamed fiber keys. */
|
|
166
96
|
#next_fiber_id = 0;
|
|
167
|
-
/**
|
|
168
|
-
* Creates a dispatcher with an optional layer and installs it as the global
|
|
169
|
-
* singleton returned by {@link get_dispatcher}.
|
|
170
|
-
*
|
|
171
|
-
* @example
|
|
172
|
-
* ```ts
|
|
173
|
-
* const dispatcher = Dispatcher.make(Db.Live);
|
|
174
|
-
* ```
|
|
175
|
-
*
|
|
176
|
-
* @since 2.0.0
|
|
177
|
-
* @param layer - Optional Effect layer to provide to the runtime.
|
|
178
|
-
* @returns The newly created dispatcher.
|
|
179
|
-
*/
|
|
180
97
|
static make(layer) {
|
|
181
98
|
if (current_dispatcher) throw new RuntimeAlreadyInitializedError("ClientRuntime");
|
|
182
99
|
const runtime = ManagedRuntime.make(layer ?? Layer.empty);
|
|
@@ -184,18 +101,6 @@ var Dispatcher = class Dispatcher {
|
|
|
184
101
|
current_dispatcher = dispatcher;
|
|
185
102
|
return dispatcher;
|
|
186
103
|
}
|
|
187
|
-
/**
|
|
188
|
-
* Creates a dispatcher backed by the provided managed runtime.
|
|
189
|
-
*
|
|
190
|
-
* @example
|
|
191
|
-
* ```ts
|
|
192
|
-
* const dispatcher = new Dispatcher(runtime);
|
|
193
|
-
* ```
|
|
194
|
-
*
|
|
195
|
-
* @since 2.0.0
|
|
196
|
-
* @param runtime - Managed runtime to use, or an empty-layer runtime when
|
|
197
|
-
* omitted.
|
|
198
|
-
*/
|
|
199
104
|
constructor(runtime) {
|
|
200
105
|
this.#runtime = runtime ?? ManagedRuntime.make(Layer.empty);
|
|
201
106
|
}
|
|
@@ -206,48 +111,23 @@ var Dispatcher = class Dispatcher {
|
|
|
206
111
|
case Code.Markup.Run: return this.#emit_markup_run(event);
|
|
207
112
|
}
|
|
208
113
|
}
|
|
209
|
-
/**
|
|
210
|
-
* Forks an effect as a managed fiber and returns a cleanup function.
|
|
211
|
-
*
|
|
212
|
-
* @example
|
|
213
|
-
* ```ts
|
|
214
|
-
* const dispose = dispatcher.fork(Effect.log("clicked"));
|
|
215
|
-
* ```
|
|
216
|
-
*
|
|
217
|
-
* @since 2.0.0
|
|
218
|
-
* @param effect - Effect to fork.
|
|
219
|
-
* @returns A function that interrupts the fiber.
|
|
220
|
-
*/
|
|
221
114
|
fork(effect) {
|
|
222
115
|
if (this.#disposed) return () => {};
|
|
223
116
|
const fiber = this.#runtime.runFork(effect);
|
|
224
117
|
const key = `fork:${this.#next_fiber_id}`;
|
|
225
118
|
this.#next_fiber_id += 1;
|
|
226
119
|
this.#fibers.set(key, fiber);
|
|
227
|
-
|
|
228
|
-
runtime: this.#runtime,
|
|
120
|
+
this.#runtime.runFork(WatchFiberExit({
|
|
229
121
|
fiber,
|
|
230
122
|
on_complete: () => this.#fibers.delete(key)
|
|
231
|
-
});
|
|
123
|
+
}));
|
|
232
124
|
let disposed = false;
|
|
233
125
|
return () => {
|
|
234
126
|
if (disposed) return;
|
|
235
127
|
disposed = true;
|
|
236
|
-
|
|
128
|
+
this.#runtime.runFork(InterruptFiber(fiber));
|
|
237
129
|
};
|
|
238
130
|
}
|
|
239
|
-
/**
|
|
240
|
-
* Forks an effect and exposes its result as a cached reactive value.
|
|
241
|
-
*
|
|
242
|
-
* @example
|
|
243
|
-
* ```ts
|
|
244
|
-
* const user = dispatcher.value({ id, deps, fallback, factory });
|
|
245
|
-
* ```
|
|
246
|
-
*
|
|
247
|
-
* @since 2.0.0
|
|
248
|
-
* @param options - Value id, dependency array, fallback, and effect factory.
|
|
249
|
-
* @returns The cached value if resolved, otherwise the fallback.
|
|
250
|
-
*/
|
|
251
131
|
value(options) {
|
|
252
132
|
if (this.#disposed) return options.fallback;
|
|
253
133
|
const cache_key = this.#make_value_cache_key(options.id, options.deps);
|
|
@@ -264,18 +144,6 @@ var Dispatcher = class Dispatcher {
|
|
|
264
144
|
if (cell?.status === "failure") throw cell.error;
|
|
265
145
|
return options.fallback;
|
|
266
146
|
}
|
|
267
|
-
/**
|
|
268
|
-
* Forks an effect and exposes its completion as a cached promise.
|
|
269
|
-
*
|
|
270
|
-
* @example
|
|
271
|
-
* ```ts
|
|
272
|
-
* const promise = dispatcher.promise({ id, deps, factory });
|
|
273
|
-
* ```
|
|
274
|
-
*
|
|
275
|
-
* @since 2.0.0
|
|
276
|
-
* @param options - Promise id, dependency array, and effect factory.
|
|
277
|
-
* @returns A promise that resolves with the effect result.
|
|
278
|
-
*/
|
|
279
147
|
promise(options) {
|
|
280
148
|
if (this.#disposed) return Promise.reject(new DispatcherDisposedError());
|
|
281
149
|
const cache_key = this.#make_promise_cache_key(options.id, options.deps);
|
|
@@ -291,32 +159,22 @@ var Dispatcher = class Dispatcher {
|
|
|
291
159
|
this.#promise_values.set(cache_key, promise);
|
|
292
160
|
return promise;
|
|
293
161
|
}
|
|
294
|
-
/**
|
|
295
|
-
* Runs an event-handler effect and surfaces failures to Svelte.
|
|
296
|
-
*
|
|
297
|
-
* @example
|
|
298
|
-
* ```ts
|
|
299
|
-
* await dispatcher.run(Effect.log("submit"));
|
|
300
|
-
* ```
|
|
301
|
-
*
|
|
302
|
-
* @since 2.0.0
|
|
303
|
-
* @param effect - Effect to execute.
|
|
304
|
-
* @returns A promise that resolves or rejects when the effect completes.
|
|
305
|
-
*/
|
|
306
162
|
run(effect) {
|
|
307
163
|
if (this.#disposed) return Promise.reject(new DispatcherDisposedError());
|
|
308
|
-
const
|
|
309
|
-
|
|
310
|
-
const result = exit;
|
|
164
|
+
const Program = Effect.gen(function* () {
|
|
165
|
+
const result = yield* Effect.exit(effect);
|
|
311
166
|
if (Exit.isSuccess(result)) return result.value;
|
|
312
167
|
if (Cause.hasInterruptsOnly(result.cause)) return;
|
|
313
168
|
const error = Cause.squash(result.cause);
|
|
314
169
|
if (isRedirect(error)) return;
|
|
315
|
-
|
|
316
|
-
|
|
170
|
+
yield* Effect.sync(() => {
|
|
171
|
+
queueMicrotask(() => {
|
|
172
|
+
throw error;
|
|
173
|
+
});
|
|
317
174
|
});
|
|
318
|
-
|
|
175
|
+
return yield* Effect.fail(error);
|
|
319
176
|
});
|
|
177
|
+
return this.#runtime.runPromise(Program);
|
|
320
178
|
}
|
|
321
179
|
#emit_markup_value(event) {
|
|
322
180
|
if (this.#is_server_render()) return event.fallback;
|
|
@@ -342,20 +200,9 @@ var Dispatcher = class Dispatcher {
|
|
|
342
200
|
const Program = Effect.gen(event.fn);
|
|
343
201
|
return this.run(Program);
|
|
344
202
|
}
|
|
345
|
-
/**
|
|
346
|
-
* Cancels all running fibers and releases cached values.
|
|
347
|
-
*
|
|
348
|
-
* @example
|
|
349
|
-
* ```ts
|
|
350
|
-
* dispatcher.dispose();
|
|
351
|
-
* ```
|
|
352
|
-
*
|
|
353
|
-
* @since 2.0.0
|
|
354
|
-
* @returns Nothing.
|
|
355
|
-
*/
|
|
356
203
|
dispose() {
|
|
357
204
|
this.#disposed = true;
|
|
358
|
-
for (const fiber of this.#fibers.values())
|
|
205
|
+
for (const fiber of this.#fibers.values()) this.#runtime.runFork(InterruptFiber(fiber));
|
|
359
206
|
this.#fibers.clear();
|
|
360
207
|
this.#clear_value_cells();
|
|
361
208
|
this.#promise_values.clear();
|
|
@@ -368,10 +215,10 @@ var Dispatcher = class Dispatcher {
|
|
|
368
215
|
});
|
|
369
216
|
}
|
|
370
217
|
#make_value_cache_key(id, deps) {
|
|
371
|
-
return `value:${id}::${hash_deps(deps)}`;
|
|
218
|
+
return `value:${id}::${this.#hash_deps(deps)}`;
|
|
372
219
|
}
|
|
373
220
|
#make_promise_cache_key(id, deps) {
|
|
374
|
-
return `promise:${id}::${hash_deps(deps)}`;
|
|
221
|
+
return `promise:${id}::${this.#hash_deps(deps)}`;
|
|
375
222
|
}
|
|
376
223
|
#is_server_render() {
|
|
377
224
|
return typeof document === "undefined";
|
|
@@ -379,7 +226,7 @@ var Dispatcher = class Dispatcher {
|
|
|
379
226
|
#interrupt_cached_fiber(cache_key) {
|
|
380
227
|
const old_fiber = this.#fibers.get(cache_key);
|
|
381
228
|
if (!old_fiber) return;
|
|
382
|
-
|
|
229
|
+
this.#runtime.runFork(InterruptFiber(old_fiber));
|
|
383
230
|
this.#fibers.delete(cache_key);
|
|
384
231
|
return old_fiber;
|
|
385
232
|
}
|
|
@@ -400,30 +247,33 @@ var Dispatcher = class Dispatcher {
|
|
|
400
247
|
fiber
|
|
401
248
|
});
|
|
402
249
|
});
|
|
403
|
-
|
|
404
|
-
runtime: this.#runtime,
|
|
250
|
+
this.#runtime.runFork(WatchFiberExit({
|
|
405
251
|
fiber,
|
|
406
252
|
surface_failure: false,
|
|
407
253
|
on_complete: () => this.#complete_fiber(cache_key, fiber),
|
|
408
254
|
on_success: (value) => this.#publish_value_success(cache_key, fiber, value),
|
|
409
255
|
on_failure: (error) => this.#publish_value_failure(cache_key, fiber, error)
|
|
410
|
-
});
|
|
256
|
+
}));
|
|
411
257
|
}
|
|
412
258
|
#start_promise_fiber(cache_key, options) {
|
|
413
259
|
const Program = Effect.gen(function* () {
|
|
414
260
|
return yield* Effect.gen(options.factory);
|
|
415
261
|
});
|
|
416
262
|
const fiber = this.#runtime.runFork(Program);
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
263
|
+
const ReleaseFiber = Effect.sync(() => {
|
|
264
|
+
if (!this.#is_current_fiber(cache_key, fiber)) return;
|
|
265
|
+
this.#fibers.delete(cache_key);
|
|
266
|
+
this.#promise_values.delete(cache_key);
|
|
267
|
+
if (this.#promise_ids.get(options.id) === cache_key) this.#promise_ids.delete(options.id);
|
|
268
|
+
});
|
|
269
|
+
const AwaitFiber = Effect.gen(function* () {
|
|
270
|
+
const exit = yield* Fiber.await(fiber);
|
|
271
|
+
yield* ReleaseFiber;
|
|
424
272
|
if (Exit.isSuccess(exit)) return exit.value;
|
|
425
|
-
|
|
426
|
-
})
|
|
273
|
+
return yield* Effect.fail(Cause.squash(exit.cause));
|
|
274
|
+
});
|
|
275
|
+
this.#fibers.set(cache_key, fiber);
|
|
276
|
+
return this.#runtime.runPromise(AwaitFiber);
|
|
427
277
|
}
|
|
428
278
|
#clear_pending_value_cell(cache_key, fiber) {
|
|
429
279
|
const cell = this.#value_cells.get(cache_key);
|
|
@@ -467,34 +317,10 @@ var Dispatcher = class Dispatcher {
|
|
|
467
317
|
}
|
|
468
318
|
};
|
|
469
319
|
let current_dispatcher = null;
|
|
470
|
-
/**
|
|
471
|
-
* Resolves the active dispatcher, creating a default one if necessary.
|
|
472
|
-
*
|
|
473
|
-
* @example
|
|
474
|
-
* ```ts
|
|
475
|
-
* const dispatcher = get_dispatcher();
|
|
476
|
-
* ```
|
|
477
|
-
*
|
|
478
|
-
* @since 2.0.0
|
|
479
|
-
* @returns The active dispatcher singleton.
|
|
480
|
-
* @internal
|
|
481
|
-
*/
|
|
482
320
|
function get_dispatcher() {
|
|
483
321
|
current_dispatcher ??= new Dispatcher();
|
|
484
322
|
return current_dispatcher;
|
|
485
323
|
}
|
|
486
|
-
/**
|
|
487
|
-
* Resets the internal singleton dispatcher used by source-level tests.
|
|
488
|
-
*
|
|
489
|
-
* @example
|
|
490
|
-
* ```ts
|
|
491
|
-
* reset_dispatcher();
|
|
492
|
-
* ```
|
|
493
|
-
*
|
|
494
|
-
* @since 2.0.0
|
|
495
|
-
* @returns Nothing.
|
|
496
|
-
* @internal
|
|
497
|
-
*/
|
|
498
324
|
function reset_dispatcher() {
|
|
499
325
|
current_dispatcher?.dispose();
|
|
500
326
|
current_dispatcher = null;
|
|
@@ -502,4 +328,4 @@ function reset_dispatcher() {
|
|
|
502
328
|
//#endregion
|
|
503
329
|
export { Code as i, get_dispatcher as n, reset_dispatcher as r, Dispatcher as t };
|
|
504
330
|
|
|
505
|
-
//# sourceMappingURL=dispatcher-
|
|
331
|
+
//# sourceMappingURL=dispatcher-_x0MQZBS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher-_x0MQZBS.js","names":["#notify_value_cells","#runtime","#emit_markup_value","#emit_markup_promise","#emit_markup_run","#disposed","#next_fiber_id","#fibers","#make_value_cache_key","#value_ids","#subscribe_value_cells","#value_cells","#interrupt_cached_fiber","#clear_pending_value_cell","#should_start_value_fiber","#start_value_fiber","#make_promise_cache_key","#promise_ids","#promise_values","#start_promise_fiber","#is_server_render","#clear_value_cells","#hash_deps","#is_current_fiber","#set_value_cell","#complete_fiber","#publish_value_success","#publish_value_failure","#delete_value_cell"],"sources":["../../../modules/svelte-effect-runtime/src/dispatcher/fibers.ts","../../../modules/svelte-effect-runtime/src/dispatcher/deps.ts","../../../modules/svelte-effect-runtime/src/dispatcher/types.ts","../../../modules/svelte-effect-runtime/src/dispatcher/index.ts"],"sourcesContent":["import type { Fiber as FiberType } from \"effect/Fiber\";\nimport { Cause, Effect, Exit, Fiber } from \"effect\";\n\nexport interface FiberWatchCallbacks<A> {\n\ton_complete?: () => void;\n\ton_success?: (value: A) => void;\n\ton_failure?: (error: unknown) => void;\n\tsurface_failure?: boolean;\n}\n\nexport const InterruptFiber = (fiber: FiberType<unknown, unknown>) =>\n\tEffect.gen(function* () {\n\t\tyield* Fiber.interrupt(fiber);\n\t});\n\n/** Observes fiber completion and surfaces failures without taking ownership of the fiber. */\nexport const WatchFiberExit = <A>(\n\toptions: { fiber: FiberType<unknown, unknown> } & FiberWatchCallbacks<A>,\n) => {\n\tconst { fiber, on_complete, on_success, on_failure, surface_failure = true } = options;\n\n\treturn Effect.gen(function* () {\n\t\tconst exit = yield* Fiber.await(fiber);\n\n\t\tyield* Effect.sync(() => {\n\t\t\tif (Exit.isSuccess(exit)) {\n\t\t\t\ton_success?.(exit.value as A);\n\t\t\t\ton_complete?.();\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!Cause.hasInterruptsOnly(exit.cause)) {\n\t\t\t\tconst error = Cause.squash(exit.cause);\n\n\t\t\t\ton_failure?.(error);\n\n\t\t\t\tif (surface_failure) {\n\t\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ton_complete?.();\n\t\t});\n\t});\n};\n","/** Assigns stable identities to object dependencies while hashing value dependencies. */\nexport type DependencyHasher = (deps: readonly unknown[]) => string;\n\nexport function make_dependency_hasher(): DependencyHasher {\n\tconst object_dep_ids = new WeakMap<object, number>();\n\tconst symbol_dep_ids = new Map<symbol, number>();\n\n\tlet next_object_dep_id = 0;\n\tlet next_symbol_dep_id = 0;\n\n\tconst hash_symbol_dep = (dep: symbol): string => {\n\t\tlet id = symbol_dep_ids.get(dep);\n\n\t\tif (id === undefined) {\n\t\t\tnext_symbol_dep_id += 1;\n\t\t\tid = next_symbol_dep_id;\n\t\t\tsymbol_dep_ids.set(dep, id);\n\t\t}\n\n\t\treturn `y:${id}`;\n\t};\n\n\tconst hash_object_dep = (dep: object): string => {\n\t\tlet id = object_dep_ids.get(dep);\n\n\t\tif (id === undefined) {\n\t\t\tnext_object_dep_id += 1;\n\t\t\tid = next_object_dep_id;\n\t\t\tobject_dep_ids.set(dep, id);\n\t\t}\n\n\t\treturn `o:${id}`;\n\t};\n\n\tconst hash_dep = (dep: unknown): string | readonly [\"s\", string] => {\n\t\tif (dep === null) {\n\t\t\treturn \"l:null\";\n\t\t}\n\n\t\tif (dep === undefined) {\n\t\t\treturn \"u:undefined\";\n\t\t}\n\n\t\tconst type = typeof dep;\n\n\t\tif (type === \"string\") {\n\t\t\treturn [\"s\", dep as string];\n\t\t}\n\n\t\tif (type === \"number\") {\n\t\t\treturn `n:${Object.is(dep, -0) ? \"-0\" : String(dep)}`;\n\t\t}\n\n\t\tif (type === \"bigint\") {\n\t\t\treturn `b:${dep}`;\n\t\t}\n\n\t\tif (type === \"boolean\") {\n\t\t\treturn dep ? \"t:true\" : \"f:false\";\n\t\t}\n\n\t\tif (type === \"symbol\") {\n\t\t\treturn hash_symbol_dep(dep as symbol);\n\t\t}\n\n\t\treturn hash_object_dep(dep as object);\n\t};\n\n\tconst hash_deps = (deps: readonly unknown[]): string => JSON.stringify(deps.map(hash_dep));\n\n\treturn hash_deps;\n}\n","import type { Effect } from \"effect\";\n\nexport const Code = {\n\tMarkup: {\n\t\tPromise: \"MarkupPromise\",\n\t\tRun: \"MarkupRun\",\n\t\tValue: \"MarkupValue\",\n\t},\n} as const;\n\nexport interface MarkupPromiseOptions {\n\t/** Keep the SSR promise pending so Svelte renders an await block fallback. */\n\tssr?: \"pending\";\n}\n\nexport type Dispose = () => void;\n\nexport interface ValueOptions<A> {\n\t/** Stable cache key for this value block. */\n\tid: string;\n\tdeps: readonly unknown[];\n\t/** Value returned synchronously while the effect is running or during SSR. */\n\tfallback: A;\n\tfactory: () => Effect.gen.Return<A, unknown, unknown>;\n}\n\nexport interface PromiseOptions<A> {\n\t/** Stable cache key for this promise block. */\n\tid: string;\n\tdeps: readonly unknown[];\n\tfactory: () => Effect.gen.Return<A, unknown, unknown>;\n}\n\nexport interface MarkupValueEvent<A, F> {\n\ttype: typeof Code.Markup.Value;\n\t/** Stable identifier generated from the expression's source position. */\n\tid: string;\n\tdeps: readonly unknown[];\n\t/** Value returned synchronously while the effect is pending. */\n\tfallback: F;\n\tfn: () => Effect.gen.Return<A, unknown, unknown>;\n}\n\nexport interface MarkupPromiseEvent<A> {\n\ttype: typeof Code.Markup.Promise;\n\t/** Stable identifier generated from the expression's source position. */\n\tid: string;\n\tdeps: readonly unknown[];\n\tfn: () => Effect.gen.Return<A, unknown, unknown>;\n\t/** Value resolved during SSR when a fallback is required. */\n\tssr_fallback?: A;\n\t/** Optional SSR behavior for await blocks and similar contexts. */\n\toptions?: MarkupPromiseOptions;\n}\n\nexport interface MarkupRunEvent<A> {\n\ttype: typeof Code.Markup.Run;\n\tfn: () => Effect.gen.Return<A, unknown, unknown>;\n}\n\nexport type DispatcherEvent<A, F = A> =\n\t| MarkupPromiseEvent<A>\n\t| MarkupRunEvent<A>\n\t| MarkupValueEvent<A, F>;\n","import type {\n\tDispatcherEvent,\n\tDispose,\n\tMarkupPromiseEvent,\n\tMarkupRunEvent,\n\tMarkupValueEvent,\n\tPromiseOptions,\n\tValueOptions,\n} from \"./types.ts\";\nimport { RuntimeAlreadyInitializedError, DispatcherDisposedError } from \"$/errors.ts\";\nimport type { ManagedRuntime as ManagedRuntimeType } from \"effect/ManagedRuntime\";\nimport { Cause, Effect, Exit, Fiber, Layer, ManagedRuntime } from \"effect\";\nimport { InterruptFiber, WatchFiberExit } from \"./fibers.ts\";\nimport type { Fiber as FiberType } from \"effect/Fiber\";\nimport { createSubscriber } from \"svelte/reactivity\";\nimport { make_dependency_hasher } from \"./deps.ts\";\nimport { isRedirect } from \"@sveltejs/kit\";\nimport { Code } from \"./types.ts\";\n\nexport { Code } from \"./types.ts\";\nexport type { Dispose, PromiseOptions, ValueOptions } from \"./types.ts\";\n\ntype ValueCell<A> =\n\t| {\n\t\t\treadonly status: \"pending\";\n\t\t\treadonly fiber: FiberType<unknown, unknown>;\n\t }\n\t| {\n\t\t\treadonly status: \"success\";\n\t\t\treadonly value: A;\n\t }\n\t| {\n\t\t\treadonly status: \"failure\";\n\t\t\treadonly error: unknown;\n\t };\n\nexport class Dispatcher {\n\t#runtime: ManagedRuntimeType<unknown, unknown>;\n\t#fibers = new Map<string, FiberType<unknown, unknown>>();\n\t#value_cells = new Map<string, ValueCell<unknown>>();\n\t#notify_value_cells = (): void => {};\n\t#subscribe_value_cells = createSubscriber((update) => {\n\t\tthis.#notify_value_cells = update;\n\n\t\treturn () => {\n\t\t\tif (this.#notify_value_cells !== update) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.#notify_value_cells = (): void => {};\n\t\t};\n\t});\n\t#promise_values = new Map<string, Promise<unknown>>();\n\t#value_ids = new Map<string, string>();\n\t#promise_ids = new Map<string, string>();\n\t#hash_deps = make_dependency_hasher();\n\t#disposed = false;\n\t#next_fiber_id = 0;\n\n\tstatic make<R = never>(layer?: Layer.Layer<R>): Dispatcher {\n\t\tif (current_dispatcher) {\n\t\t\tthrow new RuntimeAlreadyInitializedError(\"ClientRuntime\");\n\t\t}\n\n\t\tconst runtime = ManagedRuntime.make(layer ?? (Layer.empty as unknown as Layer.Layer<R>));\n\n\t\tconst dispatcher = new Dispatcher(runtime as ManagedRuntimeType<unknown, unknown>);\n\t\tcurrent_dispatcher = dispatcher;\n\n\t\treturn dispatcher;\n\t}\n\n\tconstructor(runtime?: ManagedRuntimeType<unknown, unknown>) {\n\t\tthis.#runtime =\n\t\t\truntime ??\n\t\t\t(ManagedRuntime.make(Layer.empty) as unknown as ManagedRuntimeType<unknown, unknown>);\n\t}\n\n\temit<A, F>(event: MarkupValueEvent<A, F>): A | F;\n\temit<A>(event: MarkupPromiseEvent<A>): Promise<A>;\n\temit<A>(event: MarkupRunEvent<A>): Promise<A>;\n\temit<A, F>(event: DispatcherEvent<A, F>): A | F | Promise<A>;\n\temit<A, F>(event: DispatcherEvent<A, F>): A | F | Promise<A> {\n\t\tswitch (event.type) {\n\t\t\tcase Code.Markup.Value:\n\t\t\t\treturn this.#emit_markup_value(event);\n\n\t\t\tcase Code.Markup.Promise:\n\t\t\t\treturn this.#emit_markup_promise(event);\n\n\t\t\tcase Code.Markup.Run:\n\t\t\t\treturn this.#emit_markup_run(event);\n\t\t}\n\t}\n\n\tfork<A, E, R>(effect: Effect.Effect<A, E, R>): Dispose {\n\t\tif (this.#disposed) {\n\t\t\treturn () => {};\n\t\t}\n\n\t\tconst fiber = this.#runtime.runFork(effect as Effect.Effect<unknown, unknown, unknown>);\n\t\tconst key = `fork:${this.#next_fiber_id}`;\n\n\t\tthis.#next_fiber_id += 1;\n\t\tthis.#fibers.set(key, fiber);\n\t\tthis.#runtime.runFork(\n\t\t\tWatchFiberExit({\n\t\t\t\tfiber,\n\t\t\t\ton_complete: () => this.#fibers.delete(key),\n\t\t\t}),\n\t\t);\n\n\t\tlet disposed = false;\n\n\t\treturn (): void => {\n\t\t\tif (disposed) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdisposed = true;\n\t\t\tthis.#runtime.runFork(InterruptFiber(fiber));\n\t\t};\n\t}\n\n\tvalue<A>(options: ValueOptions<A>): A {\n\t\tif (this.#disposed) {\n\t\t\treturn options.fallback;\n\t\t}\n\n\t\tconst cache_key = this.#make_value_cache_key(options.id, options.deps);\n\t\tconst old_key = this.#value_ids.get(options.id);\n\n\t\tthis.#subscribe_value_cells();\n\n\t\tconst cell = this.#value_cells.get(cache_key);\n\n\t\tif (old_key !== undefined && old_key !== cache_key) {\n\t\t\tconst old_fiber = this.#interrupt_cached_fiber(old_key);\n\n\t\t\tthis.#clear_pending_value_cell(old_key, old_fiber);\n\t\t}\n\n\t\tthis.#value_ids.set(options.id, cache_key);\n\n\t\tif (this.#should_start_value_fiber(cache_key, cell)) {\n\t\t\tthis.#start_value_fiber(cache_key, options);\n\t\t}\n\n\t\tif (cell?.status === \"success\") {\n\t\t\treturn cell.value as A;\n\t\t}\n\n\t\tif (cell?.status === \"failure\") {\n\t\t\tthrow cell.error;\n\t\t}\n\n\t\treturn options.fallback;\n\t}\n\n\tpromise<A>(options: PromiseOptions<A>): Promise<A> {\n\t\tif (this.#disposed) {\n\t\t\treturn Promise.reject(new DispatcherDisposedError());\n\t\t}\n\n\t\tconst cache_key = this.#make_promise_cache_key(options.id, options.deps);\n\t\tconst old_key = this.#promise_ids.get(options.id);\n\n\t\tif (old_key !== undefined && old_key !== cache_key) {\n\t\t\tthis.#interrupt_cached_fiber(old_key);\n\t\t\tthis.#promise_values.delete(old_key);\n\t\t}\n\n\t\tthis.#promise_ids.set(options.id, cache_key);\n\n\t\tconst existing = this.#promise_values.get(cache_key);\n\n\t\tif (existing) {\n\t\t\treturn existing as Promise<A>;\n\t\t}\n\n\t\tconst promise = this.#start_promise_fiber(cache_key, options);\n\n\t\tthis.#promise_values.set(cache_key, promise);\n\n\t\treturn promise;\n\t}\n\n\trun<A, E, R>(effect: Effect.Effect<A, E, R>): Promise<A> {\n\t\tif (this.#disposed) {\n\t\t\treturn Promise.reject(new DispatcherDisposedError());\n\t\t}\n\n\t\tconst Program = Effect.gen(function* () {\n\t\t\tconst result = yield* Effect.exit(effect);\n\n\t\t\tif (Exit.isSuccess(result)) {\n\t\t\t\treturn result.value;\n\t\t\t}\n\n\t\t\tif (Cause.hasInterruptsOnly(result.cause)) {\n\t\t\t\treturn undefined as A;\n\t\t\t}\n\n\t\t\tconst error = Cause.squash(result.cause);\n\n\t\t\tif (isRedirect(error)) {\n\t\t\t\treturn undefined as A;\n\t\t\t}\n\n\t\t\tyield* Effect.sync(() => {\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn yield* Effect.fail(error);\n\t\t});\n\n\t\treturn this.#runtime.runPromise(Program as Effect.Effect<A, unknown, unknown>);\n\t}\n\n\t#emit_markup_value<A, F>(event: MarkupValueEvent<A, F>): A | F {\n\t\tif (this.#is_server_render()) {\n\t\t\treturn event.fallback;\n\t\t}\n\n\t\treturn this.value<A | F>({\n\t\t\tid: event.id,\n\t\t\tdeps: event.deps,\n\t\t\tfallback: event.fallback,\n\t\t\tfactory: event.fn,\n\t\t});\n\t}\n\n\t#emit_markup_promise<A>(event: MarkupPromiseEvent<A>): Promise<A> {\n\t\tif (this.#is_server_render()) {\n\t\t\tif (event.options?.ssr === \"pending\") {\n\t\t\t\treturn new Promise<A>(() => {});\n\t\t\t}\n\n\t\t\tif (\"ssr_fallback\" in event) {\n\t\t\t\treturn Promise.resolve(event.ssr_fallback as A);\n\t\t\t}\n\t\t}\n\n\t\treturn this.promise({\n\t\t\tid: event.id,\n\t\t\tdeps: event.deps,\n\t\t\tfactory: event.fn,\n\t\t});\n\t}\n\n\t#emit_markup_run<A>(event: MarkupRunEvent<A>): Promise<A> {\n\t\tconst Program = Effect.gen(event.fn);\n\n\t\treturn this.run(Program);\n\t}\n\n\tdispose(): void {\n\t\tthis.#disposed = true;\n\n\t\tfor (const fiber of this.#fibers.values()) {\n\t\t\tthis.#runtime.runFork(InterruptFiber(fiber));\n\t\t}\n\n\t\tthis.#fibers.clear();\n\t\tthis.#clear_value_cells();\n\t\tthis.#promise_values.clear();\n\t\tthis.#value_ids.clear();\n\t\tthis.#promise_ids.clear();\n\n\t\tvoid this.#runtime.dispose().catch((error: unknown) => {\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t});\n\t}\n\n\t#make_value_cache_key(id: string, deps: readonly unknown[]): string {\n\t\treturn `value:${id}::${this.#hash_deps(deps)}`;\n\t}\n\n\t#make_promise_cache_key(id: string, deps: readonly unknown[]): string {\n\t\treturn `promise:${id}::${this.#hash_deps(deps)}`;\n\t}\n\n\t#is_server_render(): boolean {\n\t\treturn typeof document === \"undefined\";\n\t}\n\n\t#interrupt_cached_fiber(cache_key: string): FiberType<unknown, unknown> | undefined {\n\t\tconst old_fiber = this.#fibers.get(cache_key);\n\n\t\tif (!old_fiber) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tthis.#runtime.runFork(InterruptFiber(old_fiber));\n\t\tthis.#fibers.delete(cache_key);\n\n\t\treturn old_fiber;\n\t}\n\n\t#should_start_value_fiber(cache_key: string, cell: ValueCell<unknown> | undefined): boolean {\n\t\treturn !this.#disposed && !this.#fibers.has(cache_key) && cell === undefined;\n\t}\n\n\t#start_value_fiber<A>(cache_key: string, options: ValueOptions<A>): void {\n\t\tconst Program = Effect.gen(function* () {\n\t\t\tconst result = yield* Effect.gen(options.factory);\n\n\t\t\treturn result;\n\t\t});\n\t\tconst fiber = this.#runtime.runFork(Program as Effect.Effect<unknown, unknown, unknown>);\n\n\t\tthis.#fibers.set(cache_key, fiber);\n\n\t\tqueueMicrotask(() => {\n\t\t\tif (!this.#is_current_fiber(cache_key, fiber)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.#value_cells.has(cache_key)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.#set_value_cell(cache_key, {\n\t\t\t\tstatus: \"pending\",\n\t\t\t\tfiber,\n\t\t\t});\n\t\t});\n\n\t\tthis.#runtime.runFork(\n\t\t\tWatchFiberExit({\n\t\t\t\tfiber,\n\t\t\t\tsurface_failure: false,\n\t\t\t\ton_complete: () => this.#complete_fiber(cache_key, fiber),\n\t\t\t\ton_success: (value) => this.#publish_value_success(cache_key, fiber, value),\n\t\t\t\ton_failure: (error) => this.#publish_value_failure(cache_key, fiber, error),\n\t\t\t}),\n\t\t);\n\t}\n\n\t#start_promise_fiber<A>(cache_key: string, options: PromiseOptions<A>): Promise<A> {\n\t\tconst Program = Effect.gen(function* () {\n\t\t\tconst result = yield* Effect.gen(options.factory);\n\n\t\t\treturn result;\n\t\t});\n\t\tconst fiber = this.#runtime.runFork(Program as Effect.Effect<unknown, unknown, unknown>);\n\t\tconst ReleaseFiber = Effect.sync(() => {\n\t\t\tif (!this.#is_current_fiber(cache_key, fiber)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.#fibers.delete(cache_key);\n\t\t\tthis.#promise_values.delete(cache_key);\n\n\t\t\tif (this.#promise_ids.get(options.id) === cache_key) {\n\t\t\t\tthis.#promise_ids.delete(options.id);\n\t\t\t}\n\t\t});\n\t\tconst AwaitFiber = Effect.gen(function* () {\n\t\t\tconst exit = yield* Fiber.await(fiber);\n\n\t\t\tyield* ReleaseFiber;\n\n\t\t\tif (Exit.isSuccess(exit)) {\n\t\t\t\treturn exit.value as A;\n\t\t\t}\n\n\t\t\treturn yield* Effect.fail(Cause.squash(exit.cause));\n\t\t});\n\n\t\tthis.#fibers.set(cache_key, fiber);\n\n\t\treturn this.#runtime.runPromise(AwaitFiber);\n\t}\n\n\t#clear_pending_value_cell(\n\t\tcache_key: string,\n\t\tfiber: FiberType<unknown, unknown> | undefined,\n\t): void {\n\t\tconst cell = this.#value_cells.get(cache_key);\n\n\t\tif (cell?.status !== \"pending\") {\n\t\t\treturn;\n\t\t}\n\n\t\tif (fiber !== undefined && cell.fiber !== fiber) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#delete_value_cell(cache_key);\n\t}\n\n\t#complete_fiber(cache_key: string, fiber: FiberType<unknown, unknown>): void {\n\t\tif (!this.#is_current_fiber(cache_key, fiber)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#fibers.delete(cache_key);\n\t}\n\n\t#publish_value_success<A>(\n\t\tcache_key: string,\n\t\tfiber: FiberType<unknown, unknown>,\n\t\tvalue: A,\n\t): void {\n\t\tif (!this.#is_current_fiber(cache_key, fiber)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#set_value_cell(cache_key, {\n\t\t\tstatus: \"success\",\n\t\t\tvalue,\n\t\t});\n\t}\n\n\t#publish_value_failure(\n\t\tcache_key: string,\n\t\tfiber: FiberType<unknown, unknown>,\n\t\terror: unknown,\n\t): void {\n\t\tif (!this.#is_current_fiber(cache_key, fiber)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#set_value_cell(cache_key, {\n\t\t\tstatus: \"failure\",\n\t\t\terror,\n\t\t});\n\t}\n\n\t#set_value_cell(cache_key: string, cell: ValueCell<unknown>): void {\n\t\tthis.#value_cells.set(cache_key, cell);\n\t\tthis.#notify_value_cells();\n\t}\n\n\t#delete_value_cell(cache_key: string): void {\n\t\tconst deleted = this.#value_cells.delete(cache_key);\n\n\t\tif (!deleted) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#notify_value_cells();\n\t}\n\n\t#clear_value_cells(): void {\n\t\tif (this.#value_cells.size === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#value_cells.clear();\n\t\tthis.#notify_value_cells();\n\t}\n\n\t#is_current_fiber(cache_key: string, fiber: FiberType<unknown, unknown>): boolean {\n\t\treturn !this.#disposed && this.#fibers.get(cache_key) === fiber;\n\t}\n}\n\nlet current_dispatcher: Dispatcher | null = null;\n\nexport function get_dispatcher(): Dispatcher {\n\tcurrent_dispatcher ??= new Dispatcher();\n\n\treturn current_dispatcher;\n}\n\nexport function reset_dispatcher(): void {\n\tcurrent_dispatcher?.dispose();\n\tcurrent_dispatcher = null;\n}\n"],"mappings":"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"}
|