{
  "version": 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"],
  "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"],
  "mappings": "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",
  "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"]
}
