@nestia/fetcher 2.0.0-dev.20230906 → 2.0.0-dev.20230907

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.
@@ -95,121 +95,175 @@ var FetcherBase;
95
95
  var _this = this;
96
96
  FetcherBase.fetch = function (props) {
97
97
  return function (connection, route, input, stringify) { return __awaiter(_this, void 0, void 0, function () {
98
- var headers, init, path, url, response, _a, _b, text, _c, _d;
99
- var _e, _f, _g, _h, _j, _k, _l, _m;
100
- return __generator(this, function (_o) {
101
- switch (_o.label) {
102
- case 0:
103
- headers = __assign({}, ((_e = connection.headers) !== null && _e !== void 0 ? _e : {}));
104
- if (input !== undefined) {
105
- if (((_f = route.request) === null || _f === void 0 ? void 0 : _f.type) === undefined)
106
- throw new Error("Error on ".concat(props.className, ".fetch(): no content-type being configured."));
107
- headers["Content-Type"] = route.request.type;
108
- }
109
- init = __assign(__assign({}, ((_g = connection.options) !== null && _g !== void 0 ? _g : {})), { method: route.method, headers: (function () {
110
- var e_1, _a, e_2, _b;
111
- var output = [];
112
- try {
113
- for (var _c = __values(Object.entries(headers)), _d = _c.next(); !_d.done; _d = _c.next()) {
114
- var _e = __read(_d.value, 2), key = _e[0], value = _e[1];
115
- if (value === undefined)
116
- continue;
117
- else if (Array.isArray(value))
118
- try {
119
- for (var value_1 = (e_2 = void 0, __values(value)), value_1_1 = value_1.next(); !value_1_1.done; value_1_1 = value_1.next()) {
120
- var v = value_1_1.value;
121
- output.push([key, String(v)]);
122
- }
123
- }
124
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
125
- finally {
98
+ var result;
99
+ return __generator(this, function (_a) {
100
+ switch (_a.label) {
101
+ case 0: return [4 /*yield*/, _Propagate("fetch")(props)(connection, route, input, stringify)];
102
+ case 1:
103
+ result = _a.sent();
104
+ if (result.success === false)
105
+ throw new HttpError_1.HttpError(route.method, route.path, result.status, result.headers, result.data);
106
+ return [2 /*return*/, result.data];
107
+ }
108
+ });
109
+ }); };
110
+ };
111
+ FetcherBase.propagate = function (props) {
112
+ return function (connection, route, input, stringify) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
113
+ return [2 /*return*/, _Propagate("propagate")(props)(connection, route, input, stringify)];
114
+ }); }); };
115
+ };
116
+ /**
117
+ * @internal
118
+ */
119
+ var _Propagate = function (method) {
120
+ return function (props) {
121
+ return function (connection, route, input, stringify) { return __awaiter(_this, void 0, void 0, function () {
122
+ var headers, init, path, url, response, result, _a, type, text, _b, _c, _d;
123
+ var _e, _f, _g, _h, _j;
124
+ return __generator(this, function (_k) {
125
+ switch (_k.label) {
126
+ case 0:
127
+ headers = __assign({}, ((_e = connection.headers) !== null && _e !== void 0 ? _e : {}));
128
+ if (input !== undefined) {
129
+ if (((_f = route.request) === null || _f === void 0 ? void 0 : _f.type) === undefined)
130
+ throw new Error("Error on ".concat(props.className, ".fetch(): no content-type being configured."));
131
+ headers["Content-Type"] = route.request.type;
132
+ }
133
+ init = __assign(__assign({}, ((_g = connection.options) !== null && _g !== void 0 ? _g : {})), { method: route.method, headers: (function () {
134
+ var e_1, _a, e_2, _b;
135
+ var output = [];
136
+ try {
137
+ for (var _c = __values(Object.entries(headers)), _d = _c.next(); !_d.done; _d = _c.next()) {
138
+ var _e = __read(_d.value, 2), key = _e[0], value = _e[1];
139
+ if (value === undefined)
140
+ continue;
141
+ else if (Array.isArray(value))
126
142
  try {
127
- if (value_1_1 && !value_1_1.done && (_b = value_1.return)) _b.call(value_1);
143
+ for (var value_1 = (e_2 = void 0, __values(value)), value_1_1 = value_1.next(); !value_1_1.done; value_1_1 = value_1.next()) {
144
+ var v = value_1_1.value;
145
+ output.push([key, String(v)]);
146
+ }
147
+ }
148
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
149
+ finally {
150
+ try {
151
+ if (value_1_1 && !value_1_1.done && (_b = value_1.return)) _b.call(value_1);
152
+ }
153
+ finally { if (e_2) throw e_2.error; }
128
154
  }
129
- finally { if (e_2) throw e_2.error; }
130
- }
131
- else
132
- output.push([key, String(value)]);
155
+ else
156
+ output.push([key, String(value)]);
157
+ }
133
158
  }
134
- }
135
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
136
- finally {
137
- try {
138
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
159
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
160
+ finally {
161
+ try {
162
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
163
+ }
164
+ finally { if (e_1) throw e_1.error; }
139
165
  }
140
- finally { if (e_1) throw e_1.error; }
166
+ return output;
167
+ })() });
168
+ // CONSTRUCT BODY DATA
169
+ if (input !== undefined)
170
+ init.body = props.encode(
171
+ // BODY TRANSFORM
172
+ ((_h = route.request) === null || _h === void 0 ? void 0 : _h.type) !== "text/plain"
173
+ ? (stringify !== null && stringify !== void 0 ? stringify : JSON.stringify)(input)
174
+ : input, headers);
175
+ path = connection.host[connection.host.length - 1] !== "/" &&
176
+ route.path[0] !== "/"
177
+ ? "/".concat(route.path)
178
+ : route.path;
179
+ url = new URL("".concat(connection.host).concat(path));
180
+ return [4 /*yield*/, polyfill.get()];
181
+ case 1: return [4 /*yield*/, (_k.sent())(url.href, init)];
182
+ case 2:
183
+ response = _k.sent();
184
+ result = {
185
+ success: response.status === 200 ||
186
+ response.status === 201 ||
187
+ response.status == route.status,
188
+ status: route.status,
189
+ headers: response_headers_to_object(response.headers),
190
+ data: undefined,
191
+ };
192
+ if (!(result.success === false)) return [3 /*break*/, 4];
193
+ // WHEN FAILED
194
+ _a = result;
195
+ return [4 /*yield*/, response.text()];
196
+ case 3:
197
+ // WHEN FAILED
198
+ _a.data = _k.sent();
199
+ type = response.headers.get("content-type");
200
+ if (method !== "fetch" &&
201
+ type &&
202
+ type.indexOf("application/json") !== -1)
203
+ try {
204
+ result.data = JSON.parse(result.data);
141
205
  }
142
- return output;
143
- })() });
144
- // CONSTRUCT BODY DATA
145
- if (input !== undefined)
146
- init.body = props.encode(
147
- // BODY TRANSFORM
148
- ((_h = route.request) === null || _h === void 0 ? void 0 : _h.type) !== "text/plain"
149
- ? (stringify !== null && stringify !== void 0 ? stringify : JSON.stringify)(input)
150
- : input, headers);
151
- path = connection.host[connection.host.length - 1] !== "/" &&
152
- route.path[0] !== "/"
153
- ? "/".concat(route.path)
154
- : route.path;
155
- url = new URL("".concat(connection.host).concat(path));
156
- return [4 /*yield*/, polyfill.get()];
157
- case 1: return [4 /*yield*/, (_o.sent())(url.href, init)];
158
- case 2:
159
- response = _o.sent();
160
- if (!((route.status !== null && response.status !== route.status) ||
161
- (route.status === null &&
162
- response.status !== 200 &&
163
- response.status !== 201))) return [3 /*break*/, 4];
164
- _a = HttpError_1.HttpError.bind;
165
- _b = [void 0, route.method,
166
- path,
167
- response.status];
168
- return [4 /*yield*/, response.text()];
169
- case 3: throw new (_a.apply(HttpError_1.HttpError, _b.concat([_o.sent()])))();
170
- case 4:
171
- if (((_j = route.response) === null || _j === void 0 ? void 0 : _j.type) &&
172
- ((_l = ((_k = response.headers.get("content-type")) !== null && _k !== void 0 ? _k : route.response.type)) === null || _l === void 0 ? void 0 : _l.indexOf(route.response.type)) === -1)
173
- throw new Error("Error on ".concat(props.className, ".fetch(): response type mismatched - expected ").concat(route.response.type, ", but ").concat(response.headers.get("content-type"), "."));
174
- _o.label = 5;
175
- case 5:
176
- if (!(route.method === "HEAD")) return [3 /*break*/, 6];
177
- return [2 /*return*/, undefined];
178
- case 6:
179
- if (!(((_m = route.response) === null || _m === void 0 ? void 0 : _m.type) === "application/json")) return [3 /*break*/, 8];
180
- return [4 /*yield*/, response.text()];
181
- case 7:
182
- text = _o.sent();
183
- return [2 /*return*/, text.length ? JSON.parse(text) : undefined];
184
- case 8:
185
- _d = (_c = props).decode;
186
- return [4 /*yield*/, response.text()];
187
- case 9: return [2 /*return*/, _d.apply(_c, [_o.sent(), response_headers_to_object(response.headers)])];
188
- }
189
- });
190
- }); };
206
+ catch (_l) { }
207
+ return [3 /*break*/, 9];
208
+ case 4:
209
+ if (!(route.method === "HEAD")) return [3 /*break*/, 5];
210
+ result.data = undefined;
211
+ return [3 /*break*/, 9];
212
+ case 5:
213
+ if (!(((_j = route.response) === null || _j === void 0 ? void 0 : _j.type) === "application/json")) return [3 /*break*/, 7];
214
+ return [4 /*yield*/, response.text()];
215
+ case 6:
216
+ text = _k.sent();
217
+ result.data = text.length ? JSON.parse(text) : undefined;
218
+ return [3 /*break*/, 9];
219
+ case 7:
220
+ _b = result;
221
+ _d = (_c = props).decode;
222
+ return [4 /*yield*/, response.text()];
223
+ case 8:
224
+ _b.data = _d.apply(_c, [_k.sent(), result.headers]);
225
+ _k.label = 9;
226
+ case 9: return [2 /*return*/, result];
227
+ }
228
+ });
229
+ }); };
230
+ };
191
231
  };
