@furystack/websocket-api
Version:
HTTP Api FuryStack package
83 lines • 4.53 kB
JavaScript
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