UNPKG

rjweb-server

Version:

Easy and Robust Way to create a Web Server with Many Easy-to-use Features in NodeJS

83 lines (82 loc) 2.47 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const parseContent_1 = __importDefault(require("../functions/parseContent")); const utils_1 = require("@rjweb/utils"); class Channel { /** * Create a new Channel * @example * ``` * import { Server, Channel } from "rjweb-server" * import { Runtime } from "@rjweb/runtime-bun" * * const echo = new Channel<string>() * * const server = new Server(Runtime, { * port: 8000 * }) * * server.path('/', (path) => path * .ws('/echo', (ws) => ws * .onOpen((ctr) => { * ctr.printChannel(echo) * }) * .onMessage((ctr) => { * echo.send(ctr.rawMessage()) // will send the message to all subscribed sockets * }) * ) * .http('GET', '/last-echo', (http) => http * .onRequest((ctr) => { * return ctr.print(echo.last()) * }) * ) * ) * * server.start().then(() => console.log('Server Started!')) * ``` * @since 9.0.0 */ constructor(id, initial) { this.listeners = []; this.onPublish = null; this.data = initial ?? null; this.id = id ?? utils_1.number.generate(1, 10000000); } /** * Send Data to each Subscriber (and listener) * @since 9.0.0 */ async send(type, data, prettify = false) { for (const listener of this.listeners) { await Promise.resolve(listener(data)); } if (this.onPublish) try { const parsed = (await (0, parseContent_1.default)(data, prettify)).content; if (this.onPublish) this.onPublish(type, parsed); } catch { } this.data = data; return this; } /** * Get the last sent value * @since 9.0.0 */ last() { return (0, utils_1.as)(this.data); } /** * Listen for send events on this Channel * @since 9.0.0 */ listen(callback) { this.listeners.push(callback); return () => { const res = utils_1.array.remove(this.listeners, 'value', callback); this.listeners.length = 0; this.listeners.push(...res); }; } } exports.default = Channel;