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.
Files changed (146) hide show
  1. package/.dist/chunks/client-BrZka6DW.js +530 -0
  2. package/.dist/chunks/client-BrZka6DW.js.map +1 -0
  3. package/.dist/chunks/compiler-COVzgLYo.js +412 -0
  4. package/.dist/chunks/compiler-COVzgLYo.js.map +1 -0
  5. package/.dist/chunks/descriptors-B4otDlm1.js +216 -0
  6. package/.dist/chunks/descriptors-B4otDlm1.js.map +1 -0
  7. package/.dist/chunks/diagnostics-BDrky-Di.js +359 -0
  8. package/.dist/chunks/diagnostics-BDrky-Di.js.map +1 -0
  9. package/.dist/chunks/dispatcher-BA0PLQhA.js +16 -0
  10. package/.dist/chunks/dispatcher-BA0PLQhA.js.map +1 -0
  11. package/.dist/chunks/{dispatcher-DOx8iC6r.js → dispatcher-_x0MQZBS.js} +84 -258
  12. package/.dist/chunks/dispatcher-_x0MQZBS.js.map +1 -0
  13. package/.dist/chunks/{errors-IJjsUwrE.js → errors-CLsbGjIa.js} +39 -44
  14. package/.dist/chunks/errors-CLsbGjIa.js.map +1 -0
  15. package/.dist/chunks/live-BundLSoY.js +146 -0
  16. package/.dist/chunks/live-BundLSoY.js.map +1 -0
  17. package/.dist/chunks/live-CHK0RrZu.js +10 -0
  18. package/.dist/chunks/live-CHK0RrZu.js.map +1 -0
  19. package/.dist/chunks/{remote-client-CVI4t66c.js → remote-client-mkQAfP1G.js} +29 -23
  20. package/.dist/chunks/remote-client-mkQAfP1G.js.map +1 -0
  21. package/.dist/chunks/{runtime-GBQz32DZ.js → runtime-HDTlEnzp.js} +3 -27
  22. package/.dist/chunks/runtime-HDTlEnzp.js.map +1 -0
  23. package/.dist/chunks/{server-D1LcDnZE.js → server-BNrA1I-u.js} +15 -84
  24. package/.dist/chunks/server-BNrA1I-u.js.map +1 -0
  25. package/.dist/chunks/source-scan-9pZxnfct.js +1059 -0
  26. package/.dist/chunks/source-scan-9pZxnfct.js.map +1 -0
  27. package/.dist/chunks/{transform-jNUr65K9.js → transform-BXyYUAez.js} +184 -358
  28. package/.dist/chunks/transform-BXyYUAez.js.map +1 -0
  29. package/.dist/compiler/markup-identifiers.d.ts +2 -0
  30. package/.dist/compiler/remote-client.d.ts +1 -19
  31. package/.dist/compiler/source-scan.d.ts +11 -108
  32. package/.dist/compiler/sveltekit-remote-bridge.d.ts +3 -0
  33. package/.dist/compiler.d.ts +6 -0
  34. package/.dist/compiler.js +1 -1
  35. package/.dist/detect.d.ts +0 -31
  36. package/.dist/detect.js +0 -39
  37. package/.dist/detect.js.map +1 -1
  38. package/.dist/diagnostics.d.ts +0 -16
  39. package/.dist/dispatcher/deps.d.ts +3 -14
  40. package/.dist/dispatcher/fibers.d.ts +5 -46
  41. package/.dist/dispatcher/index.d.ts +1 -143
  42. package/.dist/dispatcher/types.d.ts +0 -151
  43. package/.dist/dispatcher.js +1 -1
  44. package/.dist/errors.d.ts +30 -42
  45. package/.dist/generated/dispatcher.d.ts +0 -50
  46. package/.dist/generators.d.ts +1 -12
  47. package/.dist/internal/descriptors.d.ts +0 -16
  48. package/.dist/internal/generators.js +13 -8
  49. package/.dist/internal/generators.js.map +1 -1
  50. package/.dist/internal/live.d.ts +9 -0
  51. package/.dist/internal/remote-client.js +2 -2
  52. package/.dist/internal/remote-server.js +2 -2
  53. package/.dist/internal/schema.d.ts +0 -54
  54. package/.dist/live.d.ts +9 -26
  55. package/.dist/markup/event-attributes.d.ts +0 -32
  56. package/.dist/markup/promise.d.ts +1 -23
  57. package/.dist/markup/promise.js +2 -18
  58. package/.dist/markup/promise.js.map +1 -1
  59. package/.dist/markup/run.d.ts +1 -10
  60. package/.dist/markup/run.js +2 -11
  61. package/.dist/markup/run.js.map +1 -1
  62. package/.dist/markup/transform/apply.d.ts +4 -4
  63. package/.dist/markup/transform/classify.d.ts +2 -11
  64. package/.dist/markup/transform/constants.d.ts +1 -1
  65. package/.dist/markup/transform/effect-bindings.d.ts +2 -26
  66. package/.dist/markup/transform/effect-callbacks.d.ts +0 -20
  67. package/.dist/markup/transform/emit.d.ts +2 -11
  68. package/.dist/markup/transform/expressions.d.ts +0 -35
  69. package/.dist/markup/transform/scan.d.ts +3 -22
  70. package/.dist/markup/transform/types.d.ts +1 -129
  71. package/.dist/markup/transform.js +1 -1
  72. package/.dist/markup/value.d.ts +1 -18
  73. package/.dist/markup/value.js +2 -19
  74. package/.dist/markup/value.js.map +1 -1
  75. package/.dist/mod.d.ts +3 -8
  76. package/.dist/mod.js +5 -5
  77. package/.dist/mod.js.map +1 -1
  78. package/.dist/remote/cause-codec.d.ts +3 -37
  79. package/.dist/remote/client/command.d.ts +3 -17
  80. package/.dist/remote/client/form-data.d.ts +0 -7
  81. package/.dist/remote/client/form-enhance.d.ts +0 -7
  82. package/.dist/remote/client/form-transport.d.ts +14 -20
  83. package/.dist/remote/client/form.d.ts +4 -24
  84. package/.dist/remote/client/index.d.ts +2 -1
  85. package/.dist/remote/client/prerender.d.ts +6 -0
  86. package/.dist/remote/client/query-result.d.ts +2 -14
  87. package/.dist/remote/client/query.d.ts +8 -48
  88. package/.dist/remote/client/responses.d.ts +3 -27
  89. package/.dist/remote/client/types.d.ts +16 -110
  90. package/.dist/remote/client/utils.d.ts +0 -8
  91. package/.dist/remote/client.d.ts +2 -2
  92. package/.dist/remote/client.js +2 -2
  93. package/.dist/remote/effect.d.ts +6 -0
  94. package/.dist/remote/failures.d.ts +4 -0
  95. package/.dist/remote/query-update.d.ts +2 -0
  96. package/.dist/remote/resource.d.ts +25 -0
  97. package/.dist/remote/server.d.ts +5 -50
  98. package/.dist/remote/server.js +2 -2
  99. package/.dist/remote/shared.d.ts +6 -145
  100. package/.dist/remote/shared.js +6 -127
  101. package/.dist/remote/shared.js.map +1 -1
  102. package/.dist/runtime/transform.js +5 -22
  103. package/.dist/runtime/transform.js.map +1 -1
  104. package/.dist/script-transform/ast.d.ts +0 -46
  105. package/.dist/script-transform/imports.d.ts +0 -38
  106. package/.dist/script-transform/lower.d.ts +0 -9
  107. package/.dist/script-transform/runes.d.ts +0 -10
  108. package/.dist/script-transform/runtime-block.d.ts +0 -17
  109. package/.dist/script-transform/source.d.ts +0 -24
  110. package/.dist/script-transform/types.d.ts +1 -126
  111. package/.dist/server/effects.d.ts +4 -53
  112. package/.dist/server/factories.d.ts +7 -7
  113. package/.dist/server/index.d.ts +1 -1
  114. package/.dist/server/invalid.d.ts +0 -7
  115. package/.dist/server/live-snapshot.d.ts +5 -0
  116. package/.dist/server/remote-handler-context.d.ts +5 -0
  117. package/.dist/server/runtime.d.ts +6 -24
  118. package/.dist/server/schema.d.ts +0 -14
  119. package/.dist/server/transport.d.ts +2 -0
  120. package/.dist/server/types.d.ts +49 -26
  121. package/.dist/server/wrappers.d.ts +3 -40
  122. package/.dist/server.d.ts +1 -1
  123. package/.dist/server.js +200 -215
  124. package/.dist/server.js.map +1 -1
  125. package/.dist/yieldable.d.ts +1 -35
  126. package/package.json +2 -2
  127. package/.dist/chunks/client-DcZUV4rR.js +0 -653
  128. package/.dist/chunks/client-DcZUV4rR.js.map +0 -1
  129. package/.dist/chunks/compiler-BBPNyXmQ.js +0 -460
  130. package/.dist/chunks/compiler-BBPNyXmQ.js.map +0 -1
  131. package/.dist/chunks/dispatcher-DOx8iC6r.js.map +0 -1
  132. package/.dist/chunks/dispatcher-H-Ia0Os4.js +0 -47
  133. package/.dist/chunks/dispatcher-H-Ia0Os4.js.map +0 -1
  134. package/.dist/chunks/errors-IJjsUwrE.js.map +0 -1
  135. package/.dist/chunks/live-BXAKre_4.js +0 -104
  136. package/.dist/chunks/live-BXAKre_4.js.map +0 -1
  137. package/.dist/chunks/remote-client-CVI4t66c.js.map +0 -1
  138. package/.dist/chunks/runtime-GBQz32DZ.js.map +0 -1
  139. package/.dist/chunks/schema-D9pct6Y5.js +0 -89
  140. package/.dist/chunks/schema-D9pct6Y5.js.map +0 -1
  141. package/.dist/chunks/server-D1LcDnZE.js.map +0 -1
  142. package/.dist/chunks/source-scan-C4PsggID.js +0 -341
  143. package/.dist/chunks/source-scan-C4PsggID.js.map +0 -1
  144. package/.dist/chunks/transform-jNUr65K9.js.map +0 -1
  145. package/.dist/remote/client/effect.d.ts +0 -29
  146. package/.dist/remote/client/failures.d.ts +0 -42
