@effect/platform-node 4.0.0-beta.103 → 4.0.0-beta.105

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 (98) hide show
  1. package/AGENTS.md +381 -0
  2. package/CLAUDE.md +381 -0
  3. package/ai-docs/README.md +44 -0
  4. package/ai-docs/package.json +36 -0
  5. package/ai-docs/src/01_effect/01_basics/01_effect-gen.ts +30 -0
  6. package/ai-docs/src/01_effect/01_basics/02_effect-fn.ts +39 -0
  7. package/ai-docs/src/01_effect/01_basics/10_creating-effects.ts +74 -0
  8. package/ai-docs/src/01_effect/01_basics/index.md +5 -0
  9. package/ai-docs/src/01_effect/02_schema/10_schema-basics.ts +43 -0
  10. package/ai-docs/src/01_effect/02_schema/index.md +7 -0
  11. package/ai-docs/src/01_effect/03_services/01_service.ts +45 -0
  12. package/ai-docs/src/01_effect/03_services/10_reference.ts +10 -0
  13. package/ai-docs/src/01_effect/03_services/20_layer-composition.ts +70 -0
  14. package/ai-docs/src/01_effect/03_services/20_layer-unwrap.ts +66 -0
  15. package/ai-docs/src/01_effect/03_services/index.md +5 -0
  16. package/ai-docs/src/01_effect/04_errors/01_error-handling.ts +30 -0
  17. package/ai-docs/src/01_effect/04_errors/10_catch-tags.ts +24 -0
  18. package/ai-docs/src/01_effect/04_errors/20_reason-errors.ts +64 -0
  19. package/ai-docs/src/01_effect/04_errors/index.md +1 -0
  20. package/ai-docs/src/01_effect/05_resources/10_acquire-release.ts +105 -0
  21. package/ai-docs/src/01_effect/05_resources/20_layer-side-effects.ts +31 -0
  22. package/ai-docs/src/01_effect/05_resources/30_layer-map.ts +86 -0
  23. package/ai-docs/src/01_effect/05_resources/index.md +3 -0
  24. package/ai-docs/src/01_effect/06_running/10_run-main.ts +30 -0
  25. package/ai-docs/src/01_effect/06_running/20_layer-launch.ts +27 -0
  26. package/ai-docs/src/01_effect/06_running/index.md +1 -0
  27. package/ai-docs/src/01_effect/07_pubsub/10_pubsub.ts +56 -0
  28. package/ai-docs/src/01_effect/07_pubsub/index.md +3 -0
  29. package/ai-docs/src/03_stream/10_creating-streams.ts +103 -0
  30. package/ai-docs/src/03_stream/20_consuming-streams.ts +137 -0
  31. package/ai-docs/src/03_stream/30_encoding.ts +165 -0
  32. package/ai-docs/src/03_stream/index.md +4 -0
  33. package/ai-docs/src/04_integration/10_managed-runtime.ts +129 -0
  34. package/ai-docs/src/04_integration/index.md +5 -0
  35. package/ai-docs/src/05_batching/10_request-resolver.ts +89 -0
  36. package/ai-docs/src/05_batching/index.md +3 -0
  37. package/ai-docs/src/06_schedule/10_schedules.ts +110 -0
  38. package/ai-docs/src/06_schedule/index.md +3 -0
  39. package/ai-docs/src/07_datetime/10_creating-and-formatting.ts +30 -0
  40. package/ai-docs/src/07_datetime/20_time-zones.ts +44 -0
  41. package/ai-docs/src/07_datetime/index.md +5 -0
  42. package/ai-docs/src/08_observability/10_logging.ts +66 -0
  43. package/ai-docs/src/08_observability/20_otlp-tracing.ts +95 -0
  44. package/ai-docs/src/08_observability/index.md +7 -0
  45. package/ai-docs/src/09_testing/10_effect-tests.ts +55 -0
  46. package/ai-docs/src/09_testing/20_layer-tests.ts +138 -0
  47. package/ai-docs/src/09_testing/index.md +1 -0
  48. package/ai-docs/src/10_predicate/01_basics.ts +14 -0
  49. package/ai-docs/src/10_predicate/index.md +9 -0
  50. package/ai-docs/src/50_http-client/10_basics.ts +102 -0
  51. package/ai-docs/src/50_http-client/index.md +3 -0
  52. package/ai-docs/src/51_http-server/10_basics.ts +116 -0
  53. package/ai-docs/src/51_http-server/fixtures/api/Api.ts +14 -0
  54. package/ai-docs/src/51_http-server/fixtures/api/Authorization.ts +36 -0
  55. package/ai-docs/src/51_http-server/fixtures/api/System.ts +10 -0
  56. package/ai-docs/src/51_http-server/fixtures/api/Users.ts +91 -0
  57. package/ai-docs/src/51_http-server/fixtures/domain/User.ts +12 -0
  58. package/ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts +22 -0
  59. package/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +36 -0
  60. package/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +71 -0
  61. package/ai-docs/src/51_http-server/fixtures/server/Users.ts +62 -0
  62. package/ai-docs/src/51_http-server/index.md +3 -0
  63. package/ai-docs/src/60_child-process/10_working-with-child-processes.ts +117 -0
  64. package/ai-docs/src/60_child-process/index.md +3 -0
  65. package/ai-docs/src/70_cli/10_basics.ts +136 -0
  66. package/ai-docs/src/70_cli/index.md +5 -0
  67. package/ai-docs/src/71_ai/10_language-model.ts +156 -0
  68. package/ai-docs/src/71_ai/20_tools.ts +226 -0
  69. package/ai-docs/src/71_ai/30_chat.ts +158 -0
  70. package/ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts +9 -0
  71. package/ai-docs/src/71_ai/index.md +5 -0
  72. package/ai-docs/src/80_cluster/10_entities.ts +97 -0
  73. package/ai-docs/src/80_cluster/index.md +4 -0
  74. package/ai-docs/src/index.md +10 -0
  75. package/ai-docs/tsconfig.json +24 -0
  76. package/dist/NodeHttpClient.d.ts.map +1 -1
  77. package/dist/NodeHttpClient.js +1 -1
  78. package/dist/NodeHttpClient.js.map +1 -1
  79. package/dist/NodeHttpServer.d.ts.map +1 -1
  80. package/dist/NodeHttpServer.js +1 -0
  81. package/dist/NodeHttpServer.js.map +1 -1
  82. package/dist/NodeMultipart.d.ts.map +1 -1
  83. package/dist/NodeMultipart.js +3 -2
  84. package/dist/NodeMultipart.js.map +1 -1
  85. package/dist/NodeMultipartParser.d.ts +97 -0
  86. package/dist/NodeMultipartParser.d.ts.map +1 -0
  87. package/dist/NodeMultipartParser.js +108 -0
  88. package/dist/NodeMultipartParser.js.map +1 -0
  89. package/dist/index.d.ts +4 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +4 -0
  92. package/dist/index.js.map +1 -1
  93. package/package.json +9 -6
  94. package/src/NodeHttpClient.ts +5 -2
  95. package/src/NodeHttpServer.ts +1 -0
  96. package/src/NodeMultipart.ts +5 -4
  97. package/src/NodeMultipartParser.ts +184 -0
  98. package/src/index.ts +5 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeMultipartParser.d.ts","sourceRoot":"","sources":["../src/NodeMultipartParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import { make as makeParser } from "effect/unstable/http/MultipartParser";
