@interopio/gateway-server 0.4.0-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/changelog.md +94 -0
  2. package/dist/gateway-ent.cjs +305 -0
  3. package/dist/gateway-ent.cjs.map +7 -0
  4. package/dist/gateway-ent.js +277 -0
  5. package/dist/gateway-ent.js.map +7 -0
  6. package/dist/index.cjs +1713 -0
  7. package/dist/index.cjs.map +7 -0
  8. package/dist/index.js +1682 -0
  9. package/dist/index.js.map +7 -0
  10. package/dist/metrics-rest.cjs +21440 -0
  11. package/dist/metrics-rest.cjs.map +7 -0
  12. package/dist/metrics-rest.js +21430 -0
  13. package/dist/metrics-rest.js.map +7 -0
  14. package/gateway-server.d.ts +69 -0
  15. package/package.json +66 -0
  16. package/readme.md +9 -0
  17. package/src/common/compose.ts +40 -0
  18. package/src/gateway/ent/config.ts +174 -0
  19. package/src/gateway/ent/index.ts +18 -0
  20. package/src/gateway/ent/logging.ts +89 -0
  21. package/src/gateway/ent/server.ts +34 -0
  22. package/src/gateway/metrics/rest.ts +20 -0
  23. package/src/gateway/ws/core.ts +90 -0
  24. package/src/index.ts +3 -0
  25. package/src/logger.ts +6 -0
  26. package/src/mesh/connections.ts +101 -0
  27. package/src/mesh/rest-directory/routes.ts +38 -0
  28. package/src/mesh/ws/broker/core.ts +163 -0
  29. package/src/mesh/ws/cluster/core.ts +107 -0
  30. package/src/mesh/ws/relays/core.ts +159 -0
  31. package/src/metrics/routes.ts +86 -0
  32. package/src/server/address.ts +47 -0
  33. package/src/server/cors.ts +311 -0
  34. package/src/server/exchange.ts +379 -0
  35. package/src/server/monitoring.ts +167 -0
  36. package/src/server/types.ts +69 -0
  37. package/src/server/ws-client-verify.ts +79 -0
  38. package/src/server.ts +316 -0
  39. package/src/utils.ts +10 -0
  40. package/types/gateway-ent.d.ts +212 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/server.ts", "../src/logger.ts", "../src/utils.ts", "../src/server/types.ts", "../src/server/exchange.ts", "../src/gateway/ws/core.ts", "../src/mesh/connections.ts", "../src/mesh/rest-directory/routes.ts", "../src/mesh/ws/broker/core.ts", "../src/mesh/ws/relays/core.ts", "../src/mesh/ws/cluster/core.ts", "../src/metrics/routes.ts", "../src/common/compose.ts", "../src/server/address.ts", "../src/server/monitoring.ts", "../src/server/ws-client-verify.ts", "../src/server/cors.ts"],
