@effect/platform-node 0.29.4 → 0.30.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.
@@ -5,9 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  var _exportNames = {
7
7
  stream: true,
8
- formData: true
8
+ formData: true,
9
+ fileToReadable: true
9
10
  };
10
- exports.stream = exports.formData = void 0;
11
+ exports.stream = exports.formData = exports.fileToReadable = void 0;
11
12
  var internal = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../internal/http/formData.js"));
12
13
  var _FormData = /*#__PURE__*/require("@effect/platform/Http/FormData");
13
14
  Object.keys(_FormData).forEach(function (key) {
@@ -60,4 +61,9 @@ const stream = exports.stream = internal.stream;
60
61
  * @category constructors
61
62
  */
62
63
  const formData = exports.formData = internal.formData;
64
+ /**
65
+ * @since 1.0.0
66
+ * @category conversions
67
+ */
68
+ const fileToReadable = exports.fileToReadable = internal.fileToReadable;
63
69
  //# sourceMappingURL=FormData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormData.js","names":["internal","_interopRequireWildcard","require","_FormData","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","n","__proto__","a","getOwnPropertyDescriptor","u","i","set","stream","formData"],"sources":["../../../src/Http/FormData.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;AAaA,IAAAA,QAAA,gBAAAC,uBAAA,eAAAC,OAAA;AAKA,IAAAC,SAAA,gBAAAD,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAF,SAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,SAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,SAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AAA8C,SAAAS,yBAAAC,CAAA;EAAA,yBAAAC,OAAA;EAAA,IAAAC,CAAA,OAAAD,OAAA;IAAAE,CAAA,OAAAF,OAAA;EAAA,QAAAF,wBAAA,YAAAA,CAAAC,CAAA;IAAA,OAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA;EAAA,GAAAF,CAAA;AAAA;AAAA,SAAAhB,wBAAAgB,CAAA,EAAAE,CAAA;EAAA,KAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA;EAAA,aAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA;IAAAK,OAAA,EAAAL;EAAA;EAAA,IAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA;EAAA,IAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAL,GAAA,CAAAE,CAAA;EAAA,IAAAO,CAAA;MAAAC,SAAA;IAAA;IAAAC,CAAA,GAAAtB,MAAA,CAAAS,cAAA,IAAAT,MAAA,CAAAuB,wBAAA;EAAA,SAAAC,CAAA,IAAAX,CAAA,oBAAAW,CAAA,IAAAxB,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAO,CAAA,EAAAW,CAAA;IAAA,IAAAC,CAAA,GAAAH,CAAA,GAAAtB,MAAA,CAAAuB,wBAAA,CAAAV,CAAA,EAAAW,CAAA;IAAAC,CAAA,KAAAA,CAAA,CAAAd,GAAA,IAAAc,CAAA,CAAAC,GAAA,IAAA1B,MAAA,CAAAS,cAAA,CAAAW,CAAA,EAAAI,CAAA,EAAAC,CAAA,IAAAL,CAAA,CAAAI,CAAA,IAAAX,CAAA,CAAAW,CAAA;EAAA;EAAA,OAAAJ,CAAA,CAAAF,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAU,GAAA,CAAAb,CAAA,EAAAO,CAAA,GAAAA,CAAA;AAAA;AAH9C;;;;AAKA;;;;AAIO,MAAMO,MAAM,GAAAnB,OAAA,CAAAmB,MAAA,GAGgD/B,QAAQ,CAAC+B,MAAM;AAElF;;;;AAIO,MAAMC,QAAQ,GAAApB,OAAA,CAAAoB,QAAA,GAInBhC,QAAQ,CAACgC,QAAQ"}
1
+ {"version":3,"file":"FormData.js","names":["internal","_interopRequireWildcard","require","_FormData","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","n","__proto__","a","getOwnPropertyDescriptor","u","i","set","stream","formData","fileToReadable"],"sources":["../../../src/Http/FormData.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;AAaA,IAAAA,QAAA,gBAAAC,uBAAA,eAAAC,OAAA;AAKA,IAAAC,SAAA,gBAAAD,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAF,SAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,SAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,SAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AAA8C,SAAAS,yBAAAC,CAAA;EAAA,yBAAAC,OAAA;EAAA,IAAAC,CAAA,OAAAD,OAAA;IAAAE,CAAA,OAAAF,OAAA;EAAA,QAAAF,wBAAA,YAAAA,CAAAC,CAAA;IAAA,OAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA;EAAA,GAAAF,CAAA;AAAA;AAAA,SAAAhB,wBAAAgB,CAAA,EAAAE,CAAA;EAAA,KAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA;EAAA,aAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA;IAAAK,OAAA,EAAAL;EAAA;EAAA,IAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA;EAAA,IAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAL,GAAA,CAAAE,CAAA;EAAA,IAAAO,CAAA;MAAAC,SAAA;IAAA;IAAAC,CAAA,GAAAtB,MAAA,CAAAS,cAAA,IAAAT,MAAA,CAAAuB,wBAAA;EAAA,SAAAC,CAAA,IAAAX,CAAA,oBAAAW,CAAA,IAAAxB,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAO,CAAA,EAAAW,CAAA;IAAA,IAAAC,CAAA,GAAAH,CAAA,GAAAtB,MAAA,CAAAuB,wBAAA,CAAAV,CAAA,EAAAW,CAAA;IAAAC,CAAA,KAAAA,CAAA,CAAAd,GAAA,IAAAc,CAAA,CAAAC,GAAA,IAAA1B,MAAA,CAAAS,cAAA,CAAAW,CAAA,EAAAI,CAAA,EAAAC,CAAA,IAAAL,CAAA,CAAAI,CAAA,IAAAX,CAAA,CAAAW,CAAA;EAAA;EAAA,OAAAJ,CAAA,CAAAF,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAU,GAAA,CAAAb,CAAA,EAAAO,CAAA,GAAAA,CAAA;AAAA;AAH9C;;;;AAKA;;;;AAIO,MAAMO,MAAM,GAAAnB,OAAA,CAAAmB,MAAA,GAGgD/B,QAAQ,CAAC+B,MAAM;AAElF;;;;AAIO,MAAMC,QAAQ,GAAApB,OAAA,CAAAoB,QAAA,GAOjBhC,QAAQ,CAACgC,QAAQ;AAErB;;;;AAIO,MAAMC,cAAc,GAAArB,OAAA,CAAAqB,cAAA,GAAsCjC,QAAQ,CAACiC,cAAc"}
@@ -3,25 +3,16 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.stream = exports.formData = void 0;
7
- var FileSystem = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/platform/FileSystem"));
6
+ exports.stream = exports.formData = exports.fileToReadable = void 0;
8
7
  var FormData = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/platform/Http/FormData"));
9
- var Path = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/platform/Path"));
10
- var _busboy = /*#__PURE__*/_interopRequireDefault( /*#__PURE__*/require("busboy"));
11
- var Chunk = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Chunk"));
12
8
  var Effect = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Effect"));
13
- var FiberRef = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/FiberRef"));
14
9
  var _Function = /*#__PURE__*/require("effect/Function");
15
- var Option = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Option"));
16
10
  var Stream = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Stream"));
17
- var NodeFs = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("node:fs"));
11
+ var _multipasta = /*#__PURE__*/require("multipasta");
12
+ var MP = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("multipasta/node"));
13
+ var NFS = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("node:fs"));
18
14
  var NodeStreamP = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("node:stream/promises"));
