@hyperttp/core 2.0.0 → 2.0.2
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 +13 -6
- package/Core/HyperCore.d.ts.map +1 -1
- package/Core/HyperCore.js +1 -1
- package/Core/HyperCore.js.map +3 -3
- package/README.md +3 -3
- package/defaultConfig.d.ts +0 -5
- package/defaultConfig.d.ts.map +1 -1
- package/defaultConfig.js +1 -1
- package/defaultConfig.js.map +2 -2
- package/package.json +3 -3
- package/protocols/manager.d.ts +6 -0
- package/protocols/manager.d.ts.map +1 -1
- package/protocols/manager.js +1 -1
- package/protocols/manager.js.map +3 -3
- package/protocols/rest/index.d.ts +2 -1
- package/protocols/rest/index.d.ts.map +1 -1
- package/protocols/rest/index.js.map +2 -2
- package/protocols/rest/receiver.d.ts +5 -0
- package/protocols/rest/receiver.d.ts.map +1 -1
- package/protocols/rest/receiver.js +1 -1
- package/protocols/rest/receiver.js.map +3 -3
- package/protocols/rest/sender.d.ts +0 -7
- package/protocols/rest/sender.d.ts.map +1 -1
- package/protocols/rest/sender.js +1 -1
- package/protocols/rest/sender.js.map +3 -3
- package/protocols/rest/type.d.ts +51 -9
- package/protocols/rest/type.d.ts.map +1 -1
- package/protocols/rest/utils.d.ts +3 -0
- package/protocols/rest/utils.d.ts.map +1 -0
- package/protocols/rest/utils.js +2 -0
- package/protocols/rest/utils.js.map +7 -0
- package/rest.d.ts +1 -1
- package/rest.d.ts.map +1 -1
- package/transports/fetch.d.ts +20 -1
- package/transports/fetch.d.ts.map +1 -1
- package/transports/fetch.js +1 -1
- package/transports/fetch.js.map +3 -3
- package/transports/manager.d.ts +18 -3
- package/transports/manager.d.ts.map +1 -1
- package/transports/manager.js +1 -1
- package/transports/manager.js.map +3 -3
- package/utils/errors.d.ts +12 -4
- package/utils/errors.d.ts.map +1 -1
- package/utils/errors.js.map +2 -2
- package/utils/modules.d.ts +3 -0
- package/utils/modules.d.ts.map +1 -0
- package/utils/modules.js +2 -0
- package/utils/modules.js.map +7 -0
package/Core/HyperCore.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { HyperClientOptions, HyperPlugin, HyperProtocol, HyperProtocols, HyperReceiver, HyperSender, HyperServerListenOptions, HyperTransport, IHyperCore, SenderProtocol, SendRequest, TransportServer, UniversalResponse } from "@hyperttp/types";
|
|
1
|
+
import type { AnyHyperSender, HyperClientOptions, HyperPlugin, HyperProtocol, HyperProtocols, HyperReceiver, HyperSender, HyperServerListenOptions, HyperTransport, IHyperCore, SenderProtocol, SendRequest, TransportServer, UniversalResponse } from "@hyperttp/types";
|
|
2
2
|
export interface HyperCore extends HyperProtocols {
|
|
3
3
|
}
|
|
4
4
|
/**
|
|
@@ -15,7 +15,7 @@ export declare class HyperCore implements IHyperCore {
|
|
|
15
15
|
readonly config: HyperClientOptions;
|
|
16
16
|
private readonly registry;
|
|
17
17
|
private readonly pluginCtx;
|
|
18
|
-
private
|
|
18
|
+
private plugins;
|
|
19
19
|
private readonly servers;
|
|
20
20
|
private readonly protocolNamespaces;
|
|
21
21
|
private readonly generatedFlatMethods;
|
|
@@ -93,7 +93,7 @@ export declare class HyperCore implements IHyperCore {
|
|
|
93
93
|
* @param sender - The protocol sender to register.
|
|
94
94
|
* @returns This instance for chaining.
|
|
95
95
|
*/
|
|
96
|
-
registerSender<P extends SenderProtocol>(sender:
|
|
96
|
+
registerSender<P extends SenderProtocol>(sender: AnyHyperSender<P>): this;
|
|
97
97
|
/**
|
|
98
98
|
* @ru Регистрирует ресивер протокола, оборачивая его в модуль протокола.
|
|
99
99
|
* Существующий сендер того же протокола сохраняется.
|
|
@@ -135,6 +135,7 @@ export declare class HyperCore implements IHyperCore {
|
|
|
135
135
|
private resolveRequestSender;
|
|
136
136
|
private runResponseHooks;
|
|
137
137
|
private reportBackgroundPluginError;
|
|
138
|
+
private log;
|
|
138
139
|
/**
|
|
139
140
|
* @ru Атомарно получает транспорт для конкретного протокола и удерживает
|
|
140
141
|
* каждый физический экземпляр ровно один раз за время жизни ядра.
|
|
@@ -171,6 +172,10 @@ export declare class HyperCore implements IHyperCore {
|
|
|
171
172
|
* @param plugin - The plugin instance to register.
|
|
172
173
|
* @returns This instance for chaining.
|
|
173
174
|
*/
|
|
175
|
+
/**
|
|
176
|
+
* Creates a core asynchronously and resolves plugin module paths before construction.
|
|
177
|
+
*/
|
|
178
|
+
static create(config?: Partial<HyperClientOptions>): Promise<HyperCore>;
|
|
174
179
|
use(plugin: HyperPlugin): this;
|
|
175
180
|
/**
|
|
176
181
|
* @ru Создаёт новый экземпляр ядра с расширенной/переопределённой конфигурацией,
|
|
@@ -194,10 +199,12 @@ export declare class HyperCore implements IHyperCore {
|
|
|
194
199
|
create(options: Partial<HyperClientOptions>): IHyperCore;
|
|
195
200
|
/**
|
|
196
201
|
* @ru Завершает работу ядра и освобождает ресурсы: закрывает активные серверы,
|
|
197
|
-
* затем освобождает удержание транспорта.
|
|
202
|
+
* затем освобождает удержание транспорта. Graceful-дренирование активных запросов
|
|
203
|
+
* определяется реализацией `TransportServer.close()`.
|
|
198
204
|
* @en Shuts down the core and releases resources: closes active servers, then
|
|
199
|
-
* releases the transport hold.
|
|
200
|
-
*
|
|
205
|
+
* releases the transport hold. Graceful draining of in-flight requests is defined
|
|
206
|
+
* by the `TransportServer.close()` implementation.
|
|
207
|
+
* @param graceful - If true, prefers `transport.close()`; otherwise prefers `transport.destroy()`.
|
|
201
208
|
* @returns Promise that resolves when shutdown is complete.
|
|
202
209
|
*/
|
|
203
210
|
destroy(graceful?: boolean): Promise<void>;
|
package/Core/HyperCore.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HyperCore.d.ts","sourceRoot":"","sources":["../../src/Core/HyperCore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,EACd,aAAa,EACb,WAAW,EACX,wBAAwB,EACxB,cAAc,EACd,UAAU,EAIV,cAAc,EACd,WAAW,EAIX,eAAe,EACf,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"HyperCore.d.ts","sourceRoot":"","sources":["../../src/Core/HyperCore.ts"],"names":[],"mappings":"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"}
|
package/Core/HyperCore.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";import{defaultCoreConfig as w}from"../defaultConfig.js";import{KNOWN_PROTOCOLS as m,resolveProtocol as
|
|
1
|
+
"use strict";import{dynamicImport as S}from"../utils/modules.js";import{defaultCoreConfig as w}from"../defaultConfig.js";import{KNOWN_PROTOCOLS as m,resolveProtocol as g}from"../protocols/manager.js";import{evictCachedTransport as b,resolveTransport as x}from"../transports/manager.js";import{HyperClientError as p}from"../utils/errors.js";let f=0,P=Date.now().toString(36)+"-";const v=Object.freeze({START:0,PREPARE:1,CONTROL:2,FORMAT:3,NETWORK:4,DATA:5});function q(){return f=f+1>>>0,f===0&&(P=Date.now().toString(36)+"-"),P+(f>>>0).toString(36)}const d=new WeakMap;function T(h){d.set(h,(d.get(h)??0)+1)}function N(h){const e=(d.get(h)??1)-1;return e<=0?d.delete(h):d.set(h,e),e}class R{requestId=q();startTime=performance.now();signal;requestMeta;requestState;constructor(e){this.signal=e}get meta(){return this.requestMeta??={}}set meta(e){this.requestMeta=e}get state(){return this.requestState??={}}set state(e){this.requestState=e}}function H(h){return new R(h.signal)}function O(h){return new R(h.signal)}function y(h){return typeof h=="object"&&h!==null&&"data"in h&&"status"in h&&!("input"in h)}class E{protocols=new Map;register(e){this.protocols.set(e.protocol,e)}get(e){return this.protocols.get(e)}has(e){return this.protocols.has(e)}get size(){return this.protocols.size}}export class HyperCore{config;registry=new E;pluginCtx;plugins=[];servers=new Set;protocolNamespaces=new Set;generatedFlatMethods=new Set;transportPromises=new Map;transports=new Map;retainedTransports=new Set;fixedTransport;destroyPromise=null;isDestroyed=!1;constructor(e={},t,r){if(this.config={...w,...e,retry:{...w.retry,...e.retry}},this.fixedTransport=t??null,t&&(T(t),this.retainedTransports.add(t)),r)for(const[a,u]of r)this.transportPromises.set(a,u.then(C=>this.retainResolvedTransport(a,C)));this.pluginCtx={config:this.config,core:this};const o=this.config.protocols;if(o)for(let a=0;a<o.length;a++)this.registerProtocol(o[a]);const s=this.config.senders;if(s)for(let a=0;a<s.length;a++)this.registerSender(s[a]);const n=this.config.customSender;n&&this.registerSender(n);const i=this.config.receivers;if(i)for(let a=0;a<i.length;a++)this.registerReceiver(i[a]);const c=this.config.plugins;if(c)for(let a=0;a<c.length;a++){const u=c[a];if(typeof u=="string")throw new p(`[HyperCore] Plugin module "${u}" cannot be loaded by the synchronous constructor. Import it and pass the plugin instance instead.`);this.use(u)}const l=this;for(let a=0;a<m.length;a++){const u=m[a];!this.registry.has(u)&&l[u]===void 0&&(l[u]=this.createLazyNamespace(u),this.protocolNamespaces.add(u))}}getProtocol(e){return this.registry.get(e)}getSender(e){return this.registry.get(e)?.sender}getReceiver(e){return this.registry.get(e)?.receiver}async getTransportName(){return(await this.acquireTransport()).constructor.name}async getSenderName(e="rest"){let t=this.registry.get(e);t||(t=await g(e),this.registerProtocol(t));const r=t.sender;if(!r)throw new p(`[HyperCore] Protocol "${e}" has no sender (client role).`);return r.constructor.name}async getReceiverName(e="rest"){let t=this.registry.get(e);t||(t=await g(e),this.registerProtocol(t));const r=t.receiver;if(!r)throw new p(`[HyperCore] Protocol "${e}" has no receiver (server role).`);return r.constructor.name}async getProtocolName(e="rest"){let t=this.registry.get(e);if(t||(t=await g(e),this.registerProtocol(t)),t.name)return t.name;const r=t.constructor;return r&&r.name&&r.name!=="Object"?r.name:String(t.protocol)}registerProtocol(e){const t=String(e.protocol),r=this;if(t==="__proto__"||t==="prototype"||t==="constructor"||t in HyperCore.prototype||t in this&&!this.protocolNamespaces.has(t))throw new p(`[HyperCore] Protocol name "${t}" conflicts with the core API.`);this.registry.register(e);const s=e.sender?.methods;if(s&&typeof s=="object"){const n=Object.create(null);for(const i in s){if(!Object.hasOwn(s,i))continue;const c=s[i];if(typeof c!="function")continue;const l=(...a)=>c.apply(s,[this,...a]);n[i]=l,this.generatedFlatMethods.has(i)?r[i]=l:!(i in HyperCore.prototype)&&!(i in this)&&(r[i]=l,this.generatedFlatMethods.add(i))}r[t]=n,this.protocolNamespaces.add(t)}return this}registerSender(e){const t=this.registry.get(e.protocol);return this.registerProtocol({protocol:e.protocol,sender:e,receiver:t?.receiver})}registerReceiver(e){const t=this.registry.get(e.protocol);return this.registerProtocol({protocol:e.protocol,sender:t?.sender,receiver:e})}createLazyNamespace(e){const t={get:(r,o)=>{if(!(typeof o!="string"||o==="then"))return(...s)=>this.dispatchLazyMethod(e,o,s)}};return new Proxy({},t)}async dispatchLazyMethod(e,t,r){let o=this.registry.get(e);o||(o=await g(e),this.registerProtocol(o));const s=o.sender;if(!s)throw new p(`[HyperCore] Protocol "${e}" has no sender (client role).`);const n=s.methods,i=n?.[t];if(typeof i!="function")throw new TypeError(`[HyperCore] Protocol "${e}" has no method "${t}".`);return i.apply(n,[this,...r])}async send(e){const t=H(e),r=this.plugins;let o=e;if(r.length===0){const s=this.registry.get(e.protocol)?.sender;if(s)return this.runSender(s,e,t)}try{let s;for(let n=0;n<r.length;n++){const i=r[n];if(typeof i.onRequest!="function")continue;const c=await i.onRequest(o,this.pluginCtx,t);if(c!=null){if(y(c)){s=c;break}o=c,t.signal=o.signal}}if(!s){const n=await this.resolveRequestSender(o.protocol);s=await this.runSender(n,o,t)}return await this.runResponseHooks(s,o,t,r)}catch(s){for(let n=0;n<r.length;n++){const i=r[n];if(typeof i.onError!="function")continue;const c=await i.onError(s,o,this.pluginCtx,t);if(c!=null&&y(c))return c}throw s}}async resolveRequestSender(e){let t=this.registry.get(e);t||(t=await g(e),this.registerProtocol(t));const r=t.sender;if(!r)throw new p(`[HyperCore] Protocol "${e}" has no sender (client role).`);return r}async runResponseHooks(e,t,r,o){let s=e;for(let n=0;n<o.length;n++){const i=o[n];if(typeof i.onResponse!="function")continue;if(i.mode==="background"){Promise.resolve().then(()=>i.onResponse(s,t,this.pluginCtx,r)).catch(l=>this.reportBackgroundPluginError(l));continue}const c=await i.onResponse(s,t,this.pluginCtx,r);c!=null&&y(c)&&(s=c)}return s}reportBackgroundPluginError(e){const t=this.config.onError;if(typeof t=="function")try{t(e);return}catch(r){this.log("error","[HyperCore] Background error handler failed",r)}this.log("error","[HyperCore] Background plugin error",e)}log(e,t,r){if(this.config.logger){this.config.logger(e,t,r);return}if(!this.config.verbose&&e!=="error")return;(e==="debug"?console.debug:console[e])(t,r)}async acquireTransport(e="rest"){if(this.isDestroyed)throw new p("[HyperCore] Cannot acquire transport on a destroyed core instance.");const t=this.transports.get(e);if(t)return t;let r=this.transportPromises.get(e);if(!r){r=this.resolveAndRetainTransport(e);let s;s=r.catch(n=>{throw this.transportPromises.get(e)===s&&this.transportPromises.delete(e),n}),this.transportPromises.set(e,s),r=s}const o=await r;if(this.isDestroyed)throw new p("[HyperCore] Core instance was destroyed while resolving transport.");return o}async resolveAndRetainTransport(e){const t=this.fixedTransport??await x(e,{customTransport:this.config.customTransport,logger:this.config.logger,verbose:this.config.verbose});if(!(typeof t.supports=="function"?t.supports(e):t.protocols?.includes(e)??!0))throw new p(`[HyperCore] Transport "${t.constructor.name}" does not support protocol "${e}".`);return this.retainResolvedTransport(e,t)}retainResolvedTransport(e,t){return this.retainedTransports.has(t)||(T(t),this.retainedTransports.add(t)),this.transports.set(e,t),t}async runSender(e,t,r){const o=this.transports.get(t.protocol)??await this.acquireTransport(t.protocol),s=e.prepare(t,r),n=await e.send(s,o,r);return e.parse(n,r)}async listen(e){const t=await this.acquireTransport(e.protocol);if(typeof t.listen!="function")throw new p(`[HyperCore] Transport "${t.constructor.name}" does not support listen() (server role).`);let r=this.registry.get(e.protocol);r||(r=await g(e.protocol),this.registerProtocol(r));const o=r.receiver;if(!o)throw new p(`[HyperCore] Protocol "${e.protocol}" has no receiver (server role).`);const s=e.handler,n=async c=>{const l=O(c),a=await o.receive(c,l),u=s?await s(a,l):await o.handle(a,l);return o.respond(u,l)},i=await t.listen({host:e.host,port:e.port,signal:e.signal,onRequest:n});if(this.isDestroyed)throw await i.close(),new p("[HyperCore] Core instance was destroyed while starting the server.");return this.servers.add(i),i}static async create(e={}){const t=e.plugins;if(!t?.some(o=>typeof o=="string"))return new HyperCore(e);const r=[];for(const o of t){if(typeof o!="string"){r.push(o);continue}const s=await S(o),n=s.default??s.plugin;if(!n||typeof n!="object")throw new p(`[HyperCore] Plugin module "${o}" must export a plugin object as default or "plugin".`);r.push(n)}return new HyperCore({...e,plugins:r})}use(e){return(e.enabled?e.enabled(this.config):!0)?(e.setup?.(this.pluginCtx),this.plugins=[...this.plugins,e].sort((r,o)=>(v[r.phase??""]??0)-(v[o.phase??""]??0)),this):this}extend(e){const t=e.customTransport??this.fixedTransport??void 0,r=e.customTransport?void 0:this.transportPromises;return new HyperCore({...this.config,...e},t,r)}create(e){const t={...this.config};return delete t.customTransport,new HyperCore({...t,...e})}destroy(e=!0){return this.destroyPromise||(this.destroyPromise=this.performDestroy(e)),this.destroyPromise}async performDestroy(e){this.isDestroyed=!0;for(const r of this.servers)try{await r.close()}catch{}this.servers.clear(),await Promise.allSettled(this.transportPromises.values()),this.transportPromises.clear(),this.transports.clear();const t=[...this.retainedTransports];this.retainedTransports.clear();for(const r of t)N(r)>0||(b(r),e&&typeof r.close=="function"?await r.close():typeof r.destroy=="function"?await r.destroy():typeof r.close=="function"&&await r.close())}}
|
|
2
2
|
//# sourceMappingURL=HyperCore.js.map
|
package/Core/HyperCore.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/Core/HyperCore.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n HyperClientOptions,\n HyperPlugin,\n HyperProtocol,\n HyperProtocols,\n HyperReceiver,\n HyperSender,\n HyperServerListenOptions,\n HyperTransport,\n IHyperCore,\n PluginContext,\n ProtocolRegistry,\n RequestContext,\n SenderProtocol,\n SendRequest,\n ServerRequestContext,\n TransportRequest,\n TransportResponse,\n TransportServer,\n UniversalResponse,\n} from \"@hyperttp/types\";\nimport { defaultCoreConfig } from \"../defaultConfig.js\";\nimport { KNOWN_PROTOCOLS, resolveProtocol } from \"../protocols/manager.js\";\nimport { evictCachedTransport, resolveTransport } from \"../transports/manager.js\";\nimport { HyperClientError } from \"../utils/errors.js\";\n\nlet requestCounter = 0;\nlet requestIdBase = Date.now().toString(36) + \"-\";\n\nconst PLUGIN_PHASE_ORDER: Readonly<Record<string, number>> = Object.freeze({\n START: 0,\n PREPARE: 1,\n CONTROL: 2,\n FORMAT: 3,\n NETWORK: 4,\n DATA: 5,\n});\n\n/**\n * @ru Генерирует уникальный идентификатор запроса без аллокаций на каждый вызов:\n * базовый таймстемп пересчитывается при переполнении счётчика, а уникальность\n * обеспечивает инкрементальный битовый счётчик (общий для всех ядер).\n * @en Generates a unique request identifier without per-call allocations:\n * the base timestamp is recalculated when the counter wraps around, and uniqueness\n * is ensured by an incremental bitwise counter (shared across all cores).\n * @returns A compact unique string identifier.\n */\nfunction createRequestId(): string {\n requestCounter = (requestCounter + 1) >>> 0;\n if (requestCounter === 0) {\n requestIdBase = Date.now().toString(36) + \"-\";\n }\n return requestIdBase + (requestCounter >>> 0).toString(36);\n}\n\n/**\n * @ru Счётчик активных удержаний транспорта. Позволяет нескольким ядрам\n * (например, через `extend()`) разделять один транспорт, закрывая его только\n * после освобождения последней ссылки.\n * @en Active transport hold count. Lets multiple cores (e.g. via `extend()`)\n * share one transport, closing it only after the last reference is released.\n */\nconst transportRefs = new WeakMap<HyperTransport, number>();\n\nfunction retainTransport(transport: HyperTransport): void {\n transportRefs.set(transport, (transportRefs.get(transport) ?? 0) + 1);\n}\n\nfunction releaseTransport(transport: HyperTransport): number {\n const next = (transportRefs.get(transport) ?? 1) - 1;\n if (next <= 0) {\n transportRefs.delete(transport);\n } else {\n transportRefs.set(transport, next);\n }\n return next;\n}\n\n/**\n * @ru Создаёт RequestContext на один цикл выполнения (prepare → send → parse).\n * `meta` и `state` инициализируются лениво при первом обращении, чтобы не\n * аллоцировать объекты для запросов, которые их не используют.\n * @en Creates a RequestContext for a single execution cycle (prepare → send → parse).\n * `meta` and `state` are initialized lazily on first access to avoid allocating\n * objects for requests that never use them.\n * @param req - The universal request being dispatched.\n * @returns A new RequestContext.\n */\nclass DefaultRequestContext implements RequestContext {\n public readonly requestId = createRequestId();\n public readonly startTime = performance.now();\n public readonly signal?: AbortSignal;\n private requestMeta?: Record<string, unknown>;\n private requestState?: Record<string, unknown>;\n\n constructor(signal?: AbortSignal) {\n this.signal = signal;\n }\n\n public get meta(): Record<string, unknown> {\n return (this.requestMeta ??= {});\n }\n\n public set meta(value: Record<string, unknown>) {\n this.requestMeta = value;\n }\n\n public get state(): Record<string, unknown> {\n return (this.requestState ??= {});\n }\n\n public set state(value: Record<string, unknown>) {\n this.requestState = value;\n }\n}\n\nfunction createRequestContext(req: SendRequest<unknown, string>): RequestContext {\n return new DefaultRequestContext(req.signal);\n}\n\n/**\n * @ru Создаёт ServerRequestContext на один серверный цикл (receive → handle → respond).\n * `meta` и `state` инициализируются лениво, как и в клиентском контексте.\n * @en Creates a ServerRequestContext for a single server cycle (receive → handle → respond).\n * `meta` and `state` are initialized lazily, like in the client context.\n * @param raw - The raw transport request being received.\n * @returns A new ServerRequestContext.\n */\nfunction createServerRequestContext(raw: TransportRequest): ServerRequestContext {\n return new DefaultRequestContext(raw.signal) as ServerRequestContext;\n}\n\n/**\n * @ru Проверяет, является ли значение UniversalResponse (а не SendRequest).\n * @en Checks whether the value is a UniversalResponse (rather than a SendRequest).\n * @param value - The value to inspect.\n * @returns True if the value carries response shape (data + status).\n */\nfunction isUniversalResponse(value: unknown): value is UniversalResponse {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"data\" in value &&\n \"status\" in value &&\n !(\"input\" in value)\n );\n}\n\n/**\n * @ru Внутренний реестр протоколов: хранит единые модули (Sender + Receiver).\n * @en Internal protocol registry: stores unified modules (Sender + Receiver).\n */\nclass DefaultProtocolRegistry implements ProtocolRegistry {\n private readonly protocols = new Map<SenderProtocol, HyperProtocol>();\n\n public register<P extends SenderProtocol>(\n protocol: HyperProtocol<unknown, unknown, unknown, unknown, P>,\n ): void {\n this.protocols.set(protocol.protocol, protocol);\n }\n\n public get<P extends SenderProtocol>(\n protocol: P,\n ): HyperProtocol<unknown, unknown, unknown, unknown, P> | undefined {\n return this.protocols.get(protocol) as\n | HyperProtocol<unknown, unknown, unknown, unknown, P>\n | undefined;\n }\n\n public has(protocol: SenderProtocol): boolean {\n return this.protocols.has(protocol);\n }\n\n public get size(): number {\n return this.protocols.size;\n }\n}\n\n// oxlint-disable-next-line no-unsafe-declaration-merging\nexport interface HyperCore extends HyperProtocols {}\n\n/**\n * @ru Универсальное ядро v2.0.0. Протокол-независимый диспетчер: регистрирует\n * единые модули протоколов (Sender + Receiver), выполняет клиентский цикл\n * prepare → send → parse и серверный цикл receive → handle → respond через\n * физический транспорт, а также прогоняет хуки плагинов.\n * @en Universal core v2.0.0. Protocol-agnostic dispatcher: registers unified\n * protocol modules (Sender + Receiver), runs the client cycle prepare → send → parse\n * and the server cycle receive → handle → respond through the physical transport,\n * and executes plugin hooks.\n */\nexport class HyperCore implements IHyperCore {\n public readonly config: HyperClientOptions;\n\n private readonly registry = new DefaultProtocolRegistry();\n private readonly pluginCtx: PluginContext;\n private readonly plugins: HyperPlugin[] = [];\n private readonly servers = new Set<TransportServer>();\n private readonly protocolNamespaces = new Set<string>();\n private readonly generatedFlatMethods = new Set<string>();\n private readonly transportPromises = new Map<SenderProtocol, Promise<HyperTransport>>();\n private readonly transports = new Map<SenderProtocol, HyperTransport>();\n private readonly retainedTransports = new Set<HyperTransport>();\n private readonly fixedTransport: HyperTransport | null;\n private destroyPromise: Promise<void> | null = null;\n private isDestroyed = false;\n\n constructor(\n config: Partial<HyperClientOptions> = {},\n transport?: HyperTransport,\n sharedTransportPromises?: ReadonlyMap<SenderProtocol, Promise<HyperTransport>>,\n ) {\n this.config = {\n ...defaultCoreConfig,\n ...config,\n retry: {\n ...defaultCoreConfig.retry,\n ...config.retry,\n },\n };\n this.fixedTransport = transport ?? null;\n if (transport) {\n retainTransport(transport);\n this.retainedTransports.add(transport);\n }\n if (sharedTransportPromises) {\n for (const [protocol, sharedPromise] of sharedTransportPromises) {\n this.transportPromises.set(\n protocol,\n sharedPromise.then((sharedTransport) =>\n this.retainResolvedTransport(protocol, sharedTransport),\n ),\n );\n }\n }\n this.pluginCtx = { config: this.config, core: this };\n\n const protocols = this.config.protocols;\n if (protocols) {\n for (let i = 0; i < protocols.length; i++) {\n this.registerProtocol(protocols[i]!);\n }\n }\n\n const senders = this.config.senders;\n if (senders) {\n for (let i = 0; i < senders.length; i++) {\n this.registerSender(senders[i]!);\n }\n }\n\n const customSender = this.config.customSender;\n if (customSender) {\n this.registerSender(customSender);\n }\n\n const receivers = this.config.receivers;\n if (receivers) {\n for (let i = 0; i < receivers.length; i++) {\n this.registerReceiver(receivers[i]!);\n }\n }\n\n const plugins = this.config.plugins;\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i]!;\n if (typeof plugin === \"string\") {\n throw new HyperClientError(\n `[HyperCore] Plugin module \"${plugin}\" cannot be loaded by the synchronous constructor. Import it and pass the plugin instance instead.`,\n );\n }\n this.use(plugin);\n }\n }\n\n const namespaces = this as unknown as Record<string, unknown>;\n for (let i = 0; i < KNOWN_PROTOCOLS.length; i++) {\n const protocol = KNOWN_PROTOCOLS[i]!;\n if (!this.registry.has(protocol) && namespaces[protocol] === undefined) {\n namespaces[protocol] = this.createLazyNamespace(protocol);\n this.protocolNamespaces.add(protocol);\n }\n }\n }\n\n /**\n * @ru Получает зарегистрированный модуль протокола (Sender + Receiver).\n * @en Gets a registered protocol module (Sender + Receiver).\n */\n public getProtocol<P extends SenderProtocol>(\n protocol: P,\n ): HyperProtocol<unknown, unknown, unknown, unknown, P> | undefined {\n return this.registry.get(protocol);\n }\n\n /**\n * @ru Получает зарегистрированный сендер протокола.\n * @en Gets a registered protocol sender.\n */\n public getSender<P extends SenderProtocol>(\n protocol: P,\n ): HyperSender<unknown, unknown, unknown, unknown, P> | undefined {\n return this.registry.get(protocol)?.sender;\n }\n\n /**\n * @ru Получает зарегистрированный ресивер протокола.\n * @en Gets a registered protocol receiver.\n */\n public getReceiver<P extends SenderProtocol>(\n protocol: P,\n ): HyperReceiver<unknown, unknown, unknown, unknown, P> | undefined {\n return this.registry.get(protocol)?.receiver;\n }\n\n /**\n * @ru Возвращает имя текущего транспорта.\n * @en Returns the name of the current transport.\n * @returns Transport constructor name.\n */\n public async getTransportName(): Promise<string> {\n const t = await this.acquireTransport();\n return t.constructor.name;\n }\n\n /**\n * @ru Возвращает имя сендера протокола (по умолчанию — \"rest\").\n * Протокол резолвится лениво, если ещё не зарегистрирован.\n * @en Returns the sender constructor name for a protocol (default \"rest\").\n * The protocol is resolved lazily if not registered yet.\n * @param protocol - The protocol to inspect.\n * @returns Sender constructor name.\n */\n public async getSenderName(protocol: SenderProtocol = \"rest\"): Promise<string> {\n let resolved = this.registry.get(protocol);\n if (!resolved) {\n resolved = await resolveProtocol(protocol);\n this.registerProtocol(resolved);\n }\n const sender = resolved.sender;\n if (!sender) {\n throw new HyperClientError(`[HyperCore] Protocol \"${protocol}\" has no sender (client role).`);\n }\n return sender.constructor.name;\n }\n\n /**\n * @ru Возвращает имя ресивера протокола (по умолчанию — \"rest\").\n * Протокол резолвится лениво, если ещё не зарегистрирован.\n * @en Returns the receiver constructor name for a protocol (default \"rest\").\n * The protocol is resolved lazily if not registered yet.\n * @param protocol - The protocol to inspect.\n * @returns Receiver constructor name.\n */\n public async getReceiverName(protocol: SenderProtocol = \"rest\"): Promise<string> {\n let resolved = this.registry.get(protocol);\n if (!resolved) {\n resolved = await resolveProtocol(protocol);\n this.registerProtocol(resolved);\n }\n const receiver = resolved.receiver;\n if (!receiver) {\n throw new HyperClientError(\n `[HyperCore] Protocol \"${protocol}\" has no receiver (server role).`,\n );\n }\n return receiver.constructor.name;\n }\n\n /**\n * @ru Возвращает имя модуля протокола (по умолчанию — \"rest\"): предпочитает\n * `name`, затем `constructor.name`, затем идентификатор протокола.\n * Протокол резолвится лениво, если ещё не зарегистрирован.\n * @en Returns the protocol module name (default \"rest\"): prefers `name`, then\n * `constructor.name`, then the protocol identifier.\n * The protocol is resolved lazily if not registered yet.\n * @param protocol - The protocol to inspect.\n * @returns The protocol module display name.\n */\n public async getProtocolName(protocol: SenderProtocol = \"rest\"): Promise<string> {\n let resolved = this.registry.get(protocol);\n if (!resolved) {\n resolved = await resolveProtocol(protocol);\n this.registerProtocol(resolved);\n }\n if (resolved.name) return resolved.name;\n const ctor = resolved.constructor;\n return ctor && ctor.name && ctor.name !== \"Object\" ? ctor.name : String(resolved.protocol);\n }\n\n /**\n * @ru Регистрирует единый модуль протокола и раскрывает методы его сендера\n * на ядре (например, `core.rest` для REST).\n * @en Registers a unified protocol module and exposes its sender methods on the\n * core (e.g., `core.rest` for REST).\n * @param protocol - The protocol module to register.\n * @returns This instance for chaining.\n */\n public registerProtocol<P extends SenderProtocol>(\n protocol: HyperProtocol<unknown, unknown, unknown, unknown, P>,\n ): this {\n const protocolName = String(protocol.protocol);\n const namespaces = this as unknown as Record<string, unknown>;\n const isReserved =\n protocolName === \"__proto__\" ||\n protocolName === \"prototype\" ||\n protocolName === \"constructor\" ||\n protocolName in HyperCore.prototype ||\n (protocolName in this && !this.protocolNamespaces.has(protocolName));\n\n if (isReserved) {\n throw new HyperClientError(\n `[HyperCore] Protocol name \"${protocolName}\" conflicts with the core API.`,\n );\n }\n\n this.registry.register(protocol);\n\n const methods = protocol.sender?.methods;\n if (methods && typeof methods === \"object\") {\n const namespace: Record<string, unknown> = Object.create(null);\n\n for (const name in methods) {\n const method = methods[name] as ((...args: unknown[]) => unknown) | undefined;\n if (typeof method !== \"function\") continue;\n\n const boundMethod = (...args: unknown[]) => method.apply(methods, [this, ...args]);\n namespace[name] = boundMethod;\n\n if (this.generatedFlatMethods.has(name)) {\n namespaces[name] = boundMethod;\n } else if (!(name in HyperCore.prototype) && !(name in this)) {\n namespaces[name] = boundMethod;\n this.generatedFlatMethods.add(name);\n }\n }\n\n namespaces[protocolName] = namespace;\n this.protocolNamespaces.add(protocolName);\n }\n\n return this;\n }\n\n /**\n * @ru Регистрирует сендер протокола, оборачивая его в модуль протокола.\n * Существующий ресивер того же протокола сохраняется.\n * @en Registers a protocol sender, wrapping it into a protocol module.\n * An existing receiver for the same protocol is preserved.\n * @param sender - The protocol sender to register.\n * @returns This instance for chaining.\n */\n public registerSender<P extends SenderProtocol>(\n sender: HyperSender<unknown, unknown, unknown, unknown, P>,\n ): this {\n const existing = this.registry.get(sender.protocol);\n return this.registerProtocol({\n protocol: sender.protocol,\n sender,\n receiver: existing?.receiver,\n });\n }\n\n /**\n * @ru Регистрирует ресивер протокола, оборачивая его в модуль протокола.\n * Существующий сендер того же протокола сохраняется.\n * @en Registers a protocol receiver, wrapping it into a protocol module.\n * An existing sender for the same protocol is preserved.\n * @param receiver - The protocol receiver to register.\n * @returns This instance for chaining.\n */\n public registerReceiver<P extends SenderProtocol>(\n receiver: HyperReceiver<unknown, unknown, unknown, unknown, P>,\n ): this {\n const existing = this.registry.get(receiver.protocol);\n return this.registerProtocol({\n protocol: receiver.protocol,\n sender: existing?.sender,\n receiver,\n });\n }\n\n /**\n * @ru Создаёт ленивый namespace методов протокола: методы доступны ещё до\n * регистрации протокола и резолвятся по требованию при первом вызове.\n * @en Creates a lazy protocol methods namespace: methods are reachable before\n * the protocol is registered and are resolved on first call.\n * @param protocol - The protocol to expose lazily.\n * @returns A Proxy that dispatches method calls to the resolved protocol sender.\n */\n private createLazyNamespace(protocol: SenderProtocol): Record<string, unknown> {\n const handler: ProxyHandler<Record<string, unknown>> = {\n get: (_target, name) => {\n if (typeof name !== \"string\" || name === \"then\") return undefined;\n return (...args: unknown[]) => this.dispatchLazyMethod(protocol, name, args);\n },\n };\n return new Proxy({}, handler);\n }\n\n /**\n * @ru Разрешает протокол по требованию и вызывает метод `methods`-поверхности\n * его сендера, биндя ядро первым аргументом.\n * @en Resolves the protocol on demand and calls a method on its sender\n * `methods` surface, binding the core as the first argument.\n * @param protocol - The protocol identifier.\n * @param name - The method name on the sender surface.\n * @param args - Arguments forwarded after the core instance.\n * @returns The result of the sender method call.\n */\n private async dispatchLazyMethod(\n protocol: SenderProtocol,\n name: string,\n args: unknown[],\n ): Promise<unknown> {\n let resolved = this.registry.get(protocol);\n if (!resolved) {\n resolved = await resolveProtocol(protocol);\n this.registerProtocol(resolved);\n }\n\n const sender = resolved.sender;\n if (!sender) {\n throw new HyperClientError(`[HyperCore] Protocol \"${protocol}\" has no sender (client role).`);\n }\n\n const methods = sender.methods as\n | Record<string, (...callArgs: unknown[]) => unknown>\n | undefined;\n const method = methods?.[name];\n if (typeof method !== \"function\") {\n throw new TypeError(`[HyperCore] Protocol \"${protocol}\" has no method \"${name}\".`);\n }\n return method.apply(methods, [this, ...args]);\n }\n\n /**\n * @ru Основной метод диспетчеризации: выбирает сендер по протоколу и выполняет\n * трёхфазный цикл с поддержкой плагинов.\n * @en Main dispatch method: resolves the sender by protocol and runs the three-phase\n * cycle with plugin support.\n * @param req - The universal request envelope.\n * @returns A promise resolving to the normalized universal response.\n */\n public async send<TInput = unknown, TOutput = unknown, P extends string = string>(\n req: SendRequest<TInput, P>,\n ): Promise<UniversalResponse<TOutput>> {\n const ctx = createRequestContext(req as SendRequest<unknown, string>);\n let currentReq = req as SendRequest<any, any>;\n\n if (this.plugins.length === 0) {\n const sender = this.registry.get(req.protocol)?.sender;\n if (sender) {\n return this.runSender<TInput, TOutput>(sender, req as SendRequest<TInput, string>, ctx);\n }\n }\n\n try {\n let response: UniversalResponse<TOutput> | undefined;\n\n for (let i = 0; i < this.plugins.length; i++) {\n const plugin = this.plugins[i]!;\n if (typeof plugin.onRequest !== \"function\") continue;\n\n const result = await plugin.onRequest(currentReq, this.pluginCtx, ctx);\n if (result == null) continue;\n\n if (isUniversalResponse(result)) {\n response = result as UniversalResponse<TOutput>;\n break;\n }\n\n currentReq = result as SendRequest<any, any>;\n (ctx as { signal?: AbortSignal }).signal = currentReq.signal;\n }\n\n if (!response) {\n const sender = await this.resolveRequestSender(currentReq.protocol);\n response = await this.runSender<unknown, TOutput>(sender, currentReq, ctx);\n }\n\n return await this.runResponseHooks(response, currentReq, ctx);\n } catch (err) {\n for (let i = 0; i < this.plugins.length; i++) {\n const plugin = this.plugins[i]!;\n if (typeof plugin.onError !== \"function\") continue;\n\n const recovered = await plugin.onError(err, currentReq, this.pluginCtx, ctx);\n if (recovered != null && isUniversalResponse(recovered)) {\n return recovered as UniversalResponse<TOutput>;\n }\n }\n throw err;\n }\n }\n\n private async resolveRequestSender(\n protocol: SenderProtocol,\n ): Promise<HyperSender<any, any, any, any>> {\n let resolved = this.registry.get(protocol);\n if (!resolved) {\n resolved = await resolveProtocol(protocol);\n this.registerProtocol(resolved);\n }\n\n const sender = resolved.sender;\n if (!sender) {\n throw new HyperClientError(`[HyperCore] Protocol \"${protocol}\" has no sender (client role).`);\n }\n return sender;\n }\n\n private async runResponseHooks<TOutput>(\n initialResponse: UniversalResponse<TOutput>,\n req: SendRequest<any, any>,\n ctx: RequestContext,\n ): Promise<UniversalResponse<TOutput>> {\n let response = initialResponse;\n\n for (let i = 0; i < this.plugins.length; i++) {\n const plugin = this.plugins[i]!;\n if (typeof plugin.onResponse !== \"function\") continue;\n\n if (plugin.mode === \"background\") {\n void Promise.resolve()\n .then(() => plugin.onResponse!(response, req, this.pluginCtx, ctx))\n .catch((err: unknown) => this.reportBackgroundPluginError(err));\n continue;\n }\n\n const result = await plugin.onResponse(response, req, this.pluginCtx, ctx);\n if (result != null && isUniversalResponse(result)) {\n response = result as UniversalResponse<TOutput>;\n }\n }\n\n return response;\n }\n\n private reportBackgroundPluginError(err: unknown): void {\n const customOnError = (this.config as Record<string, unknown>).onError;\n if (typeof customOnError === \"function\") {\n try {\n (customOnError as (error: unknown) => void)(err);\n return;\n } catch (handlerError) {\n console.error(\"[HyperCore] Background error handler failed:\", handlerError);\n }\n }\n console.error(\"[HyperCore] Background plugin error:\", err);\n }\n\n /**\n * @ru Атомарно получает транспорт для конкретного протокола и удерживает\n * каждый физический экземпляр ровно один раз за время жизни ядра.\n * @en Atomically acquires a transport for a protocol and retains each physical\n * instance exactly once for the lifetime of this core.\n */\n private async acquireTransport(protocol: SenderProtocol = \"rest\"): Promise<HyperTransport> {\n if (this.isDestroyed) {\n throw new HyperClientError(\n \"[HyperCore] Cannot acquire transport on a destroyed core instance.\",\n );\n }\n\n const existing = this.transports.get(protocol);\n if (existing) return existing;\n\n let pending = this.transportPromises.get(protocol);\n if (!pending) {\n pending = this.resolveAndRetainTransport(protocol);\n this.transportPromises.set(protocol, pending);\n }\n\n const transport = await pending;\n if (this.isDestroyed) {\n throw new HyperClientError(\n \"[HyperCore] Core instance was destroyed while resolving transport.\",\n );\n }\n\n return transport;\n }\n\n private async resolveAndRetainTransport(protocol: SenderProtocol): Promise<HyperTransport> {\n const transport =\n this.fixedTransport ??\n (await resolveTransport(protocol, { customTransport: this.config.customTransport }));\n const supportsProtocol =\n typeof transport.supports === \"function\"\n ? transport.supports(protocol)\n : (transport.protocols?.includes(protocol) ?? true);\n\n if (!supportsProtocol) {\n throw new HyperClientError(\n `[HyperCore] Transport \"${transport.constructor.name}\" does not support protocol \"${protocol}\".`,\n );\n }\n\n return this.retainResolvedTransport(protocol, transport);\n }\n\n private retainResolvedTransport(\n protocol: SenderProtocol,\n transport: HyperTransport,\n ): HyperTransport {\n if (!this.retainedTransports.has(transport)) {\n retainTransport(transport);\n this.retainedTransports.add(transport);\n }\n\n this.transports.set(protocol, transport);\n return transport;\n }\n\n /**\n * @ru Выполняет ядро цикла запроса: prepare → send → parse через физический\n * транспорт. Транспорт получается через `acquireTransport()`.\n * @en Runs the core request cycle: prepare → send → parse through the physical\n * transport. The transport is acquired via `acquireTransport()`.\n * @param sender - The resolved protocol sender.\n * @param req - The (possibly plugin-modified) universal request.\n * @param ctx - The per-request execution context.\n * @returns The normalized universal response.\n */\n private async runSender<TInput, TOutput>(\n sender: HyperSender<any, any, any, any>,\n req: SendRequest<TInput, string>,\n ctx: RequestContext,\n ): Promise<UniversalResponse<TOutput>> {\n const transport =\n this.transports.get(req.protocol) ?? (await this.acquireTransport(req.protocol));\n const prepared = sender.prepare(req, ctx);\n const raw = await sender.send(prepared, transport, ctx);\n return sender.parse(raw, ctx) as UniversalResponse<TOutput>;\n }\n\n /**\n * @ru Запускает сервер для указанного протокола: связывает транспорт, ресивер и\n * application handler в цепочку receive → handle → respond.\n * @en Starts a server for the given protocol, wiring transport, receiver, and\n * application handler into the receive → handle → respond pipeline.\n * @template P - The protocol identifier.\n * @param options - The server listen options.\n * @returns A promise resolving to the transport server handle.\n */\n public async listen<P extends SenderProtocol = SenderProtocol>(\n options: HyperServerListenOptions<P>,\n ): Promise<TransportServer> {\n const transport = await this.acquireTransport(options.protocol);\n\n if (typeof transport.listen !== \"function\") {\n throw new HyperClientError(\n `[HyperCore] Transport \"${transport.constructor.name}\" does not support listen() (server role).`,\n );\n }\n\n let resolved = this.registry.get(options.protocol);\n if (!resolved) {\n resolved = await resolveProtocol(options.protocol);\n this.registerProtocol(resolved);\n }\n\n const receiver = resolved.receiver as\n | HyperReceiver<unknown, unknown, TransportRequest, TransportResponse, P>\n | undefined;\n if (!receiver) {\n throw new HyperClientError(\n `[HyperCore] Protocol \"${options.protocol}\" has no receiver (server role).`,\n );\n }\n\n const handler = options.handler as\n | ((request: unknown, ctx: ServerRequestContext) => unknown)\n | undefined;\n\n const onRequest = async (raw: TransportRequest): Promise<TransportResponse> => {\n const ctx = createServerRequestContext(raw);\n const request = await receiver.receive(raw, ctx);\n const response = handler ? await handler(request, ctx) : await receiver.handle(request, ctx);\n return receiver.respond(response, ctx);\n };\n\n const server = await transport.listen!({\n host: options.host,\n port: options.port,\n signal: options.signal,\n onRequest,\n });\n\n if (this.isDestroyed) {\n await server.close();\n throw new HyperClientError(\n \"[HyperCore] Core instance was destroyed while starting the server.\",\n );\n }\n\n this.servers.add(server);\n return server;\n }\n\n /**\n * @ru Регистрирует плагин. Пропускает отключённые плагины.\n * @en Registers a plugin. Skips disabled plugins.\n * @param plugin - The plugin instance to register.\n * @returns This instance for chaining.\n */\n public use(plugin: HyperPlugin): this {\n const enabled = plugin.enabled ? plugin.enabled(this.config) : true;\n if (!enabled) return this;\n\n plugin.setup?.(this.pluginCtx);\n this.plugins.push(plugin);\n this.plugins.sort(\n (a, b) => (PLUGIN_PHASE_ORDER[a.phase ?? \"\"] ?? 0) - (PLUGIN_PHASE_ORDER[b.phase ?? \"\"] ?? 0),\n );\n return this;\n }\n\n /**\n * @ru Создаёт новый экземпляр ядра с расширенной/переопределённой конфигурацией,\n * переиспользуя текущий транспорт.\n * @en Creates a new core instance with extended/overridden configuration,\n * reusing the current transport.\n * @param options - Partial configuration overrides.\n * @returns A new IHyperCore instance.\n */\n public extend(options: Partial<HyperClientOptions>): IHyperCore {\n const transport = options.customTransport ?? this.fixedTransport ?? undefined;\n const sharedTransports = options.customTransport ? undefined : this.transportPromises;\n return new HyperCore({ ...this.config, ...options }, transport, sharedTransports);\n }\n\n /**\n * @ru Создаёт полностью независимый экземпляр ядра на основе текущей\n * конфигурации: не переиспользует текущий транспорт и по умолчанию не\n * наследует `customTransport`.\n * @en Creates a fully independent core instance based on the current config:\n * it does not reuse the current transport and does not inherit\n * `customTransport` by default.\n * @param options - Partial configuration overrides.\n * @returns A new IHyperCore instance.\n */\n public create(options: Partial<HyperClientOptions>): IHyperCore {\n const base: Partial<HyperClientOptions> = { ...this.config };\n delete base.customTransport;\n return new HyperCore({ ...base, ...options });\n }\n\n /**\n * @ru Завершает работу ядра и освобождает ресурсы: закрывает активные серверы,\n * затем освобождает удержание транспорта.\n * @en Shuts down the core and releases resources: closes active servers, then\n * releases the transport hold.\n * @param graceful - If true, waits for active requests to complete.\n * @returns Promise that resolves when shutdown is complete.\n */\n public destroy(graceful = true): Promise<void> {\n if (!this.destroyPromise) {\n this.destroyPromise = this.performDestroy(graceful);\n }\n return this.destroyPromise;\n }\n\n private async performDestroy(graceful: boolean): Promise<void> {\n this.isDestroyed = true;\n\n for (const server of this.servers) {\n try {\n await server.close();\n } catch {\n // Continue releasing the remaining resources.\n }\n }\n this.servers.clear();\n\n await Promise.allSettled(this.transportPromises.values());\n this.transportPromises.clear();\n this.transports.clear();\n\n const transports = [...this.retainedTransports];\n this.retainedTransports.clear();\n\n for (const transport of transports) {\n if (releaseTransport(transport) > 0) continue;\n\n evictCachedTransport(transport);\n\n if (graceful && typeof transport.close === \"function\") {\n await transport.close();\n } else if (typeof transport.destroy === \"function\") {\n await transport.destroy();\n } else if (typeof transport.close === \"function\") {\n await transport.close();\n }\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["defaultCoreConfig", "KNOWN_PROTOCOLS", "resolveProtocol", "evictCachedTransport", "resolveTransport", "HyperClientError", "requestCounter", "requestIdBase", "PLUGIN_PHASE_ORDER", "createRequestId", "transportRefs", "retainTransport", "transport", "releaseTransport", "next", "DefaultRequestContext", "signal", "value", "createRequestContext", "req", "createServerRequestContext", "raw", "isUniversalResponse", "DefaultProtocolRegistry", "protocol", "config", "sharedTransportPromises", "sharedPromise", "sharedTransport", "protocols", "senders", "customSender", "receivers", "plugins", "plugin", "namespaces", "resolved", "sender", "receiver", "ctor", "protocolName", "methods", "namespace", "name", "method", "boundMethod", "args", "existing", "handler", "_target", "ctx", "currentReq", "response", "
|
|
4
|
+
"sourcesContent": ["import type {\n AnyHyperSender,\n HyperClientOptions,\n HyperPlugin,\n HyperProtocol,\n HyperProtocols,\n HyperReceiver,\n HyperSender,\n HyperServerListenOptions,\n HyperTransport,\n IHyperCore,\n PluginContext,\n ProtocolRegistry,\n RequestContext,\n SenderProtocol,\n SendRequest,\n ServerRequestContext,\n TransportRequest,\n TransportResponse,\n TransportServer,\n UniversalResponse,\n} from \"@hyperttp/types\";\nimport { dynamicImport } from \"../utils/modules.js\";\nimport { defaultCoreConfig } from \"../defaultConfig.js\";\nimport { KNOWN_PROTOCOLS, resolveProtocol } from \"../protocols/manager.js\";\nimport { evictCachedTransport, resolveTransport } from \"../transports/manager.js\";\nimport { HyperClientError } from \"../utils/errors.js\";\n\nlet requestCounter = 0;\nlet requestIdBase = Date.now().toString(36) + \"-\";\n\nconst PLUGIN_PHASE_ORDER: Readonly<Record<string, number>> = Object.freeze({\n START: 0,\n PREPARE: 1,\n CONTROL: 2,\n FORMAT: 3,\n NETWORK: 4,\n DATA: 5,\n});\n\n/**\n * @ru Генерирует уникальный идентификатор запроса без аллокаций на каждый вызов:\n * базовый таймстемп пересчитывается при переполнении счётчика, а уникальность\n * обеспечивает инкрементальный битовый счётчик (общий для всех ядер).\n * @en Generates a unique request identifier without per-call allocations:\n * the base timestamp is recalculated when the counter wraps around, and uniqueness\n * is ensured by an incremental bitwise counter (shared across all cores).\n * @returns A compact unique string identifier.\n */\nfunction createRequestId(): string {\n requestCounter = (requestCounter + 1) >>> 0;\n if (requestCounter === 0) {\n requestIdBase = Date.now().toString(36) + \"-\";\n }\n return requestIdBase + (requestCounter >>> 0).toString(36);\n}\n\n/**\n * @ru Счётчик активных удержаний транспорта. Позволяет нескольким ядрам\n * (например, через `extend()`) разделять один транспорт, закрывая его только\n * после освобождения последней ссылки.\n * @en Active transport hold count. Lets multiple cores (e.g. via `extend()`)\n * share one transport, closing it only after the last reference is released.\n */\nconst transportRefs = new WeakMap<HyperTransport, number>();\n\nfunction retainTransport(transport: HyperTransport): void {\n transportRefs.set(transport, (transportRefs.get(transport) ?? 0) + 1);\n}\n\nfunction releaseTransport(transport: HyperTransport): number {\n const next = (transportRefs.get(transport) ?? 1) - 1;\n if (next <= 0) {\n transportRefs.delete(transport);\n } else {\n transportRefs.set(transport, next);\n }\n return next;\n}\n\n/**\n * @ru Создаёт RequestContext на один цикл выполнения (prepare → send → parse).\n * `meta` и `state` инициализируются лениво при первом обращении, чтобы не\n * аллоцировать объекты для запросов, которые их не используют.\n * @en Creates a RequestContext for a single execution cycle (prepare → send → parse).\n * `meta` and `state` are initialized lazily on first access to avoid allocating\n * objects for requests that never use them.\n * @param req - The universal request being dispatched.\n * @returns A new RequestContext.\n */\nclass DefaultRequestContext implements RequestContext {\n public readonly requestId = createRequestId();\n public readonly startTime = performance.now();\n public readonly signal?: AbortSignal;\n private requestMeta?: Record<string, unknown>;\n private requestState?: Record<string, unknown>;\n\n constructor(signal?: AbortSignal) {\n this.signal = signal;\n }\n\n public get meta(): Record<string, unknown> {\n return (this.requestMeta ??= {});\n }\n\n public set meta(value: Record<string, unknown>) {\n this.requestMeta = value;\n }\n\n public get state(): Record<string, unknown> {\n return (this.requestState ??= {});\n }\n\n public set state(value: Record<string, unknown>) {\n this.requestState = value;\n }\n}\n\nfunction createRequestContext(req: SendRequest<unknown, string>): RequestContext {\n return new DefaultRequestContext(req.signal);\n}\n\n/**\n * @ru Создаёт ServerRequestContext на один серверный цикл (receive → handle → respond).\n * `meta` и `state` инициализируются лениво, как и в клиентском контексте.\n * @en Creates a ServerRequestContext for a single server cycle (receive → handle → respond).\n * `meta` and `state` are initialized lazily, like in the client context.\n * @param raw - The raw transport request being received.\n * @returns A new ServerRequestContext.\n */\nfunction createServerRequestContext(raw: TransportRequest): ServerRequestContext {\n return new DefaultRequestContext(raw.signal) as ServerRequestContext;\n}\n\n/**\n * @ru Проверяет, является ли значение UniversalResponse (а не SendRequest).\n * @en Checks whether the value is a UniversalResponse (rather than a SendRequest).\n * @param value - The value to inspect.\n * @returns True if the value carries response shape (data + status).\n */\nfunction isUniversalResponse(value: unknown): value is UniversalResponse {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"data\" in value &&\n \"status\" in value &&\n !(\"input\" in value)\n );\n}\n\n/**\n * @ru Внутренний реестр протоколов: хранит единые модули (Sender + Receiver).\n * @en Internal protocol registry: stores unified modules (Sender + Receiver).\n */\nclass DefaultProtocolRegistry implements ProtocolRegistry {\n private readonly protocols = new Map<SenderProtocol, HyperProtocol>();\n\n public register<P extends SenderProtocol>(\n protocol: HyperProtocol<unknown, unknown, unknown, unknown, P>,\n ): void {\n this.protocols.set(protocol.protocol, protocol);\n }\n\n public get<P extends SenderProtocol>(\n protocol: P,\n ): HyperProtocol<unknown, unknown, unknown, unknown, P> | undefined {\n return this.protocols.get(protocol) as\n | HyperProtocol<unknown, unknown, unknown, unknown, P>\n | undefined;\n }\n\n public has(protocol: SenderProtocol): boolean {\n return this.protocols.has(protocol);\n }\n\n public get size(): number {\n return this.protocols.size;\n }\n}\n\n// oxlint-disable-next-line no-unsafe-declaration-merging\nexport interface HyperCore extends HyperProtocols {}\n\n/**\n * @ru Универсальное ядро v2.0.0. Протокол-независимый диспетчер: регистрирует\n * единые модули протоколов (Sender + Receiver), выполняет клиентский цикл\n * prepare → send → parse и серверный цикл receive → handle → respond через\n * физический транспорт, а также прогоняет хуки плагинов.\n * @en Universal core v2.0.0. Protocol-agnostic dispatcher: registers unified\n * protocol modules (Sender + Receiver), runs the client cycle prepare → send → parse\n * and the server cycle receive → handle → respond through the physical transport,\n * and executes plugin hooks.\n */\nexport class HyperCore implements IHyperCore {\n public readonly config: HyperClientOptions;\n\n private readonly registry = new DefaultProtocolRegistry();\n private readonly pluginCtx: PluginContext;\n private plugins: HyperPlugin[] = [];\n private readonly servers = new Set<TransportServer>();\n private readonly protocolNamespaces = new Set<string>();\n private readonly generatedFlatMethods = new Set<string>();\n private readonly transportPromises = new Map<SenderProtocol, Promise<HyperTransport>>();\n private readonly transports = new Map<SenderProtocol, HyperTransport>();\n private readonly retainedTransports = new Set<HyperTransport>();\n private readonly fixedTransport: HyperTransport | null;\n private destroyPromise: Promise<void> | null = null;\n private isDestroyed = false;\n\n constructor(\n config: Partial<HyperClientOptions> = {},\n transport?: HyperTransport,\n sharedTransportPromises?: ReadonlyMap<SenderProtocol, Promise<HyperTransport>>,\n ) {\n this.config = {\n ...defaultCoreConfig,\n ...config,\n retry: {\n ...defaultCoreConfig.retry,\n ...config.retry,\n },\n };\n this.fixedTransport = transport ?? null;\n if (transport) {\n retainTransport(transport);\n this.retainedTransports.add(transport);\n }\n if (sharedTransportPromises) {\n for (const [protocol, sharedPromise] of sharedTransportPromises) {\n this.transportPromises.set(\n protocol,\n sharedPromise.then((sharedTransport) =>\n this.retainResolvedTransport(protocol, sharedTransport),\n ),\n );\n }\n }\n this.pluginCtx = { config: this.config, core: this };\n\n const protocols = this.config.protocols;\n if (protocols) {\n for (let i = 0; i < protocols.length; i++) {\n this.registerProtocol(protocols[i]!);\n }\n }\n\n const senders = this.config.senders;\n if (senders) {\n for (let i = 0; i < senders.length; i++) {\n this.registerSender(senders[i]!);\n }\n }\n\n const customSender = this.config.customSender;\n if (customSender) {\n this.registerSender(customSender);\n }\n\n const receivers = this.config.receivers;\n if (receivers) {\n for (let i = 0; i < receivers.length; i++) {\n this.registerReceiver(receivers[i]!);\n }\n }\n\n const plugins = this.config.plugins;\n if (plugins) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i]!;\n if (typeof plugin === \"string\") {\n throw new HyperClientError(\n `[HyperCore] Plugin module \"${plugin}\" cannot be loaded by the synchronous constructor. Import it and pass the plugin instance instead.`,\n );\n }\n this.use(plugin);\n }\n }\n\n const namespaces = this as unknown as Record<string, unknown>;\n for (let i = 0; i < KNOWN_PROTOCOLS.length; i++) {\n const protocol = KNOWN_PROTOCOLS[i]!;\n if (!this.registry.has(protocol) && namespaces[protocol] === undefined) {\n namespaces[protocol] = this.createLazyNamespace(protocol);\n this.protocolNamespaces.add(protocol);\n }\n }\n }\n\n /**\n * @ru Получает зарегистрированный модуль протокола (Sender + Receiver).\n * @en Gets a registered protocol module (Sender + Receiver).\n */\n public getProtocol<P extends SenderProtocol>(\n protocol: P,\n ): HyperProtocol<unknown, unknown, unknown, unknown, P> | undefined {\n return this.registry.get(protocol);\n }\n\n /**\n * @ru Получает зарегистрированный сендер протокола.\n * @en Gets a registered protocol sender.\n */\n public getSender<P extends SenderProtocol>(\n protocol: P,\n ): HyperSender<unknown, unknown, unknown, unknown, P> | undefined {\n return this.registry.get(protocol)?.sender;\n }\n\n /**\n * @ru Получает зарегистрированный ресивер протокола.\n * @en Gets a registered protocol receiver.\n */\n public getReceiver<P extends SenderProtocol>(\n protocol: P,\n ): HyperReceiver<unknown, unknown, unknown, unknown, P> | undefined {\n return this.registry.get(protocol)?.receiver;\n }\n\n /**\n * @ru Возвращает имя текущего транспорта.\n * @en Returns the name of the current transport.\n * @returns Transport constructor name.\n */\n public async getTransportName(): Promise<string> {\n const t = await this.acquireTransport();\n return t.constructor.name;\n }\n\n /**\n * @ru Возвращает имя сендера протокола (по умолчанию — \"rest\").\n * Протокол резолвится лениво, если ещё не зарегистрирован.\n * @en Returns the sender constructor name for a protocol (default \"rest\").\n * The protocol is resolved lazily if not registered yet.\n * @param protocol - The protocol to inspect.\n * @returns Sender constructor name.\n */\n public async getSenderName(protocol: SenderProtocol = \"rest\"): Promise<string> {\n let resolved = this.registry.get(protocol);\n if (!resolved) {\n resolved = await resolveProtocol(protocol);\n this.registerProtocol(resolved);\n }\n const sender = resolved.sender;\n if (!sender) {\n throw new HyperClientError(`[HyperCore] Protocol \"${protocol}\" has no sender (client role).`);\n }\n return sender.constructor.name;\n }\n\n /**\n * @ru Возвращает имя ресивера протокола (по умолчанию — \"rest\").\n * Протокол резолвится лениво, если ещё не зарегистрирован.\n * @en Returns the receiver constructor name for a protocol (default \"rest\").\n * The protocol is resolved lazily if not registered yet.\n * @param protocol - The protocol to inspect.\n * @returns Receiver constructor name.\n */\n public async getReceiverName(protocol: SenderProtocol = \"rest\"): Promise<string> {\n let resolved = this.registry.get(protocol);\n if (!resolved) {\n resolved = await resolveProtocol(protocol);\n this.registerProtocol(resolved);\n }\n const receiver = resolved.receiver;\n if (!receiver) {\n throw new HyperClientError(\n `[HyperCore] Protocol \"${protocol}\" has no receiver (server role).`,\n );\n }\n return receiver.constructor.name;\n }\n\n /**\n * @ru Возвращает имя модуля протокола (по умолчанию — \"rest\"): предпочитает\n * `name`, затем `constructor.name`, затем идентификатор протокола.\n * Протокол резолвится лениво, если ещё не зарегистрирован.\n * @en Returns the protocol module name (default \"rest\"): prefers `name`, then\n * `constructor.name`, then the protocol identifier.\n * The protocol is resolved lazily if not registered yet.\n * @param protocol - The protocol to inspect.\n * @returns The protocol module display name.\n */\n public async getProtocolName(protocol: SenderProtocol = \"rest\"): Promise<string> {\n let resolved = this.registry.get(protocol);\n if (!resolved) {\n resolved = await resolveProtocol(protocol);\n this.registerProtocol(resolved);\n }\n if (resolved.name) return resolved.name;\n const ctor = resolved.constructor;\n return ctor && ctor.name && ctor.name !== \"Object\" ? ctor.name : String(resolved.protocol);\n }\n\n /**\n * @ru Регистрирует единый модуль протокола и раскрывает методы его сендера\n * на ядре (например, `core.rest` для REST).\n * @en Registers a unified protocol module and exposes its sender methods on the\n * core (e.g., `core.rest` for REST).\n * @param protocol - The protocol module to register.\n * @returns This instance for chaining.\n */\n public registerProtocol<P extends SenderProtocol>(\n protocol: HyperProtocol<unknown, unknown, unknown, unknown, P>,\n ): this {\n const protocolName = String(protocol.protocol);\n const namespaces = this as unknown as Record<string, unknown>;\n const isReserved =\n protocolName === \"__proto__\" ||\n protocolName === \"prototype\" ||\n protocolName === \"constructor\" ||\n protocolName in HyperCore.prototype ||\n (protocolName in this && !this.protocolNamespaces.has(protocolName));\n\n if (isReserved) {\n throw new HyperClientError(\n `[HyperCore] Protocol name \"${protocolName}\" conflicts with the core API.`,\n );\n }\n\n this.registry.register(protocol);\n\n const methods = protocol.sender?.methods;\n if (methods && typeof methods === \"object\") {\n const namespace: Record<string, unknown> = Object.create(null);\n\n for (const name in methods) {\n if (!Object.hasOwn(methods, name)) continue;\n\n const method = methods[name] as ((...args: unknown[]) => unknown) | undefined;\n if (typeof method !== \"function\") continue;\n\n const boundMethod = (...args: unknown[]) => method.apply(methods, [this, ...args]);\n namespace[name] = boundMethod;\n\n if (this.generatedFlatMethods.has(name)) {\n namespaces[name] = boundMethod;\n } else if (!(name in HyperCore.prototype) && !(name in this)) {\n namespaces[name] = boundMethod;\n this.generatedFlatMethods.add(name);\n }\n }\n\n namespaces[protocolName] = namespace;\n this.protocolNamespaces.add(protocolName);\n }\n\n return this;\n }\n\n /**\n * @ru Регистрирует сендер протокола, оборачивая его в модуль протокола.\n * Существующий ресивер того же протокола сохраняется.\n * @en Registers a protocol sender, wrapping it into a protocol module.\n * An existing receiver for the same protocol is preserved.\n * @param sender - The protocol sender to register.\n * @returns This instance for chaining.\n */\n public registerSender<P extends SenderProtocol>(sender: AnyHyperSender<P>): this {\n const existing = this.registry.get(sender.protocol);\n return this.registerProtocol({\n protocol: sender.protocol,\n sender,\n receiver: existing?.receiver,\n });\n }\n\n /**\n * @ru Регистрирует ресивер протокола, оборачивая его в модуль протокола.\n * Существующий сендер того же протокола сохраняется.\n * @en Registers a protocol receiver, wrapping it into a protocol module.\n * An existing sender for the same protocol is preserved.\n * @param receiver - The protocol receiver to register.\n * @returns This instance for chaining.\n */\n public registerReceiver<P extends SenderProtocol>(\n receiver: HyperReceiver<unknown, unknown, unknown, unknown, P>,\n ): this {\n const existing = this.registry.get(receiver.protocol);\n return this.registerProtocol({\n protocol: receiver.protocol,\n sender: existing?.sender,\n receiver,\n });\n }\n\n /**\n * @ru Создаёт ленивый namespace методов протокола: методы доступны ещё до\n * регистрации протокола и резолвятся по требованию при первом вызове.\n * @en Creates a lazy protocol methods namespace: methods are reachable before\n * the protocol is registered and are resolved on first call.\n * @param protocol - The protocol to expose lazily.\n * @returns A Proxy that dispatches method calls to the resolved protocol sender.\n */\n private createLazyNamespace(protocol: SenderProtocol): Record<string, unknown> {\n const handler: ProxyHandler<Record<string, unknown>> = {\n get: (_target, name) => {\n if (typeof name !== \"string\" || name === \"then\") return undefined;\n return (...args: unknown[]) => this.dispatchLazyMethod(protocol, name, args);\n },\n };\n return new Proxy({}, handler);\n }\n\n /**\n * @ru Разрешает протокол по требованию и вызывает метод `methods`-поверхности\n * его сендера, биндя ядро первым аргументом.\n * @en Resolves the protocol on demand and calls a method on its sender\n * `methods` surface, binding the core as the first argument.\n * @param protocol - The protocol identifier.\n * @param name - The method name on the sender surface.\n * @param args - Arguments forwarded after the core instance.\n * @returns The result of the sender method call.\n */\n private async dispatchLazyMethod(\n protocol: SenderProtocol,\n name: string,\n args: unknown[],\n ): Promise<unknown> {\n let resolved = this.registry.get(protocol);\n if (!resolved) {\n resolved = await resolveProtocol(protocol);\n this.registerProtocol(resolved);\n }\n\n const sender = resolved.sender;\n if (!sender) {\n throw new HyperClientError(`[HyperCore] Protocol \"${protocol}\" has no sender (client role).`);\n }\n\n const methods = sender.methods as\n | Record<string, (...callArgs: unknown[]) => unknown>\n | undefined;\n const method = methods?.[name];\n if (typeof method !== \"function\") {\n throw new TypeError(`[HyperCore] Protocol \"${protocol}\" has no method \"${name}\".`);\n }\n return method.apply(methods, [this, ...args]);\n }\n\n /**\n * @ru Основной метод диспетчеризации: выбирает сендер по протоколу и выполняет\n * трёхфазный цикл с поддержкой плагинов.\n * @en Main dispatch method: resolves the sender by protocol and runs the three-phase\n * cycle with plugin support.\n * @param req - The universal request envelope.\n * @returns A promise resolving to the normalized universal response.\n */\n public async send<TInput = unknown, TOutput = unknown, P extends string = string>(\n req: SendRequest<TInput, P>,\n ): Promise<UniversalResponse<TOutput>> {\n const ctx = createRequestContext(req as SendRequest<unknown, string>);\n const plugins = this.plugins;\n let currentReq = req as SendRequest<any, any>;\n\n if (plugins.length === 0) {\n const sender = this.registry.get(req.protocol)?.sender;\n if (sender) {\n return this.runSender<TInput, TOutput>(sender, req as SendRequest<TInput, string>, ctx);\n }\n }\n\n try {\n let response: UniversalResponse<TOutput> | undefined;\n\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i]!;\n if (typeof plugin.onRequest !== \"function\") continue;\n\n const result = await plugin.onRequest(currentReq, this.pluginCtx, ctx);\n if (result == null) continue;\n\n if (isUniversalResponse(result)) {\n response = result as UniversalResponse<TOutput>;\n break;\n }\n\n currentReq = result as SendRequest<any, any>;\n (ctx as { signal?: AbortSignal }).signal = currentReq.signal;\n }\n\n if (!response) {\n const sender = await this.resolveRequestSender(currentReq.protocol);\n response = await this.runSender<unknown, TOutput>(sender, currentReq, ctx);\n }\n\n return await this.runResponseHooks(response, currentReq, ctx, plugins);\n } catch (err) {\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i]!;\n if (typeof plugin.onError !== \"function\") continue;\n\n const recovered = await plugin.onError(err, currentReq, this.pluginCtx, ctx);\n if (recovered != null && isUniversalResponse(recovered)) {\n return recovered as UniversalResponse<TOutput>;\n }\n }\n throw err;\n }\n }\n\n private async resolveRequestSender(\n protocol: SenderProtocol,\n ): Promise<HyperSender<any, any, any, any>> {\n let resolved = this.registry.get(protocol);\n if (!resolved) {\n resolved = await resolveProtocol(protocol);\n this.registerProtocol(resolved);\n }\n\n const sender = resolved.sender;\n if (!sender) {\n throw new HyperClientError(`[HyperCore] Protocol \"${protocol}\" has no sender (client role).`);\n }\n return sender;\n }\n\n private async runResponseHooks<TOutput>(\n initialResponse: UniversalResponse<TOutput>,\n req: SendRequest<any, any>,\n ctx: RequestContext,\n plugins: readonly HyperPlugin[],\n ): Promise<UniversalResponse<TOutput>> {\n let response = initialResponse;\n\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i]!;\n if (typeof plugin.onResponse !== \"function\") continue;\n\n if (plugin.mode === \"background\") {\n void Promise.resolve()\n .then(() => plugin.onResponse!(response, req, this.pluginCtx, ctx))\n .catch((err: unknown) => this.reportBackgroundPluginError(err));\n continue;\n }\n\n const result = await plugin.onResponse(response, req, this.pluginCtx, ctx);\n if (result != null && isUniversalResponse(result)) {\n response = result as UniversalResponse<TOutput>;\n }\n }\n\n return response;\n }\n\n private reportBackgroundPluginError(err: unknown): void {\n const customOnError = (this.config as Record<string, unknown>).onError;\n if (typeof customOnError === \"function\") {\n try {\n (customOnError as (error: unknown) => void)(err);\n return;\n } catch (handlerError) {\n this.log(\"error\", \"[HyperCore] Background error handler failed\", handlerError);\n }\n }\n this.log(\"error\", \"[HyperCore] Background plugin error\", err);\n }\n\n private log(level: \"debug\" | \"info\" | \"warn\" | \"error\", message: string, meta?: unknown): void {\n if (this.config.logger) {\n this.config.logger(level, message, meta);\n return;\n }\n if (!this.config.verbose && level !== \"error\") return;\n const output = level === \"debug\" ? console.debug : console[level];\n output(message, meta);\n }\n\n /**\n * @ru Атомарно получает транспорт для конкретного протокола и удерживает\n * каждый физический экземпляр ровно один раз за время жизни ядра.\n * @en Atomically acquires a transport for a protocol and retains each physical\n * instance exactly once for the lifetime of this core.\n */\n private async acquireTransport(protocol: SenderProtocol = \"rest\"): Promise<HyperTransport> {\n if (this.isDestroyed) {\n throw new HyperClientError(\n \"[HyperCore] Cannot acquire transport on a destroyed core instance.\",\n );\n }\n\n const existing = this.transports.get(protocol);\n if (existing) return existing;\n\n let pending = this.transportPromises.get(protocol);\n if (!pending) {\n pending = this.resolveAndRetainTransport(protocol);\n let tracked!: Promise<HyperTransport>;\n tracked = pending.catch((err: unknown) => {\n if (this.transportPromises.get(protocol) === tracked) {\n this.transportPromises.delete(protocol);\n }\n throw err;\n });\n this.transportPromises.set(protocol, tracked);\n pending = tracked;\n }\n\n const transport = await pending;\n if (this.isDestroyed) {\n throw new HyperClientError(\n \"[HyperCore] Core instance was destroyed while resolving transport.\",\n );\n }\n\n return transport;\n }\n\n private async resolveAndRetainTransport(protocol: SenderProtocol): Promise<HyperTransport> {\n const transport =\n this.fixedTransport ??\n (await resolveTransport(protocol, {\n customTransport: this.config.customTransport,\n logger: this.config.logger,\n verbose: this.config.verbose,\n }));\n const supportsProtocol =\n typeof transport.supports === \"function\"\n ? transport.supports(protocol)\n : (transport.protocols?.includes(protocol) ?? true);\n\n if (!supportsProtocol) {\n throw new HyperClientError(\n `[HyperCore] Transport \"${transport.constructor.name}\" does not support protocol \"${protocol}\".`,\n );\n }\n\n return this.retainResolvedTransport(protocol, transport);\n }\n\n private retainResolvedTransport(\n protocol: SenderProtocol,\n transport: HyperTransport,\n ): HyperTransport {\n if (!this.retainedTransports.has(transport)) {\n retainTransport(transport);\n this.retainedTransports.add(transport);\n }\n\n this.transports.set(protocol, transport);\n return transport;\n }\n\n /**\n * @ru Выполняет ядро цикла запроса: prepare → send → parse через физический\n * транспорт. Транспорт получается через `acquireTransport()`.\n * @en Runs the core request cycle: prepare → send → parse through the physical\n * transport. The transport is acquired via `acquireTransport()`.\n * @param sender - The resolved protocol sender.\n * @param req - The (possibly plugin-modified) universal request.\n * @param ctx - The per-request execution context.\n * @returns The normalized universal response.\n */\n private async runSender<TInput, TOutput>(\n sender: HyperSender<any, any, any, any>,\n req: SendRequest<TInput, string>,\n ctx: RequestContext,\n ): Promise<UniversalResponse<TOutput>> {\n const transport =\n this.transports.get(req.protocol) ?? (await this.acquireTransport(req.protocol));\n const prepared = sender.prepare(req, ctx);\n const raw = await sender.send(prepared, transport, ctx);\n return sender.parse(raw, ctx) as UniversalResponse<TOutput>;\n }\n\n /**\n * @ru Запускает сервер для указанного протокола: связывает транспорт, ресивер и\n * application handler в цепочку receive → handle → respond.\n * @en Starts a server for the given protocol, wiring transport, receiver, and\n * application handler into the receive → handle → respond pipeline.\n * @template P - The protocol identifier.\n * @param options - The server listen options.\n * @returns A promise resolving to the transport server handle.\n */\n public async listen<P extends SenderProtocol = SenderProtocol>(\n options: HyperServerListenOptions<P>,\n ): Promise<TransportServer> {\n const transport = await this.acquireTransport(options.protocol);\n\n if (typeof transport.listen !== \"function\") {\n throw new HyperClientError(\n `[HyperCore] Transport \"${transport.constructor.name}\" does not support listen() (server role).`,\n );\n }\n\n let resolved = this.registry.get(options.protocol);\n if (!resolved) {\n resolved = await resolveProtocol(options.protocol);\n this.registerProtocol(resolved);\n }\n\n const receiver = resolved.receiver as\n | HyperReceiver<unknown, unknown, TransportRequest, TransportResponse, P>\n | undefined;\n if (!receiver) {\n throw new HyperClientError(\n `[HyperCore] Protocol \"${options.protocol}\" has no receiver (server role).`,\n );\n }\n\n const handler = options.handler as\n | ((request: unknown, ctx: ServerRequestContext) => unknown)\n | undefined;\n\n const onRequest = async (raw: TransportRequest): Promise<TransportResponse> => {\n const ctx = createServerRequestContext(raw);\n const request = await receiver.receive(raw, ctx);\n const response = handler ? await handler(request, ctx) : await receiver.handle(request, ctx);\n return receiver.respond(response, ctx);\n };\n\n const server = await transport.listen!({\n host: options.host,\n port: options.port,\n signal: options.signal,\n onRequest,\n });\n\n if (this.isDestroyed) {\n await server.close();\n throw new HyperClientError(\n \"[HyperCore] Core instance was destroyed while starting the server.\",\n );\n }\n\n this.servers.add(server);\n return server;\n }\n\n /**\n * @ru Регистрирует плагин. Пропускает отключённые плагины.\n * @en Registers a plugin. Skips disabled plugins.\n * @param plugin - The plugin instance to register.\n * @returns This instance for chaining.\n */\n /**\n * Creates a core asynchronously and resolves plugin module paths before construction.\n */\n public static async create(config: Partial<HyperClientOptions> = {}): Promise<HyperCore> {\n const plugins = config.plugins;\n if (!plugins?.some((plugin) => typeof plugin === \"string\")) {\n return new HyperCore(config);\n }\n\n const resolvedPlugins: HyperPlugin[] = [];\n for (const plugin of plugins) {\n if (typeof plugin !== \"string\") {\n resolvedPlugins.push(plugin);\n continue;\n }\n const module = await dynamicImport(plugin);\n const candidate = module.default ?? module.plugin;\n if (!candidate || typeof candidate !== \"object\") {\n throw new HyperClientError(\n `[HyperCore] Plugin module \"${plugin}\" must export a plugin object as default or \"plugin\".`,\n );\n }\n resolvedPlugins.push(candidate as HyperPlugin);\n }\n\n return new HyperCore({ ...config, plugins: resolvedPlugins });\n }\n\n public use(plugin: HyperPlugin): this {\n const enabled = plugin.enabled ? plugin.enabled(this.config) : true;\n if (!enabled) return this;\n\n plugin.setup?.(this.pluginCtx);\n this.plugins = [...this.plugins, plugin].sort(\n (a, b) => (PLUGIN_PHASE_ORDER[a.phase ?? \"\"] ?? 0) - (PLUGIN_PHASE_ORDER[b.phase ?? \"\"] ?? 0),\n );\n return this;\n }\n\n /**\n * @ru Создаёт новый экземпляр ядра с расширенной/переопределённой конфигурацией,\n * переиспользуя текущий транспорт.\n * @en Creates a new core instance with extended/overridden configuration,\n * reusing the current transport.\n * @param options - Partial configuration overrides.\n * @returns A new IHyperCore instance.\n */\n public extend(options: Partial<HyperClientOptions>): IHyperCore {\n const transport = options.customTransport ?? this.fixedTransport ?? undefined;\n const sharedTransports = options.customTransport ? undefined : this.transportPromises;\n return new HyperCore({ ...this.config, ...options }, transport, sharedTransports);\n }\n\n /**\n * @ru Создаёт полностью независимый экземпляр ядра на основе текущей\n * конфигурации: не переиспользует текущий транспорт и по умолчанию не\n * наследует `customTransport`.\n * @en Creates a fully independent core instance based on the current config:\n * it does not reuse the current transport and does not inherit\n * `customTransport` by default.\n * @param options - Partial configuration overrides.\n * @returns A new IHyperCore instance.\n */\n public create(options: Partial<HyperClientOptions>): IHyperCore {\n const base: Partial<HyperClientOptions> = { ...this.config };\n delete base.customTransport;\n return new HyperCore({ ...base, ...options });\n }\n\n /**\n * @ru Завершает работу ядра и освобождает ресурсы: закрывает активные серверы,\n * затем освобождает удержание транспорта. Graceful-дренирование активных запросов\n * определяется реализацией `TransportServer.close()`.\n * @en Shuts down the core and releases resources: closes active servers, then\n * releases the transport hold. Graceful draining of in-flight requests is defined\n * by the `TransportServer.close()` implementation.\n * @param graceful - If true, prefers `transport.close()`; otherwise prefers `transport.destroy()`.\n * @returns Promise that resolves when shutdown is complete.\n */\n public destroy(graceful = true): Promise<void> {\n if (!this.destroyPromise) {\n this.destroyPromise = this.performDestroy(graceful);\n }\n return this.destroyPromise;\n }\n\n private async performDestroy(graceful: boolean): Promise<void> {\n this.isDestroyed = true;\n\n for (const server of this.servers) {\n try {\n await server.close();\n } catch {\n // Continue releasing the remaining resources.\n }\n }\n this.servers.clear();\n\n await Promise.allSettled(this.transportPromises.values());\n this.transportPromises.clear();\n this.transports.clear();\n\n const transports = [...this.retainedTransports];\n this.retainedTransports.clear();\n\n for (const transport of transports) {\n if (releaseTransport(transport) > 0) continue;\n\n evictCachedTransport(transport);\n\n if (graceful && typeof transport.close === \"function\") {\n await transport.close();\n } else if (typeof transport.destroy === \"function\") {\n await transport.destroy();\n } else if (typeof transport.close === \"function\") {\n await transport.close();\n }\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["dynamicImport", "defaultCoreConfig", "KNOWN_PROTOCOLS", "resolveProtocol", "evictCachedTransport", "resolveTransport", "HyperClientError", "requestCounter", "requestIdBase", "PLUGIN_PHASE_ORDER", "createRequestId", "transportRefs", "retainTransport", "transport", "releaseTransport", "next", "DefaultRequestContext", "signal", "value", "createRequestContext", "req", "createServerRequestContext", "raw", "isUniversalResponse", "DefaultProtocolRegistry", "protocol", "config", "sharedTransportPromises", "sharedPromise", "sharedTransport", "protocols", "i", "senders", "customSender", "receivers", "plugins", "plugin", "namespaces", "resolved", "sender", "receiver", "ctor", "protocolName", "methods", "namespace", "name", "method", "boundMethod", "args", "existing", "handler", "_target", "ctx", "currentReq", "response", "result", "err", "recovered", "initialResponse", "customOnError", "handlerError", "level", "message", "meta", "pending", "tracked", "prepared", "options", "onRequest", "request", "server", "resolvedPlugins", "module", "candidate", "a", "b", "sharedTransports", "base", "graceful", "transports"]
|
|
7
7
|
}
|
package/README.md
CHANGED
|
@@ -67,9 +67,9 @@ npm install @hyperttp/core @hyperttp/types
|
|
|
67
67
|
```
|
|
68
68
|
|
|
69
69
|
Compatible optimized transports can be installed separately. Ensure the selected transport release
|
|
70
|
-
declares compatibility with `@hyperttp/types@^0.
|
|
71
|
-
contracts and cannot be installed alongside core 2.0. Without an optional transport package,
|
|
72
|
-
core uses its built-in `FetchTransport` fallback.
|
|
70
|
+
declares compatibility with `@hyperttp/types@^0.4.2`; older transport releases target incompatible
|
|
71
|
+
type contracts and cannot be installed alongside core 2.0. Without an optional transport package,
|
|
72
|
+
the core uses its built-in `FetchTransport` fallback.
|
|
73
73
|
|
|
74
74
|
## Client quick start
|
|
75
75
|
|
package/defaultConfig.d.ts
CHANGED
|
@@ -4,9 +4,4 @@ import type { HyperClientOptions } from "@hyperttp/types";
|
|
|
4
4
|
* @en Default configuration for the universal core.
|
|
5
5
|
*/
|
|
6
6
|
export declare const defaultCoreConfig: HyperClientOptions;
|
|
7
|
-
/**
|
|
8
|
-
* @ru HTTP-конфигурация по умолчанию для HttpSender.
|
|
9
|
-
* @en Default HTTP configuration for the HttpSender.
|
|
10
|
-
*/
|
|
11
|
-
export declare const defaultHttpConfig: HyperClientOptions;
|
|
12
7
|
//# sourceMappingURL=defaultConfig.d.ts.map
|
package/defaultConfig.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,kBAQ/B,CAAC
|
|
1
|
+
{"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,kBAQ/B,CAAC"}
|
package/defaultConfig.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";export const defaultCoreConfig={retry:{maxRetries:0,baseDelay:100,maxDelay:5e3,jitter:!0},verbose:!1}
|
|
1
|
+
"use strict";export const defaultCoreConfig={retry:{maxRetries:0,baseDelay:100,maxDelay:5e3,jitter:!0},verbose:!1};
|
|
2
2
|
//# sourceMappingURL=defaultConfig.js.map
|
package/defaultConfig.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/defaultConfig.ts"],
|
|
4
|
-
"sourcesContent": ["import type { HyperClientOptions } from \"@hyperttp/types\";\n\n/**\n * @ru Конфигурация по умолчанию универсального ядра.\n * @en Default configuration for the universal core.\n */\nexport const defaultCoreConfig: HyperClientOptions = {\n retry: {\n maxRetries: 0,\n baseDelay: 100,\n maxDelay: 5000,\n jitter: true,\n },\n verbose: false,\n};\n
|
|
5
|
-
"mappings": "aAMO,aAAM,kBAAwC,CACnD,MAAO,CACL,WAAY,EACZ,UAAW,IACX,SAAU,IACV,OAAQ,IAEV,QAAS
|
|
4
|
+
"sourcesContent": ["import type { HyperClientOptions } from \"@hyperttp/types\";\n\n/**\n * @ru Конфигурация по умолчанию универсального ядра.\n * @en Default configuration for the universal core.\n */\nexport const defaultCoreConfig: HyperClientOptions = {\n retry: {\n maxRetries: 0,\n baseDelay: 100,\n maxDelay: 5000,\n jitter: true,\n },\n verbose: false,\n};\n"],
|
|
5
|
+
"mappings": "aAMO,aAAM,kBAAwC,CACnD,MAAO,CACL,WAAY,EACZ,UAAW,IACX,SAAU,IACV,OAAQ,IAEV,QAAS",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperttp/core",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "Protocol-agnostic client/server execution core with pluggable protocols, transports and client policies",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"browser",
|
|
@@ -46,11 +46,11 @@
|
|
|
46
46
|
}
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
|
-
"@hyperttp/types": "^0.
|
|
49
|
+
"@hyperttp/types": "^0.4.2"
|
|
50
50
|
},
|
|
51
51
|
"engines": {
|
|
52
52
|
"node": ">=20"
|
|
53
53
|
},
|
|
54
|
-
"packageManager": "bun@1.
|
|
54
|
+
"packageManager": "bun@1.4.0",
|
|
55
55
|
"private": false
|
|
56
56
|
}
|
package/protocols/manager.d.ts
CHANGED
|
@@ -27,5 +27,11 @@ export declare function resolveSender<P extends SenderProtocol>(protocol: P, opt
|
|
|
27
27
|
export declare function resolveReceiver<P extends SenderProtocol>(protocol: P, options?: {
|
|
28
28
|
[key: string]: unknown;
|
|
29
29
|
}): Promise<HyperReceiver<unknown, unknown, unknown, unknown, P>>;
|
|
30
|
+
/**
|
|
31
|
+
* @ru Очищает кэш загруженных модулей протоколов. Не выгружает уже импортированные
|
|
32
|
+
* JavaScript-модули из runtime.
|
|
33
|
+
* @en Clears the loaded protocol-module cache. It does not unload JavaScript
|
|
34
|
+
* modules already imported by the runtime.
|
|
35
|
+
*/
|
|
30
36
|
export declare function resetCachedProtocols(): void;
|
|
31
37
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -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;
|
|
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"}
|
package/protocols/manager.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";import{HyperClientError as a}from"../utils/errors.js";import{
|
|
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()}
|
|
2
2
|
//# sourceMappingURL=manager.js.map
|
package/protocols/manager.js.map
CHANGED
|
@@ -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 { RestProtocol } from \"./rest/index.js\";\n\ntype ProtocolDef = {\n readonly protocol: SenderProtocol;\n readonly pkg: string;\n readonly export: string;\n
|
|
5
|
-
"mappings": "aACA,OAAS,oBAAAA,MAAwB,qBACjC,OAAS,gBAAAC,MAAoB,
|
|
6
|
-
"names": ["HyperClientError", "
|
|
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",
|
|
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,9 +1,10 @@
|
|
|
1
1
|
import type { HyperProtocol } from "@hyperttp/types";
|
|
2
|
+
import type { RestInput, RestServerInput, RestServerResponse } from "./type.js";
|
|
2
3
|
/**
|
|
3
4
|
* @ru Единый REST-модуль протокола, объединяющий клиентский сендер и серверный ресивер.
|
|
4
5
|
* @en Unified REST protocol module combining a client sender and a server receiver.
|
|
5
6
|
*/
|
|
6
|
-
export declare const RestProtocol: HyperProtocol
|
|
7
|
+
export declare const RestProtocol: HyperProtocol<RestInput, unknown, RestServerInput, RestServerResponse, "rest">;
|
|
7
8
|
export { RestReceiver } from "./receiver.js";
|
|
8
9
|
export { RestSender } from "./sender.js";
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +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;
|
|
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;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAIhF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,aAAa,CACtC,SAAS,EACT,OAAO,EACP,eAAe,EACf,kBAAkB,EAClB,MAAM,CAMP,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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": "
|
|
4
|
+
"sourcesContent": ["import type { HyperProtocol } from \"@hyperttp/types\";\nimport type { RestInput, RestServerInput, RestServerResponse } from \"./type.js\";\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 RestInput,\n unknown,\n RestServerInput,\n RestServerResponse,\n \"rest\"\n> = {\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": "aAEA,OAAS,gBAAAA,MAAoB,gBAC7B,OAAS,cAAAC,MAAkB,cAMpB,aAAM,aAMT,CACF,SAAU,OACV,KAAM,eACN,OAAQ,IAAIA,EACZ,SAAU,IAAID,GAGhB,OAAS,iBAAoB,gBAC7B,OAAS,eAAkB",
|
|
6
6
|
"names": ["RestReceiver", "RestSender"]
|
|
7
7
|
}
|
|
@@ -9,6 +9,11 @@ import type { RestServerHandler, RestServerInput, RestServerResponse } from "./t
|
|
|
9
9
|
export declare class RestReceiver implements HyperReceiver<RestServerInput, RestServerResponse, TransportRequest, TransportResponse> {
|
|
10
10
|
readonly protocol = "rest";
|
|
11
11
|
protected readonly handler?: RestServerHandler;
|
|
12
|
+
/**
|
|
13
|
+
* @ru Создаёт REST-ресивер с необязательным application handler.
|
|
14
|
+
* @en Creates a REST receiver with an optional application handler.
|
|
15
|
+
* @param options - Настройки ресивера и его обработчик. @en Receiver settings and its handler.
|
|
16
|
+
*/
|
|
12
17
|
constructor(options?: {
|
|
13
18
|
handler?: RestServerHandler;
|
|
14
19
|
});
|
|
@@ -1 +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;
|
|
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;AAoFxF;;;;;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;;;;OAIG;IACH,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"}
|