4
+ "sourcesContent": ["import * as GatewayServer from './server.js';\nexport {GatewayServer};\nexport default GatewayServer.Factory;\n", "import {WebSocketServer} from 'ws';\nimport http from 'node:http';\nimport https from 'node:https';\nimport {SecureContextOptions} from 'node:tls';\nimport {AddressInfo} from 'node:net';\nimport {readFileSync} from 'node:fs';\nimport {AsyncLocalStorage} from 'node:async_hooks';\nimport {IOGateway} from '@interopio/gateway';\nimport wsGateway from './gateway/ws/core.js';\nimport NodeConnections from './mesh/connections.js';\nimport restDirectory from './mesh/rest-directory/routes.js';\nimport meshBroker from './mesh/ws/broker/core.js';\nimport meshRelays from './mesh/ws/relays/core.js';\nimport meshCluster from './mesh/ws/cluster/core.js';\nimport metrics from './metrics/routes.js';\nimport {compose} from './common/compose.js';\nimport {WebExchange, Middleware} from './server/types.js';\nimport {DefaultWebExchange, HttpServerRequest, HttpServerResponse} from './server/exchange.js';\nimport {socketKey} from './utils.js';\nimport getLogger from './logger.js';\nimport {localIp, portRange} from './server/address.js';\nimport * as monitoring from './server/monitoring.js';\nimport {acceptsOrigin, ProcessedOriginFilters, regexifyOriginFilters} from './server/ws-client-verify.js';\nimport {GatewayServer} from '../gateway-server';\nimport cors from './server/cors.ts';\n\nconst logger = getLogger('app');\n\nfunction secureContextOptions(ssl: GatewayServer.SslConfig): SecureContextOptions {\n const options: SecureContextOptions = {};\n if (ssl.key) options.key = readFileSync(ssl.key);\n if (ssl.cert) options.cert = readFileSync(ssl.cert);\n if (ssl.ca) options.ca = readFileSync(ssl.ca);\n return options;\n}\n\ntype RequestHandler = (req: http.IncomingMessage, res: http.ServerResponse) => void;\n\nfunction createListener(middleware: Middleware<HttpServerRequest, HttpServerResponse>,\n routes: Map<string, RouteInfo>) {\n const storage = new AsyncLocalStorage();\n\n const listener = compose<WebExchange<HttpServerRequest, HttpServerResponse>>(\n async ({response}, next) => {\n response.headers.set('server', 'gateway-server');\n await next();\n },\n ...cors({\n origins: {allow: [/http:\\/\\/localhost(:\\d+)?/]},\n methods: {allow: ['GET', 'HEAD', 'POST', 'DELETE']},\n headers: {allow: '*'},\n credentials: {allow: true}\n }),\n ...middleware,\n async ({request, response}, next) => {\n if (request.method === 'GET' && request.path === '/health') {\n response.statusCode = 200;\n response._res.end(http.STATUS_CODES[200]);\n } else {\n await next();\n }\n },\n async ({request, response}, next) => {\n if (request.method === 'GET' && request.path === '/') {\n response._res.end(`io.Gateway Server`);\n } else {\n await next();\n }\n },\n async ({request, response}, _next) => {\n const route = routes.get(request.path);\n if (route) {\n response.statusCode = 426;\n response._res\n .appendHeader('Upgrade', 'websocket')\n .appendHeader('Connection', 'Upgrade')\n .appendHeader('Content-Type', 'text/plain');\n response._res.end(`This service [${request.path}] requires use of the websocket protocol.`);\n } else {\n response.statusCode = 404;\n response._res.end(http.STATUS_CODES[404]);\n }\n }\n );\n\n return (request: http.IncomingMessage, response: http.ServerResponse) => {\n const exchange = new DefaultWebExchange(new HttpServerRequest(request), new HttpServerResponse(response));\n return storage.run(exchange, async () => {\n if (logger.enabledFor('debug')) {\n const socket = exchange.request._req.socket;\n if (logger.enabledFor('debug')) {\n logger.debug(`received ${exchange.method} request for ${exchange.path} from ${socket.remoteAddress}:${socket.remotePort}`);\n }\n }\n return await listener(exchange);\n });\n };\n}\n\nfunction promisify<T>(fn: (callback?: (err?: Error) => void) => T): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const r = fn((err?: Error) => {\n if (err) {\n reject(err);\n } else {\n resolve(r);\n }\n });\n });\n}\n\ntype RouteInfo = {\n readonly default?: boolean,\n readonly ping?: number,\n readonly maxConnections?: number\n readonly originFilters?: ProcessedOriginFilters\n readonly factory: (server: { endpoint: string, wss: WebSocketServer }) => Promise<{\n info?: string,\n close?: () => Promise<void>\n }>,\n // set later in listening\n wss?: WebSocketServer,\n close?: () => Promise<void>\n}\n\nfunction memoryMonitor(config?: GatewayServer.ServerConfig['memory']) {\n if (config) {\n return monitoring.start({\n memoryLimit: config.memory_limit,\n dumpLocation: config.dump_location,\n dumpPrefix: config.dump_prefix,\n reportInterval: config.report_interval,\n maxBackups: config.max_backups\n });\n }\n}\n\nfunction regexAwareReplacer<T>(_key: string, value: T): string | T {\n return value instanceof RegExp ? value.toString() : value;\n}\n\nexport const Factory = async (options: GatewayServer.ServerConfig): Promise<GatewayServer.Server> => {\n const ssl = options.ssl;\n const createServer = ssl ? (options: http.ServerOptions, handler: RequestHandler) => https.createServer({...options, ...secureContextOptions(ssl)}, handler) : (options: http.ServerOptions, handler: RequestHandler) => http.createServer(options, handler);\n const monitor = memoryMonitor(options.memory);\n const middleware: Middleware<HttpServerRequest, HttpServerResponse> = [];\n const routes: Map<string, RouteInfo> = new Map<string, RouteInfo>();\n const gw = IOGateway.Factory({...options.gateway});\n if (options.gateway) {\n const config = options.gateway;\n routes.set(config.route ?? '/', {\n default: config.route === undefined,\n ping: options.gateway.ping,\n factory: wsGateway.bind(gw),\n maxConnections: config.limits?.max_connections,\n originFilters: regexifyOriginFilters(config.origins)\n });\n }\n if (options.mesh) {\n const connections = new NodeConnections(options.mesh.timeout ?? 60000);\n middleware.push(...restDirectory(connections));\n const ping = options.mesh.ping ?? 30000;\n routes.set('/broker', {factory: meshBroker, ping: ping});\n routes.set('/cluster', {factory: meshCluster, ping: ping});\n routes.set('/relays', {factory: meshRelays, ping: ping});\n }\n if (options.metrics) {\n middleware.push(...(await metrics(options.metrics)));\n }\n\n const ports = portRange(options.port ?? 0);\n const host = options.host;\n const serverP: Promise<http.Server> = new Promise((resolve, reject) => {\n const onSocketError = (err: Error) => logger.error(`socket error: ${err}`, err);\n const server = createServer(\n {},\n createListener(middleware, routes));\n\n server.on('error', (e: Error) => {\n if (e['code'] === 'EADDRINUSE') {\n logger.debug(`port ${e['port']} already in use on address ${e['address']}`);\n const {value: port} = ports.next();\n if (port) {\n logger.info(`retry starting server on port ${port} and host ${host ?? '<unspecified>'}`);\n server.close();\n server.listen(port, host);\n } else {\n logger.warn(`all configured port(s) ${options.port} are in use. closing...`);\n server.close();\n reject(e);\n }\n } else {\n logger.error(`server error: ${e.message}`, e);\n reject(e);\n }\n });\n server\n .on('listening', async () => {\n const info = server.address() as AddressInfo;\n for (const [path, route] of routes) {\n try {\n logger.info(`creating ws server for [${path}]. max connections: ${route.maxConnections ?? '<unlimited>'}, origin filters: ${route.originFilters ? JSON.stringify(route.originFilters, regexAwareReplacer) : '<none>'}`);\n const wss = new WebSocketServer({noServer: true});\n const endpoint = `${ssl ? 'wss' : 'ws'}://${localIp}:${info.port}${path}`;\n const handler = await route.factory({endpoint, wss});\n const pingInterval = route.ping;\n if (pingInterval) {\n const pingIntervalId = setInterval(() => {\n for (const client of wss.clients) {\n if (client['connected'] === false) {\n client.terminate();\n }\n client['connected'] = false;\n client.ping();\n }\n }, pingInterval);\n wss.on('close', () => {\n clearInterval(pingIntervalId);\n });\n }\n route.wss = wss;\n route.close = handler.close?.bind(handler);\n } catch (e) {\n logger.warn(`failed to init route ${path}`, e);\n }\n }\n logger.info(`http server listening on ${info.address}:${info.port}`);\n resolve(server);\n });\n server\n .on('upgrade', (req, socket, head) => {\n socket.addListener('error', onSocketError);\n try {\n const request = new HttpServerRequest(req);\n const path = request.path ?? '/';\n const route = (routes.get(path) ?? Array.from(routes.values()).find(route => {\n if (path === '/' && route.default === true) {\n return true;\n }\n }));\n const host = request.host;\n const info = socketKey(request.socket);\n if (route?.wss) {\n socket.removeListener('error', onSocketError);\n const wss = route.wss;\n if (route.maxConnections !== undefined && wss.clients?.size >= route.maxConnections) {\n logger.warn(`${info} dropping ws connection request from ${host} on ${path}. max connections exceeded.`);\n socket.destroy();\n return;\n }\n\n const origin = request.headers['origin'];\n if (!acceptsOrigin(origin, route.originFilters)) {\n logger.info(`${info} dropping ws connection request from ${host} on ${path}. origin ${origin ?? '<missing>'}`);\n socket.destroy();\n return;\n }\n if (logger.enabledFor('debug')) {\n logger.debug(`${info} accepted new ws connection request from ${host} on ${path}`);\n }\n\n wss.handleUpgrade(req, socket, head, (ws) => {\n ws.on('pong', () => ws['connected'] = true);\n ws.on('ping', () => {\n });\n wss.emit('connection', ws, req);\n });\n } else {\n logger.warn(`${info} rejected upgrade request from ${host} on ${path}`);\n socket.destroy();\n }\n } catch (err) {\n logger.error(`upgrade error: ${err}`, err);\n }\n })\n .on('close', async () => {\n logger.info(`http server closed.`);\n });\n try {\n const {value: port} = ports.next();\n server.listen(port, host);\n } catch (e) {\n logger.error(`error starting web socket server`, e);\n reject(e instanceof Error ? e : new Error(`listen failed: ${e}`));\n }\n });\n const server = await serverP;\n return new class implements GatewayServer.Server {\n readonly gateway = gw;\n\n async close(): Promise<void> {\n for (const [path, route] of routes) {\n try {\n if (route.close) {\n await route.close();\n }\n logger.info(`stopping ws server for [${path}]. clients: ${route.wss?.clients?.size ?? 0}`);\n route.wss?.clients?.forEach(client => {\n client.terminate();\n });\n route.wss?.close();\n } catch (e) {\n logger.warn(`error closing route ${path}`, e);\n }\n }\n await promisify(cb => {\n server.closeAllConnections();\n server.close(cb);\n });\n if (monitor) {\n await monitoring.stop(monitor);\n }\n }\n }\n\n}\n", "import {IOGateway} from '@interopio/gateway';\nexport import Logger = IOGateway.Logging.Logger;\n\nexport default function getLogger(name: string): Logger {\n return IOGateway.Logging.getLogger(`gateway.server.${name}`);\n}\n", "import {type Socket} from 'node:net';\n\nexport function socketKey(socket: Socket): string {\n const remoteIp = socket.remoteAddress;\n if (!remoteIp) {\n throw new Error('Socket has no remote address');\n }\n return `${remoteIp}:${socket.remotePort}`;\n}\n\n", "export type Middleware<Request extends ServerHttpRequest = ServerHttpRequest, Response extends ServerHttpResponse = ServerHttpResponse> = ((context: WebExchange<Request, Response>, next: () => Promise<void>) => Promise<void>)[];\n\nexport abstract class WebExchange<Request extends ServerHttpRequest = ServerHttpRequest, Response extends ServerHttpResponse = ServerHttpResponse> {\n abstract readonly request: Request\n abstract readonly response: Response\n\n get method(): string | undefined {\n return this.request.method;\n }\n\n get path(): string | null | undefined {\n return this.request.path;\n }\n}\nexport type ReadonlyHeaderValue = string | undefined;\nexport type HeaderValue = number | ReadonlyHeaderValue;\nexport type ReadonlyHeaderValues = (readonly string[]) | ReadonlyHeaderValue\nexport type HeaderValues = (readonly string[]) | HeaderValue\n\nexport interface HttpHeaders {\n get(name: string): HeaderValues\n list(name: string): string[]\n one(name: string): HeaderValue\n has(name: string): boolean\n keys(): IteratorObject<string>\n}\n\nexport interface ReadonlyHttpHeaders extends HttpHeaders {\n get(name: string): ReadonlyHeaderValues\n one(name: string): string | undefined\n\n}\nexport interface MutableHttpHeaders extends HttpHeaders {\n get(name: string): HeaderValues\n one(name: string): HeaderValue\n set(name: string, value: HeaderValues): this\n add(name: string, value: string | (readonly string[])): this\n}\n\nexport interface HttpMessage<Headers = HttpHeaders> {\n readonly headers: Headers\n}\n\nexport interface HttpRequest<Headers = HttpHeaders> extends HttpMessage<Headers> {\n readonly path: string,\n readonly method?: string\n readonly URL: URL\n readonly protocol: string\n /**\n * hostname[:port]\n */\n readonly host?: string\n readonly body: Promise<Blob>\n}\n\nexport interface HttpResponse<Headers = HttpHeaders> extends HttpMessage<Headers> {\n readonly statusCode: number\n}\n\nexport type ServerHttpRequest = HttpRequest<ReadonlyHttpHeaders> /* & {\n // readonly text: Promise<string>\n // readonly json: Promise<unknown>\n // readonly socket: http.IncomingMessage['socket']\n // readonly _req: http.IncomingMessage\n}*/\n\nexport interface ServerHttpResponse extends HttpResponse<MutableHttpHeaders> {\n statusCode: number\n}\n", "import {\n HeaderValue,\n HeaderValues,\n HttpRequest, HttpResponse,\n MutableHttpHeaders,\n ReadonlyHttpHeaders,\n ServerHttpRequest,\n ServerHttpResponse,\n WebExchange\n} from './types.js';\nimport http from 'node:http';\nimport http2 from 'node:http2';\n\nfunction requestToProtocol(request: ServerHttpRequest, defaultProtocol: string): string {\n let proto = request.headers.get('x-forwarded-proto');\n\n if (Array.isArray(proto)) {\n proto = proto[0];\n }\n if (proto !== undefined) {\n return (proto as string).split(',', 1)[0].trim();\n }\n return defaultProtocol;\n}\n\nfunction requestToHost(request: ServerHttpRequest, defaultHost?: string): string | undefined {\n let host = request.headers.get('x-forwarded-for');\n if (host === undefined) {\n host = request.headers.get('x-forwarded-host');\n if (Array.isArray(host)) {\n host = host[0];\n }\n if (host) {\n const port = request.headers.one('x-forwarded-port');\n if (port) {\n host = `${host}:${port}`;\n }\n }\n if (host === undefined) {\n host = request.headers.one('host');\n }\n }\n if (Array.isArray(host)) {\n host = host[0];\n }\n if (host) {\n return (host as string).split(',', 1)[0].trim();\n }\n\n\n\n return defaultHost;\n}\n\nexport class HttpServerRequest implements ServerHttpRequest {\n private _body: Promise<Blob> | undefined;\n private _url: URL | undefined;\n private readonly _headers: ReadonlyHttpHeaders;\n constructor(readonly _req: http.IncomingMessage) {\n this._headers = new IncomingMessageHeaders(_req);\n }\n\n get http2(): boolean {\n return this._req.httpVersionMajor >= 2;\n }\n\n get headers() {\n return this._headers;\n }\n\n get path() {\n return this.URL?.pathname;\n }\n\n get URL() {\n this._url ??= new URL(this._req.url!, `${this.protocol}://${this.host}`);\n return this._url;\n }\n get query() {\n return this.URL?.search;\n }\n\n get method() {\n return this._req.method;\n }\n\n get host() {\n let dh: string | undefined = undefined;\n if (this._req.httpVersionMajor >= 2) {\n dh = (this._req?.headers as http2.IncomingHttpHeaders)[':authority'];\n }\n if (dh === undefined) {\n dh = this._req?.socket.remoteAddress;\n }\n return requestToHost(this, dh);\n }\n\n get protocol() {\n let dp: string | undefined = undefined;\n if (this._req.httpVersionMajor > 2) {\n dp = (this._req.headers as http2.IncomingHttpHeaders)[':scheme'];\n }\n if (dp === undefined) {\n dp = this._req?.socket['encrypted'] ? 'https' : 'http'\n }\n return requestToProtocol(this, dp);\n }\n\n get socket() {\n return this._req.socket;\n }\n\n get body() {\n this._body ??= new Promise((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n this._req\n .on('error', (err: Error) => reject(err))\n .on('data', (chunk) => chunks.push(chunk))\n .on('end', () => {\n resolve(new Blob(chunks));\n });\n });\n return this._body;\n }\n\n get text() {\n return this.body.then(async (blob) => await blob.text());\n }\n\n get json() {\n return this.body.then(async (blob) => {\n const json = JSON.parse(await blob.text());\n return json;\n // try {\n // } catch (e) {\n // reject(e instanceof Error ? e : new Error(`parse failed :${e}`));\n // }\n });\n }\n}\n\nclass IncomingMessageHeaders implements ReadonlyHttpHeaders {\n constructor(private readonly _msg: http.IncomingMessage) {\n }\n\n has(name: string): boolean {\n return this._msg.headers[name] !== undefined;\n }\n\n get(name: string): string | (readonly string[]) | undefined {\n return this._msg.headers[name];\n }\n\n list(name: string): string[] {\n return toList(this._msg.headers[name]);\n }\n\n one(name: string): string | undefined {\n const value = this._msg.headers[name];\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n }\n keys() {\n return Object.keys(this._msg.headers).values();\n }\n}\n\nclass OutgoingMessageHeaders implements MutableHttpHeaders {\n constructor(private readonly _msg: http.OutgoingMessage) {\n }\n\n has(name: string): boolean {\n return this._msg.hasHeader(name);\n }\n\n keys() {\n return this._msg.getHeaderNames().values();\n }\n\n get(name: string): HeaderValues {\n return this._msg.getHeader(name);\n }\n\n one(name: string): HeaderValue {\n const value = this._msg.getHeader(name);\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n }\n\n set(name: string, value: HeaderValues): this {\n if (!this._msg.headersSent) {\n if (Array.isArray(value)) {\n value = value.map(v => typeof v === 'number' ? String(v) : v);\n } else if (typeof value === 'number') {\n value = String(value);\n }\n\n if (value) {\n this._msg.setHeader(name, value);\n }\n else {\n this._msg.removeHeader(name);\n }\n }\n return this;\n }\n\n add(name: string, value: string | (readonly string[])): this {\n if (!this._msg.headersSent) {\n this._msg.appendHeader(name, value);\n }\n return this;\n }\n\n list(name: string): string[] {\n const values = this.get(name);\n return toList(values);\n }\n}\n\nexport class HttpServerResponse implements ServerHttpResponse {\n private readonly _headers: MutableHttpHeaders;\n constructor(readonly _res: http.ServerResponse) {\n this._headers = new OutgoingMessageHeaders(_res);\n }\n\n get statusCode(): number {\n return this._res.statusCode;\n }\n\n set statusCode(value: number) {\n if (this._res.headersSent) {\n return;\n }\n this._res.statusCode = value;\n }\n\n get headers() {\n return this._headers;\n }\n}\n\nexport class DefaultWebExchange<Request extends ServerHttpRequest, Response extends ServerHttpResponse> extends WebExchange<Request, Response> {\n constructor(readonly request: Request, readonly response: Response) {\n super();\n }\n}\n\nfunction toList(values: number | string | (readonly string[]) | undefined): string[] {\n if (typeof values === 'string') {\n values = [values];\n }\n if (typeof values === 'number') {\n values = [String(values)];\n }\n const list: string[] = [];\n if (values) {\n for (const value of values) {\n if (value) {\n list.push(...parseHeader(value));\n }\n }\n }\n return list;\n}\n\nfunction parseHeader(value: string): string[] {\n const list: string[] = [];\n {\n let start = 0;\n let end = 0;\n\n for (let i = 0; i < value.length; i++) {\n switch (value.charCodeAt(i)) {\n case 0x20: // space\n if (start === end) {\n start = end = i + 1;\n }\n break;\n case 0x2c: // comma\n list.push(value.slice(start, end));\n start = end = i + 1;\n break;\n default:\n end = end + 1;\n break;\n }\n }\n list.push(value.slice(start, end));\n }\n\n return list;\n}\n\nexport class MapHttpHeaders extends Map<string, (readonly string[])> implements MutableHttpHeaders {\n\n get(name: string) {\n return super.get(name.toLowerCase());\n }\n\n one(name: string): string | undefined {\n return this.get(name)?.[0];\n }\n\n list(name: string) {\n const values = super.get(name.toLowerCase());\n return toList(values);\n }\n\n set(name: string, value: number | string | (readonly string[]) | undefined): this {\n if (typeof value === 'number') {\n value = String(value);\n }\n if (typeof value === 'string') {\n value = [value];\n }\n if (value) {\n return super.set(name.toLowerCase(), value);\n }\n else {\n super.delete(name.toLowerCase());\n return this;\n }\n }\n\n add(name: string, value: string | (readonly string[])) {\n const prev = super.get(name.toLowerCase());\n if (typeof value === 'string') {\n value = [value];\n }\n if (prev) {\n value = prev.concat(value);\n }\n this.set(name, value);\n return this;\n }\n}\n\nexport class MockHttpRequest implements HttpRequest<MutableHttpHeaders> {\n private _body?: Blob;\n readonly headers = new MapHttpHeaders();\n\n constructor(private readonly url: URL, method?: string) {\n this.method = method ?? 'GET';\n this.headers.set('Host', url.hostname);\n this.path = url?.pathname ?? '/';\n }\n method: string;\n path: string;\n\n get host() {\n return requestToHost(this, this.url.host);\n }\n get protocol() {\n return requestToProtocol(this, this.url.protocol.slice(0, -1));\n }\n\n get body(): Promise<Blob> {\n const body = this._body;\n return body ? Promise.resolve(body): Promise.reject(new Error(`no body set`));\n }\n set body(value: Blob) {\n this._body = value;\n }\n\n get URL() {\n return new URL(this.path, `${this.protocol}://${this.host}`);\n }\n}\n\nexport class MockHttpResponse implements HttpResponse<MutableHttpHeaders> {\n statusCode!: number;\n headers = new MapHttpHeaders();\n\n}\n", "import * as ws from 'ws';\nimport getLogger from '../../logger.js';\nimport {socketKey} from '../../utils.js';\nimport {HttpServerRequest} from '../../server/exchange.js';\nimport {IOGateway} from '@interopio/gateway';\nimport GatewayEncoders = IOGateway.Encoding;\n\nconst log = getLogger('ws');\nconst codec = GatewayEncoders.json<IOGateway.Message>();\n\nfunction initClient(this: IOGateway.Gateway, key: string, socket: ws.WebSocket, host?: string): IOGateway.GatewayClient<string> | undefined {\n const opts = {\n key,\n host,\n codec,\n onPing: () => {\n socket.ping((err?: Error) => {\n if (err) {\n log.warn(`failed to ping ${key}`, err);\n }\n else {\n log.info(`ping sent to ${key}`);\n }\n });\n },\n onDisconnect: (reason: 'inactive' | 'shutdown') => {\n switch (reason) {\n case 'inactive': {\n log.warn(`no heartbeat (ping) received from ${key}, closing socket`);\n socket.close(4001, 'ping expected');\n break;\n }\n case 'shutdown': {\n socket.close(1001, 'shutdown');\n break;\n }\n }\n }\n };\n try {\n return this.client((data) => socket.send(data), opts);\n } catch (err) {\n log.warn(`${key} failed to create client`, err);\n }\n}\n\nasync function create(this: IOGateway.Gateway, server: {endpoint: string, wss: ws.WebSocketServer}): Promise<{ close: () => Promise<void> }> {\n log.info('start gateway');\n await this.start({endpoint: server.endpoint});\n\n server.wss\n .on('error', (err: Error) => {\n log.error('error starting the gateway websocket server', err);\n })\n .on('connection', (socket, req) => {\n const request = new HttpServerRequest(req);\n const key = socketKey(request.socket);\n const host = request.host;\n log.info(`${key} connected on gw from ${host}`);\n const client = initClient.call(this, key, socket);\n if (!client) {\n log.error(`${key} gw client init failed`);\n socket.terminate();\n return;\n }\n socket.on('error', (err: Error) => {\n log.error(`${key} websocket error: ${err}`, err);\n });\n socket.on('message', (data, _isBinary) => {\n if (Array.isArray(data)) {\n data = Buffer.concat(data);\n }\n // JSON.parse will invoke abstract operation ToString (coerce it) prior parsing (https://262.ecma-international.org/5.1/#sec-15.12.2)\n client.send(data as unknown as string);\n\n });\n socket.on('close', (code) => {\n log.info(`${key} disconnected from gw. code: ${code}`);\n client.close();\n });\n });\n return {\n close: async () => {\n server.wss.close();\n await this.stop();\n }\n }\n}\n\nexport default create;\n", "import getLogger from '../logger.js';\r\n\r\nconst logger = getLogger('mesh.connections');\r\n\r\nexport type Node = { node: string, endpoint: string, users?: string[] };\r\nexport type NodeConnection = { node: string, connect: Node[] }\r\n\r\ntype NodeValue = Omit<Node, 'users'> & {\r\n users: Set<string>, memberId: number, lastAccess: number\r\n}\r\n\r\nexport interface NodeConnections {\r\n announce(nodes: Node[]): NodeConnection[];\r\n remove(node: string): boolean;\r\n}\r\n\r\nexport default class InMemoryNodeConnections implements NodeConnections {\r\n private readonly nodes = new Map<string, NodeValue>();\r\n private readonly nodesByEndpoint = new Map<string, string>();\r\n private memberIds: number = 0;\r\n\r\n constructor(private readonly timeout: number = 60000) {\r\n }\r\n\r\n announce(nodes: Node[]): NodeConnection[] {\r\n for (const node of nodes) {\r\n const {node: nodeId, users, endpoint} = node;\r\n const foundId = this.nodesByEndpoint.get(endpoint);\r\n if (foundId) {\r\n if (foundId !== nodeId) {\r\n logger.warn(`endpoint ${endpoint} clash. replacing node ${foundId} with ${nodeId}`);\r\n this.nodesByEndpoint.set(endpoint, nodeId);\r\n this.nodes.delete(foundId);\r\n }\r\n } else {\r\n logger.info(`endpoint ${endpoint} announced for ${nodeId}`);\r\n this.nodesByEndpoint.set(endpoint, nodeId);\r\n }\r\n this.nodes.set(nodeId, this.updateNode(node, new Set<string>(users ?? []), nodeId, this.nodes.get(nodeId)));\r\n }\r\n this.cleanupOldNodes();\r\n const sortedNodes = Array.from(this.nodes.values()).sort((a, b) => a.memberId - b.memberId);\r\n return nodes.map((e) => {\r\n const node = e.node;\r\n const connect = this.findConnections(sortedNodes, this.nodes.get(node));\r\n return {node, connect};\r\n });\r\n }\r\n\r\n remove(nodeId: string) {\r\n const removed = this.nodes.get(nodeId);\r\n if (removed) {\r\n this.nodes.delete(nodeId);\r\n const endpoint = removed.endpoint;\r\n this.nodesByEndpoint.delete(endpoint);\r\n logger.info(`endpoint ${endpoint} removed for ${nodeId}`);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private updateNode(newNode: Node, users: Set<string>, _key: string, oldNode?: NodeValue): NodeValue {\r\n const node: Omit<NodeValue, 'lastAccess' | 'users'> = !oldNode ? {...newNode, memberId: this.memberIds++} : oldNode;\r\n return {...node, users, lastAccess: Date.now()};\r\n }\r\n\r\n private cleanupOldNodes() {\r\n const threshold = Date.now() - this.timeout;\r\n for (const [nodeId,v] of this.nodes) {\r\n if (v.lastAccess < threshold) {\r\n if (logger.enabledFor('debug')) {\r\n logger.debug(`${nodeId} expired - no announcement since ${new Date(v.lastAccess).toISOString()}, timeout is ${this.timeout} ms.`);\r\n }\r\n this.nodes.delete(nodeId);\r\n }\r\n }\r\n }\r\n\r\n private findConnections(sortedNodes: NodeValue[], node?: NodeValue): Node[] {\r\n return sortedNodes.reduce((l, c) => {\r\n if (node !== undefined && c.memberId < node.memberId) {\r\n const intersection = new Set(c.users);\r\n node.users.forEach(user => {\r\n if (!c.users.has(user)) {\r\n intersection.delete(user);\r\n }\r\n });\r\n c.users.forEach(user => {\r\n if (!node.users.has(user)) {\r\n intersection.delete(user);\r\n }\r\n });\r\n if (intersection.size > 0) {\r\n const e: Node = {node: c.node, endpoint: c.endpoint};\r\n return l.concat(e);\r\n }\r\n }\r\n return l;\r\n }, new Array<Node>());\r\n }\r\n}\r\n", "import {Middleware} from '../../server/types.js';\r\nimport {NodeConnections, Node} from '../connections.js';\r\nimport {HttpServerRequest, HttpServerResponse} from '../../server/exchange.js';\r\n\r\nfunction routes(connections: NodeConnections): Middleware<HttpServerRequest, HttpServerResponse> {\r\n return [\r\n async (ctx, next: () => Promise<void>) => {\r\n if (ctx.method === 'POST' && ctx.path === '/api/nodes') {\r\n const json = await ctx.request.json;\r\n if (!Array.isArray(json)) {\r\n ctx.response.statusCode = 400\r\n ctx.response._res.end();\r\n } else {\r\n const nodes = json as Node[];\r\n const result = connections.announce(nodes);\r\n const body = JSON.stringify(result);\r\n ctx.response.headers.set('content-type', 'application/json');\r\n ctx.response.statusCode = 200;\r\n ctx.response._res\r\n .end(body);\r\n }\r\n } else {\r\n await next();\r\n }\r\n },\r\n async ({method, path, response}, next: () => Promise<void>) => {\r\n if (method === 'DELETE' && path?.startsWith('/api/nodes/')) {\r\n const nodeId = path?.substring('/api/nodes/'.length);\r\n connections.remove(nodeId);\r\n response.statusCode = 200;\r\n response._res.end();\r\n } else {\r\n await next();\r\n }\r\n },\r\n ];\r\n}\r\nexport default routes;\r\n", "import * as ws from 'ws';\nimport getLogger from '../../../logger.js';\nimport {socketKey} from '../../../utils.ts';\nimport {IOGateway} from '@interopio/gateway';\nimport GatewayEncoders = IOGateway.Encoding;\n\nconst logger = getLogger('mesh.ws.broker');\n\ntype Command =\n // client to broker\n { type: 'hello', 'node-id': string }\n | { type: 'bye', 'node-id': string }\n | { type: 'data', from: string, to: 'all' | string}\n // broker to client\n | { type: 'node-added', 'node-id': string, 'new-node': string }\n | { type: 'node-removed', 'node-id': string, 'removed-node': string }\n\n ;\n\n\nfunction broadcastNodeAdded(nodes: NodeSockets, newSocket: ws.WebSocket, newNodeId: string) {\n Object.entries(nodes.nodes).forEach(([nodeId, socket]) => {\n if (nodeId !== newNodeId) {\n newSocket.send(codec.encode({type: 'node-added', 'node-id': newNodeId, \"new-node\": nodeId}));\n socket.send(codec.encode({type: 'node-added', 'node-id': nodeId, \"new-node\": newNodeId}));\n }\n });\n}\n\nfunction broadcastNodeRemoved(nodes: NodeSockets, removedNodeId: string) {\n Object.entries(nodes.nodes).forEach(([nodeId, socket]) => {\n if (nodeId !== removedNodeId) {\n socket.send(codec.encode({type: 'node-removed', 'node-id': nodeId, \"removed-node\": removedNodeId}));\n }\n });\n}\n\nfunction onOpen(connectedNodes: NodeSockets, key: string) {\n logger.info(`[${key}] connection accepted`);\n}\n\nfunction onClose(connectedNodes: NodeSockets, key: string, code: number, reason: string): void {\n logger.info(`[${key}] connected closed [${code}](${reason})`);\n const nodeIds = connectedNodes.sockets[key];\n if (nodeIds) {\n delete connectedNodes.sockets[key];\n for (const nodeId of nodeIds) {\n delete connectedNodes.nodes[nodeId];\n }\n for (const nodeId of nodeIds) {\n broadcastNodeRemoved(connectedNodes, nodeId);\n }\n }\n}\n\nfunction processMessage(connectedNodes: NodeSockets, socket: ws.WebSocket, key: string, msg: Command) {\n switch (msg.type) {\n case 'hello': {\n const nodeId = msg['node-id'];\n connectedNodes.nodes[nodeId] = socket;\n connectedNodes.sockets[key] = connectedNodes.sockets[key] ?? [];\n connectedNodes.sockets[key].push(nodeId);\n logger.info(`[${key}] node ${nodeId} added.`);\n broadcastNodeAdded(connectedNodes, socket, nodeId);\n break;\n }\n case 'bye': {\n const nodeId = msg[\"node-id\"];\n delete connectedNodes[nodeId];\n logger.info(`[${key}] node ${nodeId} removed.`);\n broadcastNodeRemoved(connectedNodes, nodeId);\n break;\n }\n case 'data': {\n const sourceNodeId = msg.from;\n const targetNodeId = msg.to;\n if ('all' === targetNodeId) {\n Object.entries(connectedNodes.nodes).forEach(([nodeId, socket]) => {\n if (nodeId !== sourceNodeId) {\n socket.send(codec.encode(msg));\n }\n });\n }\n else {\n const socket = connectedNodes.nodes[targetNodeId];\n if (socket) {\n socket.send(codec.encode(msg));\n }\n else {\n logger.warn(`unable to send to node ${targetNodeId} message ${JSON.stringify(msg)}`);\n }\n }\n break;\n }\n default: {\n logger.warn(`[${key}] ignoring unknown message ${JSON.stringify(msg)}`);\n break;\n }\n }\n}\n\nconst codec = GatewayEncoders.transit<Command>({\n keywordize: new Map<string, GatewayEncoders.KeywordizeCommand>([\n ['/type', '*'],\n ['/message/body/type', '*'],\n ['/message/origin', '*'],\n ['/message/receiver/type', '*'],\n ['/message/source/type', '*'],\n ['/message/body/type', '*'],\n ])\n});\n\nfunction onMessage(connectedNodes: NodeSockets, socket: ws.WebSocket, key: string, msg: string): void {\n try {\n const decoded = codec.decode(msg);\n if (logger.enabledFor('debug')) {\n logger.debug(`[${key}] processing msg ${JSON.stringify(decoded)}`);\n }\n processMessage(connectedNodes, socket, key, decoded);\n } catch (ex) {\n logger.error(`[${key}] unable to process message`, ex);\n }\n}\n\nclass WebsocketBroker {\n constructor(private readonly server: ws.WebSocketServer) {\n }\n\n async close() {\n this.server.close();\n }\n}\ntype NodeSockets = {nodes: {[nodeId: string]: ws.WebSocket}, sockets: {[socket: string]: string[]}};\n\nasync function create(server: {wss: ws.WebSocketServer}): Promise<{close: () => Promise<void>}> {\n const connectedNodes: NodeSockets = {nodes: {}, sockets: {}};\n logger.info(`mesh server is listening`);\n\n server.wss\n .on('error', () => {\n logger.error(`error starting mesh server`);\n })\n .on('connection', (socket, request) => {\n const key = socketKey(request.socket);\n onOpen(connectedNodes, key);\n socket.on('error', (err: Error) => {\n logger.error(`[${key}] websocket error: ${err}`, err);\n });\n socket.on('message', (data, isBinary) => {\n if (Array.isArray(data)) {\n data = Buffer.concat(data);\n }\n onMessage(connectedNodes, socket, key, data as unknown as string);\n });\n socket.on('close', (code, reason) => {\n onClose(connectedNodes, key, code, reason as unknown as string);\n });\n });\n\n return new WebsocketBroker(server.wss);\n}\n\nexport default create;\n", "import * as ws from 'ws';\nimport {socketKey} from '../../../utils.js';\nimport getLogger from '../../../logger.js';\n\nimport {IOGateway} from '@interopio/gateway';\nimport GatewayEncoders = IOGateway.Encoding;\n\nconst logger = getLogger('mesh.ws.relay');\n\ntype Command\n = { type: 'hello', 'from': string, to: string }\n | { type: 'bye', 'from': string, to: 'all' | string }\n | { type: 'data', from: string, to: 'all' | string, data: {body: {type: string}}}\n\n ;\n\nconst codec = GatewayEncoders.transit<Command>({\n keywordize: new Map<string, GatewayEncoders.KeywordizeCommand>([\n ['/type', '*'],\n ['/message/body/type', '*'],\n ['/message/origin', '*'],\n ['/message/receiver/type', '*'],\n ['/message/source/type', '*'],\n ['/message/body/type', '*'],\n ])\n});\n\nexport interface Relays {\n onMsg?: ((key: string, node: string, msg: string) => void);\n onErr?: ((key: string, err: Error) => void)\n send(key: string, node: string | undefined, msg: string, cb: (key: string, err?: Error) => void): void;\n}\n\nclass InternalRelays implements Relays {\n // key -> socket\n private readonly clients = new Map<string, ws.WebSocket>();\n // node -> key\n private readonly links = new Map<string, string>();\n public onMsg?: (key: string, node: string, msg: string) => void\n public onErr?: (key: string, err: Error) => void\n\n add(key: string, soc: ws.WebSocket) {\n this.clients.set(key, soc);\n }\n\n remove(key: string) {\n this.clients.delete(key);\n for (const [node, k] of this.links) {\n if (k === key) {\n this.links.delete(node);\n }\n }\n }\n\n receive(key: string, msg: string) {\n const node = this.link(key, msg);\n\n if (node && this.onMsg) {\n this.onMsg(key, node, msg);\n }\n }\n\n private link(key: string, msg: string): string | undefined {\n try {\n const decoded = codec.decode(msg);\n const {type, from, to} = decoded;\n if (to === 'all') {\n switch (type) {\n case 'hello': {\n if (logger.enabledFor('debug')) {\n logger.debug(`${key} registers node ${from}`);\n }\n this.links.set(from, key);\n break;\n }\n case 'bye': {\n if (logger.enabledFor('debug')) {\n logger.debug(`${key} unregisters node ${from}`);\n }\n this.links.delete(from);\n break;\n }\n }\n return;\n }\n return from;\n } catch (e) {\n if (this.onErr) {\n // probably a decode error or a bug\n this.onErr(key, e instanceof Error ? e : new Error(`link failed :${e}`));\n }\n else {\n logger.warn(`${key} unable to process ${msg}`, e);\n }\n }\n }\n\n send(key: string, node: string, msg: string, cb: (k: string, err?: Error) => void): void {\n const decoded = codec.decode(msg);\n if (logger.enabledFor('debug')) {\n logger.debug(`${key} sending msg to ${node} ${JSON.stringify(decoded)}`);\n }\n\n const clientKey = this.links.get(node);\n if (clientKey) {\n const client = this.clients.get(clientKey);\n if (client) {\n client.send(msg, {binary: false}, (err?: Error) => {\n cb(clientKey, err)\n });\n return;\n }\n }\n throw new Error(`${key} no active link for ${decoded.to}`);\n }\n}\nconst internal = new InternalRelays();\nexport const relays: Relays = internal;\n\n\nasync function create(server: {wss:ws.WebSocketServer}): Promise<{ close?: () => Promise<void> }> {\n\n logger.info(`relays server is listening`);\n server.wss\n .on('error', () => {\n logger.error(`error starting relays server`);\n })\n .on('connection', (socket, request) => {\n const key = socketKey(request.socket);\n logger.info(`${key} connected on relays`);\n internal.add(key, socket);\n //onOpen(connectedNodes, key);\n socket.on('error', (err: Error) => {\n logger.error(`[${key}] websocket error: ${err}`, err);\n });\n socket.on('message', (data, _isBinary) => {\n if (Array.isArray(data)) {\n data = Buffer.concat(data);\n }\n try {\n internal.receive(key, data as unknown as string);\n } catch (e) {\n logger.warn(`[${key}] error processing received data '${data}'`, e);\n }\n });\n socket.on('close', (code, reason) => {\n internal.remove(key);\n\n logger.info(`${key} disconnected from relays`);\n });\n });\n return {\n close: async () => {\n server.wss.close();\n }\n };\n}\n\nexport default create;\n", "import * as ws from 'ws';\nimport {socketKey} from '../../../utils.js';\nimport {relays} from '../relays/core.js';\nimport getLogger from '../../../logger.js';\nimport {HttpServerRequest} from '../../../server/exchange.ts';\n\nconst logger = getLogger('mesh.ws.cluster');\n\n\nfunction onMessage(key: string, node: string | undefined, socketsByNodeId: Map<string, Map<string, ws.WebSocket>>, msg: string) {\n try {\n relays.send(key, node, msg, (k, err?: Error) => {\n if (err) {\n logger.warn(`${k} error writing msg ${msg}: ${err}`);\n return;\n }\n if (logger.enabledFor('debug')) {\n logger.debug(`${k} sent msg ${msg}`);\n }\n });\n } catch (ex) {\n logger.error(`${key} unable to process message`, ex);\n if (node) {\n const socket = socketsByNodeId.get(node)?.get(key);\n socket?.terminate();\n }\n }\n}\n\nasync function create(server: {wss: ws.WebSocketServer}): Promise<{ close?: () => Promise<void> }> {\n const socketsByNodeId = new Map<string, Map<string, ws.WebSocket>>();\n relays.onMsg = (k, nodeId, msg) => {\n try {\n const sockets = socketsByNodeId.get(nodeId);\n if (sockets && sockets.size > 0) {\n for (const [key, socket] of sockets) {\n socket.send(msg, {binary: false}, (err?: Error) => {\n if (err) {\n logger.warn(`${key} error writing from ${k} msg ${msg}: ${err}`);\n return;\n }\n if (logger.enabledFor('debug')) {\n logger.debug(`${key} sent from ${k} msg ${msg}`);\n }\n });\n }\n } else {\n logger.warn(`${k} dropped msg ${msg}.`);\n }\n } catch (ex) {\n logger.error(`${k} unable to process message`, ex);\n }\n };\n server.wss\n .on('error', () => {\n logger.error(`error starting mesh server`);\n })\n .on('listening', () => {\n logger.info(`mesh server is listening`);\n })\n .on('connection', (socket, req) => {\n const request = new HttpServerRequest(req);\n const key = socketKey(request.socket);\n const query = new URLSearchParams(request.query ?? undefined);\n logger.info(`${key} connected on cluster with ${query}`);\n const node = query.get('node');\n if (node) {\n let sockets = socketsByNodeId.get(node);\n if (!sockets) {\n sockets = new Map<string, ws.WebSocket>();\n socketsByNodeId.set(node, sockets);\n }\n sockets.set(key, socket);\n }\n else {\n socket.terminate();\n return;\n }\n //onOpen(connectedNodes, key);\n socket.on('error', (err: Error) => {\n logger.error(`${key} websocket error: ${err}`, err);\n });\n socket.on('message', (data, _isBinary) => {\n if (Array.isArray(data)) {\n data = Buffer.concat(data);\n }\n onMessage(key, node, socketsByNodeId, data as unknown as string);\n });\n socket.on('close', (_code, _reason) => {\n logger.info(`${key} disconnected from cluster`);\n const sockets = socketsByNodeId.get(node);\n if (sockets) {\n sockets.delete(key);\n if (sockets.size === 0) {\n socketsByNodeId.delete(node);\n }\n }\n });\n });\n return {\n close: async () => {\n server.wss.close();\n }\n };\n}\n\nexport default create;\n", "import {Metrics} from '@interopio/gateway-metrics-api';\nimport {Middleware, WebExchange} from '../server/types.js';\nimport getLogger from '../logger.js';\nimport {FilePublisherConfig} from '@interopio/gateway/metrics/publisher/file';\nimport {HttpServerRequest, HttpServerResponse} from '../server/exchange.ts';\n\nconst logger = getLogger('metrics');\n\nconst COOKIE_NAME = 'GW_LOGIN';\n\nfunction loggedIn(auth, ctx: WebExchange) {\n if (auth) {\n const cookieHeaderValue = ctx.request.headers.list('cookie');\n const cookie = cookieHeaderValue?.join('; ').split('; ').find(value => value.startsWith(`${COOKIE_NAME}=`));\n return cookie && (parseInt(cookie?.substring(COOKIE_NAME.length + 1)) > Date.now());\n }\n return true;\n}\n\nasync function routes(config: {file?: FilePublisherConfig, auth?}): Promise<Middleware<HttpServerRequest, HttpServerResponse>> {\n const {jsonFileAppender} = await import('@interopio/gateway/metrics/publisher/file');\n const appender = jsonFileAppender(logger);\n await appender.open(config.file?.location ?? 'metrics.ndjson', config.file?.append ?? true);\n return [\n async (ctx, next: () => Promise<void>) => {\n if (ctx.method === 'GET' && ctx.path === '/api/metrics') {\n if (loggedIn(config.auth, ctx)) {\n ctx.response.statusCode = 200;\n } else {\n ctx.response.statusCode = 302;\n ctx.response.headers.set('location', '/api/login?redirectTo=/api/metrics');\n }\n ctx.response._res.end();\n }\n else {\n await next();\n }\n },\n async (ctx, next: () => Promise<void>) => {\n if (ctx.method === 'GET' && ctx.path === '/api/login') {\n const redirectTo = new URLSearchParams(ctx.request.query ?? undefined).get('redirectTo');\n const expires = Date.now() + 180 * 1000;\n ctx.response.headers.add('set-cookie', `${COOKIE_NAME}=${expires}; Path=/api; SameSite=strict`)\n if (redirectTo) {\n ctx.response.statusCode = 302;\n ctx.response.headers.set('location', redirectTo);\n }\n else {\n ctx.response.statusCode = 200;\n }\n ctx.response._res.end();\n } else {\n await next();\n }\n },\n async (ctx, next: () => Promise<void>) => {\n if (ctx.method === 'POST' && ctx.path === '/api/metrics') {\n if (loggedIn(config.auth, ctx)) {\n ctx.response.statusCode = 202;\n ctx.response._res.end();\n try {\n const json = await ctx.request.json;\n const update = json as Metrics.Update;\n if (logger.enabledFor('debug')) {\n logger.debug(`${JSON.stringify(update)}`);\n }\n if ((config.file?.status ?? false) || (update.status === undefined)) {\n await appender.write(update);\n }\n } catch (e) {\n logger.error(`error processing metrics`, e);\n }\n }\n else {\n ctx.response.statusCode = 401;\n ctx.response._res.end();\n }\n }\n else {\n await next();\n }\n },\n ];\n}\n\nexport default routes;\n", "\n// https://github.com/koajs/compose/blob/master/index.js\n/**\n * @typeParam T - Type of context passed through the middleware\n * @param middleware middleware stack\n * @return {Callback}\n */\nexport function compose<T>(...middleware: (((ctx: T, next: () => Promise<void>) => Promise<void>) | ((ctx: T) => Promise<void>))[]): (ctx: T) => Promise<void> {\n if (!Array.isArray(middleware)) {\n throw new Error('middleware must be array!');\n }\n for (const fn of middleware) {\n if (typeof fn !== 'function') {\n throw new Error('middleware must be compose of functions!');\n }\n }\n return async function (ctx: T, next?: () => Promise<void>) {\n let index = -1;\n return await dispatch(0);\n\n async function dispatch(i: number): Promise<void> {\n if (i < index) {\n throw new Error('next() called multiple times');\n }\n index = i;\n let fn: ((() => Promise<void>) | undefined) | ((c: T, n: () => Promise<void>) => Promise<void>);\n if (i === middleware.length) {\n fn = next;\n }\n else {\n fn = middleware[i];\n }\n if (!fn) {\n return;\n }\n\n await fn(ctx, dispatch.bind(null, i + 1));\n }\n }\n}\n", "import {type NetworkInterfaceInfo, networkInterfaces} from 'node:os';\n\nconst PORT_RANGE_MATCHER = /^(\\d+|(0x[\\da-f]+))(-(\\d+|(0x[\\da-f]+)))?$/i;\nfunction validPort(port: number) {\n if (port > 0xFFFF) throw new Error(`bad port ${port}`);\n return port;\n}\n\n/**\n * parse port range. port can be number or string representing comma separated\n * list of port ranges for e.g. \"3434,8380-8385\"\n * @param port\n */\nexport function* portRange(port: number | string): Generator<number> {\n if (typeof port === 'string') {\n for (const portRange of port.split(',')) {\n const trimmed = portRange.trim();\n const matchResult = PORT_RANGE_MATCHER.exec(trimmed);\n if (matchResult) {\n const start = parseInt(matchResult[1]);\n const end = parseInt(matchResult[4] ?? matchResult[1]);\n for (let i = validPort(start); i < validPort(end) + 1; i++) {\n yield i;\n }\n }\n else {\n throw new Error(`'${portRange}' is not a valid port or range.`);\n }\n }\n } else {\n yield validPort(port);\n }\n}\n\nexport const localIp = (() => {\n function first<T>(a: T[]): T | undefined {\n return a.length > 0 ? a[0] : undefined;\n }\n const addresses = Object.values(networkInterfaces())\n .flatMap((details?: NetworkInterfaceInfo[]) => {\n return (details ?? []).filter((info) => info.family === 'IPv4');\n }).reduce((acc, info) => {\n acc[info.internal ? 'internal' : 'external'].push(info);\n return acc;\n }, {internal: [] as NetworkInterfaceInfo[], external: [] as NetworkInterfaceInfo[]});\n return (first(addresses.internal) ?? first(addresses.external))?.address;\n})();\n", "import getLogger from '../logger.js';\nimport {getHeapStatistics, writeHeapSnapshot, HeapInfo} from 'node:v8';\nimport {PathLike} from 'node:fs';\nimport {access, mkdir, rename, unlink} from 'node:fs/promises';\n\nconst log = getLogger('monitoring');\n\nexport type Options = typeof DEFAULT_OPTIONS;\n\nexport type Command = 'run' | 'dump' | 'stop';\nexport type Channel = (command?: Command) => Promise<boolean>;\n\nconst DEFAULT_OPTIONS = {\n memoryLimit: 1024 * 1024 * 1024, // 1GB\n reportInterval: 10 * 60 * 1000, // 10 min\n dumpLocation: '.', // current folder\n maxBackups: 10,\n dumpPrefix: 'Heap'\n}\n\nfunction fetchStats(): HeapInfo {\n return getHeapStatistics();\n}\n\nasync function dumpHeap(opts: Options) {\n const prefix = opts.dumpPrefix ?? 'Heap';\n const target = `${opts.dumpLocation}/${prefix}.heapsnapshot`;\n if (log.enabledFor('debug')) {\n log.debug(`starting heap dump in ${target}`);\n }\n\n await fileExists(opts.dumpLocation)\n .catch(async (_) => {\n if (log.enabledFor('debug')) {\n log.debug(`dump location ${opts.dumpLocation} does not exists. Will try to create it`);\n }\n try {\n await mkdir(opts.dumpLocation, {recursive: true});\n log.info(`dump location dir ${opts.dumpLocation} successfully created`);\n } catch (e) {\n log.error(`failed to create dump location ${opts.dumpLocation}`);\n }\n });\n const dumpFileName = writeHeapSnapshot(target);\n log.info(`heap dumped`);\n try {\n log.debug(`rolling snapshot backups`);\n const lastFileName = `${opts.dumpLocation}/${prefix}.${opts.maxBackups}.heapsnapshot`;\n await fileExists(lastFileName)\n .then(async () => {\n if (log.enabledFor('debug')) {\n log.debug(`deleting ${lastFileName}`);\n }\n try {\n await unlink(lastFileName);\n } catch (e) {\n log.warn(`failed to delete ${lastFileName}`, e);\n }\n })\n .catch(() => {\n /* do nothing*/\n });\n for (let i = opts.maxBackups - 1; i > 0; i--) {\n const currentFileName = `${opts.dumpLocation}/${prefix}.${i}.heapsnapshot`;\n const nextFileName = `${opts.dumpLocation}/${prefix}.${i + 1}.heapsnapshot`;\n await fileExists(currentFileName)\n .then(async () => {\n try {\n await rename(currentFileName, nextFileName);\n } catch (e) {\n log.warn(`failed to rename ${currentFileName} to ${nextFileName}`, e);\n }\n })\n .catch(() => {\n /* do nothing*/\n });\n }\n const firstFileName = `${opts.dumpLocation}/${prefix}.${1}.heapsnapshot`;\n try {\n await rename(dumpFileName, firstFileName);\n } catch (e) {\n log.warn(`failed to rename ${dumpFileName} to ${firstFileName}`, e);\n }\n log.debug('snapshots rolled');\n } catch (e) {\n log.error('error rolling backups', e);\n throw e;\n }\n}\n\nasync function fileExists(path: PathLike): Promise<void> {\n log.trace(`checking file ${path}`);\n await access(path);\n}\n\nasync function processStats(stats: HeapInfo, state: {\n memoryLimitExceeded: boolean,\n snapshot?: boolean\n}, opts: Options) {\n if (log.enabledFor('debug')) {\n log.debug(`processing heap stats ${JSON.stringify(stats)}`);\n }\n const limit = Math.min(opts.memoryLimit, (0.95 * stats.heap_size_limit));\n const used = stats.used_heap_size;\n log.info(`heap stats ${JSON.stringify(stats)}`);\n if (used >= limit) {\n log.warn(`used heap ${used} bytes exceeds memory limit ${limit} bytes`);\n if (state.memoryLimitExceeded) {\n delete state.snapshot;\n } else {\n state.memoryLimitExceeded = true;\n state.snapshot = true;\n }\n await dumpHeap(opts);\n } else {\n state.memoryLimitExceeded = false;\n delete state.snapshot;\n }\n}\n\nexport function start(opts?: Partial<Options>): Options & { channel: Channel } {\n const merged: Options = {...DEFAULT_OPTIONS, ...opts};\n\n let stopped = false;\n const state = {memoryLimitExceeded: false};\n const report = async () => {\n const stats = fetchStats();\n await processStats(stats, state, merged);\n }\n const interval = setInterval(report, merged.reportInterval);\n const channel = async (command?: Command) => {\n if (!stopped) {\n command ??= 'run';\n switch (command) {\n case 'run': {\n await report();\n break;\n }\n case 'dump': {\n await dumpHeap(merged);\n break;\n }\n case 'stop': {\n stopped = true;\n clearInterval(interval);\n log.info('exit memory diagnostic');\n break;\n }\n }\n\n }\n return stopped;\n }\n\n return {...merged, channel};\n}\n\nasync function run({channel}: { channel: Channel }, command?: Command) {\n if (!await channel(command)) {\n log.warn(`cannot execute command \"${command}\" already closed`)\n }\n}\n\n\nexport async function stop(m: { channel: Channel }) {\n return await run(m, 'stop');\n}\n", "import {IOGateway} from '@interopio/gateway';\nimport {GatewayServer} from '../../gateway-server';\nimport getLogger from '../logger.js';\n\nconst log = getLogger('gateway.ws.client-verify');\n\nexport type ProcessedOriginFilters\n = Required<Omit<GatewayServer.OriginFilters, 'blacklist' | 'whitelist'>>\n //| Required<Omit<GatewayServer.OriginFilters, 'block' | 'allow'>>\n ;\n\nfunction acceptsMissing(originFilters: ProcessedOriginFilters): boolean {\n switch (originFilters.missing) {\n case 'allow': // fall-through\n case 'whitelist':\n return true;\n case 'block': // fall-through\n case 'blacklist':\n return false;\n default:\n return false;\n }\n}\n\nfunction tryMatch(originFilters: ProcessedOriginFilters, origin: string): boolean | undefined {\n const block = originFilters.block ?? originFilters['blacklist'];\n const allow = originFilters.allow ?? originFilters['whitelist'];\n if (block.length > 0 && IOGateway.Filtering.valuesMatch(block, origin)) {\n log.warn(`origin ${origin} matches block filter`);\n return false;\n } else if (allow.length > 0 && IOGateway.Filtering.valuesMatch(allow, origin)) {\n if (log.enabledFor('debug')) {\n log.debug(`origin ${origin} matches allow filter`);\n }\n return true;\n }\n}\n\nfunction acceptsNonMatched(originFilters: ProcessedOriginFilters): boolean {\n switch (originFilters.non_matched) {\n case 'allow': // fall-through\n case 'whitelist':\n return true;\n case 'block': // fall-through\n case 'blacklist':\n return false;\n default:\n return false;\n }\n}\n\nexport function acceptsOrigin(origin?: string, originFilters?: ProcessedOriginFilters): boolean {\n if (!originFilters) {\n return true;\n }\n if (!origin) {\n return acceptsMissing(originFilters);\n } else {\n const matchResult: boolean | undefined = tryMatch(originFilters, origin);\n if (matchResult) {\n return matchResult;\n } else {\n return acceptsNonMatched(originFilters);\n }\n }\n}\n\nexport function regexifyOriginFilters(originFilters?: GatewayServer.OriginFilters): ProcessedOriginFilters | undefined {\n if (originFilters) {\n const block = (originFilters.block ?? originFilters.blacklist ?? []).map(IOGateway.Filtering.regexify);\n const allow = (originFilters.allow ?? originFilters.whitelist ?? []).map(IOGateway.Filtering.regexify);\n return {\n non_matched: originFilters.non_matched ?? 'allow',\n missing: originFilters.missing ?? 'allow',\n allow,\n block,\n }\n }\n}\n", "import {\n WebExchange,\n HttpRequest,\n ReadonlyHttpHeaders,\n ServerHttpResponse, ServerHttpRequest\n} from './types.ts';\nimport getLogger from '../logger.js';\nimport {IOGateway} from '@interopio/gateway';\nimport {HttpServerResponse} from './exchange.ts';\n\nfunction isSameOrigin(request: HttpRequest<ReadonlyHttpHeaders>) {\n const origin = request.headers.one('origin');\n if (origin === undefined) {\n return true;\n }\n const url = request.URL;\n const actualProtocol = url.protocol;\n const actualHost = url.host;\n\n const originUrl = new URL(origin);\n\n const originHost = originUrl.host;\n const originProtocol = originUrl.protocol;\n return actualProtocol === originProtocol\n && actualHost === originHost;\n}\n\n/**\n * Returns `true` if the request is a valid CORS one by checking `Origin` header presence and ensuring origins differ.\n */\nexport function isCorsRequest(request: HttpRequest<ReadonlyHttpHeaders>): boolean {\n return request.headers.has('origin') && !isSameOrigin(request);\n\n}\n\nexport function isPreFlightRequest(request: HttpRequest): boolean {\n return request.method === 'OPTIONS'\n && request.headers.has('origin')\n && request.headers.has('access-control-request-method');\n}\n\nconst VARY_HEADERS: readonly string[] = ['Origin', 'Access-Control-Request-Method', 'Access-Control-Request-Headers'];\n\n/**\n * Processes a request given a {@link CorsConfig}.\n *\n * @param exchange the current exchange\n * @param config the CORS configuration to use, possibly `undefined` in which case pre-flight requests are rejected, but all others allowed\n * @returns `false` if the request is rejected, `true` otherwise\n */\nexport function processRequest(exchange: WebExchange, config?: CorsConfig): boolean {\n const {request, response} = exchange;\n const responseHeaders = response.headers;\n\n if (!responseHeaders.has('Vary')) {\n responseHeaders.set('Vary', VARY_HEADERS.join(', '));\n }\n else {\n const varyHeaders = responseHeaders.list('Vary');\n for (const header of VARY_HEADERS) {\n if (!varyHeaders.find(h => h === header)) {\n varyHeaders.push(header);\n }\n }\n responseHeaders.set('Vary', varyHeaders.join(', '));\n }\n\n try {\n if (!isCorsRequest(request)) {\n return true;\n }\n } catch (e) {\n if(logger.enabledFor('debug')) {\n logger.debug(`reject: origin is malformed`);\n }\n rejectRequest(response);\n return false;\n }\n\n if (responseHeaders.has('access-control-allow-origin')) {\n logger.trace(`skip: already contains \"Access-Control-Allow-Origin\"`);\n return true;\n }\n\n const preFlightRequest = isPreFlightRequest(request);\n\n if (config) {\n return handleInternal(exchange, config, preFlightRequest);\n }\n if (preFlightRequest) {\n rejectRequest(response);\n return false;\n }\n return true;\n}\n\nexport type CorsConfig = {\n origins?: {\n allow?: '*' | IOGateway.Filtering.Matcher[]\n }\n methods?: {\n allow?: '*' | string[]\n }\n headers?: {\n allow?: '*' | string[]\n expose?: string[]\n }\n credentials?: {\n allow?: boolean\n },\n privateNetwork?: {\n allow?: boolean\n }\n}\n\nexport /*testing*/ function validateConfig(config?: CorsConfig): CorsConfig | undefined {\n if (config) {\n\n const headers = config.headers;\n if (headers?.allow && headers.allow !== ALL) {\n headers.allow = headers.allow.map(header => header.toLowerCase());\n }\n const origins = config.origins;\n if (origins?.allow && origins.allow !== ALL) {\n origins.allow = origins.allow.map(origin => {\n if (typeof origin === 'string') {\n // exact match\n return origin.toLowerCase();\n }\n return origin;\n });\n }\n return config;\n }\n}\n\nconst handler = (config?: CorsConfig) => {\n validateConfig(config);\n return async (ctx: WebExchange<ServerHttpRequest, HttpServerResponse>, next: () => Promise<void>) => {\n const isValid = processRequest(ctx, config);\n if (!isValid || isPreFlightRequest(ctx.request)) {\n // do we need to call end?\n ctx.response._res.end();\n } else {\n await next();\n }\n };\n};\n\nexport default (config?: CorsConfig) => [handler(config)];\n\n\nconst logger = getLogger('cors');\n\nfunction rejectRequest(response: ServerHttpResponse) {\n response.statusCode = 403;\n}\n\nfunction handleInternal(exchange: WebExchange,\n config: CorsConfig, preFlightRequest: boolean): boolean {\n const {request, response} = exchange;\n const responseHeaders = response.headers;\n\n const requestOrigin = request.headers.one('origin');\n const allowOrigin = checkOrigin(config, requestOrigin);\n\n if (allowOrigin === undefined) {\n if (logger.enabledFor('debug')) {\n logger.debug(`reject: '${requestOrigin}' origin is not allowed`);\n }\n rejectRequest(response);\n return false;\n }\n\n const requestMethod = getMethodToUse(request, preFlightRequest);\n const allowMethods = checkMethods(config, requestMethod);\n if (allowMethods === undefined) {\n if (logger.enabledFor('debug')) {\n logger.debug(`reject: HTTP '${requestMethod}' is not allowed`);\n }\n rejectRequest(response);\n return false;\n }\n\n const requestHeaders = getHeadersToUse(request, preFlightRequest);\n const allowHeaders = checkHeaders(config, requestHeaders);\n if (preFlightRequest && allowHeaders === undefined) {\n if (logger.enabledFor('debug')) {\n logger.debug(`reject: headers '${requestHeaders}' are not allowed`);\n }\n rejectRequest(response);\n return false;\n }\n\n responseHeaders.set('access-control-allow-origin', allowOrigin);\n\n if (preFlightRequest) {\n responseHeaders.set('access-control-allow-methods', allowMethods.join(','));\n\n }\n if (preFlightRequest && allowHeaders !== undefined && allowHeaders.length > 0) {\n responseHeaders.set('access-control-allow-headers', allowHeaders.join(', '));\n }\n const exposeHeaders = config.headers?.expose;\n if (exposeHeaders && exposeHeaders.length > 0) {\n responseHeaders.set('access-control-expose-headers', exposeHeaders.join(', '));\n }\n if (config.credentials?.allow) {\n responseHeaders.set('access-control-allow-credentials', 'true');\n }\n if (config.privateNetwork?.allow && request.headers.one('access-control-request-private-network') === 'true') {\n responseHeaders.set('access-control-allow-private-network', 'true');\n }\n\n // no max-age support :)\n return true;\n}\n\nconst ALL = '*';\nconst DEFAULT_METHODS = ['GET', 'HEAD'];\n\nfunction validateAllowCredentials(config: CorsConfig) {\n if (config.credentials?.allow === true && config.origins?.allow === ALL) {\n throw new Error(`when credentials.allow is true origins.allow cannot be \"*\"`);\n }\n}\n\nfunction validateAllowPrivateNetwork(config: CorsConfig) {\n if (config.privateNetwork?.allow === true && config.origins?.allow === ALL) {\n throw new Error(`when privateNetwork.allow is true origins.allow cannot be \"*\"`);\n }\n}\n\nfunction checkOrigin(config: CorsConfig, origin? :string): string | undefined {\n if (origin) {\n const allowedOrigins = config.origins?.allow;\n if (allowedOrigins) {\n if (allowedOrigins === ALL) {\n validateAllowCredentials(config);\n validateAllowPrivateNetwork(config);\n return ALL;\n }\n const originToCheck = trimTrailingSlash(origin.toLowerCase());\n\n for (const allowedOrigin of allowedOrigins) {\n if ((allowedOrigin === ALL) || IOGateway.Filtering.valueMatches(allowedOrigin, originToCheck)) {\n return origin;\n }\n }\n }\n }\n}\n\nfunction checkMethods(config: CorsConfig, requestMethod?: string): string[] | undefined {\n if (requestMethod) {\n const allowedMethods = config.methods?.allow ?? DEFAULT_METHODS;\n if (allowedMethods === ALL) {\n return [requestMethod];\n }\n if (IOGateway.Filtering.valuesMatch(allowedMethods, requestMethod)) {\n return allowedMethods;\n }\n }\n}\n\nfunction checkHeaders(config: CorsConfig, requestHeaders?: string[]): string[] | undefined {\n if (requestHeaders === undefined) {\n return;\n }\n if (requestHeaders.length == 0) {\n return [];\n }\n const allowedHeaders = config.headers?.allow;\n if (allowedHeaders === undefined) {\n return;\n }\n const allowAnyHeader = allowedHeaders === ALL;\n const result: string[] = [];\n for (const requestHeader of requestHeaders) {\n const value = requestHeader?.trim();\n if (value) {\n if (allowAnyHeader) {\n result.push(value);\n }\n else {\n for (const allowedHeader of allowedHeaders) {\n if (value.toLowerCase() == allowedHeader) {\n result.push(value);\n break;\n }\n }\n }\n }\n }\n if (result.length > 0) {\n return result;\n }\n}\n\nfunction trimTrailingSlash(origin: string): string {\n return origin.endsWith('/') ? origin.slice(0, -1) : origin;\n}\n\nfunction getMethodToUse(request: HttpRequest<ReadonlyHttpHeaders>, isPreFlight: boolean): string | undefined {\n return (isPreFlight ? request.headers.one('access-control-request-method') : request.method);\n}\n\nfunction getHeadersToUse(request: HttpRequest, isPreFlight: boolean): string[] {\n const headers = request.headers;\n return (isPreFlight ? headers.list('access-control-request-headers') : Array.from(headers.keys()));\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_gateway", "start", "import_gateway", "import_gateway", "GatewayEncoders", "logger", "codec", "socket", "create", "core_default", "import_gateway", "GatewayEncoders", "logger", "codec", "create", "core_default", "logger", "onMessage", "create", "core_default", "logger", "routes", "routes_default", "portRange", "start", "log", "import_gateway", "log", "import_gateway", "logger", "logger", "routes", "http", "options", "handler", "https", "core_default", "routes_default", "server", "route", "host"]
7
+ }