{"version":3,"sources":["/home/runner/work/command/command/dist/main.cjs","main.ts","commandModel.ts","commandBus.ts","httpPlugin.ts","portChannelPlugin.ts"],"names":["m","Object","defineProperty","z","getOwnPropertyDescriptor","U","getOwnPropertyNames","I","prototype","hasOwnProperty","q","o","t","e","enumerable","configurable","writable","value","h","A","get","j","u","n","call","O","f","main_exports","__export","COMMAND_RETURN","Command","CommandBus","PortChannelPlugin","httpClientPlugin","httpServerPlugin","module","exports","__toCommonJS","Symbol","_a","data","__publicField","_Command","options","handlers","Map","streamHandlers","asyncStreamHandlers","commandConstructor","plugin","context","install","register","command","handler","set","name","execute","constructor","Error","stream","callback","abortSignal","streamHandler","unsubscribed","unsubscribe","done","error","addEventListener","Promise","resolve","then","streamAsync","asyncHandler","event","queue","resolveNext","finished","item","push","length","shift","registerStream","registerStreamAsync","_CommandBus","parseHeaders","headers","defaultHeaders","undefined","Headers","entries","header","has","append","headersValue","newHeaders","defaultSerializer","serialize","__name","JSON","stringify","deserializeResponse","response","ok","status","json","deserializeRequest","request","route","serializer","requestInit","url","body","fetch","toString","method","credentials","commandBus","commandBusInstance","getCommandFromRequest","commandObject","commandCosntructor","handleRequest","import_event","require","getResponseName","getUnsubscribeName","responseSubscriptions","timeout","commandTimeout","addSubscription","id","responseName","unsubscribeName","removeSubscription","delete","size","unsubscribeCallback","subscribedHandler","subscribe","getCommandInstance","commandData","_context","dataEvent","cmd","result","publish","singleConsumer","target","source","withResolvers","promise","reject","crypto","randomUUID","timer","setTimeout","clearTimeout","registerAsyncStream","unsubscriptions","unsubscribeData","iterator","handleCurrent","current","next","catch","PortChannel","_PortChannelPlugin"],"mappings":"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","sourcesContent":["var m=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var q=(o,t,e)=>t in o?m(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e;var h=(o,t)=>m(o,\"name\",{value:t,configurable:!0});var A=(o,t)=>{for(var e in t)m(o,e,{get:t[e],enumerable:!0})},j=(o,t,e,u)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let n of U(t))!I.call(o,n)&&n!==e&&m(o,n,{get:()=>t[n],enumerable:!(u=z(t,n))||u.enumerable});return o};var O=o=>j(m({},\"__esModule\",{value:!0}),o);var f=(o,t,e)=>q(o,typeof t!=\"symbol\"?t+\"\":t,e);var _={};A(_,{COMMAND_RETURN:()=>x,Command:()=>y,CommandBus:()=>S,PortChannelPlugin:()=>C,httpClientPlugin:()=>B,httpServerPlugin:()=>R});module.exports=O(_);var x=Symbol(\"returnType\"),E;E=x;var v=class v{constructor(t){f(this,E);f(this,\"data\");this.data=t}};h(v,\"Command\");var y=v;var N=class N{constructor(t){f(this,\"handlers\",new Map);f(this,\"streamHandlers\",new Map);f(this,\"asyncStreamHandlers\",new Map);f(this,\"commandConstructor\",new Map);f(this,\"plugin\");f(this,\"context\");this.context=t?.context||{},this.plugin=t?.plugin,this.plugin?.install&&this.plugin.install(this,this.context)}register(t,e){this.commandConstructor.set(t.name,t),this.handlers.set(t.name,e),this.plugin?.register&&this.plugin.register(t)}execute(t,e){let u=this.handlers.get(t.constructor.name);if(this.plugin?.handler)return this.plugin.handler(t,e??this.context,u);if(!u)throw new Error(`No handler registered for ${t.constructor.name}`);return u(t,e??this.context)}stream(t,e,u,n){if(!this.plugin?.streamHandler){let i=this.streamHandlers.get(t.constructor.name);if(!i)throw new Error(`No stream plugin registered for ${t.constructor.name}`);let r=!1,a=i(t,u??this.context,(c,l,d)=>{if(!r){if(d){e(c,l,d);return}e(c,l),l&&(r=!0)}});return a&&n&&n.addEventListener(\"abort\",()=>{r=!0,Promise.resolve(a).then(c=>c())}),()=>{r=!0,a&&Promise.resolve(a).then(c=>c())}}let s=this.plugin.streamHandler(t,u??this.context,e,n);return s&&n&&n.addEventListener(\"abort\",()=>{Promise.resolve(s).then(i=>i())}),()=>{s&&Promise.resolve(s).then(i=>i())}}async*streamAsync(t,e){if(!this.plugin?.streamHandler){let r=this.asyncStreamHandlers.get(t.constructor.name);if(r){for await(let a of r(t,e??this.context))yield a;return}}let u=[],n=null,s=!1,i=this.stream(t,(r,a,c)=>{let l={value:r,done:a,error:c};n?(n(l),n=null):u.push(l),a&&(s=!0)},e);try{for(;!s||u.length>0;){let r=u.length>0?u.shift():await new Promise(a=>{n=a});if(r.error)throw r.error;if(yield r.value,r.done)break}}finally{i()}}registerStream(t,e){this.commandConstructor.set(t.name,t),this.streamHandlers.set(t.name,e),this.plugin?.registerStream&&this.plugin.registerStream(t)}registerStreamAsync(t,e){this.commandConstructor.set(t.name,t),this.asyncStreamHandlers.set(t.name,e),this.plugin?.registerStream&&this.plugin.registerStream(t)}};h(N,\"CommandBus\");var S=N;function L(o,t,e,u){if(o===void 0)return t;if(o instanceof Headers){for(let i of t.entries())o.has(i[0])||o.append(i[0],i[1]);return o}let n=typeof o==\"function\"?o(e,u):o,s=new Headers(n);for(let i of t.entries())s.has(i[0])||s.append(i[0],i[1]);return s}h(L,\"parseHeaders\");var T={serialize:h((o,t)=>(t.has(\"Content-Type\")||t.set(\"Content-Type\",\"application/json\"),JSON.stringify(o)),\"serialize\"),deserializeResponse:h(o=>{if(!o.ok)throw new Error(`HTTP error: ${o.status}`);return o.json()},\"deserializeResponse\"),deserializeRequest:h(o=>o.json(),\"deserializeRequest\")};function B(o,t){let e=new Headers;return{handler:h(async(n,s,i)=>{if(i)return Promise.resolve(i(n,s));let{headers:r=new Headers,serializer:a=T,requestInit:c={}}=t??{},l=typeof o==\"function\"?o(n,s):o,d=L(r,e,n,s),g=a.serialize({data:n.data,name:n.constructor.name},d),p=await fetch(l.toString(),{method:\"POST\",headers:d,body:g,credentials:\"same-origin\",...c});if(!p.ok)throw new Error(`HTTP error: ${p.status}`);return a.deserializeResponse(p)},\"handler\"),defaultHeaders:e}}h(B,\"httpClientPlugin\");function R(o){let t;function e(s){t=s}h(e,\"install\");async function u(s){if(!t)throw new Error(\"Plugin not installed\");let{serializer:i=T}=o??{},r=await i.deserializeRequest(s),a=t.commandConstructor.get(r.name);if(!a)throw new Error(`Command not found: ${r.name}`);return new a(r.data)}h(u,\"getCommandFromRequest\");async function n(s,i){if(!t)throw new Error(\"Plugin not installed\");let r=await u(s);return await t.execute(r,i)}return h(n,\"handleRequest\"),{install:e,getCommandFromRequest:u,handleRequest:n,handler:h((s,i,r)=>{if(r)return Promise.resolve(r(s,i));throw new Error(\"Not implemented\")},\"handler\")}}h(R,\"httpServerPlugin\");var $=require(\"@collidor/event\");var H=h(o=>`${o}_Response`,\"getResponseName\"),w=h(o=>`${o}_Unsubscribe`,\"getUnsubscribeName\"),P=class P extends $.PortChannel{constructor(e){super(e);f(this,\"commandBus\");f(this,\"responseSubscriptions\",new Map);f(this,\"timeout\",5e3);e?.commandTimeout&&(this.timeout=e.commandTimeout)}addSubscription(e,u,n){let s=H(e),i=w(e),r=h(()=>{this.responseSubscriptions.get(s)?.delete(u),this.responseSubscriptions.get(s)?.size===0&&(this.responseSubscriptions.delete(s),this.unsubscribe(s,a),this.unsubscribe(i,c))},\"removeSubscription\"),a=h(l=>{let d=this.responseSubscriptions.get(s)?.get(l.id);d&&d(l.data,l.done,l.error),(l.done||!d)&&r()},\"callback\"),c=h(l=>{l.id===u&&r()},\"unsubscribeCallback\");this.responseSubscriptions.has(s)||(this.responseSubscriptions.set(s,new Map),this.subscribe(s,a),this.subscribe(i,c)),this.responseSubscriptions.get(s)?.set(u,n)}getCommandInstance(e,u){let n=this.commandBus.commandConstructor.get(e);if(!n)throw new Error(`No class registered for command ${u}`);return new n(u)}install(e,u){this.commandBus=e,this.context=u}register(e){let u=this.commandBus.handlers.get(e.name);if(!u)throw new Error(`Command ${e.name} not found`);let n=H(e.name);this.subscribe(e.name,async(s,i,r)=>{try{let a=this.getCommandInstance(e.name,s.data),c=u(a,this.context);c instanceof Promise&&(c=await c),this.publish(n,{id:s.id,data:c,done:!0},{singleConsumer:!0,target:r.source})}catch(a){this.publish(n,{id:s.id,data:null,done:!0,error:a},{singleConsumer:!0,target:r.source})}})}handler(e,u){if(this.commandBus.handlers.has(e.constructor.name)){let c=this.commandBus.handlers.get(e.constructor.name);return Promise.resolve(c(e,u??this.context))}let{promise:n,resolve:s,reject:i}=Promise.withResolvers(),r=crypto.randomUUID(),a=setTimeout(()=>{let c=w(e.constructor.name);this.publish(c,{id:r}),i(new Error(\"Timeout waiting for command response\")),clearTimeout(a)},this.timeout);return this.addSubscription(e.constructor.name,r,(c,l,d)=>{clearTimeout(a),d&&i(d),l&&s(c)}),this.publish(e.constructor.name,{id:r,data:e.data},{singleConsumer:!0}),n}registerAsyncStream(e){let u=this.commandBus.asyncStreamHandlers.get(e.name);if(!u)throw new Error(`Stream ${e.name} not found`);let n=H(e.name),s=new Map,i=w(e.name);this.subscribe(i,r=>{let a=s.get(r.id);a&&(a(),s.delete(r.id))}),this.subscribe(e.name,(r,a,c)=>{let l=!1,d=this.getCommandInstance(e.name,r.data),g=u(d,this.context);s.has(r.id)||s.set(r.id,()=>{l=!0,this.publish(i,{id:r.id},{singleConsumer:!0,target:c.source}),s.delete(r.id)});let p=h(b=>{if(!l)if(this.publish(n,{id:r.id,data:b.value,done:b.done},{singleConsumer:!0,target:c.source}),b.done)s.delete(r.id);else return g.next().then(p)},\"handleCurrent\");g.next().then(p)})}registerStream(e){if(this.commandBus.asyncStreamHandlers.get(e.name))return this.registerAsyncStream(e);let n=this.commandBus.streamHandlers.get(e.name);if(!n)throw new Error(`Stream ${e.name} not found`);let s=H(e.name);this.subscribe(e.name,(i,r,a)=>{let c=w(e.name),l=!1,d=this.getCommandInstance(e.name,i.data),g=n(d,this.context,(p,b,M)=>{l||(this.publish(s,{id:i.id,data:p,done:b,error:M},{singleConsumer:!0,target:a.source}),b&&(l=!0,this.publish(c,{id:i.id})))});this.subscribe(c,p=>{p.id===i.id&&(l=!0,g&&Promise.resolve(g).then(b=>b()))})})}streamHandler(e,u,n,s){if(this.commandBus.streamHandlers.has(e.constructor.name)){let a=this.commandBus.streamHandlers.get(e.constructor.name)(e,u??this.context,n);return()=>{a&&Promise.resolve(a).then(c=>c())}}if(this.commandBus.asyncStreamHandlers.has(e.constructor.name)){let a=this.commandBus.asyncStreamHandlers.get(e.constructor.name);if(!a)throw new Error(`No stream plugin registered for ${e.constructor.name}`);let c=!1;return(async()=>{for await(let l of a(e,this.context)){if(c)return()=>{};n(l,!1)}n(null,!0)})().catch(l=>{n(null,!0,l)}),s?.addEventListener(\"abort\",()=>{c=!0}),()=>{c=!0}}let i=crypto.randomUUID(),r=w(e.constructor.name);return this.addSubscription(e.constructor.name,i,n),this.publish(e.constructor.name,{id:i,data:e.data},{singleConsumer:!0}),s?.addEventListener(\"abort\",()=>{this.publish(r,{id:i})}),()=>{this.publish(r,{id:i})}}};h(P,\"PortChannelPlugin\");var C=P;0&&(module.exports={COMMAND_RETURN,Command,CommandBus,PortChannelPlugin,httpClientPlugin,httpServerPlugin});\n","export { Command, COMMAND_RETURN } from \"./commandModel.ts\";\nexport {\n  CommandBus,\n  type CommandBusOptions,\n  type CommandBusPlugin,\n  type PluginHandler,\n  type StreamPluginHandler,\n  type Type,\n} from \"./commandBus.ts\";\n\nexport {\n  httpClientPlugin,\n  httpServerPlugin,\n  type Serializer,\n} from \"./plugins/httpPlugin.ts\";\n\nexport {\n  PortChannelPlugin,\n  type PortChannelPluginOptions,\n} from \"./plugins/portChannelPlugin.ts\";\n","export const COMMAND_RETURN = Symbol(\"returnType\");\n\nexport type COMMAND_RETURN = typeof COMMAND_RETURN;\n\nexport abstract class Command<T = any, R = any> {\n  public [COMMAND_RETURN]!: R;\n  public data: T;\n  constructor(data: T) {\n    this.data = data;\n  }\n}\n","import type { Command, COMMAND_RETURN } from \"./commandModel.ts\";\n\nexport type Type<T> = new (...args: any[]) => T;\ntype ContextType = Record<string, any>;\nexport type PluginHandler<\n  C extends Command,\n  TContext extends ContextType = ContextType,\n  R = C[COMMAND_RETURN],\n> = (\n  command: C,\n  context: TContext,\n  handler?: (command: C, context: TContext) => C[COMMAND_RETURN],\n) => R;\n\nexport type StreamPluginHandler<\n  C extends Command,\n  TContext extends ContextType = ContextType,\n> = (\n  command: C,\n  context: TContext,\n  next: (data: C[COMMAND_RETURN], done: boolean, error?: any) => void,\n  abortSignal?: AbortSignal,\n) => (() => void) | Promise<() => void>;\n\nexport type CommandBusPlugin<\n  C extends Command,\n  TContext extends ContextType = ContextType,\n  R = undefined,\n> =\n  & {\n    install?: (\n      commandBus: CommandBus<TContext, any>,\n      context: TContext,\n    ) => void;\n    streamHandler?: StreamPluginHandler<C, TContext>;\n    register?: (Command: Type<C>) => void;\n    registerStream?: (\n      Command: Type<C>,\n    ) => void;\n  }\n  & (R extends undefined ? {\n      handler?: PluginHandler<C, TContext, R>;\n    }\n    : {\n      handler: PluginHandler<C, TContext, R>;\n    });\n\nexport interface CommandBusOptions<\n  TContext extends ContextType = ContextType,\n  TPlugin extends CommandBusPlugin<Command, TContext> | undefined = undefined,\n> {\n  context?: TContext;\n  plugin?: TPlugin;\n}\n\ntype ReturnTypeMapper<T, R> = T extends Promise<any> ? Promise<R>\n  : T extends Iterable<any> ? Iterable<R>\n  : T extends Iterator<any> ? Iterable<R>\n  : T extends IterableIterator<any> ? Iterable<R>\n  : T extends AsyncIterable<any> ? Iterable<R>\n  : T extends AsyncIterator<any> ? Iterable<R>\n  : T extends Generator<any> ? Iterable<R>\n  : T extends ReadableStream<any> ? Iterable<R>\n  : T extends ReadableStreamDefaultReader<any> ? Iterable<R>\n  : R;\n\nexport class CommandBus<\n  TContext extends ContextType = ContextType,\n  TPlugin extends CommandBusPlugin<Command, any, any> | undefined = undefined,\n> {\n  public handlers: Map<\n    string,\n    (command: Command, context: TContext) => unknown\n  > = new Map();\n\n  public streamHandlers: Map<\n    string,\n    (\n      command: Command,\n      context: TContext,\n      next: (data: Command[COMMAND_RETURN], done: boolean, error?: any) => void,\n    ) => (() => void) | Promise<() => void> | void\n  > = new Map();\n\n  public asyncStreamHandlers: Map<\n    string,\n    (\n      command: Command,\n      context: TContext,\n    ) => AsyncIterableIterator<Command[COMMAND_RETURN]>\n  > = new Map();\n\n  public commandConstructor: Map<string, Type<Command>> = new Map();\n  private plugin?: TPlugin;\n\n  constructor(\n    options?: CommandBusOptions<TContext, TPlugin>,\n  ) {\n    this.context = options?.context || {} as TContext;\n    this.plugin = options?.plugin;\n\n    if (this.plugin?.install) {\n      this.plugin.install(this, this.context);\n    }\n  }\n\n  private context: TContext;\n\n  register<C extends Command>(\n    command: Type<C>,\n    handler: (\n      command: C,\n      context: TContext,\n    ) =>\n      | (TPlugin extends { handler: (...args: any[]) => any }\n        ? ReturnTypeMapper<\n          ReturnType<TPlugin[\"handler\"]>,\n          C[COMMAND_RETURN]\n        >\n        : C[COMMAND_RETURN])\n      | C[COMMAND_RETURN],\n  ) {\n    this.commandConstructor.set(command.name, command);\n    this.handlers.set(command.name, handler as any);\n\n    if (this.plugin?.register) {\n      this.plugin.register(command);\n    }\n  }\n\n  execute<C extends Command>(\n    command: C,\n    context?: TContext,\n  ): TPlugin extends { handler: (...args: any[]) => any } ? ReturnTypeMapper<\n      ReturnType<TPlugin[\"handler\"]>,\n      C[COMMAND_RETURN]\n    >\n    : C[COMMAND_RETURN] {\n    const handler = this.handlers.get(command.constructor.name);\n\n    if (this.plugin?.handler) {\n      return this.plugin.handler(\n        command,\n        context ?? this.context,\n        handler,\n      ) as any;\n    }\n\n    if (!handler) {\n      throw new Error(`No handler registered for ${command.constructor.name}`);\n    }\n\n    return handler(command, context ?? this.context) as any;\n  }\n\n  stream<C extends Command>(\n    command: C,\n    callback: (data: C[COMMAND_RETURN], done: boolean, error?: any) => void,\n    context?: TContext,\n    abortSignal?: AbortSignal,\n  ): () => void {\n    if (!this.plugin?.streamHandler) {\n      const handler = this.streamHandlers.get(command.constructor.name);\n      if (!handler) {\n        throw new Error(\n          `No stream plugin registered for ${command.constructor.name}`,\n        );\n      }\n\n      let unsubscribed = false;\n      const unsubscribe = handler(\n        command,\n        context ?? this.context,\n        (data, done, error) => {\n          if (unsubscribed) {\n            return;\n          }\n\n          if (error) {\n            callback(data, done, error);\n            return;\n          }\n\n          callback(data, done);\n          if (done) {\n            unsubscribed = true;\n          }\n        },\n      );\n\n      if (unsubscribe && abortSignal) {\n        abortSignal.addEventListener(\"abort\", () => {\n          unsubscribed = true;\n          Promise.resolve(unsubscribe).then((f) => f());\n        });\n      }\n\n      return () => {\n        unsubscribed = true;\n        if (unsubscribe) {\n          Promise.resolve(unsubscribe).then((f) => f());\n        }\n      };\n    }\n\n    const unsubscribe = this.plugin.streamHandler(\n      command,\n      context ?? this.context,\n      callback,\n      abortSignal,\n    );\n\n    if (unsubscribe && abortSignal) {\n      abortSignal.addEventListener(\"abort\", () => {\n        Promise.resolve(unsubscribe).then((f) => f());\n      });\n    }\n\n    return () => {\n      if (unsubscribe) {\n        Promise.resolve(unsubscribe).then((f) => f());\n      }\n    };\n  }\n\n  async *streamAsync<C extends Command>(\n    command: C,\n    context?: TContext,\n  ): AsyncGenerator<C[COMMAND_RETURN], void, unknown> {\n    if (!this.plugin?.streamHandler) {\n      const asyncHandler = this.asyncStreamHandlers.get(\n        command.constructor.name,\n      );\n      if (asyncHandler) {\n        for await (\n          const event of asyncHandler(command, context ?? this.context)\n        ) {\n          yield event;\n        }\n        return;\n      }\n    }\n\n    const queue: {\n      value: C[COMMAND_RETURN];\n      done: boolean;\n      error?: any;\n    }[] = [];\n    let resolveNext:\n      | ((result: {\n        value: C[COMMAND_RETURN];\n        done: boolean;\n        error?: any;\n      }) => void)\n      | null = null;\n    let finished = false;\n\n    // Subscribe to the stream.\n    const unsubscribe = this.stream(\n      command,\n      (data, done, error) => {\n        const item = { value: data, done, error };\n        if (resolveNext) {\n          resolveNext(item);\n          resolveNext = null;\n        } else {\n          queue.push(item);\n        }\n        if (done) {\n          finished = true;\n        }\n      },\n      context,\n    );\n\n    try {\n      while (!finished || queue.length > 0) {\n        const item = queue.length > 0 ? queue.shift()! : await new Promise<{\n          value: C[COMMAND_RETURN];\n          done: boolean;\n          error?: any;\n        }>((resolve) => {\n          resolveNext = resolve;\n        });\n        if (item.error) {\n          throw item.error;\n        }\n        yield item.value;\n        if (item.done) {\n          break;\n        }\n      }\n    } finally {\n      unsubscribe();\n    }\n  }\n\n  registerStream<C extends Command>(\n    command: Type<C>,\n    handler: (\n      command: C,\n      context: TContext,\n      next: (data: C[COMMAND_RETURN], done: boolean, error?: any) => void,\n    ) => (() => void) | Promise<() => void> | void,\n  ) {\n    this.commandConstructor.set(command.name, command);\n    this.streamHandlers.set(command.name, handler as any);\n\n    if (this.plugin?.registerStream) {\n      this.plugin.registerStream(command);\n    }\n  }\n\n  /**\n   * Registers a stream handler that returns an AsyncIterable.\n   */\n  registerStreamAsync<C extends Command>(\n    command: Type<C>,\n    handler: (\n      command: C,\n      context: TContext,\n    ) => AsyncIterable<C[COMMAND_RETURN]>,\n  ) {\n    this.commandConstructor.set(command.name, command);\n    this.asyncStreamHandlers.set(command.name, handler as any);\n\n    if (this.plugin?.registerStream) {\n      this.plugin.registerStream(command);\n    }\n  }\n}\n","import type { CommandBusPlugin, PluginHandler } from \"../commandBus.ts\";\nimport type { Command, COMMAND_RETURN } from \"../commandModel.ts\";\nimport type { CommandBus } from \"../main.ts\";\n\ntype ContextType = Record<string, any>;\ntype ArgHeaders<TContext extends ContextType = ContextType> =\n  | (Record<string, string> | Headers)\n  | ((command: Command, context: TContext) => Record<string, string> | Headers);\n\nfunction parseHeaders<TContext extends ContextType = ContextType>(\n  headers: ArgHeaders<TContext> | undefined,\n  defaultHeaders: Headers,\n  command: Command,\n  context: TContext,\n): Headers {\n  if (headers === undefined) {\n    return defaultHeaders;\n  }\n  if (headers instanceof Headers) {\n    for (const header of defaultHeaders.entries()) {\n      if (!headers.has(header[0])) {\n        headers.append(header[0], header[1]);\n      }\n    }\n    return headers;\n  }\n  const headersValue = typeof headers === \"function\"\n    ? headers(command, context)\n    : headers;\n  const newHeaders = new Headers(headersValue);\n\n  for (const header of defaultHeaders.entries()) {\n    if (!newHeaders.has(header[0])) {\n      newHeaders.append(header[0], header[1]);\n    }\n  }\n  return newHeaders;\n}\n\nexport type Serializer<S extends BodyInit> = {\n  serialize: (data: any, headers: Headers) => S;\n  deserializeResponse: (response: Response) => Promise<any>;\n  deserializeRequest: (request: Request) => Promise<any>;\n};\n\nconst defaultSerializer: Serializer<string> = {\n  serialize: (data, headers) => {\n    if (!headers.has(\"Content-Type\")) {\n      headers.set(\"Content-Type\", \"application/json\");\n    }\n    return JSON.stringify(data);\n  },\n  deserializeResponse: (response) => {\n    if (!response.ok) {\n      throw new Error(`HTTP error: ${response.status}`);\n    }\n    return response.json();\n  },\n  deserializeRequest: (request) => request.json(),\n};\n\nexport function httpClientPlugin<\n  TContext extends ContextType = ContextType,\n  TSerializer extends BodyInit = string,\n>(\n  route:\n    | string\n    | URL\n    | ((command: Command, context: TContext) => string | URL),\n  options?: {\n    headers?: ArgHeaders<TContext>;\n    serializer?: Serializer<TSerializer>;\n    requestInit?: RequestInit;\n  },\n): CommandBusPlugin<Command, TContext, Promise<Command[COMMAND_RETURN]>> & {\n  defaultHeaders: Headers;\n} {\n  const defaultHeaders = new Headers();\n\n  const handler: PluginHandler<\n    Command,\n    TContext,\n    Promise<Command[COMMAND_RETURN]>\n  > = async (command, context, handler) => {\n    if (handler) {\n      return Promise.resolve(handler(command, context));\n    }\n    const {\n      headers = new Headers(),\n      serializer = defaultSerializer,\n      requestInit = {},\n    } = options ?? {};\n    const url = typeof route === \"function\" ? route(command, context) : route;\n\n    const headersValue = parseHeaders(\n      headers,\n      defaultHeaders,\n      command,\n      context,\n    );\n\n    const body = serializer.serialize(\n      { data: command.data, name: command.constructor.name },\n      headersValue,\n    );\n\n    const response = await fetch(url.toString(), {\n      method: \"POST\",\n      headers: headersValue,\n      body,\n      credentials: \"same-origin\",\n      ...requestInit,\n    });\n    if (!response.ok) {\n      throw new Error(`HTTP error: ${response.status}`);\n    }\n    return serializer.deserializeResponse(response);\n  };\n\n  return { handler, defaultHeaders };\n}\n\nexport function httpServerPlugin<\n  TContext extends ContextType = ContextType,\n  TSerializer extends BodyInit = string,\n>(\n  options?: {\n    serializer?: Serializer<TSerializer>;\n  },\n): CommandBusPlugin<Command, TContext, Promise<Command[COMMAND_RETURN]>> & {\n  getCommandFromRequest: (\n    request: Request,\n  ) => Promise<Command>;\n  handleRequest: (request: Request, context?: TContext) => Promise<\n    Command[COMMAND_RETURN]\n  >;\n} {\n  let commandBus: CommandBus<TContext> | undefined;\n\n  function install(commandBusInstance: CommandBus<TContext>) {\n    commandBus = commandBusInstance;\n  }\n\n  async function getCommandFromRequest(request: Request) {\n    if (!commandBus) {\n      throw new Error(\"Plugin not installed\");\n    }\n    const { serializer = defaultSerializer } = options ?? {};\n    const commandObject = await serializer.deserializeRequest(request);\n    const commandCosntructor = commandBus.commandConstructor\n      .get(commandObject.name);\n    if (!commandCosntructor) {\n      throw new Error(`Command not found: ${commandObject.name}`);\n    }\n    return new commandCosntructor(commandObject.data);\n  }\n\n  async function handleRequest(request: Request, context?: TContext) {\n    if (!commandBus) {\n      throw new Error(\"Plugin not installed\");\n    }\n    const command = await getCommandFromRequest(request);\n\n    return await commandBus.execute(command, context);\n  }\n\n  return {\n    install,\n    getCommandFromRequest,\n    handleRequest,\n    handler: (command, context, handler) => {\n      if (handler) {\n        return Promise.resolve(handler(command, context));\n      }\n      throw new Error(\"Not implemented\");\n    },\n  };\n}\n","import {\n  type DataEvent,\n  PortChannel,\n  type PortChannelOptions,\n} from \"@collidor/event\";\nimport type { CommandBus, CommandBusPlugin, Type } from \"../commandBus.ts\";\nimport type { Command, COMMAND_RETURN } from \"../commandModel.ts\";\n\ntype CommandDataEvent = {\n  id: string;\n  data: any;\n};\n\ntype CommandResponseEvent = {\n  id: string;\n  data: any;\n  done: boolean;\n  error?: any;\n};\n\ntype CommandUnsubscribeEvent = {\n  id: string;\n};\n\nexport type PortChannelPluginOptions = PortChannelOptions & {\n  commandTimeout?: number;\n};\n\nconst getResponseName = (name: string): string => `${name}_Response`;\nconst getUnsubscribeName = (name: string): string => `${name}_Unsubscribe`;\n\nexport class PortChannelPlugin extends PortChannel<any>\n  implements CommandBusPlugin<Command, any, Promise<Command[COMMAND_RETURN]>> {\n  protected commandBus!: CommandBus<any, any>;\n  declare public context: any;\n\n  protected responseSubscriptions: Map<\n    string,\n    Map<string, (data: any, done: boolean, error?: any) => void>\n  > = new Map();\n\n  protected timeout = 5000;\n\n  constructor(options?: PortChannelPluginOptions) {\n    super(options);\n    if (options?.commandTimeout) {\n      this.timeout = options.commandTimeout;\n    }\n  }\n\n  /**\n   * Adds a subscription for a given command response.\n   * When no more handlers are left, it unsubscribes from the underlying events.\n   */\n  protected addSubscription(\n    name: string,\n    id: string,\n    handler: (data: any, done: boolean, error?: any) => void,\n  ) {\n    const responseName = getResponseName(name);\n    const unsubscribeName = getUnsubscribeName(name);\n\n    const removeSubscription = () => {\n      this.responseSubscriptions.get(responseName)?.delete(id);\n      if (this.responseSubscriptions.get(responseName)?.size === 0) {\n        this.responseSubscriptions.delete(responseName);\n        this.unsubscribe(responseName, callback);\n        this.unsubscribe(unsubscribeName, unsubscribeCallback);\n      }\n    };\n\n    const callback = (response: CommandResponseEvent) => {\n      const subscribedHandler = this.responseSubscriptions.get(\n        responseName,\n      )\n        ?.get(response.id);\n\n      if (subscribedHandler) {\n        subscribedHandler(response.data, response.done, response.error);\n      }\n\n      if (response.done || !subscribedHandler) {\n        removeSubscription();\n      }\n    };\n\n    const unsubscribeCallback = (response: CommandUnsubscribeEvent) => {\n      if (response.id === id) {\n        removeSubscription();\n      }\n    };\n\n    if (!this.responseSubscriptions.has(responseName)) {\n      this.responseSubscriptions.set(responseName, new Map());\n      this.subscribe(responseName, callback);\n      this.subscribe(unsubscribeName, unsubscribeCallback);\n    }\n    this.responseSubscriptions.get(responseName)?.set(id, handler);\n  }\n\n  protected getCommandInstance(name: string, data: any): Command {\n    const constructor = this.commandBus.commandConstructor.get(name);\n\n    if (!constructor) {\n      throw new Error(`No class registered for command ${data}`);\n    }\n\n    return new constructor(data);\n  }\n\n  install(commandBus: CommandBus<any, any>, context: any): void {\n    this.commandBus = commandBus;\n    this.context = context;\n  }\n\n  register(command: Type<Command>) {\n    const handler = this.commandBus.handlers.get(command.name);\n    if (!handler) {\n      throw new Error(`Command ${command.name} not found`);\n    }\n\n    const responseName = getResponseName(command.name);\n\n    this.subscribe(\n      command.name,\n      async (\n        commandData: CommandDataEvent,\n        _context,\n        dataEvent: DataEvent,\n      ) => {\n        try {\n          const cmd = this.getCommandInstance(\n            command.name,\n            commandData.data,\n          );\n          let result = handler(cmd, this.context);\n          if (result instanceof Promise) {\n            result = await result;\n          }\n\n          this.publish(\n            responseName,\n            {\n              id: commandData.id,\n              data: result,\n              done: true,\n            } as CommandResponseEvent,\n            {\n              singleConsumer: true,\n              target: dataEvent.source,\n            },\n          );\n        } catch (error) {\n          this.publish(\n            responseName,\n            {\n              id: commandData.id,\n              data: null,\n              done: true,\n              error,\n            } as CommandResponseEvent,\n            {\n              singleConsumer: true,\n              target: dataEvent.source,\n            },\n          );\n        }\n      },\n    );\n  }\n\n  /**\n   * Dispatches a command by publishing it on the channel.\n   * A timeout is set to prevent memory leaks if no response arrives.\n   */\n  handler(\n    command: Command,\n    context: any,\n  ): Promise<Command[COMMAND_RETURN]> {\n    if (this.commandBus.handlers.has(command.constructor.name)) {\n      const handler = this.commandBus.handlers.get(\n        command.constructor.name,\n      )!;\n      return Promise.resolve(handler(command, context ?? this.context));\n    }\n\n    const { promise, resolve, reject } = Promise.withResolvers();\n    const id = crypto.randomUUID();\n    // 5 seconds timeout\n\n    // Set up a timeout to auto-reject if no response is received.\n    const timer = setTimeout(() => {\n      const unsubscribeName = getUnsubscribeName(\n        command.constructor.name,\n      );\n      this.publish(unsubscribeName, { id } as CommandUnsubscribeEvent);\n      reject(new Error(\"Timeout waiting for command response\"));\n      clearTimeout(timer);\n    }, this.timeout);\n\n    this.addSubscription(\n      command.constructor.name,\n      id,\n      (data: any, done: boolean, error?: any) => {\n        clearTimeout(timer);\n        if (error) {\n          reject(error);\n        }\n        if (done) {\n          resolve(data);\n        }\n      },\n    );\n\n    this.publish(\n      command.constructor.name,\n      {\n        id,\n        data: command.data,\n      } as CommandDataEvent,\n      {\n        singleConsumer: true,\n      },\n    );\n\n    return promise;\n  }\n\n  /**\n   * Registers an asynchronous stream handler.\n   * Adds a timeout/cancellation mechanism via unsubscribe events.\n   */\n  protected registerAsyncStream(command: Type<Command<any, any>>): void {\n    const asyncHandler = this.commandBus.asyncStreamHandlers.get(\n      command.name,\n    );\n    if (!asyncHandler) {\n      throw new Error(`Stream ${command.name} not found`);\n    }\n\n    const responseName = getResponseName(command.name);\n    const unsubscriptions = new Map<string, () => void>();\n    const unsubscribeName = getUnsubscribeName(command.name);\n\n    // Subscribe for unsubscribe events once.\n    this.subscribe(\n      unsubscribeName,\n      (unsubscribeData: CommandUnsubscribeEvent) => {\n        const unsubscribe = unsubscriptions.get(unsubscribeData.id);\n        if (unsubscribe) {\n          unsubscribe();\n          unsubscriptions.delete(unsubscribeData.id);\n        }\n      },\n    );\n\n    this.subscribe(\n      command.name,\n      (commandData: CommandDataEvent, _context, dataEvent) => {\n        let unsubscribed = false;\n        const cmd = this.getCommandInstance(\n          command.name,\n          commandData.data,\n        );\n        const iterator = asyncHandler(cmd, this.context);\n\n        if (!unsubscriptions.has(commandData.id)) {\n          unsubscriptions.set(commandData.id, () => {\n            unsubscribed = true;\n            this.publish(\n              unsubscribeName,\n              {\n                id: commandData.id,\n              } as CommandUnsubscribeEvent,\n              {\n                singleConsumer: true,\n                target: dataEvent.source,\n              },\n            );\n            unsubscriptions.delete(commandData.id);\n          });\n        }\n\n        const handleCurrent = (\n          current: IteratorResult<any, any>,\n        ): void | Promise<any> => {\n          if (unsubscribed) {\n            return;\n          }\n\n          this.publish(\n            responseName,\n            {\n              id: commandData.id,\n              data: current.value,\n              done: current.done,\n            } as CommandResponseEvent,\n            {\n              singleConsumer: true,\n              target: dataEvent.source,\n            },\n          );\n\n          if (!current.done) {\n            return iterator.next().then(handleCurrent);\n          } else {\n            // Clean up when stream completes\n            unsubscriptions.delete(commandData.id);\n          }\n        };\n        void iterator.next().then(handleCurrent);\n      },\n    );\n  }\n\n  registerStream(command: Type<Command<any, any>>): void {\n    const asyncHandler = this.commandBus.asyncStreamHandlers.get(\n      command.name,\n    );\n    if (asyncHandler) {\n      return this.registerAsyncStream(command);\n    }\n\n    const handler = this.commandBus.streamHandlers.get(command.name);\n    if (!handler) {\n      throw new Error(`Stream ${command.name} not found`);\n    }\n\n    const responseName = getResponseName(command.name);\n\n    this.subscribe(\n      command.name,\n      (commandData: CommandDataEvent, _context, dataEvent) => {\n        const unsubscribeName = getUnsubscribeName(command.name);\n        let unsubscribed = false;\n\n        const cmd = this.getCommandInstance(\n          command.name,\n          commandData.data,\n        );\n        const unsubscribe = handler(\n          cmd,\n          this.context,\n          (data: any, done: boolean, error?: any) => {\n            if (unsubscribed) {\n              return;\n            }\n\n            this.publish(\n              responseName,\n              {\n                id: commandData.id,\n                data,\n                done,\n                error,\n              } as CommandResponseEvent,\n              {\n                singleConsumer: true,\n                target: dataEvent.source,\n              },\n            );\n\n            if (done) {\n              unsubscribed = true;\n              this.publish(\n                unsubscribeName,\n                {\n                  id: commandData.id,\n                } as CommandUnsubscribeEvent,\n              );\n            }\n          },\n        );\n\n        this.subscribe(\n          unsubscribeName,\n          (unsubscribeData: CommandUnsubscribeEvent) => {\n            if (unsubscribeData.id === commandData.id) {\n              unsubscribed = true;\n              if (unsubscribe) {\n                Promise.resolve(unsubscribe).then((f) => f());\n              }\n            }\n          },\n        );\n      },\n    );\n  }\n\n  streamHandler(\n    command: Command,\n    context: any,\n    next: (\n      data: Command[COMMAND_RETURN],\n      done: boolean,\n      error?: any,\n    ) => void,\n    abortSignal?: AbortSignal,\n  ): (() => void) | Promise<() => void> {\n    if (this.commandBus.streamHandlers.has(command.constructor.name)) {\n      const unsubscribe = this.commandBus.streamHandlers.get(\n        command.constructor.name,\n      )!(\n        command,\n        context ?? this.context,\n        next,\n      );\n\n      return () => {\n        if (unsubscribe) {\n          Promise.resolve(unsubscribe).then((f) => f());\n        }\n      };\n    }\n\n    if (this.commandBus.asyncStreamHandlers.has(command.constructor.name)) {\n      const handler = this.commandBus.asyncStreamHandlers.get(\n        command.constructor.name,\n      );\n      if (!handler) {\n        throw new Error(\n          `No stream plugin registered for ${command.constructor.name}`,\n        );\n      }\n\n      let unsubscribed = false;\n\n      (async () => {\n        for await (const data of handler(command, this.context)) {\n          if (unsubscribed) {\n            return () => {};\n          }\n\n          next(data, false);\n        }\n        next(null, true);\n      })().catch((error) => {\n        next(null, true, error);\n      });\n\n      abortSignal?.addEventListener(\"abort\", () => {\n        unsubscribed = true;\n      });\n      return () => {\n        unsubscribed = true;\n      };\n    }\n\n    const id = crypto.randomUUID();\n    const unsubscribeName = getUnsubscribeName(command.constructor.name);\n\n    this.addSubscription(command.constructor.name, id, next);\n\n    this.publish(\n      command.constructor.name,\n      {\n        id,\n        data: command.data,\n      } as CommandDataEvent,\n      {\n        singleConsumer: true,\n      },\n    );\n\n    abortSignal?.addEventListener(\"abort\", () => {\n      this.publish(\n        unsubscribeName,\n        {\n          id,\n        } as CommandUnsubscribeEvent,\n      );\n    });\n\n    return () => {\n      this.publish(\n        unsubscribeName,\n        {\n          id,\n        } as CommandUnsubscribeEvent,\n      );\n    };\n  }\n}\n"]}