19
- var NodeStream = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../../Stream.js"));
20
- function _interopRequireDefault(obj) {
21
- return obj && obj.__esModule ? obj : {
22
- default: obj
23
- };
24
- }
15
+ var NodeStream = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../stream.js"));
25
16
  function _getRequireWildcardCache(e) {
26
17
  if ("function" != typeof WeakMap) return null;
27
18
  var r = new WeakMap(),
@@ -47,104 +38,82 @@ function _interopRequireWildcard(e, r) {
47
38
  }
48
39
  return n.default = e, t && t.set(e, n), n;
49
40
  }
50
- const stream = (source, headers) => (0, _Function.pipe)(Effect.Do, Effect.bind("maxParts", () => FiberRef.get(FormData.maxParts)), Effect.bind("maxFields", () => FiberRef.get(FormData.maxFields)), Effect.bind("maxFiles", () => FiberRef.get(FormData.maxFiles)), Effect.bind("fieldMimeTypes", () => FiberRef.get(FormData.fieldMimeTypes)), Effect.bind("maxFieldSize", () => FiberRef.get(FormData.maxFieldSize)), Effect.bind("maxFileSize", () => FiberRef.get(FormData.maxFileSize)), Effect.bind("busboy", ({
51
- maxFieldSize,
52
- maxFields,
53
- maxFileSize,
54
- maxFiles,
55
- maxParts
56
- }) => Effect.acquireRelease(Effect.sync(() => (0, _busboy.default)({
57
- headers,
58
- limits: {
59
- parts: Option.getOrUndefined(Option.map(maxParts, Number)),
60
- files: Option.getOrUndefined(Option.map(maxFiles, Number)),
61
- fields: Option.getOrUndefined(Option.map(maxFields, Number)),
62
- fieldSize: Number(maxFieldSize),
63
- fileSize: Option.getOrUndefined(Option.map(maxFileSize, Number))
64
- }
65
- })), busboy => Effect.sync(() => {
66
- busboy.removeAllListeners();
67
- if (!busboy.closed) {
68
- busboy.destroy();
69
- }
70
- }))), Effect.map(({
71
- busboy,
72
- fieldMimeTypes
73
- }) => Stream.mapEffect(Stream.async(emit => {
74
- busboy.on("field", (name, value, info) => {
75
- if (info.valueTruncated) {
76
- emit.fail(FormData.FormDataError("FieldTooLarge", new Error("maxFieldSize exceeded")));
77
- } else {
78
- emit.single(new FieldImpl(name, info.mimeType, value));
79
- }
80
- });
81
- busboy.on("file", (name, stream, info) => {
82
- stream.once("limit", () => {
83
- emit.fail(FormData.FormDataError("FileTooLarge", new Error("maxFileSize exceeded")));
84
- });
85
- emit.single(new FileImpl(name, info.filename, info.mimeType, NodeStream.fromReadable(() => stream, error => FormData.FormDataError("InternalError", error)), stream));
86
- });
87
- busboy.on("error", _ => {
88
- emit.fail(FormData.FormDataError("InternalError", _));
89
- });
90
- busboy.on("finish", () => {
91
- emit.end();
92
- });
93
- source.pipe(busboy);
94
- }), part => part._tag === "File" && Chunk.some(fieldMimeTypes, _ => part.contentType.includes(_)) ? Effect.map(NodeStream.toString(() => part.source, {
95
- onFailure: error => FormData.FormDataError("InternalError", error)
96
- }), content => new FieldImpl(part.key, part.contentType, content)) : Effect.succeed(part))), Stream.unwrapScoped);
41
+ /** @internal */
42
+ const stream = (source, headers) => (0, _Function.pipe)(FormData.makeConfig(headers), Effect.map(config => NodeStream.fromReadable(() => {
43
+ const parser = MP.make(config);
44
+ source.pipe(parser);
45
+ return parser;
46
+ }, error => convertError(error))), Stream.unwrap, Stream.map(convertPart));
47
+ /** @internal */
97
48
  exports.stream = stream;