2
+ import { Duplex, Readable } from "node:stream";
3
+ /**
4
+ * A Node.js duplex stream that parses multipart input.
5
+ *
6
+ * @category models
7
+ * @since 4.0.0
8
+ */
9
+ export class MultipartStream extends Duplex {
10
+ _parser;
11
+ _canWrite = true;
12
+ _writeCallback;
13
+ constructor(config) {
14
+ super({
15
+ readableObjectMode: true
16
+ });
17
+ let currentError;
18
+ let currentFile;
19
+ this._parser = makeParser({
20
+ ...config,
21
+ onField: (info, value) => {
22
+ if (currentError !== undefined) return;
23
+ const field = {
24
+ _tag: "Field",
25
+ info,
26
+ value
27
+ };
28
+ this.push(field);
29
+ this.emit("field", field);
30
+ },
31
+ onFile: info => {
32
+ if (currentError !== undefined) return _ => {};
33
+ const file = new FileStream(info, this);
34
+ currentFile = file;
35
+ this.push(file);
36
+ this.emit("file", file);
37
+ return chunk => {
38
+ if (currentError !== undefined) return;
39
+ this._canWrite = file.push(chunk);
40
+ if (chunk === null && !this._canWrite) {
41
+ currentFile = undefined;
42
+ this._resume();
43
+ }
44
+ };
45
+ },
46
+ onError: error => {
47
+ this.emit("error", error);
48
+ currentFile?.emit("error", error);
49
+ currentError = error;
50
+ },
51
+ onDone: () => {
52
+ this.push(null);
53
+ }
54
+ });
55
+ }
56
+ _resume() {
57
+ this._canWrite = true;
58
+ if (this._writeCallback !== undefined) {
59
+ const callback = this._writeCallback;
60
+ this._writeCallback = undefined;
61
+ callback();
62
+ }
63
+ }
64
+ _read(_size) {}
65
+ _write(chunk, encoding, callback) {
66
+ this._parser.write(chunk instanceof Uint8Array ? chunk : Buffer.from(chunk, encoding));
67
+ if (this._canWrite) {
68
+ callback();
69
+ } else {
70
+ this._writeCallback = callback;
71
+ }
72
+ }
73
+ _final(callback) {
74
+ this._parser.end();
75
+ callback();
76
+ }
77
+ }
78
+ /**
79
+ * Creates a Node.js multipart parser stream.
80
+ *
81
+ * @category constructors
82
+ * @since 4.0.0
83
+ */
84
+ export const make = config => new MultipartStream(config);
85
+ /**
86
+ * A readable stream containing a parsed multipart file.
87
+ *
88
+ * @category models
89
+ * @since 4.0.0
90
+ */
91
+ export class FileStream extends Readable {
92
+ _tag = "File";
93
+ filename;
94
+ info;
95
+ _parent;
96
+ constructor(info, parent) {
97
+ super();
98
+ this.info = info;
99
+ this._parent = parent;
100
+ this.filename = info.filename;
101
+ }
102
+ _read(_size) {
103
+ if (this._parent._canWrite === false) {
104
+ this._parent._resume();
105
+ }
106
+ }
107
+ }
108
+ //# sourceMappingURL=NodeMultipartParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeMultipartParser.js","names":[],"sources":["../src/NodeMultipartParser.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/dist/index.d.ts CHANGED
@@ -49,6 +49,10 @@ export * as NodeHttpServerRequest from "./NodeHttpServerRequest.ts";
49
49
  * @since 4.0.0
