@interopio/gateway-server 0.5.0-beta → 0.5.2-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.
- package/changelog.md +13 -1
- package/dist/index.cjs +4 -1
- package/dist/index.cjs.map +2 -2
- package/dist/index.js +4 -1
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../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", "../src/server/server-header.ts", "../src/server/security/http-headers.ts", "../src/server/security/types.ts", "../src/server/security/entry-point-failure-handler.ts", "../src/server/security/http-basic-entry-point.ts", "../src/server/security/http-basic-converter.ts", "../src/server/util/matchers.ts", "../src/server/security/security-context.ts", "../src/server/security/authentication-filter.ts", "../src/server/security/oauth2/token-error.ts", "../src/server/security/oauth2/token-converter.ts", "../src/server/security/oauth2/token-entry-point.ts", "../src/server/security/oauth2/jwt-auth-manager.ts", "../src/server/security/oauth2-resource-server.ts", "../src/server/security/http-status-entry-point.ts", "../src/server/security/delegating-entry-point.ts", "../src/server/security/delegating-success-handler.ts", "../src/server/security/http-basic.ts", "../src/server/security/config.ts", "../src/server/security/error-filter.ts", "../src/server/security/authorization-filter.ts", "../src/server/security/delegating-authorization-manager.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["import {WebSocketServer} from 'ws';\nimport http from 'node:http';\nimport https from 'node:https';\nimport {SecureContextOptions} from 'node:tls';\nimport type {AddressInfo, Socket} 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';\nimport serverHeader from './server/server-header.ts';\nimport security from './server/security/config.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(storage: AsyncLocalStorage<{}>,\n middleware: Middleware<HttpServerRequest, HttpServerResponse>,\n routes: Map<string, RouteInfo>,\n onSocketError: (err: Error) => void): RequestHandler {\n\n const listener = compose<WebExchange<HttpServerRequest, HttpServerResponse>>(\n serverHeader(),\n ...security({\n authorize: [\n [async (exchange) => {\n return {match: exchange.path === '/health' && exchange.method === 'GET'};\n }, {access: 'permit-all'}],\n // ['any-exchange', {access: 'authenticated'}],\n ['any-exchange', {access: 'permit-all'}],\n ],\n basic: {\n disabled: true,\n realm: 'Gateway Server',\n },\n jwt: {\n disabled: true,\n }\n }, storage),\n ...cors({\n origins: {allow: [/http:\\/\\/localhost(:\\d+)?/, /file:\\//]},\n methods: {allow: ['GET', 'HEAD', 'POST', 'DELETE']},\n headers: {allow: '*'},\n credentials: {allow: true}\n }),\n ...middleware,\n async ({request, response}, next) => {\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 if (route) {\n if (request.method === 'GET'\n && (request.headers.one('connection') === 'Upgrade')\n && (request.headers.one('upgrade')?.toLowerCase() === 'websocket')) {\n\n const socket = request.socket;\n const host = request.host;\n const info = socketKey(request._req.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(request._req, socket, request._req['_upgradeHead'], (ws) => {\n response._res['_header'] = true; // prevent response from being sent\n ws.on('pong', () => ws['connected'] = true);\n ws.on('ping', () => {\n });\n wss.emit('connection', ws, request._req);\n });\n } else {\n logger.warn(`${info} rejected upgrade request from ${host} on ${path}`);\n socket.destroy();\n }\n\n }\n else {\n response.statusCode = 426;\n response._res\n .appendHeader('Upgrade', 'websocket')\n .appendHeader('Connection', 'Upgrade')\n .appendHeader('Content-Type', 'text/plain');\n await response.end(`This service [${request.path}] requires use of the websocket protocol.`);\n }\n } else {\n await next();\n }\n },\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 await response.end(`io.Gateway Server`);\n } else {\n await next();\n }\n },\n async ({request, response}, _next) => {\n response.statusCode = 404;\n await response.end(http.STATUS_CODES[404]);\n }\n );\n\n return (request: http.IncomingMessage, response: http.ServerResponse) => {\n request.socket.addListener('error', onSocketError);\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 try {\n return await listener(exchange);\n } catch (e) {\n if (logger.enabledFor('warn')) {\n logger.warn(`error processing request for ${exchange.path}`, e);\n }\n }\n finally {\n await exchange.response.end();\n }\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, storage: AsyncLocalStorage<{ }> }) => 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 storage = new AsyncLocalStorage<{}>();\n const serverP: Promise<http.Server> = new Promise((resolve, reject) => {\n const onSocketError = (err: Error) => logger.error(`socket error: ${err}`, err);\n const listener = createListener(storage, middleware, routes, onSocketError);\n const server = createServer({}, listener);\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, storage});\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 (req as any)._upgradeHead = head;\n const res = new http.ServerResponse(req);\n res.assignSocket(socket as Socket);\n listener(req, res);\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 abstract readonly principal: Promise<Authentication | undefined>;\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 HttpCookie = {\n name: string,\n value: string\n}\n\nexport type ResponseCookie = HttpCookie & {\n maxAge: number,\n domain?: string,\n path?: string,\n secure?: boolean,\n httpOnly?: boolean,\n sameSite?: 'strict' | 'lax' | 'none'\n}\n\nexport type ServerHttpRequest = HttpRequest<ReadonlyHttpHeaders> & {\n\n readonly cookies: HttpCookie[]\n readonly formData: Promise<URLSearchParams>\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 statusMessage?: string\n\n readonly cookies: ResponseCookie[]\n addCookie(cookie: ResponseCookie): this\n end(chunk?: unknown): Promise<boolean>\n}\n\nexport interface Authentication {\n type: string;\n authenticated: boolean;\n readonly name?: string;\n}\n", "import {\n type HeaderValue,\n type HeaderValues,\n type HttpCookie,\n type HttpRequest,\n type HttpResponse,\n type MutableHttpHeaders,\n type ReadonlyHttpHeaders,\n type ResponseCookie,\n type ServerHttpRequest,\n type ServerHttpResponse,\n WebExchange\n} from './types.js';\nimport http from 'node:http';\nimport http2 from 'node:http2';\nimport {Cookie} from 'tough-cookie';\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 host ??= request.headers.one('host');\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\nfunction parseCookies(request: ServerHttpRequest): HttpCookie[] {\n return request.headers.list('cookie')\n .map(s => s.split(';').map((cs) => Cookie.parse(cs)))\n .flat(1)\n .filter((tc) => tc !== undefined)\n .map((tc) => {\n const result: HttpCookie = {name: tc.key, value: tc.value};\n return result;\n });\n}\n\nexport class HttpServerRequest implements ServerHttpRequest {\n private _body: Promise<Blob> | undefined;\n private _url: URL | undefined;\n private _cookies: HttpCookie[] | undefined;\n private readonly _headers: ReadonlyHttpHeaders;\n readonly _req: http.IncomingMessage;\n constructor(req: http.IncomingMessage) {\n this._req = req;\n this._headers = new IncomingMessageHeaders(this._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\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 dh ??= this._req?.socket.remoteAddress;\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 dp ??= this._req?.socket['encrypted'] ? 'https' : 'http';\n return requestToProtocol(this, dp);\n }\n\n get socket() {\n return this._req.socket;\n }\n\n get cookies(): HttpCookie[] {\n this._cookies ??= parseCookies(this);\n return this._cookies;\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 formData() {\n return this.body.then(async (blob) => {\n const text = await blob.text();\n const formData = new URLSearchParams(text);\n return formData;\n });\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 private readonly _msg: http.OutgoingMessage;\n constructor(msg: http.OutgoingMessage) {\n this._msg = msg;\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 readonly _res: http.ServerResponse;\n constructor(res: http.ServerResponse) {\n this._res = res;\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 set statusMessage(value: string) {\n this._res.statusMessage = value;\n }\n\n get headers() {\n return this._headers;\n }\n\n get cookies(): ResponseCookie[] {\n return this.headers.list('set-cookie').map((cookie) => {\n const parsed = Cookie.parse(cookie);\n if (parsed) {\n const result: ResponseCookie = {name: parsed.key, value: parsed.value, maxAge: Number(parsed.maxAge ?? -1)};\n if (parsed.httpOnly) result.httpOnly = true;\n if (parsed.domain) result.domain = parsed.domain;\n if (parsed.path) result.path = parsed.path;\n if (parsed.secure) result.secure = true;\n if (parsed.httpOnly) result.httpOnly = true;\n if (parsed.sameSite) result.sameSite = parsed.sameSite as 'strict' | 'lax' | 'none';\n return result;\n }\n }).filter((cookie): cookie is ResponseCookie => cookie !== undefined);\n }\n\n end(chunk?: unknown): Promise<boolean> {\n if (!this._res.headersSent) {\n return new Promise<boolean>((resolve, reject) => {\n if (chunk === undefined) {\n this._res.end(() => {\n resolve(true);\n });\n } else {\n this._res.end(chunk, () => {\n resolve(true);\n });\n }\n });\n\n }\n else {\n return Promise.resolve(false); // already ended\n }\n }\n\n addCookie(cookie: ResponseCookie): this {\n this.headers.add('set-cookie', new Cookie({\n key: cookie.name,\n value: cookie.value,\n maxAge: cookie.maxAge,\n domain: cookie.domain,\n path: cookie.path,\n secure: cookie.secure,\n httpOnly: cookie.httpOnly,\n sameSite: cookie.sameSite\n }).toString());\n return this;\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 get principal() {\n return Promise.resolve(undefined);\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 readonly _url: URL;\n private _body?: Blob;\n readonly headers = new MapHttpHeaders();\n\n constructor(url: URL, method?: string) {\n this._url = url;\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 cookies(): HttpCookie[] {\n return parseCookies(this);\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 if (!this.headers.has('content-type')) {\n this.headers.set('content-type', value.type || 'application/octet-stream');\n }\n }\n\n get formData(): Promise<URLSearchParams> {\n return this.body.then(async (b) => new URLSearchParams(await b.text()));\n }\n\n get URL() {\n return new URL(this.path + this._url.search, `${this.protocol}://${this.host}`);\n }\n}\n\nexport class MockHttpResponse implements HttpResponse<MutableHttpHeaders> {\n statusCode!: number;\n headers = new MapHttpHeaders();\n cookies: ResponseCookie[] = [];\n addCookie(cookie: ResponseCookie): this {\n this.cookies.push(cookie);\n return this;\n }\n\n private _body?: Blob;\n async end(chunk?: unknown): Promise<boolean> {\n if (this._body) {\n return false; // already ended\n }\n switch (typeof chunk) {\n case 'string':\n this._body = new Blob([chunk], {type: 'text/plain'});\n break;\n case 'object':\n if (chunk instanceof Blob) {\n this._body = chunk;\n } else if (chunk !== null) {\n this._body = new Blob([JSON.stringify(chunk)], {type: 'application/json'});\n }\n break;\n case 'undefined':\n this._body = new Blob([]);\n break;\n default:\n throw new Error(`Unsupported chunk type: ${typeof chunk}`);\n }\n return true;\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;\nimport {AsyncLocalStorage} from 'node:async_hooks';\nimport {SecurityContext} from \"../../server/security/security-context.ts\";\n\nconst log = getLogger('ws');\nconst codec = GatewayEncoders.json<IOGateway.Message>();\n\nfunction initClient(this: IOGateway.Gateway, key: string, socket: ws.WebSocket, host?: string,\n securityContextPromise?: Promise<SecurityContext>): IOGateway.GatewayClient<string> | undefined {\n const opts = {\n key,\n host,\n codec,\n onAuthenticate: async (): Promise<IOGateway.Auth.AuthenticationSuccess> => {\n const authentication = (await securityContextPromise)?.authentication;\n if (authentication?.authenticated) {\n return {type: 'success', user: authentication.name};\n }\n throw new Error(`no valid client authentication ${key}`);\n },\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, storage?: AsyncLocalStorage<{securityContext?: Promise<SecurityContext>}>}): 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 securityContextPromise = server.storage?.getStore()?.securityContext;\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, host, securityContextPromise);\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 value = ctx.request.cookies.find(cookie => cookie.name === COOKIE_NAME)?.value;\n return value && (parseInt(value) > 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.addCookie({name: COOKIE_NAME, value: `${expires}`, maxAge: Infinity, 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", "type MiddlewareFunction<T> = ((ctx: T, next: () => Promise<void>) => Promise<void>) | ((ctx: T) => Promise<void>);\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 {MiddlewareFunction}\n */\nexport function compose<T>(...middleware: MiddlewareFunction<T>[]): (ctx: T) => Promise<void> {\n if (!Array.isArray(middleware)) {\n throw new Error('middleware must be array!');\n }\n const fns = middleware.flat();\n for (const fn of fns) {\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 const dispatch = async (i: number): Promise<void> => {\n const fn = i === fns.length ? next : fns[i];\n if (fn === undefined) {\n return;\n }\n let nextCalled = false;\n let nextResolved = false;\n const nextFn = async () => {\n if (nextCalled) {\n throw new Error('next() called multiple times');\n }\n nextCalled = true;\n try {\n return await dispatch(i + 1);\n }\n finally {\n nextResolved = true;\n }\n };\n const result = await fn(ctx, nextFn);\n if (nextCalled && !nextResolved) {\n throw new Error('middleware resolved before downstream.\\n\\t You are probably missing an await or return statement in your middleware function.');\n }\n return result;\n }\n\n return dispatch(0);\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 await ctx.response.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", "import type {WebExchange} from './types';\n\nconst serverHeader = (server: string) => {\n return async ({response}: WebExchange, next: () => Promise<void>) => {\n if (!response.headers.has('server')) {\n response.headers.set('Server', server);\n }\n await next();\n }\n};\n\nexport default (server = 'gateway-server') => serverHeader(server);\n", "import {WebExchange} from \"../types.ts\";\nimport {MapHttpHeaders} from \"../exchange.ts\";\n\ntype ServerHttpHeadersWriter = (exchange: WebExchange) => Promise<void>;\n\nconst staticServerHttpHeadersWriter = (headers: MapHttpHeaders): ServerHttpHeadersWriter => {\n return async (exchange: WebExchange) => {\n let containsNoHeaders = true;\n const {response} = exchange;\n for (const name of headers.keys()) {\n if (response.headers.has(name)) {\n containsNoHeaders = false;\n }\n }\n if (containsNoHeaders) {\n for (const [name, value] of headers) {\n response.headers.set(name, value);\n }\n }\n }\n}\n\nconst cacheControlServerHttpHeadersWriter = () => staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('cache-control', 'no-cache, no-store, max-age=0, must-revalidate')\n .add('pragma', 'no-cache')\n .add('expires', '0'));\n\nconst contentTypeServerHttpHeadersWriter = () => staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('x-content-type-options', 'nosniff'));\n\nconst strictTransportSecurityServerHttpHeadersWriter = (maxAgeInSeconds: number, includeSubDomains: boolean, preload: boolean) => {\n let headerValue = `max-age=${maxAgeInSeconds}`;\n if (includeSubDomains) {\n headerValue += ' ; includeSubDomains';\n }\n if (preload) {\n headerValue += ' ; preload';\n }\n const delegate = staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('strict-transport-security', headerValue))\n\n const isSecure = (exchange: WebExchange) => {\n const protocol = exchange.request.URL.protocol;\n return protocol === 'https:';\n }\n\n return async (exchange: WebExchange) => {\n if (isSecure(exchange)) {\n await delegate(exchange);\n }\n }\n};\n\ntype FrameOptionsMode = 'DENY' | 'SAMEORIGIN';\nconst frameOptionsServerHttpHeadersWriter = (mode: FrameOptionsMode) => {\n return staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('x-frame-options', mode))\n};\n\ntype XssProtectionHeaderValue = '0' | '1' | '1; mode=block';\nconst xssProtectionServerHttpHeadersWriter = (headerValue: XssProtectionHeaderValue) => staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('x-xss-protection', headerValue));\n\n\nconst permissionsPolicyServerHttpHeadersWriter = (policyDirectives?: string) => {\n\n const delegate = policyDirectives === undefined ? undefined : staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('permissions-policy', policyDirectives));\n return async (exchange: WebExchange) => {\n if (delegate !== undefined) {\n await delegate(exchange);\n }\n }\n}\nconst contentSecurityPolicyServerHttpHeadersWriter = (policyDirectives?: string, reportOnly?: boolean) => {\n const headerName = reportOnly ? 'content-security-policy-report-only' : 'content-security-policy';\n const delegate = policyDirectives === undefined ? undefined : staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add(headerName, policyDirectives));\n return async (exchange: WebExchange) => {\n if (delegate !== undefined) {\n await delegate(exchange);\n }\n }\n};\n\ntype ReferrerPolicy =\n 'no-referrer'\n | 'no-referrer-when-downgrade'\n | 'origin'\n | 'origin-when-cross-origin'\n | 'same-origin'\n | 'strict-origin'\n | 'strict-origin-when-cross-origin'\n | 'unsafe-url';\nconst refererPolicyServerHttpHeadersWriter = (policy: ReferrerPolicy = 'no-referrer') => {\n return staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('referer-policy', policy));\n}\n\ntype CrossOriginOpenerPolicy = 'unsafe-none' | 'same-origin' | 'same-origin-allow-popups';\nconst crossOriginOpenerPolicyServerHttpHeadersWriter = (policy?: CrossOriginOpenerPolicy) => {\n const delegate = policy === undefined ? undefined : staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('cross-origin-opener-policy', policy));\n return async (exchange: WebExchange) => {\n if (delegate !== undefined) {\n await delegate(exchange);\n }\n }\n}\n\ntype CrossOriginEmbedderPolicy = 'unsafe-none' | 'require-corp';\nconst crossOriginEmbedderPolicyServerHttpHeadersWriter = (policy?: CrossOriginEmbedderPolicy) => {\n const delegate = policy === undefined ? undefined : staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('cross-origin-embedder-policy', policy));\n return async (exchange: WebExchange) => {\n if (delegate !== undefined) {\n await delegate(exchange);\n }\n }\n}\n\ntype CrossOriginResourcePolicy = 'same-origin' | 'same-site' | 'cross-origin';\nconst crossOriginResourcePolicyServerHttpHeadersWriter = (policy?: CrossOriginResourcePolicy) => {\n const delegate = policy === undefined ? undefined : staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('cross-origin-resource-policy', policy));\n return async (exchange: WebExchange) => {\n if (delegate !== undefined) {\n await delegate(exchange);\n }\n }\n}\n\nconst compositeServerHttpHeadersWriter = (\n ...writers: ServerHttpHeadersWriter[]\n): ServerHttpHeadersWriter => {\n return async (exchange: WebExchange) => {\n for (const writer of writers) {\n await writer(exchange);\n }\n }\n}\n\nexport default function headers(opts?: {\n cache?: { disabled?: boolean }\n contentType?: { disabled?: boolean },\n frameOptions?: { disabled?: boolean, mode?: FrameOptionsMode },\n hsts?: { disabled?: boolean, maxAge?: number, includeSubDomains?: boolean, preload?: boolean },\n xss?: { disabled?: boolean, headerValue?: XssProtectionHeaderValue },\n permissionsPolicy?: { disabled?: boolean, policyDirectives?: string },\n contentSecurityPolicy?: { disabled?: boolean, policyDirectives?: string, reportOnly?: boolean },\n refererPolicy?: { disabled?: boolean, policy?: ReferrerPolicy },\n crossOriginOpenerPolicy?: { disabled?: boolean, policy?: CrossOriginOpenerPolicy },\n crossOriginEmbedderPolicy?: { disabled?: boolean, policy?: CrossOriginEmbedderPolicy },\n crossOriginResourcePolicy?: { disabled?: boolean, policy?: CrossOriginResourcePolicy }\n writers?: ServerHttpHeadersWriter[]\n}) {\n const writers: ServerHttpHeadersWriter[] = [];\n if (!opts?.cache?.disabled) {\n writers.push(cacheControlServerHttpHeadersWriter());\n }\n if (!opts?.contentType?.disabled) {\n writers.push(contentTypeServerHttpHeadersWriter());\n }\n if (!opts?.hsts?.disabled) {\n writers.push(strictTransportSecurityServerHttpHeadersWriter(opts?.hsts?.maxAge ?? 365 * 24 * 60 * 60, opts?.hsts?.includeSubDomains ?? true, opts?.hsts?.preload ?? false));\n }\n if (!opts?.frameOptions?.disabled) {\n writers.push(frameOptionsServerHttpHeadersWriter(opts?.frameOptions?.mode ?? 'DENY'));\n }\n if (!opts?.xss?.disabled) {\n writers.push(xssProtectionServerHttpHeadersWriter(opts?.xss?.headerValue ?? '0'));\n }\n if (!opts?.permissionsPolicy?.disabled) {\n writers.push(permissionsPolicyServerHttpHeadersWriter(opts?.permissionsPolicy?.policyDirectives));\n }\n if (!opts?.contentSecurityPolicy?.disabled) {\n writers.push(contentSecurityPolicyServerHttpHeadersWriter(opts?.contentSecurityPolicy?.policyDirectives ?? \"default-src 'self'\", opts?.contentSecurityPolicy?.reportOnly));\n }\n if (!opts?.refererPolicy?.disabled) {\n writers.push(refererPolicyServerHttpHeadersWriter(opts?.refererPolicy?.policy ?? 'no-referrer'));\n }\n if (!opts?.crossOriginOpenerPolicy?.disabled) {\n writers.push(crossOriginOpenerPolicyServerHttpHeadersWriter(opts?.crossOriginOpenerPolicy?.policy));\n }\n if (!opts?.crossOriginEmbedderPolicy?.disabled) {\n writers.push(crossOriginEmbedderPolicyServerHttpHeadersWriter(opts?.crossOriginEmbedderPolicy?.policy));\n }\n if (!opts?.crossOriginResourcePolicy?.disabled) {\n writers.push(crossOriginResourcePolicyServerHttpHeadersWriter(opts?.crossOriginResourcePolicy?.policy));\n }\n if (opts?.writers) {\n writers.push(...opts.writers);\n }\n const writer = compositeServerHttpHeadersWriter(...writers);\n\n return async (exchange: WebExchange, next: () => Promise<void>) => {\n await writer(exchange);\n await next();\n }\n}\n", "import type {Authentication, WebExchange} from '../types';\n\nexport type AuthenticationConverter = (exchange: WebExchange) => Promise<Authentication | undefined>;\n\nexport class AuthenticationError extends Error {\n private _authentication?: Authentication;\n\n get authentication(): Authentication | undefined {\n return this._authentication;\n }\n\n set authentication(value: Authentication) {\n if (value === undefined) {\n throw new TypeError(\"Authentication cannot be undefined\");\n }\n this._authentication = value;\n }\n}\n\nexport class InsufficientAuthenticationError extends AuthenticationError {}\n\nexport class BadCredentialsError extends AuthenticationError {}\n\nexport class AuthenticationCredentialsNotFoundError extends AuthenticationError {}\n\nexport class AccessDeniedError extends Error {}\n\nexport type AuthenticationManager = (authentication: Authentication) => Promise<Authentication | undefined>;\n\nexport type AuthorizationManager<T> = {\n\n /**\n * Determines if access should be granted to the given object for the provided authentication.\n * @param authentication\n * @param object\n */\n verify(authentication: Promise<Authentication | undefined>, object: T): Promise<void>,\n /**\n * Checks if the authentication is authorized to access the given object.\n * @param authentication\n * @param object\n */\n authorize: (authentication: Promise<Authentication | undefined>, object: T) => Promise<AuthorizationResult | undefined>;\n}\nexport interface AuthorizationResult {readonly granted: boolean;}\nexport class AuthorizationDecision implements AuthorizationResult {\n constructor(granted: boolean) {\n this.granted = granted;\n }\n\n readonly granted: boolean;\n}\nexport class DefaultAuthorizationManager<T> implements AuthorizationManager<T> {\n readonly check: (authentication: Promise<Authentication | undefined>, object: T) => Promise<AuthorizationDecision | undefined>;\n constructor(check: (authentication: Promise<Authentication | undefined>, object: T) => Promise<AuthorizationDecision>) {\n this.check = check;\n }\n\n async verify(authentication: Promise<Authentication | undefined>, object: T): Promise<void> {\n const decision = await this.check(authentication, object);\n if (!decision?.granted) {\n throw new AccessDeniedError(\"Access denied\");\n }\n }\n\n async authorize(authentication: Promise<Authentication | undefined>, object: T) {\n return await this.check(authentication, object);\n }\n}\n\nexport class AuthenticationServiceError extends AuthenticationError {}\nexport type ServerAuthenticationSuccessHandler = (filterExchange: {exchange: WebExchange, next: () => Promise<void>}, authentication: Authentication) => Promise<void>;\nexport type ServerAuthenticationFailureHandler = (filterExchange: {exchange: WebExchange, next: () => Promise<void>}, error: AuthenticationError) => Promise<void>;\nexport type ServerAuthenticationEntryPoint = (exchange: WebExchange, error: AuthenticationError) => Promise<void>;\nexport type ServerAccessDeniedHandler = (exchange: WebExchange, error: AccessDeniedError) => Promise<void>;\n", "import {\n AuthenticationServiceError,\n ServerAuthenticationEntryPoint,\n ServerAuthenticationFailureHandler\n} from './types.ts';\n\nexport const serverAuthenticationEntryPointFailureHandler = (opts: {\n entryPoint: ServerAuthenticationEntryPoint,\n rethrowAuthenticationServiceError?: boolean\n}): ServerAuthenticationFailureHandler => {\n const entryPoint = opts.entryPoint;\n const rethrowAuthenticationServiceError = opts?.rethrowAuthenticationServiceError ?? true;\n return async ({exchange}, error) => {\n if (!rethrowAuthenticationServiceError) {\n return entryPoint(exchange, error);\n }\n if (!(error instanceof AuthenticationServiceError)) {\n return entryPoint(exchange, error);\n }\n throw error;\n\n };\n\n\n}\n", "import {ServerAuthenticationEntryPoint} from \"./types.ts\";\n\nconst DEFAULT_REALM = \"Realm\";\nconst createHeaderValue = (realm: string): string => {\n return `Basic realm=\"${realm}\"`;\n}\n\nexport const httpBasicEntryPoint = (opts?: { realm?: string }): ServerAuthenticationEntryPoint => {\n const headerValue = createHeaderValue(opts?.realm ?? DEFAULT_REALM);\n return async (exchange, _error) => {\n const {response} = exchange;\n response.statusCode = 401 /*Unauthorized*/;\n response.headers.set(\"WWW-Authenticate\", headerValue);\n };\n}\n", "import {AuthenticationConverter} from \"./types.ts\";\n\nconst BASIC = 'Basic ';\n\nexport const httpBasicAuthenticationConverter = (opts?: {credentialsEncoding?: BufferEncoding}): AuthenticationConverter => {\n return async (exchange) => {\n const {request} = exchange;\n const authorization = request.headers.one(\"authorization\");\n if (!authorization || !(/basic/i).test(authorization.substring(0,))) {\n return;\n }\n const credentials = authorization.length <= BASIC.length ? '' : authorization.substring(BASIC.length);\n const decoded = Buffer.from(credentials, 'base64').toString(opts?.credentialsEncoding ?? 'utf-8');\n const parts = decoded.split(\":\", 2);\n if (parts.length !== 2) {\n return undefined;\n }\n return {type: 'UsernamePassword', authenticated: false, principal: parts[0], credentials: parts[1]};\n }\n\n}\n", "import {WebExchange} from \"../types.ts\";\n\nexport type MatchResult = Readonly<{ match: boolean }>;\n\nexport interface ServerWebExchangeMatcher {\n /**\n * Matches the given exchange against the matcher.\n * @param exchange The web exchange to match.\n * @returns A promise that resolves to true if the exchange matches, false otherwise.\n */\n (exchange: WebExchange): Promise<MatchResult>;\n\n /**\n * Returns a string representation of the matcher.\n * @returns A string representation of the matcher.\n */\n toString(): string;\n}\n\nexport type ServerWebExchangeMatcherEntry<T> = Readonly<[ServerWebExchangeMatcher, T]>\n\nexport const or: (matchers: ServerWebExchangeMatcher[]) => ServerWebExchangeMatcher = (matchers: ServerWebExchangeMatcher[]): ServerWebExchangeMatcher => {\n return async (exchange: WebExchange): Promise<MatchResult> => {\n for (const matcher of matchers) {\n const result = await matcher(exchange);\n if (result.match) {\n return {match: true};\n }\n }\n return {match: false};\n };\n}\n\nexport const and: (matchers: ServerWebExchangeMatcher[]) => ServerWebExchangeMatcher = (matchers: ServerWebExchangeMatcher[]) => {\n return async (exchange: WebExchange): Promise<MatchResult> => {\n for (const matcher of matchers) {\n const result = await matcher(exchange);\n if (!result.match) {\n return {match: false};\n }\n }\n return {match: true};\n };\n}\n\nexport const not: (matcher: ServerWebExchangeMatcher) => ServerWebExchangeMatcher = (matcher: ServerWebExchangeMatcher): ServerWebExchangeMatcher => {\n return async (exchange: WebExchange): Promise<{ match: boolean }> => {\n const result = await matcher(exchange);\n return {match: !result.match};\n };\n}\n\nexport const anyExchange: ServerWebExchangeMatcher = async (_exchange: WebExchange): Promise<{ match: boolean }> => {\n return {match: true};\n}\n\nexport const mediaType : ((opts: {mediaTypes: string[], ignoredMediaTypes?: string[], useEquality?: boolean}) => ServerWebExchangeMatcher) = (opts): ServerWebExchangeMatcher => {\n\n const shouldIgnore = (requestedMediaType: string): boolean => {\n if (opts.ignoredMediaTypes !== undefined) {\n for (const ignoredMediaType of opts.ignoredMediaTypes) {\n if (requestedMediaType === ignoredMediaType || ignoredMediaType === '*/*') {\n return true;\n }\n }\n }\n return false;\n }\n\n return async (exchange: WebExchange): Promise<MatchResult> => {\n const request = exchange.request;\n let requestMediaTypes: string[];\n try {\n requestMediaTypes = request.headers.list('accept');\n }\n catch (e) {\n return {match: false};\n }\n for (const requestedMediaType of requestMediaTypes) {\n if (shouldIgnore(requestedMediaType)) {\n continue;\n }\n for (const mediaType of opts.mediaTypes) {\n if (requestedMediaType.startsWith(mediaType)) {\n return {match: true};\n }\n }\n }\n\n return {match: false};\n };\n}\n", "import {AsyncLocalStorage} from 'node:async_hooks';\nimport {Authentication} from \"../types.ts\";\n\nexport interface SecurityContext {\n authentication?: Authentication;\n}\n\nexport class AsyncStorageSecurityContextHolder {\n private static hasSecurityContext(storage: AsyncLocalStorage<{\n securityContext?: Promise<SecurityContext>\n }>): boolean {\n return storage.getStore()?.securityContext !== undefined;\n }\n\n private static async getSecurityContext(storage: AsyncLocalStorage<{\n securityContext?: Promise<SecurityContext>\n }>): Promise<SecurityContext | undefined> {\n return await storage.getStore()?.securityContext;\n }\n\n public static clearSecurityContext(storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }>) {\n delete storage.getStore()?.securityContext;\n }\n\n public static withSecurityContext(securityContext: Promise<SecurityContext>) {\n return (storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }> = new AsyncLocalStorage<{\n securityContext?: Promise<SecurityContext>\n }>()) => {\n storage.getStore()!.securityContext = securityContext;\n return storage;\n };\n }\n\n public static withAuthentication(authentication: Authentication) {\n return AsyncStorageSecurityContextHolder.withSecurityContext(Promise.resolve({authentication}));\n }\n\n public static async getContext(storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }>): Promise<SecurityContext | undefined> {\n if (AsyncStorageSecurityContextHolder.hasSecurityContext(storage)) {\n return AsyncStorageSecurityContextHolder.getSecurityContext(storage);\n }\n }\n}\n", "import {WebExchange, type Authentication} from \"../types.ts\";\nimport {\n AuthenticationConverter,\n AuthenticationError,\n AuthenticationManager,\n ServerAuthenticationFailureHandler, ServerAuthenticationSuccessHandler\n} from \"./types.ts\";\nimport {serverAuthenticationEntryPointFailureHandler} from \"./entry-point-failure-handler.ts\";\nimport {httpBasicEntryPoint} from \"./http-basic-entry-point.ts\";\nimport {httpBasicAuthenticationConverter} from './http-basic-converter.ts';\nimport {anyExchange, type ServerWebExchangeMatcher} from '../util/matchers.ts';\nimport {AsyncStorageSecurityContextHolder, type SecurityContext} from './security-context.ts';\nimport {AsyncLocalStorage} from 'node:async_hooks';\n\nasync function authenticate(exchange: WebExchange,\n next: () => Promise<void>,\n token: Authentication,\n managerResolver: (exchange: WebExchange) => Promise<AuthenticationManager | undefined>,\n successHandler: ServerAuthenticationSuccessHandler,\n storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }>): Promise<void> {\n const authManager = await managerResolver(exchange);\n const authentication = await authManager?.(token);\n if (authentication === undefined) {\n throw new Error(\"No authentication manager found for the exchange\");\n }\n try {\n await onAuthenticationSuccess(authentication, {exchange, next}, successHandler, storage);\n } catch (e) {\n if (e instanceof AuthenticationError) {\n // todo debug log\n }\n throw e;\n }\n}\n\nasync function onAuthenticationSuccess(authentication: Authentication,\n filterExchange: {exchange: WebExchange, next: () => Promise<void>},\n successHandler: ServerAuthenticationSuccessHandler,\n storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }>): Promise<void> {\n AsyncStorageSecurityContextHolder.withAuthentication(authentication)(storage);\n await successHandler(filterExchange, authentication);\n\n}\n\nexport type AuthenticationFilterOptions = {\n storage: AsyncLocalStorage<{securityContext?: Promise<SecurityContext>}>\n managerResolver?: (exchange: WebExchange) => Promise<AuthenticationManager | undefined>,\n manager?: AuthenticationManager,\n successHandler?: ServerAuthenticationSuccessHandler,\n // converter is a function that converts the exchange to an authentication object\n converter?: AuthenticationConverter,\n failureHandler?: ServerAuthenticationFailureHandler\n // matcher is a function that checks if the exchange must be authenticated\n matcher?: ServerWebExchangeMatcher,\n};\n\nexport default function authenticationFilter(opts: AuthenticationFilterOptions) {\n const auth = {\n matcher: anyExchange,\n successHandler: async({next}) => {\n await next();\n },\n converter: httpBasicAuthenticationConverter({}),\n failureHandler: serverAuthenticationEntryPointFailureHandler({entryPoint: httpBasicEntryPoint({})}),\n ...opts\n };\n let managerResolver = auth.managerResolver;\n if (managerResolver === undefined && auth.manager !== undefined) {\n const manager: AuthenticationManager = auth.manager;\n managerResolver = async (_exchange: WebExchange) => {\n return manager;\n };\n }\n if (managerResolver === undefined) {\n throw new Error(\"Authentication filter requires a managerResolver or a manager\");\n }\n return async (exchange: WebExchange, next: () => Promise<void>): Promise<void> => {\n const matchResult = await auth.matcher(exchange);\n const token = matchResult.match ? await auth.converter(exchange) : undefined;\n if (token === undefined) {\n await next();\n return;\n }\n\n try {\n await authenticate(exchange, next, token, managerResolver, auth.successHandler, auth.storage);\n\n } catch (error) {\n if (error instanceof AuthenticationError) {\n await auth.failureHandler({exchange, next}, error);\n return;\n }\n throw error; // Re-throw the error to be handled by the next middleware or error handler\n }\n };\n}\n", "export type OAuth2Error = {\n readonly errorCode: string\n readonly description?: string\n readonly uri?: string\n}\n\nexport type BearerTokenError = OAuth2Error & {\n readonly httpStatus: number\n readonly scope?: string\n}\n\nexport const BearerTokenErrorCodes = {\n invalid_request: \"invalid_request\",\n invalid_token: \"invalid_token\",\n}\n\nconst DEFAULT_URI = \"https://tools.ietf.org/html/rfc6750#section-3.1\";\n\nexport function invalidToken(message: string): BearerTokenError {\n return {errorCode: BearerTokenErrorCodes.invalid_token, httpStatus: 401 /*unauthorized*/, description: message, uri: DEFAULT_URI};\n}\n\nexport function invalidRequest(message: string): BearerTokenError {\n return {errorCode: BearerTokenErrorCodes.invalid_request, httpStatus: 400 /*bad request*/, description: message, uri: DEFAULT_URI};\n}\n", "import {Authentication, ReadonlyHttpHeaders, ServerHttpRequest, WebExchange} from \"../../types.ts\";\nimport {AuthenticationConverter, AuthenticationError} from \"../types.ts\";\nimport {invalidRequest, invalidToken, OAuth2Error} from \"./token-error.ts\";\n\nconst ACCESS_TOKEN_PARAMETER_NAME = 'access_token';\nconst authorizationPattern = /^Bearer\\s+(?<token>[a-zA-Z0-9-._~+/]+=*)$/i;\n\nexport class Oauth2AuthenticationError extends AuthenticationError {\n readonly error: OAuth2Error;\n\n constructor(error: string | OAuth2Error, message?: string, options?: ErrorOptions) {\n super(message ?? (typeof error === 'string' ? undefined : error.description), options);\n this.error = typeof error === 'string' ? {errorCode: error} : error;\n }\n}\n\nexport type BearerTokenAuthenticationToken = Authentication & {\n type: 'BearerToken';\n token: string;\n}\n\nexport const isBearerTokenAuthenticationToken = (authentication: Authentication): authentication is BearerTokenAuthenticationToken => {\n return authentication.type === 'BearerToken';\n}\n\nconst serverBearerTokenAuthenticationConverter = (opts?: {headerName?: string, uriQueryParameter?: boolean, formEncodedBodyParameter?: boolean }): AuthenticationConverter => {\n return async (exchange: WebExchange) => {\n const {request} = exchange;\n return Promise.all<string[] | undefined>([\n resolveFromAuthorizationHeader(request.headers, opts?.headerName).then((token?: string) => token !== undefined ? [token] : undefined),\n resolveFromQueryString(request, opts?.uriQueryParameter),\n resolveFromBody(exchange, opts?.formEncodedBodyParameter)\n ])\n .then(rs => rs.filter(r => r !== undefined).flat(1))\n .then(resolveToken)\n .then(token => {\n if (token) return {authenticated: false, type: 'BearerToken', token};\n });\n }\n}\n\nasync function resolveToken(accessTokens: string[]) {\n if (accessTokens.length === 0) {\n return;\n }\n if (accessTokens.length > 1) {\n const error = invalidRequest(\"Found multiple access tokens in the request\");\n throw new Oauth2AuthenticationError(error);\n }\n\n const accessToken = accessTokens[0];\n if (!accessToken || accessToken.length === 0) {\n const error = invalidRequest(\"The requested access token parameter is an empty string\");\n throw new Oauth2AuthenticationError(error);\n }\n return accessToken;\n}\n\nasync function resolveFromAuthorizationHeader(headers: ReadonlyHttpHeaders, headerName: string = 'authorization'): Promise<string | undefined> {\n const authorization = headers. one(headerName)\n if (!authorization || !(/bearer/i).test(authorization.substring(0,))) {\n return;\n }\n const match = authorizationPattern.exec(authorization);\n if (match === null) {\n const error = invalidToken(\"Bearer token is malformed\");\n throw new Oauth2AuthenticationError(error);\n }\n return match.groups?.token;\n}\n\nasync function resolveTokens(parameters: URLSearchParams): Promise<string[] | undefined> {\n const accessTokens = parameters.getAll(ACCESS_TOKEN_PARAMETER_NAME);\n if (accessTokens.length === 0) {\n return;\n }\n return accessTokens;\n}\n\nasync function resolveFromQueryString(request: ServerHttpRequest, allow = false): Promise<string[] | undefined> {\n if (!allow || request.method !== 'GET') {\n return;\n }\n return resolveTokens(request.URL.searchParams);\n}\n\nasync function resolveFromBody(exchange: WebExchange, allow = false): Promise<string[] | undefined> {\n const {request} = exchange;\n if (!allow\n || ('application/x-www-form-urlencoded' !== request.headers.one('content-type'))\n || request.method !== 'POST') {\n return;\n }\n return resolveTokens(await exchange.request.formData);\n}\n\nexport default serverBearerTokenAuthenticationConverter;\n", "import {AuthenticationError, ServerAuthenticationEntryPoint} from \"../types.ts\";\nimport {Oauth2AuthenticationError} from \"./token-converter.ts\";\nimport {BearerTokenError, OAuth2Error} from \"./token-error.ts\";\n\nfunction computeWWWAuthenticate(parameters: Map<string, string>) {\n let wwwAuthenticate = 'Bearer';\n if (parameters.size !== 0) {\n wwwAuthenticate += ' ';\n let i = 0;\n for (const [key, value] of parameters) {\n wwwAuthenticate += `${key}=\"${value}\"`;\n if (i !== parameters.size - 1) {\n wwwAuthenticate += ', ';\n }\n i++;\n }\n }\n return wwwAuthenticate;\n}\n\nconst isBearerTokenError = (error: OAuth2Error): error is BearerTokenError => {\n return (error as BearerTokenError).httpStatus !== undefined;\n}\n\nfunction getStatus(authError: AuthenticationError) {\n if (authError instanceof Oauth2AuthenticationError) {\n const {error} = authError;\n if (isBearerTokenError(error)) {\n return error.httpStatus;\n }\n }\n return 401 /*Unauthorized*/;\n}\n\nfunction createParameters(authError: AuthenticationError, realm?: string) {\n const parameters = new Map<string, string>();\n if (realm) {\n parameters.set('realm', realm);\n }\n if (authError instanceof Oauth2AuthenticationError) {\n const {error} = authError;\n parameters.set('error', error.errorCode);\n if (error.description) {\n parameters.set('error_description', error.description);\n }\n if (error.uri) {\n parameters.set('error_uri', error.uri);\n }\n if (isBearerTokenError(error) && error.scope) {\n parameters.set('scope', error.scope);\n }\n }\n return parameters;\n}\n\nconst bearerTokenServerAuthenticationEntryPoint = (opts?: { realmName?: string }): ServerAuthenticationEntryPoint => {\n return async (exchange, error) => {\n const status = getStatus(error);\n const parameters = createParameters(error, opts?.realmName)\n const wwwAuthenticate = computeWWWAuthenticate(parameters);\n const {response} = exchange;\n response.headers.set('WWW-Authenticate', wwwAuthenticate);\n response.statusCode = status;\n await response.end()\n };\n}\n\nexport default bearerTokenServerAuthenticationEntryPoint;\n", "import {AuthenticationManager, AuthenticationServiceError} from \"../types.ts\";\nimport {Authentication} from \"../../types.ts\";\nimport {invalidToken} from \"./token-error.ts\";\nimport {isBearerTokenAuthenticationToken, Oauth2AuthenticationError} from \"./token-converter.ts\";\n\nexport interface Jwt {\n readonly subject?: string\n\n getClaimAsString(claim: string): string | undefined\n}\n\nconst jwtAuthConverter = (opts?: { principalClaimName?: string}): (jwt: Jwt) => Authentication => {\n const principalClaimName = opts?.principalClaimName ?? 'sub';\n\n return (jwt: Jwt) => {\n const name = jwt.getClaimAsString(principalClaimName);\n return {type: 'JwtToken', authenticated: true, name};\n };\n}\n\nconst asyncJwtConverter = (converter: (jwt: Jwt) => Authentication): (jwt: Jwt) => Promise<Authentication> => {\n return async (jwt: Jwt) => {\n return converter(jwt);\n };\n};\n\nclass JwtError extends Error {}\nclass BadJwtError extends JwtError {}\n\n\nfunction onError(error: JwtError) {\n if (error instanceof BadJwtError) {\n return new Oauth2AuthenticationError(invalidToken(error.message), error.message, {cause: error});\n }\n throw new AuthenticationServiceError(error.message, {cause: error});\n\n}\n\nexport default function jwtAuthManager(opts: {\n decoder: (token: string) => Promise<Jwt>\n authConverter?: (jwt: Jwt) => Promise<Authentication>\n}): AuthenticationManager {\n const decoder = opts.decoder;\n const authConverter = opts.authConverter ?? asyncJwtConverter(jwtAuthConverter({}));\n return async (authentication) => {\n if (isBearerTokenAuthenticationToken(authentication)) {\n const token = authentication.token;\n try {\n const jwt = await decoder(token);\n return await authConverter(jwt);\n } catch (e) {\n if (e instanceof JwtError) {\n throw onError(e);\n }\n throw e;\n }\n }\n }\n}\n", "import {Authentication, type WebExchange} from \"../types.ts\";\nimport authenticationFilter from \"./authentication-filter.ts\";\nimport {\n AuthenticationConverter,\n AuthenticationManager,\n ServerAuthenticationEntryPoint,\n ServerAuthenticationFailureHandler\n} from \"./types.ts\";\nimport serverBearerTokenAuthenticationConverter from \"./oauth2/token-converter.ts\";\nimport {serverAuthenticationEntryPointFailureHandler} from \"./entry-point-failure-handler.ts\";\nimport bearerTokenServerAuthenticationEntryPoint from \"./oauth2/token-entry-point.ts\";\nimport jwtAuthManager, {Jwt} from \"./oauth2/jwt-auth-manager.ts\";\nimport {AsyncLocalStorage} from \"node:async_hooks\";\nimport type {SecurityContext} from \"./security-context.ts\";\n\nexport default function resourceServer(opts: {\n readonly storage: AsyncLocalStorage<{securityContext?: Promise<SecurityContext>}>,\n converter?: AuthenticationConverter,\n failureHandler?: ServerAuthenticationFailureHandler,\n entryPoint?: ServerAuthenticationEntryPoint,\n managerResolver?: (exchange: WebExchange) => Promise<AuthenticationManager | undefined>,\n jwt?: {\n manager?: AuthenticationManager,\n decoder: (token: string) => Promise<Jwt>,\n authConverter?: (jwt: Jwt) => Promise<Authentication>\n }\n}): (exchange: WebExchange, next: () => Promise<void>) => Promise<void> {\n const entryPoint = opts.entryPoint ?? bearerTokenServerAuthenticationEntryPoint({});\n const converter = opts?.converter ?? serverBearerTokenAuthenticationConverter({});\n const failureHandler = opts.failureHandler ?? serverAuthenticationEntryPointFailureHandler({entryPoint})\n if (opts.managerResolver!== undefined) {\n return authenticationFilter({\n storage: opts.storage,\n converter,\n failureHandler,\n managerResolver: opts.managerResolver,\n });\n }\n if (opts.jwt !== undefined) {\n\n const manager = opts.jwt.manager ?? jwtAuthManager(opts.jwt);\n return authenticationFilter({\n storage: opts.storage,\n converter,\n failureHandler,\n managerResolver: async (_exchange: WebExchange) => {\n return manager;\n },\n });\n }\n throw new Error(\"Invalid resource server configuration: either managerResolver or jwt must be provided\");\n}\n", "import type { AuthenticationError, ServerAuthenticationEntryPoint} from \"./types.ts\";\n\nexport const httpStatusEntryPoint = (opts: {\n httpStatus: { code: number, message?: string }\n}): ServerAuthenticationEntryPoint => {\n return async (exchange, _error: AuthenticationError) => {\n const response = exchange.response;\n response.statusCode = opts.httpStatus.code;\n response.statusMessage = opts.httpStatus.message;\n };\n}\n", "import {AuthenticationError, type ServerAuthenticationEntryPoint} from \"./types.ts\";\nimport {type WebExchange} from \"../types.ts\";\nimport {type ServerWebExchangeMatcher} from \"../util/matchers.ts\";\n\nexport const delegatingEntryPoint = (opts: {\n entryPoints: Array<[ServerWebExchangeMatcher, ServerAuthenticationEntryPoint]>;\n defaultEntryPoint: ServerAuthenticationEntryPoint;\n}): ServerAuthenticationEntryPoint => {\n const defaultEntryPoint = opts.defaultEntryPoint ?? (async ({response}, _error) => {\n response.statusCode = 401; // Unauthorized\n await response.end();\n });\n return async (exchange: WebExchange, error: AuthenticationError) => {\n for (const [matcher, entryPoint] of opts.entryPoints) {\n const match = await matcher(exchange);\n if (match.match) {\n return entryPoint(exchange, error);\n }\n }\n return defaultEntryPoint(exchange, error);\n };\n}\n", "import {ServerAuthenticationSuccessHandler} from \"./types.ts\";\nimport {Authentication} from \"../types.ts\";\n\nexport const delegatingSuccessHandler = (handlers: Array<ServerAuthenticationSuccessHandler>) => {\n\n return async ({exchange, next}, authentication: Authentication) => {\n for (const handler of handlers) {\n await handler({exchange, next}, authentication);\n }\n };\n}\n", "import {WebExchange} from \"../types.ts\";\nimport authenticationFilter from \"./authentication-filter.ts\";\nimport {serverAuthenticationEntryPointFailureHandler} from \"./entry-point-failure-handler.ts\";\nimport {\n AuthenticationManager,\n ServerAuthenticationEntryPoint,\n ServerAuthenticationFailureHandler,\n ServerAuthenticationSuccessHandler\n} from \"./types.ts\";\nimport {httpStatusEntryPoint} from \"./http-status-entry-point.ts\";\nimport {httpBasicEntryPoint} from \"./http-basic-entry-point.ts\";\nimport {delegatingEntryPoint} from \"./delegating-entry-point.ts\";\nimport {httpBasicAuthenticationConverter} from \"./http-basic-converter.ts\";\nimport {delegatingSuccessHandler} from \"./delegating-success-handler.ts\";\nimport {MatchResult, ServerWebExchangeMatcher} from \"../util/matchers.ts\";\nimport * as matchers from \"../util/matchers.ts\";\nimport {type SecurityContext} from './security-context.ts';\n\nimport {AsyncLocalStorage} from \"node:async_hooks\";\n\nexport default function httpBasic(opts: {\n readonly storage: AsyncLocalStorage<{securityContext?: Promise<SecurityContext>}>\n readonly manager: AuthenticationManager;\n readonly entryPoint?: ServerAuthenticationEntryPoint;\n readonly failureHandler?: ServerAuthenticationFailureHandler;\n readonly successHandlers?: ServerAuthenticationSuccessHandler[];\n defaultEntryPoints: Array<[ServerWebExchangeMatcher, ServerAuthenticationEntryPoint]>;\n defaultSuccessHandlers: ServerAuthenticationSuccessHandler[];\n}) {\n\n const xhrMatcher: ServerWebExchangeMatcher = async (exchange: WebExchange): Promise<MatchResult> => {\n const headers = exchange.request.headers;\n const h = headers.list('X-Requested-With');\n if (h.includes('XMLHttpRequest')) {\n return {match: true};\n }\n return {match: false};\n }\n\n const defaultEntryPoint = delegatingEntryPoint({\n entryPoints: [[xhrMatcher, httpStatusEntryPoint({httpStatus: {code: 401}})]],\n defaultEntryPoint: httpBasicEntryPoint({})\n });\n\n const entryPoint = opts.entryPoint ?? defaultEntryPoint;\n\n const manager = opts.manager;\n\n const restMatcher = matchers.mediaType({\n mediaTypes: [\n 'application/atom+xml',\n 'application/x-www-form-urlencoded',\n 'application/json',\n 'application/octet-stream',\n 'application/xml',\n 'multipart/form-data',\n 'text/xml'\n ],\n ignoredMediaTypes: ['*/*']\n });\n\n const notHtmlMatcher = matchers.not(matchers.mediaType({mediaTypes: ['text/html']}));\n const restNoHtmlMatcher = matchers.and([notHtmlMatcher, restMatcher]);\n const preferredMatcher = matchers.or([xhrMatcher, restNoHtmlMatcher]);\n opts.defaultEntryPoints.push([preferredMatcher, entryPoint]);\n const failureHandler = opts.failureHandler ?? serverAuthenticationEntryPointFailureHandler({entryPoint});\n const successHandler = delegatingSuccessHandler(opts.successHandlers === undefined ? opts.defaultSuccessHandlers : opts.successHandlers);\n const converter = httpBasicAuthenticationConverter({});\n return authenticationFilter({\n storage: opts.storage,\n manager,\n failureHandler,\n successHandler,\n converter\n });\n}\n\n", "import {Authentication, Middleware, WebExchange} from \"../types.ts\";\nimport headers from \"./http-headers.ts\";\nimport resourceServer from \"./oauth2-resource-server.ts\";\nimport httpBasic from \"./http-basic.ts\";\nimport {Jwt} from \"./oauth2/jwt-auth-manager.ts\";\nimport {jwtVerifier} from \"@interopio/gateway/jose/jwt\";\nimport {\n AuthenticationManager,\n AuthorizationDecision,\n BadCredentialsError,\n DefaultAuthorizationManager,\n ServerAuthenticationEntryPoint,\n ServerAuthenticationSuccessHandler\n} from \"./types.ts\";\nimport {anyExchange, ServerWebExchangeMatcher, ServerWebExchangeMatcherEntry} from \"../util/matchers.ts\";\nimport {errorFilter} from \"./error-filter.ts\";\nimport {delegatingEntryPoint} from \"./delegating-entry-point.ts\";\nimport authorizationFilter from \"./authorization-filter.ts\";\nimport {type AsyncLocalStorage} from 'node:async_hooks';\nimport delegatingAuthorizationManager from \"./delegating-authorization-manager.ts\";\nimport {SecurityContext} from './security-context.ts';\n\nexport type HttpSecurityConfig = {\n headers?: {\n disabled?: boolean;\n xss?: { disabled?: boolean };\n }\n basic?: {\n disabled?: boolean;\n realm?: string;\n user?: {\n name: string,\n password?: string // generated password, if not provided\n authorities?: string[]\n }\n },\n jwt?: {\n disabled?: boolean;\n issuerBaseUri?: string; // base URI for the issuer, e.g. 'https://example.com'\n issuer?: string;\n audience?: string;\n },\n authorize?: Array<[\n 'any-exchange' | ServerWebExchangeMatcher,\n ( { access: 'permit-all' | 'deny-all' | 'authenticated' }\n | { access: 'has-any-authority', authorities: string[] }\n | { access: 'has-ip-address', address: string })\n ]>\n}\n\nconst filterOrder = {\n first: Number.MAX_SAFE_INTEGER,\n http_headers: 1 * 100,\n https_redirect: 2 * 100,\n cors: 3 * 100,\n http_basic: 6 * 100,\n authentication: 8 * 100,\n error_translation: 18 * 100,\n authorization: 19 * 100,\n last: Number.MAX_SAFE_INTEGER\n}\nconst filterOrderSymbol = Symbol.for(\"filterOrder\");\n\nexport default (config: HttpSecurityConfig,\n storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }>): Middleware => {\n const middleware: Middleware = [];\n\n class ServerHttpSecurity {\n #authenticationEntryPoint?: ServerAuthenticationEntryPoint;\n readonly #defaultEntryPoints: Array<[ServerWebExchangeMatcher, ServerAuthenticationEntryPoint]> = [];\n manager?: AuthenticationManager;\n\n get authenticationEntryPoint(): ServerAuthenticationEntryPoint | undefined {\n if (this.#authenticationEntryPoint !== undefined || this.#defaultEntryPoints.length === 0) {\n return this.#authenticationEntryPoint!;\n }\n if (this.#defaultEntryPoints.length === 1) {\n return this.#defaultEntryPoints[0][1];\n }\n return delegatingEntryPoint({\n entryPoints: this.#defaultEntryPoints,\n defaultEntryPoint: this.#defaultEntryPoints[this.#defaultEntryPoints.length - 1][1]\n });\n }\n\n\n build() {\n if (config.headers !== undefined && config.headers.disabled !== true) {\n const writer = headers(config.headers);\n writer[filterOrderSymbol] = filterOrder.http_headers;\n middleware.push(writer);\n }\n // move cors here\n\n if (config.basic !== undefined && config.basic?.disabled !== true) {\n const username = config.basic.user?.name.toLowerCase();\n const password = config.basic.user?.password ?? '';\n const authorities = config.basic.user?.authorities ?? [];\n const manager: AuthenticationManager = async (auth) => {\n const principal = auth['principal'];\n const credentials = auth['credentials'];\n if (principal.toLowerCase() !== username || credentials !== password) {\n throw new BadCredentialsError('Invalid username or password');\n }\n return {type: 'UsernamePassword', authenticated: true, principal, credentials, authorities: [...authorities]} as Authentication;\n }\n\n const defaultSuccessHandlers: ServerAuthenticationSuccessHandler[] = [\n async ({exchange: _, next}, _authentication) => {\n return next();\n }\n ];\n\n\n const filter = httpBasic({\n storage,\n manager,\n defaultEntryPoints: this.#defaultEntryPoints,\n defaultSuccessHandlers,\n });\n filter[filterOrderSymbol] = filterOrder.http_basic;\n middleware.push(filter);\n }\n if (config.jwt !== undefined && config.jwt.disabled !== true) {\n const verifier = jwtVerifier({\n issuerBaseUri: config.jwt.issuerBaseUri,\n issuer: config.jwt.issuer,\n audience: config.jwt.audience\n });\n const decoder = async (token: string): Promise<Jwt> => {\n const {payload} = await verifier(token);\n return {\n subject: payload.sub,\n getClaimAsString(claim: string): string | undefined {\n return payload[claim] as string | undefined;\n }\n };\n }\n const filter = resourceServer({storage, jwt: {decoder}});\n filter[filterOrderSymbol] = filterOrder.authentication;\n middleware.push(filter);\n\n }\n\n if (config.authorize !== undefined) {\n const errorFf = errorFilter({authenticationEntryPoint: this.authenticationEntryPoint});\n errorFf[filterOrderSymbol] = filterOrder.error_translation;\n middleware.push(errorFf)\n const buildAuthorizationManager = (authorize: HttpSecurityConfig['authorize']) => {\n const mappings: ServerWebExchangeMatcherEntry<DefaultAuthorizationManager<{\n exchange: WebExchange\n }>>[] = [];\n let anyExchangeRegistered = false;\n for (const [matcher, access] of authorize ?? []) {\n let serverMatcher: ServerWebExchangeMatcher;\n if (matcher === 'any-exchange') {\n anyExchangeRegistered = true;\n serverMatcher = anyExchange;\n } else if (anyExchangeRegistered) {\n throw new Error(\"Cannot register other matchers after 'any-exchange' matcher\");\n } else {\n serverMatcher = matcher;\n }\n let manager: DefaultAuthorizationManager<{ exchange: WebExchange }>;\n if (access.access === 'permit-all') {\n manager = new DefaultAuthorizationManager(async () => new AuthorizationDecision(true));\n } else if (access.access === 'deny-all') {\n manager = new DefaultAuthorizationManager(async () => new AuthorizationDecision(false));\n } else if (access.access === 'authenticated') {\n manager = new DefaultAuthorizationManager(async (p: Promise<Authentication | undefined>) => {\n const authentication = await p;\n if (authentication !== undefined) {\n return new AuthorizationDecision(authentication.authenticated);\n }\n return new AuthorizationDecision(false);\n });\n } else {\n throw new Error(`Unknown access type: ${JSON.stringify(access)}`);\n }\n mappings.push([serverMatcher, manager]);\n }\n return delegatingAuthorizationManager({mappings});\n }\n const manager = buildAuthorizationManager(config.authorize);\n const filter = authorizationFilter({manager, storage});\n filter[filterOrderSymbol] = filterOrder.authorization;\n middleware.push(filter);\n\n }\n\n middleware.sort((a, b) => {\n const aOrder = a[filterOrderSymbol] ?? filterOrder.last;\n const bOrder = b[filterOrderSymbol] ?? filterOrder.last;\n return aOrder - bOrder;\n });\n }\n }\n\n\n const security = new ServerHttpSecurity();\n security.build();\n\n\n return middleware;\n};\n", "import {Authentication, WebExchange} from \"../types.ts\";\nimport {\n AccessDeniedError,\n AuthenticationError,\n InsufficientAuthenticationError,\n ServerAuthenticationEntryPoint\n} from \"./types.ts\";\nimport {httpBasicEntryPoint} from \"./http-basic-entry-point.ts\";\n\nasync function commenceAuthentication(exchange: WebExchange, authentication: Authentication | undefined, entryPoint: ServerAuthenticationEntryPoint) {\n const cause = new InsufficientAuthenticationError(`Full authentication is required to access this resource.`);\n const e: AuthenticationError = new AuthenticationError(\"Access Denied\", {cause});\n if (authentication) {\n e.authentication = authentication;\n }\n await entryPoint(exchange, e);\n}\nexport function httpStatusAccessDeniedHandler(status: number, message: string) {\n return async (exchange: WebExchange, _error: AccessDeniedError) => {\n exchange.response.statusCode = status;\n exchange.response.statusMessage = message;\n exchange.response.headers.set(\"Content-Type\", \"text/plain\");\n const bytes = Buffer.from(\"Access Denied\", \"utf-8\");\n exchange.response.headers.set('Content-Length', bytes.length);\n await exchange.response.end(bytes);\n };\n}\n\nexport const errorFilter = (opts: {\n authenticationEntryPoint?: ServerAuthenticationEntryPoint\n}) => {\n const accessDeniedHandler = httpStatusAccessDeniedHandler(403, \"Forbidden\");\n const authenticationEntryPoint = opts.authenticationEntryPoint ?? httpBasicEntryPoint();\n return async (exchange: WebExchange, next: () => Promise<void>) => {\n try {\n await next();\n } catch (error) {\n if (error instanceof AccessDeniedError) {\n const principal = await exchange.principal;\n if (principal === undefined) {\n await commenceAuthentication(exchange, undefined, authenticationEntryPoint);\n } else {\n if (!principal.authenticated) {\n return accessDeniedHandler(exchange, error);\n }\n await commenceAuthentication(exchange, principal, authenticationEntryPoint);\n }\n }\n }\n };\n}\n", "import {WebExchange} from \"../types.ts\";\nimport {AccessDeniedError, AuthorizationManager} from \"./types.ts\";\nimport {AsyncStorageSecurityContextHolder, SecurityContext} from \"./security-context.ts\";\nimport {AsyncLocalStorage} from \"node:async_hooks\";\n\nexport default function authorizationFilter(opts: {\n storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }>,\n manager: AuthorizationManager<WebExchange>\n}) {\n const {manager, storage} = opts;\n return async (exchange: WebExchange, next: () => Promise<void>) => {\n const promise = AsyncStorageSecurityContextHolder.getContext(storage)\n .then(c => c?.authentication);\n try {\n await manager.verify(promise, exchange);\n // successful authorization, continue processing\n } catch (error) {\n if (error instanceof AccessDeniedError) {\n // authorization failed, set response status and end exchange\n }\n throw error;\n }\n await next();\n };\n}\n", "import {ServerWebExchangeMatcherEntry} from \"../util/matchers.ts\";\nimport {Authentication, WebExchange} from \"../types.ts\";\nimport {AuthorizationDecision, DefaultAuthorizationManager} from \"./types.ts\";\n\nexport default function delegatingAuthorizationManager(opts: {mappings: Array<ServerWebExchangeMatcherEntry<DefaultAuthorizationManager<{ exchange: WebExchange }>>>}) {\n const check = async (authentication: Promise<Authentication | undefined>, exchange: WebExchange): Promise<AuthorizationDecision> => {\n let decision: AuthorizationDecision;\n for (const [matcher, manager] of opts.mappings) {\n if ((await matcher(exchange))?.match) {\n const checkResult = await manager.check(authentication, {exchange});\n if (checkResult !== undefined) {\n decision = checkResult;\n break;\n }\n }\n }\n decision ??= new AuthorizationDecision(false);\n return decision;\n\n }\n return new DefaultAuthorizationManager(check);\n}\n", "import * as GatewayServer from './server.js';\nexport {GatewayServer};\nexport default GatewayServer.Factory;\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import {WebSocketServer} from 'ws';\nimport http from 'node:http';\nimport https from 'node:https';\nimport {SecureContextOptions} from 'node:tls';\nimport type {AddressInfo, Socket} 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';\nimport serverHeader from './server/server-header.ts';\nimport security from './server/security/config.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(storage: AsyncLocalStorage<{}>,\n middleware: Middleware<HttpServerRequest, HttpServerResponse>,\n routes: Map<string, RouteInfo>,\n onSocketError: (err: Error) => void): RequestHandler {\n\n const listener = compose<WebExchange<HttpServerRequest, HttpServerResponse>>(\n serverHeader(),\n ...security({\n authorize: [\n [async (exchange) => {\n return {match: exchange.path === '/health' && exchange.method === 'GET'};\n }, {access: 'permit-all'}],\n // ['any-exchange', {access: 'authenticated'}],\n ['any-exchange', {access: 'permit-all'}],\n ],\n basic: {\n disabled: true,\n realm: 'Gateway Server',\n },\n jwt: {\n disabled: true,\n }\n }, storage),\n ...cors({\n origins: {allow: [/http:\\/\\/localhost(:\\d+)?/, /file:\\//]},\n methods: {allow: ['GET', 'HEAD', 'POST', 'DELETE']},\n headers: {allow: '*'},\n credentials: {allow: true}\n }),\n ...middleware,\n async ({request, response}, next) => {\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 if (route) {\n if (request.method === 'GET'\n && request._req['upgrade'] // set by node http parser\n && (request.headers.one('upgrade')?.toLowerCase() === 'websocket')) {\n\n const socket = request.socket;\n const host = request.host;\n const info = socketKey(request._req.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(request._req, socket, request._req['_upgradeHead'], (ws) => {\n response._res['_header'] = true; // prevent response from being sent\n ws.on('pong', () => ws['connected'] = true);\n ws.on('ping', () => {\n });\n wss.emit('connection', ws, request._req);\n });\n } else {\n logger.warn(`${info} rejected upgrade request from ${host} on ${path}`);\n socket.destroy();\n }\n\n }\n else {\n if (logger.enabledFor('debug')) {\n logger.debug(`rejecting request for ${path} with method ${request.method} from ${request.socket.remoteAddress}:${request.socket.remotePort} with headers: ${JSON.stringify(request._req.rawHeaders)}`);\n }\n response.statusCode = 426;\n response._res\n .appendHeader('Upgrade', 'websocket')\n .appendHeader('Connection', 'Upgrade')\n .appendHeader('Content-Type', 'text/plain');\n await response.end(`This service [${request.path}] requires use of the websocket protocol.`);\n }\n } else {\n await next();\n }\n },\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 await response.end(`io.Gateway Server`);\n } else {\n await next();\n }\n },\n async ({request, response}, _next) => {\n response.statusCode = 404;\n await response.end(http.STATUS_CODES[404]);\n }\n );\n\n return (request: http.IncomingMessage, response: http.ServerResponse) => {\n request.socket.addListener('error', onSocketError);\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 try {\n return await listener(exchange);\n } catch (e) {\n if (logger.enabledFor('warn')) {\n logger.warn(`error processing request for ${exchange.path}`, e);\n }\n }\n finally {\n await exchange.response.end();\n }\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, storage: AsyncLocalStorage<{ }> }) => 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 storage = new AsyncLocalStorage<{}>();\n const serverP: Promise<http.Server> = new Promise((resolve, reject) => {\n const onSocketError = (err: Error) => logger.error(`socket error: ${err}`, err);\n const listener = createListener(storage, middleware, routes, onSocketError);\n const server = createServer({}, listener);\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, storage});\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 (req as any)._upgradeHead = head;\n const res = new http.ServerResponse(req);\n res.assignSocket(socket as Socket);\n listener(req, res);\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 abstract readonly principal: Promise<Authentication | undefined>;\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 HttpCookie = {\n name: string,\n value: string\n}\n\nexport type ResponseCookie = HttpCookie & {\n maxAge: number,\n domain?: string,\n path?: string,\n secure?: boolean,\n httpOnly?: boolean,\n sameSite?: 'strict' | 'lax' | 'none'\n}\n\nexport type ServerHttpRequest = HttpRequest<ReadonlyHttpHeaders> & {\n\n readonly cookies: HttpCookie[]\n readonly formData: Promise<URLSearchParams>\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 statusMessage?: string\n\n readonly cookies: ResponseCookie[]\n addCookie(cookie: ResponseCookie): this\n end(chunk?: unknown): Promise<boolean>\n}\n\nexport interface Authentication {\n type: string;\n authenticated: boolean;\n readonly name?: string;\n}\n", "import {\n type HeaderValue,\n type HeaderValues,\n type HttpCookie,\n type HttpRequest,\n type HttpResponse,\n type MutableHttpHeaders,\n type ReadonlyHttpHeaders,\n type ResponseCookie,\n type ServerHttpRequest,\n type ServerHttpResponse,\n WebExchange\n} from './types.js';\nimport http from 'node:http';\nimport http2 from 'node:http2';\nimport {Cookie} from 'tough-cookie';\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 host ??= request.headers.one('host');\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\nfunction parseCookies(request: ServerHttpRequest): HttpCookie[] {\n return request.headers.list('cookie')\n .map(s => s.split(';').map((cs) => Cookie.parse(cs)))\n .flat(1)\n .filter((tc) => tc !== undefined)\n .map((tc) => {\n const result: HttpCookie = {name: tc.key, value: tc.value};\n return result;\n });\n}\n\nexport class HttpServerRequest implements ServerHttpRequest {\n private _body: Promise<Blob> | undefined;\n private _url: URL | undefined;\n private _cookies: HttpCookie[] | undefined;\n private readonly _headers: ReadonlyHttpHeaders;\n readonly _req: http.IncomingMessage;\n constructor(req: http.IncomingMessage) {\n this._req = req;\n this._headers = new IncomingMessageHeaders(this._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\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 dh ??= this._req?.socket.remoteAddress;\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 dp ??= this._req?.socket['encrypted'] ? 'https' : 'http';\n return requestToProtocol(this, dp);\n }\n\n get socket() {\n return this._req.socket;\n }\n\n get cookies(): HttpCookie[] {\n this._cookies ??= parseCookies(this);\n return this._cookies;\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 formData() {\n return this.body.then(async (blob) => {\n const text = await blob.text();\n const formData = new URLSearchParams(text);\n return formData;\n });\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 private readonly _msg: http.OutgoingMessage;\n constructor(msg: http.OutgoingMessage) {\n this._msg = msg;\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 readonly _res: http.ServerResponse;\n constructor(res: http.ServerResponse) {\n this._res = res;\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 set statusMessage(value: string) {\n this._res.statusMessage = value;\n }\n\n get headers() {\n return this._headers;\n }\n\n get cookies(): ResponseCookie[] {\n return this.headers.list('set-cookie').map((cookie) => {\n const parsed = Cookie.parse(cookie);\n if (parsed) {\n const result: ResponseCookie = {name: parsed.key, value: parsed.value, maxAge: Number(parsed.maxAge ?? -1)};\n if (parsed.httpOnly) result.httpOnly = true;\n if (parsed.domain) result.domain = parsed.domain;\n if (parsed.path) result.path = parsed.path;\n if (parsed.secure) result.secure = true;\n if (parsed.httpOnly) result.httpOnly = true;\n if (parsed.sameSite) result.sameSite = parsed.sameSite as 'strict' | 'lax' | 'none';\n return result;\n }\n }).filter((cookie): cookie is ResponseCookie => cookie !== undefined);\n }\n\n end(chunk?: unknown): Promise<boolean> {\n if (!this._res.headersSent) {\n return new Promise<boolean>((resolve, reject) => {\n if (chunk === undefined) {\n this._res.end(() => {\n resolve(true);\n });\n } else {\n this._res.end(chunk, () => {\n resolve(true);\n });\n }\n });\n\n }\n else {\n return Promise.resolve(false); // already ended\n }\n }\n\n addCookie(cookie: ResponseCookie): this {\n this.headers.add('set-cookie', new Cookie({\n key: cookie.name,\n value: cookie.value,\n maxAge: cookie.maxAge,\n domain: cookie.domain,\n path: cookie.path,\n secure: cookie.secure,\n httpOnly: cookie.httpOnly,\n sameSite: cookie.sameSite\n }).toString());\n return this;\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 get principal() {\n return Promise.resolve(undefined);\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 readonly _url: URL;\n private _body?: Blob;\n readonly headers = new MapHttpHeaders();\n\n constructor(url: URL, method?: string) {\n this._url = url;\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 cookies(): HttpCookie[] {\n return parseCookies(this);\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 if (!this.headers.has('content-type')) {\n this.headers.set('content-type', value.type || 'application/octet-stream');\n }\n }\n\n get formData(): Promise<URLSearchParams> {\n return this.body.then(async (b) => new URLSearchParams(await b.text()));\n }\n\n get URL() {\n return new URL(this.path + this._url.search, `${this.protocol}://${this.host}`);\n }\n}\n\nexport class MockHttpResponse implements HttpResponse<MutableHttpHeaders> {\n statusCode!: number;\n headers = new MapHttpHeaders();\n cookies: ResponseCookie[] = [];\n addCookie(cookie: ResponseCookie): this {\n this.cookies.push(cookie);\n return this;\n }\n\n private _body?: Blob;\n async end(chunk?: unknown): Promise<boolean> {\n if (this._body) {\n return false; // already ended\n }\n switch (typeof chunk) {\n case 'string':\n this._body = new Blob([chunk], {type: 'text/plain'});\n break;\n case 'object':\n if (chunk instanceof Blob) {\n this._body = chunk;\n } else if (chunk !== null) {\n this._body = new Blob([JSON.stringify(chunk)], {type: 'application/json'});\n }\n break;\n case 'undefined':\n this._body = new Blob([]);\n break;\n default:\n throw new Error(`Unsupported chunk type: ${typeof chunk}`);\n }\n return true;\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;\nimport {AsyncLocalStorage} from 'node:async_hooks';\nimport {SecurityContext} from \"../../server/security/security-context.ts\";\n\nconst log = getLogger('ws');\nconst codec = GatewayEncoders.json<IOGateway.Message>();\n\nfunction initClient(this: IOGateway.Gateway, key: string, socket: ws.WebSocket, host?: string,\n securityContextPromise?: Promise<SecurityContext>): IOGateway.GatewayClient<string> | undefined {\n const opts = {\n key,\n host,\n codec,\n onAuthenticate: async (): Promise<IOGateway.Auth.AuthenticationSuccess> => {\n const authentication = (await securityContextPromise)?.authentication;\n if (authentication?.authenticated) {\n return {type: 'success', user: authentication.name};\n }\n throw new Error(`no valid client authentication ${key}`);\n },\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, storage?: AsyncLocalStorage<{securityContext?: Promise<SecurityContext>}>}): 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 securityContextPromise = server.storage?.getStore()?.securityContext;\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, host, securityContextPromise);\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 value = ctx.request.cookies.find(cookie => cookie.name === COOKIE_NAME)?.value;\n return value && (parseInt(value) > 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.addCookie({name: COOKIE_NAME, value: `${expires}`, maxAge: Infinity, 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", "type MiddlewareFunction<T> = ((ctx: T, next: () => Promise<void>) => Promise<void>) | ((ctx: T) => Promise<void>);\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 {MiddlewareFunction}\n */\nexport function compose<T>(...middleware: MiddlewareFunction<T>[]): (ctx: T) => Promise<void> {\n if (!Array.isArray(middleware)) {\n throw new Error('middleware must be array!');\n }\n const fns = middleware.flat();\n for (const fn of fns) {\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 const dispatch = async (i: number): Promise<void> => {\n const fn = i === fns.length ? next : fns[i];\n if (fn === undefined) {\n return;\n }\n let nextCalled = false;\n let nextResolved = false;\n const nextFn = async () => {\n if (nextCalled) {\n throw new Error('next() called multiple times');\n }\n nextCalled = true;\n try {\n return await dispatch(i + 1);\n }\n finally {\n nextResolved = true;\n }\n };\n const result = await fn(ctx, nextFn);\n if (nextCalled && !nextResolved) {\n throw new Error('middleware resolved before downstream.\\n\\t You are probably missing an await or return statement in your middleware function.');\n }\n return result;\n }\n\n return dispatch(0);\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 await ctx.response.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", "import type {WebExchange} from './types';\n\nconst serverHeader = (server: string) => {\n return async ({response}: WebExchange, next: () => Promise<void>) => {\n if (!response.headers.has('server')) {\n response.headers.set('Server', server);\n }\n await next();\n }\n};\n\nexport default (server = 'gateway-server') => serverHeader(server);\n", "import {WebExchange} from \"../types.ts\";\nimport {MapHttpHeaders} from \"../exchange.ts\";\n\ntype ServerHttpHeadersWriter = (exchange: WebExchange) => Promise<void>;\n\nconst staticServerHttpHeadersWriter = (headers: MapHttpHeaders): ServerHttpHeadersWriter => {\n return async (exchange: WebExchange) => {\n let containsNoHeaders = true;\n const {response} = exchange;\n for (const name of headers.keys()) {\n if (response.headers.has(name)) {\n containsNoHeaders = false;\n }\n }\n if (containsNoHeaders) {\n for (const [name, value] of headers) {\n response.headers.set(name, value);\n }\n }\n }\n}\n\nconst cacheControlServerHttpHeadersWriter = () => staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('cache-control', 'no-cache, no-store, max-age=0, must-revalidate')\n .add('pragma', 'no-cache')\n .add('expires', '0'));\n\nconst contentTypeServerHttpHeadersWriter = () => staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('x-content-type-options', 'nosniff'));\n\nconst strictTransportSecurityServerHttpHeadersWriter = (maxAgeInSeconds: number, includeSubDomains: boolean, preload: boolean) => {\n let headerValue = `max-age=${maxAgeInSeconds}`;\n if (includeSubDomains) {\n headerValue += ' ; includeSubDomains';\n }\n if (preload) {\n headerValue += ' ; preload';\n }\n const delegate = staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('strict-transport-security', headerValue))\n\n const isSecure = (exchange: WebExchange) => {\n const protocol = exchange.request.URL.protocol;\n return protocol === 'https:';\n }\n\n return async (exchange: WebExchange) => {\n if (isSecure(exchange)) {\n await delegate(exchange);\n }\n }\n};\n\ntype FrameOptionsMode = 'DENY' | 'SAMEORIGIN';\nconst frameOptionsServerHttpHeadersWriter = (mode: FrameOptionsMode) => {\n return staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('x-frame-options', mode))\n};\n\ntype XssProtectionHeaderValue = '0' | '1' | '1; mode=block';\nconst xssProtectionServerHttpHeadersWriter = (headerValue: XssProtectionHeaderValue) => staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('x-xss-protection', headerValue));\n\n\nconst permissionsPolicyServerHttpHeadersWriter = (policyDirectives?: string) => {\n\n const delegate = policyDirectives === undefined ? undefined : staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('permissions-policy', policyDirectives));\n return async (exchange: WebExchange) => {\n if (delegate !== undefined) {\n await delegate(exchange);\n }\n }\n}\nconst contentSecurityPolicyServerHttpHeadersWriter = (policyDirectives?: string, reportOnly?: boolean) => {\n const headerName = reportOnly ? 'content-security-policy-report-only' : 'content-security-policy';\n const delegate = policyDirectives === undefined ? undefined : staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add(headerName, policyDirectives));\n return async (exchange: WebExchange) => {\n if (delegate !== undefined) {\n await delegate(exchange);\n }\n }\n};\n\ntype ReferrerPolicy =\n 'no-referrer'\n | 'no-referrer-when-downgrade'\n | 'origin'\n | 'origin-when-cross-origin'\n | 'same-origin'\n | 'strict-origin'\n | 'strict-origin-when-cross-origin'\n | 'unsafe-url';\nconst refererPolicyServerHttpHeadersWriter = (policy: ReferrerPolicy = 'no-referrer') => {\n return staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('referer-policy', policy));\n}\n\ntype CrossOriginOpenerPolicy = 'unsafe-none' | 'same-origin' | 'same-origin-allow-popups';\nconst crossOriginOpenerPolicyServerHttpHeadersWriter = (policy?: CrossOriginOpenerPolicy) => {\n const delegate = policy === undefined ? undefined : staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('cross-origin-opener-policy', policy));\n return async (exchange: WebExchange) => {\n if (delegate !== undefined) {\n await delegate(exchange);\n }\n }\n}\n\ntype CrossOriginEmbedderPolicy = 'unsafe-none' | 'require-corp';\nconst crossOriginEmbedderPolicyServerHttpHeadersWriter = (policy?: CrossOriginEmbedderPolicy) => {\n const delegate = policy === undefined ? undefined : staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('cross-origin-embedder-policy', policy));\n return async (exchange: WebExchange) => {\n if (delegate !== undefined) {\n await delegate(exchange);\n }\n }\n}\n\ntype CrossOriginResourcePolicy = 'same-origin' | 'same-site' | 'cross-origin';\nconst crossOriginResourcePolicyServerHttpHeadersWriter = (policy?: CrossOriginResourcePolicy) => {\n const delegate = policy === undefined ? undefined : staticServerHttpHeadersWriter(\n new MapHttpHeaders()\n .add('cross-origin-resource-policy', policy));\n return async (exchange: WebExchange) => {\n if (delegate !== undefined) {\n await delegate(exchange);\n }\n }\n}\n\nconst compositeServerHttpHeadersWriter = (\n ...writers: ServerHttpHeadersWriter[]\n): ServerHttpHeadersWriter => {\n return async (exchange: WebExchange) => {\n for (const writer of writers) {\n await writer(exchange);\n }\n }\n}\n\nexport default function headers(opts?: {\n cache?: { disabled?: boolean }\n contentType?: { disabled?: boolean },\n frameOptions?: { disabled?: boolean, mode?: FrameOptionsMode },\n hsts?: { disabled?: boolean, maxAge?: number, includeSubDomains?: boolean, preload?: boolean },\n xss?: { disabled?: boolean, headerValue?: XssProtectionHeaderValue },\n permissionsPolicy?: { disabled?: boolean, policyDirectives?: string },\n contentSecurityPolicy?: { disabled?: boolean, policyDirectives?: string, reportOnly?: boolean },\n refererPolicy?: { disabled?: boolean, policy?: ReferrerPolicy },\n crossOriginOpenerPolicy?: { disabled?: boolean, policy?: CrossOriginOpenerPolicy },\n crossOriginEmbedderPolicy?: { disabled?: boolean, policy?: CrossOriginEmbedderPolicy },\n crossOriginResourcePolicy?: { disabled?: boolean, policy?: CrossOriginResourcePolicy }\n writers?: ServerHttpHeadersWriter[]\n}) {\n const writers: ServerHttpHeadersWriter[] = [];\n if (!opts?.cache?.disabled) {\n writers.push(cacheControlServerHttpHeadersWriter());\n }\n if (!opts?.contentType?.disabled) {\n writers.push(contentTypeServerHttpHeadersWriter());\n }\n if (!opts?.hsts?.disabled) {\n writers.push(strictTransportSecurityServerHttpHeadersWriter(opts?.hsts?.maxAge ?? 365 * 24 * 60 * 60, opts?.hsts?.includeSubDomains ?? true, opts?.hsts?.preload ?? false));\n }\n if (!opts?.frameOptions?.disabled) {\n writers.push(frameOptionsServerHttpHeadersWriter(opts?.frameOptions?.mode ?? 'DENY'));\n }\n if (!opts?.xss?.disabled) {\n writers.push(xssProtectionServerHttpHeadersWriter(opts?.xss?.headerValue ?? '0'));\n }\n if (!opts?.permissionsPolicy?.disabled) {\n writers.push(permissionsPolicyServerHttpHeadersWriter(opts?.permissionsPolicy?.policyDirectives));\n }\n if (!opts?.contentSecurityPolicy?.disabled) {\n writers.push(contentSecurityPolicyServerHttpHeadersWriter(opts?.contentSecurityPolicy?.policyDirectives ?? \"default-src 'self'\", opts?.contentSecurityPolicy?.reportOnly));\n }\n if (!opts?.refererPolicy?.disabled) {\n writers.push(refererPolicyServerHttpHeadersWriter(opts?.refererPolicy?.policy ?? 'no-referrer'));\n }\n if (!opts?.crossOriginOpenerPolicy?.disabled) {\n writers.push(crossOriginOpenerPolicyServerHttpHeadersWriter(opts?.crossOriginOpenerPolicy?.policy));\n }\n if (!opts?.crossOriginEmbedderPolicy?.disabled) {\n writers.push(crossOriginEmbedderPolicyServerHttpHeadersWriter(opts?.crossOriginEmbedderPolicy?.policy));\n }\n if (!opts?.crossOriginResourcePolicy?.disabled) {\n writers.push(crossOriginResourcePolicyServerHttpHeadersWriter(opts?.crossOriginResourcePolicy?.policy));\n }\n if (opts?.writers) {\n writers.push(...opts.writers);\n }\n const writer = compositeServerHttpHeadersWriter(...writers);\n\n return async (exchange: WebExchange, next: () => Promise<void>) => {\n await writer(exchange);\n await next();\n }\n}\n", "import type {Authentication, WebExchange} from '../types';\n\nexport type AuthenticationConverter = (exchange: WebExchange) => Promise<Authentication | undefined>;\n\nexport class AuthenticationError extends Error {\n private _authentication?: Authentication;\n\n get authentication(): Authentication | undefined {\n return this._authentication;\n }\n\n set authentication(value: Authentication) {\n if (value === undefined) {\n throw new TypeError(\"Authentication cannot be undefined\");\n }\n this._authentication = value;\n }\n}\n\nexport class InsufficientAuthenticationError extends AuthenticationError {}\n\nexport class BadCredentialsError extends AuthenticationError {}\n\nexport class AuthenticationCredentialsNotFoundError extends AuthenticationError {}\n\nexport class AccessDeniedError extends Error {}\n\nexport type AuthenticationManager = (authentication: Authentication) => Promise<Authentication | undefined>;\n\nexport type AuthorizationManager<T> = {\n\n /**\n * Determines if access should be granted to the given object for the provided authentication.\n * @param authentication\n * @param object\n */\n verify(authentication: Promise<Authentication | undefined>, object: T): Promise<void>,\n /**\n * Checks if the authentication is authorized to access the given object.\n * @param authentication\n * @param object\n */\n authorize: (authentication: Promise<Authentication | undefined>, object: T) => Promise<AuthorizationResult | undefined>;\n}\nexport interface AuthorizationResult {readonly granted: boolean;}\nexport class AuthorizationDecision implements AuthorizationResult {\n constructor(granted: boolean) {\n this.granted = granted;\n }\n\n readonly granted: boolean;\n}\nexport class DefaultAuthorizationManager<T> implements AuthorizationManager<T> {\n readonly check: (authentication: Promise<Authentication | undefined>, object: T) => Promise<AuthorizationDecision | undefined>;\n constructor(check: (authentication: Promise<Authentication | undefined>, object: T) => Promise<AuthorizationDecision>) {\n this.check = check;\n }\n\n async verify(authentication: Promise<Authentication | undefined>, object: T): Promise<void> {\n const decision = await this.check(authentication, object);\n if (!decision?.granted) {\n throw new AccessDeniedError(\"Access denied\");\n }\n }\n\n async authorize(authentication: Promise<Authentication | undefined>, object: T) {\n return await this.check(authentication, object);\n }\n}\n\nexport class AuthenticationServiceError extends AuthenticationError {}\nexport type ServerAuthenticationSuccessHandler = (filterExchange: {exchange: WebExchange, next: () => Promise<void>}, authentication: Authentication) => Promise<void>;\nexport type ServerAuthenticationFailureHandler = (filterExchange: {exchange: WebExchange, next: () => Promise<void>}, error: AuthenticationError) => Promise<void>;\nexport type ServerAuthenticationEntryPoint = (exchange: WebExchange, error: AuthenticationError) => Promise<void>;\nexport type ServerAccessDeniedHandler = (exchange: WebExchange, error: AccessDeniedError) => Promise<void>;\n", "import {\n AuthenticationServiceError,\n ServerAuthenticationEntryPoint,\n ServerAuthenticationFailureHandler\n} from './types.ts';\n\nexport const serverAuthenticationEntryPointFailureHandler = (opts: {\n entryPoint: ServerAuthenticationEntryPoint,\n rethrowAuthenticationServiceError?: boolean\n}): ServerAuthenticationFailureHandler => {\n const entryPoint = opts.entryPoint;\n const rethrowAuthenticationServiceError = opts?.rethrowAuthenticationServiceError ?? true;\n return async ({exchange}, error) => {\n if (!rethrowAuthenticationServiceError) {\n return entryPoint(exchange, error);\n }\n if (!(error instanceof AuthenticationServiceError)) {\n return entryPoint(exchange, error);\n }\n throw error;\n\n };\n\n\n}\n", "import {ServerAuthenticationEntryPoint} from \"./types.ts\";\n\nconst DEFAULT_REALM = \"Realm\";\nconst createHeaderValue = (realm: string): string => {\n return `Basic realm=\"${realm}\"`;\n}\n\nexport const httpBasicEntryPoint = (opts?: { realm?: string }): ServerAuthenticationEntryPoint => {\n const headerValue = createHeaderValue(opts?.realm ?? DEFAULT_REALM);\n return async (exchange, _error) => {\n const {response} = exchange;\n response.statusCode = 401 /*Unauthorized*/;\n response.headers.set(\"WWW-Authenticate\", headerValue);\n };\n}\n", "import {AuthenticationConverter} from \"./types.ts\";\n\nconst BASIC = 'Basic ';\n\nexport const httpBasicAuthenticationConverter = (opts?: {credentialsEncoding?: BufferEncoding}): AuthenticationConverter => {\n return async (exchange) => {\n const {request} = exchange;\n const authorization = request.headers.one(\"authorization\");\n if (!authorization || !(/basic/i).test(authorization.substring(0,))) {\n return;\n }\n const credentials = authorization.length <= BASIC.length ? '' : authorization.substring(BASIC.length);\n const decoded = Buffer.from(credentials, 'base64').toString(opts?.credentialsEncoding ?? 'utf-8');\n const parts = decoded.split(\":\", 2);\n if (parts.length !== 2) {\n return undefined;\n }\n return {type: 'UsernamePassword', authenticated: false, principal: parts[0], credentials: parts[1]};\n }\n\n}\n", "import {WebExchange} from \"../types.ts\";\n\nexport type MatchResult = Readonly<{ match: boolean }>;\n\nexport interface ServerWebExchangeMatcher {\n /**\n * Matches the given exchange against the matcher.\n * @param exchange The web exchange to match.\n * @returns A promise that resolves to true if the exchange matches, false otherwise.\n */\n (exchange: WebExchange): Promise<MatchResult>;\n\n /**\n * Returns a string representation of the matcher.\n * @returns A string representation of the matcher.\n */\n toString(): string;\n}\n\nexport type ServerWebExchangeMatcherEntry<T> = Readonly<[ServerWebExchangeMatcher, T]>\n\nexport const or: (matchers: ServerWebExchangeMatcher[]) => ServerWebExchangeMatcher = (matchers: ServerWebExchangeMatcher[]): ServerWebExchangeMatcher => {\n return async (exchange: WebExchange): Promise<MatchResult> => {\n for (const matcher of matchers) {\n const result = await matcher(exchange);\n if (result.match) {\n return {match: true};\n }\n }\n return {match: false};\n };\n}\n\nexport const and: (matchers: ServerWebExchangeMatcher[]) => ServerWebExchangeMatcher = (matchers: ServerWebExchangeMatcher[]) => {\n return async (exchange: WebExchange): Promise<MatchResult> => {\n for (const matcher of matchers) {\n const result = await matcher(exchange);\n if (!result.match) {\n return {match: false};\n }\n }\n return {match: true};\n };\n}\n\nexport const not: (matcher: ServerWebExchangeMatcher) => ServerWebExchangeMatcher = (matcher: ServerWebExchangeMatcher): ServerWebExchangeMatcher => {\n return async (exchange: WebExchange): Promise<{ match: boolean }> => {\n const result = await matcher(exchange);\n return {match: !result.match};\n };\n}\n\nexport const anyExchange: ServerWebExchangeMatcher = async (_exchange: WebExchange): Promise<{ match: boolean }> => {\n return {match: true};\n}\n\nexport const mediaType : ((opts: {mediaTypes: string[], ignoredMediaTypes?: string[], useEquality?: boolean}) => ServerWebExchangeMatcher) = (opts): ServerWebExchangeMatcher => {\n\n const shouldIgnore = (requestedMediaType: string): boolean => {\n if (opts.ignoredMediaTypes !== undefined) {\n for (const ignoredMediaType of opts.ignoredMediaTypes) {\n if (requestedMediaType === ignoredMediaType || ignoredMediaType === '*/*') {\n return true;\n }\n }\n }\n return false;\n }\n\n return async (exchange: WebExchange): Promise<MatchResult> => {\n const request = exchange.request;\n let requestMediaTypes: string[];\n try {\n requestMediaTypes = request.headers.list('accept');\n }\n catch (e) {\n return {match: false};\n }\n for (const requestedMediaType of requestMediaTypes) {\n if (shouldIgnore(requestedMediaType)) {\n continue;\n }\n for (const mediaType of opts.mediaTypes) {\n if (requestedMediaType.startsWith(mediaType)) {\n return {match: true};\n }\n }\n }\n\n return {match: false};\n };\n}\n", "import {AsyncLocalStorage} from 'node:async_hooks';\nimport {Authentication} from \"../types.ts\";\n\nexport interface SecurityContext {\n authentication?: Authentication;\n}\n\nexport class AsyncStorageSecurityContextHolder {\n private static hasSecurityContext(storage: AsyncLocalStorage<{\n securityContext?: Promise<SecurityContext>\n }>): boolean {\n return storage.getStore()?.securityContext !== undefined;\n }\n\n private static async getSecurityContext(storage: AsyncLocalStorage<{\n securityContext?: Promise<SecurityContext>\n }>): Promise<SecurityContext | undefined> {\n return await storage.getStore()?.securityContext;\n }\n\n public static clearSecurityContext(storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }>) {\n delete storage.getStore()?.securityContext;\n }\n\n public static withSecurityContext(securityContext: Promise<SecurityContext>) {\n return (storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }> = new AsyncLocalStorage<{\n securityContext?: Promise<SecurityContext>\n }>()) => {\n storage.getStore()!.securityContext = securityContext;\n return storage;\n };\n }\n\n public static withAuthentication(authentication: Authentication) {\n return AsyncStorageSecurityContextHolder.withSecurityContext(Promise.resolve({authentication}));\n }\n\n public static async getContext(storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }>): Promise<SecurityContext | undefined> {\n if (AsyncStorageSecurityContextHolder.hasSecurityContext(storage)) {\n return AsyncStorageSecurityContextHolder.getSecurityContext(storage);\n }\n }\n}\n", "import {WebExchange, type Authentication} from \"../types.ts\";\nimport {\n AuthenticationConverter,\n AuthenticationError,\n AuthenticationManager,\n ServerAuthenticationFailureHandler, ServerAuthenticationSuccessHandler\n} from \"./types.ts\";\nimport {serverAuthenticationEntryPointFailureHandler} from \"./entry-point-failure-handler.ts\";\nimport {httpBasicEntryPoint} from \"./http-basic-entry-point.ts\";\nimport {httpBasicAuthenticationConverter} from './http-basic-converter.ts';\nimport {anyExchange, type ServerWebExchangeMatcher} from '../util/matchers.ts';\nimport {AsyncStorageSecurityContextHolder, type SecurityContext} from './security-context.ts';\nimport {AsyncLocalStorage} from 'node:async_hooks';\n\nasync function authenticate(exchange: WebExchange,\n next: () => Promise<void>,\n token: Authentication,\n managerResolver: (exchange: WebExchange) => Promise<AuthenticationManager | undefined>,\n successHandler: ServerAuthenticationSuccessHandler,\n storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }>): Promise<void> {\n const authManager = await managerResolver(exchange);\n const authentication = await authManager?.(token);\n if (authentication === undefined) {\n throw new Error(\"No authentication manager found for the exchange\");\n }\n try {\n await onAuthenticationSuccess(authentication, {exchange, next}, successHandler, storage);\n } catch (e) {\n if (e instanceof AuthenticationError) {\n // todo debug log\n }\n throw e;\n }\n}\n\nasync function onAuthenticationSuccess(authentication: Authentication,\n filterExchange: {exchange: WebExchange, next: () => Promise<void>},\n successHandler: ServerAuthenticationSuccessHandler,\n storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }>): Promise<void> {\n AsyncStorageSecurityContextHolder.withAuthentication(authentication)(storage);\n await successHandler(filterExchange, authentication);\n\n}\n\nexport type AuthenticationFilterOptions = {\n storage: AsyncLocalStorage<{securityContext?: Promise<SecurityContext>}>\n managerResolver?: (exchange: WebExchange) => Promise<AuthenticationManager | undefined>,\n manager?: AuthenticationManager,\n successHandler?: ServerAuthenticationSuccessHandler,\n // converter is a function that converts the exchange to an authentication object\n converter?: AuthenticationConverter,\n failureHandler?: ServerAuthenticationFailureHandler\n // matcher is a function that checks if the exchange must be authenticated\n matcher?: ServerWebExchangeMatcher,\n};\n\nexport default function authenticationFilter(opts: AuthenticationFilterOptions) {\n const auth = {\n matcher: anyExchange,\n successHandler: async({next}) => {\n await next();\n },\n converter: httpBasicAuthenticationConverter({}),\n failureHandler: serverAuthenticationEntryPointFailureHandler({entryPoint: httpBasicEntryPoint({})}),\n ...opts\n };\n let managerResolver = auth.managerResolver;\n if (managerResolver === undefined && auth.manager !== undefined) {\n const manager: AuthenticationManager = auth.manager;\n managerResolver = async (_exchange: WebExchange) => {\n return manager;\n };\n }\n if (managerResolver === undefined) {\n throw new Error(\"Authentication filter requires a managerResolver or a manager\");\n }\n return async (exchange: WebExchange, next: () => Promise<void>): Promise<void> => {\n const matchResult = await auth.matcher(exchange);\n const token = matchResult.match ? await auth.converter(exchange) : undefined;\n if (token === undefined) {\n await next();\n return;\n }\n\n try {\n await authenticate(exchange, next, token, managerResolver, auth.successHandler, auth.storage);\n\n } catch (error) {\n if (error instanceof AuthenticationError) {\n await auth.failureHandler({exchange, next}, error);\n return;\n }\n throw error; // Re-throw the error to be handled by the next middleware or error handler\n }\n };\n}\n", "export type OAuth2Error = {\n readonly errorCode: string\n readonly description?: string\n readonly uri?: string\n}\n\nexport type BearerTokenError = OAuth2Error & {\n readonly httpStatus: number\n readonly scope?: string\n}\n\nexport const BearerTokenErrorCodes = {\n invalid_request: \"invalid_request\",\n invalid_token: \"invalid_token\",\n}\n\nconst DEFAULT_URI = \"https://tools.ietf.org/html/rfc6750#section-3.1\";\n\nexport function invalidToken(message: string): BearerTokenError {\n return {errorCode: BearerTokenErrorCodes.invalid_token, httpStatus: 401 /*unauthorized*/, description: message, uri: DEFAULT_URI};\n}\n\nexport function invalidRequest(message: string): BearerTokenError {\n return {errorCode: BearerTokenErrorCodes.invalid_request, httpStatus: 400 /*bad request*/, description: message, uri: DEFAULT_URI};\n}\n", "import {Authentication, ReadonlyHttpHeaders, ServerHttpRequest, WebExchange} from \"../../types.ts\";\nimport {AuthenticationConverter, AuthenticationError} from \"../types.ts\";\nimport {invalidRequest, invalidToken, OAuth2Error} from \"./token-error.ts\";\n\nconst ACCESS_TOKEN_PARAMETER_NAME = 'access_token';\nconst authorizationPattern = /^Bearer\\s+(?<token>[a-zA-Z0-9-._~+/]+=*)$/i;\n\nexport class Oauth2AuthenticationError extends AuthenticationError {\n readonly error: OAuth2Error;\n\n constructor(error: string | OAuth2Error, message?: string, options?: ErrorOptions) {\n super(message ?? (typeof error === 'string' ? undefined : error.description), options);\n this.error = typeof error === 'string' ? {errorCode: error} : error;\n }\n}\n\nexport type BearerTokenAuthenticationToken = Authentication & {\n type: 'BearerToken';\n token: string;\n}\n\nexport const isBearerTokenAuthenticationToken = (authentication: Authentication): authentication is BearerTokenAuthenticationToken => {\n return authentication.type === 'BearerToken';\n}\n\nconst serverBearerTokenAuthenticationConverter = (opts?: {headerName?: string, uriQueryParameter?: boolean, formEncodedBodyParameter?: boolean }): AuthenticationConverter => {\n return async (exchange: WebExchange) => {\n const {request} = exchange;\n return Promise.all<string[] | undefined>([\n resolveFromAuthorizationHeader(request.headers, opts?.headerName).then((token?: string) => token !== undefined ? [token] : undefined),\n resolveFromQueryString(request, opts?.uriQueryParameter),\n resolveFromBody(exchange, opts?.formEncodedBodyParameter)\n ])\n .then(rs => rs.filter(r => r !== undefined).flat(1))\n .then(resolveToken)\n .then(token => {\n if (token) return {authenticated: false, type: 'BearerToken', token};\n });\n }\n}\n\nasync function resolveToken(accessTokens: string[]) {\n if (accessTokens.length === 0) {\n return;\n }\n if (accessTokens.length > 1) {\n const error = invalidRequest(\"Found multiple access tokens in the request\");\n throw new Oauth2AuthenticationError(error);\n }\n\n const accessToken = accessTokens[0];\n if (!accessToken || accessToken.length === 0) {\n const error = invalidRequest(\"The requested access token parameter is an empty string\");\n throw new Oauth2AuthenticationError(error);\n }\n return accessToken;\n}\n\nasync function resolveFromAuthorizationHeader(headers: ReadonlyHttpHeaders, headerName: string = 'authorization'): Promise<string | undefined> {\n const authorization = headers. one(headerName)\n if (!authorization || !(/bearer/i).test(authorization.substring(0,))) {\n return;\n }\n const match = authorizationPattern.exec(authorization);\n if (match === null) {\n const error = invalidToken(\"Bearer token is malformed\");\n throw new Oauth2AuthenticationError(error);\n }\n return match.groups?.token;\n}\n\nasync function resolveTokens(parameters: URLSearchParams): Promise<string[] | undefined> {\n const accessTokens = parameters.getAll(ACCESS_TOKEN_PARAMETER_NAME);\n if (accessTokens.length === 0) {\n return;\n }\n return accessTokens;\n}\n\nasync function resolveFromQueryString(request: ServerHttpRequest, allow = false): Promise<string[] | undefined> {\n if (!allow || request.method !== 'GET') {\n return;\n }\n return resolveTokens(request.URL.searchParams);\n}\n\nasync function resolveFromBody(exchange: WebExchange, allow = false): Promise<string[] | undefined> {\n const {request} = exchange;\n if (!allow\n || ('application/x-www-form-urlencoded' !== request.headers.one('content-type'))\n || request.method !== 'POST') {\n return;\n }\n return resolveTokens(await exchange.request.formData);\n}\n\nexport default serverBearerTokenAuthenticationConverter;\n", "import {AuthenticationError, ServerAuthenticationEntryPoint} from \"../types.ts\";\nimport {Oauth2AuthenticationError} from \"./token-converter.ts\";\nimport {BearerTokenError, OAuth2Error} from \"./token-error.ts\";\n\nfunction computeWWWAuthenticate(parameters: Map<string, string>) {\n let wwwAuthenticate = 'Bearer';\n if (parameters.size !== 0) {\n wwwAuthenticate += ' ';\n let i = 0;\n for (const [key, value] of parameters) {\n wwwAuthenticate += `${key}=\"${value}\"`;\n if (i !== parameters.size - 1) {\n wwwAuthenticate += ', ';\n }\n i++;\n }\n }\n return wwwAuthenticate;\n}\n\nconst isBearerTokenError = (error: OAuth2Error): error is BearerTokenError => {\n return (error as BearerTokenError).httpStatus !== undefined;\n}\n\nfunction getStatus(authError: AuthenticationError) {\n if (authError instanceof Oauth2AuthenticationError) {\n const {error} = authError;\n if (isBearerTokenError(error)) {\n return error.httpStatus;\n }\n }\n return 401 /*Unauthorized*/;\n}\n\nfunction createParameters(authError: AuthenticationError, realm?: string) {\n const parameters = new Map<string, string>();\n if (realm) {\n parameters.set('realm', realm);\n }\n if (authError instanceof Oauth2AuthenticationError) {\n const {error} = authError;\n parameters.set('error', error.errorCode);\n if (error.description) {\n parameters.set('error_description', error.description);\n }\n if (error.uri) {\n parameters.set('error_uri', error.uri);\n }\n if (isBearerTokenError(error) && error.scope) {\n parameters.set('scope', error.scope);\n }\n }\n return parameters;\n}\n\nconst bearerTokenServerAuthenticationEntryPoint = (opts?: { realmName?: string }): ServerAuthenticationEntryPoint => {\n return async (exchange, error) => {\n const status = getStatus(error);\n const parameters = createParameters(error, opts?.realmName)\n const wwwAuthenticate = computeWWWAuthenticate(parameters);\n const {response} = exchange;\n response.headers.set('WWW-Authenticate', wwwAuthenticate);\n response.statusCode = status;\n await response.end()\n };\n}\n\nexport default bearerTokenServerAuthenticationEntryPoint;\n", "import {AuthenticationManager, AuthenticationServiceError} from \"../types.ts\";\nimport {Authentication} from \"../../types.ts\";\nimport {invalidToken} from \"./token-error.ts\";\nimport {isBearerTokenAuthenticationToken, Oauth2AuthenticationError} from \"./token-converter.ts\";\n\nexport interface Jwt {\n readonly subject?: string\n\n getClaimAsString(claim: string): string | undefined\n}\n\nconst jwtAuthConverter = (opts?: { principalClaimName?: string}): (jwt: Jwt) => Authentication => {\n const principalClaimName = opts?.principalClaimName ?? 'sub';\n\n return (jwt: Jwt) => {\n const name = jwt.getClaimAsString(principalClaimName);\n return {type: 'JwtToken', authenticated: true, name};\n };\n}\n\nconst asyncJwtConverter = (converter: (jwt: Jwt) => Authentication): (jwt: Jwt) => Promise<Authentication> => {\n return async (jwt: Jwt) => {\n return converter(jwt);\n };\n};\n\nclass JwtError extends Error {}\nclass BadJwtError extends JwtError {}\n\n\nfunction onError(error: JwtError) {\n if (error instanceof BadJwtError) {\n return new Oauth2AuthenticationError(invalidToken(error.message), error.message, {cause: error});\n }\n throw new AuthenticationServiceError(error.message, {cause: error});\n\n}\n\nexport default function jwtAuthManager(opts: {\n decoder: (token: string) => Promise<Jwt>\n authConverter?: (jwt: Jwt) => Promise<Authentication>\n}): AuthenticationManager {\n const decoder = opts.decoder;\n const authConverter = opts.authConverter ?? asyncJwtConverter(jwtAuthConverter({}));\n return async (authentication) => {\n if (isBearerTokenAuthenticationToken(authentication)) {\n const token = authentication.token;\n try {\n const jwt = await decoder(token);\n return await authConverter(jwt);\n } catch (e) {\n if (e instanceof JwtError) {\n throw onError(e);\n }\n throw e;\n }\n }\n }\n}\n", "import {Authentication, type WebExchange} from \"../types.ts\";\nimport authenticationFilter from \"./authentication-filter.ts\";\nimport {\n AuthenticationConverter,\n AuthenticationManager,\n ServerAuthenticationEntryPoint,\n ServerAuthenticationFailureHandler\n} from \"./types.ts\";\nimport serverBearerTokenAuthenticationConverter from \"./oauth2/token-converter.ts\";\nimport {serverAuthenticationEntryPointFailureHandler} from \"./entry-point-failure-handler.ts\";\nimport bearerTokenServerAuthenticationEntryPoint from \"./oauth2/token-entry-point.ts\";\nimport jwtAuthManager, {Jwt} from \"./oauth2/jwt-auth-manager.ts\";\nimport {AsyncLocalStorage} from \"node:async_hooks\";\nimport type {SecurityContext} from \"./security-context.ts\";\n\nexport default function resourceServer(opts: {\n readonly storage: AsyncLocalStorage<{securityContext?: Promise<SecurityContext>}>,\n converter?: AuthenticationConverter,\n failureHandler?: ServerAuthenticationFailureHandler,\n entryPoint?: ServerAuthenticationEntryPoint,\n managerResolver?: (exchange: WebExchange) => Promise<AuthenticationManager | undefined>,\n jwt?: {\n manager?: AuthenticationManager,\n decoder: (token: string) => Promise<Jwt>,\n authConverter?: (jwt: Jwt) => Promise<Authentication>\n }\n}): (exchange: WebExchange, next: () => Promise<void>) => Promise<void> {\n const entryPoint = opts.entryPoint ?? bearerTokenServerAuthenticationEntryPoint({});\n const converter = opts?.converter ?? serverBearerTokenAuthenticationConverter({});\n const failureHandler = opts.failureHandler ?? serverAuthenticationEntryPointFailureHandler({entryPoint})\n if (opts.managerResolver!== undefined) {\n return authenticationFilter({\n storage: opts.storage,\n converter,\n failureHandler,\n managerResolver: opts.managerResolver,\n });\n }\n if (opts.jwt !== undefined) {\n\n const manager = opts.jwt.manager ?? jwtAuthManager(opts.jwt);\n return authenticationFilter({\n storage: opts.storage,\n converter,\n failureHandler,\n managerResolver: async (_exchange: WebExchange) => {\n return manager;\n },\n });\n }\n throw new Error(\"Invalid resource server configuration: either managerResolver or jwt must be provided\");\n}\n", "import type { AuthenticationError, ServerAuthenticationEntryPoint} from \"./types.ts\";\n\nexport const httpStatusEntryPoint = (opts: {\n httpStatus: { code: number, message?: string }\n}): ServerAuthenticationEntryPoint => {\n return async (exchange, _error: AuthenticationError) => {\n const response = exchange.response;\n response.statusCode = opts.httpStatus.code;\n response.statusMessage = opts.httpStatus.message;\n };\n}\n", "import {AuthenticationError, type ServerAuthenticationEntryPoint} from \"./types.ts\";\nimport {type WebExchange} from \"../types.ts\";\nimport {type ServerWebExchangeMatcher} from \"../util/matchers.ts\";\n\nexport const delegatingEntryPoint = (opts: {\n entryPoints: Array<[ServerWebExchangeMatcher, ServerAuthenticationEntryPoint]>;\n defaultEntryPoint: ServerAuthenticationEntryPoint;\n}): ServerAuthenticationEntryPoint => {\n const defaultEntryPoint = opts.defaultEntryPoint ?? (async ({response}, _error) => {\n response.statusCode = 401; // Unauthorized\n await response.end();\n });\n return async (exchange: WebExchange, error: AuthenticationError) => {\n for (const [matcher, entryPoint] of opts.entryPoints) {\n const match = await matcher(exchange);\n if (match.match) {\n return entryPoint(exchange, error);\n }\n }\n return defaultEntryPoint(exchange, error);\n };\n}\n", "import {ServerAuthenticationSuccessHandler} from \"./types.ts\";\nimport {Authentication} from \"../types.ts\";\n\nexport const delegatingSuccessHandler = (handlers: Array<ServerAuthenticationSuccessHandler>) => {\n\n return async ({exchange, next}, authentication: Authentication) => {\n for (const handler of handlers) {\n await handler({exchange, next}, authentication);\n }\n };\n}\n", "import {WebExchange} from \"../types.ts\";\nimport authenticationFilter from \"./authentication-filter.ts\";\nimport {serverAuthenticationEntryPointFailureHandler} from \"./entry-point-failure-handler.ts\";\nimport {\n AuthenticationManager,\n ServerAuthenticationEntryPoint,\n ServerAuthenticationFailureHandler,\n ServerAuthenticationSuccessHandler\n} from \"./types.ts\";\nimport {httpStatusEntryPoint} from \"./http-status-entry-point.ts\";\nimport {httpBasicEntryPoint} from \"./http-basic-entry-point.ts\";\nimport {delegatingEntryPoint} from \"./delegating-entry-point.ts\";\nimport {httpBasicAuthenticationConverter} from \"./http-basic-converter.ts\";\nimport {delegatingSuccessHandler} from \"./delegating-success-handler.ts\";\nimport {MatchResult, ServerWebExchangeMatcher} from \"../util/matchers.ts\";\nimport * as matchers from \"../util/matchers.ts\";\nimport {type SecurityContext} from './security-context.ts';\n\nimport {AsyncLocalStorage} from \"node:async_hooks\";\n\nexport default function httpBasic(opts: {\n readonly storage: AsyncLocalStorage<{securityContext?: Promise<SecurityContext>}>\n readonly manager: AuthenticationManager;\n readonly entryPoint?: ServerAuthenticationEntryPoint;\n readonly failureHandler?: ServerAuthenticationFailureHandler;\n readonly successHandlers?: ServerAuthenticationSuccessHandler[];\n defaultEntryPoints: Array<[ServerWebExchangeMatcher, ServerAuthenticationEntryPoint]>;\n defaultSuccessHandlers: ServerAuthenticationSuccessHandler[];\n}) {\n\n const xhrMatcher: ServerWebExchangeMatcher = async (exchange: WebExchange): Promise<MatchResult> => {\n const headers = exchange.request.headers;\n const h = headers.list('X-Requested-With');\n if (h.includes('XMLHttpRequest')) {\n return {match: true};\n }\n return {match: false};\n }\n\n const defaultEntryPoint = delegatingEntryPoint({\n entryPoints: [[xhrMatcher, httpStatusEntryPoint({httpStatus: {code: 401}})]],\n defaultEntryPoint: httpBasicEntryPoint({})\n });\n\n const entryPoint = opts.entryPoint ?? defaultEntryPoint;\n\n const manager = opts.manager;\n\n const restMatcher = matchers.mediaType({\n mediaTypes: [\n 'application/atom+xml',\n 'application/x-www-form-urlencoded',\n 'application/json',\n 'application/octet-stream',\n 'application/xml',\n 'multipart/form-data',\n 'text/xml'\n ],\n ignoredMediaTypes: ['*/*']\n });\n\n const notHtmlMatcher = matchers.not(matchers.mediaType({mediaTypes: ['text/html']}));\n const restNoHtmlMatcher = matchers.and([notHtmlMatcher, restMatcher]);\n const preferredMatcher = matchers.or([xhrMatcher, restNoHtmlMatcher]);\n opts.defaultEntryPoints.push([preferredMatcher, entryPoint]);\n const failureHandler = opts.failureHandler ?? serverAuthenticationEntryPointFailureHandler({entryPoint});\n const successHandler = delegatingSuccessHandler(opts.successHandlers === undefined ? opts.defaultSuccessHandlers : opts.successHandlers);\n const converter = httpBasicAuthenticationConverter({});\n return authenticationFilter({\n storage: opts.storage,\n manager,\n failureHandler,\n successHandler,\n converter\n });\n}\n\n", "import {Authentication, Middleware, WebExchange} from \"../types.ts\";\nimport headers from \"./http-headers.ts\";\nimport resourceServer from \"./oauth2-resource-server.ts\";\nimport httpBasic from \"./http-basic.ts\";\nimport {Jwt} from \"./oauth2/jwt-auth-manager.ts\";\nimport {jwtVerifier} from \"@interopio/gateway/jose/jwt\";\nimport {\n AuthenticationManager,\n AuthorizationDecision,\n BadCredentialsError,\n DefaultAuthorizationManager,\n ServerAuthenticationEntryPoint,\n ServerAuthenticationSuccessHandler\n} from \"./types.ts\";\nimport {anyExchange, ServerWebExchangeMatcher, ServerWebExchangeMatcherEntry} from \"../util/matchers.ts\";\nimport {errorFilter} from \"./error-filter.ts\";\nimport {delegatingEntryPoint} from \"./delegating-entry-point.ts\";\nimport authorizationFilter from \"./authorization-filter.ts\";\nimport {type AsyncLocalStorage} from 'node:async_hooks';\nimport delegatingAuthorizationManager from \"./delegating-authorization-manager.ts\";\nimport {SecurityContext} from './security-context.ts';\n\nexport type HttpSecurityConfig = {\n headers?: {\n disabled?: boolean;\n xss?: { disabled?: boolean };\n }\n basic?: {\n disabled?: boolean;\n realm?: string;\n user?: {\n name: string,\n password?: string // generated password, if not provided\n authorities?: string[]\n }\n },\n jwt?: {\n disabled?: boolean;\n issuerBaseUri?: string; // base URI for the issuer, e.g. 'https://example.com'\n issuer?: string;\n audience?: string;\n },\n authorize?: Array<[\n 'any-exchange' | ServerWebExchangeMatcher,\n ( { access: 'permit-all' | 'deny-all' | 'authenticated' }\n | { access: 'has-any-authority', authorities: string[] }\n | { access: 'has-ip-address', address: string })\n ]>\n}\n\nconst filterOrder = {\n first: Number.MAX_SAFE_INTEGER,\n http_headers: 1 * 100,\n https_redirect: 2 * 100,\n cors: 3 * 100,\n http_basic: 6 * 100,\n authentication: 8 * 100,\n error_translation: 18 * 100,\n authorization: 19 * 100,\n last: Number.MAX_SAFE_INTEGER\n}\nconst filterOrderSymbol = Symbol.for(\"filterOrder\");\n\nexport default (config: HttpSecurityConfig,\n storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }>): Middleware => {\n const middleware: Middleware = [];\n\n class ServerHttpSecurity {\n #authenticationEntryPoint?: ServerAuthenticationEntryPoint;\n readonly #defaultEntryPoints: Array<[ServerWebExchangeMatcher, ServerAuthenticationEntryPoint]> = [];\n manager?: AuthenticationManager;\n\n get authenticationEntryPoint(): ServerAuthenticationEntryPoint | undefined {\n if (this.#authenticationEntryPoint !== undefined || this.#defaultEntryPoints.length === 0) {\n return this.#authenticationEntryPoint!;\n }\n if (this.#defaultEntryPoints.length === 1) {\n return this.#defaultEntryPoints[0][1];\n }\n return delegatingEntryPoint({\n entryPoints: this.#defaultEntryPoints,\n defaultEntryPoint: this.#defaultEntryPoints[this.#defaultEntryPoints.length - 1][1]\n });\n }\n\n\n build() {\n if (config.headers !== undefined && config.headers.disabled !== true) {\n const writer = headers(config.headers);\n writer[filterOrderSymbol] = filterOrder.http_headers;\n middleware.push(writer);\n }\n // move cors here\n\n if (config.basic !== undefined && config.basic?.disabled !== true) {\n const username = config.basic.user?.name.toLowerCase();\n const password = config.basic.user?.password ?? '';\n const authorities = config.basic.user?.authorities ?? [];\n const manager: AuthenticationManager = async (auth) => {\n const principal = auth['principal'];\n const credentials = auth['credentials'];\n if (principal.toLowerCase() !== username || credentials !== password) {\n throw new BadCredentialsError('Invalid username or password');\n }\n return {type: 'UsernamePassword', authenticated: true, principal, credentials, authorities: [...authorities]} as Authentication;\n }\n\n const defaultSuccessHandlers: ServerAuthenticationSuccessHandler[] = [\n async ({exchange: _, next}, _authentication) => {\n return next();\n }\n ];\n\n\n const filter = httpBasic({\n storage,\n manager,\n defaultEntryPoints: this.#defaultEntryPoints,\n defaultSuccessHandlers,\n });\n filter[filterOrderSymbol] = filterOrder.http_basic;\n middleware.push(filter);\n }\n if (config.jwt !== undefined && config.jwt.disabled !== true) {\n const verifier = jwtVerifier({\n issuerBaseUri: config.jwt.issuerBaseUri,\n issuer: config.jwt.issuer,\n audience: config.jwt.audience\n });\n const decoder = async (token: string): Promise<Jwt> => {\n const {payload} = await verifier(token);\n return {\n subject: payload.sub,\n getClaimAsString(claim: string): string | undefined {\n return payload[claim] as string | undefined;\n }\n };\n }\n const filter = resourceServer({storage, jwt: {decoder}});\n filter[filterOrderSymbol] = filterOrder.authentication;\n middleware.push(filter);\n\n }\n\n if (config.authorize !== undefined) {\n const errorFf = errorFilter({authenticationEntryPoint: this.authenticationEntryPoint});\n errorFf[filterOrderSymbol] = filterOrder.error_translation;\n middleware.push(errorFf)\n const buildAuthorizationManager = (authorize: HttpSecurityConfig['authorize']) => {\n const mappings: ServerWebExchangeMatcherEntry<DefaultAuthorizationManager<{\n exchange: WebExchange\n }>>[] = [];\n let anyExchangeRegistered = false;\n for (const [matcher, access] of authorize ?? []) {\n let serverMatcher: ServerWebExchangeMatcher;\n if (matcher === 'any-exchange') {\n anyExchangeRegistered = true;\n serverMatcher = anyExchange;\n } else if (anyExchangeRegistered) {\n throw new Error(\"Cannot register other matchers after 'any-exchange' matcher\");\n } else {\n serverMatcher = matcher;\n }\n let manager: DefaultAuthorizationManager<{ exchange: WebExchange }>;\n if (access.access === 'permit-all') {\n manager = new DefaultAuthorizationManager(async () => new AuthorizationDecision(true));\n } else if (access.access === 'deny-all') {\n manager = new DefaultAuthorizationManager(async () => new AuthorizationDecision(false));\n } else if (access.access === 'authenticated') {\n manager = new DefaultAuthorizationManager(async (p: Promise<Authentication | undefined>) => {\n const authentication = await p;\n if (authentication !== undefined) {\n return new AuthorizationDecision(authentication.authenticated);\n }\n return new AuthorizationDecision(false);\n });\n } else {\n throw new Error(`Unknown access type: ${JSON.stringify(access)}`);\n }\n mappings.push([serverMatcher, manager]);\n }\n return delegatingAuthorizationManager({mappings});\n }\n const manager = buildAuthorizationManager(config.authorize);\n const filter = authorizationFilter({manager, storage});\n filter[filterOrderSymbol] = filterOrder.authorization;\n middleware.push(filter);\n\n }\n\n middleware.sort((a, b) => {\n const aOrder = a[filterOrderSymbol] ?? filterOrder.last;\n const bOrder = b[filterOrderSymbol] ?? filterOrder.last;\n return aOrder - bOrder;\n });\n }\n }\n\n\n const security = new ServerHttpSecurity();\n security.build();\n\n\n return middleware;\n};\n", "import {Authentication, WebExchange} from \"../types.ts\";\nimport {\n AccessDeniedError,\n AuthenticationError,\n InsufficientAuthenticationError,\n ServerAuthenticationEntryPoint\n} from \"./types.ts\";\nimport {httpBasicEntryPoint} from \"./http-basic-entry-point.ts\";\n\nasync function commenceAuthentication(exchange: WebExchange, authentication: Authentication | undefined, entryPoint: ServerAuthenticationEntryPoint) {\n const cause = new InsufficientAuthenticationError(`Full authentication is required to access this resource.`);\n const e: AuthenticationError = new AuthenticationError(\"Access Denied\", {cause});\n if (authentication) {\n e.authentication = authentication;\n }\n await entryPoint(exchange, e);\n}\nexport function httpStatusAccessDeniedHandler(status: number, message: string) {\n return async (exchange: WebExchange, _error: AccessDeniedError) => {\n exchange.response.statusCode = status;\n exchange.response.statusMessage = message;\n exchange.response.headers.set(\"Content-Type\", \"text/plain\");\n const bytes = Buffer.from(\"Access Denied\", \"utf-8\");\n exchange.response.headers.set('Content-Length', bytes.length);\n await exchange.response.end(bytes);\n };\n}\n\nexport const errorFilter = (opts: {\n authenticationEntryPoint?: ServerAuthenticationEntryPoint\n}) => {\n const accessDeniedHandler = httpStatusAccessDeniedHandler(403, \"Forbidden\");\n const authenticationEntryPoint = opts.authenticationEntryPoint ?? httpBasicEntryPoint();\n return async (exchange: WebExchange, next: () => Promise<void>) => {\n try {\n await next();\n } catch (error) {\n if (error instanceof AccessDeniedError) {\n const principal = await exchange.principal;\n if (principal === undefined) {\n await commenceAuthentication(exchange, undefined, authenticationEntryPoint);\n } else {\n if (!principal.authenticated) {\n return accessDeniedHandler(exchange, error);\n }\n await commenceAuthentication(exchange, principal, authenticationEntryPoint);\n }\n }\n }\n };\n}\n", "import {WebExchange} from \"../types.ts\";\nimport {AccessDeniedError, AuthorizationManager} from \"./types.ts\";\nimport {AsyncStorageSecurityContextHolder, SecurityContext} from \"./security-context.ts\";\nimport {AsyncLocalStorage} from \"node:async_hooks\";\n\nexport default function authorizationFilter(opts: {\n storage: AsyncLocalStorage<{ securityContext?: Promise<SecurityContext> }>,\n manager: AuthorizationManager<WebExchange>\n}) {\n const {manager, storage} = opts;\n return async (exchange: WebExchange, next: () => Promise<void>) => {\n const promise = AsyncStorageSecurityContextHolder.getContext(storage)\n .then(c => c?.authentication);\n try {\n await manager.verify(promise, exchange);\n // successful authorization, continue processing\n } catch (error) {\n if (error instanceof AccessDeniedError) {\n // authorization failed, set response status and end exchange\n }\n throw error;\n }\n await next();\n };\n}\n", "import {ServerWebExchangeMatcherEntry} from \"../util/matchers.ts\";\nimport {Authentication, WebExchange} from \"../types.ts\";\nimport {AuthorizationDecision, DefaultAuthorizationManager} from \"./types.ts\";\n\nexport default function delegatingAuthorizationManager(opts: {mappings: Array<ServerWebExchangeMatcherEntry<DefaultAuthorizationManager<{ exchange: WebExchange }>>>}) {\n const check = async (authentication: Promise<Authentication | undefined>, exchange: WebExchange): Promise<AuthorizationDecision> => {\n let decision: AuthorizationDecision;\n for (const [matcher, manager] of opts.mappings) {\n if ((await matcher(exchange))?.match) {\n const checkResult = await manager.check(authentication, {exchange});\n if (checkResult !== undefined) {\n decision = checkResult;\n break;\n }\n }\n }\n decision ??= new AuthorizationDecision(false);\n return decision;\n\n }\n return new DefaultAuthorizationManager(check);\n}\n", "import * as GatewayServer from './server.js';\nexport {GatewayServer};\nexport default GatewayServer.Factory;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["AsyncLocalStorage", "IOGateway", "start", "IOGateway", "IOGateway", "GatewayEncoders", "logger", "codec", "socket", "create", "core_default", "IOGateway", "GatewayEncoders", "logger", "codec", "create", "core_default", "logger", "onMessage", "create", "core_default", "logger", "routes", "routes_default", "portRange", "start", "log", "IOGateway", "log", "IOGateway", "IOGateway", "logger", "headers", "headers", "mediaType", "headers", "handler", "headers", "access", "manager", "logger", "routes", "route", "options", "handler", "IOGateway", "core_default", "routes_default", "AsyncLocalStorage", "server"]
|
|
7
7
|
}
|