49
+ const formData = (source, headers) => FormData.formData(stream(source, headers), (path, file) => Effect.tryPromise({
50
+ try: signal => NodeStreamP.pipeline(file.file, NFS.createWriteStream(path), {
51
+ signal
52
+ }),
53
+ catch: error => FormData.FormDataError("InternalError", error)
54
+ }));
55
+ exports.formData = formData;
56
+ const convertPart = part => part._tag === "Field" ? new FieldImpl(part.info, part.value) : new FileImpl(part);
98
57
  class FieldImpl {
58
+ [FormData.TypeId];
59
+ _tag = "Field";
99
60
  key;
100
61
  contentType;
101
62
  value;
102
- [FormData.TypeId];
103
- _tag = "Field";
104
- constructor(key, contentType, value) {
105
- this.key = key;
106
- this.contentType = contentType;
107
- this.value = value;
63
+ constructor(info, value) {
108
64
  this[FormData.TypeId] = FormData.TypeId;
65
+ this.key = info.name;
66
+ this.contentType = info.contentType;
67
+ this.value = (0, _multipasta.decodeField)(info, value);
109
68
  }
110
69
  }
111
70
  class FileImpl {
71
+ file;
72
+ _tag = "File";
73
+ [FormData.TypeId];
112
74
  key;
113
75
  name;
114
76
  contentType;
115
77
  content;
116
- source;
117
- [FormData.TypeId];
118
- _tag = "File";
119
- constructor(key, name, contentType, content, source) {
120
- this.key = key;
121
- this.name = name;
122
- this.contentType = contentType;
123
- this.content = content;
124
- this.source = source;
78
+ constructor(file) {
79
+ this.file = file;
125
80
  this[FormData.TypeId] = FormData.TypeId;
81
+ this.key = file.info.name;
82
+ this.name = file.filename ?? file.info.name;
83
+ this.contentType = file.info.contentType;
84
+ this.content = NodeStream.fromReadable(() => file, error => FormData.FormDataError("InternalError", error));
126
85
  }
127
86
  }
128
87
  /** @internal */
129
- const formData = (source, headers) => Effect.flatMap(Effect.all([Effect.mapError(Effect.flatMap(FileSystem.FileSystem, fs => fs.makeTempDirectoryScoped()), error => FormData.FormDataError("InternalError", error)), Path.Path]), ([dir, path_]) => Stream.runFoldEffect(stream(source, headers), new globalThis.FormData(), (formData, part) => {
130
- if (part._tag === "Field") {
131
- formData.append(part.key, part.value);
132
- return Effect.succeed(formData);
88
+ const fileToReadable = file => file.file;
89
+ exports.fileToReadable = fileToReadable;
90
+ function convertError(error) {
91
+ switch (error._tag) {
92
+ case "ReachedLimit":
93
+ {
94
+ switch (error.limit) {
95
+ case "MaxParts":
96
+ {
97
+ return FormData.FormDataError("TooManyParts", error);
98
+ }
99
+ case "MaxFieldSize":
100
+ {
101
+ return FormData.FormDataError("FieldTooLarge", error);
102
+ }
103
+ case "MaxPartSize":
104
+ {
105
+ return FormData.FormDataError("FileTooLarge", error);
106
+ }
107
+ case "MaxTotalSize":
108
+ {
109
+ return FormData.FormDataError("BodyTooLarge", error);
110
+ }
111
+ }
112
+ }
113
+ default:
114
+ {
115
+ return FormData.FormDataError("Parse", error);
116
+ }
133
117
  }
134
- const file = part;
135
- const path = path_.join(dir, file.name);
136
- const blob = "Bun" in globalThis ? globalThis.Bun.file(path, {
137
- type: file.contentType
138
- }) : new Blob([], {
139
- type: file.contentType
140
- });
141
- formData.append(part.key, blob, path);
142
- return Effect.as(Effect.tryPromise({
143
- try: signal => NodeStreamP.pipeline(file.source, NodeFs.createWriteStream(path), {
144
- signal
145
- }),
146
- catch: error => FormData.FormDataError("InternalError", error)
147
- }), formData);
148
- }));
149
- exports.formData = formData;
118
+ }
150
119
  //# sourceMappingURL=formData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formData.js","names":["FileSystem","_interopRequireWildcard","require","FormData","Path","_busboy","_interopRequireDefault","Chunk","Effect","FiberRef","_Function","Option","Stream","NodeFs","NodeStreamP","NodeStream","obj","__esModule","default","_getRequireWildcardCache","e","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","stream","source","headers","pipe","Do","bind","maxParts","maxFields","maxFiles","fieldMimeTypes","maxFieldSize","maxFileSize","acquireRelease","sync","limits","parts","getOrUndefined","map","Number","files","fields","fieldSize","fileSize","busboy","removeAllListeners","closed","destroy","mapEffect","async","emit","on","name","value","info","valueTruncated","fail","FormDataError","Error","single","FieldImpl","mimeType","once","FileImpl","filename","fromReadable","error","_","end","part","_tag","some","contentType","includes","toString","onFailure","content","key","succeed","unwrapScoped","exports","TypeId","constructor","formData","flatMap","all","mapError","fs","makeTempDirectoryScoped","dir","path_","runFoldEffect","globalThis","append","file","path","join","blob","Bun","type","Blob","as","tryPromise","try","signal","pipeline","createWriteStream","catch"],"sources":["../../../../src/internal/http/formData.ts"],"sourcesContent":[null],"mappings":"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"}
1
+ {"version":3,"file":"formData.js","names":["FormData","_interopRequireWildcard","require","Effect","_Function","Stream","_multipasta","MP","NFS","NodeStreamP","NodeStream","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","stream","source","headers","pipe","makeConfig","map","config","fromReadable","parser","make","error","convertError","unwrap","convertPart","exports","formData","path","file","tryPromise","try","signal","pipeline","createWriteStream","catch","FormDataError","part","_tag","FieldImpl","info","value","FileImpl","TypeId","key","contentType","constructor","name","decodeField","content","filename","fileToReadable","limit"],"sources":["../../../../src/internal/http/formData.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -26,5 +26,10 @@ export declare const stream: (source: Readable, headers: IncomingHttpHeaders) =>
26
26
  * @since 1.0.0
27
27
  * @category constructors
28
28
  */
29
- export declare const formData: (source: Readable, headers: IncomingHttpHeaders) => Effect.Effect<Path.Path | FileSystem.FileSystem | Scope.Scope, FormData.FormDataError, FormData>;
29
+ export declare const formData: (source: Readable, headers: IncomingHttpHeaders) => Effect.Effect<FileSystem.FileSystem | Path.Path | Scope.Scope, FormData.FormDataError, FormData.PersistedFormData>;
30
+ /**
31
+ * @since 1.0.0
32
+ * @category conversions
33
+ */
34
+ export declare const fileToReadable: (file: FormData.File) => Readable;
30
35
  //# sourceMappingURL=FormData.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormData.d.ts","sourceRoot":"","sources":["../../../src/Http/FormData.ts"],"names":[],"mappings":";;AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,UAAU,MAAM,6BAA6B,CAAA;AAC9D,OAAO,KAAK,KAAK,QAAQ,MAAM,gCAAgC,CAAA;AAC/D,OAAO,KAAK,KAAK,IAAI,MAAM,uBAAuB,CAAA;AAClD,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C;;GAEG;AACH,cAAc,gCAAgC,CAAA;AAE9C;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,CACnB,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,mBAAmB,KACzB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAmB,CAAA;AAElF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,CACrB,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,mBAAmB,KACzB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CACjF,CAAA"}
1
+ {"version":3,"file":"FormData.d.ts","sourceRoot":"","sources":["../../../src/Http/FormData.ts"],"names":[],"mappings":";;AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,UAAU,MAAM,6BAA6B,CAAA;AAC9D,OAAO,KAAK,KAAK,QAAQ,MAAM,gCAAgC,CAAA;AAC/D,OAAO,KAAK,KAAK,IAAI,MAAM,uBAAuB,CAAA;AAClD,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C;;GAEG;AACH,cAAc,gCAAgC,CAAA;AAE9C;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,CACnB,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,mBAAmB,KACzB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAmB,CAAA;AAElF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,CACrB,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,mBAAmB,KACzB,MAAM,CAAC,MAAM,CAChB,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,EAC/C,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,iBAAiB,CACP,CAAA;AAErB;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,QAAkC,CAAA"}
@@ -5,8 +5,8 @@
5
5
  * Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/platform/platform/Worker.ts.html).
6
6
  */
7
7
  import type * as Worker from "@effect/platform/Worker";
8
- import type { Effect } from "effect";
9
8
  import type * as Context from "effect/Context";
9
+ import type * as Effect from "effect/Effect";
10
10
  import type * as Layer from "effect/Layer";
11
11
  import type * as Scope from "effect/Scope";
12
12
  import type * as WorkerThreads from "node:worker_threads";
@@ -1 +1 @@
1
- {"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../../src/Worker.ts"],"names":[],"mappings":";AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,MAAM,MAAM,yBAAyB,CAAA;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,aAAa,MAAM,qBAAqB,CAAA;AAGzD;;GAEG;AACH,cAAc,yBAAyB,CAAA;AAEvC;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC7B,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,KACxD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAqB,CAAA;AAE7G;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACvC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EACjD,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,KACxD,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAA0B,CAAA;AAE5D;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,CAAyB,CAAA;AAElG;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,cAAc,CAAwB,CAAA"}
1
+ {"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../../src/Worker.ts"],"names":[],"mappings":";AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,MAAM,MAAM,yBAAyB,CAAA;AACtD,OAAO,KAAK,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,aAAa,MAAM,qBAAqB,CAAA;AAGzD;;GAEG;AACH,cAAc,yBAAyB,CAAA;AAEvC;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC7B,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,KACxD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAqB,CAAA;AAE7G;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACvC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EACjD,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,KACxD,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAA0B,CAAA;AAE5D;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,CAAyB,CAAA;AAElG;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,cAAc,CAAwB,CAAA"}
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import type { WorkerError } from "@effect/platform/WorkerError";
7
7
  import type * as Runner from "@effect/platform/WorkerRunner";
8
- import type { Effect } from "effect";
8
+ import type * as Effect from "effect/Effect";
9
9
  import type * as Layer from "effect/Layer";
10
10
  import type * as Scope from "effect/Scope";
11
11
  import type * as Stream from "effect/Stream";
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerRunner.d.ts","sourceRoot":"","sources":["../../src/WorkerRunner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,KAAK,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAG5C;;GAEG;AACH,cAAc,+BAA+B,CAAA;AAE7C;;;GAGG;AACH,eAAO,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,KAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAiB,CAAA;AAEtE;;;GAGG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,cAAc,CAAkB,CAAA"}
1
+ {"version":3,"file":"WorkerRunner.d.ts","sourceRoot":"","sources":["../../src/WorkerRunner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,KAAK,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAC5D,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAG5C;;GAEG;AACH,cAAc,+BAA+B,CAAA;AAE7C;;;GAGG;AACH,eAAO,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,KAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAiB,CAAA;AAEtE;;;GAGG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,cAAc,CAAkB,CAAA"}
@@ -1,6 +1,2 @@
1
- import * as FormData from "@effect/platform/Http/FormData";
2
- import * as Stream from "effect/Stream";
3
- import type { IncomingHttpHeaders } from "node:http";
4
- import type { Readable } from "node:stream";
5
- export declare const stream: (source: Readable, headers: IncomingHttpHeaders) => Stream.Stream<never, FormData.FormDataError, FormData.Part>;
1
+ export {};
6
2
  //# sourceMappingURL=formData.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"formData.d.ts","sourceRoot":"","sources":["../../../../src/internal/http/formData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,gCAAgC,CAAA;AAQ1D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAI3C,eAAO,MAAM,MAAM,WACT,QAAQ,WACP,mBAAmB,KAC3B,aAAa,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,SAAS,IAAI,CAgF1D,CAAA"}
1
+ {"version":3,"file":"formData.d.ts","sourceRoot":"","sources":["../../../../src/internal/http/formData.ts"],"names":[],"mappings":""}
@@ -13,4 +13,9 @@ export const stream = internal.stream;
13
13
  * @category constructors
14
14
  */
15
15
  export const formData = internal.formData;
16
+ /**
17
+ * @since 1.0.0
18
+ * @category conversions
19
+ */
20
+ export const fileToReadable = internal.fileToReadable;
16
21
  //# sourceMappingURL=FormData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormData.js","names":["internal","stream","formData"],"sources":["../../../src/Http/FormData.ts"],"sourcesContent":[null],"mappings":"AAaA,OAAO,KAAKA,QAAQ,MAAM,8BAA8B;AAExD;;;AAGA,cAAc,gCAAgC;AAE9C;;;;AAIA,OAAO,MAAMC,MAAM,GAGgDD,QAAQ,CAACC,MAAM;AAElF;;;;AAIA,OAAO,MAAMC,QAAQ,GAInBF,QAAQ,CAACE,QAAQ"}
1
+ {"version":3,"file":"FormData.js","names":["internal","stream","formData","fileToReadable"],"sources":["../../../src/Http/FormData.ts"],"sourcesContent":[null],"mappings":"AAaA,OAAO,KAAKA,QAAQ,MAAM,8BAA8B;AAExD;;;AAGA,cAAc,gCAAgC;AAE9C;;;;AAIA,OAAO,MAAMC,MAAM,GAGgDD,QAAQ,CAACC,MAAM;AAElF;;;;AAIA,OAAO,MAAMC,QAAQ,GAOjBF,QAAQ,CAACE,QAAQ;AAErB;;;;AAIA,OAAO,MAAMC,cAAc,GAAsCH,QAAQ,CAACG,cAAc"}
@@ -1,112 +1,85 @@
1
- import * as FileSystem from "@effect/platform/FileSystem";
2
1
  import * as FormData from "@effect/platform/Http/FormData";
3
- import * as Path from "@effect/platform/Path";
4
- import Busboy from "busboy";
5
- import * as Chunk from "effect/Chunk";
6
2
  import * as Effect from "effect/Effect";
7
- import * as FiberRef from "effect/FiberRef";
8
3
  import { pipe } from "effect/Function";
9
- import * as Option from "effect/Option";
10
4
  import * as Stream from "effect/Stream";
11
- import * as NodeFs from "node:fs";
5
+ import { decodeField } from "multipasta";
6
+ import * as MP from "multipasta/node";
7
+ import * as NFS from "node:fs";
12
8
  import * as NodeStreamP from "node:stream/promises";
13
- import * as NodeStream from "../../Stream.js";
14
- export const stream = (source, headers) => pipe(Effect.Do, Effect.bind("maxParts", () => FiberRef.get(FormData.maxParts)), Effect.bind("maxFields", () => FiberRef.get(FormData.maxFields)), Effect.bind("maxFiles", () => FiberRef.get(FormData.maxFiles)), Effect.bind("fieldMimeTypes", () => FiberRef.get(FormData.fieldMimeTypes)), Effect.bind("maxFieldSize", () => FiberRef.get(FormData.maxFieldSize)), Effect.bind("maxFileSize", () => FiberRef.get(FormData.maxFileSize)), Effect.bind("busboy", ({
15
- maxFieldSize,
16
- maxFields,
17
- maxFileSize,
18
- maxFiles,
19
- maxParts
20
- }) => Effect.acquireRelease(Effect.sync(() => Busboy({
21
- headers,
22
- limits: {
23
- parts: Option.getOrUndefined(Option.map(maxParts, Number)),
24
- files: Option.getOrUndefined(Option.map(maxFiles, Number)),
25
- fields: Option.getOrUndefined(Option.map(maxFields, Number)),
26
- fieldSize: Number(maxFieldSize),
27
- fileSize: Option.getOrUndefined(Option.map(maxFileSize, Number))
28
- }
29
- })), busboy => Effect.sync(() => {
30
- busboy.removeAllListeners();
31
- if (!busboy.closed) {
32
- busboy.destroy();
33
- }
34
- }))), Effect.map(({
35
- busboy,
36
- fieldMimeTypes
37
- }) => Stream.mapEffect(Stream.async(emit => {
38
- busboy.on("field", (name, value, info) => {
39
- if (info.valueTruncated) {
40
- emit.fail(FormData.FormDataError("FieldTooLarge", new Error("maxFieldSize exceeded")));
41
- } else {
42
- emit.single(new FieldImpl(name, info.mimeType, value));
43
- }
44
- });
45
- busboy.on("file", (name, stream, info) => {
46
- stream.once("limit", () => {
47
- emit.fail(FormData.FormDataError("FileTooLarge", new Error("maxFileSize exceeded")));
48
- });
49
- emit.single(new FileImpl(name, info.filename, info.mimeType, NodeStream.fromReadable(() => stream, error => FormData.FormDataError("InternalError", error)), stream));
50
- });
51
- busboy.on("error", _ => {
52
- emit.fail(FormData.FormDataError("InternalError", _));
53
- });
54
- busboy.on("finish", () => {
55
- emit.end();
56
- });
57
- source.pipe(busboy);
58
- }), part => part._tag === "File" && Chunk.some(fieldMimeTypes, _ => part.contentType.includes(_)) ? Effect.map(NodeStream.toString(() => part.source, {
59
- onFailure: error => FormData.FormDataError("InternalError", error)
60
- }), content => new FieldImpl(part.key, part.contentType, content)) : Effect.succeed(part))), Stream.unwrapScoped);
9
+ import * as NodeStream from "../stream.js";
10
+ /** @internal */
11
+ export const stream = (source, headers) => pipe(FormData.makeConfig(headers), Effect.map(config => NodeStream.fromReadable(() => {
12
+ const parser = MP.make(config);
13
+ source.pipe(parser);
14
+ return parser;
15
+ }, error => convertError(error))), Stream.unwrap, Stream.map(convertPart));
16
+ /** @internal */
17
+ export const formData = (source, headers) => FormData.formData(stream(source, headers), (path, file) => Effect.tryPromise({
18
+ try: signal => NodeStreamP.pipeline(file.file, NFS.createWriteStream(path), {
19
+ signal
20
+ }),
21
+ catch: error => FormData.FormDataError("InternalError", error)
22
+ }));
23
+ const convertPart = part => part._tag === "Field" ? new FieldImpl(part.info, part.value) : new FileImpl(part);
61
24
  class FieldImpl {
25
+ [FormData.TypeId];
26
+ _tag = "Field";
62
27
  key;
63
28
  contentType;
64
29
  value;
65
- [FormData.TypeId];
66
- _tag = "Field";
67
- constructor(key, contentType, value) {
68
- this.key = key;
69
- this.contentType = contentType;
70
- this.value = value;
30
+ constructor(info, value) {
71
31
  this[FormData.TypeId] = FormData.TypeId;
32
+ this.key = info.name;
33
+ this.contentType = info.contentType;
34
+ this.value = decodeField(info, value);
72
35
  }
73
36
  }
74
37
  class FileImpl {
38
+ file;
39
+ _tag = "File";
40
+ [FormData.TypeId];
75
41
  key;
76
42
  name;
77
43
  contentType;
78
44
  content;
79
- source;
80
- [FormData.TypeId];
81
- _tag = "File";
82
- constructor(key, name, contentType, content, source) {
83
- this.key = key;
84
- this.name = name;
85
- this.contentType = contentType;
86
- this.content = content;
87
- this.source = source;
45
+ constructor(file) {
46
+ this.file = file;
88
47
  this[FormData.TypeId] = FormData.TypeId;
48
+ this.key = file.info.name;
49
+ this.name = file.filename ?? file.info.name;
50
+ this.contentType = file.info.contentType;
51
+ this.content = NodeStream.fromReadable(() => file, error => FormData.FormDataError("InternalError", error));
89
52
  }
90
53
  }
91
54
  /** @internal */
92
- export const formData = (source, headers) => Effect.flatMap(Effect.all([Effect.mapError(Effect.flatMap(FileSystem.FileSystem, fs => fs.makeTempDirectoryScoped()), error => FormData.FormDataError("InternalError", error)), Path.Path]), ([dir, path_]) => Stream.runFoldEffect(stream(source, headers), new globalThis.FormData(), (formData, part) => {
93
- if (part._tag === "Field") {
94
- formData.append(part.key, part.value);
95
- return Effect.succeed(formData);
55
+ export const fileToReadable = file => file.file;
56
+ function convertError(error) {
57
+ switch (error._tag) {
58
+ case "ReachedLimit":
59
+ {
60
+ switch (error.limit) {
61
+ case "MaxParts":
62
+ {
63
+ return FormData.FormDataError("TooManyParts", error);
64
+ }
65
+ case "MaxFieldSize":
66
+ {
67
+ return FormData.FormDataError("FieldTooLarge", error);
68
+ }
69
+ case "MaxPartSize":
70
+ {
71
+ return FormData.FormDataError("FileTooLarge", error);
72
+ }
73
+ case "MaxTotalSize":
74
+ {
75
+ return FormData.FormDataError("BodyTooLarge", error);
76
+ }
77
+ }
78
+ }
79
+ default:
80
+ {
81
+ return FormData.FormDataError("Parse", error);
82
+ }
96
83
  }
97
- const file = part;
98
- const path = path_.join(dir, file.name);
99
- const blob = "Bun" in globalThis ? globalThis.Bun.file(path, {
100
- type: file.contentType
101
- }) : new Blob([], {
102
- type: file.contentType
103
- });
104
- formData.append(part.key, blob, path);
105
- return Effect.as(Effect.tryPromise({
106
- try: signal => NodeStreamP.pipeline(file.source, NodeFs.createWriteStream(path), {
107
- signal
108
- }),
109
- catch: error => FormData.FormDataError("InternalError", error)
110
- }), formData);
111
- }));
84
+ }
112
85
  //# sourceMappingURL=formData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formData.js","names":["FileSystem","FormData","Path","Busboy","Chunk","Effect","FiberRef","pipe","Option","Stream","NodeFs","NodeStreamP","NodeStream","stream","source","headers","Do","bind","get","maxParts","maxFields","maxFiles","fieldMimeTypes","maxFieldSize","maxFileSize","acquireRelease","sync","limits","parts","getOrUndefined","map","Number","files","fields","fieldSize","fileSize","busboy","removeAllListeners","closed","destroy","mapEffect","async","emit","on","name","value","info","valueTruncated","fail","FormDataError","Error","single","FieldImpl","mimeType","once","FileImpl","filename","fromReadable","error","_","end","part","_tag","some","contentType","includes","toString","onFailure","content","key","succeed","unwrapScoped","TypeId","constructor","formData","flatMap","all","mapError","fs","makeTempDirectoryScoped","dir","path_","runFoldEffect","globalThis","append","file","path","join","blob","Bun","type","Blob","as","tryPromise","try","signal","pipeline","createWriteStream","catch"],"sources":["../../../../src/internal/http/formData.ts"],"sourcesContent":[null],"mappings":"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"}
1
+ {"version":3,"file":"formData.js","names":["FormData","Effect","pipe","Stream","decodeField","MP","NFS","NodeStreamP","NodeStream","stream","source","headers","makeConfig","map","config","fromReadable","parser","make","error","convertError","unwrap","convertPart","formData","path","file","tryPromise","try","signal","pipeline","createWriteStream","catch","FormDataError","part","_tag","FieldImpl","info","value","FileImpl","TypeId","key","contentType","constructor","name","content","filename","fileToReadable","limit"],"sources":["../../../../src/internal/http/formData.ts"],"sourcesContent":[null],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/platform-node",
3
- "version": "0.29.4",
3
+ "version": "0.30.1",
4
4
  "description": "Unified interfaces for common platform-specific services",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -10,9 +10,9 @@
10
10
  "sideEffects": false,
11
11
  "author": "Effect contributors",
12
12
  "dependencies": {
13
- "busboy": "^1.6.0",
14
13
  "mime": "^3.0.0",
15
- "@effect/platform": "0.28.4"
14
+ "multipasta": "^0.1.11",
15
+ "@effect/platform": "0.29.1"
16
16
  },
17
17
  "peerDependencies": {
18
18
  "effect": "2.0.0-next.54"
@@ -34,5 +34,14 @@ export const stream: (
34
34
  export const formData: (
35
35
  source: Readable,
36
36
  headers: IncomingHttpHeaders
37
- ) => Effect.Effect<Path.Path | FileSystem.FileSystem | Scope.Scope, FormData.FormDataError, FormData> =
38
- internal.formData
37
+ ) => Effect.Effect<
38
+ FileSystem.FileSystem | Path.Path | Scope.Scope,
39
+ FormData.FormDataError,
40
+ FormData.PersistedFormData
41
+ > = internal.formData
42
+
43
+ /**
44
+ * @since 1.0.0
45
+ * @category conversions
46
+ */
47
+ export const fileToReadable: (file: FormData.File) => Readable = internal.fileToReadable
package/src/Worker.ts CHANGED
@@ -4,8 +4,8 @@
4
4
  * Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/platform/platform/Worker.ts.html).
5
5
  */
6
6
  import type * as Worker from "@effect/platform/Worker"
7
- import type { Effect } from "effect"
8
7
  import type * as Context from "effect/Context"
8
+ import type * as Effect from "effect/Effect"
9
9
  import type * as Layer from "effect/Layer"
10
10
  import type * as Scope from "effect/Scope"
11
11
  import type * as WorkerThreads from "node:worker_threads"
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import type { WorkerError } from "@effect/platform/WorkerError"
7
7
  import type * as Runner from "@effect/platform/WorkerRunner"
8
- import type { Effect } from "effect"
8
+ import type * as Effect from "effect/Effect"
9
9
  import type * as Layer from "effect/Layer"
10
10
  import type * as Scope from "effect/Scope"
11
11
  import type * as Stream from "effect/Stream"
@@ -1,168 +1,107 @@
1
- import * as FileSystem from "@effect/platform/FileSystem"
2
1
  import * as FormData from "@effect/platform/Http/FormData"
3
- import * as Path from "@effect/platform/Path"
4
- import Busboy from "busboy"
5
- import * as Chunk from "effect/Chunk"
6
2
  import * as Effect from "effect/Effect"
7
- import * as FiberRef from "effect/FiberRef"
8
3
  import { pipe } from "effect/Function"
9
- import * as Option from "effect/Option"
10
4
  import * as Stream from "effect/Stream"
11
- import * as NodeFs from "node:fs"
5
+ import type { MultipartError, PartInfo } from "multipasta"
6
+ import { decodeField } from "multipasta"
7
+ import * as MP from "multipasta/node"
8
+ import * as NFS from "node:fs"
12
9
  import type { IncomingHttpHeaders } from "node:http"
13
10
  import type { Readable } from "node:stream"
14
11
  import * as NodeStreamP from "node:stream/promises"
15
- import * as NodeStream from "../../Stream.js"
12
+ import * as NodeStream from "../stream.js"
16
13
 
14
+ /** @internal */
17
15
  export const stream = (
18
16
  source: Readable,
19
17
  headers: IncomingHttpHeaders
20
18
  ): Stream.Stream<never, FormData.FormDataError, FormData.Part> =>
21
19
  pipe(
22
- Effect.Do,
23
- Effect.bind("maxParts", () => FiberRef.get(FormData.maxParts)),
24
- Effect.bind("maxFields", () => FiberRef.get(FormData.maxFields)),
25
- Effect.bind("maxFiles", () => FiberRef.get(FormData.maxFiles)),
26
- Effect.bind("fieldMimeTypes", () => FiberRef.get(FormData.fieldMimeTypes)),
27
- Effect.bind("maxFieldSize", () => FiberRef.get(FormData.maxFieldSize)),
28
- Effect.bind("maxFileSize", () => FiberRef.get(FormData.maxFileSize)),
29
- Effect.bind("busboy", ({ maxFieldSize, maxFields, maxFileSize, maxFiles, maxParts }) =>
30
- Effect.acquireRelease(
31
- Effect.sync(
32
- () =>
33
- Busboy({
34
- headers,
35
- limits: {
36
- parts: Option.getOrUndefined(Option.map(maxParts, Number)),
37
- files: Option.getOrUndefined(Option.map(maxFiles, Number)),
38
- fields: Option.getOrUndefined(Option.map(maxFields, Number)),
39
- fieldSize: Number(maxFieldSize),
40
- fileSize: Option.getOrUndefined(Option.map(maxFileSize, Number))
41
- }
42
- })
43
- ),
44
- (busboy) =>
45
- Effect.sync(() => {
46
- busboy.removeAllListeners()
47
- if (!busboy.closed) {
48
- busboy.destroy()
49
- }
50
- })
51
- )),
52
- Effect.map(({ busboy, fieldMimeTypes }) =>
53
- Stream.mapEffect(
54
- Stream.async<never, FormData.FormDataError, FieldImpl | FileImpl>((emit) => {
55
- busboy.on("field", (name, value, info) => {
56
- if (info.valueTruncated) {
57
- emit.fail(FormData.FormDataError("FieldTooLarge", new Error("maxFieldSize exceeded")))
58
- } else {
59
- emit.single(new FieldImpl(name, info.mimeType, value))
60
- }
61
- })
62
-
63
- busboy.on("file", (name, stream, info) => {
64
- stream.once("limit", () => {
65
- emit.fail(FormData.FormDataError("FileTooLarge", new Error("maxFileSize exceeded")))
66
- })
67
- emit.single(
68
- new FileImpl(
69
- name,
70
- info.filename,
71
- info.mimeType,
72
- NodeStream.fromReadable(() => stream, (error) => FormData.FormDataError("InternalError", error)),
73
- stream
74
- )
75
- )
76
- })
77
-
78
- busboy.on("error", (_) => {
79
- emit.fail(FormData.FormDataError("InternalError", _))
80
- })
81
-
82
- busboy.on("finish", () => {
83
- emit.end()
84
- })
85
-
86
- source.pipe(busboy)
87
- }),
88
- (part) =>
89
- part._tag === "File" && Chunk.some(fieldMimeTypes, (_) => part.contentType.includes(_)) ?
90
- Effect.map(
91
- NodeStream.toString(() => part.source, {
92
- onFailure: (error) => FormData.FormDataError("InternalError", error)
93
- }),
94
- (content) => new FieldImpl(part.key, part.contentType, content)
95
- )
96
- : Effect.succeed(part)
97
- )
20
+ FormData.makeConfig(headers as any),
21
+ Effect.map(
22
+ (config) =>
23
+ NodeStream.fromReadable<FormData.FormDataError, MP.Part>(() => {
24
+ const parser = MP.make(config)
25
+ source.pipe(parser)
26
+ return parser
27
+ }, (error) => convertError(error as any))
98
28
  ),
99
- Stream.unwrapScoped
29
+ Stream.unwrap,
30
+ Stream.map(convertPart)
100
31
  )
101
32
 
33
+ /** @internal */
34
+ export const formData = (
35
+ source: Readable,
36
+ headers: IncomingHttpHeaders
37
+ ) =>
38
+ FormData.formData(stream(source, headers), (path, file) =>
39
+ Effect.tryPromise({
40
+ try: (signal) => NodeStreamP.pipeline((file as FileImpl).file, NFS.createWriteStream(path), { signal }),
41
+ catch: (error) => FormData.FormDataError("InternalError", error)
42
+ }))
43
+
44
+ const convertPart = (part: MP.Part): FormData.Part =>
45
+ part._tag === "Field" ? new FieldImpl(part.info, part.value) : new FileImpl(part)
46
+
102
47
  class FieldImpl implements FormData.Field {
103
48
  readonly [FormData.TypeId]: FormData.TypeId
104
49
  readonly _tag = "Field"
50
+ readonly key: string
51
+ readonly contentType: string
52
+ readonly value: string
53
+
105
54
  constructor(
106
- readonly key: string,
107
- readonly contentType: string,
108
- readonly value: string
55
+ info: PartInfo,
56
+ value: Uint8Array
109
57
  ) {
110
58
  this[FormData.TypeId] = FormData.TypeId
59
+ this.key = info.name
60
+ this.contentType = info.contentType
61
+ this.value = decodeField(info, value)
111
62
  }
112
63
  }
113
64
 
114
65
  class FileImpl implements FormData.File {
115
- readonly [FormData.TypeId]: FormData.TypeId
116
66
  readonly _tag = "File"
117
- constructor(
118
- readonly key: string,
119
- readonly name: string,
120
- readonly contentType: string,
121
- readonly content: Stream.Stream<never, FormData.FormDataError, Uint8Array>,
122
- readonly source: Readable
123
- ) {
67
+ readonly [FormData.TypeId]: FormData.TypeId
68
+ readonly key: string
69
+ readonly name: string
70
+ readonly contentType: string
71
+ readonly content: Stream.Stream<never, FormData.FormDataError, Uint8Array>
72
+
73
+ constructor(readonly file: MP.FileStream) {
124
74
  this[FormData.TypeId] = FormData.TypeId
75
+ this.key = file.info.name
76
+ this.name = file.filename ?? file.info.name
77
+ this.contentType = file.info.contentType
78
+ this.content = NodeStream.fromReadable(() => file, (error) => FormData.FormDataError("InternalError", error))
125
79
  }
126
80
  }
127
81
 
128
82
  /** @internal */
129
- export const formData = (
130
- source: Readable,
131
- headers: IncomingHttpHeaders
132
- ) =>
133
- Effect.flatMap(
134
- Effect.all([
135
- Effect.mapError(
136
- Effect.flatMap(FileSystem.FileSystem, (fs) => fs.makeTempDirectoryScoped()),
137
- (error) => FormData.FormDataError("InternalError", error)
138
- ),
139
- Path.Path
140
- ]),
141
- ([dir, path_]) =>
142
- Stream.runFoldEffect(
143
- stream(source, headers),
144
- new globalThis.FormData(),
145
- (formData, part) => {
146
- if (part._tag === "Field") {
147
- formData.append(part.key, part.value)
148
- return Effect.succeed(formData)
149
- }
150
- const file = part as FileImpl
151
- const path = path_.join(dir, file.name)
152
- const blob = "Bun" in globalThis ?
153
- (globalThis as any).Bun.file(path, { type: file.contentType })
154
- : new Blob([], { type: file.contentType })
155
- formData.append(part.key, blob, path)
156
- return Effect.as(
157
- Effect.tryPromise({
158
- try: (signal) =>
159
- NodeStreamP.pipeline(file.source, NodeFs.createWriteStream(path), {
160
- signal
161
- }),
162
- catch: (error) => FormData.FormDataError("InternalError", error)
163
- }),
164
- formData
165
- )
83
+ export const fileToReadable = (file: FormData.File): Readable => (file as FileImpl).file
84
+
85
+ function convertError(error: MultipartError): FormData.FormDataError {
86
+ switch (error._tag) {
87
+ case "ReachedLimit": {
88
+ switch (error.limit) {
89
+ case "MaxParts": {
90
+ return FormData.FormDataError("TooManyParts", error)
166
91
  }
167
- )
168
- )
92
+ case "MaxFieldSize": {
93
+ return FormData.FormDataError("FieldTooLarge", error)
94
+ }
95
+ case "MaxPartSize": {
96
+ return FormData.FormDataError("FileTooLarge", error)
97
+ }
98
+ case "MaxTotalSize": {
99
+ return FormData.FormDataError("BodyTooLarge", error)
100
+ }
101
+ }
102
+ }
103
+ default: {
104
+ return FormData.FormDataError("Parse", error)
105
+ }
106
+ }
107
+ }
@@ -211,13 +211,13 @@ class ServerRequestImpl extends IncomingMessageImpl<Error.RequestError> implemen
211
211
  | Effect.Effect<
212
212
  Scope.Scope | FileSystem.FileSystem | Path.Path,
213
213
  FormData.FormDataError,
214
- globalThis.FormData
214
+ FormData.PersistedFormData
215
215
  >
216
216
  | undefined
217
217
  get formData(): Effect.Effect<
218
218
  Scope.Scope | FileSystem.FileSystem | Path.Path,
219
219
  FormData.FormDataError,
220
- globalThis.FormData
220
+ FormData.PersistedFormData
221
221
  > {
222
222
  if (this.formDataEffect) {
223
223
  return this.formDataEffect