50
50
  */
51
51
  export * as NodeMultipart from "./NodeMultipart.ts";
52
+ /**
53
+ * @since 4.0.0
54
+ */
55
+ export * as NodeMultipartParser from "./NodeMultipartParser.ts";
52
56
  /**
53
57
  * @since 4.0.0
54
58
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC;;GAEG;AACH,OAAO,KAAK,uBAAuB,MAAM,8BAA8B,CAAA;AAEvE;;GAEG;AACH,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAEvD;;GAEG;AACH,OAAO,KAAK,iBAAiB,MAAM,wBAAwB,CAAA;AAE3D;;GAEG;AACH,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C;;GAEG;AACH,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AAErD;;GAEG;AACH,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AAErD;;GAEG;AACH,OAAO,KAAK,uBAAuB,MAAM,8BAA8B,CAAA;AAEvE;;GAEG;AACH,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAA;AAEzD;;GAEG;AACH,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AAErD;;GAEG;AACH,OAAO,KAAK,qBAAqB,MAAM,4BAA4B,CAAA;AAEnE;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC;;GAEG;AACH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;GAEG;AACH,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAE/C;;GAEG;AACH,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAEjD;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC;;GAEG;AACH,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C;;GAEG;AACH,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAA;AAEzD;;GAEG;AACH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;GAEG;AACH,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C;;GAEG;AACH,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAEjD;;GAEG;AACH,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C;;GAEG;AACH,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAA;AAEzD;;GAEG;AACH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC;;GAEG;AACH,OAAO,KAAK,uBAAuB,MAAM,8BAA8B,CAAA;AAEvE;;GAEG;AACH,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAEvD;;GAEG;AACH,OAAO,KAAK,iBAAiB,MAAM,wBAAwB,CAAA;AAE3D;;GAEG;AACH,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C;;GAEG;AACH,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AAErD;;GAEG;AACH,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AAErD;;GAEG;AACH,OAAO,KAAK,uBAAuB,MAAM,8BAA8B,CAAA;AAEvE;;GAEG;AACH,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAA;AAEzD;;GAEG;AACH,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AAErD;;GAEG;AACH,OAAO,KAAK,qBAAqB,MAAM,4BAA4B,CAAA;AAEnE;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,mBAAmB,MAAM,0BAA0B,CAAA;AAE/D;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC;;GAEG;AACH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;GAEG;AACH,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAE/C;;GAEG;AACH,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAEjD;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC;;GAEG;AACH,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C;;GAEG;AACH,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAA;AAEzD;;GAEG;AACH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;GAEG;AACH,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C;;GAEG;AACH,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAEjD;;GAEG;AACH,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C;;GAEG;AACH,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAA;AAEzD;;GAEG;AACH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA"}
package/dist/index.js CHANGED
@@ -50,6 +50,10 @@ export * as NodeHttpServerRequest from "./NodeHttpServerRequest.js";
50
50
  * @since 4.0.0
51
51
  */
