effect 4.0.0-rc.118 → 4.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.
Files changed (132) hide show
  1. package/README.md +17 -4
  2. package/dist/Array.d.ts +25 -25
  3. package/dist/Array.d.ts.map +1 -1
  4. package/dist/Array.js +16 -16
  5. package/dist/Array.js.map +1 -1
  6. package/dist/Chunk.d.ts +26 -26
  7. package/dist/Chunk.d.ts.map +1 -1
  8. package/dist/Chunk.js +15 -15
  9. package/dist/Chunk.js.map +1 -1
  10. package/dist/Effect.d.ts +17 -17
  11. package/dist/Effect.d.ts.map +1 -1
  12. package/dist/Effect.js +5 -5
  13. package/dist/MutableHashMap.d.ts.map +1 -1
  14. package/dist/MutableHashMap.js +4 -22
  15. package/dist/MutableHashMap.js.map +1 -1
  16. package/dist/Option.d.ts +17 -17
  17. package/dist/Option.d.ts.map +1 -1
  18. package/dist/Option.js +6 -6
  19. package/dist/Option.js.map +1 -1
  20. package/dist/Queue.d.ts +19 -2
  21. package/dist/Queue.d.ts.map +1 -1
  22. package/dist/Queue.js +9 -4
  23. package/dist/Queue.js.map +1 -1
  24. package/dist/Record.d.ts +14 -14
  25. package/dist/Record.d.ts.map +1 -1
  26. package/dist/Record.js +10 -10
  27. package/dist/Record.js.map +1 -1
  28. package/dist/Schema.d.ts +37 -21
  29. package/dist/Schema.d.ts.map +1 -1
  30. package/dist/Schema.js +29 -10
  31. package/dist/Schema.js.map +1 -1
  32. package/dist/SchemaAST.d.ts.map +1 -1
  33. package/dist/SchemaAST.js +116 -97
  34. package/dist/SchemaAST.js.map +1 -1
  35. package/dist/SchemaRepresentation.d.ts +3 -1
  36. package/dist/SchemaRepresentation.d.ts.map +1 -1
  37. package/dist/SchemaRepresentation.js +3 -1
  38. package/dist/SchemaRepresentation.js.map +1 -1
  39. package/dist/ai/McpSchema.d.ts +110 -110
  40. package/dist/ai/McpSchema.d.ts.map +1 -1
  41. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  42. package/dist/cluster/ClusterWorkflowEngine.js +5 -1
  43. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  44. package/dist/cluster/MessageStorage.d.ts +32 -8
  45. package/dist/cluster/MessageStorage.d.ts.map +1 -1
  46. package/dist/cluster/MessageStorage.js +2 -1
  47. package/dist/cluster/MessageStorage.js.map +1 -1
  48. package/dist/cluster/Sharding.d.ts +5 -2
  49. package/dist/cluster/Sharding.d.ts.map +1 -1
  50. package/dist/cluster/Sharding.js +1 -1
  51. package/dist/cluster/Sharding.js.map +1 -1
  52. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  53. package/dist/cluster/SqlMessageStorage.js +15 -4
  54. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  55. package/dist/http/HttpEffect.d.ts +1 -0
  56. package/dist/http/HttpEffect.d.ts.map +1 -1
  57. package/dist/http/HttpEffect.js +29 -22
  58. package/dist/http/HttpEffect.js.map +1 -1
  59. package/dist/internal/effect.js +75 -84
  60. package/dist/internal/effect.js.map +1 -1
  61. package/dist/internal/schema/annotations.js +1 -7
  62. package/dist/internal/schema/annotations.js.map +1 -1
  63. package/dist/internal/schema/codegen.js +56 -28
  64. package/dist/internal/schema/codegen.js.map +1 -1
  65. package/dist/internal/schema/toCodeDocument.js +10 -30
  66. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  67. package/dist/internal/schema/toCodec.js +1 -15
  68. package/dist/internal/schema/toCodec.js.map +1 -1
  69. package/dist/internal/schema/toEquivalence.js +4 -3
  70. package/dist/internal/schema/toEquivalence.js.map +1 -1
  71. package/dist/internal/schema/toFormatter.js +4 -4
  72. package/dist/internal/schema/toFormatter.js.map +1 -1
  73. package/dist/reactivity/Atom.d.ts.map +1 -1
  74. package/dist/reactivity/Atom.js +6 -2
  75. package/dist/reactivity/Atom.js.map +1 -1
  76. package/dist/reactivity/AtomRpc.d.ts +3 -3
  77. package/dist/reactivity/AtomRpc.d.ts.map +1 -1
  78. package/dist/rpc/Rpc.d.ts +2 -2
  79. package/dist/rpc/Rpc.d.ts.map +1 -1
  80. package/dist/rpc/RpcClient.d.ts +7 -7
  81. package/dist/rpc/RpcClient.d.ts.map +1 -1
  82. package/dist/rpc/RpcClient.js +1 -2
  83. package/dist/rpc/RpcClient.js.map +1 -1
  84. package/dist/rpc/RpcMessage.d.ts +1 -1
  85. package/dist/rpc/RpcMessage.d.ts.map +1 -1
  86. package/dist/schema/SchemaCompiler/runtime.js +6 -1
  87. package/dist/schema/SchemaCompiler/runtime.js.map +1 -1
  88. package/dist/testing/TestSchema.d.ts +234 -6
  89. package/dist/testing/TestSchema.d.ts.map +1 -1
  90. package/dist/testing/TestSchema.js +244 -25
  91. package/dist/testing/TestSchema.js.map +1 -1
  92. package/dist/testing/index.d.ts +1 -0
  93. package/dist/testing/index.d.ts.map +1 -1
  94. package/dist/testing/index.js +1 -0
  95. package/dist/testing/index.js.map +1 -1
  96. package/dist/workflow/DurableDeferred.js +1 -1
  97. package/dist/workflow/DurableDeferred.js.map +1 -1
  98. package/dist/workflow/Workflow.js +1 -1
  99. package/dist/workflow/Workflow.js.map +1 -1
  100. package/package.json +1 -1
  101. package/src/Array.ts +31 -31
  102. package/src/Chunk.ts +29 -29
  103. package/src/Effect.ts +17 -17
  104. package/src/MutableHashMap.ts +4 -24
  105. package/src/Option.ts +19 -19
  106. package/src/Queue.ts +26 -6
  107. package/src/Record.ts +20 -20
  108. package/src/Schema.ts +48 -24
  109. package/src/SchemaAST.ts +135 -115
  110. package/src/SchemaRepresentation.ts +3 -1
  111. package/src/cluster/ClusterWorkflowEngine.ts +8 -1
  112. package/src/cluster/MessageStorage.ts +22 -5
  113. package/src/cluster/Sharding.ts +8 -4
  114. package/src/cluster/SqlMessageStorage.ts +19 -8
  115. package/src/http/HttpEffect.ts +15 -9
  116. package/src/internal/effect.ts +37 -62
  117. package/src/internal/schema/annotations.ts +0 -9
  118. package/src/internal/schema/codegen.ts +90 -43
  119. package/src/internal/schema/toCodeDocument.ts +10 -47
  120. package/src/internal/schema/toCodec.ts +3 -16
  121. package/src/internal/schema/toEquivalence.ts +4 -5
  122. package/src/internal/schema/toFormatter.ts +4 -6
  123. package/src/reactivity/Atom.ts +6 -2
  124. package/src/reactivity/AtomRpc.ts +5 -5
  125. package/src/rpc/Rpc.ts +2 -2
  126. package/src/rpc/RpcClient.ts +9 -10
  127. package/src/rpc/RpcMessage.ts +1 -1
  128. package/src/schema/SchemaCompiler/runtime.ts +17 -1
  129. package/src/testing/TestSchema.ts +315 -63
  130. package/src/testing/index.ts +1 -0
  131. package/src/workflow/DurableDeferred.ts +1 -1
  132. package/src/workflow/Workflow.ts +1 -1
