@interopio/gateway-server
Version:
[](https://www.npmjs.com/package/@interopio/gateway-server)
8 lines (7 loc) • 33.6 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../src/logger.ts", "../src/mesh/ws/broker/core.ts", "../src/gateway/ent/index.ts", "../src/gateway/ent/logging.ts", "../src/gateway/ent/server.ts", "../src/gateway/ent/config.ts"],
"sourcesContent": ["import * as GatewayLogging from '@interopio/gateway/logging/core';\n\nexport type Logger = GatewayLogging.Logger;\n\nexport default function getLogger(name: string): Logger {\n return GatewayLogging.getLogger(`gateway.server.${name}`);\n}\n\n// This function is used to ensure that RegExp objects are displayed correctly when logging.\nexport function regexAwareReplacer<T>(_key: string, value: T): string | T {\n return value instanceof RegExp ? value.toString() : value;\n}\n", "import * as ws from 'ws';\nimport getLogger from '../../../logger.ts';\nimport {IOGateway} from '@interopio/gateway';\nimport GatewayEncoders = IOGateway.Encoding;\n\nimport type {ServerWebSocketHandler} from '../../../../types/web/server';\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, logPrefix: string) {\n logger.info(`${logPrefix}connection accepted`);\n}\n\nfunction onClose(connectedNodes: NodeSockets, logPrefix: string, code: number, reason: string): void {\n logger.info(`${logPrefix}connection closed [${code}](${reason})`);\n const nodeIds = connectedNodes.sockets[logPrefix];\n if (nodeIds) {\n delete connectedNodes.sockets[logPrefix];\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, logPrefix: string, msg: string): void {\n try {\n const decoded = codec.decode(msg);\n if (logger.enabledFor('debug')) {\n logger.debug(`${logPrefix}processing msg ${JSON.stringify(decoded)}`);\n }\n processMessage(connectedNodes, socket, logPrefix, decoded);\n } catch (ex) {\n logger.error(`${logPrefix}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(environment: {endpoint: string}): Promise<ServerWebSocketHandler> {\n const connectedNodes: NodeSockets = {nodes: {}, sockets: {}};\n logger.info(`mesh server is listening`);\n\n return async ({socket, handshake}) => {\n const logPrefix = handshake.logPrefix!;\n onOpen(connectedNodes, logPrefix);\n socket.on('error', (err: Error) => {\n logger.error(`${logPrefix}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, logPrefix, data as unknown as string);\n });\n socket.on('close', (code, reason) => {\n onClose(connectedNodes, logPrefix, code, reason as unknown as string);\n });\n };\n}\n\nexport default create;\n", "import { toLogConfig } from './logging.ts';\nimport { ServerDelegate } from './server.ts';\nimport { toServerConfig } from './config.ts';\nimport {\n Gateway,\n GatewayConfig,\n LogInfo,\n LogLevel\n} from '../../../types/gateway-ent';\nimport { configure } from '@interopio/gateway/logging/core';\n\nexport function create(config: GatewayConfig): Gateway {\n return new ServerDelegate(toServerConfig(config));\n}\n\nexport function configure_logging(config?: { level: LogLevel, appender?: (info: LogInfo) => void, disabled_action_groups?: string[] }) {\n configure(toLogConfig(config));\n}\n", "import {LogInfo, LogLevel} from '@interopio/gateway-server/gateway-ent';\nimport * as IOGatewayLogging from '@interopio/gateway/logging/core';\nimport {format} from 'node:util';\n\nclass LogInfoAdapter implements LogInfo {\n readonly #event: IOGatewayLogging.LogEvent;\n #parsed?: { err?: Error, msg: string };\n #timestamp?: string;\n #output?: string;\n\n\n constructor(event: IOGatewayLogging.LogEvent) {\n this.#event = event;\n }\n\n private parsed(): { err?: Error, msg: string } {\n if (this.#parsed === undefined) {\n let err: Error | undefined = undefined;\n let vargs = this.#event.data;\n if (this.#event.data[0] instanceof Error) {\n err = this.#event.data[0];\n vargs = vargs.slice(1);\n }\n const msg = format(this.#event.message, ...vargs);\n this.#parsed = {err, msg};\n }\n return this.#parsed;\n }\n\n get time(): Date {\n return this.#event.time;\n }\n\n get level(): LogLevel {\n return this.#event.level;\n }\n\n get namespace() {\n return this.#event.name;\n }\n\n get file(): string {\n return undefined as unknown as string;\n }\n\n get line(): number {\n return undefined as unknown as number;\n }\n\n get message(): string {\n return this.parsed().msg;\n }\n\n get stacktrace(): Error | undefined {\n return this.parsed().err;\n }\n\n private get timestamp(): string {\n if (this.#timestamp === undefined) {\n this.#timestamp = this.time.toISOString();\n }\n return this.#timestamp;\n }\n\n get output(): string {\n if (this.#output === undefined) {\n const err = this.parsed().err;\n const stacktrace = err ? `\\n${err.stack ?? err}` : '';\n this.#output = `${this.timestamp} ${this.level.toUpperCase()} [${this.namespace}] - ${this.message}${stacktrace}`;\n }\n return this.#output;\n }\n}\n\nexport function toLogConfig(config?: { level?: LogLevel; appender?: (info: LogInfo) => void , disabled_action_groups?: string[]}): IOGatewayLogging.LogConfig {\n let level: Exclude<LogLevel, 'report' | 'fatal'> = 'info';\n if (config?.level) {\n if (config.level === 'fatal') {\n level = 'error';\n } else if (config.level !== 'report') {\n level = config.level;\n }\n }\n\n const result: IOGatewayLogging.LogConfig = { level: typeof level === 'string' ? { gateway: level } : level };\n if (config?.disabled_action_groups) {\n config.disabled_action_groups.forEach(actionGroup => {\n result.level[`gateway.action.${actionGroup}`] = 'off';\n })\n }\n const appenderFn = config?.appender;\n if (appenderFn) {\n result.appender = (event: IOGatewayLogging.LogEvent) => {\n appenderFn(new LogInfoAdapter(event));\n };\n }\n return result;\n}\n", "import {Gateway, GatewayClient, GatewayMessage} from '@interopio/gateway-server/gateway-ent';\nimport {GatewayServer} from '@interopio/gateway-server';\n\nexport class ServerDelegate implements Gateway {\n private server?: GatewayServer.Server;\n\n constructor(private readonly config: GatewayServer.ServerConfig) {\n }\n\n async connect(cb: (client: GatewayClient, msg: GatewayMessage) => void): Promise<GatewayClient> {\n if (!this.server) {\n throw new Error(`not started`);\n }\n const client = await this.server.gateway.connect((c, m) => cb(c as unknown as GatewayClient, m as GatewayMessage));\n return client as unknown as GatewayClient;\n }\n\n info(): { endpoint: string } {\n return this.server?.gateway.info() as { endpoint: string };\n }\n\n async start(): Promise<Gateway> {\n if (!this.server) {\n this.server = await GatewayServer.Factory(this.config);\n }\n return this;\n }\n\n async stop(): Promise<Gateway> {\n await this.server?.close();\n delete this.server;\n return this;\n }\n}\n", "import type { GatewayConfig, MetricsPublisherConfig } from '../../../types/gateway-ent';\nimport type { GatewayServer } from '../../../gateway-server';\nimport type { OriginFilters, ServerWebSocketOptions } from '../../../types/web/server';\nimport type { AuthorizationRule } from '../../../types/auth';\nimport { IOGateway } from '@interopio/gateway';\n\nfunction toMetricsFilters(legacy?: MetricsPublisherConfig['filters']): IOGateway.MetricFilters | undefined {\n if (legacy) {\n const publishers = legacy.publishers.map(publisher => {\n return { identity: publisher.publisher, metrics: publisher.metrics };\n });\n const non_matched = legacy['non-matched'];\n return { publishers, non_matched };\n }\n}\n\nfunction toMetricsPublisherConfig(legacy: MetricsPublisherConfig & {\n conflation?: { 'max-datapoints-repo'?: number } & MetricsPublisherConfig['conflation']\n}): IOGateway.BasicMetricsPublisherConfig {\n const filters = toMetricsFilters(legacy?.filters);\n const conflation = toConflation(legacy?.conflation);\n const result: IOGateway.BasicMetricsPublisherConfig = { ...legacy, filters, conflation } as const;\n if (!filters) {\n delete result.filters;\n }\n if (!conflation) {\n delete result.conflation;\n }\n // if (legacy.heartbeats !== undefined) {\n // result.heartbeats = legacy.heartbeats;\n // }\n // if (legacy.buffer_size !== undefined) {\n // result.buffer_size = legacy.buffer_size;\n // }\n // if (legacy['worker'] !== undefined) {\n // result.worker = legacy.worker;\n // }\n return result;\n}\n\nfunction toConflation(legacy?: {\n 'max-datapoints-repo'?: number\n} & MetricsPublisherConfig['conflation']): IOGateway.BasicMetricsPublisherConfig['conflation'] | undefined {\n if (legacy) {\n return { interval: legacy.interval };\n }\n}\n\nfunction toMetricsConfig(legacy: GatewayConfig['metrics']): IOGateway.GatewayConfig['metrics'] {\n const metrics: IOGateway.GatewayConfig['metrics'] = { publishers: [] };\n legacy?.publishers?.forEach((publisher) => {\n if (typeof publisher === 'string') {\n if (publisher === 'rest') {\n metrics.publishers.push('rest');\n if (legacy.rest) {\n const conf = { ...legacy.rest };\n const userAgent = conf[\"user-agent\"];\n delete conf['user-agent'];\n const headers = { ...conf.headers, ...(userAgent ? { 'user-agent': userAgent } : {}) };\n delete conf.headers;\n metrics.rest = {\n endpoint: conf.endpoint,\n headers: headers,\n ...toMetricsPublisherConfig(conf)\n };\n metrics.rest['publishFn'] ??= '@interopio/gateway-server/metrics/publisher/rest';\n }\n }\n else if (publisher === 'file') {\n metrics.publishers.push('file');\n if (legacy.file) {\n const conf = { ...legacy.file };\n const status = conf['skip-status'] === undefined ? true : !conf['skip-status'];\n delete conf['skip-status'];\n metrics.file = {\n location: conf.location,\n status: status,\n ...toMetricsPublisherConfig(conf)\n };\n metrics.file['publishFn'] ??= '@interopio/gateway/metrics/publisher/file';\n }\n }\n else {\n // unsupported predefined type\n }\n }\n else {\n const configuration = { ...publisher };\n const splitSize = configuration[\"split-size\"];\n delete configuration[\"split-size\"];\n const file = publisher['publisher']?.['file'] as string;\n const custom: IOGateway.CustomMetricsPublisherConfig = {\n split_size: splitSize,\n publisher: { file, configuration: publisher['publisher']?.['configuration'] },\n context: publisher.context as IOGateway.CustomMetricsPublisherConfig['context'],\n ...toMetricsPublisherConfig(configuration as MetricsPublisherConfig),\n };\n if (custom.split_size === undefined) {\n delete custom.split_size;\n }\n metrics.publishers.push(custom);\n }\n });\n if (legacy?.filters) {\n metrics.filters = toMetricsFilters(legacy?.filters);\n }\n return metrics;\n}\n\ntype GatewayCluster = Required<GatewayConfig>['cluster'];\ntype P2P = Required<GatewayCluster>['p2p'];\n\nfunction trimTrailingSlash(url?: string): string | undefined {\n return url?.endsWith('/') ? url.slice(0, -1) : url;\n}\n\nfunction toCluster(legacy?: P2P): IOGateway.MeshClusterConfig | undefined {\n if (legacy?.directory) {\n const legacyDirectory = legacy.directory;\n const config: IOGateway.MeshClusterConfig = { endpoint: legacy?.['endpoint'] };\n if (legacyDirectory.type === 'rest') {\n let directory: IOGateway.RestMeshDirectoryConfig | undefined = undefined;\n if (config.endpoint === undefined) {\n config.endpoint = trimTrailingSlash(legacyDirectory.config?.directory_uri)!;\n }\n else {\n directory = { uri: trimTrailingSlash(legacyDirectory.config?.directory_uri) };\n }\n if (legacyDirectory.config?.announce_interval) {\n directory ??= {};\n directory.interval = Number(legacyDirectory.config.announce_interval);\n }\n if (directory !== undefined) {\n config.directory = directory;\n config.directory.metadata ??= legacyDirectory.config?.['metadata'] as Record<string, string>;\n }\n if (legacyDirectory.config) {\n const opts = {...legacyDirectory.config} as Exclude<IOGateway.MeshClusterConfig['opts'], undefined>;\n delete opts['directory_uri'];\n delete opts['announce_interval'];\n if (Object.keys(opts).length > 0) {\n config.opts = opts;\n }\n }\n return config;\n }\n else if (legacyDirectory.type === 'static') {\n config.directory = { members: legacyDirectory.members ?? [] };\n return config;\n }\n }\n}\n\nfunction toMeshConfig(legacy: GatewayConfig['cluster']) {\n const mesh: IOGateway.MeshConfig = { auth: { user: null } };\n if (legacy?.configuration?.node_id) {\n mesh.node = legacy.configuration.node_id;\n }\n if (legacy?.configuration?.['user']) {\n mesh.auth.user = legacy.configuration?.['user'] as string | string[];\n }\n if (legacy?.type === 'broker') {\n mesh.broker = { endpoint: legacy.broker?.endpoint ?? '<unresolved>' };\n }\n if (legacy?.type === 'p2p') {\n const cluster = toCluster(legacy.p2p);\n if (cluster) {\n mesh.cluster = cluster;\n }\n }\n return mesh;\n}\n\nfunction toAuthenticationConfig(legacy: GatewayConfig['authentication']): IOGateway.AuthenticationConfig {\n const authentication: IOGateway.AuthenticationConfig & { available: string[] } = { available: [] };\n if (legacy?.default) {\n authentication.default = legacy.default as string;\n }\n\n const as = legacy?.available as string[];\n as.forEach((a) => {\n if (a === 'basic' || a === 'oauth2' || legacy?.[a]?.['authenticator'] !== undefined) {\n authentication.available.push(a);\n if (legacy?.[a] !== undefined) {\n authentication[a] = legacy[a];\n }\n }\n });\n\n return authentication;\n}\n\nexport function toServerConfig(config: GatewayConfig): GatewayServer.ServerConfig {\n const gateway: GatewayServer.ServerConfig[\"gateway\"] = {\n route: config.route,\n maxConnections: config.limits?.max_connections,\n origins: config.security?.origin_filters as OriginFilters,\n authorize: config['authorize'] as AuthorizationRule ?? { access: 'permitted' },\n ping: config['ping'] as ServerWebSocketOptions['ping'],\n clients: config['clients'] ?? { inactive_seconds: 0, buffer_size: 100 },\n contexts: {\n lifetime: 'retained',\n visibility: [\n { context: /___channel___.+/, restrictions: 'cluster' },\n { context: /T42\\..+/, restrictions: 'local' }\n ]\n },\n methods: {\n visibility: [\n { method: /T42\\..+/, restrictions: 'local' }\n ]\n },\n peers: {\n visibility: [\n { domain: 'context', restrictions: 'cluster' },\n { domain: 'agm', restrictions: 'local' }\n ]\n },\n metrics: { publishers: [] }\n };\n if (config.authentication !== undefined) {\n const tokenTtl = config.authentication.token_ttl ?? config.authentication['token-ttl'];\n if (tokenTtl !== undefined) {\n gateway.token = { ttl: tokenTtl as number };\n }\n if (config.authentication.available || config.authentication.default) {\n gateway.authentication = toAuthenticationConfig(config.authentication);\n }\n }\n if (config['globals']) {\n gateway.globals = config['globals'];\n }\n if (config['contexts']) {\n gateway.contexts = config['contexts'];\n }\n if (config['methods']) {\n gateway.methods = config['methods'];\n }\n if (config['peers']) {\n gateway.peers = config['peers'];\n }\n if (config.cluster?.enabled) {\n gateway.mesh = toMeshConfig(config.cluster);\n }\n if (config.metrics?.publishers) {\n gateway.metrics = toMetricsConfig(config.metrics);\n }\n return {\n port: config.port ?? 3434,\n host: config.ip ?? config['host'] as string,\n cors: config['cors'] === null ? undefined : config['cors'] ?? false,\n memory: config['memory'],\n app: async (configurer) => {\n if (config.cluster?.embedded_broker?.enabled === true) {\n configurer.socket({\n path: config.cluster.embedded_broker.route ?? '/mesh-broker',\n options: {\n authorize: config.cluster.embedded_broker['authorize'] as AuthorizationRule ?? { access: 'permitted' }\n },\n factory: async (env: { endpoint: string }) => {\n if (gateway.mesh?.broker?.endpoint === '<unresolved>') {\n gateway.mesh.broker.endpoint = env.endpoint;\n }\n const delegate = (await import('../../mesh/ws/broker/core.ts')).default;\n return await delegate(env);\n }\n });\n }\n },\n gateway: gateway\n\n };\n}\n"],
"mappings": "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",
"names": ["getLogger", "name", "GatewayLogging", "init_logger", "__esmMin", "core_exports", "__export", "core_default", "broadcastNodeAdded", "nodes", "newSocket", "newNodeId", "nodeId", "socket", "codec", "broadcastNodeRemoved", "removedNodeId", "onOpen", "connectedNodes", "logPrefix", "logger", "onClose", "code", "reason", "nodeIds", "processMessage", "key", "msg", "sourceNodeId", "targetNodeId", "onMessage", "decoded", "ex", "create", "environment", "handshake", "err", "data", "_isBinary", "import_gateway", "GatewayEncoders", "init_core", "__esmMin", "init_logger", "getLogger", "index_exports", "__export", "configure_logging", "create", "__toCommonJS", "import_node_util", "LogInfoAdapter", "#event", "#parsed", "#timestamp", "#output", "event", "err", "vargs", "msg", "stacktrace", "toLogConfig", "config", "level", "result", "actionGroup", "appenderFn", "import_gateway_server", "ServerDelegate", "config", "cb", "c", "m", "toMetricsFilters", "legacy", "publishers", "publisher", "non_matched", "toMetricsPublisherConfig", "filters", "conflation", "toConflation", "result", "toMetricsConfig", "metrics", "conf", "userAgent", "headers", "status", "configuration", "splitSize", "file", "custom", "trimTrailingSlash", "url", "toCluster", "legacyDirectory", "config", "directory", "opts", "toMeshConfig", "mesh", "cluster", "toAuthenticationConfig", "authentication", "a", "toServerConfig", "gateway", "tokenTtl", "configurer", "env", "delegate", "import_core", "create", "config", "ServerDelegate", "toServerConfig", "configure_logging", "toLogConfig"]
}