52
52
  export * as NodeMultipart from "./NodeMultipart.js";
53
+ /**
54
+ * @since 4.0.0
55
+ */
56
+ export * as NodeMultipartParser from "./NodeMultipartParser.js";
53
57
  /**
54
58
  * @since 4.0.0
55
59
  */
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAIA;AAEA;;;AAGA,OAAO,KAAK,IAAI,MAAM,WAAW;AAEjC;;;AAGA,OAAO,KAAK,uBAAuB,MAAM,8BAA8B;AAEvE;;;AAGA,OAAO,KAAK,eAAe,MAAM,sBAAsB;AAEvD;;;AAGA,OAAO,KAAK,iBAAiB,MAAM,wBAAwB;AAE3D;;;AAGA,OAAO,KAAK,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAK,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAK,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAK,uBAAuB,MAAM,8BAA8B;AAEvE;;;AAGA,OAAO,KAAK,gBAAgB,MAAM,uBAAuB;AAEzD;;;AAGA,OAAO,KAAK,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAK,qBAAqB,MAAM,4BAA4B;AAEnE;;;AAGA,OAAO,KAAK,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAK,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAK,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAK,WAAW,MAAM,kBAAkB;AAE/C;;;AAGA,OAAO,KAAK,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAK,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAK,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAK,gBAAgB,MAAM,uBAAuB;AAEzD;;;AAGA,OAAO,KAAK,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAK,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAK,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAK,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAK,gBAAgB,MAAM,uBAAuB;AAEzD;;;AAGA,OAAO,KAAK,MAAM,MAAM,aAAa","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAIA;AAEA;;;AAGA,OAAO,KAAK,IAAI,MAAM,WAAW;AAEjC;;;AAGA,OAAO,KAAK,uBAAuB,MAAM,8BAA8B;AAEvE;;;AAGA,OAAO,KAAK,eAAe,MAAM,sBAAsB;AAEvD;;;AAGA,OAAO,KAAK,iBAAiB,MAAM,wBAAwB;AAE3D;;;AAGA,OAAO,KAAK,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAK,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAK,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAK,uBAAuB,MAAM,8BAA8B;AAEvE;;;AAGA,OAAO,KAAK,gBAAgB,MAAM,uBAAuB;AAEzD;;;AAGA,OAAO,KAAK,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAK,qBAAqB,MAAM,4BAA4B;AAEnE;;;AAGA,OAAO,KAAK,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAK,mBAAmB,MAAM,0BAA0B;AAE/D;;;AAGA,OAAO,KAAK,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAK,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAK,WAAW,MAAM,kBAAkB;AAE/C;;;AAGA,OAAO,KAAK,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAK,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAK,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAK,gBAAgB,MAAM,uBAAuB;AAEzD;;;AAGA,OAAO,KAAK,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAK,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAK,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAK,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAK,gBAAgB,MAAM,uBAAuB;AAEzD;;;AAGA,OAAO,KAAK,MAAM,MAAM,aAAa","ignoreList":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@effect/platform-node",
3
3
  "type": "module",
