@hyperttp/core 2.0.4 → 2.0.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperttp/core",
3
- "version": "2.0.4",
3
+ "version": "2.0.5",
4
4
  "description": "Protocol-agnostic client/server execution core with pluggable protocols, transports and client policies",
5
5
  "keywords": [
6
6
  "browser",
@@ -1 +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;AAiCjG;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,cAAc,EAGnD,CAAC;AAIH;;;;;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;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/protocols/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EACb,aAAa,EACb,WAAW,EACX,cAAc,EACf,MAAM,iBAAiB,CAAC;AAkCzB;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,cAAc,EAGnD,CAAC;AAIH;;;;;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;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
@@ -1,2 +1,2 @@
1
- "use strict";import{HyperClientError as a}from"../utils/errors.js";import{dynamicImport as d,isModuleNotFoundError as g}from"../utils/modules.js";import{RestProtocol as h}from"./rest/index.js";const n=[{protocol:"graphql",pkg:"@hyperttp/protocol-graphql",export:"GraphQLProtocol"},{protocol:"grpc",pkg:"@hyperttp/protocol-grpc",export:"GrpcProtocol"},{protocol:"trpc",pkg:"@hyperttp/protocol-trpc",export:"TrpcProtocol"},{protocol:"ws",pkg:"@hyperttp/protocol-websocket",export:"WebSocketProtocol"},{protocol:"websocket",pkg:"@hyperttp/protocol-websocket",export:"WebSocketProtocol"},{protocol:"sse",pkg:"@hyperttp/protocol-sse",export:"SseProtocol"},{protocol:"mqtt",pkg:"@hyperttp/protocol-mqtt",export:"MqttProtocol"}];export const KNOWN_PROTOCOLS=Object.freeze(["rest",...n.map(o=>o.protocol)]);const s=new Map;export async function resolveProtocol(o,r){const t=s.get(o);if(t)return t;if(o==="rest")return s.set(o,h),h;for(let e=0;e<n.length;e++){const l=n[e];if(l.protocol===o)try{const c=await d(l.pkg),i=c[l.export]??c.default,p=typeof i=="function"?new i(r):i;if(!p||typeof p.protocol!="string")continue;return s.set(o,p),p}catch(c){if(!g(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(){s.clear()}
1
+ "use strict";import{HyperClientError as a}from"../utils/errors.js";import{dynamicImport as g,isModuleNotFoundError as d}from"../utils/modules.js";import{RestProtocol as h}from"./rest/index.js";const n=[{protocol:"graphql",pkg:"@hyperttp/protocol-graphql",export:"GraphQLProtocol"},{protocol:"grpc",pkg:"@hyperttp/protocol-grpc",export:"GrpcProtocol"},{protocol:"trpc",pkg:"@hyperttp/protocol-trpc",export:"TrpcProtocol"},{protocol:"ws",pkg:"@hyperttp/protocol-websocket",export:"WebSocketProtocol"},{protocol:"websocket",pkg:"@hyperttp/protocol-websocket",export:"WebSocketProtocol"},{protocol:"sse",pkg:"@hyperttp/protocol-sse",export:"SseProtocol"},{protocol:"mqtt",pkg:"@hyperttp/protocol-mqtt",export:"MqttProtocol"},{protocol:"webrtc",pkg:"@hyperttp/protocol-webrtc",export:"WebRtcProtocol"}];export const KNOWN_PROTOCOLS=Object.freeze(["rest",...n.map(o=>o.protocol)]);const l=new Map;export async function resolveProtocol(o,r){const t=l.get(o);if(t)return t;if(o==="rest")return l.set(o,h),h;for(let e=0;e<n.length;e++){const s=n[e];if(s.protocol===o)try{const c=await g(s.pkg),i=c[s.export]??c.default,p=typeof i=="function"?new i(r):i;if(!p||typeof p.protocol!="string")continue;return l.set(o,p),p}catch(c){if(!d(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(){l.clear()}
2
2
  //# sourceMappingURL=manager.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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 { dynamicImport, isModuleNotFoundError } from \"../utils/modules.js\";\nimport { RestProtocol } from \"./rest/index.js\";\n\ntype ProtocolDef = {\n readonly protocol: SenderProtocol;\n readonly pkg: string;\n readonly export: string;\n};\n\nconst PROTOCOL_DEFS: readonly ProtocolDef[] = [\n {\n protocol: \"graphql\",\n pkg: \"@hyperttp/protocol-graphql\",\n export: \"GraphQLProtocol\",\n },\n { protocol: \"grpc\", pkg: \"@hyperttp/protocol-grpc\", export: \"GrpcProtocol\" },\n { protocol: \"trpc\", pkg: \"@hyperttp/protocol-trpc\", export: \"TrpcProtocol\" },\n {\n protocol: \"ws\",\n pkg: \"@hyperttp/protocol-websocket\",\n export: \"WebSocketProtocol\",\n },\n {\n protocol: \"websocket\",\n pkg: \"@hyperttp/protocol-websocket\",\n export: \"WebSocketProtocol\",\n },\n { protocol: \"sse\", pkg: \"@hyperttp/protocol-sse\", export: \"SseProtocol\" },\n { protocol: \"mqtt\", pkg: \"@hyperttp/protocol-mqtt\", export: \"MqttProtocol\" },\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\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\n/**\n * @ru Очищает кэш загруженных модулей протоколов. Не выгружает уже импортированные\n * JavaScript-модули из runtime.\n * @en Clears the loaded protocol-module cache. It does not unload JavaScript\n * modules already imported by the runtime.\n */\nexport function resetCachedProtocols(): void {\n protocolCache.clear();\n}\n"],
5
- "mappings": "aACA,OAAS,oBAAAA,MAAwB,qBACjC,OAAS,iBAAAC,EAAe,yBAAAC,MAA6B,sBACrD,OAAS,gBAAAC,MAAoB,kBAQ7B,MAAMC,EAAwC,CAC5C,CACE,SAAU,UACV,IAAK,6BACL,OAAQ,mBAEV,CAAE,SAAU,OAAQ,IAAK,0BAA2B,OAAQ,cAAc,EAC1E,CAAE,SAAU,OAAQ,IAAK,0BAA2B,OAAQ,cAAc,EAC1E,CACE,SAAU,KACV,IAAK,+BACL,OAAQ,qBAEV,CACE,SAAU,YACV,IAAK,+BACL,OAAQ,qBAEV,CAAE,SAAU,MAAO,IAAK,yBAA0B,OAAQ,aAAa,EACvE,CAAE,SAAU,OAAQ,IAAK,0BAA2B,OAAQ,cAAc,GAOrE,aAAM,gBAA6C,OAAO,OAAO,CACtE,OACA,GAAGA,EAAc,IAAKC,GAAMA,EAAE,QAAQ,EACvC,EAED,MAAMC,EAAgB,IAAI,IAQ1B,sBAAsB,gBACpBC,EACAC,EAAoC,CAEpC,MAAMC,EAASH,EAAc,IAAIC,CAAQ,EACzC,GAAIE,EACF,OAAOA,EAGT,GAAIF,IAAa,OACf,OAAAD,EAAc,IAAIC,EAAUJ,CAAY,EACjCA,EAGT,QAASO,EAAI,EAAGA,EAAIN,EAAc,OAAQM,IAAK,CAC7C,MAAMC,EAAMP,EAAcM,CAAC,EAC3B,GAAIC,EAAI,WAAaJ,EAErB,GAAI,CACF,MAAMK,EAAM,MAAMX,EAAcU,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,OAAAR,EAAc,IAAIC,EAAUO,CAAQ,EAC7BA,CACT,OAASC,EAAK,CACZ,GAAI,CAACb,EAAsBa,CAAG,EAAG,MAAMA,CACzC,CACF,CAEA,MAAMC,EAASZ,EAAc,KAAMC,GAAMA,EAAE,WAAaE,CAAQ,EAC1DU,EAAOD,EAAS,+BAA+BA,EAAO,GAAG,KAAO,GAEtE,MAAM,IAAIhB,EAAiB,0CAA0CO,CAAQ,KAAKU,CAAI,EAAE,CAC1F,CAMA,sBAAsB,cACpBV,EACAC,EAAoC,CAEpC,MAAMU,EAAW,MAAM,gBAAgBX,EAAUC,CAAO,EACxD,GAAI,CAACU,EAAS,OACZ,MAAM,IAAIlB,EAAiB,yBAAyBO,CAAQ,gCAAgC,EAE9F,OAAOW,EAAS,MAClB,CAMA,sBAAsB,gBACpBX,EACAC,EAAoC,CAEpC,MAAMU,EAAW,MAAM,gBAAgBX,EAAUC,CAAO,EACxD,GAAI,CAACU,EAAS,SACZ,MAAM,IAAIlB,EAAiB,yBAAyBO,CAAQ,kCAAkC,EAEhG,OAAOW,EAAS,QAClB,CAQM,gBAAU,sBAAoB,CAClCZ,EAAc,MAAK,CACrB",
4
+ "sourcesContent": ["import type {\n AnyHyperProtocol,\n HyperProtocol,\n HyperReceiver,\n HyperSender,\n SenderProtocol,\n} from \"@hyperttp/types\";\nimport { HyperClientError } from \"../utils/errors.js\";\nimport { dynamicImport, isModuleNotFoundError } from \"../utils/modules.js\";\nimport { RestProtocol } from \"./rest/index.js\";\n\ntype ProtocolDef = {\n readonly protocol: SenderProtocol;\n readonly pkg: string;\n readonly export: string;\n};\n\nconst PROTOCOL_DEFS: readonly ProtocolDef[] = [\n {\n protocol: \"graphql\",\n pkg: \"@hyperttp/protocol-graphql\",\n export: \"GraphQLProtocol\",\n },\n { protocol: \"grpc\", pkg: \"@hyperttp/protocol-grpc\", export: \"GrpcProtocol\" },\n { protocol: \"trpc\", pkg: \"@hyperttp/protocol-trpc\", export: \"TrpcProtocol\" },\n {\n protocol: \"ws\",\n pkg: \"@hyperttp/protocol-websocket\",\n export: \"WebSocketProtocol\",\n },\n {\n protocol: \"websocket\",\n pkg: \"@hyperttp/protocol-websocket\",\n export: \"WebSocketProtocol\",\n },\n { protocol: \"sse\", pkg: \"@hyperttp/protocol-sse\", export: \"SseProtocol\" },\n { protocol: \"mqtt\", pkg: \"@hyperttp/protocol-mqtt\", export: \"MqttProtocol\" },\n { protocol: \"webrtc\", pkg: \"@hyperttp/protocol-webrtc\", export: \"WebRtcProtocol\" },\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, AnyHyperProtocol>();\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 AnyHyperProtocol<P>;\n }\n\n if (protocol === \"rest\") {\n protocolCache.set(protocol, RestProtocol);\n return RestProtocol as AnyHyperProtocol<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): AnyHyperProtocol }\n | AnyHyperProtocol\n | undefined;\n const instance =\n typeof candidate === \"function\" ? new candidate(options) : (candidate as AnyHyperProtocol);\n\n if (!instance || typeof instance.protocol !== \"string\") continue;\n\n protocolCache.set(protocol, instance);\n return instance as AnyHyperProtocol<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\n/**\n * @ru Очищает кэш загруженных модулей протоколов. Не выгружает уже импортированные\n * JavaScript-модули из runtime.\n * @en Clears the loaded protocol-module cache. It does not unload JavaScript\n * modules already imported by the runtime.\n */\nexport function resetCachedProtocols(): void {\n protocolCache.clear();\n}\n"],
5
+ "mappings": "aAOA,OAAS,oBAAAA,MAAwB,qBACjC,OAAS,iBAAAC,EAAe,yBAAAC,MAA6B,sBACrD,OAAS,gBAAAC,MAAoB,kBAQ7B,MAAMC,EAAwC,CAC5C,CACE,SAAU,UACV,IAAK,6BACL,OAAQ,mBAEV,CAAE,SAAU,OAAQ,IAAK,0BAA2B,OAAQ,cAAc,EAC1E,CAAE,SAAU,OAAQ,IAAK,0BAA2B,OAAQ,cAAc,EAC1E,CACE,SAAU,KACV,IAAK,+BACL,OAAQ,qBAEV,CACE,SAAU,YACV,IAAK,+BACL,OAAQ,qBAEV,CAAE,SAAU,MAAO,IAAK,yBAA0B,OAAQ,aAAa,EACvE,CAAE,SAAU,OAAQ,IAAK,0BAA2B,OAAQ,cAAc,EAC1E,CAAE,SAAU,SAAU,IAAK,4BAA6B,OAAQ,gBAAgB,GAO3E,aAAM,gBAA6C,OAAO,OAAO,CACtE,OACA,GAAGA,EAAc,IAAKC,GAAMA,EAAE,QAAQ,EACvC,EAED,MAAMC,EAAgB,IAAI,IAQ1B,sBAAsB,gBACpBC,EACAC,EAAoC,CAEpC,MAAMC,EAASH,EAAc,IAAIC,CAAQ,EACzC,GAAIE,EACF,OAAOA,EAGT,GAAIF,IAAa,OACf,OAAAD,EAAc,IAAIC,EAAUJ,CAAY,EACjCA,EAGT,QAASO,EAAI,EAAGA,EAAIN,EAAc,OAAQM,IAAK,CAC7C,MAAMC,EAAMP,EAAcM,CAAC,EAC3B,GAAIC,EAAI,WAAaJ,EAErB,GAAI,CACF,MAAMK,EAAM,MAAMX,EAAcU,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,OAAAR,EAAc,IAAIC,EAAUO,CAAQ,EAC7BA,CACT,OAASC,EAAK,CACZ,GAAI,CAACb,EAAsBa,CAAG,EAAG,MAAMA,CACzC,CACF,CAEA,MAAMC,EAASZ,EAAc,KAAMC,GAAMA,EAAE,WAAaE,CAAQ,EAC1DU,EAAOD,EAAS,+BAA+BA,EAAO,GAAG,KAAO,GAEtE,MAAM,IAAIhB,EAAiB,0CAA0CO,CAAQ,KAAKU,CAAI,EAAE,CAC1F,CAMA,sBAAsB,cACpBV,EACAC,EAAoC,CAEpC,MAAMU,EAAW,MAAM,gBAAgBX,EAAUC,CAAO,EACxD,GAAI,CAACU,EAAS,OACZ,MAAM,IAAIlB,EAAiB,yBAAyBO,CAAQ,gCAAgC,EAE9F,OAAOW,EAAS,MAClB,CAMA,sBAAsB,gBACpBX,EACAC,EAAoC,CAEpC,MAAMU,EAAW,MAAM,gBAAgBX,EAAUC,CAAO,EACxD,GAAI,CAACU,EAAS,SACZ,MAAM,IAAIlB,EAAiB,yBAAyBO,CAAQ,kCAAkC,EAEhG,OAAOW,EAAS,QAClB,CAQM,gBAAU,sBAAoB,CAClCZ,EAAc,MAAK,CACrB",
6
6
  "names": ["HyperClientError", "dynamicImport", "isModuleNotFoundError", "RestProtocol", "PROTOCOL_DEFS", "d", "protocolCache", "protocol", "options", "cached", "i", "def", "mod", "candidate", "instance", "err", "pkgDef", "hint", "resolved"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/transports/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOhF,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,EAAE,OAK1B,CAAC;AAgGL;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,GAAE,cAAuB,EACjC,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,cAAc,CAAC,CAkCzB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,cAAuB,GAAG,cAAc,GAAG,SAAS,CAEhG;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/transports/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOhF,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,EAAE,OAK1B,CAAC;AA8IL;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,GAAE,cAAuB,EACjC,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,cAAc,CAAC,CAkCzB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,cAAuB,GAAG,cAAc,GAAG,SAAS,CAEhG;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C"}
@@ -1,2 +1,2 @@
1
- "use strict";import{FetchTransport as h}from"./fetch.js";import{dynamicImport as T,isModuleNotFoundError as m}from"../utils/modules.js";export const CURRENT_RUNTIME=typeof Bun<"u"?"bun":typeof Deno<"u"?"deno":typeof process<"u"&&process.versions?.node?"node":"browser";const w=[{runtime:["bun"],pkg:"@hyperttp/transport-bun",export:"BunTransport"},{runtime:["node"],pkg:"@hyperttp/transport-undici",export:"UndiciTransport"},{runtime:["deno"],pkg:"@hyperttp/transport-deno",export:"DenoTransport"}],f=w.filter(t=>t.runtime.includes(CURRENT_RUNTIME)),i=new Map,p=new Map;function C(t,e=!1){return e?`${t}:listen`:t}function d(t){return typeof t.listen=="function"}function c(t,e){return typeof t.supports=="function"?t.supports(e):t.protocols?.includes(e)??!0}async function l(t){try{typeof t.destroy=="function"?await t.destroy():typeof t.close=="function"&&await t.close()}catch{}}async function y(t,e){const r=new h(e);if(c(r,t))return r;throw await l(r),new Error(`[HyperCore] No transport available for protocol "${t}" in runtime "${CURRENT_RUNTIME}".`)}async function x(t,e){for(let n=0;n<f.length;n++){const a=f[n];try{const s=await T(a.pkg),u=s[a.export]??s.default;if(typeof u!="function")continue;const o=new u(e??{});if(!c(o,t)||e?.requireListen&&!d(o)){await l(o);continue}return o}catch(s){if(!m(s))throw s}}const r=`[HyperCore] Fast transport (e.g. @hyperttp/transport-undici) unavailable or missing listen() for runtime "${CURRENT_RUNTIME}". Falling back to slow FetchTransport.`;return e?.logger?e.logger("warn",r):e?.verbose&&console.warn(r),y(t,e)}export async function resolveTransport(t="rest",e){const r=e?.requireListen??!1,n=C(t,r);if(e?.customTransport){if(!c(e.customTransport,t))throw new Error(`[HyperCore] Custom transport does not support protocol "${t}".`);const o=r&&!d(e.customTransport)?await y(t,e):e.customTransport;return i.set(n,o),o}const a=i.get(n);if(a)return a;const s=p.get(n);if(s)return s;const u=x(t,e).then(o=>(i.set(n,o),o)).finally(()=>{p.delete(n)});return p.set(n,u),u}export function getCachedTransport(t="rest"){return i.get(t)}export function evictCachedTransport(t){for(const[e,r]of i)r===t&&i.delete(e)}export function resetCachedTransport(){i.clear(),p.clear()}
1
+ "use strict";import{FetchTransport as m}from"./fetch.js";import{dynamicImport as w,isModuleNotFoundError as T}from"../utils/modules.js";export const CURRENT_RUNTIME=typeof Bun<"u"?"bun":typeof Deno<"u"?"deno":typeof process<"u"&&process.versions?.node?"node":"browser";const u=["bun","node","deno","browser"],b=[{protocols:["webrtc"],runtime:u,pkg:"@hyperttp/transport-webrtc",export:"WebRtcTransport"},{protocols:["ws","websocket"],runtime:u,pkg:"@hyperttp/transport-websocket",export:"WebSocketTransport"},{protocols:["mqtt"],runtime:u,pkg:"@hyperttp/transport-mqtt",export:"MqttTransport"},{runtime:["bun"],pkg:"@hyperttp/transport-bun",export:"BunTransport"},{runtime:["node"],pkg:"@hyperttp/transport-undici",export:"UndiciTransport"},{runtime:["deno"],pkg:"@hyperttp/transport-deno",export:"DenoTransport"}];function d(t){return b.filter(e=>e.runtime.includes(CURRENT_RUNTIME)&&(!e.protocols||e.protocols.includes(t)))}function g(t){const e=new Set(d(t).filter(r=>r.protocols?.includes(t)).map(r=>r.pkg));return e.size===0?"":` Install ${[...e].map(r=>`"${r}"`).join(" or ")}.`}const i=new Map,c=new Map;function k(t,e=!1){return e?`${t}:listen`:t}function l(t){return typeof t.listen=="function"}function f(t,e){return typeof t.supports=="function"?t.supports(e):t.protocols?.includes(e)??!0}async function y(t){try{typeof t.destroy=="function"?await t.destroy():typeof t.close=="function"&&await t.close()}catch{}}async function h(t,e){const r=new m(e);if(f(r,t))return r;throw await y(r),new Error(`[HyperCore] No transport available for protocol "${t}" in runtime "${CURRENT_RUNTIME}".`)}async function x(t,e){const r=d(t);for(let n=0;n<r.length;n++){const s=r[n];try{const a=await w(s.pkg),p=a[s.export]??a.default;if(typeof p!="function")continue;const o=new p(e??{});if(!f(o,t)||e?.requireListen&&!l(o)){await y(o);continue}return o}catch(a){if(!T(a))throw a}}try{const n=await h(t,e),s=`[HyperCore] Packaged transport unavailable or missing listen() for protocol "${t}" in runtime "${CURRENT_RUNTIME}". Falling back to FetchTransport.`;return e?.logger?e.logger("warn",s):e?.verbose&&console.warn(s),n}catch{throw new Error(`[HyperCore] No transport available for protocol "${t}" in runtime "${CURRENT_RUNTIME}".${g(t)}`)}}export async function resolveTransport(t="rest",e){const r=e?.requireListen??!1,n=k(t,r);if(e?.customTransport){if(!f(e.customTransport,t))throw new Error(`[HyperCore] Custom transport does not support protocol "${t}".`);const o=r&&!l(e.customTransport)?await h(t,e):e.customTransport;return i.set(n,o),o}const s=i.get(n);if(s)return s;const a=c.get(n);if(a)return a;const p=x(t,e).then(o=>(i.set(n,o),o)).finally(()=>{c.delete(n)});return c.set(n,p),p}export function getCachedTransport(t="rest"){return i.get(t)}export function evictCachedTransport(t){for(const[e,r]of i)r===t&&i.delete(e)}export function resetCachedTransport(){i.clear(),c.clear()}
2
2
  //# sourceMappingURL=manager.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/transports/manager.ts"],
4
- "sourcesContent": ["import type { HyperTransport, LogLevel, SenderProtocol } from \"@hyperttp/types\";\nimport { FetchTransport, type FetchTransportOptions } from \"./fetch.js\";\nimport { dynamicImport, isModuleNotFoundError } from \"../utils/modules.js\";\n\ndeclare const Bun: unknown;\ndeclare const Deno: unknown;\n\nexport type Runtime = \"bun\" | \"node\" | \"deno\" | \"browser\";\n\n/**\n * @ru Опции разрешения транспорта. `customTransport` имеет приоритет над автовыбором.\n * @en Transport resolution options. `customTransport` takes priority over auto-selection.\n */\nexport interface ResolveTransportOptions {\n customTransport?: HyperTransport;\n /**\n * @ru Требует серверную роль транспорта. При её отсутствии используется\n * встроенный `FetchTransport`.\n * @en Requires the transport server role. When unavailable, the built-in\n * `FetchTransport` is used.\n */\n requireListen?: boolean;\n logger?: (level: LogLevel, message: string, meta?: unknown) => void;\n verbose?: boolean;\n [key: string]: unknown;\n}\n\nexport const CURRENT_RUNTIME: Runtime = (() => {\n if (typeof Bun !== \"undefined\") return \"bun\";\n if (typeof Deno !== \"undefined\") return \"deno\";\n if (typeof process !== \"undefined\" && process.versions?.node) return \"node\";\n return \"browser\";\n})();\n\ntype TransportDef = {\n readonly runtime: readonly Runtime[];\n readonly pkg: string;\n readonly export: string;\n};\n\nconst TRANSPORT_DEFS: readonly TransportDef[] = [\n { runtime: [\"bun\"], pkg: \"@hyperttp/transport-bun\", export: \"BunTransport\" },\n { runtime: [\"node\"], pkg: \"@hyperttp/transport-undici\", export: \"UndiciTransport\" },\n { runtime: [\"deno\"], pkg: \"@hyperttp/transport-deno\", export: \"DenoTransport\" },\n];\n\nconst CANDIDATES = TRANSPORT_DEFS.filter((t) => t.runtime.includes(CURRENT_RUNTIME));\n\nconst transportCache = new Map<string, HyperTransport>();\nconst transportResolutions = new Map<string, Promise<HyperTransport>>();\n\nfunction getCacheKey(protocol: SenderProtocol, requireListen = false): string {\n return requireListen ? `${protocol}:listen` : protocol;\n}\n\nfunction supportsListen(transport: HyperTransport): boolean {\n return typeof transport.listen === \"function\";\n}\n\nfunction supportsProtocol(transport: HyperTransport, protocol: SenderProtocol): boolean {\n return typeof transport.supports === \"function\"\n ? transport.supports(protocol)\n : (transport.protocols?.includes(protocol) ?? true);\n}\n\nasync function disposeUnusedTransport(transport: HyperTransport): Promise<void> {\n try {\n if (typeof transport.destroy === \"function\") {\n await transport.destroy();\n } else if (typeof transport.close === \"function\") {\n await transport.close();\n }\n } catch {\n //\n }\n}\n\nasync function createFetchTransport(\n protocol: SenderProtocol,\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n const fetchTransport = new FetchTransport(config as unknown as FetchTransportOptions);\n if (supportsProtocol(fetchTransport, protocol)) return fetchTransport;\n\n await disposeUnusedTransport(fetchTransport);\n throw new Error(\n `[HyperCore] No transport available for protocol \"${protocol}\" in runtime \"${CURRENT_RUNTIME}\".`,\n );\n}\n\nasync function createTransport(\n protocol: SenderProtocol,\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n for (let i = 0; i < CANDIDATES.length; i++) {\n const t = CANDIDATES[i]!;\n try {\n const mod = await dynamicImport(t.pkg);\n const candidate = (mod[t.export] ?? mod.default) as\n | { new (opts?: unknown): HyperTransport }\n | undefined;\n if (typeof candidate !== \"function\") continue;\n\n const instance = new candidate(config ?? {});\n if (\n !supportsProtocol(instance, protocol) ||\n (config?.requireListen && !supportsListen(instance))\n ) {\n await disposeUnusedTransport(instance);\n continue;\n }\n\n return instance;\n } catch (err) {\n if (!isModuleNotFoundError(err)) throw err;\n }\n }\n\n const message = `[HyperCore] Fast transport (e.g. @hyperttp/transport-undici) unavailable or missing listen() for runtime \"${CURRENT_RUNTIME}\". Falling back to slow FetchTransport.`;\n if (config?.logger) {\n config.logger(\"warn\", message);\n } else if (config?.verbose) {\n console.warn(message);\n }\n\n return createFetchTransport(protocol, config);\n}\n\n/**\n * @ru Разрешает оптимальный транспорт для указанного протокола и текущей среды.\n * Кастомный транспорт из конфигурации имеет приоритет над автовыбором.\n * @en Resolves optimal transport for the given protocol and current runtime.\n * A custom transport from the config takes priority over auto-selection.\n */\nexport async function resolveTransport(\n protocol: SenderProtocol = \"rest\",\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n const requireListen = config?.requireListen ?? false;\n const cacheKey = getCacheKey(protocol, requireListen);\n\n if (config?.customTransport) {\n if (!supportsProtocol(config.customTransport, protocol)) {\n throw new Error(`[HyperCore] Custom transport does not support protocol \"${protocol}\".`);\n }\n\n const transport =\n requireListen && !supportsListen(config.customTransport)\n ? await createFetchTransport(protocol, config)\n : config.customTransport;\n transportCache.set(cacheKey, transport);\n return transport;\n }\n\n const cached = transportCache.get(cacheKey);\n if (cached) return cached;\n\n const pending = transportResolutions.get(cacheKey);\n if (pending) return pending;\n\n const resolution = createTransport(protocol, config)\n .then((transport) => {\n transportCache.set(cacheKey, transport);\n return transport;\n })\n .finally(() => {\n transportResolutions.delete(cacheKey);\n });\n\n transportResolutions.set(cacheKey, resolution);\n return resolution;\n}\n\n/**\n * @ru Синхронно возвращает транспорт из кэша без создания Promise.\n * @en Synchronously returns a cached transport without creating a Promise.\n * @param protocol - Протокол, для которого запрашивается транспорт. @en Protocol whose transport is requested.\n * @returns Кэшированный транспорт или `undefined`. @en Cached transport or `undefined`.\n */\nexport function getCachedTransport(protocol: SenderProtocol = \"rest\"): HyperTransport | undefined {\n return transportCache.get(protocol);\n}\n\n/**\n * @ru Удаляет все записи кэша, ссылающиеся на указанный транспорт.\n * @en Removes every cache entry that references the given transport.\n * @param transport - Экземпляр транспорта для удаления из кэша. @en Transport instance to evict from the cache.\n */\nexport function evictCachedTransport(transport: HyperTransport): void {\n for (const [protocol, cached] of transportCache) {\n if (cached === transport) {\n transportCache.delete(protocol);\n }\n }\n}\n\n/**\n * @ru Очищает кэш транспортов и ожидающих их разрешений. Не закрывает уже\n * созданные экземпляры транспорта.\n * @en Clears cached transports and pending resolutions. It does not close\n * already-created transport instances.\n */\nexport function resetCachedTransport(): void {\n transportCache.clear();\n transportResolutions.clear();\n}\n"],
5
- "mappings": "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",
6
- "names": ["FetchTransport", "dynamicImport", "isModuleNotFoundError", "TRANSPORT_DEFS", "CANDIDATES", "transportCache", "transportResolutions", "getCacheKey", "protocol", "requireListen", "supportsListen", "transport", "supportsProtocol", "disposeUnusedTransport", "createFetchTransport", "config", "fetchTransport", "createTransport", "i", "t", "mod", "candidate", "instance", "err", "message", "cacheKey", "cached", "pending", "resolution"]
4
+ "sourcesContent": ["import type { HyperTransport, LogLevel, SenderProtocol } from \"@hyperttp/types\";\nimport { FetchTransport, type FetchTransportOptions } from \"./fetch.js\";\nimport { dynamicImport, isModuleNotFoundError } from \"../utils/modules.js\";\n\ndeclare const Bun: unknown;\ndeclare const Deno: unknown;\n\nexport type Runtime = \"bun\" | \"node\" | \"deno\" | \"browser\";\n\n/**\n * @ru Опции разрешения транспорта. `customTransport` имеет приоритет над автовыбором.\n * @en Transport resolution options. `customTransport` takes priority over auto-selection.\n */\nexport interface ResolveTransportOptions {\n customTransport?: HyperTransport;\n /**\n * @ru Требует серверную роль транспорта. При её отсутствии используется\n * встроенный `FetchTransport`.\n * @en Requires the transport server role. When unavailable, the built-in\n * `FetchTransport` is used.\n */\n requireListen?: boolean;\n logger?: (level: LogLevel, message: string, meta?: unknown) => void;\n verbose?: boolean;\n [key: string]: unknown;\n}\n\nexport const CURRENT_RUNTIME: Runtime = (() => {\n if (typeof Bun !== \"undefined\") return \"bun\";\n if (typeof Deno !== \"undefined\") return \"deno\";\n if (typeof process !== \"undefined\" && process.versions?.node) return \"node\";\n return \"browser\";\n})();\n\ntype TransportDef = {\n readonly runtime: readonly Runtime[];\n readonly pkg: string;\n readonly export: string;\n /** Protocols that require this transport family. Omitted for generic transports. */\n readonly protocols?: readonly SenderProtocol[];\n};\n\nconst ALL_RUNTIMES: readonly Runtime[] = [\"bun\", \"node\", \"deno\", \"browser\"];\n\nconst TRANSPORT_DEFS: readonly TransportDef[] = [\n {\n protocols: [\"webrtc\"],\n runtime: ALL_RUNTIMES,\n pkg: \"@hyperttp/transport-webrtc\",\n export: \"WebRtcTransport\",\n },\n {\n protocols: [\"ws\", \"websocket\"],\n runtime: ALL_RUNTIMES,\n pkg: \"@hyperttp/transport-websocket\",\n export: \"WebSocketTransport\",\n },\n {\n protocols: [\"mqtt\"],\n runtime: ALL_RUNTIMES,\n pkg: \"@hyperttp/transport-mqtt\",\n export: \"MqttTransport\",\n },\n { runtime: [\"bun\"], pkg: \"@hyperttp/transport-bun\", export: \"BunTransport\" },\n { runtime: [\"node\"], pkg: \"@hyperttp/transport-undici\", export: \"UndiciTransport\" },\n { runtime: [\"deno\"], pkg: \"@hyperttp/transport-deno\", export: \"DenoTransport\" },\n];\n\nfunction getCandidates(protocol: SenderProtocol): readonly TransportDef[] {\n return TRANSPORT_DEFS.filter(\n (transport) =>\n transport.runtime.includes(CURRENT_RUNTIME) &&\n (!transport.protocols || transport.protocols.includes(protocol)),\n );\n}\n\nfunction getTransportInstallHint(protocol: SenderProtocol): string {\n const packages = new Set(\n getCandidates(protocol)\n .filter((transport) => transport.protocols?.includes(protocol))\n .map((transport) => transport.pkg),\n );\n if (packages.size === 0) return \"\";\n\n return ` Install ${[...packages].map((pkg) => `\"${pkg}\"`).join(\" or \")}.`;\n}\n\nconst transportCache = new Map<string, HyperTransport>();\nconst transportResolutions = new Map<string, Promise<HyperTransport>>();\n\nfunction getCacheKey(protocol: SenderProtocol, requireListen = false): string {\n return requireListen ? `${protocol}:listen` : protocol;\n}\n\nfunction supportsListen(transport: HyperTransport): boolean {\n return typeof transport.listen === \"function\";\n}\n\nfunction supportsProtocol(transport: HyperTransport, protocol: SenderProtocol): boolean {\n return typeof transport.supports === \"function\"\n ? transport.supports(protocol)\n : (transport.protocols?.includes(protocol) ?? true);\n}\n\nasync function disposeUnusedTransport(transport: HyperTransport): Promise<void> {\n try {\n if (typeof transport.destroy === \"function\") {\n await transport.destroy();\n } else if (typeof transport.close === \"function\") {\n await transport.close();\n }\n } catch {\n //\n }\n}\n\nasync function createFetchTransport(\n protocol: SenderProtocol,\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n const fetchTransport = new FetchTransport(config as unknown as FetchTransportOptions);\n if (supportsProtocol(fetchTransport, protocol)) return fetchTransport;\n\n await disposeUnusedTransport(fetchTransport);\n throw new Error(\n `[HyperCore] No transport available for protocol \"${protocol}\" in runtime \"${CURRENT_RUNTIME}\".`,\n );\n}\n\nasync function createTransport(\n protocol: SenderProtocol,\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n const candidates = getCandidates(protocol);\n for (let i = 0; i < candidates.length; i++) {\n const t = candidates[i]!;\n try {\n const mod = await dynamicImport(t.pkg);\n const candidate = (mod[t.export] ?? mod.default) as\n | { new (opts?: unknown): HyperTransport }\n | undefined;\n if (typeof candidate !== \"function\") continue;\n\n const instance = new candidate(config ?? {});\n if (\n !supportsProtocol(instance, protocol) ||\n (config?.requireListen && !supportsListen(instance))\n ) {\n await disposeUnusedTransport(instance);\n continue;\n }\n\n return instance;\n } catch (err) {\n if (!isModuleNotFoundError(err)) throw err;\n }\n }\n\n try {\n const fetchTransport = await createFetchTransport(protocol, config);\n const message = `[HyperCore] Packaged transport unavailable or missing listen() for protocol \"${protocol}\" in runtime \"${CURRENT_RUNTIME}\". Falling back to FetchTransport.`;\n if (config?.logger) {\n config.logger(\"warn\", message);\n } else if (config?.verbose) {\n console.warn(message);\n }\n return fetchTransport;\n } catch {\n throw new Error(\n `[HyperCore] No transport available for protocol \"${protocol}\" in runtime \"${CURRENT_RUNTIME}\".${getTransportInstallHint(protocol)}`,\n );\n }\n}\n\n/**\n * @ru Разрешает оптимальный транспорт для указанного протокола и текущей среды.\n * Кастомный транспорт из конфигурации имеет приоритет над автовыбором.\n * @en Resolves optimal transport for the given protocol and current runtime.\n * A custom transport from the config takes priority over auto-selection.\n */\nexport async function resolveTransport(\n protocol: SenderProtocol = \"rest\",\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n const requireListen = config?.requireListen ?? false;\n const cacheKey = getCacheKey(protocol, requireListen);\n\n if (config?.customTransport) {\n if (!supportsProtocol(config.customTransport, protocol)) {\n throw new Error(`[HyperCore] Custom transport does not support protocol \"${protocol}\".`);\n }\n\n const transport =\n requireListen && !supportsListen(config.customTransport)\n ? await createFetchTransport(protocol, config)\n : config.customTransport;\n transportCache.set(cacheKey, transport);\n return transport;\n }\n\n const cached = transportCache.get(cacheKey);\n if (cached) return cached;\n\n const pending = transportResolutions.get(cacheKey);\n if (pending) return pending;\n\n const resolution = createTransport(protocol, config)\n .then((transport) => {\n transportCache.set(cacheKey, transport);\n return transport;\n })\n .finally(() => {\n transportResolutions.delete(cacheKey);\n });\n\n transportResolutions.set(cacheKey, resolution);\n return resolution;\n}\n\n/**\n * @ru Синхронно возвращает транспорт из кэша без создания Promise.\n * @en Synchronously returns a cached transport without creating a Promise.\n * @param protocol - Протокол, для которого запрашивается транспорт. @en Protocol whose transport is requested.\n * @returns Кэшированный транспорт или `undefined`. @en Cached transport or `undefined`.\n */\nexport function getCachedTransport(protocol: SenderProtocol = \"rest\"): HyperTransport | undefined {\n return transportCache.get(protocol);\n}\n\n/**\n * @ru Удаляет все записи кэша, ссылающиеся на указанный транспорт.\n * @en Removes every cache entry that references the given transport.\n * @param transport - Экземпляр транспорта для удаления из кэша. @en Transport instance to evict from the cache.\n */\nexport function evictCachedTransport(transport: HyperTransport): void {\n for (const [protocol, cached] of transportCache) {\n if (cached === transport) {\n transportCache.delete(protocol);\n }\n }\n}\n\n/**\n * @ru Очищает кэш транспортов и ожидающих их разрешений. Не закрывает уже\n * созданные экземпляры транспорта.\n * @en Clears cached transports and pending resolutions. It does not close\n * already-created transport instances.\n */\nexport function resetCachedTransport(): void {\n transportCache.clear();\n transportResolutions.clear();\n}\n"],
5
+ "mappings": "aACA,OAAS,kBAAAA,MAAkD,aAC3D,OAAS,iBAAAC,EAAe,yBAAAC,MAA6B,sBAyB9C,aAAM,gBACP,OAAO,IAAQ,IAAoB,MACnC,OAAO,KAAS,IAAoB,OACpC,OAAO,QAAY,KAAe,QAAQ,UAAU,KAAa,OAC9D,UAWT,MAAMC,EAAmC,CAAC,MAAO,OAAQ,OAAQ,SAAS,EAEpEC,EAA0C,CAC9C,CACE,UAAW,CAAC,QAAQ,EACpB,QAASD,EACT,IAAK,6BACL,OAAQ,mBAEV,CACE,UAAW,CAAC,KAAM,WAAW,EAC7B,QAASA,EACT,IAAK,gCACL,OAAQ,sBAEV,CACE,UAAW,CAAC,MAAM,EAClB,QAASA,EACT,IAAK,2BACL,OAAQ,iBAEV,CAAE,QAAS,CAAC,KAAK,EAAG,IAAK,0BAA2B,OAAQ,cAAc,EAC1E,CAAE,QAAS,CAAC,MAAM,EAAG,IAAK,6BAA8B,OAAQ,iBAAiB,EACjF,CAAE,QAAS,CAAC,MAAM,EAAG,IAAK,2BAA4B,OAAQ,eAAe,GAG/E,SAASE,EAAcC,EAAwB,CAC7C,OAAOF,EAAe,OACnBG,GACCA,EAAU,QAAQ,SAAS,eAAe,IACzC,CAACA,EAAU,WAAaA,EAAU,UAAU,SAASD,CAAQ,EAAE,CAEtE,CAEA,SAASE,EAAwBF,EAAwB,CACvD,MAAMG,EAAW,IAAI,IACnBJ,EAAcC,CAAQ,EACnB,OAAQC,GAAcA,EAAU,WAAW,SAASD,CAAQ,CAAC,EAC7D,IAAKC,GAAcA,EAAU,GAAG,CAAC,EAEtC,OAAIE,EAAS,OAAS,EAAU,GAEzB,YAAY,CAAC,GAAGA,CAAQ,EAAE,IAAKC,GAAQ,IAAIA,CAAG,GAAG,EAAE,KAAK,MAAM,CAAC,GACxE,CAEA,MAAMC,EAAiB,IAAI,IACrBC,EAAuB,IAAI,IAEjC,SAASC,EAAYP,EAA0BQ,EAAgB,GAAK,CAClE,OAAOA,EAAgB,GAAGR,CAAQ,UAAYA,CAChD,CAEA,SAASS,EAAeR,EAAyB,CAC/C,OAAO,OAAOA,EAAU,QAAW,UACrC,CAEA,SAASS,EAAiBT,EAA2BD,EAAwB,CAC3E,OAAO,OAAOC,EAAU,UAAa,WACjCA,EAAU,SAASD,CAAQ,EAC1BC,EAAU,WAAW,SAASD,CAAQ,GAAK,EAClD,CAEA,eAAeW,EAAuBV,EAAyB,CAC7D,GAAI,CACE,OAAOA,EAAU,SAAY,WAC/B,MAAMA,EAAU,QAAO,EACd,OAAOA,EAAU,OAAU,YACpC,MAAMA,EAAU,MAAK,CAEzB,MAAQ,CAER,CACF,CAEA,eAAeW,EACbZ,EACAa,EAAgC,CAEhC,MAAMC,EAAiB,IAAIpB,EAAemB,CAA0C,EACpF,GAAIH,EAAiBI,EAAgBd,CAAQ,EAAG,OAAOc,EAEvD,YAAMH,EAAuBG,CAAc,EACrC,IAAI,MACR,oDAAoDd,CAAQ,iBAAiB,eAAe,IAAI,CAEpG,CAEA,eAAee,EACbf,EACAa,EAAgC,CAEhC,MAAMG,EAAajB,EAAcC,CAAQ,EACzC,QAASiB,EAAI,EAAGA,EAAID,EAAW,OAAQC,IAAK,CAC1C,MAAMC,EAAIF,EAAWC,CAAC,EACtB,GAAI,CACF,MAAME,EAAM,MAAMxB,EAAcuB,EAAE,GAAG,EAC/BE,EAAaD,EAAID,EAAE,MAAM,GAAKC,EAAI,QAGxC,GAAI,OAAOC,GAAc,WAAY,SAErC,MAAMC,EAAW,IAAID,EAAUP,GAAU,CAAA,CAAE,EAC3C,GACE,CAACH,EAAiBW,EAAUrB,CAAQ,GACnCa,GAAQ,eAAiB,CAACJ,EAAeY,CAAQ,EAClD,CACA,MAAMV,EAAuBU,CAAQ,EACrC,QACF,CAEA,OAAOA,CACT,OAASC,EAAK,CACZ,GAAI,CAAC1B,EAAsB0B,CAAG,EAAG,MAAMA,CACzC,CACF,CAEA,GAAI,CACF,MAAMR,EAAiB,MAAMF,EAAqBZ,EAAUa,CAAM,EAC5DU,EAAU,gFAAgFvB,CAAQ,iBAAiB,eAAe,qCACxI,OAAIa,GAAQ,OACVA,EAAO,OAAO,OAAQU,CAAO,EACpBV,GAAQ,SACjB,QAAQ,KAAKU,CAAO,EAEfT,CACT,MAAQ,CACN,MAAM,IAAI,MACR,oDAAoDd,CAAQ,iBAAiB,eAAe,KAAKE,EAAwBF,CAAQ,CAAC,EAAE,CAExI,CACF,CAQA,sBAAsB,iBACpBA,EAA2B,OAC3Ba,EAAgC,CAEhC,MAAML,EAAgBK,GAAQ,eAAiB,GACzCW,EAAWjB,EAAYP,EAAUQ,CAAa,EAEpD,GAAIK,GAAQ,gBAAiB,CAC3B,GAAI,CAACH,EAAiBG,EAAO,gBAAiBb,CAAQ,EACpD,MAAM,IAAI,MAAM,2DAA2DA,CAAQ,IAAI,EAGzF,MAAMC,EACJO,GAAiB,CAACC,EAAeI,EAAO,eAAe,EACnD,MAAMD,EAAqBZ,EAAUa,CAAM,EAC3CA,EAAO,gBACb,OAAAR,EAAe,IAAImB,EAAUvB,CAAS,EAC/BA,CACT,CAEA,MAAMwB,EAASpB,EAAe,IAAImB,CAAQ,EAC1C,GAAIC,EAAQ,OAAOA,EAEnB,MAAMC,EAAUpB,EAAqB,IAAIkB,CAAQ,EACjD,GAAIE,EAAS,OAAOA,EAEpB,MAAMC,EAAaZ,EAAgBf,EAAUa,CAAM,EAChD,KAAMZ,IACLI,EAAe,IAAImB,EAAUvB,CAAS,EAC/BA,EACR,EACA,QAAQ,IAAK,CACZK,EAAqB,OAAOkB,CAAQ,CACtC,CAAC,EAEH,OAAAlB,EAAqB,IAAIkB,EAAUG,CAAU,EACtCA,CACT,CAQM,gBAAU,mBAAmB3B,EAA2B,OAAM,CAClE,OAAOK,EAAe,IAAIL,CAAQ,CACpC,CAOM,gBAAU,qBAAqBC,EAAyB,CAC5D,SAAW,CAACD,EAAUyB,CAAM,IAAKpB,EAC3BoB,IAAWxB,GACbI,EAAe,OAAOL,CAAQ,CAGpC,CAQM,gBAAU,sBAAoB,CAClCK,EAAe,MAAK,EACpBC,EAAqB,MAAK,CAC5B",
6
+ "names": ["FetchTransport", "dynamicImport", "isModuleNotFoundError", "ALL_RUNTIMES", "TRANSPORT_DEFS", "getCandidates", "protocol", "transport", "getTransportInstallHint", "packages", "pkg", "transportCache", "transportResolutions", "getCacheKey", "requireListen", "supportsListen", "supportsProtocol", "disposeUnusedTransport", "createFetchTransport", "config", "fetchTransport", "createTransport", "candidates", "i", "t", "mod", "candidate", "instance", "err", "message", "cacheKey", "cached", "pending", "resolution"]
7
7
  }