@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.
- package/AGENTS.md +381 -0
- package/CLAUDE.md +381 -0
- package/ai-docs/README.md +44 -0
- package/ai-docs/package.json +36 -0
- package/ai-docs/src/01_effect/01_basics/01_effect-gen.ts +30 -0
- package/ai-docs/src/01_effect/01_basics/02_effect-fn.ts +39 -0
- package/ai-docs/src/01_effect/01_basics/10_creating-effects.ts +74 -0
- package/ai-docs/src/01_effect/01_basics/index.md +5 -0
- package/ai-docs/src/01_effect/02_schema/10_schema-basics.ts +43 -0
- package/ai-docs/src/01_effect/02_schema/index.md +7 -0
- package/ai-docs/src/01_effect/03_services/01_service.ts +45 -0
- package/ai-docs/src/01_effect/03_services/10_reference.ts +10 -0
- package/ai-docs/src/01_effect/03_services/20_layer-composition.ts +70 -0
- package/ai-docs/src/01_effect/03_services/20_layer-unwrap.ts +66 -0
- package/ai-docs/src/01_effect/03_services/index.md +5 -0
- package/ai-docs/src/01_effect/04_errors/01_error-handling.ts +30 -0
- package/ai-docs/src/01_effect/04_errors/10_catch-tags.ts +24 -0
- package/ai-docs/src/01_effect/04_errors/20_reason-errors.ts +64 -0
- package/ai-docs/src/01_effect/04_errors/index.md +1 -0
- package/ai-docs/src/01_effect/05_resources/10_acquire-release.ts +105 -0
- package/ai-docs/src/01_effect/05_resources/20_layer-side-effects.ts +31 -0
- package/ai-docs/src/01_effect/05_resources/30_layer-map.ts +86 -0
- package/ai-docs/src/01_effect/05_resources/index.md +3 -0
- package/ai-docs/src/01_effect/06_running/10_run-main.ts +30 -0
- package/ai-docs/src/01_effect/06_running/20_layer-launch.ts +27 -0
- package/ai-docs/src/01_effect/06_running/index.md +1 -0
- package/ai-docs/src/01_effect/07_pubsub/10_pubsub.ts +56 -0
- package/ai-docs/src/01_effect/07_pubsub/index.md +3 -0
- package/ai-docs/src/03_stream/10_creating-streams.ts +103 -0
- package/ai-docs/src/03_stream/20_consuming-streams.ts +137 -0
- package/ai-docs/src/03_stream/30_encoding.ts +165 -0
- package/ai-docs/src/03_stream/index.md +4 -0
- package/ai-docs/src/04_integration/10_managed-runtime.ts +129 -0
- package/ai-docs/src/04_integration/index.md +5 -0
- package/ai-docs/src/05_batching/10_request-resolver.ts +89 -0
- package/ai-docs/src/05_batching/index.md +3 -0
- package/ai-docs/src/06_schedule/10_schedules.ts +110 -0
- package/ai-docs/src/06_schedule/index.md +3 -0
- package/ai-docs/src/07_datetime/10_creating-and-formatting.ts +30 -0
- package/ai-docs/src/07_datetime/20_time-zones.ts +44 -0
- package/ai-docs/src/07_datetime/index.md +5 -0
- package/ai-docs/src/08_observability/10_logging.ts +66 -0
- package/ai-docs/src/08_observability/20_otlp-tracing.ts +95 -0
- package/ai-docs/src/08_observability/index.md +7 -0
- package/ai-docs/src/09_testing/10_effect-tests.ts +55 -0
- package/ai-docs/src/09_testing/20_layer-tests.ts +138 -0
- package/ai-docs/src/09_testing/index.md +1 -0
- package/ai-docs/src/10_predicate/01_basics.ts +14 -0
- package/ai-docs/src/10_predicate/index.md +9 -0
- package/ai-docs/src/50_http-client/10_basics.ts +102 -0
- package/ai-docs/src/50_http-client/index.md +3 -0
- package/ai-docs/src/51_http-server/10_basics.ts +116 -0
- package/ai-docs/src/51_http-server/fixtures/api/Api.ts +14 -0
- package/ai-docs/src/51_http-server/fixtures/api/Authorization.ts +36 -0
- package/ai-docs/src/51_http-server/fixtures/api/System.ts +10 -0
- package/ai-docs/src/51_http-server/fixtures/api/Users.ts +91 -0
- package/ai-docs/src/51_http-server/fixtures/domain/User.ts +12 -0
- package/ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts +22 -0
- package/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +36 -0
- package/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +71 -0
- package/ai-docs/src/51_http-server/fixtures/server/Users.ts +62 -0
- package/ai-docs/src/51_http-server/index.md +3 -0
- package/ai-docs/src/60_child-process/10_working-with-child-processes.ts +117 -0
- package/ai-docs/src/60_child-process/index.md +3 -0
- package/ai-docs/src/70_cli/10_basics.ts +136 -0
- package/ai-docs/src/70_cli/index.md +5 -0
- package/ai-docs/src/71_ai/10_language-model.ts +156 -0
- package/ai-docs/src/71_ai/20_tools.ts +226 -0
- package/ai-docs/src/71_ai/30_chat.ts +158 -0
- package/ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts +9 -0
- package/ai-docs/src/71_ai/index.md +5 -0
- package/ai-docs/src/80_cluster/10_entities.ts +97 -0
- package/ai-docs/src/80_cluster/index.md +4 -0
- package/ai-docs/src/index.md +10 -0
- package/ai-docs/tsconfig.json +24 -0
- package/dist/NodeHttpClient.d.ts.map +1 -1
- package/dist/NodeHttpClient.js +1 -1
- package/dist/NodeHttpClient.js.map +1 -1
- package/dist/NodeHttpServer.d.ts.map +1 -1
- package/dist/NodeHttpServer.js +1 -0
- package/dist/NodeHttpServer.js.map +1 -1
- package/dist/NodeMultipart.d.ts.map +1 -1
- package/dist/NodeMultipart.js +3 -2
- package/dist/NodeMultipart.js.map +1 -1
- package/dist/NodeMultipartParser.d.ts +97 -0
- package/dist/NodeMultipartParser.d.ts.map +1 -0
- package/dist/NodeMultipartParser.js +108 -0
- package/dist/NodeMultipartParser.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +9 -6
- package/src/NodeHttpClient.ts +5 -2
- package/src/NodeHttpServer.ts +1 -0
- package/src/NodeMultipart.ts +5 -4
- package/src/NodeMultipartParser.ts +184 -0
- 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
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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.
|
|
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.
|
|
57
|
+
"@effect/platform-node-shared": "^4.0.0-beta.105"
|
|
55
58
|
},
|
|
56
59
|
"peerDependencies": {
|
|
57
|
-
"ioredis": "
|
|
58
|
-
"effect": "^4.0.0-beta.
|
|
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.
|
|
68
|
+
"effect": "^4.0.0-beta.105"
|
|
66
69
|
},
|
|
67
70
|
"scripts": {
|
|
68
71
|
"codegen": "effect-utils codegen",
|
package/src/NodeHttpClient.ts
CHANGED
|
@@ -455,8 +455,11 @@ export const makeNodeHttp = Effect.gen(function*() {
|
|
|
455
455
|
headers: request.headers,
|
|
456
456
|
signal
|
|
457
457
|
})
|
|
458
|
-
return Effect.
|
|
459
|
-
|
|
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
|
})
|
package/src/NodeHttpServer.ts
CHANGED
|
@@ -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)
|
package/src/NodeMultipart.ts
CHANGED
|
@@ -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
|
|
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:
|
|
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 =
|
|
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:
|
|
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
|
*/
|