4
- "version": "4.0.0-beta.103",
4
+ "version": "4.0.0-beta.105",
5
5
  "license": "MIT",
6
6
  "description": "Platform specific implementations for the Node.js runtime",
7
7
  "homepage": "https://effect.website",
@@ -42,7 +42,10 @@
42
42
  "dist/**/*.js",
43
43
  "dist/**/*.js.map",
44
44
  "dist/**/*.d.ts",
45
- "dist/**/*.d.ts.map"
45
+ "dist/**/*.d.ts.map",
46
+ "AGENTS.md",
47
+ "CLAUDE.md",
48
+ "ai-docs/**/*"
46
49
  ],
47
50
  "publishConfig": {
48
51
  "access": "public",
@@ -51,18 +54,18 @@
51
54
  "dependencies": {
52
55
  "mime": "^4.1.0",
53
56
  "undici": "^8.7.0",
54
- "@effect/platform-node-shared": "^4.0.0-beta.103"
57
+ "@effect/platform-node-shared": "^4.0.0-beta.105"
55
58
  },
56
59
  "peerDependencies": {
57
- "ioredis": "^5.7.0",
58
- "effect": "^4.0.0-beta.103"
60
+ "ioredis": ">=5.7.0 <6.0.0",
61
+ "effect": "^4.0.0-beta.105"
59
62
  },
60
63
  "devDependencies": {
61
64
  "@testcontainers/mysql": "^12.0.4",
62
65
  "@testcontainers/postgresql": "^12.0.4",
63
66
  "@testcontainers/redis": "^12.0.4",
64
67
  "@types/node": "^26.1.2",
65
- "effect": "^4.0.0-beta.103"
68
+ "effect": "^4.0.0-beta.105"
66
69
  },
67
70
  "scripts": {
68
71
  "codegen": "effect-utils codegen",
@@ -455,8 +455,11 @@ export const makeNodeHttp = Effect.gen(function*() {
455
455
  headers: request.headers,
456
456
  signal
457
457
  })
458
- return Effect.forkChild(sendBody(nodeRequest, request, request.body)).pipe(
459
- Effect.flatMap(() => waitForResponse(nodeRequest, request)),
458
+ return Effect.raceFirst(
459
+ waitForResponse(nodeRequest, request),
460
+ sendBody(nodeRequest, request, request.body).pipe(Effect.andThen(Effect.never))
461
+ ).pipe(
462
+ Effect.onError(() => Effect.sync(() => nodeRequest.destroy())),
460
463
  Effect.map((_) => new NodeHttpResponse(request, _))
461
464
  )
462
465
  })
@@ -278,6 +278,7 @@ export const makeUpgradeHandler = <
278
278
  new ServerRequestImpl(nodeRequest, nodeResponse, upgradeEffect)
279
279
  )
280
280
  const fiber = Fiber.runIn(Effect.runForkWith(context as Context.Context<any>)(handledApp), options.scope)
