UNPKG

@furystack/websocket-api

Version:
83 lines 4.53 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; import { InMemoryStore, User, addStore } from '@furystack/core'; import { getPort } from '@furystack/core/port-generator'; import { Injectable, Injector } from '@furystack/inject'; import { DefaultSession } from '@furystack/rest-service'; import { usingAsync } from '@furystack/utils'; import { describe, expect, it } from 'vitest'; import { WebSocket } from 'ws'; import { useWebsockets } from './helpers.js'; import { WebSocketApi } from './websocket-api.js'; describe('WebSocketApi', () => { it('Should be built', async () => { await usingAsync(new Injector(), async (i) => { addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })).addStore(new InMemoryStore({ model: DefaultSession, primaryKey: 'sessionId' })); useWebsockets(i, { port: getPort() }); expect(i.getInstance(WebSocketApi)).toBeInstanceOf(WebSocketApi); }); }); it('Should be built with settings', async () => { await usingAsync(new Injector(), async (i) => { addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })).addStore(new InMemoryStore({ model: DefaultSession, primaryKey: 'sessionId' })); useWebsockets(i, { path: '/web-socket', port: getPort() }); expect(i.getInstance(WebSocketApi)).toBeInstanceOf(WebSocketApi); }); }); it('Should broadcast messages', async () => { const port = getPort(); await usingAsync(new Injector(), async (i) => { addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })).addStore(new InMemoryStore({ model: DefaultSession, primaryKey: 'sessionId' })); expect.assertions(5); // All 5 clients should receive the message useWebsockets(i, { path: '/web-socket', port }); const api = i.getInstance(WebSocketApi); await Promise.all([1, 2, 3, 4, 5].map(async () => { const client = new WebSocket(`ws://localhost:${port}/web-socket`); await new Promise((resolve) => client.once('open', () => { resolve(); })); client.once('message', (data) => { expect(data.toString()).toBe('alma'); }); await api.broadcast(({ ws }) => { ws.send('alma'); }); client.close(); await new Promise((resolve) => client.once('close', () => resolve())); })); }); }); it('Should receive client messages', async () => { const port = getPort(); await usingAsync(new Injector(), async (i) => { addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })).addStore(new InMemoryStore({ model: DefaultSession, primaryKey: 'sessionId' })); expect.assertions(1); const data = { value: 'alma' }; let ExampleWsAction = class ExampleWsAction { [Symbol.dispose]() { /** */ } static canExecute() { return true; } async execute(incomingData) { expect(JSON.parse(incomingData.data.toString())).toEqual(data); } }; ExampleWsAction = __decorate([ Injectable() ], ExampleWsAction); useWebsockets(i, { path: '/web-socket', port, actions: [ExampleWsAction] }); const client = new WebSocket(`ws://localhost:${port}/web-socket`); await new Promise((resolve) => client.once('open', () => resolve())); await new Promise((resolve, reject) => client.send(JSON.stringify(data), (err) => (err ? reject(err) : resolve()))); client.close(); await new Promise((resolve) => client.once('close', () => resolve())); }); }); }); //# sourceMappingURL=websocket-api.spec.js.map