@@ -1,78 +1,59 @@
1
- import { a as DispatcherDisposedError, v as RuntimeAlreadyInitializedError } from "./errors-IJjsUwrE.js";
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
- * Interrupts a dispatcher fiber through its managed runtime.
8
- *
9
- * @example
10
- * ```ts
11
- * interrupt_fiber(runtime, fiber);
12
- * ```
13
- *
14
- * @since 2.0.0
15
- * @param runtime - Managed runtime that owns the fiber.
16
- * @param fiber - Fiber to interrupt.
17
- * @returns Nothing.
18
- * @internal
19
- */
20
- function interrupt_fiber(runtime, fiber) {
21
- runtime.runFork(Fiber.interrupt(fiber));
22
- }
23
- /**
24
- * Watches a dispatcher fiber, runs completion callbacks, and surfaces
25
- * non-interrupt failures on the microtask queue.
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
- return;
44
- }
45
- if (!Cause.hasInterruptsOnly(exit.cause)) {
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
- const object_dep_ids = /* @__PURE__ */ new WeakMap();
58
- const symbol_dep_ids = /* @__PURE__ */ new Map();
59
- let next_object_dep_id = 0;
60
- let next_symbol_dep_id = 0;
61
- /**
62
- * Builds a deterministic cache key from a dependency array.
63
- *
64
- * @example
65
- * ```ts
66
- * const key = hash_deps([user_id, filters]);
67
- * ```
68
- *
69
- * @since 2.0.0
70
- * @param deps - Dependency array to encode for cache lookup.
71
- * @returns A structured string key suitable for Map lookups.
72
- * @internal
73
- */
74
- function hash_deps(deps) {
75
- const parts = deps.map((dep) => {
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
- return JSON.stringify(parts);
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
- /** Whether dispose has been called, blocking new work. */
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
- watch_fiber_exit({
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
- interrupt_fiber(this.#runtime, fiber);
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 ExitProgram = Effect.exit(effect);
309
- return this.#runtime.runPromise(ExitProgram).then((exit) => {
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
- queueMicrotask(() => {
316
- throw error;
170
+ yield* Effect.sync(() => {
171
+ queueMicrotask(() => {
172
+ throw error;
173
+ });
317
174
  });
318
- throw error;
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()) interrupt_fiber(this.#runtime, fiber);
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
- interrupt_fiber(this.#runtime, old_fiber);
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
- watch_fiber_exit({
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
- this.#fibers.set(cache_key, fiber);
418
- return this.#runtime.runPromise(Effect.flatMap(Fiber.await(fiber), (exit) => Effect.sync(() => {
419
- if (this.#is_current_fiber(cache_key, fiber)) {
420
- this.#fibers.delete(cache_key);
421
- this.#promise_values.delete(cache_key);
422
- if (this.#promise_ids.get(options.id) === cache_key) this.#promise_ids.delete(options.id);
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
- throw Cause.squash(exit.cause);
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-DOx8iC6r.js.map
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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"}