{"version":3,"sources":["../src/browser.ts","../src/restHandshakeRouter.ts","../src/types.ts"],"sourcesContent":["import {\n    HijackedRestService,\n    enableLogger as restLogger,\n    mockedFetch,\n} from '@fakehost/fake-rest/browser'\nimport { BrowserWsHost, enableLogger as wsLogger, Host, MockedSocket } from '@fakehost/exchange'\nimport { restRouter } from './restHandshakeRouter'\nimport { isFakeSignalrHub, URL, Signalr } from './types'\n\nexport { MockedSocket }\n\nexport type ServerOptions<T extends Record<string, unknown>> = {\n    url: URL\n    name?: string\n    silent?: boolean\n    debug?: boolean\n    hubs: T\n}\n\nexport type CreateBrowserSignalr<T extends Record<string, unknown>> = {\n    dispose: () => Promise<void>\n    url: URL\n    disconnect: (key: keyof T) => void\n    MockedSocket: BrowserWsHost['WebSocket']\n    mockedFetch: typeof mockedFetch\n}\n\nconst objectKeys = <T extends Record<string, unknown>>(x: T) => Object.keys(x) as (keyof T)[]\n\nexport const createInBrowserSignalr = async <T extends Record<string, unknown>>(\n    options: ServerOptions<T>,\n): Promise<CreateBrowserSignalr<T>> => {\n    if (options.debug) {\n        restLogger()\n        wsLogger()\n    }\n\n    // hijack the http requests to server the handshake response\n    const httpRest = new HijackedRestService(options.url, restRouter, {\n        name: options.name,\n        silent: false,\n    })\n\n    // signalr client lib requires the endpoint protocol to be ws://\n    const wsUrl = new URL(options.url)\n    wsUrl.protocol = 'ws:'\n\n    const hosts = objectKeys(options.hubs)\n        .filter(hubName => isFakeSignalrHub(options.hubs[hubName]))\n        .reduce((acc, hubName) => {\n            const hub = options.hubs[hubName]\n            if (isFakeSignalrHub(hub)) {\n                // BrowserWsHost uses `mock-socket` under the hood.\n                // This doesn't support wildcards paths, so we need to create a new host for each hub.\n                const host = new BrowserWsHost({\n                    url: new URL(hub.path, wsUrl),\n                    silent: options.silent,\n                    name: `${options.name || 'fake'}:${hubName as string}`,\n                })\n                hub.setHost(host)\n                acc[hubName] = {\n                    disconnect: host.disconnect,\n                }\n            }\n            return acc\n        }, {} as Record<keyof T, Pick<BrowserWsHost, 'disconnect'>>)\n\n    return {\n        MockedSocket,\n        mockedFetch: mockedFetch,\n        url: options.url,\n        disconnect: key => hosts[key].disconnect(),\n        dispose: async () => {\n            const wshosts = Array.from(Object.values(hosts)) as Host[]\n            await Promise.all([...wshosts, httpRest.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;AAAA,qBAIO;AACP,sBAA4E;;;ACJ5E,uBAAmC;AACnC,kBAA2B;AAEpB,IAAM,iBAAa,+BAAa,EAClC,QAAI,uBAAK,CAAC,EACV,IAAI,CAAC,GAAG,QAAQ;AACb,QAAM,mBAAe,YAAAA,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;;;AFMzC,IAAM,aAAa,CAAoC,MAAS,OAAO,KAAK,CAAC;AAEtE,IAAM,yBAAyB,OAClC,YACmC;AACnC,MAAI,QAAQ,OAAO;AACf,uBAAAC,cAAW;AACX,wBAAAC,cAAS;AAAA,EACb;AAGA,QAAM,WAAW,IAAI,mCAAoB,QAAQ,KAAK,YAAY;AAAA,IAC9D,MAAM,QAAQ;AAAA,IACd,QAAQ;AAAA,EACZ,CAAC;AAGD,QAAM,QAAQ,IAAI,IAAI,QAAQ,GAAG;AACjC,QAAM,WAAW;AAEjB,QAAM,QAAQ,WAAW,QAAQ,IAAI,EAChC,OAAO,aAAW,iBAAiB,QAAQ,KAAK,OAAO,CAAC,CAAC,EACzD,OAAO,CAAC,KAAK,YAAY;AACtB,UAAM,MAAM,QAAQ,KAAK,OAAO;AAChC,QAAI,iBAAiB,GAAG,GAAG;AAGvB,YAAM,OAAO,IAAI,8BAAc;AAAA,QAC3B,KAAK,IAAI,IAAI,IAAI,MAAM,KAAK;AAAA,QAC5B,QAAQ,QAAQ;AAAA,QAChB,MAAM,GAAG,QAAQ,QAAQ,MAAM,IAAI,OAAiB;AAAA,MACxD,CAAC;AACD,UAAI,QAAQ,IAAI;AAChB,UAAI,OAAO,IAAI;AAAA,QACX,YAAY,KAAK;AAAA,MACrB;AAAA,IACJ;AACA,WAAO;AAAA,EACX,GAAG,CAAC,CAAuD;AAE/D,SAAO;AAAA,IACH;AAAA,IACA,aAAa;AAAA,IACb,KAAK,QAAQ;AAAA,IACb,YAAY,SAAO,MAAM,GAAG,EAAE,WAAW;AAAA,IACzC,SAAS,YAAY;AACjB,YAAM,UAAU,MAAM,KAAK,OAAO,OAAO,KAAK,CAAC;AAC/C,YAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,SAAS,QAAQ,CAAC,CAAC;AAAA,IACtD;AAAA,EACJ;AACJ;","names":["uuid","Url","restLogger","wsLogger"]}