{"version":3,"sources":["../src/createServer.ts","../src/restHandshakeRouter.ts","../src/types.ts"],"sourcesContent":["import { HttpRestService, enableLogger as restLogger } from '@fakehost/fake-rest/server'\nimport { CloseConnectionOptions, WsHost, Host, enableLogger as wsLogger } from '@fakehost/exchange'\nimport { URL } from 'url'\nimport { restRouter } from './restHandshakeRouter'\nimport { isFakeSignalrHub } from './types'\n\nexport type ServerOptions<T extends Record<string, unknown>> = {\n    port?: number\n    name?: string\n    silent?: boolean\n    debug?: boolean\n    hubs: T\n}\n\ntype CreateServerSignalr<T extends object> = {\n    dispose: () => Promise<void>\n    url: URL\n    host: Host\n    disconnect: (hub: keyof T, options?: CloseConnectionOptions) => void\n}\n\nconst objectKeys = <T extends Record<string, unknown>>(x: T) => Object.keys(x) as (keyof T)[]\n\nexport const createServerSignalr = async <T extends Record<string, unknown>>(\n    options: ServerOptions<T>,\n): Promise<CreateServerSignalr<T>> => {\n    // hijack the http requests to serve the signalr handshake response\n    const rest = new HttpRestService(restRouter, {\n        name: `http://${options?.name}`,\n        port: options?.port,\n        silent: true,\n    })\n\n    const wsHost = new WsHost({\n        server: rest.server,\n        name: `ws://${options?.name}`,\n        debug: options.debug,\n    })\n\n    const hubResult = objectKeys(options.hubs).reduce((acc, hubName) => {\n        const hub = options.hubs[hubName]\n        if (isFakeSignalrHub(hub)) {\n            hub.setHost(wsHost)\n            acc[hubName] = {\n                disconnect: () => wsHost.disconnect({ path: hub.path }),\n            }\n        }\n        return acc\n    }, {} as Record<keyof T, Pick<Host, 'disconnect'>>)\n    options?.debug && wsLogger()\n    options?.debug && restLogger()\n\n    const hostUrl = await wsHost.url\n\n    const url = new URL(`http://${hostUrl.hostname}${hostUrl.port ? ':' + hostUrl.port : ''}`)\n\n    return {\n        host: wsHost,\n        disconnect: (hub: keyof T, options?: CloseConnectionOptions) => {\n            return hubResult[hub].disconnect(options)\n        },\n        url: url,\n        dispose: async () => {\n            await Promise.all([rest.dispose(), wsHost.dispose()])\n        },\n    }\n}\n","import { ConnectionId } from '@fakehost/exchange'\nimport { createRouter, cors } from '@fakehost/fake-rest'\nimport { v4 as uuid } from 'uuid'\n\nexport const restRouter = createRouter()\n    .use(cors())\n    .use((_, res) => {\n        const connectionId = uuid() as ConnectionId\n        res.json(signalrHandshake(connectionId))\n    })\n\nconst signalrHandshake = (connectionId: ConnectionId) => ({\n    negotiateVersion: 1,\n    connectionId: connectionId,\n    connectionToken: connectionId,\n    availableTransports: [\n        { transport: 'WebSockets', transferFormats: ['Text', 'Binary'] },\n        { transport: 'ServerSentEvents', transferFormats: ['Text'] },\n        { transport: 'LongPolling', transferFormats: ['Text', 'Binary'] },\n    ],\n})\n","import Url from 'url'\nimport { FakeSignalrHub } from './FakeSignalrHub'\n\nexport type Signalr<T> = T extends FakeSignalrHub<infer H, infer R, infer S>\n    ? FakeSignalrHub<H, R, S>\n    : never\n\nexport type SignalrHubCollection<T> = {\n    readonly [Key in keyof T]: Signalr<T[Key]>\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const isFakeSignalrHub = (hub: any): hub is FakeSignalrHub<any, any, any> => {\n    // HACK: sDue to how cypress runs in different processes, have to perform this super hack\n    return (\n        'constructor' in hub &&\n        'name' in hub.constructor &&\n        hub.constructor.name === 'FakeSignalrHub'\n    )\n}\n\nexport const URL = globalThis.URL || Url.URL\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA4D;AAC5D,sBAA+E;AAC/E,IAAAA,cAAoB;;;ACDpB,uBAAmC;AACnC,kBAA2B;AAEpB,IAAM,iBAAa,+BAAa,EAClC,QAAI,uBAAK,CAAC,EACV,IAAI,CAAC,GAAG,QAAQ;AACb,QAAM,mBAAe,YAAAC,IAAK;AAC1B,MAAI,KAAK,iBAAiB,YAAY,CAAC;AAC3C,CAAC;AAEL,IAAM,mBAAmB,CAAC,kBAAgC;AAAA,EACtD,kBAAkB;AAAA,EAClB;AAAA,EACA,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,IACjB,EAAE,WAAW,cAAc,iBAAiB,CAAC,QAAQ,QAAQ,EAAE;AAAA,IAC/D,EAAE,WAAW,oBAAoB,iBAAiB,CAAC,MAAM,EAAE;AAAA,IAC3D,EAAE,WAAW,eAAe,iBAAiB,CAAC,QAAQ,QAAQ,EAAE;AAAA,EACpE;AACJ;;;ACpBA,iBAAgB;AAYT,IAAM,mBAAmB,CAAC,QAAmD;AAEhF,SACI,iBAAiB,OACjB,UAAU,IAAI,eACd,IAAI,YAAY,SAAS;AAEjC;AAEO,IAAM,MAAM,WAAW,OAAO,WAAAC,QAAI;;;AFAzC,IAAM,aAAa,CAAoC,MAAS,OAAO,KAAK,CAAC;AAEtE,IAAM,sBAAsB,OAC/B,YACkC;AAElC,QAAM,OAAO,IAAI,8BAAgB,YAAY;AAAA,IACzC,MAAM,UAAU,mCAAS,IAAI;AAAA,IAC7B,MAAM,mCAAS;AAAA,IACf,QAAQ;AAAA,EACZ,CAAC;AAED,QAAM,SAAS,IAAI,uBAAO;AAAA,IACtB,QAAQ,KAAK;AAAA,IACb,MAAM,QAAQ,mCAAS,IAAI;AAAA,IAC3B,OAAO,QAAQ;AAAA,EACnB,CAAC;AAED,QAAM,YAAY,WAAW,QAAQ,IAAI,EAAE,OAAO,CAAC,KAAK,YAAY;AAChE,UAAM,MAAM,QAAQ,KAAK,OAAO;AAChC,QAAI,iBAAiB,GAAG,GAAG;AACvB,UAAI,QAAQ,MAAM;AAClB,UAAI,OAAO,IAAI;AAAA,QACX,YAAY,MAAM,OAAO,WAAW,EAAE,MAAM,IAAI,KAAK,CAAC;AAAA,MAC1D;AAAA,IACJ;AACA,WAAO;AAAA,EACX,GAAG,CAAC,CAA8C;AAClD,sCAAS,cAAS,gBAAAC,cAAS;AAC3B,sCAAS,cAAS,cAAAC,cAAW;AAE7B,QAAM,UAAU,MAAM,OAAO;AAE7B,QAAM,MAAM,IAAI,gBAAI,UAAU,QAAQ,QAAQ,GAAG,QAAQ,OAAO,MAAM,QAAQ,OAAO,EAAE,EAAE;AAEzF,SAAO;AAAA,IACH,MAAM;AAAA,IACN,YAAY,CAAC,KAAcC,aAAqC;AAC5D,aAAO,UAAU,GAAG,EAAE,WAAWA,QAAO;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,SAAS,YAAY;AACjB,YAAM,QAAQ,IAAI,CAAC,KAAK,QAAQ,GAAG,OAAO,QAAQ,CAAC,CAAC;AAAA,IACxD;AAAA,EACJ;AACJ;","names":["import_url","uuid","Url","wsLogger","restLogger","options"]}