@hyperttp/core 1.5.6 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Core/HyperCore.d.ts +206 -0
- package/Core/HyperCore.d.ts.map +1 -0
- package/Core/HyperCore.js +2 -0
- package/Core/HyperCore.js.map +7 -0
- package/README.md +259 -187
- package/defaultConfig.d.ts +12 -0
- package/defaultConfig.d.ts.map +1 -0
- package/defaultConfig.js +2 -0
- package/defaultConfig.js.map +7 -0
- package/index.d.ts +6 -0
- package/index.d.ts.map +1 -0
- package/index.js +2 -0
- package/index.js.map +7 -0
- package/package.json +40 -64
- package/protocols/manager.d.ts +31 -0
- package/protocols/manager.d.ts.map +1 -0
- package/protocols/manager.js +2 -0
- package/protocols/manager.js.map +7 -0
- package/protocols/rest/index.d.ts +9 -0
- package/protocols/rest/index.d.ts.map +1 -0
- package/protocols/rest/index.js +2 -0
- package/protocols/rest/index.js.map +7 -0
- package/protocols/rest/receiver.d.ts +31 -0
- package/protocols/rest/receiver.d.ts.map +1 -0
- package/protocols/rest/receiver.js +2 -0
- package/protocols/rest/receiver.js.map +7 -0
- package/protocols/rest/sender.d.ts +19 -0
- package/protocols/rest/sender.d.ts.map +1 -0
- package/protocols/rest/sender.js +2 -0
- package/protocols/rest/sender.js.map +7 -0
- package/protocols/rest/type.d.ts +71 -0
- package/protocols/rest/type.d.ts.map +1 -0
- package/protocols/rest/type.js +2 -0
- package/protocols/rest/type.js.map +7 -0
- package/rest.d.ts +2 -0
- package/rest.d.ts.map +1 -0
- package/rest.js +2 -0
- package/rest.js.map +7 -0
- package/transports/fetch.d.ts +24 -0
- package/transports/fetch.d.ts.map +1 -0
- package/transports/fetch.js +2 -0
- package/transports/fetch.js.map +7 -0
- package/transports/manager.d.ts +26 -0
- package/transports/manager.d.ts.map +1 -0
- package/transports/manager.js +2 -0
- package/transports/manager.js.map +7 -0
- package/utils/abort.d.ts +23 -0
- package/utils/abort.d.ts.map +1 -0
- package/utils/abort.js +2 -0
- package/utils/abort.js.map +7 -0
- package/{dist/utils → utils}/errors.d.ts +3 -3
- package/utils/errors.d.ts.map +1 -0
- package/utils/errors.js +2 -0
- package/utils/errors.js.map +7 -0
- package/dist/Core/HyperCore.d.ts +0 -171
- package/dist/Core/HyperCore.d.ts.map +0 -1
- package/dist/Core/HyperCore.js +0 -2
- package/dist/Core/HyperCore.js.map +0 -7
- package/dist/Core/RequestBuilder.d.ts +0 -8
- package/dist/Core/RequestBuilder.d.ts.map +0 -1
- package/dist/Core/RequestBuilder.js +0 -2
- package/dist/Core/RequestBuilder.js.map +0 -7
- package/dist/LICENSE +0 -21
- package/dist/README.md +0 -291
- package/dist/defaultConfig.d.ts +0 -7
- package/dist/defaultConfig.d.ts.map +0 -1
- package/dist/defaultConfig.js +0 -2
- package/dist/defaultConfig.js.map +0 -7
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -7
- package/dist/package.json +0 -50
- package/dist/transports/browser.d.ts +0 -37
- package/dist/transports/browser.d.ts.map +0 -1
- package/dist/transports/browser.js +0 -2
- package/dist/transports/browser.js.map +0 -7
- package/dist/transports/manager.d.ts +0 -89
- package/dist/transports/manager.d.ts.map +0 -1
- package/dist/transports/manager.js +0 -7
- package/dist/transports/manager.js.map +0 -7
- package/dist/transports/node.d.ts +0 -33
- package/dist/transports/node.d.ts.map +0 -1
- package/dist/transports/node.js +0 -2
- package/dist/transports/node.js.map +0 -7
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -2
- package/dist/utils/errors.js.map +0 -7
- package/dist/utils/normalize.d.ts +0 -35
- package/dist/utils/normalize.d.ts.map +0 -1
- package/dist/utils/normalize.js +0 -2
- package/dist/utils/normalize.js.map +0 -7
- package/dist/utils/pipeline.d.ts +0 -63
- package/dist/utils/pipeline.d.ts.map +0 -1
- package/dist/utils/pipeline.js +0 -2
- package/dist/utils/pipeline.js.map +0 -7
- package/dist/utils/response.d.ts +0 -108
- package/dist/utils/response.d.ts.map +0 -1
- package/dist/utils/response.js +0 -2
- package/dist/utils/response.js.map +0 -7
- package/dist/utils/retryUtils.d.ts +0 -17
- package/dist/utils/retryUtils.d.ts.map +0 -1
- package/dist/utils/retryUtils.js +0 -2
- package/dist/utils/retryUtils.js.map +0 -7
- /package/{dist/Core → Core}/index.d.ts +0 -0
- /package/{dist/Core → Core}/index.d.ts.map +0 -0
- /package/{dist/Core → Core}/index.js +0 -0
- /package/{dist/Core → Core}/index.js.map +0 -0
- /package/{dist/utils → utils}/merge.d.ts +0 -0
- /package/{dist/utils → utils}/merge.d.ts.map +0 -0
- /package/{dist/utils → utils}/merge.js +0 -0
- /package/{dist/utils → utils}/merge.js.map +0 -0
package/package.json
CHANGED
|
@@ -1,80 +1,56 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperttp/core",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"type": "module",
|
|
6
|
-
"sideEffects": false,
|
|
7
|
-
"main": "./dist/index.js",
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
9
|
-
"exports": {
|
|
10
|
-
".": {
|
|
11
|
-
"types": "./dist/index.d.ts",
|
|
12
|
-
"import": "./dist/index.js"
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
"files": [
|
|
16
|
-
"dist"
|
|
17
|
-
],
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Protocol-agnostic client/server execution core with pluggable protocols, transports and client policies",
|
|
18
5
|
"keywords": [
|
|
19
|
-
"
|
|
20
|
-
"client",
|
|
21
|
-
"high-performance",
|
|
22
|
-
"undici",
|
|
23
|
-
"fetch",
|
|
6
|
+
"browser",
|
|
24
7
|
"bun",
|
|
8
|
+
"client",
|
|
9
|
+
"client-server",
|
|
25
10
|
"deno",
|
|
11
|
+
"fetch",
|
|
12
|
+
"high-performance",
|
|
13
|
+
"http",
|
|
14
|
+
"hyperttp",
|
|
26
15
|
"isomorphic",
|
|
27
|
-
"
|
|
16
|
+
"orchestration",
|
|
17
|
+
"plugin",
|
|
18
|
+
"protocol",
|
|
19
|
+
"rest",
|
|
20
|
+
"server",
|
|
21
|
+
"transport",
|
|
22
|
+
"undici"
|
|
28
23
|
],
|
|
29
|
-
"
|
|
24
|
+
"homepage": "https://github.com/IT-IF-OR/hyperttp-core#readme",
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/IT-IF-OR/hyperttp-core/issues"
|
|
27
|
+
},
|
|
30
28
|
"license": "MIT",
|
|
29
|
+
"author": "dirold2",
|
|
31
30
|
"repository": {
|
|
32
31
|
"type": "git",
|
|
33
32
|
"url": "git+https://github.com/IT-IF-OR/hyperttp-core.git"
|
|
34
33
|
},
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
"optional": false
|
|
44
|
-
},
|
|
45
|
-
"@hyperttp/transport-bun": {
|
|
46
|
-
"optional": true
|
|
34
|
+
"type": "module",
|
|
35
|
+
"sideEffects": false,
|
|
36
|
+
"main": "./index.js",
|
|
37
|
+
"types": "./index.d.ts",
|
|
38
|
+
"exports": {
|
|
39
|
+
".": {
|
|
40
|
+
"types": "./index.d.ts",
|
|
41
|
+
"import": "./index.js"
|
|
47
42
|
},
|
|
48
|
-
"
|
|
49
|
-
"
|
|
43
|
+
"./rest": {
|
|
44
|
+
"types": "./rest.d.ts",
|
|
45
|
+
"import": "./rest.js"
|
|
50
46
|
}
|
|
51
47
|
},
|
|
52
|
-
"
|
|
53
|
-
"@
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"
|
|
57
|
-
"@vitest/ui": "^4.1.10",
|
|
58
|
-
"chalk": "^5.6.2",
|
|
59
|
-
"esbuild": "^0.28.1",
|
|
60
|
-
"oxlint": "^1.75.0",
|
|
61
|
-
"oxfmt": "^0.60.0",
|
|
62
|
-
"tsx": "^4.23.1",
|
|
63
|
-
"typescript": "^7.0.2",
|
|
64
|
-
"vitest": "^4.1.10"
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"@hyperttp/types": "^0.3.0"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=20"
|
|
65
53
|
},
|
|
66
|
-
"
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"deploy": "npm run build && npm run dist",
|
|
70
|
-
"publish": "d-publish",
|
|
71
|
-
"typecheck": "tsc --noEmit",
|
|
72
|
-
"lint": "oxlint src",
|
|
73
|
-
"lint:fix": "oxlint src --fix",
|
|
74
|
-
"format": "oxfmt src",
|
|
75
|
-
"format:check": "oxfmt src --check",
|
|
76
|
-
"test": "vitest run",
|
|
77
|
-
"dev": "tsx src/index.ts",
|
|
78
|
-
"prepublishOnly": "npm run build"
|
|
79
|
-
}
|
|
80
|
-
}
|
|
54
|
+
"packageManager": "bun@1.3.14",
|
|
55
|
+
"private": false
|
|
56
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { HyperProtocol, HyperReceiver, HyperSender, SenderProtocol } from "@hyperttp/types";
|
|
2
|
+
/**
|
|
3
|
+
* @ru Известные протоколы ядра: встроенный rest и пакетные модули.
|
|
4
|
+
* @en Known core protocols: the built-in rest and packaged modules.
|
|
5
|
+
*/
|
|
6
|
+
export declare const KNOWN_PROTOCOLS: readonly SenderProtocol[];
|
|
7
|
+
/**
|
|
8
|
+
* @ru Разрешает модуль протокола. Встроенный rest возвращается статически,
|
|
9
|
+
* остальные протоколы загружаются из пакетных модулей по требованию.
|
|
10
|
+
* @en Resolves a protocol module. The built-in rest is returned statically,
|
|
11
|
+
* other protocols are loaded from packaged modules on demand.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveProtocol<P extends SenderProtocol>(protocol: P, options?: {
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}): Promise<HyperProtocol<unknown, unknown, unknown, unknown, P>>;
|
|
16
|
+
/**
|
|
17
|
+
* @ru Разрешает клиентский сендер протокола.
|
|
18
|
+
* @en Resolves the client sender of a protocol.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveSender<P extends SenderProtocol>(protocol: P, options?: {
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}): Promise<HyperSender<unknown, unknown, unknown, unknown, P>>;
|
|
23
|
+
/**
|
|
24
|
+
* @ru Разрешает серверный ресивер протокола.
|
|
25
|
+
* @en Resolves the server receiver of a protocol.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveReceiver<P extends SenderProtocol>(protocol: P, options?: {
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
}): Promise<HyperReceiver<unknown, unknown, unknown, unknown, P>>;
|
|
30
|
+
export declare function resetCachedProtocols(): void;
|
|
31
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/protocols/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAoCjG;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,cAAc,EAGnD,CAAC;AAsBH;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,CAAC,SAAS,cAAc,EAC5D,QAAQ,EAAE,CAAC,EACX,OAAO,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GACnC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAqC/D;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,CAAC,SAAS,cAAc,EAC1D,QAAQ,EAAE,CAAC,EACX,OAAO,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GACnC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAM7D;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,CAAC,SAAS,cAAc,EAC5D,QAAQ,EAAE,CAAC,EACX,OAAO,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GACnC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAM/D;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";import{HyperClientError as a}from"../utils/errors.js";import{RestProtocol as d}from"./rest/index.js";const n=[{protocol:"graphql",pkg:"@hyperttp/protocol-graphql",export:"GraphQLProtocol",priority:100},{protocol:"grpc",pkg:"@hyperttp/protocol-grpc",export:"GrpcProtocol",priority:100},{protocol:"trpc",pkg:"@hyperttp/protocol-trpc",export:"TrpcProtocol",priority:100},{protocol:"ws",pkg:"@hyperttp/protocol-websocket",export:"WebSocketProtocol",priority:100},{protocol:"websocket",pkg:"@hyperttp/protocol-websocket",export:"WebSocketProtocol",priority:90},{protocol:"sse",pkg:"@hyperttp/protocol-sse",export:"SseProtocol",priority:100},{protocol:"mqtt",pkg:"@hyperttp/protocol-mqtt",export:"MqttProtocol",priority:100}];export const KNOWN_PROTOCOLS=Object.freeze(["rest",...n.map(o=>o.protocol)]);const i=new Map;function u(o){if(!o||typeof o!="object")return!1;const r=o;if(r.code==="ERR_MODULE_NOT_FOUND"||r.code==="MODULE_NOT_FOUND")return!0;const t=o instanceof Error?o.message:String(r.message??"");return t.includes("Cannot find module")||t.includes("Failed to resolve")||t.includes("Failed to load")}async function g(o){return import(o)}export async function resolveProtocol(o,r){const t=i.get(o);if(t)return t;if(o==="rest")return i.set(o,d),d;for(let e=0;e<n.length;e++){const s=n[e];if(s.protocol===o)try{const c=await g(s.pkg),l=c[s.export]??c.default,p=typeof l=="function"?new l(r):l;if(!p||typeof p.protocol!="string")continue;return i.set(o,p),p}catch(c){if(!u(c))throw c}}const f=n.find(e=>e.protocol===o),y=f?` Did you forget to install "${f.pkg}"?`:"";throw new a(`[HyperCore] No protocol available for "${o}".${y}`)}export async function resolveSender(o,r){const t=await resolveProtocol(o,r);if(!t.sender)throw new a(`[HyperCore] Protocol "${o}" has no sender (client role).`);return t.sender}export async function resolveReceiver(o,r){const t=await resolveProtocol(o,r);if(!t.receiver)throw new a(`[HyperCore] Protocol "${o}" has no receiver (server role).`);return t.receiver}export function resetCachedProtocols(){i.clear()}
|
|
2
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/protocols/manager.ts"],
|
|
4
|
+
"sourcesContent": ["import type { HyperProtocol, HyperReceiver, HyperSender, SenderProtocol } from \"@hyperttp/types\";\nimport { HyperClientError } from \"../utils/errors.js\";\nimport { RestProtocol } from \"./rest/index.js\";\n\ntype ProtocolDef = {\n readonly protocol: SenderProtocol;\n readonly pkg: string;\n readonly export: string;\n readonly priority: number;\n};\n\nconst PROTOCOL_DEFS: readonly ProtocolDef[] = [\n {\n protocol: \"graphql\",\n pkg: \"@hyperttp/protocol-graphql\",\n export: \"GraphQLProtocol\",\n priority: 100,\n },\n { protocol: \"grpc\", pkg: \"@hyperttp/protocol-grpc\", export: \"GrpcProtocol\", priority: 100 },\n { protocol: \"trpc\", pkg: \"@hyperttp/protocol-trpc\", export: \"TrpcProtocol\", priority: 100 },\n {\n protocol: \"ws\",\n pkg: \"@hyperttp/protocol-websocket\",\n export: \"WebSocketProtocol\",\n priority: 100,\n },\n {\n protocol: \"websocket\",\n pkg: \"@hyperttp/protocol-websocket\",\n export: \"WebSocketProtocol\",\n priority: 90,\n },\n { protocol: \"sse\", pkg: \"@hyperttp/protocol-sse\", export: \"SseProtocol\", priority: 100 },\n { protocol: \"mqtt\", pkg: \"@hyperttp/protocol-mqtt\", export: \"MqttProtocol\", priority: 100 },\n];\n\n/**\n * @ru Известные протоколы ядра: встроенный rest и пакетные модули.\n * @en Known core protocols: the built-in rest and packaged modules.\n */\nexport const KNOWN_PROTOCOLS: readonly SenderProtocol[] = Object.freeze([\n \"rest\",\n ...PROTOCOL_DEFS.map((d) => d.protocol),\n]);\n\nconst protocolCache = new Map<string, HyperProtocol>();\n\nfunction isModuleNotFoundError(err: unknown): boolean {\n if (!err || typeof err !== \"object\") return false;\n const e = err as Record<string, unknown>;\n if (e.code === \"ERR_MODULE_NOT_FOUND\" || e.code === \"MODULE_NOT_FOUND\") return true;\n\n const msg = err instanceof Error ? err.message : String(e.message ?? \"\");\n return (\n msg.includes(\"Cannot find module\") ||\n msg.includes(\"Failed to resolve\") ||\n msg.includes(\"Failed to load\")\n );\n}\n\nasync function dynamicImport(pkg: string): Promise<Record<string, unknown>> {\n /* @vite-ignore */\n return import(/* webpackIgnore: true */ pkg);\n}\n\n/**\n * @ru Разрешает модуль протокола. Встроенный rest возвращается статически,\n * остальные протоколы загружаются из пакетных модулей по требованию.\n * @en Resolves a protocol module. The built-in rest is returned statically,\n * other protocols are loaded from packaged modules on demand.\n */\nexport async function resolveProtocol<P extends SenderProtocol>(\n protocol: P,\n options?: { [key: string]: unknown },\n): Promise<HyperProtocol<unknown, unknown, unknown, unknown, P>> {\n const cached = protocolCache.get(protocol);\n if (cached) {\n return cached as HyperProtocol<unknown, unknown, unknown, unknown, P>;\n }\n\n if (protocol === \"rest\") {\n protocolCache.set(protocol, RestProtocol);\n return RestProtocol as HyperProtocol<unknown, unknown, unknown, unknown, P>;\n }\n\n for (let i = 0; i < PROTOCOL_DEFS.length; i++) {\n const def = PROTOCOL_DEFS[i]!;\n if (def.protocol !== protocol) continue;\n\n try {\n const mod = await dynamicImport(def.pkg);\n const candidate = (mod[def.export] ?? mod.default) as\n | { new (opts?: unknown): HyperProtocol }\n | HyperProtocol\n | undefined;\n const instance =\n typeof candidate === \"function\" ? new candidate(options) : (candidate as HyperProtocol);\n\n if (!instance || typeof instance.protocol !== \"string\") continue;\n\n protocolCache.set(protocol, instance);\n return instance as HyperProtocol<unknown, unknown, unknown, unknown, P>;\n } catch (err) {\n if (!isModuleNotFoundError(err)) throw err;\n }\n }\n\n const pkgDef = PROTOCOL_DEFS.find((d) => d.protocol === protocol);\n const hint = pkgDef ? ` Did you forget to install \"${pkgDef.pkg}\"?` : \"\";\n\n throw new HyperClientError(`[HyperCore] No protocol available for \"${protocol}\".${hint}`);\n}\n\n/**\n * @ru Разрешает клиентский сендер протокола.\n * @en Resolves the client sender of a protocol.\n */\nexport async function resolveSender<P extends SenderProtocol>(\n protocol: P,\n options?: { [key: string]: unknown },\n): Promise<HyperSender<unknown, unknown, unknown, unknown, P>> {\n const resolved = await resolveProtocol(protocol, options);\n if (!resolved.sender) {\n throw new HyperClientError(`[HyperCore] Protocol \"${protocol}\" has no sender (client role).`);\n }\n return resolved.sender;\n}\n\n/**\n * @ru Разрешает серверный ресивер протокола.\n * @en Resolves the server receiver of a protocol.\n */\nexport async function resolveReceiver<P extends SenderProtocol>(\n protocol: P,\n options?: { [key: string]: unknown },\n): Promise<HyperReceiver<unknown, unknown, unknown, unknown, P>> {\n const resolved = await resolveProtocol(protocol, options);\n if (!resolved.receiver) {\n throw new HyperClientError(`[HyperCore] Protocol \"${protocol}\" has no receiver (server role).`);\n }\n return resolved.receiver;\n}\n\nexport function resetCachedProtocols(): void {\n protocolCache.clear();\n}\n"],
|
|
5
|
+
"mappings": "aACA,OAAS,oBAAAA,MAAwB,qBACjC,OAAS,gBAAAC,MAAoB,kBAS7B,MAAMC,EAAwC,CAC5C,CACE,SAAU,UACV,IAAK,6BACL,OAAQ,kBACR,SAAU,KAEZ,CAAE,SAAU,OAAQ,IAAK,0BAA2B,OAAQ,eAAgB,SAAU,GAAG,EACzF,CAAE,SAAU,OAAQ,IAAK,0BAA2B,OAAQ,eAAgB,SAAU,GAAG,EACzF,CACE,SAAU,KACV,IAAK,+BACL,OAAQ,oBACR,SAAU,KAEZ,CACE,SAAU,YACV,IAAK,+BACL,OAAQ,oBACR,SAAU,IAEZ,CAAE,SAAU,MAAO,IAAK,yBAA0B,OAAQ,cAAe,SAAU,GAAG,EACtF,CAAE,SAAU,OAAQ,IAAK,0BAA2B,OAAQ,eAAgB,SAAU,GAAG,GAOpF,aAAM,gBAA6C,OAAO,OAAO,CACtE,OACA,GAAGA,EAAc,IAAKC,GAAMA,EAAE,QAAQ,EACvC,EAED,MAAMC,EAAgB,IAAI,IAE1B,SAASC,EAAsBC,EAAY,CACzC,GAAI,CAACA,GAAO,OAAOA,GAAQ,SAAU,MAAO,GAC5C,MAAMC,EAAID,EACV,GAAIC,EAAE,OAAS,wBAA0BA,EAAE,OAAS,mBAAoB,MAAO,GAE/E,MAAMC,EAAMF,aAAe,MAAQA,EAAI,QAAU,OAAOC,EAAE,SAAW,EAAE,EACvE,OACEC,EAAI,SAAS,oBAAoB,GACjCA,EAAI,SAAS,mBAAmB,GAChCA,EAAI,SAAS,gBAAgB,CAEjC,CAEA,eAAeC,EAAcC,EAAW,CAEtC,OAAO,OAAiCA,EAC1C,CAQA,sBAAsB,gBACpBC,EACAC,EAAoC,CAEpC,MAAMC,EAAST,EAAc,IAAIO,CAAQ,EACzC,GAAIE,EACF,OAAOA,EAGT,GAAIF,IAAa,OACf,OAAAP,EAAc,IAAIO,EAAUV,CAAY,EACjCA,EAGT,QAASa,EAAI,EAAGA,EAAIZ,EAAc,OAAQY,IAAK,CAC7C,MAAMC,EAAMb,EAAcY,CAAC,EAC3B,GAAIC,EAAI,WAAaJ,EAErB,GAAI,CACF,MAAMK,EAAM,MAAMP,EAAcM,EAAI,GAAG,EACjCE,EAAaD,EAAID,EAAI,MAAM,GAAKC,EAAI,QAIpCE,EACJ,OAAOD,GAAc,WAAa,IAAIA,EAAUL,CAAO,EAAKK,EAE9D,GAAI,CAACC,GAAY,OAAOA,EAAS,UAAa,SAAU,SAExD,OAAAd,EAAc,IAAIO,EAAUO,CAAQ,EAC7BA,CACT,OAASZ,EAAK,CACZ,GAAI,CAACD,EAAsBC,CAAG,EAAG,MAAMA,CACzC,CACF,CAEA,MAAMa,EAASjB,EAAc,KAAMC,GAAMA,EAAE,WAAaQ,CAAQ,EAC1DS,EAAOD,EAAS,+BAA+BA,EAAO,GAAG,KAAO,GAEtE,MAAM,IAAInB,EAAiB,0CAA0CW,CAAQ,KAAKS,CAAI,EAAE,CAC1F,CAMA,sBAAsB,cACpBT,EACAC,EAAoC,CAEpC,MAAMS,EAAW,MAAM,gBAAgBV,EAAUC,CAAO,EACxD,GAAI,CAACS,EAAS,OACZ,MAAM,IAAIrB,EAAiB,yBAAyBW,CAAQ,gCAAgC,EAE9F,OAAOU,EAAS,MAClB,CAMA,sBAAsB,gBACpBV,EACAC,EAAoC,CAEpC,MAAMS,EAAW,MAAM,gBAAgBV,EAAUC,CAAO,EACxD,GAAI,CAACS,EAAS,SACZ,MAAM,IAAIrB,EAAiB,yBAAyBW,CAAQ,kCAAkC,EAEhG,OAAOU,EAAS,QAClB,CAEM,gBAAU,sBAAoB,CAClCjB,EAAc,MAAK,CACrB",
|
|
6
|
+
"names": ["HyperClientError", "RestProtocol", "PROTOCOL_DEFS", "d", "protocolCache", "isModuleNotFoundError", "err", "e", "msg", "dynamicImport", "pkg", "protocol", "options", "cached", "i", "def", "mod", "candidate", "instance", "pkgDef", "hint", "resolved"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HyperProtocol } from "@hyperttp/types";
|
|
2
|
+
/**
|
|
3
|
+
* @ru Единый REST-модуль протокола, объединяющий клиентский сендер и серверный ресивер.
|
|
4
|
+
* @en Unified REST protocol module combining a client sender and a server receiver.
|
|
5
|
+
*/
|
|
6
|
+
export declare const RestProtocol: HyperProtocol;
|
|
7
|
+
export { RestReceiver } from "./receiver.js";
|
|
8
|
+
export { RestSender } from "./sender.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/protocols/rest/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,aAK1B,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";import{RestReceiver as e}from"./receiver.js";import{RestSender as r}from"./sender.js";export const RestProtocol={protocol:"rest",name:"RestProtocol",sender:new r,receiver:new e};export{RestReceiver}from"./receiver.js";export{RestSender}from"./sender.js";
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/protocols/rest/index.ts"],
|
|
4
|
+
"sourcesContent": ["import type { HyperProtocol } from \"@hyperttp/types\";\nimport { RestReceiver } from \"./receiver.js\";\nimport { RestSender } from \"./sender.js\";\n\n/**\n * @ru Единый REST-модуль протокола, объединяющий клиентский сендер и серверный ресивер.\n * @en Unified REST protocol module combining a client sender and a server receiver.\n */\nexport const RestProtocol: HyperProtocol = {\n protocol: \"rest\",\n name: \"RestProtocol\",\n sender: new RestSender(),\n receiver: new RestReceiver(),\n};\n\nexport { RestReceiver } from \"./receiver.js\";\nexport { RestSender } from \"./sender.js\";\n"],
|
|
5
|
+
"mappings": "aACA,OAAS,gBAAAA,MAAoB,gBAC7B,OAAS,cAAAC,MAAkB,cAMpB,aAAM,aAA8B,CACzC,SAAU,OACV,KAAM,eACN,OAAQ,IAAIA,EACZ,SAAU,IAAID,GAGhB,OAAS,iBAAoB,gBAC7B,OAAS,eAAkB",
|
|
6
|
+
"names": ["RestReceiver", "RestSender"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { HyperReceiver, ServerRequestContext, TransportRequest, TransportResponse } from "@hyperttp/types";
|
|
2
|
+
import type { RestServerHandler, RestServerInput, RestServerResponse } from "./type.js";
|
|
3
|
+
/**
|
|
4
|
+
* @ru REST/HTTP серверный адаптер. Зеркальная к `RestSender` реализация
|
|
5
|
+
* трёхфазного цикла receive → handle → respond.
|
|
6
|
+
* @en REST/HTTP server adapter. Mirror implementation of `RestSender` for the
|
|
7
|
+
* three-phase receive → handle → respond cycle.
|
|
8
|
+
*/
|
|
9
|
+
export declare class RestReceiver implements HyperReceiver<RestServerInput, RestServerResponse, TransportRequest, TransportResponse> {
|
|
10
|
+
readonly protocol = "rest";
|
|
11
|
+
protected readonly handler?: RestServerHandler;
|
|
12
|
+
constructor(options?: {
|
|
13
|
+
handler?: RestServerHandler;
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* @ru Фаза приёма: разбирает сырой запрос транспорта в REST-структуру.
|
|
17
|
+
* @en Receive phase: parses raw transport request into REST input structure.
|
|
18
|
+
*/
|
|
19
|
+
receive(raw: TransportRequest, _ctx: ServerRequestContext): RestServerInput;
|
|
20
|
+
/**
|
|
21
|
+
* @ru Фаза обработки: вызывает зарегистрированный handler.
|
|
22
|
+
* @en Handle phase: executes the registered application handler.
|
|
23
|
+
*/
|
|
24
|
+
handle(request: RestServerInput, ctx: ServerRequestContext): RestServerResponse | Promise<RestServerResponse>;
|
|
25
|
+
/**
|
|
26
|
+
* @ru Фаза ответа: сериализует протокольный ответ в транспортный формат.
|
|
27
|
+
* @en Respond phase: serializes protocol response to raw transport format.
|
|
28
|
+
*/
|
|
29
|
+
respond(response: RestServerResponse, _ctx: ServerRequestContext): TransportResponse;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=receiver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receiver.d.ts","sourceRoot":"","sources":["../../../src/protocols/rest/receiver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAoHxF;;;;;GAKG;AACH,qBAAa,YAAa,YAAW,aAAa,CAChD,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,CAClB;IACC,QAAQ,CAAC,QAAQ,UAAU;IAC3B,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAE/C,YAAY,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,iBAAiB,CAAA;KAAO,EAExD;IAED;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,oBAAoB,GAAG,eAAe,CAU1E;IAED;;;OAGG;IACH,MAAM,CACJ,OAAO,EAAE,eAAe,EACxB,GAAG,EAAE,oBAAoB,GACxB,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAYlD;IAED;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,oBAAoB,GAAG,iBAAiB,CAqBnF;CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";import{HyperClientError as d}from"../../utils/errors.js";const u="application/json",a=new TextDecoder,y=new TextEncoder,i=typeof Buffer<"u";function l(t){return i?Buffer.from(t.buffer,t.byteOffset,t.byteLength).toString("utf8"):a.decode(t)}function h(t){return i?Buffer.from(t).toString("utf8"):a.decode(t)}function p(t){return i?Buffer.from(t):y.encode(t)}const A={200:"OK",201:"Created",204:"No Content",400:"Bad Request",401:"Unauthorized",403:"Forbidden",404:"Not Found",500:"Internal Server Error"};function T(t){if(!t)return{};const e={};for(const[n,o]of new URLSearchParams(t)){const f=e[n];f===void 0?e[n]=o:Array.isArray(f)?f.push(o):e[n]=[f,o]}return e}function b(t,e){const n=t[e]??t[e.toLowerCase()];if(n!==void 0)return Array.isArray(n)?n[0]:n;const o=e.toLowerCase();for(const f in t)if(f.toLowerCase()===o){const r=t[f];return Array.isArray(r)?r[0]:r}}function s(t,e){if((b(t,"content-type")??"").includes(u))try{return JSON.parse(e)}catch{return e}return e}function g(t){const e=t.body;if(e!=null)return e instanceof Uint8Array?s(t.headers,l(e)):e instanceof ArrayBuffer?s(t.headers,h(e)):typeof e=="string"?s(t.headers,e):e}export class RestReceiver{protocol="rest";handler;constructor(e={}){this.handler=e.handler}receive(e,n){const o=new URL(e.url,"http://hyperttp.local");return{method:e.method,path:o.pathname,headers:e.headers,query:T(o.search.slice(1)),body:g(e)}}handle(e,n){if(n.signal?.aborted)throw n.signal.reason??new Error("Request aborted");if(!this.handler)throw new d('[RestReceiver] No application handler registered for protocol "rest".');return this.handler(e,n)}respond(e,n){const o={...e.headers},f=e.status??200;let r=e.body;return r instanceof ArrayBuffer?r=new Uint8Array(r):ArrayBuffer.isView(r)&&!(r instanceof Uint8Array)?r=new Uint8Array(r.buffer,r.byteOffset,r.byteLength).slice():r!=null&&typeof r=="object"&&!(r instanceof Uint8Array)&&(r=JSON.stringify(r),Object.keys(o).some(c=>c.toLowerCase()==="content-type")||(o["content-type"]=u)),{status:f,statusText:A[f]??"",headers:o,body:r==null?void 0:r instanceof Uint8Array?r:p(String(r))}}}
|
|
2
|
+
//# sourceMappingURL=receiver.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/protocols/rest/receiver.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n HyperReceiver,\n ServerRequestContext,\n TransportRequest,\n TransportResponse,\n} from \"@hyperttp/types\";\nimport type { RestServerHandler, RestServerInput, RestServerResponse } from \"./type.js\";\nimport { HyperClientError } from \"../../utils/errors.js\";\n\nconst JSON_TYPE = \"application/json\";\nconst TEXT_DECODER = new TextDecoder();\nconst TEXT_ENCODER = new TextEncoder();\nconst HAS_BUFFER = typeof Buffer !== \"undefined\";\n\nfunction decodeUtf8(bytes: Uint8Array): string {\n if (HAS_BUFFER) {\n return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString(\"utf8\");\n }\n return TEXT_DECODER.decode(bytes);\n}\n\nfunction decodeArrayBuffer(ab: ArrayBuffer): string {\n if (HAS_BUFFER) {\n return Buffer.from(ab).toString(\"utf8\");\n }\n return TEXT_DECODER.decode(ab);\n}\n\nfunction encodeUtf8(str: string): Uint8Array {\n if (HAS_BUFFER) {\n return Buffer.from(str);\n }\n return TEXT_ENCODER.encode(str);\n}\n\nconst defaultStatusTexts: Record<number, string> = {\n 200: \"OK\",\n 201: \"Created\",\n 204: \"No Content\",\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 500: \"Internal Server Error\",\n};\n\n/**\n * @ru Разбирает query-строку URL в словарь (поддерживает повторные ключи как массивы).\n * @en Parses a URL query string into a dictionary (supports repeated keys as arrays).\n */\nfunction parseQuery(queryString: string): Record<string, string | string[]> {\n if (!queryString) return {};\n const out: Record<string, string | string[]> = {};\n\n for (const [key, value] of new URLSearchParams(queryString)) {\n const existing = out[key];\n if (existing === undefined) {\n out[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n out[key] = [existing, value];\n }\n }\n\n return out;\n}\n\n/**\n * @ru Регистронезависимое получение значения заголовка.\n * @en Case-insensitive header value lookup.\n */\nfunction getHeaderValue(\n headers: Readonly<Record<string, string | string[]>>,\n name: string,\n): string | undefined {\n const direct = headers[name] ?? headers[name.toLowerCase()];\n if (direct !== undefined) {\n return Array.isArray(direct) ? direct[0] : direct;\n }\n const targetKey = name.toLowerCase();\n for (const key in headers) {\n if (key.toLowerCase() === targetKey) {\n const val = headers[key];\n return Array.isArray(val) ? val[0] : val;\n }\n }\n return undefined;\n}\n\n/**\n * @ru Декодирует тело запроса по content-type.\n * @en Decodes the request body based on content-type.\n */\nfunction parseTextBody(\n headers: Readonly<Record<string, string | string[]>>,\n text: string,\n): unknown {\n const contentType = getHeaderValue(headers, \"content-type\") ?? \"\";\n if (contentType.includes(JSON_TYPE)) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n}\n\nfunction decodeBody(raw: TransportRequest): unknown {\n const body = raw.body;\n if (body == null) return undefined;\n if (body instanceof Uint8Array) {\n return parseTextBody(raw.headers, decodeUtf8(body));\n }\n if (body instanceof ArrayBuffer) {\n return parseTextBody(raw.headers, decodeArrayBuffer(body));\n }\n if (typeof body === \"string\") return parseTextBody(raw.headers, body);\n return body;\n}\n\n/**\n * @ru REST/HTTP серверный адаптер. Зеркальная к `RestSender` реализация\n * трёхфазного цикла receive → handle → respond.\n * @en REST/HTTP server adapter. Mirror implementation of `RestSender` for the\n * three-phase receive → handle → respond cycle.\n */\nexport class RestReceiver implements HyperReceiver<\n RestServerInput,\n RestServerResponse,\n TransportRequest,\n TransportResponse\n> {\n readonly protocol = \"rest\";\n protected readonly handler?: RestServerHandler;\n\n constructor(options: { handler?: RestServerHandler } = {}) {\n this.handler = options.handler;\n }\n\n /**\n * @ru Фаза приёма: разбирает сырой запрос транспорта в REST-структуру.\n * @en Receive phase: parses raw transport request into REST input structure.\n */\n receive(raw: TransportRequest, _ctx: ServerRequestContext): RestServerInput {\n const url = new URL(raw.url, \"http://hyperttp.local\");\n\n return {\n method: raw.method,\n path: url.pathname,\n headers: raw.headers,\n query: parseQuery(url.search.slice(1)),\n body: decodeBody(raw),\n };\n }\n\n /**\n * @ru Фаза обработки: вызывает зарегистрированный handler.\n * @en Handle phase: executes the registered application handler.\n */\n handle(\n request: RestServerInput,\n ctx: ServerRequestContext,\n ): RestServerResponse | Promise<RestServerResponse> {\n if (ctx.signal?.aborted) {\n throw ctx.signal.reason ?? new Error(\"Request aborted\");\n }\n\n if (!this.handler) {\n throw new HyperClientError(\n '[RestReceiver] No application handler registered for protocol \"rest\".',\n );\n }\n\n return this.handler(request, ctx);\n }\n\n /**\n * @ru Фаза ответа: сериализует протокольный ответ в транспортный формат.\n * @en Respond phase: serializes protocol response to raw transport format.\n */\n respond(response: RestServerResponse, _ctx: ServerRequestContext): TransportResponse {\n const headers: Record<string, string> = { ...response.headers };\n const status = response.status ?? 200;\n\n let body: unknown = response.body;\n if (body instanceof ArrayBuffer) {\n body = new Uint8Array(body);\n } else if (ArrayBuffer.isView(body) && !(body instanceof Uint8Array)) {\n body = new Uint8Array(body.buffer, body.byteOffset, body.byteLength).slice();\n } else if (body != null && typeof body === \"object\" && !(body instanceof Uint8Array)) {\n body = JSON.stringify(body);\n const hasContentType = Object.keys(headers).some((k) => k.toLowerCase() === \"content-type\");\n if (!hasContentType) headers[\"content-type\"] = JSON_TYPE;\n }\n\n return {\n status,\n statusText: defaultStatusTexts[status] ?? \"\",\n headers,\n body: body == null ? undefined : body instanceof Uint8Array ? body : encodeUtf8(String(body)),\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["HyperClientError", "JSON_TYPE", "TEXT_DECODER", "TEXT_ENCODER", "HAS_BUFFER", "decodeUtf8", "bytes", "decodeArrayBuffer", "ab", "encodeUtf8", "str", "defaultStatusTexts", "parseQuery", "queryString", "out", "key", "value", "existing", "getHeaderValue", "headers", "name", "direct", "targetKey", "val", "parseTextBody", "text", "decodeBody", "raw", "body", "options", "_ctx", "url", "request", "ctx", "response", "status", "k"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { HyperSender, HyperTransport, RequestContext, SendRequest, TransportRequest, TransportResponse, UniversalResponse } from "@hyperttp/types";
|
|
2
|
+
import type { RestInput } from "./type.js";
|
|
3
|
+
export interface RestSenderOptions {
|
|
4
|
+
transport?: HyperTransport;
|
|
5
|
+
[key: string]: unknown;
|
|
6
|
+
}
|
|
7
|
+
export declare class RestSender implements HyperSender<RestInput, unknown, TransportRequest, TransportResponse> {
|
|
8
|
+
readonly protocol = "rest";
|
|
9
|
+
protected readonly options?: RestSenderOptions;
|
|
10
|
+
constructor(options?: RestSenderOptions);
|
|
11
|
+
readonly methods: Readonly<Record<string, (...args: any[]) => any>>;
|
|
12
|
+
prepare(request: SendRequest<RestInput, string>, ctx: RequestContext): TransportRequest;
|
|
13
|
+
send(prepared: TransportRequest, transport: HyperTransport, _ctx: RequestContext): Promise<TransportResponse>;
|
|
14
|
+
parse(raw: TransportResponse, _ctx: RequestContext): UniversalResponse<unknown>;
|
|
15
|
+
private dispatch;
|
|
16
|
+
private buildUrl;
|
|
17
|
+
private getHeaderValue;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=sender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../../src/protocols/rest/sender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EAEd,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,SAAS,EAAkC,MAAM,WAAW,CAAC;AAgB3E,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA4DD,qBAAa,UAAW,YAAW,WAAW,CAC5C,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,iBAAiB,CAClB;IACC,QAAQ,CAAC,QAAQ,UAAU;IAC3B,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAE/C,YAAY,OAAO,CAAC,EAAE,iBAAiB,EAEtC;IAED,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAyGjE;IAEF,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,cAAc,GAAG,gBAAgB,CAgEtF;IAEK,IAAI,CACR,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAiB5B;IAED,KAAK,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,CA6B9E;IAED,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,QAAQ;IAuChB,OAAO,CAAC,cAAc;CAevB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";import{TimeoutError as g}from"../../utils/errors.js";import{applyTimeout as y}from"../../utils/abort.js";const p="rest:stream",m=new TextDecoder,h=new WeakMap,A={200:"OK",201:"Created",204:"No Content",400:"Bad Request",401:"Unauthorized",403:"Forbidden",404:"Not Found",500:"Internal Server Error"};function T(a){if(a===null||typeof a!="object")return!1;const t=Object.getPrototypeOf(a);return t===null||t===Object.prototype}async function S(a){if(a instanceof Uint8Array)return a;if(a instanceof ArrayBuffer)return new Uint8Array(a);if(ArrayBuffer.isView(a))return new Uint8Array(a.buffer,a.byteOffset,a.byteLength).slice();if(a&&typeof a=="object"&&"arrayBuffer"in a){const t=a.arrayBuffer;if(typeof t=="function")return new Uint8Array(await t.call(a))}if(typeof ReadableStream<"u"&&a instanceof ReadableStream){const t=a.getReader(),r=[];let e=0;for(;;){const{done:i,value:c}=await t.read();if(i)break;const o=c instanceof Uint8Array?c:new Uint8Array(c);r.push(o),e+=o.byteLength}const n=new Uint8Array(e);let s=0;for(const i of r)n.set(i,s),s+=i.byteLength;return n}return a}export class RestSender{protocol="rest";options;constructor(t){this.options=t}methods={get:(t,r,e,n)=>this.dispatch(t,{method:"GET",url:r,...e,signal:n??e?.signal}),post:(t,r,e,n,s)=>this.dispatch(t,{method:"POST",url:r,...n,body:e,signal:s??n?.signal}),put:(t,r,e,n,s)=>this.dispatch(t,{method:"PUT",url:r,...n,body:e,signal:s??n?.signal}),patch:(t,r,e,n,s)=>this.dispatch(t,{method:"PATCH",url:r,...n,body:e,signal:s??n?.signal}),delete:(t,r,e,n)=>this.dispatch(t,{method:"DELETE",url:r,...e,signal:n??e?.signal}),head:(t,r,e,n)=>this.dispatch(t,{method:"HEAD",url:r,...e,signal:n??e?.signal}),options:(t,r,e,n)=>this.dispatch(t,{method:"OPTIONS",url:r,...e,signal:n??e?.signal}),query:(t,r,e,n,s)=>this.dispatch(t,{method:"QUERY",url:r,...n,body:e,signal:s??n?.signal}),request:(t,r,e,n,s)=>this.dispatch(t,{method:r,url:e,...n,signal:s??n?.signal}),stream:(t,r,e,n)=>this.dispatch(t,{method:"GET",url:r,...e,stream:!0,signal:n??e?.signal})};prepare(t,r){const{input:e}=t,n=t.signal??e.signal??r.signal,s=e.timeout;let i,c=n;if(s!=null&&s>0){const u={};c=y(n,s,u,()=>new g(e.url,s)),i=u.cleanupSignal}const o={};if(e.headers)if(e.headers instanceof Headers)e.headers.forEach((u,f)=>{o[f.toLowerCase()]=u});else if(Array.isArray(e.headers))for(const[u,f]of e.headers)o[u.toLowerCase()]=f;else for(const u in e.headers){const f=e.headers[u];f!=null&&(o[u.toLowerCase()]=String(f))}let l=e.body;l!=null&&(T(l)||Array.isArray(l))&&(l=JSON.stringify(l),o["content-type"]||(o["content-type"]="application/json; charset=utf-8"));const d={method:e.method.toUpperCase(),url:this.buildUrl(e.url,e.query),headers:o,body:l,signal:c,protocol:this.protocol,stream:e.stream,stealth:e.stealth,followRedirects:e.followRedirects,maxRedirects:e.maxRedirects};return i&&h.set(d,i),d}async send(t,r,e){const n=t;try{const s=await r.execute(t);if(n.stream)return{...s,[p]:!0};const i=await S(s.body);return i===s.body?s:{...s,body:i}}finally{const s=h.get(t);s&&(h.delete(t),s())}}parse(t,r){const e=t.status>=200&&t.status<300;let n=t.body;if(!t[p]&&t.body instanceof Uint8Array){const s=this.getHeaderValue(t.headers,"content-type")??"",i=m.decode(t.body);if(s.includes("application/json"))try{n=JSON.parse(i)}catch{n=i}else(s.includes("text/")||s.includes("application/xml"))&&(n=i)}return{protocol:this.protocol,ok:e,status:t.status,statusText:t.statusText||A[t.status]||"",headers:t.headers,url:t.url,data:n,raw:t}}dispatch(t,r){return t.send({protocol:"rest",input:r,signal:r.signal})}buildUrl(t,r){if(!r)return t;const e=[];for(const[c,o]of Object.entries(r)){if(o==null)continue;const l=Array.isArray(o)?o:[o];for(const d of l)e.push(`${encodeURIComponent(c)}=${encodeURIComponent(String(d))}`)}if(e.length===0)return t;const n=e.join("&"),s=t.indexOf("#");if(s!==-1){const c=t.slice(0,s),o=t.slice(s),l=c.includes("?")?"&":"?";return`${c}${l}${n}${o}`}const i=t.includes("?")?"&":"?";return`${t}${i}${n}`}getHeaderValue(t,r){const e=r.toLowerCase(),n=t[e]??t[r];if(n!==void 0)return Array.isArray(n)?n[0]:n;for(const s in t){if(s.toLowerCase()!==e)continue;const i=t[s];return Array.isArray(i)?i[0]:i}}}
|
|
2
|
+
//# sourceMappingURL=sender.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/protocols/rest/sender.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n HyperSender,\n HyperTransport,\n IHyperCore,\n RequestContext,\n SendRequest,\n TransportRequest,\n TransportResponse,\n UniversalResponse,\n} from \"@hyperttp/types\";\nimport type { RestInput, RestRequestOptions, HttpMethod } from \"./type.js\";\nimport { TimeoutError } from \"../../utils/errors.js\";\nimport { applyTimeout } from \"../../utils/abort.js\";\n\nconst STREAM_HINT = \"rest:stream\";\nconst TEXT_DECODER = new TextDecoder();\nconst REQUEST_CLEANUPS = new WeakMap<TransportRequest, () => void>();\n\ntype RestTransportRequest = TransportRequest & {\n stream?: boolean;\n};\n\ntype RestTransportResponse = TransportResponse & {\n [STREAM_HINT]?: boolean;\n};\n\nexport interface RestSenderOptions {\n transport?: HyperTransport;\n [key: string]: unknown;\n}\n\nconst defaultStatusTexts: Record<number, string> = {\n 200: \"OK\",\n 201: \"Created\",\n 204: \"No Content\",\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 500: \"Internal Server Error\",\n};\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\nasync function collectBody(body: unknown): Promise<unknown> {\n if (body instanceof Uint8Array) return body;\n if (body instanceof ArrayBuffer) return new Uint8Array(body);\n if (ArrayBuffer.isView(body)) {\n return new Uint8Array(body.buffer, body.byteOffset, body.byteLength).slice();\n }\n\n if (body && typeof body === \"object\" && \"arrayBuffer\" in body) {\n const arrayBuffer = (body as { arrayBuffer?: unknown }).arrayBuffer;\n if (typeof arrayBuffer === \"function\") {\n return new Uint8Array(await arrayBuffer.call(body));\n }\n }\n\n if (typeof ReadableStream !== \"undefined\" && body instanceof ReadableStream) {\n const reader = body.getReader();\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n const chunk = value instanceof Uint8Array ? value : new Uint8Array(value);\n chunks.push(chunk);\n totalLength += chunk.byteLength;\n }\n\n const collected = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n collected.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return collected;\n }\n\n return body;\n}\n\nexport class RestSender implements HyperSender<\n RestInput,\n unknown,\n TransportRequest,\n TransportResponse\n> {\n readonly protocol = \"rest\";\n protected readonly options?: RestSenderOptions;\n\n constructor(options?: RestSenderOptions) {\n this.options = options;\n }\n\n readonly methods: Readonly<Record<string, (...args: any[]) => any>> = {\n get: (core: IHyperCore, url: string, options?: RestRequestOptions, signal?: AbortSignal) =>\n this.dispatch(core, { method: \"GET\", url, ...options, signal: signal ?? options?.signal }),\n\n post: (\n core: IHyperCore,\n url: string,\n body?: unknown,\n options?: Omit<RestRequestOptions, \"body\">,\n signal?: AbortSignal,\n ) =>\n this.dispatch(core, {\n method: \"POST\",\n url,\n ...options,\n body,\n signal: signal ?? options?.signal,\n }),\n\n put: (\n core: IHyperCore,\n url: string,\n body?: unknown,\n options?: Omit<RestRequestOptions, \"body\">,\n signal?: AbortSignal,\n ) =>\n this.dispatch(core, {\n method: \"PUT\",\n url,\n ...options,\n body,\n signal: signal ?? options?.signal,\n }),\n\n patch: (\n core: IHyperCore,\n url: string,\n body?: unknown,\n options?: Omit<RestRequestOptions, \"body\">,\n signal?: AbortSignal,\n ) =>\n this.dispatch(core, {\n method: \"PATCH\",\n url,\n ...options,\n body,\n signal: signal ?? options?.signal,\n }),\n\n delete: (core: IHyperCore, url: string, options?: RestRequestOptions, signal?: AbortSignal) =>\n this.dispatch(core, { method: \"DELETE\", url, ...options, signal: signal ?? options?.signal }),\n\n head: (core: IHyperCore, url: string, options?: RestRequestOptions, signal?: AbortSignal) =>\n this.dispatch(core, { method: \"HEAD\", url, ...options, signal: signal ?? options?.signal }),\n\n options: (core: IHyperCore, url: string, options?: RestRequestOptions, signal?: AbortSignal) =>\n this.dispatch(core, {\n method: \"OPTIONS\",\n url,\n ...options,\n signal: signal ?? options?.signal,\n }),\n\n query: (\n core: IHyperCore,\n url: string,\n body?: unknown,\n options?: Omit<RestRequestOptions, \"body\">,\n signal?: AbortSignal,\n ) =>\n this.dispatch(core, {\n method: \"QUERY\",\n url,\n ...options,\n body,\n signal: signal ?? options?.signal,\n }),\n\n request: (\n core: IHyperCore,\n method: HttpMethod | (string & {}),\n url: string,\n options?: RestRequestOptions,\n signal?: AbortSignal,\n ) =>\n this.dispatch(core, {\n method: method as HttpMethod,\n url,\n ...options,\n signal: signal ?? options?.signal,\n }),\n\n stream: (\n core: IHyperCore,\n url: string,\n options?: Omit<RestRequestOptions, \"stream\">,\n signal?: AbortSignal,\n ) =>\n this.dispatch(core, {\n method: \"GET\",\n url,\n ...options,\n stream: true,\n signal: signal ?? options?.signal,\n }),\n };\n\n prepare(request: SendRequest<RestInput, string>, ctx: RequestContext): TransportRequest {\n const { input } = request;\n const inputSignal = request.signal ?? input.signal ?? ctx.signal;\n const timeout = input.timeout;\n let cleanupSignal: (() => void) | undefined;\n let signal = inputSignal;\n\n if (timeout != null && timeout > 0) {\n const timeoutMeta: { cleanupSignal?: () => void } = {};\n signal = applyTimeout(\n inputSignal,\n timeout,\n timeoutMeta,\n () => new TimeoutError(input.url, timeout),\n );\n cleanupSignal = timeoutMeta.cleanupSignal;\n }\n\n const headers: Record<string, string> = {};\n\n if (input.headers) {\n if (input.headers instanceof Headers) {\n input.headers.forEach((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n } else if (Array.isArray(input.headers)) {\n for (const [key, value] of input.headers) {\n headers[key.toLowerCase()] = value;\n }\n } else {\n for (const key in input.headers) {\n const value = (input.headers as Record<string, unknown>)[key];\n\n if (value != null) {\n headers[key.toLowerCase()] = String(value);\n }\n }\n }\n }\n\n let body = input.body;\n\n if (body !== undefined && body !== null && (isPlainObject(body) || Array.isArray(body))) {\n body = JSON.stringify(body);\n if (!headers[\"content-type\"]) {\n headers[\"content-type\"] = \"application/json; charset=utf-8\";\n }\n }\n\n const prepared = {\n method: input.method.toUpperCase(),\n url: this.buildUrl(input.url, input.query),\n headers,\n body,\n signal,\n protocol: this.protocol,\n stream: input.stream,\n stealth: (input as any).stealth,\n followRedirects: input.followRedirects,\n maxRedirects: input.maxRedirects,\n } as RestTransportRequest;\n\n if (cleanupSignal) REQUEST_CLEANUPS.set(prepared, cleanupSignal);\n return prepared;\n }\n\n async send(\n prepared: TransportRequest,\n transport: HyperTransport,\n _ctx: RequestContext,\n ): Promise<TransportResponse> {\n const restRequest = prepared as RestTransportRequest;\n try {\n const response = await transport.execute(prepared);\n if (restRequest.stream) {\n return { ...response, [STREAM_HINT]: true } as RestTransportResponse;\n }\n\n const body = await collectBody(response.body);\n return body === response.body ? response : { ...response, body };\n } finally {\n const cleanup = REQUEST_CLEANUPS.get(prepared);\n if (cleanup) {\n REQUEST_CLEANUPS.delete(prepared);\n cleanup();\n }\n }\n }\n\n parse(raw: TransportResponse, _ctx: RequestContext): UniversalResponse<unknown> {\n const ok = raw.status >= 200 && raw.status < 300;\n let parsedData: unknown = raw.body;\n\n if (!(raw as RestTransportResponse)[STREAM_HINT] && raw.body instanceof Uint8Array) {\n const contentType = this.getHeaderValue(raw.headers, \"content-type\") ?? \"\";\n const text = TEXT_DECODER.decode(raw.body);\n\n if (contentType.includes(\"application/json\")) {\n try {\n parsedData = JSON.parse(text);\n } catch {\n parsedData = text;\n }\n } else if (contentType.includes(\"text/\") || contentType.includes(\"application/xml\")) {\n parsedData = text;\n }\n }\n\n return {\n protocol: this.protocol,\n ok,\n status: raw.status,\n statusText: raw.statusText || defaultStatusTexts[raw.status] || \"\",\n headers: raw.headers,\n url: raw.url,\n data: parsedData,\n raw,\n };\n }\n\n private dispatch(core: IHyperCore, input: RestInput): Promise<UniversalResponse<unknown>> {\n return core.send<RestInput, unknown, \"rest\">({\n protocol: \"rest\",\n input,\n signal: input.signal,\n });\n }\n\n private buildUrl(baseUrl: string, query?: RestInput[\"query\"]): string {\n if (!query) {\n return baseUrl;\n }\n\n const parts: string[] = [];\n\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n const values = Array.isArray(value) ? value : [value];\n\n for (const v of values) {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`);\n }\n }\n\n if (parts.length === 0) {\n return baseUrl;\n }\n\n const queryString = parts.join(\"&\");\n const hashIndex = baseUrl.indexOf(\"#\");\n\n if (hashIndex !== -1) {\n const urlBeforeHash = baseUrl.slice(0, hashIndex);\n const hashPart = baseUrl.slice(hashIndex);\n const separator = urlBeforeHash.includes(\"?\") ? \"&\" : \"?\";\n\n return `${urlBeforeHash}${separator}${queryString}${hashPart}`;\n }\n\n const separator = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n\n return `${baseUrl}${separator}${queryString}`;\n }\n\n private getHeaderValue(\n headers: Record<string, string | string[]>,\n name: string,\n ): string | undefined {\n const target = name.toLowerCase();\n const direct = headers[target] ?? headers[name];\n if (direct !== undefined) return Array.isArray(direct) ? direct[0] : direct;\n\n for (const key in headers) {\n if (key.toLowerCase() !== target) continue;\n const value = headers[key];\n return Array.isArray(value) ? value[0] : value;\n }\n return undefined;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TimeoutError", "applyTimeout", "STREAM_HINT", "TEXT_DECODER", "REQUEST_CLEANUPS", "defaultStatusTexts", "isPlainObject", "value", "proto", "collectBody", "body", "arrayBuffer", "reader", "chunks", "totalLength", "done", "chunk", "collected", "offset", "options", "core", "url", "signal", "method", "request", "ctx", "input", "inputSignal", "timeout", "cleanupSignal", "timeoutMeta", "headers", "key", "prepared", "transport", "_ctx", "restRequest", "response", "cleanup", "raw", "ok", "parsedData", "contentType", "text", "baseUrl", "query", "parts", "values", "v", "queryString", "hashIndex", "urlBeforeHash", "hashPart", "separator", "name", "target", "direct"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { HyperSender, ServerRequestContext, UniversalResponse } from "@hyperttp/types";
|
|
2
|
+
export type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS" | "QUERY";
|
|
3
|
+
export interface RestInput<TBody = unknown> {
|
|
4
|
+
method: HttpMethod;
|
|
5
|
+
url: string;
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
|
+
query?: Record<string, string | number | boolean | (string | number | boolean)[]>;
|
|
8
|
+
body?: TBody;
|
|
9
|
+
timeout?: number;
|
|
10
|
+
stream?: boolean;
|
|
11
|
+
followRedirects?: boolean;
|
|
12
|
+
maxRedirects?: number;
|
|
13
|
+
signal?: AbortSignal;
|
|
14
|
+
}
|
|
15
|
+
export type RestRequestOptions = Omit<RestInput, "method" | "url">;
|
|
16
|
+
/**
|
|
17
|
+
* @ru Разобранный серверный REST-запрос, получаемый ресивером из сырого транспорта.
|
|
18
|
+
* @en Parsed server-side REST request produced by the receiver from raw transport input.
|
|
19
|
+
*/
|
|
20
|
+
export interface RestServerInput {
|
|
21
|
+
readonly method: HttpMethod | (string & {});
|
|
22
|
+
readonly path: string;
|
|
23
|
+
readonly headers: Readonly<Record<string, string | string[]>>;
|
|
24
|
+
readonly query: Readonly<Record<string, string | string[]>>;
|
|
25
|
+
readonly body?: unknown;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @ru Ответ серверного REST-обработчика, сериализуемый ресивером в транспортный формат.
|
|
29
|
+
* @en Server-side REST handler response, serialized by the receiver into the transport format.
|
|
30
|
+
*/
|
|
31
|
+
export interface RestServerResponse {
|
|
32
|
+
readonly status?: number;
|
|
33
|
+
readonly headers?: Record<string, string>;
|
|
34
|
+
readonly body?: unknown;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* @ru Серверный обработчик REST-протокола.
|
|
38
|
+
* @en Server-side REST protocol handler.
|
|
39
|
+
* @param request - The parsed server request.
|
|
40
|
+
* @param ctx - The server request context.
|
|
41
|
+
* @returns The response to serialize.
|
|
42
|
+
*/
|
|
43
|
+
export type RestServerHandler = (request: RestServerInput, ctx: ServerRequestContext) => RestServerResponse | Promise<RestServerResponse>;
|
|
44
|
+
export interface RestClientMethods {
|
|
45
|
+
get<T = unknown>(url: string, options?: RestRequestOptions, signal?: AbortSignal): Promise<UniversalResponse<T>>;
|
|
46
|
+
post<T = unknown>(url: string, body?: unknown, options?: Omit<RestRequestOptions, "body">, signal?: AbortSignal): Promise<UniversalResponse<T>>;
|
|
47
|
+
put<T = unknown>(url: string, body?: unknown, options?: Omit<RestRequestOptions, "body">, signal?: AbortSignal): Promise<UniversalResponse<T>>;
|
|
48
|
+
patch<T = unknown>(url: string, body?: unknown, options?: Omit<RestRequestOptions, "body">, signal?: AbortSignal): Promise<UniversalResponse<T>>;
|
|
49
|
+
delete<T = unknown>(url: string, options?: RestRequestOptions, signal?: AbortSignal): Promise<UniversalResponse<T>>;
|
|
50
|
+
head<T = unknown>(url: string, options?: RestRequestOptions, signal?: AbortSignal): Promise<UniversalResponse<T>>;
|
|
51
|
+
options<T = unknown>(url: string, options?: RestRequestOptions, signal?: AbortSignal): Promise<UniversalResponse<T>>;
|
|
52
|
+
query<T = unknown>(url: string, body?: unknown, options?: Omit<RestRequestOptions, "body">, signal?: AbortSignal): Promise<UniversalResponse<T>>;
|
|
53
|
+
request<T = unknown>(method: HttpMethod | (string & {}), url: string, options?: RestRequestOptions, signal?: AbortSignal): Promise<UniversalResponse<T>>;
|
|
54
|
+
stream<T = unknown>(url: string, options?: Omit<RestRequestOptions, "stream">, signal?: AbortSignal): Promise<UniversalResponse<T>>;
|
|
55
|
+
}
|
|
56
|
+
declare module "@hyperttp/types" {
|
|
57
|
+
interface ProtocolInputMap {
|
|
58
|
+
rest: RestInput;
|
|
59
|
+
}
|
|
60
|
+
interface HyperProtocols {
|
|
61
|
+
readonly rest: RestClientMethods;
|
|
62
|
+
}
|
|
63
|
+
interface BaseHyperClientOptions {
|
|
64
|
+
/**
|
|
65
|
+
* @ru Кастомный сендер протокола, заменяющий стандартный сендер для своего протокола.
|
|
66
|
+
* @en Custom protocol sender that overrides the default sender for its protocol.
|
|
67
|
+
*/
|
|
68
|
+
customSender?: HyperSender;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../../src/protocols/rest/type.ts"],"names":[],"mappings":"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"}
|
package/rest.d.ts
ADDED
package/rest.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../src/rest.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC"}
|
package/rest.js
ADDED
package/rest.js.map
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { HyperTransport, SenderProtocol, TransportListenOptions, TransportRequest, TransportResponse, TransportServer } from "@hyperttp/types";
|
|
2
|
+
export interface FetchTransportOptions {
|
|
3
|
+
/**
|
|
4
|
+
* @ru Кастомный список поддерживаемых протоколов.
|
|
5
|
+
* @en Custom list of supported protocols.
|
|
6
|
+
*/
|
|
7
|
+
protocols?: SenderProtocol[];
|
|
8
|
+
maxBodyBytes?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* @ru Минимальный транспорт на базе нативного fetch. Гарантированный fallback,
|
|
12
|
+
* когда ни один пакетный транспорт (@hyperttp/transport-undici/bun) не установлен.
|
|
13
|
+
* @en Minimal native fetch-based transport. A guaranteed fallback used when no
|
|
14
|
+
* packaged transport (@hyperttp/transport-undici/bun) is installed.
|
|
15
|
+
*/
|
|
16
|
+
export declare class FetchTransport implements HyperTransport {
|
|
17
|
+
readonly protocols: readonly SenderProtocol[];
|
|
18
|
+
private readonly maxBodyBytes;
|
|
19
|
+
constructor(options?: FetchTransportOptions);
|
|
20
|
+
execute(req: TransportRequest): Promise<TransportResponse>;
|
|
21
|
+
listen(options: TransportListenOptions): Promise<TransportServer>;
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/transports/fetch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAIzB,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAgBD;;;;;GAKG;AACH,qBAAa,cAAe,YAAW,cAAc;IACnD,SAAgB,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC,YAAY,OAAO,GAAE,qBAA0B,EAG9C;IAEY,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4CtE;IAEY,MAAM,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAiJ7E;IAEY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;CACvC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const H=10485760;async function O(){if(typeof process>"u"||!process.versions?.node)throw new Error("[FetchTransport] listen() is only available in Node.js.");return import("node:http")}export class FetchTransport{protocols;maxBodyBytes;constructor(n={}){this.protocols=Object.freeze(n.protocols??["rest"]),this.maxBodyBytes=n.maxBodyBytes??10485760}async execute(n){const u=n,p=n.method!=="GET"&&n.method!=="HEAD",t=await fetch(n.url,{method:n.method,headers:n.headers,body:p?n.body??null:null,signal:n.signal,redirect:u.followRedirects===!1?"manual":"follow"}),y=u.stream?t.body:new Uint8Array(await t.arrayBuffer()),s={};if(typeof t.headers.getSetCookie=="function"){const r=t.headers.getSetCookie();r.length>0&&(s["set-cookie"]=r)}return t.headers.forEach((r,h)=>{const c=h.toLowerCase();if(!(c==="set-cookie"&&s["set-cookie"]))if(s[c]){const d=s[c];s[c]=Array.isArray(d)?[...d,r]:[d,r]}else s[c]=r}),{status:t.status,statusText:t.statusText,headers:s,url:t.url,body:y}}async listen(n){const{host:u,port:p,signal:t,onRequest:y}=n;if(t?.aborted)throw t.reason??new DOMException("The operation was aborted","AbortError");const{createServer:s}=await O(),r=s(async(o,e)=>{const i=new AbortController,l=()=>{i.signal.aborted||i.abort(new DOMException("Client disconnected","AbortError"))},g=()=>{o.complete||l()},E=()=>{e.writableEnded||l()};o.once("aborted",l),o.once("close",g),e.once("close",E);try{const v=Number(o.headers["content-length"]??0);if(Number.isFinite(v)&&v>this.maxBodyBytes){e.writeHead(413),e.end("Payload Too Large");return}const m=[];let B=0;for await(const f of o){if(B+=f.byteLength,B>this.maxBodyBytes){e.writeHead(413),e.end("Payload Too Large");return}m.push(f)}const L=m.length>0?Buffer.concat(m):void 0,T={};for(const[f,b]of Object.entries(o.headers))b!==void 0&&(T[f]=b);const k={method:o.method??"GET",url:o.url??"/",headers:T,body:L,signal:i.signal,protocol:this.protocols[0]??"rest"};if(!y){e.writeHead(501),e.end("Not Implemented");return}const a=await y(k),x={};for(const[f,b]of Object.entries(a.headers))x[f]=b;e.writeHead(a.status,a.statusText??"",x),a.body!=null?a.body instanceof Uint8Array||typeof a.body=="string"?e.end(a.body):e.end(JSON.stringify(a.body)):e.end()}catch{e.headersSent?e.destroy():(e.writeHead(500),e.end("Internal Server Error"))}finally{o.removeListener("aborted",l),o.removeListener("close",g),e.removeListener("close",E)}});let h=!1;const c=()=>h||(h=!0,t?.removeEventListener("abort",d),r.removeListener("error",w),!r.listening)?Promise.resolve():new Promise((o,e)=>{r.close(i=>{i?e(i):o()})}),d=()=>{c()},w=o=>{console.error("[FetchTransport] HTTP server error:",o)};if(t?.aborted)throw t.reason??new DOMException("The operation was aborted","AbortError");return t?.addEventListener("abort",d,{once:!0}),new Promise((o,e)=>{const i=l=>{t?.removeEventListener("abort",d),e(l)};r.once("error",i),r.listen({host:u,port:p},()=>{r.removeListener("error",i),r.on("error",w),o({close:c})})})}async close(){}}
|
|
2
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/transports/fetch.ts"],
|
|
4
|
+
"sourcesContent": ["import type { IncomingMessage, OutgoingHttpHeaders, ServerResponse } from \"node:http\";\nimport type {\n HyperTransport,\n SenderProtocol,\n TransportListenOptions,\n TransportRequest,\n TransportResponse,\n TransportServer,\n} from \"@hyperttp/types\";\n\nconst DEFAULT_MAX_BODY_BYTES = 10 * 1024 * 1024;\n\nexport interface FetchTransportOptions {\n /**\n * @ru Кастомный список поддерживаемых протоколов.\n * @en Custom list of supported protocols.\n */\n protocols?: SenderProtocol[];\n maxBodyBytes?: number;\n}\n\ntype ExtendedTransportRequest = TransportRequest & {\n stream?: boolean;\n followRedirects?: boolean;\n};\n\nasync function loadNodeHttp(): Promise<typeof import(\"node:http\")> {\n if (typeof process === \"undefined\" || !process.versions?.node) {\n throw new Error(\"[FetchTransport] listen() is only available in Node.js.\");\n }\n\n const specifier = \"node:http\";\n return import(/* @vite-ignore */ specifier);\n}\n\n/**\n * @ru Минимальный транспорт на базе нативного fetch. Гарантированный fallback,\n * когда ни один пакетный транспорт (@hyperttp/transport-undici/bun) не установлен.\n * @en Minimal native fetch-based transport. A guaranteed fallback used when no\n * packaged transport (@hyperttp/transport-undici/bun) is installed.\n */\nexport class FetchTransport implements HyperTransport {\n public readonly protocols: readonly SenderProtocol[];\n private readonly maxBodyBytes: number;\n\n constructor(options: FetchTransportOptions = {}) {\n this.protocols = Object.freeze(options.protocols ?? [\"rest\"]);\n this.maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;\n }\n\n public async execute(req: TransportRequest): Promise<TransportResponse> {\n const extendedRequest = req as ExtendedTransportRequest;\n const isBodyAllowed = req.method !== \"GET\" && req.method !== \"HEAD\";\n\n const res = await fetch(req.url, {\n method: req.method,\n headers: req.headers as Record<string, string>,\n body: isBodyAllowed ? ((req.body ?? null) as BodyInit | null) : null,\n signal: req.signal,\n redirect: extendedRequest.followRedirects === false ? \"manual\" : \"follow\",\n });\n\n const body = extendedRequest.stream ? res.body : new Uint8Array(await res.arrayBuffer());\n const headers: Record<string, string | string[]> = {};\n\n if (typeof res.headers.getSetCookie === \"function\") {\n const cookies = res.headers.getSetCookie();\n if (cookies.length > 0) {\n headers[\"set-cookie\"] = cookies;\n }\n }\n\n res.headers.forEach((value, key) => {\n const lowerKey = key.toLowerCase();\n\n if (lowerKey === \"set-cookie\" && headers[\"set-cookie\"]) {\n return;\n }\n\n if (headers[lowerKey]) {\n const existing = headers[lowerKey];\n headers[lowerKey] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n } else {\n headers[lowerKey] = value;\n }\n });\n\n return {\n status: res.status,\n statusText: res.statusText,\n headers,\n url: res.url,\n body,\n };\n }\n\n public async listen(options: TransportListenOptions): Promise<TransportServer> {\n const { host, port, signal, onRequest } = options;\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException(\"The operation was aborted\", \"AbortError\");\n }\n\n const { createServer } = await loadNodeHttp();\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const requestController = new AbortController();\n const abortRequest = () => {\n if (!requestController.signal.aborted) {\n requestController.abort(new DOMException(\"Client disconnected\", \"AbortError\"));\n }\n };\n const abortIncompleteRequest = () => {\n if (!req.complete) abortRequest();\n };\n const abortIncompleteResponse = () => {\n if (!res.writableEnded) abortRequest();\n };\n\n req.once(\"aborted\", abortRequest);\n req.once(\"close\", abortIncompleteRequest);\n res.once(\"close\", abortIncompleteResponse);\n\n try {\n const contentLength = Number(req.headers[\"content-length\"] ?? 0);\n if (Number.isFinite(contentLength) && contentLength > this.maxBodyBytes) {\n res.writeHead(413);\n res.end(\"Payload Too Large\");\n return;\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n for await (const chunk of req) {\n receivedBytes += chunk.byteLength;\n if (receivedBytes > this.maxBodyBytes) {\n res.writeHead(413);\n res.end(\"Payload Too Large\");\n return;\n }\n chunks.push(chunk);\n }\n\n const body = chunks.length > 0 ? Buffer.concat(chunks) : undefined;\n const headers: Record<string, string | string[]> = {};\n\n for (const [key, value] of Object.entries(req.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n\n const transportRequest: TransportRequest = {\n method: req.method ?? \"GET\",\n url: req.url ?? \"/\",\n headers,\n body,\n signal: requestController.signal,\n protocol: this.protocols[0] ?? \"rest\",\n };\n\n if (!onRequest) {\n res.writeHead(501);\n res.end(\"Not Implemented\");\n return;\n }\n\n const response = await onRequest(transportRequest);\n const outgoingHeaders: OutgoingHttpHeaders = {};\n\n for (const [key, value] of Object.entries(response.headers)) {\n outgoingHeaders[key] = value;\n }\n\n res.writeHead(response.status, response.statusText ?? \"\", outgoingHeaders);\n\n if (response.body != null) {\n if (response.body instanceof Uint8Array) {\n res.end(response.body);\n } else if (typeof response.body === \"string\") {\n res.end(response.body);\n } else {\n res.end(JSON.stringify(response.body));\n }\n } else {\n res.end();\n }\n } catch {\n if (!res.headersSent) {\n res.writeHead(500);\n res.end(\"Internal Server Error\");\n } else {\n res.destroy();\n }\n } finally {\n req.removeListener(\"aborted\", abortRequest);\n req.removeListener(\"close\", abortIncompleteRequest);\n res.removeListener(\"close\", abortIncompleteResponse);\n }\n });\n\n let closed = false;\n const close = (): Promise<void> => {\n if (closed) return Promise.resolve();\n closed = true;\n signal?.removeEventListener(\"abort\", closeOnAbort);\n server.removeListener(\"error\", reportRuntimeError);\n\n if (!server.listening) return Promise.resolve();\n return new Promise<void>((resolveClose, rejectClose) => {\n server.close((error) => {\n if (error) rejectClose(error);\n else resolveClose();\n });\n });\n };\n const closeOnAbort = () => {\n void close();\n };\n const reportRuntimeError = (error: Error) => {\n console.error(\"[FetchTransport] HTTP server error:\", error);\n };\n\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException(\"The operation was aborted\", \"AbortError\");\n }\n signal?.addEventListener(\"abort\", closeOnAbort, { once: true });\n\n return new Promise<TransportServer>((resolve, reject) => {\n const rejectStartup = (error: Error) => {\n signal?.removeEventListener(\"abort\", closeOnAbort);\n reject(error);\n };\n\n server.once(\"error\", rejectStartup);\n server.listen({ host, port }, () => {\n server.removeListener(\"error\", rejectStartup);\n server.on(\"error\", reportRuntimeError);\n resolve({ close });\n });\n });\n }\n\n public async close(): Promise<void> {}\n}\n"],
|
|
5
|
+
"mappings": "aAUA,MAAMA,EAAyB,SAgB/B,eAAeC,GAAY,CACzB,GAAI,OAAO,QAAY,KAAe,CAAC,QAAQ,UAAU,KACvD,MAAM,IAAI,MAAM,yDAAyD,EAI3E,OAAO,OADW,YAEpB,CAQM,aAAO,cAAc,CACT,UACC,aAEjB,YAAYC,EAAiC,CAAA,EAAE,CAC7C,KAAK,UAAY,OAAO,OAAOA,EAAQ,WAAa,CAAC,MAAM,CAAC,EAC5D,KAAK,aAAeA,EAAQ,cAAgB,QAC9C,CAEO,MAAM,QAAQC,EAAqB,CACxC,MAAMC,EAAkBD,EAClBE,EAAgBF,EAAI,SAAW,OAASA,EAAI,SAAW,OAEvDG,EAAM,MAAM,MAAMH,EAAI,IAAK,CAC/B,OAAQA,EAAI,OACZ,QAASA,EAAI,QACb,KAAME,EAAkBF,EAAI,MAAQ,KAA4B,KAChE,OAAQA,EAAI,OACZ,SAAUC,EAAgB,kBAAoB,GAAQ,SAAW,SAClE,EAEKG,EAAOH,EAAgB,OAASE,EAAI,KAAO,IAAI,WAAW,MAAMA,EAAI,YAAW,CAAE,EACjFE,EAA6C,CAAA,EAEnD,GAAI,OAAOF,EAAI,QAAQ,cAAiB,WAAY,CAClD,MAAMG,EAAUH,EAAI,QAAQ,aAAY,EACpCG,EAAQ,OAAS,IACnBD,EAAQ,YAAY,EAAIC,EAE5B,CAEA,OAAAH,EAAI,QAAQ,QAAQ,CAACI,EAAOC,IAAO,CACjC,MAAMC,EAAWD,EAAI,YAAW,EAEhC,GAAI,EAAAC,IAAa,cAAgBJ,EAAQ,YAAY,GAIrD,GAAIA,EAAQI,CAAQ,EAAG,CACrB,MAAMC,EAAWL,EAAQI,CAAQ,EACjCJ,EAAQI,CAAQ,EAAI,MAAM,QAAQC,CAAQ,EAAI,CAAC,GAAGA,EAAUH,CAAK,EAAI,CAACG,EAAUH,CAAK,CACvF,MACEF,EAAQI,CAAQ,EAAIF,CAExB,CAAC,EAEM,CACL,OAAQJ,EAAI,OACZ,WAAYA,EAAI,WAChB,QAAAE,EACA,IAAKF,EAAI,IACT,KAAAC,EAEJ,CAEO,MAAM,OAAOL,EAA+B,CACjD,KAAM,CAAE,KAAAY,EAAM,KAAAC,EAAM,OAAAC,EAAQ,UAAAC,CAAS,EAAKf,EAC1C,GAAIc,GAAQ,QACV,MAAMA,EAAO,QAAU,IAAI,aAAa,4BAA6B,YAAY,EAGnF,KAAM,CAAE,aAAAE,CAAY,EAAK,MAAMjB,EAAY,EAErCkB,EAASD,EAAa,MAAOf,EAAsBG,IAAuB,CAC9E,MAAMc,EAAoB,IAAI,gBACxBC,EAAe,IAAK,CACnBD,EAAkB,OAAO,SAC5BA,EAAkB,MAAM,IAAI,aAAa,sBAAuB,YAAY,CAAC,CAEjF,EACME,EAAyB,IAAK,CAC7BnB,EAAI,UAAUkB,EAAY,CACjC,EACME,EAA0B,IAAK,CAC9BjB,EAAI,eAAee,EAAY,CACtC,EAEAlB,EAAI,KAAK,UAAWkB,CAAY,EAChClB,EAAI,KAAK,QAASmB,CAAsB,EACxChB,EAAI,KAAK,QAASiB,CAAuB,EAEzC,GAAI,CACF,MAAMC,EAAgB,OAAOrB,EAAI,QAAQ,gBAAgB,GAAK,CAAC,EAC/D,GAAI,OAAO,SAASqB,CAAa,GAAKA,EAAgB,KAAK,aAAc,CACvElB,EAAI,UAAU,GAAG,EACjBA,EAAI,IAAI,mBAAmB,EAC3B,MACF,CAEA,MAAMmB,EAAuB,CAAA,EAC7B,IAAIC,EAAgB,EAEpB,gBAAiBC,KAASxB,EAAK,CAE7B,GADAuB,GAAiBC,EAAM,WACnBD,EAAgB,KAAK,aAAc,CACrCpB,EAAI,UAAU,GAAG,EACjBA,EAAI,IAAI,mBAAmB,EAC3B,MACF,CACAmB,EAAO,KAAKE,CAAK,CACnB,CAEA,MAAMpB,EAAOkB,EAAO,OAAS,EAAI,OAAO,OAAOA,CAAM,EAAI,OACnDjB,EAA6C,CAAA,EAEnD,SAAW,CAACG,EAAKD,CAAK,IAAK,OAAO,QAAQP,EAAI,OAAO,EAC/CO,IAAU,SACZF,EAAQG,CAAG,EAAID,GAInB,MAAMkB,EAAqC,CACzC,OAAQzB,EAAI,QAAU,MACtB,IAAKA,EAAI,KAAO,IAChB,QAAAK,EACA,KAAAD,EACA,OAAQa,EAAkB,OAC1B,SAAU,KAAK,UAAU,CAAC,GAAK,QAGjC,GAAI,CAACH,EAAW,CACdX,EAAI,UAAU,GAAG,EACjBA,EAAI,IAAI,iBAAiB,EACzB,MACF,CAEA,MAAMuB,EAAW,MAAMZ,EAAUW,CAAgB,EAC3CE,EAAuC,CAAA,EAE7C,SAAW,CAACnB,EAAKD,CAAK,IAAK,OAAO,QAAQmB,EAAS,OAAO,EACxDC,EAAgBnB,CAAG,EAAID,EAGzBJ,EAAI,UAAUuB,EAAS,OAAQA,EAAS,YAAc,GAAIC,CAAe,EAErED,EAAS,MAAQ,KACfA,EAAS,gBAAgB,YAElB,OAAOA,EAAS,MAAS,SADlCvB,EAAI,IAAIuB,EAAS,IAAI,EAIrBvB,EAAI,IAAI,KAAK,UAAUuB,EAAS,IAAI,CAAC,EAGvCvB,EAAI,IAAG,CAEX,MAAQ,CACDA,EAAI,YAIPA,EAAI,QAAO,GAHXA,EAAI,UAAU,GAAG,EACjBA,EAAI,IAAI,uBAAuB,EAInC,SACEH,EAAI,eAAe,UAAWkB,CAAY,EAC1ClB,EAAI,eAAe,QAASmB,CAAsB,EAClDhB,EAAI,eAAe,QAASiB,CAAuB,CACrD,CACF,CAAC,EAED,IAAIQ,EAAS,GACb,MAAMC,EAAQ,IACRD,IACJA,EAAS,GACTf,GAAQ,oBAAoB,QAASiB,CAAY,EACjDd,EAAO,eAAe,QAASe,CAAkB,EAE7C,CAACf,EAAO,WAAkB,QAAQ,QAAO,EACtC,IAAI,QAAc,CAACgB,EAAcC,IAAe,CACrDjB,EAAO,MAAOkB,GAAS,CACjBA,EAAOD,EAAYC,CAAK,EACvBF,EAAY,CACnB,CAAC,CACH,CAAC,EAEGF,EAAe,IAAK,CACnBD,EAAK,CACZ,EACME,EAAsBG,GAAgB,CAC1C,QAAQ,MAAM,sCAAuCA,CAAK,CAC5D,EAEA,GAAIrB,GAAQ,QACV,MAAMA,EAAO,QAAU,IAAI,aAAa,4BAA6B,YAAY,EAEnF,OAAAA,GAAQ,iBAAiB,QAASiB,EAAc,CAAE,KAAM,EAAI,CAAE,EAEvD,IAAI,QAAyB,CAACK,EAASC,IAAU,CACtD,MAAMC,EAAiBH,GAAgB,CACrCrB,GAAQ,oBAAoB,QAASiB,CAAY,EACjDM,EAAOF,CAAK,CACd,EAEAlB,EAAO,KAAK,QAASqB,CAAa,EAClCrB,EAAO,OAAO,CAAE,KAAAL,EAAM,KAAAC,CAAI,EAAI,IAAK,CACjCI,EAAO,eAAe,QAASqB,CAAa,EAC5CrB,EAAO,GAAG,QAASe,CAAkB,EACrCI,EAAQ,CAAE,MAAAN,CAAK,CAAE,CACnB,CAAC,CACH,CAAC,CACH,CAEO,MAAM,OAAK,CAAmB",
|
|
6
|
+
"names": ["DEFAULT_MAX_BODY_BYTES", "loadNodeHttp", "options", "req", "extendedRequest", "isBodyAllowed", "res", "body", "headers", "cookies", "value", "key", "lowerKey", "existing", "host", "port", "signal", "onRequest", "createServer", "server", "requestController", "abortRequest", "abortIncompleteRequest", "abortIncompleteResponse", "contentLength", "chunks", "receivedBytes", "chunk", "transportRequest", "response", "outgoingHeaders", "closed", "close", "closeOnAbort", "reportRuntimeError", "resolveClose", "rejectClose", "error", "resolve", "reject", "rejectStartup"]
|
|
7
|
+
}
|