281
+ socket.on("error", () => {})
281
282
  socket.on("close", () => {
282
283
  if (!socket.writableEnded) {
283
284
  fiber.interruptUnsafe(parent.id, ClientAbort.annotation)
@@ -17,11 +17,12 @@ import type * as Path from "effect/Path"
17
17
  import type * as Scope from "effect/Scope"
18
18
  import * as Stream from "effect/Stream"
19
19
  import * as Multipart from "effect/unstable/http/Multipart"
20
- import * as MP from "effect/unstable/http/Multipasta/Node"
20
+ import * as MultipartParser from "effect/unstable/http/MultipartParser"
21
21
  import * as NFS from "node:fs"
22
22
  import type { IncomingHttpHeaders } from "node:http"
23
23
  import type { Readable } from "node:stream"
24
24
  import * as NodeStreamP from "node:stream/promises"
25
+ import * as MP from "./NodeMultipartParser.ts"
25
26
  import * as NodeStream from "./NodeStream.ts"
26
27
 
27
28
  /**
@@ -103,13 +104,13 @@ class FieldImpl extends PartBase implements Multipart.Field {
103
104
  readonly value: string
104
105
 
105
106
  constructor(
106
- info: MP.PartInfo,
107
+ info: MultipartParser.PartInfo,
107
108
  value: Uint8Array
108
109
  ) {
109
110
  super()
110
111
  this.key = info.name
111
112
  this.contentType = info.contentType
112
- this.value = MP.decodeField(info, value)
113
+ this.value = MultipartParser.decodeField(info, value)
113
114
  }
114
115
 
115
116
  toJSON(): unknown {
@@ -158,7 +159,7 @@ class FileImpl extends PartBase implements Multipart.File {
158
159
  }
159
160
  }
160
161
 
161
- function convertError(cause: MP.MultipartError): Multipart.MultipartError {
162
+ function convertError(cause: MultipartParser.MultipartError): Multipart.MultipartError {
162
163
  switch (cause._tag) {
163
164
  case "ReachedLimit": {
164
165
  switch (cause.limit) {
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Node.js streams adapter for the low-level multipart parser.
3
+ *
4
+ * @since 4.0.0
5
+ */
6
+ // oxlint-disable typescript/no-unsafe-declaration-merging
7
+ /// <reference types="node" />
8
+ import type { BaseConfig, MultipartError, Parser, PartInfo } from "effect/unstable/http/MultipartParser"
9
+ import { make as makeParser } from "effect/unstable/http/MultipartParser"
10
+ import type { IncomingHttpHeaders } from "node:http"
11
+ import { Duplex, Readable } from "node:stream"
12
+
13
+ /**
14
+ * A part emitted by the Node.js multipart parser.
15
+ *
16
+ * @category models
17
+ * @since 4.0.0
18
+ */
19
+ export type Part = Field | FileStream
20
+
21
+ /**
22
+ * A parsed multipart field.
23
+ *
24
+ * @category models
25
+ * @since 4.0.0
26
+ */
27
+ export interface Field {
28
+ readonly _tag: "Field"
29
+ readonly info: PartInfo
30
+ readonly value: Uint8Array
31
+ }
32
+
33
+ /**
34
+ * A Node.js duplex stream that emits parsed multipart parts.
35
+ *
36
+ * @category models
37
+ * @since 4.0.0
38
+ */
39
+ export interface MultipartStream extends Duplex {
40
+ [Symbol.asyncIterator](): NodeJS.AsyncIterator<Part>
41
+
42
+ on(event: "field", listener: (field: Field) => void): this
43
+ on(event: "file", listener: (file: FileStream) => void): this
44
+ on(event: "close", listener: () => void): this
45
+ on(event: "data", listener: (part: Part) => void): this
46
+ on(event: "drain", listener: () => void): this
47
+ on(event: "end", listener: () => void): this
48
+ on(event: "error", listener: (err: MultipartError) => void): this
49
+ on(event: "finish", listener: () => void): this
50
+ on(event: "pause", listener: () => void): this
51
+ on(event: "pipe", listener: (src: Readable) => void): this
52
+ on(event: "readable", listener: () => void): this
53
+ on(event: "resume", listener: () => void): this
54
+ on(event: "unpipe", listener: (src: Readable) => void): this
55
+ on(event: string | symbol, listener: (...args: Array<any>) => void): this
56
+
57
+ read(size?: number): Part | null
58
+ }
59
+
60
+ /**
61
+ * Configuration for the Node.js multipart parser.
62
+ *
63
+ * @category models
64
+ * @since 4.0.0
65
+ */
66
+ export type NodeConfig = Omit<BaseConfig, "headers"> & {
67
+ readonly headers: IncomingHttpHeaders
68
+ }
69
+
70
+ /**
71
+ * A Node.js duplex stream that parses multipart input.
72
+ *
73
+ * @category models
74
+ * @since 4.0.0
75
+ */
76
+ export class MultipartStream extends Duplex {
77
+ private _parser: Parser
78
+ _canWrite = true
79
+ private _writeCallback: (() => void) | undefined
80
+
81
+ constructor(config: NodeConfig) {
82
+ super({ readableObjectMode: true })
83
+ let currentError: MultipartError | undefined
84
+ let currentFile: FileStream | undefined
85
+ this._parser = makeParser({
86
+ ...(config as any),
87
+ onField: (info, value) => {
88
+ if (currentError !== undefined) return
89
+ const field: Field = { _tag: "Field", info, value }
90
+ this.push(field)
91
+ this.emit("field", field)
92
+ },
93
+ onFile: (info) => {
94
+ if (currentError !== undefined) return (_) => {}
95
+ const file = new FileStream(info, this)
96
+ currentFile = file
97
+ this.push(file)
98
+ this.emit("file", file)
99
+ return (chunk) => {
100
+ if (currentError !== undefined) return
101
+ this._canWrite = file.push(chunk)
102
+ if (chunk === null && !this._canWrite) {
103
+ currentFile = undefined
104
+ this._resume()
105
+ }
106
+ }
107
+ },
108
+ onError: (error) => {
109
+ this.emit("error", error)
110
+ currentFile?.emit("error", error)
111
+ currentError = error
112
+ },
113
+ onDone: () => {
114
+ this.push(null)
115
+ }
116
+ })
117
+ }
118
+
119
+ _resume() {
120
+ this._canWrite = true
121
+ if (this._writeCallback !== undefined) {
122
+ const callback = this._writeCallback
123
+ this._writeCallback = undefined
124
+ callback()
125
+ }
126
+ }
127
+
128
+ override _read(_size: number) {}
129
+
130
+ override _write(
131
+ chunk: any,
132
+ encoding: BufferEncoding,
133
+ callback: (error?: Error | null | undefined) => void
134
+ ): void {
135
+ this._parser.write(
136
+ chunk instanceof Uint8Array ? chunk : Buffer.from(chunk, encoding)
137
+ )
138
+ if (this._canWrite) {
139
+ callback()
140
+ } else {
141
+ this._writeCallback = callback
142
+ }
143
+ }
144
+
145
+ override _final(callback: (error?: Error | null | undefined) => void): void {
146
+ this._parser.end()
147
+ callback()
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Creates a Node.js multipart parser stream.
153
+ *
154
+ * @category constructors
155
+ * @since 4.0.0
156
+ */
157
+ export const make = (config: NodeConfig): MultipartStream => new MultipartStream(config)
158
+
159
+ /**
160
+ * A readable stream containing a parsed multipart file.
161
+ *
162
+ * @category models
163
+ * @since 4.0.0
164
+ */
165
+ export class FileStream extends Readable {
166
+ readonly _tag = "File"
167
+ readonly filename: string | undefined
168
+ readonly info: PartInfo
169
+ private _parent: MultipartStream
170
+ constructor(
171
+ info: PartInfo,
172
+ parent: MultipartStream
173
+ ) {
174
+ super()
175
+ this.info = info
176
+ this._parent = parent
177
+ this.filename = info.filename
178
+ }
179
+ override _read(_size: number) {
180
+ if (this._parent._canWrite === false) {
181
+ this._parent._resume()
182
+ }
183
+ }
184
+ }
package/src/index.ts CHANGED
@@ -64,6 +64,11 @@ export * as NodeHttpServerRequest from "./NodeHttpServerRequest.ts"
64
64
  */
65
65
  export * as NodeMultipart from "./NodeMultipart.ts"
66
66
 
67
+ /**
68
+ * @since 4.0.0
69
+ */
70
+ export * as NodeMultipartParser from "./NodeMultipartParser.ts"
71
+
67
72
  /**
68
73
  * @since 4.0.0
69
74
  */