UNPKG

zod-sockets

Version:

Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers

17 lines (14 loc) 24 kB
"use strict";var nt=Object.create;var pe=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var st=Object.getPrototypeOf,at=Object.prototype.hasOwnProperty;var ct=(e,t)=>{for(var o in t)pe(e,o,{get:t[o],enumerable:!0})},Ie=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of it(t))!at.call(e,n)&&n!==o&&pe(e,n,{get:()=>t[n],enumerable:!(r=rt(t,n))||r.enumerable});return e};var $=(e,t,o)=>(o=e!=null?nt(st(e)):{},Ie(t||!e||!e.__esModule?pe(o,"default",{value:e,enumerable:!0}):o,e)),pt=e=>Ie(pe({},"__esModule",{value:!0}),e);var qt={};ct(qt,{AbstractAction:()=>ie,ActionsFactory:()=>be,Config:()=>ne,Documentation:()=>Ne,InputValidationError:()=>F,Integration:()=>xe,OutputValidationError:()=>W,attachSockets:()=>Fe,createSimpleConfig:()=>Be});module.exports=pt(qt);var B=require("zod/v4"),H=$(require("ramda"),1),de=H.tryCatch((e,t)=>typeof B.z.parse(e,t),H.always(void 0)),dt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),C=e=>e.charAt(0).toLowerCase()+e.slice(1),y=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,o=>`/${o}`).split("/")).map(dt).join(""),De=e=>e instanceof Error?e:e instanceof B.z.ZodError?new B.z.ZodRealError(e.issues):new Error(String(e)),Oe=e=>e instanceof B.z.ZodError?e.issues.map(({path:t,message:o})=>`${t.length?`${B.z.core.toDotPath(t)}: `:""}${o}`).join("; "):e.message,E=(e,t)=>mt(e)&&"_zod"in e&&(t?H.path(["_zod","def","type"],e)===t:!0),mt=e=>typeof e=="object"&&e!==null;var me=e=>({join:async t=>e.join(t),leave:async t=>typeof t=="string"?e.leave(t):Promise.all(t.map(o=>e.leave(o))).then(()=>{})});var Pe=$(require("node:assert/strict"),1);var ue=({sockets:e,...t})=>e.map(o=>({id:o.id,handshake:o.handshake,rooms:Array.from(o.rooms),getData:()=>o.data||{},emit:U({subject:o,...t}),...me(o)}));function U({subject:e,emission:t,timeout:o}){return async(r,...n)=>{let i="id"in e;(0,Pe.default)(r in t,new Error(`Unsupported event ${r}`));let{schema:s,ack:a}=t[r],p=s.parse(n);if(!a)return e.emit(String(r),...p)||!0;let f=await e.timeout(o).emitWithAck(String(r),...p);return(i?a:a.array()).parse(f)}}var ke=({subject:e,...t})=>o=>({getClients:async()=>ue({sockets:await e.in(o).fetchSockets(),...t}),broadcast:U({...t,subject:e.to(o)})});var Ue={onConnection:({client:{id:e,getData:t},logger:o})=>o.debug("Client connected",{...t(),id:e}),onDisconnect:({client:{id:e,getData:t},logger:o})=>o.debug("Client disconnected",{...t(),id:e}),onAnyIncoming:({event:e,client:{id:t,getData:o},logger:r})=>r.debug(`${e} from ${t}`,o()),onAnyOutgoing:({event:e,logger:t,payload:o})=>t.debug(`Sending ${e}`,o),onStartup:({logger:e})=>e.debug("Ready"),onError:({logger:e,event:t,error:o})=>e.error(t?`${t} handling error`:"Error",o)};var le="/",V=e=>{let t=e.trim();return t.startsWith("/")?t:`/${t}`};var L=require("ansis"),b=$(require("ramda"),1),ut=(0,L.italic)("for Sheila".padEnd(40)),lt="Proudly supports non-binary community.".padStart(57),ft=` ,, MMM"""AMV \u1FEF7MM .M"""bgd \u1FEF7MM mm M\u2019 AMV MM ,MI "Y MM MM \u1FEF AMV ,pW"Wq. ,M""bMM \u1FEFMMb. ,pW"Wq. ,p6"bo MM ,MP\u2019 .gP"Ya mmMMmm ,pP"Ybd AMV 6W\u2019 \u1FEFWb ,AP MM \u1FEFYMMNq. 6W\u2019 \u1FEFWb 6M\u2019 OO MM ;Y ,M\u2019 Yb MM 8I \u1FEF" AMV , 8M M8 8MI MM . \u1FEFMM 8M M8 8M MM;Mm 8M"""""" MM \u1FEFYMMMa. AMV ,M YA. ,A9 \u1FEFMb MM Mb dM YA. ,A9 YM. , MM \u1FEFMb. YM. , MM L. I8 AMVmmmmMM \u1FEFYbmd9\u2019 \u1FEFWbmd"MML. P"Ybmmd" \u1FEFYbmd9\u2019 YMbmd\u2019 .JMML. YA. \u1FEFMbmmd\u2019 \u1FEFMbmo M9mmmP\u2019 ${ut}${lt} `,yt=b.cond([[b.gt(4),b.always((0,L.hex)("#FCF434"))],[b.gt(5),b.always((0,L.hex)("#FFF"))],[b.gt(8),b.always((0,L.hex)("#9C59D1"))],[b.T,b.always((0,L.hex)("#383838"))]]),Le=()=>ft.split(` `).map((e,t)=>yt(t)(e)).join(` `);var Fe=async({io:e,actions:t,target:o,config:{namespaces:r,timeout:n,startupLogo:i=!0},logger:s=console})=>{for(let a in r){let p=e.of(V(a)),{emission:f,hooks:S,metadata:T}=r[a],{onConnection:te,onDisconnect:z,onAnyIncoming:R,onAnyOutgoing:I,onStartup:D,onError:N}={...Ue,...S},O={emission:f,timeout:n},oe={logger:s,withRooms:ke({subject:e,metadata:T,...O}),all:{getClients:async()=>ue({sockets:await p.fetchSockets(),metadata:T,...O}),getRooms:()=>Array.from(p.adapter.rooms.keys()),broadcast:U({subject:e,...O})}};p.on("connection",async m=>{let Z=U({subject:m,...O}),M=U({subject:m.broadcast,...O}),w={emit:Z,broadcast:M,id:m.id,handshake:m.handshake,getRequest:()=>m.request,isConnected:()=>m.connected,getRooms:()=>Array.from(m.rooms),getData:()=>m.data||{},setData:g=>{T.parse(g),m.data=g},...me(m)},k={...oe,client:w,withRooms:ke({subject:m,metadata:T,...O})};await te(k),m.onAny((g,...A)=>R({event:g,payload:A,...k})),m.onAnyOutgoing((g,...A)=>I({event:g,payload:A,...k}));for(let g of t)if(g.namespace===a){let{event:A}=g;m.on(A,async(...ve)=>{try{return await g.execute({params:ve,...k})}catch(ot){return N({...k,event:A,payload:ve,error:De(ot)})}})}m.on("disconnect",()=>z(k))}),await D(oe)}return(i?console.log:()=>{})(Le()),s.debug("Running","v4.0.0 (CJS)"),s.info("Listening",o.address()),e.attach(o)};var _e=require("zod/v4");var ne=class e{timeout;startupLogo;security;namespaces;constructor({timeout:t=2e3,startupLogo:o=!0,namespaces:r={},security:n=[]}={}){this.timeout=t,this.startupLogo=o,this.namespaces=r,this.security=n}addNamespace({path:t=le,emission:o={},metadata:r=_e.z.object({}),hooks:n={},security:i=[]}){let{namespaces:s,...a}=this,p={emission:o,hooks:n,metadata:r,security:i};return new e({...a,namespaces:{...s,[t]:p}})}},Be=({startupLogo:e,timeout:t,security:o,emission:r,hooks:n,metadata:i}={})=>new ne({startupLogo:e,timeout:t,security:o}).addNamespace({emission:r,metadata:i,hooks:n});var Se=$(require("ramda"),1),re=require("zod/v4");var He=require("zod/v4");var fe=class extends Error{name="IOSchemaError"},F=class extends fe{constructor(o){super(Oe(o),{cause:o});this.cause=o}name="InputValidationError"},W=class extends fe{constructor(o){let r=new He.z.ZodError(o.issues.map(({path:n,...i})=>({...i,path:["output",...n]})));super(Oe(r),{cause:o});this.cause=o}name="OutputValidationError"};var ye=require("zod/v4");var _=(e,t,o)=>{let r=ye.z.function({input:e,output:t}),n=ye.z.custom().transform((i,s)=>typeof i!="function"?(s.addIssue({...o,message:`Expected function, received ${typeof s.value}`}),ye.z.NEVER):r.implement(i));return Object.assign(n._zod.bag,{brand:"function",input:e,output:t}),n},he=e=>e._zod.bag.brand==="function"&&E(e._zod.bag.input,"tuple")&&E(e._zod.bag.output);var ie=class{},ge=class extends ie{#o;#t;#e;#n;#r;constructor(t){super(),this.#o=t.event,this.#t=t.ns||le,this.#e=t.input,this.#n="output"in t?t.output:void 0,this.#r=t.handler}get event(){return this.#o}get namespace(){return this.#t}get inputSchema(){return this.#e}get outputSchema(){return this.#n}#i(t){let o=this.#n?Se.init(t):t;try{return this.#e.parse(o)}catch(r){throw r instanceof re.z.ZodError?new F(r):r}}#s(t){if(this.#n)try{return _(this.#n,re.z.void(),{path:[Math.max(0,t.length-1)]}).parse(Se.last(t))}catch(o){throw o instanceof re.z.ZodError?new F(o):o}}#a(t){if(this.#n)try{return this.#n.parse(t)}catch(o){throw o instanceof re.z.ZodError?new W(o):o}}async execute({params:t,logger:o,...r}){let n=this.#i(t);o.debug(`${this.#o}: parsed input (${this.#n?"excl.":"no"} ack)`,n);let i=this.#s(t),s=await this.#r({input:n,logger:o,...r}),a=this.#a(s);i&&a&&(o.debug(`${this.#o}: parsed output`,a),i(...a))}};var be=class{constructor(t){this.config=t}build(t){return new ge(t)}};var Ce=$(require("typescript"),1);var j=$(require("ramda"),1),x=require("zod/v4");var Ve=(...e)=>e,$e=(e,t,o=3)=>{if(!t)return _(e,x.z.void());let r=_(t,x.z.void()),n=e._zod.def.rest;if(!n||o<=0)return _(x.z.tuple(Ve(...e._zod.def.items,r)),x.z.void());let i=x.globalRegistry.get(n)?.description,s=j.range(0,o).map(a=>{let p=[...e._zod.def.items].concat(j.range(1,a+1).map(f=>{let S=x.z.clone(n);return x.globalRegistry.add(S,{description:`${i||"rest"}${f}`}),S})).concat(r);return _(x.z.tuple(Ve(...p)),x.z.void())});return x.z.union(s)},We=(e,{io:t})=>{let r=[x.z.toJSONSchema(e,{io:t,unrepresentable:"any",override:({jsonSchema:n})=>{typeof n.default=="bigint"&&delete n.default}})];for(;r.length;){let n=r.shift();if(j.is(Object,n)){if(n.$ref==="#")return!0;r.push(...j.values(n))}j.is(Array,n)&&r.push(...j.values(n))}return!1};var d=$(require("typescript"),1),G=require("zod/v4");var Ee=(e,{onEach:t,rules:o,onMissing:r,ctx:n={}})=>{let i=o[he(e)?"function":e._zod.def.type],a=i?i(e,{...n,next:f=>Ee(f,{ctx:n,onEach:t,rules:o,onMissing:r})}):r(e,n),p=t&&t(e,{prev:a,...n});return p?{...a,...p}:a};var h=$(require("ramda"),1);var J=$(require("ramda"),1),u=$(require("typescript"),1),c=u.default.factory,Y=[c.createModifier(u.default.SyntaxKind.ExportKeyword)],se=(e,t)=>u.default.addSyntheticLeadingComment(e,u.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),Je=(e,t)=>{let o=u.default.createSourceFile("print.ts","",u.default.ScriptTarget.Latest,!1,u.default.ScriptKind.TS);return u.default.createPrinter(t).printNode(u.default.EmitHint.Unspecified,e,o)},ht=/^[A-Za-z_$][A-Za-z0-9_$]*$/,gt=e=>typeof e=="string"&&ht.test(e)?c.createIdentifier(e):qe(e),K=(e,t)=>typeof e=="number"?c.createKeywordTypeNode(e):typeof e=="string"||u.default.isIdentifier(e)?c.createTypeReferenceNode(e,t&&J.map(K,t)):e,Ye=(e,t,{isOptional:o,isDeprecated:r,comment:n}={})=>{let i=K(t),s=c.createPropertySignature(void 0,gt(e),o?c.createToken(u.default.SyntaxKind.QuestionToken):void 0,o?c.createUnionTypeNode([i,K(u.default.SyntaxKind.UndefinedKeyword)]):i),a=J.reject(J.isNil,[r?"@deprecated":void 0,n]);return a.length?se(s,a.join(" ")):s},Re=(e,t,{expose:o,comment:r}={})=>{let n=c.createTypeAliasDeclaration(o?Y:void 0,e,void 0,t);return r?se(n,r):n},qe=e=>typeof e=="number"?c.createNumericLiteral(e):typeof e=="bigint"?c.createBigIntLiteral(e.toString()):typeof e=="boolean"?e?c.createTrue():c.createFalse():e===null?c.createNull():c.createStringLiteral(e),q=e=>c.createLiteralTypeNode(qe(e)),St=[u.default.SyntaxKind.AnyKeyword,u.default.SyntaxKind.BigIntKeyword,u.default.SyntaxKind.BooleanKeyword,u.default.SyntaxKind.NeverKeyword,u.default.SyntaxKind.NumberKeyword,u.default.SyntaxKind.ObjectKeyword,u.default.SyntaxKind.StringKeyword,u.default.SyntaxKind.SymbolKeyword,u.default.SyntaxKind.UndefinedKeyword,u.default.SyntaxKind.UnknownKeyword,u.default.SyntaxKind.VoidKeyword],Ge=e=>St.includes(e.kind);var{factory:l}=d.default,bt={[d.default.SyntaxKind.AnyKeyword]:"",[d.default.SyntaxKind.BigIntKeyword]:BigInt(0),[d.default.SyntaxKind.BooleanKeyword]:!1,[d.default.SyntaxKind.NumberKeyword]:0,[d.default.SyntaxKind.ObjectKeyword]:{},[d.default.SyntaxKind.StringKeyword]:"",[d.default.SyntaxKind.UndefinedKeyword]:void 0},Ze={name:h.path(["name","text"]),type:h.path(["type"]),optional:h.path(["questionToken"])},xt=({_zod:{def:e}})=>{let t=e.values.map(o=>o===void 0?K(d.default.SyntaxKind.UndefinedKeyword):q(o));return t.length===1?t[0]:l.createUnionTypeNode(t)},Tt=({_zod:{def:e}},{next:t})=>{let o=[...e.parts],r=()=>{let s="";for(;o.length;){let a=o.shift();if(E(a)){o.unshift(a);break}s+=a??""}return s},n=l.createTemplateHead(r()),i=[];for(;o.length;){let s=t(o.shift()),a=r(),p=o.length?l.createTemplateMiddle:l.createTemplateTail;i.push(l.createTemplateLiteralTypeSpan(s,p(a)))}return i.length?l.createTemplateLiteralType(n,i):q(n.text)},Nt=(e,{isResponse:t,next:o,makeAlias:r})=>{let n=()=>{let i=Object.entries(e._zod.def.shape).map(([s,a])=>{let{description:p,deprecated:f}=G.globalRegistry.get(a)||{};return Ye(s,o(a),{comment:p,isDeprecated:f,isOptional:(t?a._zod.optout:a._zod.optin)==="optional"})});return l.createTypeLiteralNode(i)};return We(e,{io:t?"output":"input"})?r(e,n):n()},Ot=({_zod:{def:e}},{next:t})=>l.createArrayTypeNode(t(e.element)),kt=({_zod:{def:e}})=>l.createUnionTypeNode(Object.values(e.entries).map(q)),$t=({_zod:{def:e}},{next:t})=>{let o=new Map;for(let r of e.options){let n=t(r);o.set(Ge(n)?n.kind:n,n)}return l.createUnionTypeNode(Array.from(o.values()))},Et=e=>bt?.[e.kind],Rt=({_zod:{def:e}},{next:t})=>l.createUnionTypeNode([t(e.innerType),q(null)]),Zt=({_zod:{def:e}},{next:t})=>l.createTupleTypeNode(e.items.map(t).concat(e.rest===null?[]:l.createRestTypeNode(t(e.rest)))),Mt=({_zod:{def:e}},{next:t})=>K("Record",[e.keyType,e.valueType].map(t)),Ct=h.tryCatch(e=>{if(!e.every(d.default.isTypeLiteralNode))throw new Error("Not objects");let t=h.chain(h.prop("members"),e),o=h.uniqWith((...r)=>{if(!h.eqBy(Ze.name,...r))return!1;if(h.both(h.eqBy(Ze.type),h.eqBy(Ze.optional))(...r))return!0;throw new Error("Has conflicting prop")},t);return l.createTypeLiteralNode(o)},(e,t)=>l.createIntersectionTypeNode(t)),Kt=({_zod:{def:e}},{next:t})=>Ct([e.left,e.right].map(t)),v=e=>()=>K(e),ae=({_zod:{def:e}},{next:t})=>t(e.innerType),Qe=e=>K(e?d.default.SyntaxKind.UnknownKeyword:d.default.SyntaxKind.AnyKeyword),zt=({_zod:{def:e}},{next:t,isResponse:o})=>{let r=e[o?"out":"in"],n=e[o?"in":"out"];if(!E(r,"transform"))return t(r);let i=t(n),s=de(r,E(n,"date")?new Date:Et(i)),a={number:d.default.SyntaxKind.NumberKeyword,bigint:d.default.SyntaxKind.BigIntKeyword,boolean:d.default.SyntaxKind.BooleanKeyword,string:d.default.SyntaxKind.StringKeyword,undefined:d.default.SyntaxKind.UndefinedKeyword,object:d.default.SyntaxKind.ObjectKeyword};return K(s&&a[s]||Qe(o))},wt=()=>q(null),At=({_zod:{def:e}},{makeAlias:t,next:o})=>t(e.getter,()=>o(e.getter())),jt=()=>K("Date"),vt=(e,{next:t})=>{let o=e._zod.bag.input._zod.def.items.map((n,i)=>{let{description:s}=G.globalRegistry.get(n)||{};return l.createParameterDeclaration(void 0,void 0,l.createIdentifier(s?C(y(s)):`${he(n)?"cb":"p"}${i+1}`),void 0,t(n))}),{rest:r}=e._zod.bag.input._zod.def;if(r){let{description:n}=G.globalRegistry.get(r)||{};o.push(l.createParameterDeclaration(void 0,l.createToken(d.default.SyntaxKind.DotDotDotToken),l.createIdentifier(n?C(y(n)):"rest"),void 0,t(G.z.array(r))))}return l.createFunctionTypeNode(void 0,o,t(e._zod.bag.output))},It={string:v(d.default.SyntaxKind.StringKeyword),number:v(d.default.SyntaxKind.NumberKeyword),bigint:v(d.default.SyntaxKind.BigIntKeyword),boolean:v(d.default.SyntaxKind.BooleanKeyword),any:v(d.default.SyntaxKind.AnyKeyword),undefined:v(d.default.SyntaxKind.UndefinedKeyword),never:v(d.default.SyntaxKind.NeverKeyword),void:v(d.default.SyntaxKind.VoidKeyword),unknown:v(d.default.SyntaxKind.UnknownKeyword),date:jt,null:wt,array:Ot,tuple:Zt,record:Mt,object:Nt,literal:xt,template_literal:Tt,intersection:Kt,union:$t,default:ae,enum:kt,optional:ae,nonoptional:ae,nullable:Rt,catch:ae,pipe:zt,lazy:At,readonly:ae,function:vt},Me=(e,t)=>Ee(e,{rules:It,onMissing:({},{isResponse:o})=>Qe(o),ctx:t});var Dt="root",Xe=["emission","actions"],xe=class{#o=[];#t={};#e={path:c.createIdentifier("path"),socket:c.createIdentifier("Socket"),socketBase:c.createIdentifier("SocketBase"),ioClient:c.createStringLiteral("socket.io-client"),emission:c.createIdentifier(y(Xe[0])),actions:c.createIdentifier(y(Xe[1]))};registry={};#n(t,o,r){let n=this.#t[t].get(o)?.name?.text;if(!n){n=`Type${this.#t[t].size+1}`;let i=c.createLiteralTypeNode(c.createNull());this.#t[t].set(o,Re(n,i)),this.#t[t].set(o,Re(n,r()))}return c.createTypeReferenceNode(n)}constructor({config:{namespaces:t},actions:o,maxOverloads:r=3}){this.#o.push(c.createImportDeclaration(void 0,c.createImportClause(!0,void 0,c.createNamedImports([c.createImportSpecifier(!1,this.#e.socket,this.#e.socketBase)])),this.#e.ioClient));for(let[n,{emission:i}]of Object.entries(t)){this.#t[n]=new Map,this.registry[n]={emission:[],actions:[]};let s={makeAlias:this.#n.bind(this,n)};for(let[a,{schema:p,ack:f}]of Object.entries(i)){let S=Me($e(p,f,r),{isResponse:!0,...s});this.registry[n].emission.push({event:a,node:S})}for(let a of o)if(a.namespace===n){let{event:p,inputSchema:f,outputSchema:S}=a,T=Me($e(f,S,r),{isResponse:!1,...s});this.registry[n].actions.push({event:p,node:T})}}for(let n in this.registry){let i=y(n)||y(Dt),s=c.createVariableStatement(Y,c.createVariableDeclarationList([c.createVariableDeclaration(this.#e.path,void 0,void 0,c.createStringLiteral(V(n)))],Ce.default.NodeFlags.Const));se(s,`@desc The actual path of the ${i} namespace`);let a=Object.entries(this.registry[n]).map(([f,S])=>c.createInterfaceDeclaration(Y,y(f),void 0,void 0,S.map(({event:T,node:te})=>c.createPropertySignature(void 0,T,void 0,te)))),p=c.createTypeAliasDeclaration(Y,this.#e.socket,void 0,c.createTypeReferenceNode(this.#e.socketBase,[c.createTypeReferenceNode(this.#e.emission),c.createTypeReferenceNode(this.#e.actions)]));se(p,`@example const socket: ${i}.${this.#e.socket.text} = io(${i}.${this.#e.path.text})`),this.#o.push(c.createModuleDeclaration(Y,c.createIdentifier(i),c.createModuleBlock([s,...this.#t[n].values(),...a,p]),Ce.default.NodeFlags.Namespace))}}print(t){return this.#o.map(o=>Je(o,t)).join(` `)}};var ee=require("zod/v4");var et=$(require("yaml"),1),Te=class{document;constructor(t){this.document={asyncapi:"3.0.0",...t,servers:{},channels:{},components:{}}}addServer(t,o){return this.document.servers={...this.document.servers,[t]:o},this}addChannel(t,o){return this.document.channels={...this.document.channels,[t]:o},this}addOperation(t,o){return this.document.operations={...this.document.operations,[t]:o},this}addSecurityScheme(t,o){return this.document.components={...this.document.components,securitySchemes:{...this.document.components?.securitySchemes,[t]:o}},this}addSchema(t,o){return this.document.components={...this.document.components,schemas:{...this.document.components?.schemas,[t]:o}},this}getSpec(){return this.document}getSpecAsJson(t,o){return JSON.stringify(this.document,t,o)}getSpecAsYaml(){return et.default.stringify(this.document)}};var P=$(require("ramda"),1),Q=require("zod/v4");function Ke(e){return"$ref"in e}var tt={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Pt=({zodSchema:e,jsonSchema:t})=>{if(!E(e,"union")||!("discriminator"in e._zod.def))return t;let o=e._zod.def.discriminator;return{...t,discriminator:t.discriminator??{propertyName:o}}},Ut=({jsonSchema:e})=>{if(!e.anyOf)return e;let t=e.anyOf[0];return Object.assign(t,{type:Vt(t.type)})},Lt=()=>({type:"string",format:"bigint",pattern:/^-?\d+$/.source}),Ft=({zodSchema:e,jsonSchema:t})=>e._zod.def.rest!==null?t:{...t,items:{not:{}}},_t=({zodSchema:e,jsonSchema:t},o)=>{let r=e._zod.def[o.isResponse?"out":"in"],n=e._zod.def[o.isResponse?"in":"out"];if(!E(r,"transform"))return t;let i=X(we(n,{ctx:o}));if(!Ke(i))if(o.isResponse){let s=de(r,E(n,"date")?new Date:Ht(i));if(s&&["number","string","boolean"].includes(s))return{...t,type:s}}else{let{type:s,...a}=i;return{...a,format:`${a.format||s} (preprocessed)`}}return t},Bt=e=>e in tt,X=({$ref:e,type:t,allOf:o,oneOf:r,anyOf:n,not:i,...s})=>{if(e)return{$ref:e};let a={type:t&&Bt(t)?t:void 0,...s};for(let[p,f]of P.toPairs({allOf:o,oneOf:r,anyOf:n}))f&&(a[p]=f.map(X));return i&&(a.not=X(i)),a},Ht=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return tt?.[t]},Vt=e=>e==="null"?e:typeof e=="string"?[e,"null"]:e&&[...new Set(e).add("null")],Wt=()=>({format:"date"}),Jt={nullable:Ut,union:Pt,bigint:Lt,tuple:Ft,pipe:_t,date:Wt},Yt=(e,t,o)=>{let r=[e,t];for(;r.length;){let n=r.shift();if(P.is(Object,n)){if(Ke(n)&&!n.$ref.startsWith("#/components")){let i=n.$ref.split("/").pop(),s=t[i];s&&(n.$ref=o.makeRef(s.id||s,X(s)).$ref);continue}r.push(...P.values(n))}P.is(Array,n)&&r.push(...P.values(n))}return e},we=(e,{ctx:t,rules:o=Jt})=>{let{$defs:r={},properties:n={}}=Q.z.toJSONSchema(Q.z.object({subject:e}),{unrepresentable:"any",io:t.isResponse?"output":"input",override:i=>{let s=o[i.zodSchema._zod.def.type];if(s){let a={...s(i,t)};for(let p in i.jsonSchema)delete i.jsonSchema[p];Object.assign(i.jsonSchema,a)}}});return Yt(n.subject,r,t)},ze=e=>{let{examples:t,example:o}=Q.globalRegistry.get(e)||{};if(t)return Array.isArray(t)?t:Object.values(t).map(({value:r})=>r);if(o!==void 0)return[o];if(E(e,"tuple")){let r=[];for(let n of e._zod.def.items){let i=ze(n);i.length&&r.push(i[0])}if(r.length!==e._zod.def.items.length)return[];if(e._zod.def.rest){let n=ze(e._zod.def.rest);n.length&&r.push(n[0])}if(r.length)return[r]}return[]},ce=({event:e,schema:t,isResponse:o,isAck:r,makeRef:n})=>{let i={name:r?void 0:e,title:r?`Acknowledgement for ${e}`:e,payload:X(we(t,{ctx:{isResponse:o,makeRef:n}}))},s=ze(t).map(a=>({payload:a}));return s.length&&(i.examples=s),i},Ae=({isResponse:e,channelId:t,messageId:o,ackId:r,event:n,ns:i,securityIds:s})=>({action:e?"send":"receive",channel:{$ref:`#/channels/${t}`},messages:[{$ref:`#/channels/${t}/messages/${o}`}],title:n,summary:`${e?"Outgoing":"Incoming"} event ${n}`,description:`The message ${e?"produced":"consumed"} by the application within the ${i} namespace`,security:s&&s.length?s.map(a=>({$ref:`#/components/securitySchemes/${a}`})):void 0,reply:r?{address:{location:"$message.payload#",description:"Last argument: acknowledgement handler"},channel:{$ref:`#/channels/${t}`},messages:[{$ref:`#/channels/${t}/messages/${r}`}]}:void 0}),je=(e,{extra:t,makeRef:o})=>Object.assign(X(we(Q.z.object(e),{ctx:{isResponse:!1,makeRef:o}})),t);var Ne=class extends Te{#o=new Map;#t(t,o,r=this.#o.get(t)){return r||(r=`Schema${this.#o.size+1}`,this.#o.set(t,r)),this.addSchema(r,o),{$ref:`#/components/schemas/${r}`}}#e(){return{bindingVersion:"0.1.0",method:"GET",headers:je({connection:ee.z.literal("Upgrade").optional(),upgrade:ee.z.literal("websocket").optional()},{makeRef:this.#t.bind(this)}),query:je({EIO:ee.z.literal("4").describe("The version of the protocol"),transport:ee.z.enum(["polling","websocket"]).describe("The name of the transport"),sid:ee.z.string().optional().describe("The session identifier")},{makeRef:this.#t.bind(this),extra:{externalDocs:{description:"Engine.IO Protocol",url:"https://socket.io/docs/v4/engine-io-protocol/"}}})}}constructor({actions:t,config:{namespaces:o,security:r},title:n,version:i,documentId:s,description:a,contact:p,license:f,servers:S={}}){super({info:{title:n,version:i,contact:p,license:f,description:a},id:s,defaultContentType:"text/plain"});let T=[];for(let[z,R]of Object.entries(r)){let I=C(y(`server security ${z}`));this.addSecurityScheme(I,R),T.push(I)}for(let z in S){let R=new URL(S[z].url);this.addServer(z,{description:S[z].description,host:R.host,pathname:R.pathname,protocol:R.protocol.slice(0,-1),security:T.length?T.map(I=>({$ref:`#/components/securitySchemes/${I}`})):void 0}),this.document.id||(this.document.id=`urn:${R.host.split(".").concat(R.pathname.slice(1).split("/")).join(":")}`)}let te=this.#e();for(let[z,{emission:R,security:I}]of Object.entries(o)){let D=V(z),N=y(D)||"Root",O={},oe=[];for(let[m,Z]of Object.entries(I)){let M=C(y(`${N} security ${m}`));this.addSecurityScheme(M,Z),oe.push(M)}for(let[m,{schema:Z,ack:M}]of Object.entries(R)){let w={event:m,makeRef:this.#t.bind(this)},k=C(y(`${N} outgoing ${m}`)),g=C(y(`${N} ack for outgoing ${m}`));O[k]=ce({...w,schema:Z,isResponse:!0}),M&&(O[g]=ce({...w,schema:M,isResponse:!1,isAck:!0})),this.addOperation(y(`${N} send operation ${m}`),Ae({...w,ns:D,channelId:N,messageId:k,isResponse:!0,ackId:M&&g}))}for(let m of t)if(m.namespace===D){let{event:Z,inputSchema:M,outputSchema:w}=m,k={event:Z,makeRef:this.#t.bind(this)},g=C(y(`${N} incoming ${Z}`)),A=C(y(`${N} ack for incoming ${Z}`));O[g]=ce({...k,schema:M,isResponse:!1}),w&&(O[A]=ce({...k,schema:w,isResponse:!0,isAck:!0})),this.addOperation(y(`${N} recv operation ${Z}`),Ae({event:Z,ns:D,channelId:N,messageId:g,isResponse:!1,ackId:w&&A,securityIds:oe}))}this.addChannel(N,{address:D,title:`Namespace ${D}`,bindings:{ws:te},messages:O})}}};0&&(module.exports={AbstractAction,ActionsFactory,Config,Documentation,InputValidationError,Integration,OutputValidationError,attachSockets,createSimpleConfig});