@@ -852,7 +852,7 @@ const asyncFinalizer = /*#__PURE__*/makePrimitive({
852
852
  }
853
853
  },
854
854
  [contE](cause, _fiber) {
855
- return hasInterrupts(cause) ? flatMap(this[args](), () => failCause(cause)) : failCause(cause);
855
+ return hasInterrupts(cause) ? flatMap(combineFinalizerCause(exitFailCause(cause), this[args]()), () => failCause(cause)) : failCause(cause);
856
856
  }
857
857
  });
858
858
  /** @internal */
@@ -1079,73 +1079,75 @@ export const asVoid = self => new ContImpl(self, returnPayload, exitVoid);
1079
1079
  /** @internal */
1080
1080
  export const sandbox = self => catchCause(self, fail);
1081
1081
  /** @internal */
1082
- export const raceAll = (all, options) => withFiber(parent => callback(resume => {
1083
- const effects = Arr.fromIterable(all);
1084
- const len = effects.length;
1085
- let doneCount = 0;
1086
- let done = false;
1082
+ export const raceAll = (all, options) => withFiber(parent => {
1087
1083
  const fibers = new Set();
1088
- const failures = [];
1089
- const onExit = (exit, fiber, i) => {
1090
- doneCount++;
1091
- if (exit._tag === "Failure") {
1092
- failures.push(...exit.cause.reasons);
1093
- if (doneCount >= len) {
1094
- resume(failCause(causeFromReasons(failures)));
1084
+ // Read fibers on exit to include losers forked after the race settles.
1085
+ onExitUnsafe(parent, () => fibers.size === 0 ? undefined : fiberInterruptAll(fibers));
1086
+ return callback(resume => {
1087
+ const effects = Arr.fromIterable(all);
1088
+ const len = effects.length;
1089
+ let doneCount = 0;
1090
+ let done = false;
1091
+ const failures = [];
1092
+ const onExit = (exit, fiber, i) => {
1093
+ doneCount++;
1094
+ if (exit._tag === "Failure") {
1095
+ failures.push(...exit.cause.reasons);
1096
+ if (doneCount >= len) {
1097
+ resume(failCause(causeFromReasons(failures)));
1098
+ }
1099
+ return;
1095
1100
  }
1096
- return;
1097
- }
1098
- const isWinner = !done;
1099
- done = true;
1100
- resume(fibers.size === 0 ? exit : flatMap(uninterruptible(fiberInterruptAll(fibers)), () => exit));
1101
- if (isWinner && options?.onWinner) {
1102
- options.onWinner({
1103
- fiber,
1104
- index: i,
1105
- parentFiber: parent
1106
- });
1107
- }
1108
- };
1109
- for (let i = 0; i < len; i++) {
1110
- const fiber = forkUnsafe(parent, effects[i], true, true, false);
1111
- fibers.add(fiber);
1112
- fiber.addObserver(exit => {
1113
- fibers.delete(fiber);
1114
- onExit(exit, fiber, i);
1115
- });
1116
- if (done) break;
1117
- }
1118
- return fiberInterruptAll(fibers);
1119
- }));
1120
- /** @internal */
1121
- export const raceAllFirst = (all, options) => withFiber(parent => callback(resume => {
1122
- let done = false;
1123
- const fibers = new Set();
1124
- const onExit = exit => {
1125
- done = true;
1126
- resume(fibers.size === 0 ? exit : flatMap(uninterruptible(fiberInterruptAll(fibers)), () => exit));
1127
- };
1128
- let i = 0;
1129
- for (const effect of all) {
1130
- if (done) break;
1131
- const index = i++;
1132
- const fiber = forkUnsafe(parent, effect, true, true, false);
1133
- fibers.add(fiber);
1134
- fiber.addObserver(exit => {
1135
- fibers.delete(fiber);
1136
1101
  const isWinner = !done;
1137
- onExit(exit);
1102
+ done = true;
1103
+ resume(exit);
1138
1104
  if (isWinner && options?.onWinner) {
1139
1105
  options.onWinner({
1140
1106
  fiber,
1141
- index,
1107
+ index: i,
1142
1108
  parentFiber: parent
1143
1109
  });
1144
1110
  }
1145
- });
1146
- }
1147
- return fiberInterruptAll(fibers);
1148
- }));
1111
+ };
1112
+ for (let i = 0; i < len; i++) {
1113
+ const fiber = forkUnsafe(parent, effects[i], true, true, false);
1114
+ fibers.add(fiber);
1115
+ fiber.addObserver(exit => {
1116
+ fibers.delete(fiber);
1117
+ onExit(exit, fiber, i);
1118
+ });
1119
+ if (done) break;
1120
+ }
1121
+ });
1122
+ });
1123
+ /** @internal */
1124
+ export const raceAllFirst = (all, options) => withFiber(parent => {
1125
+ const fibers = new Set();
1126
+ onExitUnsafe(parent, () => fibers.size === 0 ? undefined : fiberInterruptAll(fibers));
1127
+ return callback(resume => {
1128
+ let done = false;
1129
+ let i = 0;
1130
+ for (const effect of all) {
1131
+ if (done) break;
1132
+ const index = i++;
1133
+ const fiber = forkUnsafe(parent, effect, true, true, false);
1134
+ fibers.add(fiber);
1135
+ fiber.addObserver(exit => {
1136
+ fibers.delete(fiber);
1137
+ const isWinner = !done;
1138
+ done = true;
1139
+ resume(exit);
1140
+ if (isWinner && options?.onWinner) {
1141
+ options.onWinner({
1142
+ fiber,
1143
+ index,
1144
+ parentFiber: parent
1145
+ });
1146
+ }
1147
+ });
1148
+ }
1149
+ });
1150
+ });
1149
1151
  /** @internal */
1150
1152
  export const race = /*#__PURE__*/dual(args => isEffect(args[1]), (self, that, options) => raceAll([self, that], options));
1151
1153
  /** @internal */
@@ -2100,11 +2102,11 @@ export const reduce = /*#__PURE__*/dual(3, (elements, zero, f) => {
2100
2102
  /** @internal */
2101
2103
  export const validate = /*#__PURE__*/dual(args => isIterable(args[0]) && !isEffect(args[0]), (elements, f, options) => flatMap(partition(elements, f, {
2102
2104
  concurrency: options?.concurrency
2103
- }), ([excluded, satisfying]) => {
2104
- if (Arr.isArrayNonEmpty(excluded)) {
2105
- return fail(excluded);
2105
+ }), ([passes, fails]) => {
2106
+ if (Arr.isArrayNonEmpty(fails)) {
2107
+ return fail(fails);
2106
2108
  }
2107
- return options?.discard ? void_ : succeed(satisfying);
2109
+ return options?.discard ? void_ : succeed(passes);
2108
2110
  }));
2109
2111
  /** @internal */
2110
2112
  export const findFirst = /*#__PURE__*/dual(args => isIterable(args[0]) && !isEffect(args[0]), (elements, predicate) => suspend(() => {
@@ -2233,26 +2235,22 @@ const iterateConcurrentImpl = options => {
2233
2235
  let parentFiber;
2234
2236
  let fibers;
2235
2237
  let resume;
2236
- let interrupted = false;
2237
2238
  let terminal;
2238
2239
  let effect;
2239
2240
  const failDefect = error => {
2240
2241
  const defect = exitDie(error);
2241
2242
  terminal = defect;
2242
2243
  done = true;
2243
- interrupted = true;
2244
- return fibers && fibers.size > 0 ? flatMap(uninterruptible(fiberInterruptAll(Array.from(fibers))), () => defect) : defect;
2244
+ return fibers && fibers.size > 0 ? flatMap(uninterruptible(fiberInterruptAll(Array.from(fibers))), () => terminal ?? defect) : defect;
2245
2245
  };
2246
2246
  const go = () => {
2247
2247
  let paused = false;
2248
2248
  for (; !terminal && index < end; index++) {
2249
2249
  const item = items[index];
2250
2250
  const eff = effect ?? onItem(state, item, index);
2251
- // fast case (already an exit)
2252
2251
  if (effectIsExit(eff)) {
2253
2252
  terminal = step(state, item, eff, index);
2254
2253
  if (terminal) break;
2255
- // We have an effect, so enter "async" mode
2256
2254
  } else if (!parentFiber) {
2257
2255
  return callback(cb => {
2258
2256
  parentFiber = getCurrentFiber();
@@ -2267,14 +2265,12 @@ const iterateConcurrentImpl = options => {
2267
2265
  }
2268
2266
  if (result) return cb(result);
2269
2267
  return suspend(() => {
2270
- terminal = exitVoid;
2271
- interrupted = true;
2272
- return fibers ? fiberInterruptAll(fibers) : void_;
2268
+ terminal ??= exitVoid;
2269
+ return flatMap(fibers ? fiberInterruptAll(fibers) : void_, () => terminal?._tag === "Failure" ? terminal : void_);
2273
2270
  });
2274
2271
  });
2275
- // Fork the effect with concurrency > 1
2276
2272
  } else {
2277
- // Clear the temporary effect from capturing the parentFiber
2273
+ // Clear the effect cached before the parent fiber was available.
2278
2274
  effect = undefined;
2279
2275
  const fiber = forkUnsafe(parentFiber, eff, true, true, "inherit");
2280
2276
  if (fiber._exit) {
@@ -2282,27 +2278,23 @@ const iterateConcurrentImpl = options => {
2282
2278
  if (terminal) break;
2283
2279
  continue;
2284
2280
  }
2285
- // Add the fiber to the Set
2286
2281
  fibers.add(fiber);
2287
2282
  const currentIndex = index;
2288
2283
  fiber.addObserver(exit => {
2289
2284
  fibers.delete(fiber);
2290
2285
  try {
2291
2286
  if (terminal) {
2292
- if (!interrupted && exit._tag === "Failure") {
2293
- for (const reason of exit.cause.reasons) {
2294
- if (reason._tag === "Interrupt") continue;else if (terminal._tag === "Failure") {
2295
- ;
2296
- terminal.cause.reasons.push(reason);
2297
- } else {
2298
- terminal = exitFailCause(causeFromReasons([reason]));
2299
- }
2287
+ if (exit._tag === "Failure") {
2288
+ const reasons = exit.cause.reasons.filter(reason => reason._tag !== "Interrupt");
2289
+ if (reasons.length > 0) {
2290
+ const cause = causeFromReasons(reasons);
2291
+ terminal = exitFailCause(terminal._tag === "Failure" ? causeCombine(terminal.cause, cause) : cause);
2300
2292
  }
2301
2293
  }
2302
2294
  } else {
2303
2295
  const result = step(state, item, exit, currentIndex);
2304
2296
  if (result) {
2305
- terminal = result._tag === "Failure" ? exitFailCause(causeFromReasons(result.cause.reasons.slice())) : result;
2297
+ terminal = result;
2306
2298
  go();
2307
2299
  }
2308
2300
  }
@@ -2316,7 +2308,6 @@ const iterateConcurrentImpl = options => {
2316
2308
  resume(failDefect(error));
2317
2309
  }
2318
2310
  });
2319
- // Check if we have reached the concurrency limit
2320
2311
  if (fibers.size < concurrency) continue;
2321
2312
  paused = true;
2322
2313
  index++;