192
232
  })(FetcherBase || (exports.FetcherBase = FetcherBase = {}));
233
+ /**
234
+ * @internal
235
+ */
193
236
  var polyfill = new Singleton_1.Singleton(function () { return __awaiter(void 0, void 0, void 0, function () {
194
- var _a;
195
- return __generator(this, function (_b) {
196
- switch (_b.label) {
237
+ var _a, _b;
238
+ var _c;
239
+ return __generator(this, function (_d) {
240
+ switch (_d.label) {
197
241
  case 0:
198
242
  if (!(typeof global === "object" &&
199
243
  typeof global.process === "object" &&
200
244
  typeof global.process.versions === "object" &&
201
- typeof global.process.versions.node !== undefined)) return [3 /*break*/, 3];
202
- if (!(global.fetch === undefined)) return [3 /*break*/, 2];
203
- _a = global;
204
- return [4 /*yield*/, (0, import2_1.default)("node-fetch")];
245
+ typeof global.process.versions.node !== undefined)) return [3 /*break*/, 5];
246
+ if (!(global.fetch === undefined)) return [3 /*break*/, 4];
247
+ if (!((_c = global.fetch) !== null && _c !== void 0)) return [3 /*break*/, 1];
248
+ _a = _c;
249
+ return [3 /*break*/, 3];
205
250
  case 1:
206
- _a.fetch = (_b.sent()).default;
207
- _b.label = 2;
208
- case 2: return [2 /*return*/, global.fetch];
209
- case 3: return [2 /*return*/, window.fetch];
251
+ _b = global;
252
+ return [4 /*yield*/, (0, import2_1.default)("node-fetch")];
253
+ case 2:
254
+ _a = (_b.fetch = (_d.sent()).default);
255
+ _d.label = 3;
256
+ case 3:
257
+ _a;
258
+ _d.label = 4;
259
+ case 4: return [2 /*return*/, global.fetch];
260
+ case 5: return [2 /*return*/, window.fetch];
210
261
  }
211
262
  });
212
263
  }); });
264
+ /**
265
+ * @internal
266
+ */
213
267
  var response_headers_to_object = function (headers) {
214
268
  var output = {};
215
269
  headers.forEach(function (value, key) {
@@ -1 +1 @@
1
- {"version":3,"file":"FetcherBase.js","sourceRoot":"","sources":["../../src/internal/FetcherBase.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAA8B;AAI9B,yCAAwC;AACxC,0CAAyC;AAEzC,IAAiB,WAAW,CAuH3B;AAvHD,WAAiB,WAAW;;IAaX,iBAAK,GACd,UAAC,KAAa;QACd,OAAA,UACI,UAAuB,EACvB,KAEC,EACD,KAAa,EACb,SAAoC;;;;;;wBAM9B,OAAO,gBAEF,CAAC,MAAA,UAAU,CAAC,OAAO,mCAAI,EAAE,CAAC,CAChC,CAAC;wBACN,IAAI,KAAK,KAAK,SAAS,EAAE;4BACrB,IAAI,CAAA,MAAA,KAAK,CAAC,OAAO,0CAAE,IAAI,MAAK,SAAS;gCACjC,MAAM,IAAI,KAAK,CACX,mBAAY,KAAK,CAAC,SAAS,gDAA6C,CAC3E,CAAC;4BACN,OAAO,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;yBAChD;wBAGK,IAAI,yBACH,CAAC,MAAA,UAAU,CAAC,OAAO,mCAAI,EAAE,CAAC,KAC7B,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,OAAO,EAAE,CAAC;;gCACN,IAAM,MAAM,GAAuB,EAAE,CAAC;;oCACtC,KAA2B,IAAA,KAAA,SAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA,gBAAA;wCAAvC,IAAA,KAAA,mBAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;wCAClB,IAAI,KAAK,KAAK,SAAS;4CAAE,SAAS;6CAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;;gDACzB,KAAgB,IAAA,yBAAA,SAAA,KAAK,CAAA,CAAA,4BAAA;oDAAhB,IAAM,CAAC,kBAAA;oDACR,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iDAAA;;;;;;;;;;4CACjC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;qCAAA;;;;;;;;;gCAC3C,OAAO,MAAM,CAAC;4BAClB,CAAC,CAAC,EAAE,GACP,CAAC;wBAEF,sBAAsB;wBACtB,IAAI,KAAK,KAAK,SAAS;4BACnB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM;4BACpB,iBAAiB;4BACjB,CAAA,MAAA,KAAK,CAAC,OAAO,0CAAE,IAAI,MAAK,YAAY;gCAChC,CAAC,CAAC,CAAC,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;gCACtC,CAAC,CAAC,KAAK,EACX,OAAO,CACV,CAAC;wBAMA,IAAI,GACN,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;4BACnD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;4BACjB,CAAC,CAAC,WAAI,KAAK,CAAC,IAAI,CAAE;4BAClB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;wBACf,GAAG,GAAQ,IAAI,GAAG,CAAC,UAAG,UAAU,CAAC,IAAI,SAAG,IAAI,CAAE,CAAC,CAAC;wBAIlD,qBAAM,QAAQ,CAAC,GAAG,EAAE,EAAA;4BADG,qBAAM,CAC7B,SAAoB,CACvB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,EAAA;;wBAFX,QAAQ,GAAa,SAEV;6BAIb,CAAA,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC;4BAC3D,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI;gCAClB,QAAQ,CAAC,MAAM,KAAK,GAAG;gCACvB,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAA,EAH5B,wBAG4B;6BAElB,qBAAS;sCACf,KAAK,CAAC,MAAM;4BACZ,IAAI;4BACJ,QAAQ,CAAC,MAAM;wBACf,qBAAM,QAAQ,CAAC,IAAI,EAAE,EAAA;4BAJzB,MAAM,cAAI,qBAAS,aAIf,SAAqB,MACxB,CAAC;;wBACD,IACD,CAAA,MAAA,KAAK,CAAC,QAAQ,0CAAE,IAAI;4BACpB,CAAA,MAAA,CACI,MAAA,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,mCAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAC9D,0CAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAK,CAAC,CAAC;4BAEtC,MAAM,IAAI,KAAK,CACX,mBACI,KAAK,CAAC,SAAS,2DAEf,KAAK,CAAC,QAAQ,CAAC,IAAI,mBACd,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,MAAG,CACnD,CAAC;;;6BAGF,CAAA,KAAK,CAAC,MAAM,KAAK,MAAM,CAAA,EAAvB,wBAAuB;wBAAE,sBAAO,SAAU,EAAC;;6BACtC,CAAA,CAAA,MAAA,KAAK,CAAC,QAAQ,0CAAE,IAAI,MAAK,kBAAkB,CAAA,EAA3C,wBAA2C;wBAC3B,qBAAM,QAAQ,CAAC,IAAI,EAAE,EAAA;;wBAApC,IAAI,GAAW,SAAqB;wBAC1C,sBAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAC;;wBAE/C,KAAA,CAAA,KAAA,KAAK,CAAA,CAAC,MAAM,CAAA;wBACf,qBAAM,QAAQ,CAAC,IAAI,EAAE,EAAA;4BADzB,sBAAO,cACH,SAAqB,EACrB,0BAA0B,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC1B,EAAC;;;aAC1B;IAvGD,CAuGC,CAAC;AACV,CAAC,EAvHgB,WAAW,2BAAX,WAAW,QAuH3B;AAED,IAAM,QAAQ,GAAG,IAAI,qBAAS,CAAC;;;;;qBAEvB,CAAA,OAAO,MAAM,KAAK,QAAQ;oBAC1B,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;oBAClC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;oBAC3C,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAA,EAHjD,wBAGiD;qBAE7C,CAAA,MAAM,CAAC,KAAK,KAAK,SAAS,CAAA,EAA1B,wBAA0B;gBAC1B,KAAA,MAAM,CAAA;gBAAW,qBAAM,IAAA,iBAAO,EAAC,YAAY,CAAC,EAAA;;gBAA5C,GAAO,KAAK,GAAI,CAAC,SAA2B,CAAS,CAAC,OAAO,CAAC;;oBAClE,sBAAQ,MAAc,CAAC,KAAK,EAAC;oBAEjC,sBAAO,MAAM,CAAC,KAAK,EAAC;;;KACvB,CAAC,CAAC;AAEH,IAAM,0BAA0B,GAAG,UAC/B,OAAgB;IAEhB,IAAM,MAAM,GAA4C,EAAE,CAAC;IAC3D,OAAO,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,GAAG;;;QACvB,IAAI,GAAG,KAAK,YAAY,EAAE;YACtB,MAAA,MAAM,CAAC,GAAG,qCAAV,MAAM,CAAC,GAAG,IAAM,EAAE,EAAC;YACnB,CAAA,KAAC,MAAM,CAAC,GAAG,CAAc,CAAA,CAAC,IAAI,oCACvB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,IAAI,EAAE,EAAV,CAAU,CAAC,WAC9C;SACL;;YAAM,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC"}
1
+ {"version":3,"file":"FetcherBase.js","sourceRoot":"","sources":["../../src/internal/FetcherBase.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nestia/fetcher",
3
- "version": "2.0.0-dev.20230906",
3
+ "version": "2.0.0-dev.20230907",
4
4
  "description": "Fetcher library of Nestia SDK",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
@@ -1,6 +1,7 @@
1
1
  import { AesPkcs5 } from "./AesPkcs5";
2
2
  import { IConnection } from "./IConnection";
3
3
  import { IEncryptionPassword } from "./IEncryptionPassword";
4
+ import { IPropagation } from "./IPropagation";
4
5
  import { Primitive } from "./Primitive";
5
6
  import { FetcherBase } from "./internal/FetcherBase";
6
7
  import { IFetchRoute } from "./internal/IFetchRoute";
@@ -115,4 +116,79 @@ export namespace EncryptedFetcher {
115
116
  : (input) => input,
116
117
  })(connection, route, input, stringify);
117
118
  }
119
+
120
+ export function propagate<
121
+ Output extends IPropagation<number, any, boolean>,
122
+ >(connection: IConnection, route: IFetchRoute<"HEAD">): Promise<Output>;
123
+
124
+ export function propagate<
125
+ Input,
126
+ Output extends IPropagation<number, any, boolean>,
127
+ >(
128
+ connection: IConnection,
129
+ route: IFetchRoute<"HEAD">,
130
+ input?: Input,
131
+ stringify?: (input: Input) => string,
132
+ ): Promise<Output>;
133
+
134
+ export async function propagate<
135
+ Input,
136
+ Output extends IPropagation<number, any, boolean>,
137
+ >(
138
+ connection: IConnection,
139
+ route: IFetchRoute<
140
+ "DELETE" | "GET" | "HEAD" | "PATCH" | "POST" | "PUT"
141
+ >,
142
+ input?: Input,
143
+ stringify?: (input: Input) => string,
144
+ ): Promise<Output> {
145
+ if (
146
+ (route.request?.encrypted === true || route.response?.encrypted) &&
147
+ connection.encryption === undefined
148
+ )
149
+ throw new Error(
150
+ "Error on EncryptedFetcher.propagate(): the encryption password has not been configured.",
151
+ );
152
+ const closure =
153
+ typeof connection.encryption === "function"
154
+ ? (direction: "encode" | "decode") =>
155
+ (
156
+ headers: Record<
157
+ string,
158
+ IConnection.HeaderValue | undefined
159
+ >,
160
+ body: string,
161
+ ) =>
162
+ (
163
+ connection.encryption as IEncryptionPassword.Closure
164
+ )({
165
+ headers,
166
+ body,
167
+ direction,
168
+ })
169
+ : () => () => connection.encryption as IEncryptionPassword;
170
+
171
+ return FetcherBase.propagate({
172
+ className: "EncryptedFetcher",
173
+ encode:
174
+ route.request?.encrypted === true
175
+ ? (input, headers) => {
176
+ const p = closure("encode")(headers, input);
177
+ return AesPkcs5.encrypt(
178
+ JSON.stringify(input),
179
+ p.key,
180
+ p.iv,
181
+ );
182
+ }
183
+ : (input) => input,
184
+ decode:
185
+ route.response?.encrypted === true
186
+ ? (input, headers) => {
187
+ const p = closure("decode")(headers, input);
188
+ const str = AesPkcs5.decrypt(input, p.key, p.iv);
189
+ return str.length ? JSON.parse(str) : str;
190
+ }
191
+ : (input) => input,
192
+ })(connection, route, input, stringify) as Promise<Output>;
193
+ }
118
194
  }
package/src/HttpError.ts CHANGED
@@ -29,6 +29,7 @@ export class HttpError extends Error {
29
29
  | "HEAD",
30
30
  public readonly path: string,
31
31
  public readonly status: number,
32
+ public readonly headers: Record<string, string | string[]>,
32
33
  message: string,
33
34
  ) {
34
35
  super(message);
@@ -63,6 +64,7 @@ export class HttpError extends Error {
63
64
  method: this.method,
64
65
  path: this.path,
65
66
  status: this.status,
67
+ headers: this.headers,
66
68
  message: this.body_,
67
69
  };
68
70
  }
@@ -75,6 +77,7 @@ export namespace HttpError {
75
77
  method: "GET" | "DELETE" | "POST" | "PUT" | "PATCH" | "HEAD";
76
78
  path: string;
77
79
  status: number;
80
+ headers: Record<string, string | string[]>;
78
81
  message: T;
79
82
  }
80
83
  }
@@ -0,0 +1,34 @@
1
+ import { Primitive } from "./Primitive";
2
+
3
+ export interface IPropagation<
4
+ Status extends number,
5
+ Data,
6
+ Success extends boolean = Status extends 200 | 201 ? true : false,
7
+ > {
8
+ status: Status;
9
+ data: Primitive<Data>;
10
+ success: Success;
11
+ headers: Record<string, string | string[]>;
12
+ }
13
+ export namespace IPropagation {
14
+ export type StatusRange<T extends "2XX" | "3XX" | "4XX" | "5XX"> =
15
+ T extends 0
16
+ ? IntRange<200, 299>
17
+ : T extends 3
18
+ ? IntRange<300, 399>
19
+ : T extends 4
20
+ ? IntRange<400, 499>
21
+ : IntRange<500, 599>;
22
+
23
+ type IntRange<F extends number, T extends number> = Exclude<
24
+ Enumerate<T>,
25
+ Enumerate<F>
26
+ >;
27
+
28
+ type Enumerate<
29
+ N extends number,
30
+ Acc extends number[] = [],
31
+ > = Acc["length"] extends N
32
+ ? Acc[number]
33
+ : Enumerate<N, [...Acc, Acc["length"]]>;
34
+ }
@@ -3,6 +3,7 @@ import { Primitive } from "./Primitive";
3
3
 
4
4
  import { IFetchRoute } from "./internal/IFetchRoute";
5
5
  import { FetcherBase } from "./internal/FetcherBase";
6
+ import { IPropagation } from "./IPropagation";
6
7
 
7
8
  /**
8
9
  * Utility class for `fetch` functions used in `@nestia/sdk`.
@@ -79,4 +80,43 @@ export namespace PlainFetcher {
79
80
  decode: (input) => input,
80
81
  })(connection, route, input, stringify);
81
82
  }
83
+
84
+ export function propagate<
85
+ Output extends IPropagation<number, any, boolean>,
86
+ >(connection: IConnection, route: IFetchRoute<"HEAD">): Promise<Output>;
87
+
88
+ export function propagate<
89
+ Input,
90
+ Output extends IPropagation<number, any, boolean>,
91
+ >(
92
+ connection: IConnection,
93
+ route: IFetchRoute<"HEAD">,
94
+ input?: Input,
95
+ stringify?: (input: Input) => string,
96
+ ): Promise<Output>;
97
+
98
+ export async function propagate<
99
+ Input,
100
+ Output extends IPropagation<number, any, boolean>,
101
+ >(
102
+ connection: IConnection,
103
+ route: IFetchRoute<
104
+ "DELETE" | "GET" | "HEAD" | "PATCH" | "POST" | "PUT"
105
+ >,
106
+ input?: Input,
107
+ stringify?: (input: Input) => string,
108
+ ): Promise<Output> {
109
+ if (
110
+ route.request?.encrypted === true ||
111
+ route.response?.encrypted === true
112
+ )
113
+ throw new Error(
114
+ "Error on PlainFetcher.propagate(): PlainFetcher doesn't have encryption ability. Use EncryptedFetcher instead.",
115
+ );
116
+ return FetcherBase.propagate({
117
+ className: "PlainFetcher",
118
+ encode: (input) => input,
119
+ decode: (input) => input,
120
+ })(connection, route, input, stringify) as Promise<Output>;
121
+ }
82
122
  }
package/src/Primitive.ts CHANGED
@@ -1,16 +1,17 @@
1
1
  /**
2
- * Primitive type.
2
+ * Primitive type of JSON.
3
3
  *
4
- * `Primitive` is a type of TMP (Type Meta Programming) type who converts its argument as a
5
- * primitive type.
4
+ * `Primitive<T>` is a TMP (Type Meta Programming) type which converts
5
+ * its argument as a primitive type within framework JSON.
6
6
  *
7
- * If the target argument is a built-in class who returns its origin primitive type through
8
- * the `valueOf()` method like the `String` or `Number`, its return type would be the
9
- * `string` or `number`.
7
+ * If the target argument is a built-in class which returns its origin primitive type
8
+ * through the `valueOf()` method like the `String` or `Number`, its return type would
9
+ * be the `string` or `number`. Otherwise, the built-in class does not have the
10
+ * `valueOf()` method, the return type would be an empty object (`{}`).
10
11
  *
11
- * Otherwise, the target argument is a type of custom class, all of its custom method would
12
- * be erased and its prototype would be changed to the primitive `object`. Therefore, return
13
- * type of the TMP type finally be the primitive object.
12
+ * Otherwise, the target argument is a type of custom class, all of its custom method
13
+ * would be erased and its prototype would be changed to the primitive `object`.
14
+ * Therefore, return type of the TMP type finally be the primitive object.
14
15
  *
15
16
  * In addition, if the target argument is a type of custom class and it has a special
16
17
  * method `toJSON()`, return type of this `Primitive` would be not `Primitive<Instance>`
@@ -23,10 +24,11 @@
23
24
  * `String` | `string`
24
25
  * `Class` | `object`
25
26
  * `Class` with `toJSON()` | `Primitive<ReturnType<Class.toJSON>>`
27
+ * Native Class | `{}`
26
28
  * Others | No change
27
29
  *
28
30
  * @template Instance Target argument type.
29
- * @author Jenogho Nam - https://github.com/samchon
31
+ * @author Jeongho Nam - https://github.com/samchon
30
32
  * @author Kyungsu Kang - https://github.com/kakasoo
31
33
  * @author Michael - https://github.com/8471919
32
34
  */
@@ -38,8 +40,12 @@ type Equal<X, Y> = X extends Y ? (Y extends X ? true : false) : false;
38
40
 
39
41
  type PrimitiveMain<Instance> = Instance extends [never]
40
42
  ? never // (special trick for jsonable | null) type
41
- : ValueOf<Instance> extends boolean | number | bigint | string
43
+ : ValueOf<Instance> extends bigint
44
+ ? never
45
+ : ValueOf<Instance> extends boolean | number | string
42
46
  ? ValueOf<Instance>
47
+ : Instance extends Function
48
+ ? never
43
49
  : ValueOf<Instance> extends object
44
50
  ? Instance extends object
45
51
  ? Instance extends NativeClass
@@ -59,9 +65,7 @@ type PrimitiveObject<Instance extends object> = Instance extends Array<infer T>
59
65
  ? PrimitiveTuple<Instance>
60
66
  : PrimitiveMain<T>[]
61
67
  : {
62
- [P in keyof Instance]: Instance[P] extends Function
63
- ? never
64
- : PrimitiveMain<Instance[P]>;
68
+ [P in keyof Instance]: PrimitiveMain<Instance[P]>;
65
69
  };
66
70
 
67
71
  type PrimitiveTuple<T extends readonly any[]> = T extends []
@@ -115,8 +119,8 @@ type IsTuple<T extends readonly any[] | { length: number }> = [T] extends [
115
119
  : false;
116
120
 
117
121
  type IsValueOf<Instance, Object extends IValueOf<any>> = Instance extends Object
118
- ? Object extends IValueOf<infer Primitive>
119
- ? Instance extends Primitive
122
+ ? Object extends IValueOf<infer U>
123
+ ? Instance extends U
120
124
  ? false
121
125
  : true // not Primitive, but Object
122
126
  : false // cannot be