@hyperttp/core 2.0.3 → 2.0.4

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.
@@ -21,6 +21,8 @@ export declare class HyperCore implements IHyperCore {
21
21
  private readonly generatedFlatMethods;
22
22
  private readonly transportPromises;
23
23
  private readonly transports;
24
+ private readonly listenTransportPromises;
25
+ private readonly listenTransports;
24
26
  private readonly retainedTransports;
25
27
  private readonly fixedTransport;
26
28
  private destroyPromise;
@@ -1 +1 @@
1
- {"version":3,"file":"HyperCore.d.ts","sourceRoot":"","sources":["../../src/Core/HyperCore.ts"],"names":[],"mappings":"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"}
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{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 H(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 N(h){return new R(h.signal)}function E(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 O{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 O;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 s=this.config.protocols;if(s)for(let a=0;a<s.length;a++)this.registerProtocol(s[a]);const o=this.config.senders;if(o)for(let a=0;a<o.length;a++)this.registerSender(o[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 o=e.sender?.methods;if(o&&typeof o=="object"){const n=Object.create(null);for(const i in o){if(!Object.hasOwn(o,i))continue;const c=o[i];if(typeof c!="function")continue;const l=(...a)=>c.apply(o,[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,s)=>{if(!(typeof s!="string"||s==="then"))return(...o)=>this.dispatchLazyMethod(e,s,o)}};return new Proxy({},t)}async dispatchLazyMethod(e,t,r){let s=this.registry.get(e);s||(s=await g(e),this.registerProtocol(s));const o=s.sender;if(!o)throw new p(`[HyperCore] Protocol "${e}" has no sender (client role).`);const n=o.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=N(e),r=this.plugins;let s=e;if(r.length===0){const o=this.registry.get(e.protocol)?.sender;if(o)return this.runSender(o,e,t)}try{let o;for(let n=0;n<r.length;n++){const i=r[n];if(typeof i.onRequest!="function")continue;const c=await i.onRequest(s,this.pluginCtx,t);if(c!=null){if(y(c)){o=c;break}s=c,t.signal=s.signal}}if(!o){const n=await this.resolveRequestSender(s.protocol);o=await this.runSender(n,s,t)}return await this.runResponseHooks(o,s,t,r)}catch(o){for(let n=0;n<r.length;n++){const i=r[n];if(typeof i.onError!="function")continue;const c=await i.onError(o,s,this.pluginCtx,t);if(c!=null&&y(c))return c}throw o}}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,s){let o=e;for(let n=0;n<s.length;n++){const i=s[n];if(typeof i.onResponse!="function")continue;if(i.mode==="background"){Promise.resolve().then(()=>i.onResponse(o,t,this.pluginCtx,r)).catch(l=>this.reportBackgroundPluginError(l));continue}const c=await i.onResponse(o,t,this.pluginCtx,r);c!=null&&y(c)&&(o=c)}return o}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 o;o=r.catch(n=>{throw this.transportPromises.get(e)===o&&this.transportPromises.delete(e),n}),this.transportPromises.set(e,o),r=o}const s=await r;if(this.isDestroyed)throw new p("[HyperCore] Core instance was destroyed while resolving transport.");return s}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 s=this.transports.get(t.protocol)??await this.acquireTransport(t.protocol),o=e.prepare(t,r),n=await e.send(o,s,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 s=r.receiver;if(!s)throw new p(`[HyperCore] Protocol "${e.protocol}" has no receiver (server role).`);const o=e.handler,n=async c=>{const l=E(c),a=await s.receive(c,l),u=o?await o(a,l):await s.handle(a,l);return s.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(s=>typeof s=="string"))return new HyperCore(e);const r=[];for(const s of t){if(typeof s!="string"){r.push(s);continue}const o=await S(s),n=o.default??o.plugin;if(!n||typeof n!="object")throw new p(`[HyperCore] Plugin module "${s}" 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,s)=>(v[r.phase??""]??0)-(v[s.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)if(!(H(r)>0)){b(r);try{e&&typeof r.close=="function"?await r.close():typeof r.destroy=="function"?await r.destroy():typeof r.close=="function"&&await r.close()}catch(s){this.log("error","[HyperCore] Error closing transport during destroy",s)}}}}
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 d}from"../protocols/manager.js";import{evictCachedTransport as x,resolveTransport as b}from"../transports/manager.js";import{HyperClientError as p}from"../utils/errors.js";let g=0,P=Date.now().toString(36)+"-";const T=Object.freeze({START:0,PREPARE:1,CONTROL:2,FORMAT:3,NETWORK:4,DATA:5});function H(){return g=g+1>>>0,g===0&&(P=Date.now().toString(36)+"-"),P+(g>>>0).toString(36)}const f=new WeakMap;function v(l){f.set(l,(f.get(l)??0)+1)}function M(l){const t=(f.get(l)??1)-1;return t<=0?f.delete(l):f.set(l,t),t}class R{requestId=H();startTime=performance.now();signal;requestMeta;requestState;constructor(t){this.signal=t}get meta(){return this.requestMeta??={}}set meta(t){this.requestMeta=t}get state(){return this.requestState??={}}set state(t){this.requestState=t}}function N(l){return new R(l.signal)}function q(l){return new R(l.signal)}function y(l){return typeof l=="object"&&l!==null&&"data"in l&&"status"in l&&!("input"in l)}class E{protocols=new Map;register(t){this.protocols.set(t.protocol,t)}get(t){return this.protocols.get(t)}has(t){return this.protocols.has(t)}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;listenTransportPromises=new Map;listenTransports=new Map;retainedTransports=new Set;fixedTransport;destroyPromise=null;isDestroyed=!1;constructor(t={},e,r){if(this.config={...w,...t,retry:{...w.retry,...t.retry}},this.fixedTransport=e??null,e&&(v(e),this.retainedTransports.add(e)),r)for(const[c,u]of r)this.transportPromises.set(c,u.then(C=>this.retainResolvedTransport(c,C)));this.pluginCtx={config:this.config,core:this};const s=this.config.protocols;if(s)for(let c=0;c<s.length;c++)this.registerProtocol(s[c]);const o=this.config.senders;if(o)for(let c=0;c<o.length;c++)this.registerSender(o[c]);const n=this.config.customSender;n&&this.registerSender(n);const i=this.config.receivers;if(i)for(let c=0;c<i.length;c++)this.registerReceiver(i[c]);const a=this.config.plugins;if(a)for(let c=0;c<a.length;c++){const u=a[c];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 h=this;for(let c=0;c<m.length;c++){const u=m[c];!this.registry.has(u)&&h[u]===void 0&&(h[u]=this.createLazyNamespace(u),this.protocolNamespaces.add(u))}}getProtocol(t){return this.registry.get(t)}getSender(t){return this.registry.get(t)?.sender}getReceiver(t){return this.registry.get(t)?.receiver}async getTransportName(){return(await this.acquireTransport()).constructor.name}async getSenderName(t="rest"){let e=this.registry.get(t);e||(e=await d(t),this.registerProtocol(e));const r=e.sender;if(!r)throw new p(`[HyperCore] Protocol "${t}" has no sender (client role).`);return r.constructor.name}async getReceiverName(t="rest"){let e=this.registry.get(t);e||(e=await d(t),this.registerProtocol(e));const r=e.receiver;if(!r)throw new p(`[HyperCore] Protocol "${t}" has no receiver (server role).`);return r.constructor.name}async getProtocolName(t="rest"){let e=this.registry.get(t);if(e||(e=await d(t),this.registerProtocol(e)),e.name)return e.name;const r=e.constructor;return r&&r.name&&r.name!=="Object"?r.name:String(e.protocol)}registerProtocol(t){const e=String(t.protocol),r=this;if(e==="__proto__"||e==="prototype"||e==="constructor"||e in HyperCore.prototype||e in this&&!this.protocolNamespaces.has(e))throw new p(`[HyperCore] Protocol name "${e}" conflicts with the core API.`);this.registry.register(t);const o=t.sender?.methods;if(o&&typeof o=="object"){const n=Object.create(null);for(const i in o){if(!Object.hasOwn(o,i))continue;const a=o[i];if(typeof a!="function")continue;const h=(...c)=>a.apply(o,[this,...c]);n[i]=h,this.generatedFlatMethods.has(i)?r[i]=h:!(i in HyperCore.prototype)&&!(i in this)&&(r[i]=h,this.generatedFlatMethods.add(i))}r[e]=n,this.protocolNamespaces.add(e)}return this}registerSender(t){const e=this.registry.get(t.protocol);return this.registerProtocol({protocol:t.protocol,sender:t,receiver:e?.receiver})}registerReceiver(t){const e=this.registry.get(t.protocol);return this.registerProtocol({protocol:t.protocol,sender:e?.sender,receiver:t})}createLazyNamespace(t){const e={get:(r,s)=>{if(!(typeof s!="string"||s==="then"))return(...o)=>this.dispatchLazyMethod(t,s,o)}};return new Proxy({},e)}async dispatchLazyMethod(t,e,r){let s=this.registry.get(t);s||(s=await d(t),this.registerProtocol(s));const o=s.sender;if(!o)throw new p(`[HyperCore] Protocol "${t}" has no sender (client role).`);const n=o.methods,i=n?.[e];if(typeof i!="function")throw new TypeError(`[HyperCore] Protocol "${t}" has no method "${e}".`);return i.apply(n,[this,...r])}async send(t){const e=N(t),r=this.plugins;let s=t;if(r.length===0){const o=this.registry.get(t.protocol)?.sender;if(o)return this.runSender(o,t,e)}try{let o;for(let n=0;n<r.length;n++){const i=r[n];if(typeof i.onRequest!="function")continue;const a=await i.onRequest(s,this.pluginCtx,e);if(a!=null){if(y(a)){o=a;break}s=a,e.signal=s.signal}}if(!o){const n=await this.resolveRequestSender(s.protocol);o=await this.runSender(n,s,e)}return await this.runResponseHooks(o,s,e,r)}catch(o){for(let n=0;n<r.length;n++){const i=r[n];if(typeof i.onError!="function")continue;const a=await i.onError(o,s,this.pluginCtx,e);if(a!=null&&y(a))return a}throw o}}async resolveRequestSender(t){let e=this.registry.get(t);e||(e=await d(t),this.registerProtocol(e));const r=e.sender;if(!r)throw new p(`[HyperCore] Protocol "${t}" has no sender (client role).`);return r}async runResponseHooks(t,e,r,s){let o=t;for(let n=0;n<s.length;n++){const i=s[n];if(typeof i.onResponse!="function")continue;if(i.mode==="background"){Promise.resolve().then(()=>i.onResponse(o,e,this.pluginCtx,r)).catch(h=>this.reportBackgroundPluginError(h));continue}const a=await i.onResponse(o,e,this.pluginCtx,r);a!=null&&y(a)&&(o=a)}return o}reportBackgroundPluginError(t){const e=this.config.onError;if(typeof e=="function")try{e(t);return}catch(r){this.log("error","[HyperCore] Background error handler failed",r)}this.log("error","[HyperCore] Background plugin error",t)}log(t,e,r){if(this.config.logger){this.config.logger(t,e,r);return}if(!this.config.verbose&&t!=="error")return;(t==="debug"?console.debug:console[t])(e,r)}async acquireTransport(t="rest",e=!1){if(this.isDestroyed)throw new p("[HyperCore] Cannot acquire transport on a destroyed core instance.");const r=e?this.listenTransports:this.transports,s=e?this.listenTransportPromises:this.transportPromises,o=r.get(t);if(o)return o;let n=s.get(t);if(!n){n=this.resolveAndRetainTransport(t,e);let a;a=n.catch(h=>{throw s.get(t)===a&&s.delete(t),h}),s.set(t,a),n=a}const i=await n;if(this.isDestroyed)throw new p("[HyperCore] Core instance was destroyed while resolving transport.");return i}async resolveAndRetainTransport(t,e=!1){const r=this.fixedTransport&&(!e||typeof this.fixedTransport.listen=="function")?this.fixedTransport:await b(t,{customTransport:this.fixedTransport??this.config.customTransport,requireListen:e,logger:this.config.logger,verbose:this.config.verbose});if(!(typeof r.supports=="function"?r.supports(t):r.protocols?.includes(t)??!0))throw new p(`[HyperCore] Transport "${r.constructor.name}" does not support protocol "${t}".`);return this.retainResolvedTransport(t,r,e)}retainResolvedTransport(t,e,r=!1){return this.retainedTransports.has(e)||(v(e),this.retainedTransports.add(e)),(r?this.listenTransports:this.transports).set(t,e),e}async runSender(t,e,r){const s=this.transports.get(e.protocol)??await this.acquireTransport(e.protocol),o=t.prepare(e,r),n=await t.send(o,s,r);return t.parse(n,r)}async listen(t){const e=await this.acquireTransport(t.protocol,!0);if(typeof e.listen!="function")throw new p(`[HyperCore] Transport "${e.constructor.name}" does not support listen() (server role).`);let r=this.registry.get(t.protocol);r||(r=await d(t.protocol),this.registerProtocol(r));const s=r.receiver;if(!s)throw new p(`[HyperCore] Protocol "${t.protocol}" has no receiver (server role).`);const o=t.handler,n=async a=>{const h=q(a),c=await s.receive(a,h),u=o?await o(c,h):await s.handle(c,h);return s.respond(u,h)},i=await e.listen({host:t.host,port:t.port,signal:t.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(t={}){const e=t.plugins;if(!e?.some(s=>typeof s=="string"))return new HyperCore(t);const r=[];for(const s of e){if(typeof s!="string"){r.push(s);continue}const o=await S(s),n=o.default??o.plugin;if(!n||typeof n!="object")throw new p(`[HyperCore] Plugin module "${s}" must export a plugin object as default or "plugin".`);r.push(n)}return new HyperCore({...t,plugins:r})}use(t){return(t.enabled?t.enabled(this.config):!0)?(t.setup?.(this.pluginCtx),this.plugins=[...this.plugins,t].sort((r,s)=>(T[r.phase??""]??0)-(T[s.phase??""]??0)),this):this}extend(t){const e=t.customTransport??this.fixedTransport??void 0,r=t.customTransport?void 0:this.transportPromises;return new HyperCore({...this.config,...t},e,r)}create(t){const e={...this.config};return delete e.customTransport,new HyperCore({...e,...t})}destroy(t=!0){return this.destroyPromise||(this.destroyPromise=this.performDestroy(t)),this.destroyPromise}async performDestroy(t){this.isDestroyed=!0;for(const r of this.servers)try{await r.close()}catch{}this.servers.clear(),await Promise.allSettled([...this.transportPromises.values(),...this.listenTransportPromises.values()]),this.transportPromises.clear(),this.transports.clear(),this.listenTransportPromises.clear(),this.listenTransports.clear();const e=[...this.retainedTransports];this.retainedTransports.clear();for(const r of e)if(!(M(r)>0)){x(r);try{t&&typeof r.close=="function"?await r.close():typeof r.destroy=="function"?await r.destroy():typeof r.close=="function"&&await r.close()}catch(s){this.log("error","[HyperCore] Error closing transport during destroy",s)}}}}
2
2
  //# sourceMappingURL=HyperCore.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/Core/HyperCore.ts"],
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 try {\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 } catch (err) {\n this.log(\"error\", \"[HyperCore] Error closing transport during destroy\", err);\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"]
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 listenTransportPromises = new Map<SenderProtocol, Promise<HyperTransport>>();\n private readonly listenTransports = 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(\n protocol: SenderProtocol = \"rest\",\n requireListen = false,\n ): 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 transports = requireListen ? this.listenTransports : this.transports;\n const transportPromises = requireListen ? this.listenTransportPromises : this.transportPromises;\n const existing = transports.get(protocol);\n if (existing) return existing;\n\n let pending = transportPromises.get(protocol);\n if (!pending) {\n pending = this.resolveAndRetainTransport(protocol, requireListen);\n let tracked!: Promise<HyperTransport>;\n tracked = pending.catch((err: unknown) => {\n if (transportPromises.get(protocol) === tracked) {\n transportPromises.delete(protocol);\n }\n throw err;\n });\n 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(\n protocol: SenderProtocol,\n requireListen = false,\n ): Promise<HyperTransport> {\n const transport =\n this.fixedTransport && (!requireListen || typeof this.fixedTransport.listen === \"function\")\n ? this.fixedTransport\n : await resolveTransport(protocol, {\n customTransport: this.fixedTransport ?? this.config.customTransport,\n requireListen,\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, requireListen);\n }\n\n private retainResolvedTransport(\n protocol: SenderProtocol,\n transport: HyperTransport,\n requireListen = false,\n ): HyperTransport {\n if (!this.retainedTransports.has(transport)) {\n retainTransport(transport);\n this.retainedTransports.add(transport);\n }\n\n (requireListen ? this.listenTransports : 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, true);\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([\n ...this.transportPromises.values(),\n ...this.listenTransportPromises.values(),\n ]);\n this.transportPromises.clear();\n this.transports.clear();\n this.listenTransportPromises.clear();\n this.listenTransports.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 try {\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 } catch (err) {\n this.log(\"error\", \"[HyperCore] Error closing transport during destroy\", err);\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", "requireListen", "transports", "transportPromises", "pending", "tracked", "prepared", "options", "onRequest", "request", "server", "resolvedPlugins", "module", "candidate", "a", "b", "sharedTransports", "base", "graceful"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperttp/core",
3
- "version": "2.0.3",
3
+ "version": "2.0.4",
4
4
  "description": "Protocol-agnostic client/server execution core with pluggable protocols, transports and client policies",
5
5
  "keywords": [
6
6
  "browser",
@@ -6,6 +6,13 @@ export type Runtime = "bun" | "node" | "deno" | "browser";
6
6
  */
7
7
  export interface ResolveTransportOptions {
8
8
  customTransport?: HyperTransport;
9
+ /**
10
+ * @ru Требует серверную роль транспорта. При её отсутствии используется
11
+ * встроенный `FetchTransport`.
12
+ * @en Requires the transport server role. When unavailable, the built-in
13
+ * `FetchTransport` is used.
14
+ */
15
+ requireListen?: boolean;
9
16
  logger?: (level: LogLevel, message: string, meta?: unknown) => void;
10
17
  verbose?: boolean;
11
18
  [key: string]: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/transports/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOhF,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,EAAE,OAK1B,CAAC;AA8EL;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,GAAE,cAAuB,EACjC,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,cAAc,CAAC,CA0BzB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,cAAuB,GAAG,cAAc,GAAG,SAAS,CAEhG;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/transports/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOhF,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,EAAE,OAK1B,CAAC;AAgGL;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,GAAE,cAAuB,EACjC,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,cAAc,CAAC,CAkCzB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,cAAuB,GAAG,cAAc,GAAG,SAAS,CAEhG;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C"}
@@ -1,2 +1,2 @@
1
- "use strict";import{FetchTransport as y}from"./fetch.js";import{dynamicImport as T,isModuleNotFoundError as h}from"../utils/modules.js";export const CURRENT_RUNTIME=typeof Bun<"u"?"bun":typeof Deno<"u"?"deno":typeof process<"u"&&process.versions?.node?"node":"browser";const m=[{runtime:["bun"],pkg:"@hyperttp/transport-bun",export:"BunTransport"},{runtime:["node"],pkg:"@hyperttp/transport-undici",export:"UndiciTransport"},{runtime:["deno"],pkg:"@hyperttp/transport-deno",export:"DenoTransport"}],d=m.filter(t=>t.runtime.includes(CURRENT_RUNTIME)),n=new Map,u=new Map;function c(t,e){return typeof t.supports=="function"?t.supports(e):t.protocols?.includes(e)??!0}async function l(t){try{typeof t.destroy=="function"?await t.destroy():typeof t.close=="function"&&await t.close()}catch{}}async function w(t,e){for(let s=0;s<d.length;s++){const a=d[s];try{const i=await T(a.pkg),f=i[a.export]??i.default;if(typeof f!="function")continue;const p=new f(e??{});if(!c(p,t)){await l(p);continue}return p}catch(i){if(!h(i))throw i}}const r=`[HyperCore] Fast transport (e.g. @hyperttp/transport-undici) unavailable for runtime "${CURRENT_RUNTIME}". Falling back to slow FetchTransport.`;e?.logger?e.logger("warn",r):e?.verbose&&console.warn(r);const o=new y(e);if(c(o,t))return o;throw await l(o),new Error(`[HyperCore] No transport available for protocol "${t}" in runtime "${CURRENT_RUNTIME}".`)}export async function resolveTransport(t="rest",e){if(e?.customTransport){if(!c(e.customTransport,t))throw new Error(`[HyperCore] Custom transport does not support protocol "${t}".`);return n.set(t,e.customTransport),e.customTransport}const r=n.get(t);if(r)return r;const o=u.get(t);if(o)return o;const s=w(t,e).then(a=>(n.set(t,a),a)).finally(()=>{u.delete(t)});return u.set(t,s),s}export function getCachedTransport(t="rest"){return n.get(t)}export function evictCachedTransport(t){for(const[e,r]of n)r===t&&n.delete(e)}export function resetCachedTransport(){n.clear(),u.clear()}
1
+ "use strict";import{FetchTransport as h}from"./fetch.js";import{dynamicImport as T,isModuleNotFoundError as m}from"../utils/modules.js";export const CURRENT_RUNTIME=typeof Bun<"u"?"bun":typeof Deno<"u"?"deno":typeof process<"u"&&process.versions?.node?"node":"browser";const w=[{runtime:["bun"],pkg:"@hyperttp/transport-bun",export:"BunTransport"},{runtime:["node"],pkg:"@hyperttp/transport-undici",export:"UndiciTransport"},{runtime:["deno"],pkg:"@hyperttp/transport-deno",export:"DenoTransport"}],f=w.filter(t=>t.runtime.includes(CURRENT_RUNTIME)),i=new Map,p=new Map;function C(t,e=!1){return e?`${t}:listen`:t}function d(t){return typeof t.listen=="function"}function c(t,e){return typeof t.supports=="function"?t.supports(e):t.protocols?.includes(e)??!0}async function l(t){try{typeof t.destroy=="function"?await t.destroy():typeof t.close=="function"&&await t.close()}catch{}}async function y(t,e){const r=new h(e);if(c(r,t))return r;throw await l(r),new Error(`[HyperCore] No transport available for protocol "${t}" in runtime "${CURRENT_RUNTIME}".`)}async function x(t,e){for(let n=0;n<f.length;n++){const a=f[n];try{const s=await T(a.pkg),u=s[a.export]??s.default;if(typeof u!="function")continue;const o=new u(e??{});if(!c(o,t)||e?.requireListen&&!d(o)){await l(o);continue}return o}catch(s){if(!m(s))throw s}}const r=`[HyperCore] Fast transport (e.g. @hyperttp/transport-undici) unavailable or missing listen() for runtime "${CURRENT_RUNTIME}". Falling back to slow FetchTransport.`;return e?.logger?e.logger("warn",r):e?.verbose&&console.warn(r),y(t,e)}export async function resolveTransport(t="rest",e){const r=e?.requireListen??!1,n=C(t,r);if(e?.customTransport){if(!c(e.customTransport,t))throw new Error(`[HyperCore] Custom transport does not support protocol "${t}".`);const o=r&&!d(e.customTransport)?await y(t,e):e.customTransport;return i.set(n,o),o}const a=i.get(n);if(a)return a;const s=p.get(n);if(s)return s;const u=x(t,e).then(o=>(i.set(n,o),o)).finally(()=>{p.delete(n)});return p.set(n,u),u}export function getCachedTransport(t="rest"){return i.get(t)}export function evictCachedTransport(t){for(const[e,r]of i)r===t&&i.delete(e)}export function resetCachedTransport(){i.clear(),p.clear()}
2
2
  //# sourceMappingURL=manager.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/transports/manager.ts"],
4
- "sourcesContent": ["import type { HyperTransport, LogLevel, SenderProtocol } from \"@hyperttp/types\";\nimport { FetchTransport, type FetchTransportOptions } from \"./fetch.js\";\nimport { dynamicImport, isModuleNotFoundError } from \"../utils/modules.js\";\n\ndeclare const Bun: unknown;\ndeclare const Deno: unknown;\n\nexport type Runtime = \"bun\" | \"node\" | \"deno\" | \"browser\";\n\n/**\n * @ru Опции разрешения транспорта. `customTransport` имеет приоритет над автовыбором.\n * @en Transport resolution options. `customTransport` takes priority over auto-selection.\n */\nexport interface ResolveTransportOptions {\n customTransport?: HyperTransport;\n logger?: (level: LogLevel, message: string, meta?: unknown) => void;\n verbose?: boolean;\n [key: string]: unknown;\n}\n\nexport const CURRENT_RUNTIME: Runtime = (() => {\n if (typeof Bun !== \"undefined\") return \"bun\";\n if (typeof Deno !== \"undefined\") return \"deno\";\n if (typeof process !== \"undefined\" && process.versions?.node) return \"node\";\n return \"browser\";\n})();\n\ntype TransportDef = {\n readonly runtime: readonly Runtime[];\n readonly pkg: string;\n readonly export: string;\n};\n\nconst TRANSPORT_DEFS: readonly TransportDef[] = [\n { runtime: [\"bun\"], pkg: \"@hyperttp/transport-bun\", export: \"BunTransport\" },\n { runtime: [\"node\"], pkg: \"@hyperttp/transport-undici\", export: \"UndiciTransport\" },\n { runtime: [\"deno\"], pkg: \"@hyperttp/transport-deno\", export: \"DenoTransport\" },\n];\n\nconst CANDIDATES = TRANSPORT_DEFS.filter((t) => t.runtime.includes(CURRENT_RUNTIME));\n\nconst transportCache = new Map<string, HyperTransport>();\nconst transportResolutions = new Map<string, Promise<HyperTransport>>();\n\nfunction supportsProtocol(transport: HyperTransport, protocol: SenderProtocol): boolean {\n return typeof transport.supports === \"function\"\n ? transport.supports(protocol)\n : (transport.protocols?.includes(protocol) ?? true);\n}\n\nasync function disposeUnusedTransport(transport: HyperTransport): Promise<void> {\n try {\n if (typeof transport.destroy === \"function\") {\n await transport.destroy();\n } else if (typeof transport.close === \"function\") {\n await transport.close();\n }\n } catch {\n //\n }\n}\n\nasync function createTransport(\n protocol: SenderProtocol,\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n for (let i = 0; i < CANDIDATES.length; i++) {\n const t = CANDIDATES[i]!;\n try {\n const mod = await dynamicImport(t.pkg);\n const candidate = (mod[t.export] ?? mod.default) as\n | { new (opts?: unknown): HyperTransport }\n | undefined;\n if (typeof candidate !== \"function\") continue;\n\n const instance = new candidate(config ?? {});\n if (!supportsProtocol(instance, protocol)) {\n await disposeUnusedTransport(instance);\n continue;\n }\n\n return instance;\n } catch (err) {\n if (!isModuleNotFoundError(err)) throw err;\n }\n }\n\n const message = `[HyperCore] Fast transport (e.g. @hyperttp/transport-undici) unavailable for runtime \"${CURRENT_RUNTIME}\". Falling back to slow FetchTransport.`;\n if (config?.logger) {\n config.logger(\"warn\", message);\n } else if (config?.verbose) {\n console.warn(message);\n }\n\n const fetchTransport = new FetchTransport(config as unknown as FetchTransportOptions);\n if (supportsProtocol(fetchTransport, protocol)) return fetchTransport;\n\n await disposeUnusedTransport(fetchTransport);\n throw new Error(\n `[HyperCore] No transport available for protocol \"${protocol}\" in runtime \"${CURRENT_RUNTIME}\".`,\n );\n}\n\n/**\n * @ru Разрешает оптимальный транспорт для указанного протокола и текущей среды.\n * Кастомный транспорт из конфигурации имеет приоритет над автовыбором.\n * @en Resolves optimal transport for the given protocol and current runtime.\n * A custom transport from the config takes priority over auto-selection.\n */\nexport async function resolveTransport(\n protocol: SenderProtocol = \"rest\",\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n if (config?.customTransport) {\n if (!supportsProtocol(config.customTransport, protocol)) {\n throw new Error(`[HyperCore] Custom transport does not support protocol \"${protocol}\".`);\n }\n transportCache.set(protocol, config.customTransport);\n return config.customTransport;\n }\n\n const cached = transportCache.get(protocol);\n if (cached) return cached;\n\n const pending = transportResolutions.get(protocol);\n if (pending) return pending;\n\n const resolution = createTransport(protocol, config)\n .then((transport) => {\n transportCache.set(protocol, transport);\n return transport;\n })\n .finally(() => {\n transportResolutions.delete(protocol);\n });\n\n transportResolutions.set(protocol, resolution);\n return resolution;\n}\n\n/**\n * @ru Синхронно возвращает транспорт из кэша без создания Promise.\n * @en Synchronously returns a cached transport without creating a Promise.\n * @param protocol - Протокол, для которого запрашивается транспорт. @en Protocol whose transport is requested.\n * @returns Кэшированный транспорт или `undefined`. @en Cached transport or `undefined`.\n */\nexport function getCachedTransport(protocol: SenderProtocol = \"rest\"): HyperTransport | undefined {\n return transportCache.get(protocol);\n}\n\n/**\n * @ru Удаляет все записи кэша, ссылающиеся на указанный транспорт.\n * @en Removes every cache entry that references the given transport.\n * @param transport - Экземпляр транспорта для удаления из кэша. @en Transport instance to evict from the cache.\n */\nexport function evictCachedTransport(transport: HyperTransport): void {\n for (const [protocol, cached] of transportCache) {\n if (cached === transport) {\n transportCache.delete(protocol);\n }\n }\n}\n\n/**\n * @ru Очищает кэш транспортов и ожидающих их разрешений. Не закрывает уже\n * созданные экземпляры транспорта.\n * @en Clears cached transports and pending resolutions. It does not close\n * already-created transport instances.\n */\nexport function resetCachedTransport(): void {\n transportCache.clear();\n transportResolutions.clear();\n}\n"],
5
- "mappings": "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",
6
- "names": ["FetchTransport", "dynamicImport", "isModuleNotFoundError", "TRANSPORT_DEFS", "CANDIDATES", "transportCache", "transportResolutions", "supportsProtocol", "transport", "protocol", "disposeUnusedTransport", "createTransport", "config", "i", "t", "mod", "candidate", "instance", "err", "message", "fetchTransport", "cached", "pending", "resolution"]
4
+ "sourcesContent": ["import type { HyperTransport, LogLevel, SenderProtocol } from \"@hyperttp/types\";\nimport { FetchTransport, type FetchTransportOptions } from \"./fetch.js\";\nimport { dynamicImport, isModuleNotFoundError } from \"../utils/modules.js\";\n\ndeclare const Bun: unknown;\ndeclare const Deno: unknown;\n\nexport type Runtime = \"bun\" | \"node\" | \"deno\" | \"browser\";\n\n/**\n * @ru Опции разрешения транспорта. `customTransport` имеет приоритет над автовыбором.\n * @en Transport resolution options. `customTransport` takes priority over auto-selection.\n */\nexport interface ResolveTransportOptions {\n customTransport?: HyperTransport;\n /**\n * @ru Требует серверную роль транспорта. При её отсутствии используется\n * встроенный `FetchTransport`.\n * @en Requires the transport server role. When unavailable, the built-in\n * `FetchTransport` is used.\n */\n requireListen?: boolean;\n logger?: (level: LogLevel, message: string, meta?: unknown) => void;\n verbose?: boolean;\n [key: string]: unknown;\n}\n\nexport const CURRENT_RUNTIME: Runtime = (() => {\n if (typeof Bun !== \"undefined\") return \"bun\";\n if (typeof Deno !== \"undefined\") return \"deno\";\n if (typeof process !== \"undefined\" && process.versions?.node) return \"node\";\n return \"browser\";\n})();\n\ntype TransportDef = {\n readonly runtime: readonly Runtime[];\n readonly pkg: string;\n readonly export: string;\n};\n\nconst TRANSPORT_DEFS: readonly TransportDef[] = [\n { runtime: [\"bun\"], pkg: \"@hyperttp/transport-bun\", export: \"BunTransport\" },\n { runtime: [\"node\"], pkg: \"@hyperttp/transport-undici\", export: \"UndiciTransport\" },\n { runtime: [\"deno\"], pkg: \"@hyperttp/transport-deno\", export: \"DenoTransport\" },\n];\n\nconst CANDIDATES = TRANSPORT_DEFS.filter((t) => t.runtime.includes(CURRENT_RUNTIME));\n\nconst transportCache = new Map<string, HyperTransport>();\nconst transportResolutions = new Map<string, Promise<HyperTransport>>();\n\nfunction getCacheKey(protocol: SenderProtocol, requireListen = false): string {\n return requireListen ? `${protocol}:listen` : protocol;\n}\n\nfunction supportsListen(transport: HyperTransport): boolean {\n return typeof transport.listen === \"function\";\n}\n\nfunction supportsProtocol(transport: HyperTransport, protocol: SenderProtocol): boolean {\n return typeof transport.supports === \"function\"\n ? transport.supports(protocol)\n : (transport.protocols?.includes(protocol) ?? true);\n}\n\nasync function disposeUnusedTransport(transport: HyperTransport): Promise<void> {\n try {\n if (typeof transport.destroy === \"function\") {\n await transport.destroy();\n } else if (typeof transport.close === \"function\") {\n await transport.close();\n }\n } catch {\n //\n }\n}\n\nasync function createFetchTransport(\n protocol: SenderProtocol,\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n const fetchTransport = new FetchTransport(config as unknown as FetchTransportOptions);\n if (supportsProtocol(fetchTransport, protocol)) return fetchTransport;\n\n await disposeUnusedTransport(fetchTransport);\n throw new Error(\n `[HyperCore] No transport available for protocol \"${protocol}\" in runtime \"${CURRENT_RUNTIME}\".`,\n );\n}\n\nasync function createTransport(\n protocol: SenderProtocol,\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n for (let i = 0; i < CANDIDATES.length; i++) {\n const t = CANDIDATES[i]!;\n try {\n const mod = await dynamicImport(t.pkg);\n const candidate = (mod[t.export] ?? mod.default) as\n | { new (opts?: unknown): HyperTransport }\n | undefined;\n if (typeof candidate !== \"function\") continue;\n\n const instance = new candidate(config ?? {});\n if (\n !supportsProtocol(instance, protocol) ||\n (config?.requireListen && !supportsListen(instance))\n ) {\n await disposeUnusedTransport(instance);\n continue;\n }\n\n return instance;\n } catch (err) {\n if (!isModuleNotFoundError(err)) throw err;\n }\n }\n\n const message = `[HyperCore] Fast transport (e.g. @hyperttp/transport-undici) unavailable or missing listen() for runtime \"${CURRENT_RUNTIME}\". Falling back to slow FetchTransport.`;\n if (config?.logger) {\n config.logger(\"warn\", message);\n } else if (config?.verbose) {\n console.warn(message);\n }\n\n return createFetchTransport(protocol, config);\n}\n\n/**\n * @ru Разрешает оптимальный транспорт для указанного протокола и текущей среды.\n * Кастомный транспорт из конфигурации имеет приоритет над автовыбором.\n * @en Resolves optimal transport for the given protocol and current runtime.\n * A custom transport from the config takes priority over auto-selection.\n */\nexport async function resolveTransport(\n protocol: SenderProtocol = \"rest\",\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n const requireListen = config?.requireListen ?? false;\n const cacheKey = getCacheKey(protocol, requireListen);\n\n if (config?.customTransport) {\n if (!supportsProtocol(config.customTransport, protocol)) {\n throw new Error(`[HyperCore] Custom transport does not support protocol \"${protocol}\".`);\n }\n\n const transport =\n requireListen && !supportsListen(config.customTransport)\n ? await createFetchTransport(protocol, config)\n : config.customTransport;\n transportCache.set(cacheKey, transport);\n return transport;\n }\n\n const cached = transportCache.get(cacheKey);\n if (cached) return cached;\n\n const pending = transportResolutions.get(cacheKey);\n if (pending) return pending;\n\n const resolution = createTransport(protocol, config)\n .then((transport) => {\n transportCache.set(cacheKey, transport);\n return transport;\n })\n .finally(() => {\n transportResolutions.delete(cacheKey);\n });\n\n transportResolutions.set(cacheKey, resolution);\n return resolution;\n}\n\n/**\n * @ru Синхронно возвращает транспорт из кэша без создания Promise.\n * @en Synchronously returns a cached transport without creating a Promise.\n * @param protocol - Протокол, для которого запрашивается транспорт. @en Protocol whose transport is requested.\n * @returns Кэшированный транспорт или `undefined`. @en Cached transport or `undefined`.\n */\nexport function getCachedTransport(protocol: SenderProtocol = \"rest\"): HyperTransport | undefined {\n return transportCache.get(protocol);\n}\n\n/**\n * @ru Удаляет все записи кэша, ссылающиеся на указанный транспорт.\n * @en Removes every cache entry that references the given transport.\n * @param transport - Экземпляр транспорта для удаления из кэша. @en Transport instance to evict from the cache.\n */\nexport function evictCachedTransport(transport: HyperTransport): void {\n for (const [protocol, cached] of transportCache) {\n if (cached === transport) {\n transportCache.delete(protocol);\n }\n }\n}\n\n/**\n * @ru Очищает кэш транспортов и ожидающих их разрешений. Не закрывает уже\n * созданные экземпляры транспорта.\n * @en Clears cached transports and pending resolutions. It does not close\n * already-created transport instances.\n */\nexport function resetCachedTransport(): void {\n transportCache.clear();\n transportResolutions.clear();\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["FetchTransport", "dynamicImport", "isModuleNotFoundError", "TRANSPORT_DEFS", "CANDIDATES", "transportCache", "transportResolutions", "getCacheKey", "protocol", "requireListen", "supportsListen", "transport", "supportsProtocol", "disposeUnusedTransport", "createFetchTransport", "config", "fetchTransport", "createTransport", "i", "t", "mod", "candidate", "instance", "err", "message", "cacheKey", "cached", "pending", "resolution"]
7
7
  }