@interopio/gateway-server 0.6.0-beta → 0.6.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 CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  # Change Log
4
4
 
5
+ ## 0.6.2-beta (2025-07-19)
6
+
7
+ ### Fixed
8
+ - announce response failure (regression)
9
+
10
+ ## 0.6.1-beta (2025-07-18)
11
+
12
+ ### Fixed
13
+ - `gateway-ent` should not require authenticated access to the `gw` route
14
+
15
+ ### Changed
16
+ - `Server` header now includes the version of the package
17
+
5
18
  ## 0.6.0-beta (2025-07-18)
6
19
 
7
20
  ### Added
@@ -266,6 +266,7 @@ function toServerConfig(config) {
266
266
  route: config.route,
267
267
  limits: config.limits,
268
268
  origins: config.security?.origin_filters,
269
+ authorize: config["authorize"] ?? { access: "permitted" },
269
270
  clients: config["clients"] ?? { inactive_seconds: 0, buffer_size: 100 },
270
271
  contexts: {
271
272
  lifetime: "retained",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/gateway/ent/index.ts", "../src/gateway/ent/logging.ts", "../src/gateway/ent/server.ts", "../src/gateway/ent/config.ts"],
4
- "sourcesContent": ["import {toLogConfig} from './logging.js';\nimport {ServerDelegate} from './server.js';\nimport {toServerConfig} from './config.js';\nimport {\n Gateway,\n GatewayConfig,\n LogInfo,\n LogLevel\n} from '../../../types/gateway-ent';\nimport {IOGateway} from '@interopio/gateway';\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 }) {\n IOGateway.Logging.configure(toLogConfig(config));\n}\n", "import {LogInfo, LogLevel} from '@interopio/gateway-server/gateway-ent';\nimport {IOGateway} from '@interopio/gateway';\nimport {format} from 'node:util';\n\nclass LogInfoAdapter implements LogInfo {\n private _parsed?: { err?: Error, msg: string };\n private _timestamp?: string;\n private _output?: string;\n\n constructor(private readonly event: IOGateway.Logging.LogEvent) {\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 }): IOGateway.Logging.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 const result: IOGateway.Logging.LogConfig = {level};\n const appenderFn = config?.appender;\n if (appenderFn) {\n result.appender = (event: IOGateway.Logging.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 {GatewayServer} from '../../../gateway-server';\nimport {IOGateway} from '@interopio/gateway';\nimport { GatewayConfig, MetricsPublisherConfig } from '../../../types/gateway-ent';\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 return {...legacy, filters, conflation};\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 } 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 } else {\n // unsupported predefined type\n }\n } else {\n const configuration = {...publisher.configuration};\n const splitSize = configuration[\"split-size\"];\n delete configuration[\"split-size\"];\n const file = publisher['file'] as string;\n const custom: IOGateway.CustomMetricsPublisherConfig = {\n split_size: splitSize,\n publisher: {file, configuration},\n ...toMetricsPublisherConfig(configuration)\n }\n metrics.publishers.push(custom);\n }\n });\n if (legacy?.filters) {\n metrics.filters = toMetricsFilters(legacy?.filters);\n }\n return metrics;\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.MeshConfig['cluster'] | undefined {\n if (legacy?.directory) {\n const legacyDirectory = legacy.directory;\n const config: IOGateway.MeshConfig['cluster'] = {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 }\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 = {};\n if (legacy?.configuration?.node_id) mesh.node = legacy.configuration.node_id;\n if (legacy?.type === 'broker') mesh.broker = {endpoint: legacy.broker!.endpoint!};\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}\nexport function toServerConfig(config: GatewayConfig): GatewayServer.ServerConfig {\n const gateway: GatewayServer.ServerConfig[\"gateway\"] = {\n route: config.route,\n limits: config.limits,\n origins: config.security?.origin_filters as GatewayServer.OriginFilters,\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 if (config.authentication.token_ttl) gateway.token = {ttl: config.authentication?.token_ttl as number};\n if (config.authentication.available || config.authentication.default) gateway.authentication = toAuthenticationConfig(config.authentication);\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 }\n if (config.metrics?.publishers) gateway.metrics = toMetricsConfig(config.metrics);\n return {\n port: config.port ?? 3434,\n host: config.ip ?? config['host'] as string,\n memory: config['memory'],\n gateway: gateway\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {toLogConfig} from './logging.js';\nimport {ServerDelegate} from './server.js';\nimport {toServerConfig} from './config.js';\nimport {\n Gateway,\n GatewayConfig,\n LogInfo,\n LogLevel\n} from '../../../types/gateway-ent';\nimport {IOGateway} from '@interopio/gateway';\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 }) {\n IOGateway.Logging.configure(toLogConfig(config));\n}\n", "import {LogInfo, LogLevel} from '@interopio/gateway-server/gateway-ent';\nimport {IOGateway} from '@interopio/gateway';\nimport {format} from 'node:util';\n\nclass LogInfoAdapter implements LogInfo {\n private _parsed?: { err?: Error, msg: string };\n private _timestamp?: string;\n private _output?: string;\n\n constructor(private readonly event: IOGateway.Logging.LogEvent) {\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 }): IOGateway.Logging.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 const result: IOGateway.Logging.LogConfig = {level};\n const appenderFn = config?.appender;\n if (appenderFn) {\n result.appender = (event: IOGateway.Logging.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 {GatewayServer} from '../../../gateway-server';\nimport {IOGateway} from '@interopio/gateway';\nimport { GatewayConfig, MetricsPublisherConfig } from '../../../types/gateway-ent';\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 return {...legacy, filters, conflation};\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 } 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 } else {\n // unsupported predefined type\n }\n } else {\n const configuration = {...publisher.configuration};\n const splitSize = configuration[\"split-size\"];\n delete configuration[\"split-size\"];\n const file = publisher['file'] as string;\n const custom: IOGateway.CustomMetricsPublisherConfig = {\n split_size: splitSize,\n publisher: {file, configuration},\n ...toMetricsPublisherConfig(configuration)\n }\n metrics.publishers.push(custom);\n }\n });\n if (legacy?.filters) {\n metrics.filters = toMetricsFilters(legacy?.filters);\n }\n return metrics;\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.MeshConfig['cluster'] | undefined {\n if (legacy?.directory) {\n const legacyDirectory = legacy.directory;\n const config: IOGateway.MeshConfig['cluster'] = {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 }\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 = {};\n if (legacy?.configuration?.node_id) mesh.node = legacy.configuration.node_id;\n if (legacy?.type === 'broker') mesh.broker = {endpoint: legacy.broker!.endpoint!};\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}\nexport function toServerConfig(config: GatewayConfig): GatewayServer.ServerConfig {\n const gateway: GatewayServer.ServerConfig[\"gateway\"] = {\n route: config.route,\n limits: config.limits,\n origins: config.security?.origin_filters as GatewayServer.OriginFilters,\n authorize: config['authorize'] as GatewayServer.AuthorizationRule ?? {access: 'permitted'},\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 if (config.authentication.token_ttl) gateway.token = {ttl: config.authentication?.token_ttl as number};\n if (config.authentication.available || config.authentication.default) gateway.authentication = toAuthenticationConfig(config.authentication);\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 }\n if (config.metrics?.publishers) gateway.metrics = toMetricsConfig(config.metrics);\n return {\n port: config.port ?? 3434,\n host: config.ip ?? config['host'] as string,\n memory: config['memory'],\n gateway: gateway\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -239,6 +239,7 @@ function toServerConfig(config) {
239
239
  route: config.route,
240
240
  limits: config.limits,
241
241
  origins: config.security?.origin_filters,
242
+ authorize: config["authorize"] ?? { access: "permitted" },
242
243
  clients: config["clients"] ?? { inactive_seconds: 0, buffer_size: 100 },
243
244
  contexts: {
244
245
  lifetime: "retained",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/gateway/ent/logging.ts", "../src/gateway/ent/server.ts", "../src/gateway/ent/config.ts", "../src/gateway/ent/index.ts"],
4
- "sourcesContent": ["import {LogInfo, LogLevel} from '@interopio/gateway-server/gateway-ent';\nimport {IOGateway} from '@interopio/gateway';\nimport {format} from 'node:util';\n\nclass LogInfoAdapter implements LogInfo {\n private _parsed?: { err?: Error, msg: string };\n private _timestamp?: string;\n private _output?: string;\n\n constructor(private readonly event: IOGateway.Logging.LogEvent) {\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 }): IOGateway.Logging.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 const result: IOGateway.Logging.LogConfig = {level};\n const appenderFn = config?.appender;\n if (appenderFn) {\n result.appender = (event: IOGateway.Logging.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 {GatewayServer} from '../../../gateway-server';\nimport {IOGateway} from '@interopio/gateway';\nimport { GatewayConfig, MetricsPublisherConfig } from '../../../types/gateway-ent';\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 return {...legacy, filters, conflation};\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 } 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 } else {\n // unsupported predefined type\n }\n } else {\n const configuration = {...publisher.configuration};\n const splitSize = configuration[\"split-size\"];\n delete configuration[\"split-size\"];\n const file = publisher['file'] as string;\n const custom: IOGateway.CustomMetricsPublisherConfig = {\n split_size: splitSize,\n publisher: {file, configuration},\n ...toMetricsPublisherConfig(configuration)\n }\n metrics.publishers.push(custom);\n }\n });\n if (legacy?.filters) {\n metrics.filters = toMetricsFilters(legacy?.filters);\n }\n return metrics;\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.MeshConfig['cluster'] | undefined {\n if (legacy?.directory) {\n const legacyDirectory = legacy.directory;\n const config: IOGateway.MeshConfig['cluster'] = {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 }\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 = {};\n if (legacy?.configuration?.node_id) mesh.node = legacy.configuration.node_id;\n if (legacy?.type === 'broker') mesh.broker = {endpoint: legacy.broker!.endpoint!};\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}\nexport function toServerConfig(config: GatewayConfig): GatewayServer.ServerConfig {\n const gateway: GatewayServer.ServerConfig[\"gateway\"] = {\n route: config.route,\n limits: config.limits,\n origins: config.security?.origin_filters as GatewayServer.OriginFilters,\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 if (config.authentication.token_ttl) gateway.token = {ttl: config.authentication?.token_ttl as number};\n if (config.authentication.available || config.authentication.default) gateway.authentication = toAuthenticationConfig(config.authentication);\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 }\n if (config.metrics?.publishers) gateway.metrics = toMetricsConfig(config.metrics);\n return {\n port: config.port ?? 3434,\n host: config.ip ?? config['host'] as string,\n memory: config['memory'],\n gateway: gateway\n };\n}\n", "import {toLogConfig} from './logging.js';\nimport {ServerDelegate} from './server.js';\nimport {toServerConfig} from './config.js';\nimport {\n Gateway,\n GatewayConfig,\n LogInfo,\n LogLevel\n} from '../../../types/gateway-ent';\nimport {IOGateway} from '@interopio/gateway';\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 }) {\n IOGateway.Logging.configure(toLogConfig(config));\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {LogInfo, LogLevel} from '@interopio/gateway-server/gateway-ent';\nimport {IOGateway} from '@interopio/gateway';\nimport {format} from 'node:util';\n\nclass LogInfoAdapter implements LogInfo {\n private _parsed?: { err?: Error, msg: string };\n private _timestamp?: string;\n private _output?: string;\n\n constructor(private readonly event: IOGateway.Logging.LogEvent) {\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 }): IOGateway.Logging.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 const result: IOGateway.Logging.LogConfig = {level};\n const appenderFn = config?.appender;\n if (appenderFn) {\n result.appender = (event: IOGateway.Logging.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 {GatewayServer} from '../../../gateway-server';\nimport {IOGateway} from '@interopio/gateway';\nimport { GatewayConfig, MetricsPublisherConfig } from '../../../types/gateway-ent';\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 return {...legacy, filters, conflation};\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 } 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 } else {\n // unsupported predefined type\n }\n } else {\n const configuration = {...publisher.configuration};\n const splitSize = configuration[\"split-size\"];\n delete configuration[\"split-size\"];\n const file = publisher['file'] as string;\n const custom: IOGateway.CustomMetricsPublisherConfig = {\n split_size: splitSize,\n publisher: {file, configuration},\n ...toMetricsPublisherConfig(configuration)\n }\n metrics.publishers.push(custom);\n }\n });\n if (legacy?.filters) {\n metrics.filters = toMetricsFilters(legacy?.filters);\n }\n return metrics;\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.MeshConfig['cluster'] | undefined {\n if (legacy?.directory) {\n const legacyDirectory = legacy.directory;\n const config: IOGateway.MeshConfig['cluster'] = {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 }\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 = {};\n if (legacy?.configuration?.node_id) mesh.node = legacy.configuration.node_id;\n if (legacy?.type === 'broker') mesh.broker = {endpoint: legacy.broker!.endpoint!};\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}\nexport function toServerConfig(config: GatewayConfig): GatewayServer.ServerConfig {\n const gateway: GatewayServer.ServerConfig[\"gateway\"] = {\n route: config.route,\n limits: config.limits,\n origins: config.security?.origin_filters as GatewayServer.OriginFilters,\n authorize: config['authorize'] as GatewayServer.AuthorizationRule ?? {access: 'permitted'},\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 if (config.authentication.token_ttl) gateway.token = {ttl: config.authentication?.token_ttl as number};\n if (config.authentication.available || config.authentication.default) gateway.authentication = toAuthenticationConfig(config.authentication);\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 }\n if (config.metrics?.publishers) gateway.metrics = toMetricsConfig(config.metrics);\n return {\n port: config.port ?? 3434,\n host: config.ip ?? config['host'] as string,\n memory: config['memory'],\n gateway: gateway\n };\n}\n", "import {toLogConfig} from './logging.js';\nimport {ServerDelegate} from './server.js';\nimport {toServerConfig} from './config.js';\nimport {\n Gateway,\n GatewayConfig,\n LogInfo,\n LogLevel\n} from '../../../types/gateway-ent';\nimport {IOGateway} from '@interopio/gateway';\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 }) {\n IOGateway.Logging.configure(toLogConfig(config));\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/index.cjs CHANGED
@@ -190,8 +190,7 @@ var HttpServerRequest = class {
190
190
  return void 0;
191
191
  }
192
192
  const text = await blob.text();
193
- const json = JSON.parse(text);
194
- return json;
193
+ return JSON.parse(text);
195
194
  });
196
195
  }
197
196
  };
@@ -306,15 +305,19 @@ var HttpServerResponse = class {
306
305
  }
307
306
  end(chunk) {
308
307
  if (!this._res.headersSent) {
309
- return new Promise((resolve) => {
310
- if (chunk === void 0) {
311
- this._res.end(() => {
312
- resolve(true);
313
- });
314
- } else {
315
- this._res.end(chunk, () => {
316
- resolve(true);
317
- });
308
+ return new Promise((resolve, reject) => {
309
+ try {
310
+ if (chunk === void 0) {
311
+ this._res.end(() => {
312
+ resolve(true);
313
+ });
314
+ } else {
315
+ this._res.end(chunk, () => {
316
+ resolve(true);
317
+ });
318
+ }
319
+ } catch (e) {
320
+ reject(e instanceof Error ? e : new Error(`end failed: ${e}`));
318
321
  }
319
322
  });
320
323
  } else {
@@ -802,9 +805,10 @@ function routes(connections, config, authorize) {
802
805
  } else {
803
806
  const nodes = json;
804
807
  const result = connections.announce(nodes);
805
- const body = new Blob([JSON.stringify(result)], { type: "application/json" });
808
+ const buffer = Buffer.from(JSON.stringify(result), "utf-8");
806
809
  ctx.response.statusCode = 200;
807
- await ctx.response.end(body);
810
+ ctx.response.headers.set("Content-Type", "application/json").set("Content-Length", buffer.length);
811
+ await ctx.response.end(buffer);
808
812
  }
809
813
  } else {
810
814
  await next();
@@ -1288,9 +1292,9 @@ var localIp = (() => {
1288
1292
  return a.length > 0 ? a[0] : void 0;
1289
1293
  }
1290
1294
  const addresses = Object.values((0, import_node_os.networkInterfaces)()).flatMap((details) => {
1291
- return (details ?? []).filter((info) => info.family === "IPv4");
1292
- }).reduce((acc, info) => {
1293
- acc[info.internal ? "internal" : "external"].push(info);
1295
+ return (details ?? []).filter((info2) => info2.family === "IPv4");
1296
+ }).reduce((acc, info2) => {
1297
+ acc[info2.internal ? "internal" : "external"].push(info2);
1294
1298
  return acc;
1295
1299
  }, { internal: [], external: [] });
1296
1300
  return (first(addresses.internal) ?? first(addresses.external))?.address;
@@ -1510,16 +1514,17 @@ function regexifyOriginFilters(originFilters) {
1510
1514
  }
1511
1515
 
1512
1516
  // src/server/server-header.ts
1517
+ var import_package = __toESM(require("@interopio/gateway-server/package.json"), 1);
1513
1518
  var serverHeader = (server) => {
1514
- const enabled = typeof server === "string";
1519
+ server ??= `${import_package.default.name} - v${import_package.default.version}`;
1515
1520
  return async ({ response }, next) => {
1516
- if (server != false && !response.headers.has("server")) {
1521
+ if (server !== false && !response.headers.has("server")) {
1517
1522
  response.headers.set("Server", server);
1518
1523
  }
1519
1524
  await next();
1520
1525
  };
1521
1526
  };
1522
- var server_header_default = (server = "gateway-server") => serverHeader(server);
1527
+ var server_header_default = (server) => serverHeader(server);
1523
1528
 
1524
1529
  // src/app/route.ts
1525
1530
  function findSocketRoute({ request }, { sockets: routes3 }) {
@@ -1872,14 +1877,25 @@ function authenticationFilter(opts) {
1872
1877
  // src/server/security/oauth2/token-error.ts
1873
1878
  var BearerTokenErrorCodes = {
1874
1879
  invalid_request: "invalid_request",
1875
- invalid_token: "invalid_token"
1880
+ invalid_token: "invalid_token",
1881
+ insufficient_scope: "insufficient_scope"
1876
1882
  };
1877
1883
  var DEFAULT_URI = "https://tools.ietf.org/html/rfc6750#section-3.1";
1878
1884
  function invalidToken(message) {
1879
- return { errorCode: BearerTokenErrorCodes.invalid_token, httpStatus: 401, description: message, uri: DEFAULT_URI };
1885
+ return {
1886
+ errorCode: BearerTokenErrorCodes.invalid_token,
1887
+ httpStatus: 401,
1888
+ description: message,
1889
+ uri: DEFAULT_URI
1890
+ };
1880
1891
  }
1881
1892
  function invalidRequest(message) {
1882
- return { errorCode: BearerTokenErrorCodes.invalid_request, httpStatus: 400, description: message, uri: DEFAULT_URI };
1893
+ return {
1894
+ errorCode: BearerTokenErrorCodes.invalid_request,
1895
+ httpStatus: 400,
1896
+ description: message,
1897
+ uri: DEFAULT_URI
1898
+ };
1883
1899
  }
1884
1900
 
1885
1901
  // src/server/security/oauth2/token-converter.ts
@@ -2164,7 +2180,7 @@ function httpBasic(opts) {
2164
2180
  const preferredMatcher = or([xhrMatcher, restNoHtmlMatcher]);
2165
2181
  opts.defaultEntryPoints.push([preferredMatcher, entryPoint]);
2166
2182
  const failureHandler = opts.failureHandler ?? serverAuthenticationEntryPointFailureHandler({ entryPoint });
2167
- const successHandler = delegatingSuccessHandler(opts.successHandlers === void 0 ? opts.defaultSuccessHandlers : opts.successHandlers);
2183
+ const successHandler = delegatingSuccessHandler(opts.successHandlers ?? opts.defaultSuccessHandlers);
2168
2184
  const converter = httpBasicAuthenticationConverter({});
2169
2185
  return authenticationFilter({
2170
2186
  storage: opts.storage,
@@ -2771,8 +2787,9 @@ async function createCorsConfigSource(context) {
2771
2787
  // src/app/auth.ts
2772
2788
  function createSecurityConfig(context) {
2773
2789
  const authorize = [];
2790
+ const defaultAccess = { access: context.authConfig?.type !== "none" ? "authenticated" : "permitted" };
2774
2791
  for (const [path, route] of context.sockets) {
2775
- const rule = route.authorize ?? { access: "authenticated" };
2792
+ const rule = route.authorize ?? defaultAccess;
2776
2793
  let matcher = pattern(path, { method: "GET" });
2777
2794
  matcher = and([upgradeMatcher, matcher]);
2778
2795
  authorize.push([matcher, rule]);
@@ -2783,7 +2800,7 @@ function createSecurityConfig(context) {
2783
2800
  if (context.authorize.length > 0) {
2784
2801
  authorize.push(...context.authorize);
2785
2802
  }
2786
- authorize.push(["any-exchange", { access: "authenticated" }]);
2803
+ authorize.push(["any-exchange", defaultAccess]);
2787
2804
  return {
2788
2805
  authorize,
2789
2806
  basic: {
@@ -2827,23 +2844,23 @@ async function createListener(middleware, context, onSocketError) {
2827
2844
  if ((request.method === "GET" || request.method === "CONNECT") && upgradeMatchResult.match) {
2828
2845
  const socket = request.socket;
2829
2846
  const host = request.host;
2830
- const info = socketKey(request._req.socket);
2847
+ const info2 = socketKey(request._req.socket);
2831
2848
  if (route.wss) {
2832
2849
  socket.removeListener("error", onSocketError);
2833
2850
  const wss = route.wss;
2834
2851
  if (route.maxConnections !== void 0 && wss.clients?.size >= route.maxConnections) {
2835
- logger10.warn(`${info} dropping ws connection request from ${host} on ${path}. max connections exceeded.`);
2852
+ logger10.warn(`${info2} dropping ws connection request from ${host} on ${path}. max connections exceeded.`);
2836
2853
  socket.destroy();
2837
2854
  return;
2838
2855
  }
2839
2856
  const origin = request.headers.one("origin");
2840
2857
  if (!acceptsOrigin(origin, route.originFilters)) {
2841
- logger10.info(`${info} dropping ws connection request from ${host} on ${path}. origin ${origin ?? "<missing>"}`);
2858
+ logger10.info(`${info2} dropping ws connection request from ${host} on ${path}. origin ${origin ?? "<missing>"}`);
2842
2859
  socket.destroy();
2843
2860
  return;
2844
2861
  }
2845
2862
  if (logger10.enabledFor("debug")) {
2846
- logger10.debug(`${info} accepted new ws connection request from ${host} on ${path}`);
2863
+ logger10.debug(`${info2} accepted new ws connection request from ${host} on ${path}`);
2847
2864
  }
2848
2865
  wss.handleUpgrade(request._req, socket, request._req["_upgradeHead"], (ws) => {
2849
2866
  response._res["_header"] = true;
@@ -2853,7 +2870,7 @@ async function createListener(middleware, context, onSocketError) {
2853
2870
  wss.emit("connection", ws, request._req);
2854
2871
  });
2855
2872
  } else {
2856
- logger10.warn(`${info} rejected upgrade request from ${host} on ${path}`);
2873
+ logger10.warn(`${info2} rejected upgrade request from ${host} on ${path}`);
2857
2874
  socket.destroy();
2858
2875
  }
2859
2876
  } else {
@@ -3007,12 +3024,12 @@ var Factory = async (options) => {
3007
3024
  }
3008
3025
  });
3009
3026
  server2.on("listening", async () => {
3010
- const info = server2.address();
3027
+ const info2 = server2.address();
3011
3028
  for (const [path, route] of context.sockets) {
3012
3029
  try {
3013
3030
  logger10.info(`creating ws server for [${path}]. max connections: ${route.maxConnections ?? "<unlimited>"}, origin filters: ${route.originFilters ? JSON.stringify(route.originFilters, regexAwareReplacer) : "<none>"}`);
3014
3031
  const wss = new import_ws.WebSocketServer({ noServer: true });
3015
- const endpoint = `${ssl ? "wss" : "ws"}://${localIp}:${info.port}${path}`;
3032
+ const endpoint = `${ssl ? "wss" : "ws"}://${localIp}:${info2.port}${path}`;
3016
3033
  const handler = await route.factory({ endpoint, wss, storage: context.storage });
3017
3034
  const pingInterval = route.ping;
3018
3035
  if (pingInterval) {
@@ -3035,7 +3052,7 @@ var Factory = async (options) => {
3035
3052
  logger10.warn(`failed to init route ${path}`, e);
3036
3053
  }
3037
3054
  }
3038
- logger10.info(`http server listening on ${info.address}:${info.port}`);
3055
+ logger10.info(`http server listening on ${info2.address}:${info2.port}`);
3039
3056
  resolve(server2);
3040
3057
  });
3041
3058
  server2.on("upgrade", (req, socket, head) => {