UNPKG

@fakehost/signalr

Version:

A Fake Signalr Service for faking/mocking signalr hub services for testing, prototyping, and demoing

1 lines 5.99 kB
{"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"]}