@interopio/bridge 0.0.4-beta.2 → 0.0.4-beta.4
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/bin/bridge.js +1 -1
- package/changelog.md +18 -0
- package/dist/index.js +5 -0
- package/dist/main.js +29 -9
- package/dist/main.js.map +2 -2
- package/package.json +12 -4
- package/readme.md +7 -3
package/bin/bridge.js
CHANGED
package/changelog.md
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
# Change Log
|
|
4
4
|
|
|
5
|
+
## 0.0.4-beta.4 (2025-08-29)
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- update readme
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- empty types for '@interopio/bridge/main'
|
|
12
|
+
|
|
13
|
+
## 0.0.4-beta.3 (2025-08-28)
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- upgrade @interopio/gateway-server to 0.8.1-beta.2
|
|
17
|
+
- updated visibility rules for embedded gateway
|
|
18
|
+
- index.js now throws error when users try to import '@interopio/bridge'
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
- export for main.js to allow import '@interopio/bridge/main' using 'node:worker_threads' or 'node:child_process'
|
|
22
|
+
|
|
5
23
|
## 0.0.4-beta.2 (2025-08-26)
|
|
6
24
|
|
|
7
25
|
### Changed
|
package/dist/index.js
ADDED
package/dist/main.js
CHANGED
|
@@ -1208,7 +1208,7 @@ function parseVersion(version) {
|
|
|
1208
1208
|
// package.json
|
|
1209
1209
|
var package_default = {
|
|
1210
1210
|
name: "@interopio/bridge",
|
|
1211
|
-
version: "0.0.4-beta.
|
|
1211
|
+
version: "0.0.4-beta.4",
|
|
1212
1212
|
license: "see license in license.md",
|
|
1213
1213
|
author: "interop.io",
|
|
1214
1214
|
homepage: "https://docs.interop.io/bridge",
|
|
@@ -1223,7 +1223,13 @@ var package_default = {
|
|
|
1223
1223
|
exports: {
|
|
1224
1224
|
"./package.json": "./package.json",
|
|
1225
1225
|
".": {
|
|
1226
|
-
|
|
1226
|
+
default: "./dist/index.js"
|
|
1227
|
+
},
|
|
1228
|
+
"./main": {
|
|
1229
|
+
import: {
|
|
1230
|
+
types: "./types/main.d.ts",
|
|
1231
|
+
default: "./dist/main.js"
|
|
1232
|
+
}
|
|
1227
1233
|
}
|
|
1228
1234
|
},
|
|
1229
1235
|
bin: {
|
|
@@ -1232,10 +1238,12 @@ var package_default = {
|
|
|
1232
1238
|
scripts: {
|
|
1233
1239
|
test: "mocha test --recursive",
|
|
1234
1240
|
"build:types": "tsc --declaration --emitDeclarationOnly --outDir types",
|
|
1235
|
-
build: "esbuild src/main.mts --outdir=dist --bundle --packages=external --sourcemap --platform=node --format=esm --target=
|
|
1241
|
+
"build:main": "esbuild src/main.mts --outdir=dist --bundle --packages=external --sourcemap --platform=node --format=esm --target=node20.15",
|
|
1242
|
+
"build:index": "esbuild src/index.ts --outdir=dist --target=node20.15",
|
|
1243
|
+
build: "npm run build:main && npm run build:index"
|
|
1236
1244
|
},
|
|
1237
1245
|
dependencies: {
|
|
1238
|
-
"@interopio/gateway-server": "^0.8.1-beta.
|
|
1246
|
+
"@interopio/gateway-server": "^0.8.1-beta.2",
|
|
1239
1247
|
dotenv: "^17.2.1",
|
|
1240
1248
|
jsrsasign: "^11.1.0",
|
|
1241
1249
|
nanoid: "^5.0.9"
|
|
@@ -2125,13 +2133,25 @@ var BridgeNode = class {
|
|
|
2125
2133
|
},
|
|
2126
2134
|
contexts: {
|
|
2127
2135
|
lifetime: this.config.gateway.contexts.lifetime,
|
|
2128
|
-
visibility: [
|
|
2136
|
+
visibility: [
|
|
2137
|
+
{ context: /___channel___.+/, restrictions: "cluster" },
|
|
2138
|
+
{ context: /T42\..*/, restrictions: "local" },
|
|
2139
|
+
{ context: "___platform_prefs___", restrictions: "local" },
|
|
2140
|
+
{ restrictions: "cluster" }
|
|
2141
|
+
]
|
|
2142
|
+
},
|
|
2143
|
+
methods: {
|
|
2144
|
+
visibility: [
|
|
2145
|
+
{ method: /T42\..*/, restrictions: "local" },
|
|
2146
|
+
{ restrictions: "cluster" }
|
|
2147
|
+
]
|
|
2129
2148
|
},
|
|
2130
2149
|
peers: {
|
|
2131
|
-
visibility: [
|
|
2132
|
-
domain: "
|
|
2133
|
-
restrictions: "
|
|
2134
|
-
|
|
2150
|
+
visibility: [
|
|
2151
|
+
{ domain: "context", restrictions: "cluster" },
|
|
2152
|
+
{ domain: "interop", restrictions: "cluster" },
|
|
2153
|
+
{ domain: "bus", restrictions: "local" }
|
|
2154
|
+
]
|
|
2135
2155
|
}
|
|
2136
2156
|
};
|
|
2137
2157
|
}
|
package/dist/main.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/utils/uuid.ts", "../src/utils/network.ts", "../src/utils/internal/IpAddressUtil.ts", "../src/cluster/Address.ts", "../src/config/Properties.ts", "../src/config/DiscoveryConfig.ts", "../src/logging.ts", "../src/kubernetes/KubernetesDiscoveryStrategyFactory.ts", "../src/kubernetes/KubernetesConfig.ts", "../src/discovery/settings.ts", "../src/kubernetes/KubernetesProperties.ts", "../src/kubernetes/KubernetesApiProvider.ts", "../src/kubernetes/KubernetesClient.ts", "../src/kubernetes/KubernetesEndpointResolver.ts", "../src/config/NamedDiscoveryConfig.ts", "../src/config/KubernetesConfig.ts", "../src/config/Config.ts", "../src/discovery/SimpleDiscoveryNode.ts", "../src/kubernetes/KubernetesApiEndpointResolver.ts", "../src/kubernetes/KubernetesDiscoveryStrategy.ts", "../src/discovery/multicast/MulticastDiscoveryStrategy.ts", "../src/discovery/multicast/MulticastProperties.ts", "../src/discovery/multicast/MulticastDiscoveryStrategyFactory.ts", "../src/discovery/index.ts", "../src/version/MemberVersion.ts", "../package.json", "../src/instance/AddressPicker.ts", "../src/instance/BridgeNode.ts", "../src/license/types.ts", "../src/license/LicenseValidator.ts", "../src/license/BridgeLicenseValidator.ts", "../../bridge-mesh/src/mesh/connections.ts", "../../bridge-mesh/src/mesh/relays.ts", "../../bridge-mesh/src/mesh/rest-directory/routes.ts", "../../bridge-mesh/src/mesh/ws/relays/core.ts", "../../bridge-mesh/src/mesh/ws/cluster/core.ts", "../../bridge-mesh/src/index.ts", "../src/main.mts"],
|
|
4
|
-
"sourcesContent": ["import {nanoid} from 'nanoid';\n\nexport function newUUID() : string {\n return nanoid();\n}\n", "import {networkInterfaces} from 'node:os';\nimport {ADDRCONFIG, type LookupAddress} from 'node:dns';\nimport {lookup, lookupService} from 'node:dns/promises';\n\nimport {textToNumericFormatV4, textToNumericFormatV6} from './internal/IpAddressUtil.ts';\nimport {readFileSync} from \"node:fs\";\n\nconst INET_ADDRESS_V4_SIZE = 4;\n\nclass IpAddress {\n readonly address: string;\n readonly family: 4 | 6;\n private _hostname?: string;\n\n constructor(host: string | undefined, address: string, family: 4 | 6) {\n this._hostname = host;\n this.address = address;\n this.family = family;\n }\n\n get addressBytes(): Uint8Array {\n if (this.family === 4) {\n return textToNumericFormatV4(this.address);\n }\n //return textToNumericFormatV6(this.address);\n }\n\n async getHost(): Promise<string> {\n if (!this._hostname) {\n this._hostname = (await lookupService(this.address, 0)).hostname;\n }\n return this._hostname;\n }\n\n async getIpAddress(nonLoopback: boolean = false): Promise<LookupAddress> {\n const hints = nonLoopback ? ADDRCONFIG : undefined;\n return await lookup(this.address, {family: this.family, hints: hints});\n }\n}\n\nexport type {IpAddress};\n\nexport function isLoopback(address: IpAddress): boolean {\n return address.family === 4 && address.address.startsWith('127.') || address.family === 6 && address.address.startsWith('::1');\n}\n\nexport async function getByName(host: string): Promise<IpAddress> {\n const {address, family} = await lookup(host, {family: 4});\n if (family !== 4 && family !== 6) {\n throw new Error('unexpected address type');\n }\n return new IpAddress(undefined, address, family);\n}\n\nlet _anyLocalAddress: IpAddress;\n\nexport function anyLocalAddress(): IpAddress {\n if (!_anyLocalAddress) {\n _anyLocalAddress = getByAddress('0.0.0.0', 0);\n }\n return _anyLocalAddress;\n}\n\nexport function getByAddress(host: string, bytes: Uint8Array | number): IpAddress {\n if (typeof bytes === 'number') {\n const n = bytes;\n bytes = new Uint8Array(INET_ADDRESS_V4_SIZE);\n new DataView(bytes.buffer).setInt32(0, n);\n }\n const family = bytes.length === INET_ADDRESS_V4_SIZE ? 4 : 6;\n const address = Array.from(bytes).join('.');\n return new IpAddress(host, address, family);\n}\n\nexport async function resolveByAddress(host: string, address: string): Promise<IpAddress> {\n const byName = await getByName(address);\n // todo: check if address and host names are correct\n return new IpAddress(host, byName.address, byName.family);\n}\n\nexport async function getAllByName(host: string): Promise<IpAddress[]> {\n const addresses = await lookup(host, {all: true});\n return addresses.map(({address, family}) => {\n if (family !== 4 && family !== 6) {\n throw new Error('unexpected address type');\n }\n return new IpAddress(undefined, address, family);\n });\n}\n\nexport interface NetworkInterface {\n name: string\n loopback: boolean\n addresses: Array<IpAddress>\n}\n\nexport function getNetworkInterfaces(): NetworkInterface[] {\n return Object.entries(networkInterfaces()).map(([name, addresses]) => {\n return {\n name,\n loopback: addresses.some(info => info.internal),\n addresses: addresses.map(info => {\n return new IpAddress(undefined, info.address, info.family === 'IPv6' ? 6 : 4);\n })\n };\n });\n}\n\nfunction soMaxConn() {\n let somaxconn;\n if (process.platform === 'win32') {\n somaxconn = 200;\n }\n else if (process.platform === 'darwin') {\n somaxconn = 128;\n }\n else {\n somaxconn = 4096;\n }\n\n try {\n somaxconn = parseInt(readFileSync('/proc/sys/net/core/somaxconn').toString());\n } catch (error) {\n // todo log\n }\n return somaxconn;\n}\n\nexport const SOMAXCONN = soMaxConn();\n\n", "const DOT = '.'.charCodeAt(0);\nconst INET_ADDRESS_V4_SIZE = 4;\nconst INET_ADDRESS_V6_SIZE = 16;\nconst BYTE_SIZE = 2; // 8 bits in hex\nconst COLON = ':'.charCodeAt(0);\n\nexport function textToNumericFormatV4(address: string): Uint8Array {\n const result = new Uint8Array(4);\n const len = address.length;\n if (len == 0 || len > 15) {\n return;\n }\n\n let currentValue = 0;\n let currentByte = 0;\n let newByte = true;\n for (let i = 0; i < len; i++) {\n const ch = address.charCodeAt(i);\n if (ch === DOT) {\n if (newByte || currentValue < 0 || currentValue > 0xff || currentByte > 3) {\n return;\n }\n result[currentByte++] = currentValue & 0xff;\n currentValue = 0;\n newByte = true;\n } else {\n const digit = ch - 48;\n if (digit < 0) {\n return;\n }\n currentValue *= 10;\n currentValue += digit;\n newByte = false;\n }\n }\n if (newByte || currentValue < 0 || currentValue >= (1 << ((4 - currentByte) * 8))) {\n return;\n }\n\n switch (currentByte) {\n case 0:\n result[0] = (currentValue >> 24) & 0xff;\n //fall through\n case 1:\n result[1] = (currentValue >> 16) & 0xff;\n //fall through\n case 2:\n result[2] = (currentValue >> 8) & 0xff;\n //fall through\n case 3:\n result[3] = (currentValue >> 0) & 0xff;\n }\n return result;\n}\n\nexport function textToNumericFormatV6(address: string): Uint8Array {\n if (address.length < 2) {\n return;\n }\n\n // let colonp: number;\n // let char: number;\n // let saw_xdigit: boolean;\n // let val: number;\n // const dst = new Uint8Array(INET_ADDRESS_V6_SIZE);\n //\n // const srcb_length = address.length;\n // const pc = src.indexOf('%');\n // if (pc === srcb_length -1) {\n // return;\n // }\n //\n // colonp = -1;\n //\n // let i = 0, j = 0;\n // /* Leading :: requires some special handling. */\n // if (address.charAt(i) === ':')\n // if (address.charAt(++i) !== ':')\n // return;\n // curtok = i;\n // saw_xdigit = false;\n // val = 0;\n // while (i < srcb_length) {\n // const ch = address.charCodeAt(i++);\n // const chval = ch - 48;\n // if (chval !== -1) {\n // val <<= 4;\n // val |= chval;\n // if (val > 0xffff)\n // return;\n // saw_xdigit = true;\n // continue;\n // }\n // if (ch == ':') {\n // curtok = i;\n // if (!saw_xdigit) {\n // if (colonp != -1)\n // return null;\n // colonp = j;\n // continue;\n // } else if (i == srcb_length) {\n // return null;\n // }\n // if (j + INT16SZ > INADDR16SZ)\n // return null;\n // dst[j++] = (byte) ((val >> 8) & 0xff);\n // dst[j++] = (byte) (val & 0xff);\n // saw_xdigit = false;\n // val = 0;\n // continue;\n // }\n // if (ch == '.' && ((j + BYTE_SIZE) <= INET_ADDRESS_V6_SIZE)) {\n // const ia4 = address.substring(curtok, srcb_length);\n // /* check this IPv4 address has 3 dots, ie. A.B.C.D */\n // let dot_count = 0, index=0;\n // while ((index = ia4.indexOf ('.', index)) != -1) {\n // dot_count ++;\n // index ++;\n // }\n // if (dot_count != 3) {\n // return null;\n // }\n // const v4addr = textToNumericFormatV4(ia4);\n // if (v4addr == null) {\n // return null;\n // }\n // for (let k = 0; k < INET_ADDRESS_V4_SIZE; k++) {\n // dst[j++] = v4addr[k];\n // }\n // saw_xdigit = false;\n // break; /* '\\0' was seen by inet_pton4(). */\n // }\n // return null;\n // }\n // if (saw_xdigit) {\n // if (j + INT16SZ > INADDR16SZ)\n // return null;\n // dst[j++] = (byte) ((val >> 8) & 0xff);\n // dst[j++] = (byte) (val & 0xff);\n // }\n //\n // if (colonp != -1) {\n // const n = j - colonp;\n //\n // if (j == INADDR16SZ)\n // return null;\n // for (i = 1; i <= n; i++) {\n // dst[INADDR16SZ - i] = dst[colonp + n - i];\n // dst[colonp + n - i] = 0;\n // }\n // j = INADDR16SZ;\n // }\n // if (j != INADDR16SZ)\n // return null;\n // const newdst = convertFromIPv4MappedAddress(dst);\n // if (newdst != null) {\n // return newdst;\n // } else {\n // return dst;\n // }\n}\n", "import {getByName, type IpAddress} from '../utils/network.ts';\nimport {type Comparator, compareArrays} from '../utils/collections.ts';\n\nexport type Address = Readonly<{\n type: 4 | 6,\n host: string,\n port: number,\n address: IpAddress\n}>;\nexport function addressAsString(address: Pick<Address, 'host' | 'port' | 'type'>): string {\n // todo: do better for ipv6\n return `${address.host}:${address.port}`;\n}\nexport async function toIpAddress(address: Address): Promise<IpAddress> {\n return await getByName(scopedHost(address));\n}\n\nexport async function fromHostname(hostname: string, port: number): Promise<Address> {\n return new AddressImpl(hostname, await getByName(hostname), port);\n}\nexport function fromIpAddress(address: IpAddress, port: number): Address {\n\n return new AddressImpl(undefined, address, port);\n}\n\nclass AddressImpl {\n readonly type: 4 | 6;\n readonly host: string;\n readonly port: number;\n readonly address: IpAddress;\n\n constructor(hostname: string | undefined, ipAddress: IpAddress, port : number) {\n const type = ipAddress.family;\n if (type !== 4 && type !== 6) {\n throw new Error('unexpected address type');\n }\n this.type= type;\n this.host = hostname ?? ipAddress.address;\n this.port = port;\n this.address = ipAddress;\n }\n}\n\nfunction scopedHost(address: Address): string {\n if (address.type === 6) {\n return `[${address.host}]`;\n }\n return address.host;\n}\n\nexport const compareAddress: Comparator<Address> = (a1: Address, a2: Address) => {\n const addressBytes1 = a1.address.addressBytes;\n const addressBytes2 = a2.address.addressBytes;\n const result = compareArrays(addressBytes1, 0, addressBytes1.length, addressBytes2, 0, addressBytes2.length, (b1, b2) => {\n return b1 === b2 ? 0 : (b1 > b2 ? 1 : -1);\n });\n if (result !== 0) {\n return result;\n }\n\n return a1.port === a2.port ? 0 : (a1.port > a2.port ? 1 : -1);\n}\n", "export interface PropertyDefinition {\n readonly key: string\n readonly optional: boolean\n readonly converter: PropertyTypeConverter<PropertyType>\n}\n\nexport type PropertyType = string | number | boolean;\nexport type Properties = { [key: string]: PropertyType };\n\nexport interface PropertyTypeConverter<T extends PropertyType> {\n convert(value: unknown): T\n}\n\nexport const BOOLEAN = new class implements PropertyTypeConverter<boolean> {\n convert(value: unknown): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n else if (typeof value === \"string\") {\n return value.toLowerCase() === \"true\";\n }\n throw new Error(\"Cannot convert value to boolean: \" + value);\n }\n};\n\nexport const STRING = new class implements PropertyTypeConverter<string> {\n convert(value: unknown): string {\n if (value === undefined) {\n throw new Error(\"Cannot convert undefined \");\n }\n return String(value);\n }\n}\n\nexport const NUMBER = new class implements PropertyTypeConverter<number> {\n convert(value: unknown): number {\n if (value === undefined) {\n throw new Error(\"Cannot convert undefined \");\n }\n if (typeof value === \"object\") {\n throw new Error(\"Cannot convert object/array to number: \" + value);\n }\n return Number(value);\n }\n}\n\nexport function property<T extends PropertyType>(name: string, converter: PropertyTypeConverter<T>): PropertyDefinition {\n return {key: name, optional: true, converter: converter};\n}\n", "import type {DiscoveryServiceFactory, DiscoveryStrategyFactory} from '../discovery/index.ts';\nimport type {Properties} from './Properties.ts';\n\nexport interface DiscoveryStrategyConfig {\n readonly discoveryStrategyFactory?: DiscoveryStrategyFactory\n readonly properties: Properties\n}\nexport interface DiscoveryConfig {\n readonly discoveryStrategyConfigs: ReadonlyArray<DiscoveryStrategyConfig>\n readonly discoveryServiceFactory?: DiscoveryServiceFactory\n}\n\nexport class DefaultDiscoveryConfig implements DiscoveryConfig\n{\n discoveryStrategyConfigs: DiscoveryStrategyConfig[] = [];\n discoveryServiceFactory?: DiscoveryServiceFactory;\n\n get enabled() {\n return this.discoveryStrategyConfigs.length > 0;\n }\n}\n", "import {IOGateway} from '@interopio/gateway';\n\nexport type Logger = ReturnType<typeof IOGateway.Logging.getLogger>;\n\nexport default function getLogger(name: string): Logger {\n return IOGateway.Logging.getLogger(`gateway.bridge.${name}`);\n}\n", "import {type DiscoveryNode, type DiscoveryStrategyFactory, DiscoveryStrategyPriorities} from '../discovery/index.ts';\nimport {stat} from 'node:fs/promises';\nimport {lookup} from 'node:dns/promises'\nimport {KubernetesDiscoveryStrategy} from './KubernetesDiscoveryStrategy.ts';\nimport type {Properties, PropertyDefinition} from '../config/Properties.ts';\nimport {\n EXPOSE_EXTERNALLY, KUBERNETES_API_TOKEN,\n KUBERNETES_MASTER_URL,\n NAMESPACE, POD_LABEL_NAME, POD_LABEL_VALUE, RESOLVE_NOT_READY_ADDRESSES,\n SERVICE_DNS,\n SERVICE_LABEL_NAME,\n SERVICE_LABEL_VALUE,\n SERVICE_NAME, SERVICE_PORT\n} from './KubernetesProperties.ts';\nimport {type ClusterTopologyIntentTracker} from '../instance/ClusterTopologyIntentTracker.ts';\nimport {type Logger} from '../logging.ts';\n\nconst PROPERTY_DEFINITIONS: ReadonlyArray<PropertyDefinition> = [\n SERVICE_DNS,\n SERVICE_NAME,\n SERVICE_LABEL_NAME,\n SERVICE_LABEL_VALUE,\n NAMESPACE,\n POD_LABEL_NAME,\n POD_LABEL_VALUE,\n RESOLVE_NOT_READY_ADDRESSES,\n EXPOSE_EXTERNALLY,\n KUBERNETES_MASTER_URL,\n KUBERNETES_API_TOKEN,\n SERVICE_PORT\n];\n\nexport class KubernetesDiscoveryStrategyFactory implements DiscoveryStrategyFactory {\n private readonly tokenPath: string;\n readonly priority = DiscoveryStrategyPriorities.PLATFORM;\n constructor(tokenPath = '/var/run/secrets/kubernetes.io/serviceaccount/token') {\n this.tokenPath = tokenPath;\n }\n\n private async defaultKubernetesMasterReachable() {\n try {\n await lookup('kubernetes.default.svc');\n return true;\n } catch (e) {\n // todo log that io.Bridge running on Kubernetes, but \"kubernetes.default.svc\" is not reachable.\n return false;\n }\n }\n\n async tokenFileExists(){\n try {\n await stat(this.tokenPath);\n return true;\n } catch (e) {\n return false;\n }\n }\n\n async isAutoDetectionApplicable() {\n return await this.tokenFileExists() && await this.defaultKubernetesMasterReachable()\n }\n\n newDiscoveryStrategy(node: DiscoveryNode | undefined, logger: Logger, properties: Properties) {\n const tracker = node?.properties.get(\"internal.discovery.cluster.topology.intent.tracker\");\n return new KubernetesDiscoveryStrategy(logger, properties, tracker as ClusterTopologyIntentTracker | undefined);\n }\n\n getConfigurationProperties(): ReadonlyArray<PropertyDefinition> {\n return PROPERTY_DEFINITIONS;\n }\n}\n", "import { readFileSync} from 'node:fs';\nimport { getOrDefault, getOrUndefined } from '../discovery/settings.ts';\nimport {\n KUBERNETES_API_TOKEN,\n KUBERNETES_MASTER_URL,\n KUBERNETES_ENV_PREFIX,\n NAMESPACE,\n RESOLVE_NOT_READY_ADDRESSES,\n SERVICE_DNS,\n SERVICE_NAME,\n SERVICE_PORT,\n EXPOSE_EXTERNALLY,\n SERVICE_LABEL_NAME,\n SERVICE_LABEL_VALUE,\n POD_LABEL_NAME,\n POD_LABEL_VALUE,\n SERVICE_PER_POD_LABEL_NAME, SERVICE_PER_POD_LABEL_VALUE\n} from './KubernetesProperties.ts';\nimport {type Properties} from '../config/Properties.ts';\n\nexport type DiscoveryMode = 'kubernetes-api' | 'dns-lookup';\nexport type ExposeExternallyMode = 'auto' | 'enabled' | 'disabled';\n\nfunction readFileContents(fileName: string): string {\n return readFileSync(fileName, 'utf-8').toString();\n}\n\n\nexport class KubernetesConfig {\n readonly serviceDns?: string\n\n readonly serviceName?: string\n readonly serviceLabelName?: string\n readonly serviceLabelValue?: string\n readonly namespace: string\n readonly podLabelName?: string\n readonly podLabelValue?: string\n readonly resolveNotReadyAddresses: boolean\n readonly exposeExternallyMode: ExposeExternallyMode\n readonly servicePerPodLabelName?: string\n readonly servicePerPodLabelValue?: string\n readonly kubernetesMasterUrl: string\n readonly kubernetesApiToken?: string\n\n readonly servicePort: number\n private readonly fileContentsReader: (fileName: string) => string;\n\n readonly tokenProvider: () => string;\n\n constructor(properties: Properties, fileContentsReader: (fileName: string) => string = readFileContents) {\n this.fileContentsReader = fileContentsReader;\n this.serviceDns = getOrDefault(properties, KUBERNETES_ENV_PREFIX, SERVICE_DNS);\n this.serviceName = getOrDefault(properties, KUBERNETES_ENV_PREFIX, SERVICE_NAME);\n this.serviceLabelName = getOrUndefined(properties, KUBERNETES_ENV_PREFIX, SERVICE_LABEL_NAME);\n this.serviceLabelValue = getOrDefault(properties, KUBERNETES_ENV_PREFIX, SERVICE_LABEL_VALUE, \"true\");\n this.resolveNotReadyAddresses = getOrDefault(properties, KUBERNETES_ENV_PREFIX, RESOLVE_NOT_READY_ADDRESSES, true);\n this.podLabelName = getOrUndefined(properties, KUBERNETES_ENV_PREFIX, POD_LABEL_NAME);\n this.podLabelValue = getOrUndefined(properties, KUBERNETES_ENV_PREFIX, POD_LABEL_VALUE);\n\n this.exposeExternallyMode = this.getExposeExternallyMode(properties);\n this.servicePerPodLabelName = getOrUndefined(properties, KUBERNETES_ENV_PREFIX, SERVICE_PER_POD_LABEL_NAME);\n this.servicePerPodLabelValue = getOrUndefined(properties, KUBERNETES_ENV_PREFIX, SERVICE_PER_POD_LABEL_VALUE);\n this.kubernetesMasterUrl = getOrDefault(properties, KUBERNETES_ENV_PREFIX, KUBERNETES_MASTER_URL, \"https://kubernetes.default.svc\");\n this.tokenProvider = this.buildTokenProvider(properties);\n this.servicePort = getOrDefault(properties, KUBERNETES_ENV_PREFIX, SERVICE_PORT, 0);\n this.namespace = this.getNamespaceWithFallbacks(properties);\n }\n\n private getExposeExternallyMode(properties: Properties): ExposeExternallyMode {\n const exposeExternally: boolean | undefined = getOrUndefined<boolean>(properties, KUBERNETES_ENV_PREFIX, EXPOSE_EXTERNALLY);\n if (exposeExternally === undefined) {\n return 'auto';\n }\n else if (exposeExternally) {\n return 'enabled';\n }\n else {\n return 'disabled';\n }\n }\n\n private getNamespaceWithFallbacks(properties: Properties): string {\n let namespace: string | undefined = getOrDefault(properties, KUBERNETES_ENV_PREFIX, NAMESPACE);\n if (!namespace) {\n namespace = process.env['KUBERNETES_NAMESPACE'];\n }\n if (!namespace && this.mode === 'kubernetes-api') {\n namespace = this.readNamespace();\n }\n return namespace;\n }\n\n private buildTokenProvider(properties: {}): () => string {\n const apiToken: string | undefined = getOrUndefined(properties, KUBERNETES_ENV_PREFIX, KUBERNETES_API_TOKEN);\n if (!apiToken && this.mode === 'kubernetes-api') {\n return () => readFileContents('/var/run/secrets/kubernetes.io/serviceaccount/token')\n } else {\n return () => apiToken;\n }\n }\n\n private readNamespace(): string {\n return this.fileContentsReader('/var/run/secrets/kubernetes.io/serviceaccount/namespace');\n }\n\n\n get mode(): DiscoveryMode {\n if (this.serviceDns) {\n return 'dns-lookup';\n }\n return 'kubernetes-api';\n }\n\n toString() {\n return \"KubernetesConfig: {\"\n + \"service-dns: \" + this.serviceDns\n + \", service-name: \" + this.serviceName\n + \", service-port: \" + this.servicePort\n + \", service-label-name: \" + this.serviceLabelName\n + \", service-label-value: \" + this.serviceLabelValue\n + \", namespace: \" + this.namespace\n + \", pod-label-name: \" + this.podLabelName\n + \", pod-label-value: \" + this.podLabelValue\n + \", resolve-not-ready-addresses: \" + this.resolveNotReadyAddresses\n + \", expose-externally-mode: \" + this.exposeExternallyMode\n + \", service-per-pod-label-name: \" + this.servicePerPodLabelName\n + \", service-per-pod-label-value: \" + this.servicePerPodLabelValue\n + \", kubernetes-master-url: \" + this.kubernetesMasterUrl + \"}\";\n }\n}\n", "import {type Properties, type PropertyDefinition, type PropertyType} from '../config/Properties.ts';\n\nfunction getProperty(prefix: string, property: PropertyDefinition) {\n let s = prefix;\n if (!s.endsWith('.')) {\n s += '.';\n }\n return s + property.key;\n}\n\nfunction readProperty(prefix: string | undefined, property: PropertyDefinition): PropertyType | undefined {\n if (prefix) {\n const p = getProperty(prefix, property);\n const v = process.env[p];\n // todo convert\n return v;\n }\n}\n\nexport function getOrUndefined<T extends PropertyType>(properties: Properties, prefix: string, property?: PropertyDefinition): T | undefined {\n return getOrDefault(properties, prefix, property);\n}\n\nexport function getOrDefault<T extends PropertyType>(properties: Properties, prefix: string, property?: PropertyDefinition, defaultValue?: T) {\n if (property === undefined) {\n return defaultValue;\n }\n\n let value = readProperty(prefix, property);\n if (value === undefined) {\n value = properties[property.key];\n }\n if (value === undefined) {\n return defaultValue;\n }\n return value as T;\n}\n", "import {BOOLEAN, NUMBER, property, STRING} from '../config/Properties.ts';\n\nexport const KUBERNETES_ENV_PREFIX = 'io.bridge.kubernetes';\n\n\n\n\nexport const SERVICE_DNS = property<string>('service-dns', STRING);\nexport const SERVICE_NAME = property<string>('service-name', STRING);\nexport const SERVICE_LABEL_NAME = property<string>('service-label-name', STRING);\nexport const SERVICE_LABEL_VALUE = property<string>('service-label-value', STRING);\nexport const NAMESPACE = property<string>('namespace', STRING);\nexport const POD_LABEL_NAME = property<string>('pod-label-name', STRING);\nexport const POD_LABEL_VALUE = property<string>('pod-label-value', STRING);\nexport const EXPOSE_EXTERNALLY = property<boolean>('expose-externally', BOOLEAN);\nexport const SERVICE_PER_POD_LABEL_NAME = property<string>('service-per-pod-label-name', STRING);\nexport const SERVICE_PER_POD_LABEL_VALUE = property<string>('service-per-pod-label-value', STRING);\nexport const RESOLVE_NOT_READY_ADDRESSES = property<boolean>('resolve-not-ready-addresses', BOOLEAN);\n\nexport const KUBERNETES_MASTER_URL = property<string>('kubernetes-master', STRING);\nexport const KUBERNETES_API_TOKEN = property<string>('api-token', STRING);\nexport const SERVICE_PORT = property<number>('service-port', NUMBER);\n", "import {Endpoint, EndpointAddress} from './KubernetesClient.ts';\n\nexport interface KubernetesApiProvider {\n getEndpointsByNameUrlString(kubernetesMaster: string, namespace: string, endpointName: string): string;\n\n getEndpointsByServiceLabelUrlString(kubernetesMaster: string, namespace: string, serviceLabel: string): string;\n\n parseEndpoints(param: any): Endpoint[];\n}\n\nexport class KubernetesApiEndpointSlicesProvider implements KubernetesApiProvider {\n getEndpointsByServiceLabelUrlString(kubernetesMaster: string, namespace: string, param: string): string {\n return `${kubernetesMaster}/apis/discovery.k8s.io/v1/namespaces/${namespace}/endpointslices?${param}`;\n }\n\n getEndpointsByNameUrlString(kubernetesMaster: string, namespace: string, endpointName: string): string {\n return `${kubernetesMaster}/apis/discovery.k8s.io/v1/namespaces/${namespace}/endpointslices?labelSelector=kubernetes.io/service-name=${endpointName}`;\n }\n\n parseEndpoints(param: {\n items: Array<{ endpoints: Array<{ conditions: { ready: boolean }, addresses: Array<string> }>, ports: Array<{}> }>\n }): Endpoint[] {\n const endpoints = new Array<Endpoint>();\n for (const item of param.items) {\n endpoints.push(...this.parseEndpointSlices(item));\n }\n return endpoints;\n }\n\n private parseEndpointSlices(item: {\n endpoints: Array<{\n conditions: {\n ready: boolean\n },\n addresses: Array<string>\n }>,\n ports: Array<{name?: string, port?: number}>\n }): Endpoint[] {\n const addresses = new Array<Endpoint>();\n const endpointPort = this.extractPort(item);\n for (const endpoint of item.endpoints) {\n const ready = endpoint.conditions.ready;\n for (const address of endpoint.addresses) {\n addresses.push(new Endpoint(new EndpointAddress({ip: address, port: endpointPort}), undefined, ready))\n }\n\n }\n return addresses;\n }\n\n private extractPort(item: {\n ports: Array<{\n name?: string,\n port?: number\n\n }>\n }): number | undefined {\n for (const port of item.ports) {\n const bridgeServicePort = port.name;\n if (bridgeServicePort && bridgeServicePort === 'io-bridge') {\n const servicePort = port.port;\n if (servicePort !== undefined) {\n return servicePort;\n }\n }\n }\n if (item.ports.length === 1) {\n const port = item.ports[0];\n const servicePort = port.port;\n if (servicePort !== undefined) {\n return servicePort;\n }\n }\n }\n}\n", "import {type ExposeExternallyMode} from './KubernetesConfig.ts';\nimport {KubernetesApiEndpointSlicesProvider, type KubernetesApiProvider} from './KubernetesApiProvider.ts';\nimport {type ClusterTopologyIntentTracker} from '../instance/ClusterTopologyIntentTracker.ts';\n\nclass Address {\n readonly ip: string;\n\n readonly port?: number;\n\n constructor(ip: string, port?: number) {\n this.ip = ip;\n this.port = port;\n }\n}\n\nexport type {Address};\n\nexport class EndpointAddress {\n readonly targetRefName?: string;\n\n private readonly address: Address;\n\n constructor(address: Address, targetRefName?: string) {\n this.address = address;\n this.targetRefName = targetRefName;\n }\n\n get ip(): string {\n return this.address.ip;\n }\n\n get port(): number | undefined {\n return this.address.port;\n }\n}\n\nexport class Endpoint {\n\n readonly privateAddress: EndpointAddress;\n readonly publicAddress: EndpointAddress | undefined = undefined;\n readonly ready: boolean;\n readonly additionalProperties: ReadonlyMap<string, string> = new Map();\n\n constructor(privateAddress: EndpointAddress,\n publicAddress: EndpointAddress | undefined = undefined,\n ready: boolean,\n additionalProperties: ReadonlyMap<string, string> = new Map()) {\n this.privateAddress = privateAddress;\n this.publicAddress = publicAddress;\n this.ready = ready;\n this.additionalProperties = additionalProperties;\n }\n}\n\nconst READ_TIMEOUT_SECONDS = 10;\n\nfunction isReady(podItemStatus: { containerStatuses?: Array<{ ready?: boolean }> }): boolean {\n for (const containerStatus of podItemStatus.containerStatuses) {\n if (containerStatus.ready !== true) {\n return false;\n }\n }\n return true;\n}\n\nfunction containerPort(container: {\n ports?: Array<{\n containerPort?: number\n }>\n}): number | undefined {\n const ports = container.ports;\n if (ports.length > 0) {\n const port = ports[0];\n return port.containerPort;\n }\n}\n\nfunction extractContainerPort(item: {\n spec: {\n containers?: Array<{ name?: string, ports?: Array<{ containerPort?: number }> }>\n }\n}): number | undefined {\n const containers = item.spec.containers;\n if (containers.length === 1) {\n const container = containers[0];\n return containerPort(container);\n } else {\n for (const container of containers) {\n if (container.name === 'io-bridge') {\n return containerPort(container);\n }\n }\n }\n}\n\nfunction parsePodsList(podList: {\n items?: Array<{\n metadata: {\n name: string\n },\n status: {\n podIP?: string\n containerStatuses?: Array<{ ready?: boolean }>\n },\n spec: {}\n }>\n}): Array<Endpoint> {\n const addresses = new Array<Endpoint>();\n for (const item of podList.items) {\n const podName = item.metadata.name;\n const status = item.status;\n const ip = status.podIP;\n if (ip) {\n const port = extractContainerPort(item);\n addresses.push(new Endpoint(new EndpointAddress({ip, port}, podName), undefined, isReady(status)));\n }\n }\n return addresses;\n}\n\nfunction getLabelSelectorParameter(labelNames: string, labelValues: string): string {\n const labelNameArray = labelNames.split(',');\n const labelValueArray = labelValues.split(',');\n const selectorList = [];\n for (let i = 0; i < labelNameArray.length; i++) {\n selectorList[i] = (`${labelNameArray[i]}=${labelValueArray[i]}`);\n }\n return `labelSelector=${selectorList.join(',')}`;\n}\n\nexport class KubernetesClient {\n\n private readonly namespace: string;\n private readonly kubernetesMaster: string;\n private readonly exposeExternallyMode: ExposeExternallyMode;\n private readonly tokenProvider: () => string;\n private readonly servicePerPodLabelName?: string;\n private readonly servicePerPodLabelValue?: string;\n private readonly clientTopologyIntentTracker?: ClusterTopologyIntentTracker;\n private readonly apiProvider: KubernetesApiProvider\n\n /*testing*/\n constructor(namespace: string,\n kubernetesMaster: string,\n exposeExternallyMode: ExposeExternallyMode,\n tokenProvider: () => string,\n servicePerPodLabelName?: string,\n servicePerPodLabelValue?: string,\n clientTopologyIntentTracker?: ClusterTopologyIntentTracker,\n apiProvider?: KubernetesApiProvider) {\n\n this.namespace = namespace;\n this.kubernetesMaster = kubernetesMaster;\n this.exposeExternallyMode = exposeExternallyMode;\n this.tokenProvider = tokenProvider;\n this.servicePerPodLabelName = servicePerPodLabelName;\n this.servicePerPodLabelValue = servicePerPodLabelValue;\n if (clientTopologyIntentTracker) {\n clientTopologyIntentTracker.init();\n }\n this.apiProvider = apiProvider ?? new KubernetesApiEndpointSlicesProvider();\n }\n\n start(): void {\n\n }\n\n destroy(): void {\n if (this.clientTopologyIntentTracker) {\n this.clientTopologyIntentTracker.destroy();\n }\n }\n\n /**\n * Returns POD addresses in the specified namespace.\n *\n */\n async endpoints(): Promise<Endpoint[]> {\n try {\n const url = `${this.kubernetesMaster}/api/v1/namespaces/${this.namespace}/pods`;\n return this.enrichWithPublicAddresses(parsePodsList(await this.callGet(url)));\n } catch (e) {\n return this.handleUnknownError(e);\n }\n }\n\n /**\n * Retrieves POD addresses for all services in the specified namespace filtered by service labels and values.\n * @param serviceLabels comma separated list of service labels\n * @param serviceLabelValues comma separated list of service label values\n * @return all POD addresses from the specified namespace filtered by labels\n */\n async endpointsByServiceLabel(serviceLabels: string, serviceLabelValues: string): Promise<Endpoint[]> {\n try {\n const param = getLabelSelectorParameter(serviceLabels, serviceLabelValues);\n const url = this.apiProvider.getEndpointsByServiceLabelUrlString(this.kubernetesMaster, this.namespace, param);\n return this.enrichWithPublicAddresses(this.apiProvider.parseEndpoints(this.callGet(url)));\n } catch (e) {\n return this.handleUnknownError(e);\n }\n }\n\n /**\n * Retrieves POD addresses from the specified namespace and given endpointName.\n * @param endpointName endpoint name\n * @return all POD addresses from the specified namespace and the given endpointName\n */\n async endpointsByName(endpointName: string): Promise<Endpoint[]> {\n try {\n const url = this.apiProvider.getEndpointsByNameUrlString(this.kubernetesMaster, this.namespace, endpointName);\n return this.enrichWithPublicAddresses(this.apiProvider.parseEndpoints(await this.callGet(url)));\n } catch (e) {\n return this.handleUnknownError(e);\n }\n }\n\n /**\n * Retrieves POD addresses for all services in the specified namespace filtered by pod labels and values.\n * @param podLabels comma separated list of pod labels\n * @param podLabelValues comma separated list of pod label values\n * @return all POD addresses from the specified namespace filtered by the labels\n */\n async endpointsByPodLabel(podLabels: string, podLabelValues: string) {\n try {\n const param = getLabelSelectorParameter(podLabels, podLabelValues);\n const url = `${this.kubernetesMaster}/api/v1/namespaces/${this.namespace}/pods?${param}`;\n return this.enrichWithPublicAddresses(parsePodsList(await this.callGet(url)));\n } catch (e) {\n return this.handleUnknownError(e);\n }\n }\n\n private enrichWithPublicAddresses(endpoints: Endpoint[]): Endpoint[] {\n if (this.exposeExternallyMode === 'disabled') {\n return endpoints;\n }\n\n }\n\n private handleUnknownError(e): Endpoint[] {\n // todo handle error\n return [];\n }\n\n private async callGet(url: string): Promise<any> {\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort(`request to ${url} timed out`);\n }, READ_TIMEOUT_SECONDS * 1000);\n try {\n const response = await fetch(url, {\n signal: controller.signal,\n headers: [[\"Authorization\", `Bearer ${this.tokenProvider()}`]]\n }).catch((err) => {\n throw err;\n });\n\n return await response.json();\n\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n", "import {type DiscoveryNode} from '../discovery/index.ts';\nimport {getByName} from '../utils/network.ts';\nimport type {Logger} from '../logging.ts';\n\nconst DNS_RETRY = 5;\n\nexport abstract class KubernetesEndpointResolver {\n protected readonly logger: Logger;\n constructor(logger: Logger) {\n this.logger = logger;\n }\n async start() {\n // do nothing\n }\n\n abstract resolve(): Promise<DiscoveryNode[]>\n\n async close() {\n // do nothing\n }\n\n protected async mapAddress(address?: string) {\n if (!address) {\n return;\n }\n\n try {\n let retry = 0;\n try {\n return await getByName(address);\n } catch (e) {\n if (retry < DNS_RETRY) {\n retry++;\n } else {\n throw e;\n }\n }\n } catch (e) {\n // todo log address cloud not be resolved\n }\n\n }\n}\n", "export abstract class NamedDiscoveryConfig<T extends NamedDiscoveryConfig<T>> {\n readonly tag;\n private _enabled: boolean = false;\n\n constructor(tag: string) {\n this.tag = tag;\n }\n\n setEnabled(enabled: boolean): T {\n this._enabled = enabled;\n return this as unknown as T;\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n}\n", "import { NamedDiscoveryConfig } from './NamedDiscoveryConfig.ts';\n\nexport class KubernetesConfig extends NamedDiscoveryConfig<KubernetesConfig> {\n constructor() {\n super(\"kubernetes\");\n }\n}\n", "import {type Properties, type PropertyType} from './Properties.ts';\nimport {KubernetesConfig} from './KubernetesConfig.ts';\nimport {\n DefaultDiscoveryConfig,\n type DiscoveryConfig\n} from './DiscoveryConfig.ts';\n\nexport class AutoDetectionConfig {\n enabled: boolean = true;\n}\n\nexport interface MulticastConfig {\n readonly group: string\n readonly port: number\n}\n\nclass DefaultMulticastConfig implements MulticastConfig {\n enabled: boolean = false;\n group: string = '239.1.2.3';\n port: number = 34567;\n}\n\nexport interface TcpIpConfig {\n members: string[]\n}\n\nclass DefaultTcpIpConfig implements TcpIpConfig {\n enabled: boolean = false;\n members: string[] = [];\n}\n\nexport class JoinConfig {\n private _multicast = new DefaultMulticastConfig();\n private _tcpIp = new DefaultTcpIpConfig();\n private _kubernetes = new KubernetesConfig();\n private _discovery = new DefaultDiscoveryConfig();\n private _autoDetection = new AutoDetectionConfig();\n\n get discovery(): DiscoveryConfig {\n return this._discovery;\n }\n\n get multicast(): MulticastConfig {\n return this._multicast;\n }\n\n get autoDetectionEnabled(): boolean {\n return this._autoDetection.enabled\n && !this._multicast.enabled\n && !this._tcpIp.enabled\n && !this._kubernetes.enabled\n && !this._discovery.enabled;\n }\n}\n\nexport class NetworkConfig {\n public static readonly DEFAULT_PORT: number = 8383;\n port: number = NetworkConfig.DEFAULT_PORT;\n reuseAddress: boolean;\n publicAddress?: string;\n join = new JoinConfig();\n\n constructor() {\n this.reuseAddress = process.platform !== \"win32\";\n }\n}\n\nexport class CorsConfig {\n #allowOrigin?: '*' | string[] = undefined;\n set allowOrigin(value: string | undefined) {\n if (value !== undefined) {\n if (value === '*') {\n this.#allowOrigin = value;\n } else if (Array.isArray(value)) {\n this.#allowOrigin = value;\n } else {\n this.#allowOrigin = value.split(',')\n }\n }\n }\n\n get allowOrigin(): '*' | string[] | undefined {\n return this.#allowOrigin;\n }\n\n allowCredentials: boolean = false;\n}\n\nexport class ServerConfig {\n port?: number = undefined;\n host?: string = undefined;\n cors = new CorsConfig();\n auth: {\n type: 'none' | 'basic' | 'oauth2',\n basic?: {\n realm?: string\n }\n } = {\n type: 'none',\n basic: {\n realm: 'io.Bridge'\n }\n };\n wsPingInterval?: number = 30000; // 30 seconds\n}\n\nexport class MeshConfig {\n timeout?: number\n}\n\nexport class GatewayConfig {\n enabled?: boolean;\n contexts: {\n lifetime: 'retained' | 'ref-counted' | 'ownership'\n } = {lifetime: 'retained'};\n}\n\nexport class Config {\n properties: Properties = {};\n network = new NetworkConfig();\n license: string\n readonly server: ServerConfig;\n readonly mesh: MeshConfig;\n readonly gateway: GatewayConfig;\n\n constructor() {\n this.server = new ServerConfig();\n this.mesh = new MeshConfig();\n this.gateway = new GatewayConfig();\n }\n\n get<T extends PropertyType>(name: string): T {\n const value = this.properties[name] as T;\n return value;\n }\n\n set<T extends PropertyType>(name: string, value: T): this {\n this.properties[name] = value;\n return this;\n }\n}\n", "import {type DiscoveryNode} from './index.ts';\nimport {type Address} from '../cluster/Address.ts';\n\nexport class SimpleDiscoveryNode implements DiscoveryNode {\n readonly privateAddress: Address;\n readonly publicAddress: Address;\n readonly properties: ReadonlyMap<string, unknown>;\n constructor(privateAddress: Address, publicAddress?: Address, properties?: ReadonlyMap<string, unknown>)\n {\n this.privateAddress = privateAddress;\n this.publicAddress = publicAddress ?? privateAddress;\n this.properties = properties ?? new Map();\n }\n}\n", "import {Endpoint, EndpointAddress, KubernetesClient} from './KubernetesClient.ts';\nimport {type DiscoveryNode} from '../discovery/index.ts';\nimport {type Address, fromIpAddress} from '../cluster/Address.ts';\nimport {type Logger} from '../logging.ts';\nimport {KubernetesEndpointResolver} from './KubernetesEndpointResolver.ts';\nimport {KubernetesConfig} from './KubernetesConfig.ts';\nimport {NetworkConfig} from '../config/Config.ts';\nimport {type ClusterTopologyIntentTracker} from '../instance/ClusterTopologyIntentTracker.ts';\nimport {SimpleDiscoveryNode} from '../discovery/SimpleDiscoveryNode.ts';\n\nfunction buildKubernetesClient(config: KubernetesConfig, clusterTopologyIntentTracker?: ClusterTopologyIntentTracker): KubernetesClient {\n return new KubernetesClient(config.namespace, config.kubernetesMasterUrl, config.exposeExternallyMode, config.tokenProvider, config.servicePerPodLabelName, config.servicePerPodLabelValue, clusterTopologyIntentTracker);\n}\n\nexport class KubernetesApiEndpointResolver extends KubernetesEndpointResolver {\n\n private readonly client: KubernetesClient;\n private readonly serviceName?: string;\n private readonly port: number = 0;\n private readonly serviceLabel?: string;\n private readonly serviceLabelValue?: string;\n private readonly podLabel?: string;\n private readonly podLabelValue?: string;\n private readonly resolveNotReadyAddresses?: boolean;\n\n static of(logger: Logger, config: KubernetesConfig, tracker?: ClusterTopologyIntentTracker): KubernetesApiEndpointResolver {\n return new KubernetesApiEndpointResolver(logger, buildKubernetesClient(config, tracker),\n config.serviceName, config.servicePort, config.serviceLabelName,\n config.serviceLabelValue, config.podLabelName, config.podLabelValue, config.resolveNotReadyAddresses);\n }\n\n /*testing*/ constructor(logger: Logger,\n client: KubernetesClient,\n serviceName?: string,\n port: number = 0,\n serviceLabel?: string,\n serviceLabelValue?: string,\n podLabel?: string,\n podLabelValue?: string,\n resolveNotReadyAddresses?: boolean) {\n super(logger);\n this.client = client;\n this.serviceName = serviceName;\n this.port = port;\n this.serviceLabel = serviceLabel;\n this.serviceLabelValue = serviceLabelValue;\n this.podLabel = podLabel;\n this.podLabelValue = podLabelValue;\n this.resolveNotReadyAddresses = resolveNotReadyAddresses;\n }\n\n async resolve(): Promise<DiscoveryNode[]> {\n if (this.serviceName) {\n return await this.getSimpleDiscoveryNodes(await this.client.endpointsByName(this.serviceName));\n }\n else if (this.serviceLabel) {\n return await this.getSimpleDiscoveryNodes(await this.client.endpointsByServiceLabel(this.serviceLabel, this.serviceLabelValue));\n }\n else if (this.podLabel) {\n return await this.getSimpleDiscoveryNodes(await this.client.endpointsByPodLabel(this.podLabel, this.podLabelValue));\n }\n return await this.getSimpleDiscoveryNodes(await this.client.endpoints());\n }\n\n private async getSimpleDiscoveryNodes(endpoints: readonly Endpoint[]): Promise<DiscoveryNode[]> {\n const discoveredNodes = new Array<DiscoveryNode>();\n for (const endpoint of endpoints) {\n await this.addAddress(discoveredNodes, endpoint);\n }\n return discoveredNodes;\n }\n\n private async addAddress(discoveredNodes: Array<DiscoveryNode>, endpoint: Endpoint): Promise<void> {\n if (this.resolveNotReadyAddresses === true || endpoint.ready) {\n const privateAddress = await this.createAddress(endpoint.privateAddress, this.resolvePort.bind(this));\n const publicAddress = await this.createAddress(endpoint.publicAddress, this.resolvePortPublic.bind(this));\n discoveredNodes.push(new SimpleDiscoveryNode(privateAddress, publicAddress, new Map<string, string>()));\n }\n }\n\n private async createAddress(address: EndpointAddress | undefined, portResolver: (address: EndpointAddress) => number): Promise<Address> {\n if (address === undefined) {\n return undefined;\n }\n const ip = address.ip;\n const ipAddress = await this.mapAddress(ip);\n const port = portResolver(address);\n return fromIpAddress(ipAddress, port);\n }\n\n private resolvePort(address: EndpointAddress) {\n if (this.port > 0) {\n return this.port;\n }\n if (address.port) {\n\n return address.port;\n }\n return NetworkConfig.DEFAULT_PORT;\n }\n\n private resolvePortPublic(address: EndpointAddress) {\n if (address.port) {\n return address.port;\n }\n if (this.port > 0) {\n return this.port;\n }\n return NetworkConfig.DEFAULT_PORT;\n }\n}\n", "import {type DiscoveryNode, type DiscoveryStrategy} from '../discovery/index.ts';\nimport {KubernetesConfig} from './KubernetesConfig.ts';\nimport {KubernetesApiEndpointResolver} from './KubernetesApiEndpointResolver.ts';\nimport {KubernetesEndpointResolver} from './KubernetesEndpointResolver.ts';\nimport {type ClusterTopologyIntentTracker} from '../instance/ClusterTopologyIntentTracker.ts';\nimport {type Logger} from '../logging.ts';\n\nexport class KubernetesDiscoveryStrategy implements DiscoveryStrategy {\n private readonly logger: Logger;\n private readonly endpointResolver: KubernetesEndpointResolver;\n\n constructor(logger: Logger, properties: {[key: string]: string | number | boolean}, intentTracker?: ClusterTopologyIntentTracker) {\n this.logger = logger;\n const config = new KubernetesConfig(properties);\n this.logger.info(`${config}`);\n this.endpointResolver = KubernetesApiEndpointResolver.of(this.logger, config, intentTracker);\n this.logger.info(`Kubernetes Discovery activated with mode: ${config.mode}`);\n }\n async start() {\n await this.endpointResolver.start();\n }\n\n async discover(): Promise<Iterable<DiscoveryNode> | undefined> {\n return undefined\n }\n\n async close() {\n await this.endpointResolver.close();\n }\n}\n", "import {createSocket, type RemoteInfo, Socket} from 'node:dgram';\nimport {type DiscoveryNode, type DiscoveryStrategy} from '../index.ts';\nimport {SimpleDiscoveryNode} from '../SimpleDiscoveryNode.ts';\nimport {type Properties} from '../../config/Properties.ts';\nimport {GROUP, PORT} from './MulticastProperties.ts';\nimport {getOrDefault} from '../settings.ts';\nimport {fromHostname, toIpAddress} from '../../cluster/Address.ts';\nimport {isLoopback} from '../../utils/network.ts';\nimport {type Logger} from '../../logging.ts';\n\nconst DATA_OUTPUT_BUFFER_SIZE = 64 * 1024;\nconst DEFAULT_MULTICAST_PORT = 34567;\nconst DEFAULT_MULTICAST_GROUP = '239.1.2.3';\nconst SOCKET_TIME_TO_LIVE = 255; // unrestricted (other possible values would be 1 (local-network), 15 (site-local), 32(local-area), 64(regional), 128(global))\n\ninterface MulticastMemberInfo {\n readonly host: string;\n readonly port: number;\n}\n\nfunction multicastDiscoverySender(discoveryNode: DiscoveryNode | undefined, socket: Socket, group: string, port: number): () => void {\n let multicastMemberInfo: MulticastMemberInfo;\n if (discoveryNode) {\n const address = discoveryNode.publicAddress;\n multicastMemberInfo = {host: address.host, port: address.port};\n }\n const msg: Buffer = Buffer.from(JSON.stringify(multicastMemberInfo));\n\n return () => {\n socket.send(msg, port, group, (error) => {\n console.error(error);\n });\n }\n}\n\nfunction multicastDiscoveryReceiver(socket: Socket): () => Promise<MulticastMemberInfo> {\n return () => {\n return new Promise<MulticastMemberInfo>((resolve, reject) => {\n socket.on('message', (message: Buffer, remote: RemoteInfo) => {\n resolve(JSON.parse(message as unknown as string));\n });\n socket.on('error', (err: Error) => {\n reject(err);\n });\n });\n }\n}\n\nexport class MulticastDiscoveryStrategy implements DiscoveryStrategy {\n private readonly logger: Logger;\n private readonly properties: Properties;\n private readonly discoveryNode?: DiscoveryNode;\n private isClient?: boolean;\n private discoverySender?: () => void;\n private discoveryReceiver?: () => Promise<MulticastMemberInfo>;\n private sendIntervalId?: ReturnType<typeof setInterval>;\n private socket?: Socket;\n constructor(discoveryNode: DiscoveryNode | undefined,\n logger: Logger,\n properties: Properties) {\n this.logger = logger;\n this.properties = properties;\n this.discoveryNode = discoveryNode;\n }\n\n private async initializeMulticastSocket() {\n const port = getOrDefault(this.properties, '', PORT, DEFAULT_MULTICAST_PORT);\n if (port < 0 || port > 65535) {\n throw new Error('port number must be between 0 and 65535');\n }\n const group = getOrDefault(this.properties, '', GROUP, DEFAULT_MULTICAST_GROUP);\n this.socket = createSocket({\n type: 'udp4',\n reuseAddr: true,\n recvBufferSize: DATA_OUTPUT_BUFFER_SIZE,\n sendBufferSize: DATA_OUTPUT_BUFFER_SIZE});\n\n if (this.discoveryNode) {\n const address = await toIpAddress(this.discoveryNode.privateAddress);\n if (!isLoopback(address)) {\n this.socket.setMulticastInterface(address.address);\n }\n }\n\n this.socket.bind(port, () => {\n this.socket.setMulticastTTL(SOCKET_TIME_TO_LIVE);\n this.socket.addMembership(group);\n });\n\n this.discoverySender = multicastDiscoverySender(this.discoveryNode, this.socket, group, port);\n this.discoveryReceiver = multicastDiscoveryReceiver(this.socket);\n if (this.discoveryNode == null) {\n this.isClient = true;\n }\n }\n\n async discover(): Promise<Iterable<DiscoveryNode> | undefined> {\n const multicastMemberInfo = await this.discoveryReceiver();\n if (multicastMemberInfo) {\n const list = [];\n try {\n const discoveryNode = new SimpleDiscoveryNode(await fromHostname(multicastMemberInfo.host, multicastMemberInfo.port));\n list.push(discoveryNode);\n }\n catch (e) {\n if (this.logger.enabledFor('trace')) {\n this.logger.debug(e.message);\n }\n }\n return list;\n }\n }\n\n async start() {\n await this.initializeMulticastSocket();\n if (!this.isClient) {\n this.sendIntervalId = setInterval(() => {\n this.discoverySender();\n }, 2000);\n }\n }\n\n async close() {\n if (this.sendIntervalId) {\n clearInterval(this.sendIntervalId);\n delete this.sendIntervalId;\n }\n return new Promise<void>((resolve, reject) => {\n if (this.socket)\n {\n this.socket.close(() => {\n resolve()\n });\n }\n else\n {\n resolve();\n }\n });\n\n }\n\n}\n", "import {NUMBER, property, STRING} from '../../config/Properties.ts';\n\nexport const PORT = property<number>('port', NUMBER);\nexport const GROUP = property<string>('group', STRING);\n", "import {\n type DiscoveryNode,\n type DiscoveryStrategy,\n type DiscoveryStrategyFactory,\n DiscoveryStrategyPriorities\n} from '../index.ts';\nimport {MulticastDiscoveryStrategy} from './MulticastDiscoveryStrategy.ts';\nimport {GROUP, PORT} from './MulticastProperties.ts';\nimport {type Properties, type PropertyDefinition} from '../../config/Properties.ts';\nimport {type Logger} from '../../logging.ts';\n\nconst PROPERTY_DEFINITIONS: ReadonlyArray<PropertyDefinition> = [\n GROUP,\n PORT\n];\n\nexport class MulticastDiscoveryStrategyFactory implements DiscoveryStrategyFactory {\n readonly priority = DiscoveryStrategyPriorities.UNKNOWN;\n newDiscoveryStrategy(discoveryNode: DiscoveryNode, logger: Logger, prop: Properties): DiscoveryStrategy {\n return new MulticastDiscoveryStrategy(discoveryNode, logger, prop);\n }\n\n async isAutoDetectionApplicable(): Promise<boolean> {\n return false;\n }\n\n getConfigurationProperties(): ReadonlyArray<PropertyDefinition> {\n return PROPERTY_DEFINITIONS;\n }\n}\n", "import {type Address} from '../cluster/Address.ts';\nimport {type Properties, type PropertyDefinition} from '../config/Properties.ts';\nimport {type DiscoveryConfig, type DiscoveryStrategyConfig} from '../config/DiscoveryConfig.ts';\nimport {type Logger} from '../logging.ts';\nimport {KubernetesDiscoveryStrategyFactory} from '../kubernetes/KubernetesDiscoveryStrategyFactory.ts';\nimport {MulticastDiscoveryStrategyFactory} from './multicast/MulticastDiscoveryStrategyFactory.ts';\n\nexport interface DiscoveryServiceFactory {\n newDiscoveryService(settings: DiscoveryServiceSettings): DiscoveryService\n}\n\nexport interface DiscoveryService {\n start(): Promise<void>\n discover(): Promise<Iterable<DiscoveryNode>>\n close(): Promise<void>\n}\n\n\nexport type DiscoveryServiceSettings = {\n readonly node: Promise<DiscoveryNode>\n readonly mode: DiscoveryMode\n readonly conf: DiscoveryConfig\n readonly auto: boolean\n readonly logger: Logger\n}\n\nexport type DiscoveryMode = 'member' | 'client';\n\nexport class DefaultDiscoveryServiceFactory implements DiscoveryServiceFactory {\n newDiscoveryService(settings: DiscoveryServiceSettings): DiscoveryService {\n return new DefaultDiscoveryService(settings);\n }\n}\n\nfunction verifyNoUnknownProperties(mappedProperties: Properties, allProperties: Properties) {\n const unknownProperties = Object.keys(allProperties).filter(key => !mappedProperties.hasOwnProperty(key));\n if (unknownProperties.length > 0) {\n throw new Error(`Unknown properties: ${unknownProperties.join(', ')} on discovery strategy`);\n }\n}\n\nfunction prepareProperties(properties: Properties,\n propertyDefinitions: readonly PropertyDefinition[]) {\n const mappedProperties: Properties = {};\n for (const propertyDefinition of propertyDefinitions) {\n const propertyKey = propertyDefinition.key;\n if (properties[propertyKey] == undefined) {\n if (!propertyDefinition.optional) {\n throw new Error(`Missing required property: ${propertyKey} on discovery strategy`);\n }\n continue;\n }\n const value = properties[propertyKey];\n const converter = propertyDefinition.converter;\n const mappedValue = converter.convert(value);\n\n mappedProperties[propertyKey] = mappedValue;\n }\n\n verifyNoUnknownProperties(mappedProperties, properties);\n return mappedProperties;\n\n}\n\nexport class DefaultDiscoveryService implements DiscoveryService {\n private readonly settings: DiscoveryServiceSettings;\n private readonly strategies: Array<DiscoveryStrategy> = [];\n constructor(settings: DiscoveryServiceSettings) {\n this.settings = settings;\n }\n\n async start(): Promise<void> {\n this.strategies.push(...await this.loadDiscoveryStrategies());\n for (const strategy of this.strategies) {\n await strategy.start();\n }\n }\n\n async discover(): Promise<Iterable<DiscoveryNode>> {\n const discoveryNodes = new Set<DiscoveryNode>();\n for (const strategy of this.strategies) {\n const candidates = await strategy.discover();\n if (candidates) {\n for (const candidate of candidates) {\n if (this.validateCandidate(candidate)) {\n discoveryNodes.add(candidate);\n }\n }\n }\n\n }\n\n return discoveryNodes;\n }\n\n async close(): Promise<void> {\n for (const strategy of this.strategies) {\n await strategy.close();\n }\n }\n\n private validateCandidate(candidate: DiscoveryNode) : boolean {\n // todo\n return true;\n }\n\n private async loadDiscoveryStrategies(): Promise<Iterable<DiscoveryStrategy>> {\n\n const discoveryStrategyConfigs = this.settings.conf.discoveryStrategyConfigs;\n const factories = this.collectFactories(discoveryStrategyConfigs);\n\n const discoveryStrategies = new Array<DiscoveryStrategy>();\n for (const config of discoveryStrategyConfigs) {\n const discoveryStrategy = await this.buildDiscoveryStrategy(config, factories);\n discoveryStrategies.push(discoveryStrategy);\n }\n const logger = this.settings.logger;\n if (discoveryStrategies.length == 0 && this.settings.auto) {\n logger.debug(`Discovery auto-detection enabled, trying to detect discovery strategy`);\n const autoDetectedFactory = await this.detectDiscoveryStrategyFactory(factories);\n if (autoDetectedFactory) {\n logger.debug(`Auto-detected discovery strategy: ${autoDetectedFactory.constructor.name}`);\n discoveryStrategies.push(autoDetectedFactory.newDiscoveryStrategy(await this.settings.node, logger, {}));\n }\n else {\n logger.debug(`No discovery strategy auto-detected`);\n }\n }\n return discoveryStrategies;\n }\n\n private collectFactories(strategyConfigs: ReadonlyArray<DiscoveryStrategyConfig>): DiscoveryStrategyFactory[] {\n\n const knownFactories = [new MulticastDiscoveryStrategyFactory(), new KubernetesDiscoveryStrategyFactory()]\n\n const factories = new Array<DiscoveryStrategyFactory>();\n\n for (const factory of knownFactories) {\n factories.push(factory);\n }\n\n for (const config of strategyConfigs) {\n const factory = config.discoveryStrategyFactory;\n if (factory) {\n factories.push(factory);\n }\n }\n\n return factories;\n }\n\n private async buildDiscoveryStrategy(config: DiscoveryStrategyConfig,\n factories: DiscoveryStrategyFactory[]): Promise<DiscoveryStrategy> {\n const discoveryNode = await this.settings.node;\n const logger = this.settings.logger;\n\n for (const factory of factories) {\n if (factory.constructor.name == config.discoveryStrategyFactory.constructor.name) {\n const properties = prepareProperties(config.properties, factory.getConfigurationProperties());\n return factory.newDiscoveryStrategy(discoveryNode, logger, properties);\n }\n }\n throw new Error('DiscoveryStrategyFactory not found');\n }\n\n private async detectDiscoveryStrategyFactory(factories: DiscoveryStrategyFactory[]) {\n let highestPriorityFactory: DiscoveryStrategyFactory;\n for (const factory of factories) {\n try {\n if (await factory.isAutoDetectionApplicable()) {\n if (highestPriorityFactory === undefined || factory.priority > highestPriorityFactory.priority) {\n highestPriorityFactory = factory;\n }\n }\n } catch (error) {\n // todo log error\n }\n }\n return highestPriorityFactory;\n }\n\n\n}\n\nexport interface DiscoveryStrategy {\n start(): Promise<void>\n discover(): Promise<Iterable<DiscoveryNode> | undefined>\n close(): Promise<void>\n}\n\nexport interface DiscoveryStrategyFactory {\n readonly priority: number\n isAutoDetectionApplicable(): Promise<boolean>\n newDiscoveryStrategy(node: DiscoveryNode, logger: Logger, settings: Properties): DiscoveryStrategy\n getConfigurationProperties(): ReadonlyArray<PropertyDefinition>\n}\nexport const DiscoveryStrategyPriorities = {\n UNKNOWN: 0,\n PLATFORM: 20,\n CUSTOM: 50,\n}\n\nexport interface DiscoveryNode {\n readonly publicAddress: Address;\n readonly privateAddress: Address;\n readonly properties: ReadonlyMap<string, unknown>;\n}\n", "function parse(version: string): [number, number, number] {\n // https://regex101.com/r/Ly7O1x/3/\n const pattern = /^(?<major>0|[1-9]\\d*)\\.(?<minor>0|[1-9]\\d*)\\.(?<patch>0|[1-9]\\d*)(?:-(?<prerelease>(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+(?<buildmetadata>[0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/g;\n\n const {groups} = pattern.exec(version);\n const major = parseInt(groups['major']);\n const minor = parseInt(groups['minor']);\n const patch = parseInt(groups['patch']);\n\n return [major, minor, patch];\n}\n\nclass MemberVersion {\n\n readonly major: number;\n readonly minor: number;\n readonly patch: number;\n\n public get isUnknown(): boolean {\n return this.major === 0 && this.minor === 0 && this.patch === 0;\n }\n\n public toString(): string {\n return `${this.major}.${this.minor}.${this.patch}`;\n }\n\n constructor(major: number, minor: number, patch: number) {\n this.major = major;\n this.minor = minor;\n this.patch = patch;\n }\n}\n\nexport const UNKNOWN_VERSION: MemberVersion = new MemberVersion(0, 0, 0);\n\nexport function parseVersion(version?: string): MemberVersion {\n if (!version || version.startsWith('0.0.0')) {\n return UNKNOWN_VERSION;\n }\n return new MemberVersion(...parse(version));\n}\n\nexport type {MemberVersion};\n", "{\n \"name\": \"@interopio/bridge\",\n \"version\": \"0.0.4-beta.2\",\n \"license\": \"see license in license.md\",\n \"author\": \"interop.io\",\n \"homepage\": \"https://docs.interop.io/bridge\",\n \"keywords\": [\n \"io.bridge\",\n \"bridge\",\n \"io.connect\",\n \"glue42\",\n \"interop.io\"\n ],\n \"type\": \"module\",\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \".\": {\n \"import\": \"./dist/index.js\"\n }\n },\n \"bin\": {\n \"bridge\": \"./bin/bridge.js\"\n },\n \"scripts\": {\n \"test\": \"mocha test --recursive\",\n \"build:types\": \"tsc --declaration --emitDeclarationOnly --outDir types\",\n \"build\": \"esbuild src/main.mts --outdir=dist --bundle --packages=external --sourcemap --platform=node --format=esm --target=es2024\"\n },\n \"dependencies\": {\n \"@interopio/gateway-server\": \"^0.8.1-beta.1\",\n \"dotenv\": \"^17.2.1\",\n \"jsrsasign\": \"^11.1.0\",\n \"nanoid\": \"^5.0.9\"\n },\n \"devDependencies\": {\n \"@types/jsrsasign\": \"^10.5.15\",\n \"@types/ws\": \"^8.18.1\",\n \"rand-seed\": \"^3.0.0\"\n },\n \"engines\": {\n \"node\": \">= 20.15 || >=22.2.0 || >=24.0\"\n }\n}\n", "import {type Address} from '../cluster/Address.ts';\nimport {getByName, getNetworkInterfaces, type IpAddress} from '../utils/network.ts';\nimport { type AddressInfo, Server, createServer} from 'node:net';\nimport { type Logger } from '../logging.ts';\nimport { type Config} from '../config/Config.ts';\n\nexport interface AddressPicker {\n pickAddress(): Promise<void>;\n getPublicAddressFor(endpoint: 'member' | 'client'): Address ;\n getServers(): ReadonlyMap<string, Server>;\n}\n\nasync function createAddress(addressDef: AddressDef, port: number): Promise<Address> {\n if (addressDef.host) {\n return {type: addressDef.ipAddress.family, host: addressDef.host, port, address: addressDef.ipAddress};\n }\n return {type: addressDef.ipAddress.family, host: await addressDef.ipAddress.getHost(), port, address: addressDef.ipAddress}\n}\n\nfunction createNetServer(logger: Logger, host: string, range: number | string): Promise<Server> {\n const ports = portRange(range);\n return new Promise((resolve, reject) => {\n let server = createServer({}, () => {});\n server.on('error', (err: Error) => {\n if (err['code'] === 'EADDRINUSE') {\n logger.debug(`port ${err['port']} already in use on address ${err['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) ${range} are in use. closing...`);\n server.close();\n reject(err);\n }\n } else {\n logger.error(`server error: ${err.message}`, err);\n reject(err);\n }\n });\n server.on('listening', () => {\n const info = server.address() as AddressInfo;\n logger.info(`listening on ${info.address}:${info.port}`);\n resolve(server);\n });\n try {\n const {value: port} = ports.next();\n server.listen(port, host);\n } catch (e) {\n logger.error(`error starting socket server`, e);\n reject(e instanceof Error ? e : new Error(`listen failed: ${e}`));\n }\n });\n}\n\nclass InterfaceAddress {\n readonly address: string;\n readonly host?: string;\n constructor(address: string, host?: string) {\n this.address = address;\n this.host = host;\n }\n}\n\nclass AddressDef extends InterfaceAddress {\n\n readonly ipAddress: IpAddress;\n readonly port: number;\n constructor(ipAddress: IpAddress, host?: string, port?: number) {\n super(ipAddress.address, host);\n this.ipAddress = ipAddress;\n this.port = port ?? 0;\n }\n}\n\nexport class DefaultAddressPicker implements AddressPicker {\n\n readonly #logger: Logger;\n readonly #config: Config;\n readonly #publicAddressConfig?: string;\n #publicAddress: Address;\n #bindAddress: Address;\n private server: Server;\n readonly #port: string | number;\n constructor(config: Config,\n logger: Logger)\n {\n this.#logger = logger;\n this.#config = config;\n this.#port = config.network.port;\n this.#publicAddressConfig = config.network.publicAddress;\n }\n\n async pickAddress(): Promise<void> {\n if (this.#publicAddress || this.#bindAddress)\n {\n return;\n }\n const publicAddressDef = await this.getPublicAddressByPortSearch();\n this.#publicAddress = this.#bindAddress;\n\n }\n\n getPublicAddressFor(endpoint: 'member' | 'client'): Address {\n return this.#publicAddress;\n }\n\n getServers(): ReadonlyMap<string, Server> {\n return new Map([['member', this.server]]);\n }\n\n private async getPublicAddressByPortSearch() {\n const bindAddressDef = await this.pickAddressDef();\n\n\n this.server = await createNetServer(this.#logger, '0.0.0.0', bindAddressDef.port === 0 ? this.#port: bindAddressDef.port);\n\n const port = (this.server.address() as AddressInfo).port;\n this.#bindAddress = await createAddress(bindAddressDef, port);\n\n return this.getPublicAddress(port);\n }\n\n private async getPublicAddress(port: number) {\n let address = this.#publicAddressConfig;\n if (address) {\n address = address.trim();\n if (!address) {\n throw new Error('Public address is empty');\n } else if ('127.0.0.1' === address) {\n return this.pickLoopbackAddressDef(address, port);\n }\n else\n {\n const ipAddress = await getByName(address);\n return new AddressDef(ipAddress, address, port);\n }\n }\n }\n\n private async pickAddressDef() {\n let addressDef = this.pickInterfaceAddressDef();\n if (addressDef) {\n\n }\n if (addressDef === undefined) {\n addressDef = await this.pickLoopbackAddressDef();\n }\n return addressDef;\n }\n\n private pickInterfaceAddressDef(): AddressDef {\n const interfaces = this.getInterfaces();\n if (interfaces) {\n const address = this.pickMatchingAddress(interfaces);\n if (address) {\n return address;\n }\n }\n return this.pickMatchingAddress();\n }\n\n private getInterfaces(): InterfaceAddress[] | undefined {\n return [];\n }\n\n private async pickLoopbackAddressDef(host?: string, defaultPort?: number) {\n const address = await getByName('127.0.0.1');\n return new AddressDef(address, host, defaultPort);\n }\n\n private match(ipAddress: IpAddress, interfaces: InterfaceAddress[]) {\n for (const iface of interfaces) {\n if (ipAddress.address === iface.address) {\n return iface;\n }\n }\n return undefined;\n }\n\n private getMatchingAddress(ipAddress: IpAddress, interfaces?: InterfaceAddress[]) {\n if (interfaces) {\n return this.match(ipAddress, interfaces);\n } else {\n return ipAddress;\n }\n }\n\n private pickMatchingAddress(interfaces?: InterfaceAddress[]): AddressDef | undefined {\n const preferIPv4 = true;\n const networkInterfaces = getNetworkInterfaces();\n let matchingAddress;\n for (const ni of networkInterfaces) {\n if (!interfaces && ni.loopback) {\n continue;\n }\n for (const ipAddress of ni.addresses) {\n if (preferIPv4 && ipAddress.family === 6) {\n continue;\n }\n const address = this.getMatchingAddress(ipAddress, interfaces);\n break;\n }\n }\n return matchingAddress;\n }\n}\n\n\n\n// stolen from gateway-server\n\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 */\nfunction* 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", "import {newUUID} from '../utils/uuid.ts';\nimport {DefaultDiscoveryServiceFactory, type DiscoveryService, type DiscoveryServiceSettings} from '../discovery/index.ts';\nimport {SimpleDiscoveryNode} from '../discovery/SimpleDiscoveryNode.ts';\nimport {type Member} from '../cluster/Member.ts';\nimport {type MemberVersion, parseVersion} from '../version/MemberVersion.ts';\nimport {type DiscoveryConfig} from '../config/DiscoveryConfig.ts';\nimport info from '../../package.json' with {type: 'json'};\nimport {type AddressPicker, DefaultAddressPicker} from './AddressPicker.ts';\nimport getLogger, {type Logger} from '../logging.ts';\nimport gatewayServer, {GatewayServer} from '@interopio/gateway-server';\nimport {Config} from '../config/Config.ts';\nimport {BridgeLicenseValidator} from \"../license/BridgeLicenseValidator.ts\";\nimport { type LicenseValidator} from \"../license/LicenseValidator.ts\";\nimport {userInfo} from 'node:os';\nimport {mesh} from '../../../bridge-mesh/src/index.ts';\n\nfunction logStartingInfo(logger: Logger) {\n logger.info(`Starting io.Bridge v${info.version} using Node.js ${process.version} with PID ${process.pid} (started by ${userInfo().username} in ${process.cwd()})`);\n}\n\nfunction createDiscoveryService(logger: Logger,\n conf: DiscoveryConfig,\n isAutoDetectionEnabled: boolean,\n localMember: Promise<Member>): DiscoveryService {\n const factory = new DefaultDiscoveryServiceFactory();\n\n const node = localMember.then(member => new SimpleDiscoveryNode(member.address)) ;\n\n const settings: DiscoveryServiceSettings = {\n mode: 'member',\n node: node,\n conf: conf,\n auto: isAutoDetectionEnabled,\n logger: logger,\n };\n return factory.newDiscoveryService(settings);\n}\n\nfunction createAddressPicker(node: BridgeNode): AddressPicker {\n const config = node.config;\n const logger = node.getLogger('AddressPicker');\n return new DefaultAddressPicker(config, logger);\n}\n\nexport class BridgeNode {\n readonly config: Config;\n private readonly uuid: string;\n private readonly discoveryService: DiscoveryService;\n private readonly version: MemberVersion;\n private server?: GatewayServer.Server;\n private readonly licenseValidator: LicenseValidator;\n\n constructor(config: Config) {\n this.config = config;\n\n this.licenseValidator = BridgeLicenseValidator(this.getLogger('license-validator'));\n this.licenseValidator.validate(config.license);\n\n this.uuid = newUUID();\n this.version = parseVersion(info.version);\n const addressPicker = createAddressPicker(this);\n\n\n const localMemberPromise: Promise<Member> = addressPicker.pickAddress()\n .then(() => addressPicker.getPublicAddressFor('member'))\n .then((publicAddress) => {\n return {\n local: true,\n address: publicAddress,\n uuid: this.uuid,\n version: this.version,\n };\n });\n\n const joinConfig = config.network.join;\n\n const isAutoDetectionEnabled = joinConfig.autoDetectionEnabled;\n\n const discoveryConfig: DiscoveryConfig = joinConfig.discovery;\n\n this.discoveryService = createDiscoveryService(getLogger(\"discovery-service\"), discoveryConfig, isAutoDetectionEnabled, localMemberPromise);\n }\n\n getLogger(name: string) {\n return getLogger(name);\n }\n\n private async scheduleLicenseCheck() {\n const task = async () => {\n try {\n this.licenseValidator.validate(this.config.license, {\n logSuccessMessages: false,\n });\n }\n catch (error) {\n // this.logger.error(error);\n await this.stop();\n }\n };\n\n const licenseCheckInterval = 1000 * 60 * 60 * 24; // 1 day\n return setInterval(task, licenseCheckInterval);\n }\n\n async start() {\n const config: GatewayServer.ServerConfig = {\n port: this.config.server.port,\n host: this.config.server.host,\n app: async (configurer, config) => {\n await mesh({\n logger: this.getLogger('mesh'),\n enabled: true,\n timeout: this.config.mesh.timeout ?? 60000, // 60 seconds\n socket: {\n ping: this.config.server.wsPingInterval ?? 30000, // 30 seconds\n }\n }, configurer, config);\n },\n auth: {type: 'none', ...this.config.server.auth},\n cors: this.config.server.cors\n };\n if (this.config.gateway.enabled) {\n config.gateway = {\n clients: {\n inactive_seconds: 0,\n },\n ping: this.config.server.wsPingInterval ?? undefined,\n mesh: {\n cluster: {\n endpoint: `http://localhost:${this.config.server.port}`,\n directory: {interval: 1000 * 30}, // 30 seconds\n }\n },\n contexts: {\n lifetime: this.config.gateway.contexts.lifetime,\n visibility: [{restrictions: 'cluster'}]\n },\n peers: {\n visibility: [{\n domain: 'interop',\n restrictions: 'local'\n }]\n }\n }\n }\n logStartingInfo(this.getLogger('node'));\n this.server = await gatewayServer(config);\n if (false) {\n await this.discoveryService.start();\n }\n await this.scheduleLicenseCheck();\n }\n\n async stop() {\n if (this.server)\n {\n await this.server.close()\n }\n try {\n await this.discoveryService.close();\n } catch (e) {\n // ignore\n }\n }\n}\n", "import type {Logger} from \"../logging.ts\";\n\nexport type LicenseValidatorOptions = {\n validationKey: string;\n logger?: Logger\n}\n\nexport type LicenseValidationOptions = {\n logSuccessMessages?: boolean\n};\n\nexport type LicensePayload = {\n \"type\": \"paid\" | \"trial\";\n \"expiration\": number // in milliseconds\n \"email\": string,\n \"issuedBy\": string;\n \"iat\": number; // in seconds\n \"licensee\": string;\n \"organization\": {\n \"displayName\": string,\n \"identifier\": string\n }\n}\n\nexport type LicenseEvaluationResult = {\n licenseType: 'paid' | 'trial' | 'none';\n expired: boolean;\n fatal: boolean;\n license?: LicensePayload;\n error?: string;\n}\n\n\nexport const licenseValidationResults = {\n TRIAL_LICENSE_EXPIRED: {licenseType: 'trial', expired: true, fatal: true} as LicenseEvaluationResult,\n TRIAL_LICENSE_VALID: {licenseType: 'trial', expired: false, fatal: false} as LicenseEvaluationResult,\n PAID_LICENSE_EXPIRED: {licenseType: 'paid', expired: true, fatal: false} as LicenseEvaluationResult,\n PAID_LICENSE_VALID: {licenseType: 'paid', expired: false, fatal: false} as LicenseEvaluationResult,\n NO_LICENSE: {licenseType: 'none', expired: false, fatal: true} as LicenseEvaluationResult,\n};", "import getLogger, {type Logger} from \"../logging.ts\";\nimport {\n type LicensePayload,\n type LicenseEvaluationResult,\n type LicenseValidatorOptions,\n licenseValidationResults, type LicenseValidationOptions\n} from \"./types.ts\";\nimport {KJUR} from 'jsrsasign';\n\nexport class LicenseError extends Error {\n public readonly licensePayload: LicensePayload | string;\n\n constructor(message: string, licensePayload: string | LicensePayload) {\n super(message);\n this.licensePayload = licensePayload;\n }\n}\n\nexport class LicenseEvaluator {\n private readonly tokenResultMap = {\n 'trial-false': licenseValidationResults.TRIAL_LICENSE_VALID,\n 'trial-true': licenseValidationResults.TRIAL_LICENSE_EXPIRED,\n 'paid-false': licenseValidationResults.PAID_LICENSE_VALID,\n 'paid-true': licenseValidationResults.PAID_LICENSE_EXPIRED,\n };\n\n private readonly validationKey: string;\n\n constructor(validationKey: string) {\n if (!validationKey || typeof validationKey !== 'string') {\n throw new Error(`Validation key must be a non-empty string`);\n }\n this.validationKey = validationKey;\n }\n\n private decrypt(token: string): object {\n if (KJUR.jws.JWS.verifyJWT(token, this.validationKey, {alg: ['RS256']})) {\n return KJUR.jws.JWS.parse(token).payloadObj;\n } else {\n throw new LicenseError('invalid jwt token', token);\n }\n }\n\n private validateBasicTokenData(token: string): LicensePayload {\n const decoded = this.decrypt(token) as LicensePayload;\n if (['paid', 'trial'].indexOf(decoded.type) === -1) {\n throw new LicenseError('Invalid license type', token);\n }\n return decoded;\n }\n\n getLicenseStatus(token: string, now: Date = new Date()): LicenseEvaluationResult {\n try {\n const license = this.validateBasicTokenData(token);\n const isExpired = license.expiration < now.getTime();\n const licenseValidationResult = this.tokenResultMap[`${license.type}-${isExpired}`];\n return {\n ...licenseValidationResult,\n license\n };\n } catch (e) {\n return {\n ...licenseValidationResults.NO_LICENSE,\n error: e.message,\n };\n }\n\n }\n}\n\nexport class LicenseValidator {\n private readonly licenseHelper: LicenseEvaluator;\n private readonly logger: Logger;\n\n constructor({validationKey, logger}: LicenseValidatorOptions) {\n this.licenseHelper = new LicenseEvaluator(validationKey);\n this.logger = logger ?? getLogger(\"LicenseValidator\"); // Default to console if no logger provided\n }\n\n public validate(licenseKeyString: string, options?: LicenseValidationOptions): void {\n if (typeof licenseKeyString !== 'string') {\n throw new LicenseError('Invalid license key format', licenseKeyString);\n }\n\n const licenseStatus = this.licenseHelper.getLicenseStatus(licenseKeyString);\n this.printLicenseMessage(licenseStatus, options?.logSuccessMessages ?? true);\n if (licenseStatus.fatal) {\n throw new LicenseError('License validation failed', licenseStatus.license);\n }\n }\n\n private printLicenseMessage(licenseStatus: LicenseEvaluationResult, logSuccessMessages: boolean): void {\n if (!licenseStatus || licenseStatus.licenseType === 'none') {\n this.logger.error('This license is invalid. Please contact us at sales@interop.io to get a valid license');\n return;\n }\n\n const message = [\n licenseStatus.licenseType === 'paid' ? `This is a paid license that was issued for client ` : `This is a trial license that was issued for `,\n licenseStatus.license.organization.displayName,\n licenseStatus.expired ? `, but it has expired at ` : ` and is valid until `,\n new Date(licenseStatus.license.expiration).toString(),\n '.'\n ].join('');\n\n if (licenseStatus.fatal) {\n this.logger.error(message);\n } else if (licenseStatus.expired) {\n this.logger.warn(message);\n } else if(logSuccessMessages) {\n this.logger.info(message);\n }\n }\n}", "import type {Logger} from \"../logging.ts\";\nimport {LicenseValidator} from \"./LicenseValidator.ts\";\n\nconst validationKey = `-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyyZrtwcQCMfyOkZDcjxZ\n+07BrvgcAvoQETF+ho8VLfaDxgNPZd6Q7jZEfrtv0+wn0pxx8pUDeBh8mCYvkwmb\n9tkFH47GJuDhWasNgyp4ugRX4bzoPV3SnHsBR4KJ/F76kBbike6sdIfO2lYGZ36s\nLJPHV7epOYsfhoc4343/vOxEPvNbwacbXWl4NsCGev4qUmWhe9iMpb/JPd3o4hIU\nSR31AmR2xoh3BkAJc2q/cSeQK6Kn9nZYocyW367+7FOvYsrOYotsuUASp0OWp+Lh\nWGfR7F6d016+u6kbvLvcceGztiP1u25QmPNCUmw49cTatthiEwwGHb01CR58mStZ\nxg5t9+N7X9hPO2K59b8EbOnnFTlwtMMF7MKR56S4YwMamCChr9WGgpOQV+lrqyx2\nyn9lwn8Yf4gLoLPKBEhHTEy6r/we9qymmlSSe4wr5Fctov2odSE535nvtdRYZkKk\nt32gOXuwnKg2kRlRSAErpyou1mz7/mWEt1H3sGTRArjNTP2KqZkc14vPToEEJt93\nZKjhD1pVEchDiWBOMj9o12pq80tGZ8PhGJasJVVi0JPUiaznG4r12JdyDAjuXMru\n6f4Tx0ULkdwn9ia7lchcq7xC2PlTnYz+fGpfU7V0Ci56QDTp6oP567L1EIeddkaI\nnIsi4KHT7Ctp047FTTelntUCAwEAAQ==\n-----END PUBLIC KEY-----`;\n\nexport const BridgeLicenseValidator = (logger: Logger) => new LicenseValidator({validationKey, logger});\n", "import {IOGateway} from '@interopio/gateway';\nimport type {Node, NodeConnection, NodeConnections} from './types.ts';\n\ntype NodeValue = Omit<Node, 'users'> & {\n users: Set<string>,\n memberId: number,\n lastAccess: number\n}\n\nexport default class InMemoryNodeConnections implements NodeConnections {\n readonly #logger: IOGateway.Logging.Logger;\n readonly #nodes = new Map<string, NodeValue>();\n readonly #nodesByEndpoint = new Map<string, string>();\n #memberIds: number = 0;\n readonly #timeout: number;\n\n constructor(logger: IOGateway.Logging.Logger,\n timeout: number = 60000) {\n this.#logger = logger;\n this.#timeout = timeout;\n }\n\n announce(nodes: Node[]): NodeConnection[] {\n for (const node of nodes) {\n const {node: nodeId, users, endpoint} = node;\n const foundId = this.#nodesByEndpoint.get(endpoint);\n if (foundId) {\n if (foundId !== nodeId) {\n this.#logger.warn(`endpoint ${endpoint} clash. replacing node ${foundId} with ${nodeId}`);\n this.#nodesByEndpoint.set(endpoint, nodeId);\n this.#nodes.delete(foundId);\n }\n } else {\n this.#logger.info(`endpoint ${endpoint} announced for ${nodeId}`);\n this.#nodesByEndpoint.set(endpoint, nodeId);\n }\n this.#nodes.set(nodeId, this.updateNode(node, new Set<string>(users ?? []), nodeId, this.#nodes.get(nodeId)));\n }\n this.cleanupOldNodes();\n const sortedNodes = this.sortedNodeValues();\n return nodes.map((e) => {\n const {node} = e;\n const connect = this.findConnections(sortedNodes, this.#nodes.get(node));\n return {node, connect};\n });\n }\n\n find(nodeId: string): Node[] | undefined {\n const e = this.#nodes.get(nodeId);\n if (e !== undefined) {\n const sortedNodes = this.sortedNodeValues();\n const {node} = e;\n return this.findConnections(sortedNodes, this.#nodes.get(node));\n }\n return undefined;\n }\n\n remove(nodeId: string) {\n const removed = this.#nodes.get(nodeId);\n if (removed !== undefined) {\n this.#nodes.delete(nodeId);\n const endpoint = removed.endpoint;\n this.#nodesByEndpoint.delete(endpoint);\n this.#logger.info(`endpoint ${endpoint} removed for ${nodeId}`);\n return true;\n }\n return false;\n }\n\n private updateNode(newNode: Node, users: Set<string>, _key: string, oldNode?: NodeValue): NodeValue {\n const node: Omit<NodeValue, 'lastAccess' | 'users'> = oldNode ?? {...newNode, memberId: this.#memberIds++};\n return {...node, users, lastAccess: Date.now()};\n }\n\n private sortedNodeValues() {\n return Array.from(this.#nodes.values()).sort((a, b) => a.memberId - b.memberId);\n }\n\n private cleanupOldNodes() {\n const threshold = Date.now() - this.#timeout;\n for (const [nodeId,v] of this.#nodes) {\n if (v.lastAccess < threshold) {\n if (this.#logger.enabledFor('debug')) {\n this.#logger.debug(`${nodeId} expired - no announcement since ${new Date(v.lastAccess).toISOString()}, timeout is ${this.#timeout} ms.`);\n }\n this.#nodes.delete(nodeId);\n }\n }\n }\n\n private findConnections(sortedNodes: NodeValue[], node?: NodeValue): Node[] {\n return sortedNodes.reduce((l, c) => {\n if (node !== undefined && c.memberId < node.memberId) {\n const intersection = new Set(c.users);\n node.users.forEach(user => {\n if (!c.users.has(user)) {\n intersection.delete(user);\n }\n });\n c.users.forEach(user => {\n if (!node.users.has(user)) {\n intersection.delete(user);\n }\n });\n if (intersection.size > 0) {\n const e: Node = {node: c.node, endpoint: c.endpoint};\n return l.concat(e);\n }\n }\n return l;\n }, new Array<Node>());\n }\n}\n", "import type {Relays} from './types.ts';\nimport {IOGateway} from '@interopio/gateway';\nimport type {WebSocket} from 'ws';\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 = IOGateway.Encoding.transit<Command>({\n keywordize: new Map<string, IOGateway.Encoding.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 class InternalRelays implements Relays {\n readonly #logger: IOGateway.Logging.Logger;\n // key -> socket\n readonly #clients = new Map<string, WebSocket>();\n // node -> key\n 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 constructor(logger: IOGateway.Logging.Logger) {\n this.#logger = logger;\n }\n\n add(key: string, soc: 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 (this.#logger.enabledFor('debug')) {\n this.#logger.debug(`${key} registers node ${from}`);\n }\n this.#links.set(from, key);\n break;\n }\n case 'bye': {\n if (this.#logger.enabledFor('debug')) {\n this.#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 } else {\n this.#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 (this.#logger.enabledFor('debug')) {\n this.#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}\n", "import type {Node, NodeConnections} from '../types.ts';\nimport type {\n ServerConfigurer,\n ServerConfigurerHandlerSpec,\n ServerHttpRequest\n} from '@interopio/gateway-server/web/server';\nimport type {AuthorizationRule} from '@interopio/gateway-server/auth/api';\n\nfunction buildCanonicalBaseURL(request: ServerHttpRequest): URL {\n const requestURL = request.URL;\n const protocol = requestURL.protocol === 'https:' ? 'wss://' : 'ws://';\n return new URL(protocol + requestURL.host);\n}\n\nfunction toCanonicalEndpoint(endpoint: string, request: ServerHttpRequest): string {\n\n const canonicalBaseURL = buildCanonicalBaseURL(request);\n\n const endpointURL = new URL(endpoint, canonicalBaseURL);\n if (endpointURL.protocol == canonicalBaseURL.protocol && endpointURL.host === canonicalBaseURL.host) {\n return endpointURL.pathname + endpointURL.search + endpointURL.hash;\n }\n else {\n return endpointURL.href;\n }\n}\n\nfunction fromCanonicalEndpoint(endpoint: string, request: ServerHttpRequest): string {\n const canonicalBaseURL = buildCanonicalBaseURL(request);\n const endpointURL = new URL(endpoint, canonicalBaseURL);\n return endpointURL.href;\n}\n\nfunction fromRequestNode(node: Node, request: ServerHttpRequest): Node {\n const endpoint = toCanonicalEndpoint(node.endpoint ?? `/cluster?node=${node.node}`, request);\n if (endpoint !== node.endpoint) {\n return {...node, endpoint};\n }\n return node;\n}\nfunction toRequestNode(node: Node, request: ServerHttpRequest): Node {\n const endpoint = fromCanonicalEndpoint(node.endpoint, request);\n if (endpoint !== node.endpoint) {\n return {...node, endpoint};\n }\n return node;\n}\n\nfunction routes(config: { connections: NodeConnections, authorize?: AuthorizationRule }, {handle}: ServerConfigurer) {\n const {connections, authorize} = config;\n handle(\n {\n request: {method: 'POST', path: '/api/nodes'}, options: {cors: true, authorize},\n handler: async ({request, response}) => {\n const json = await request.json();\n if (!Array.isArray(json)) {\n response.setRawStatusCode(400 /*Bad Request*/);\n await response.end();\n } else {\n const nodes = (json as Node[]).map((node) => fromRequestNode(node, request));\n const result = connections.announce(nodes).map((connection) => {\n const connect = connection.connect?.map((node) => toRequestNode(node, request));\n return {...connection, connect: connect}\n });\n const buffer = Buffer.from(JSON.stringify(result), 'utf8');\n response.setRawStatusCode(200 /*OK*/);\n response.headers.set('Content-Type', 'application/json; charset=utf8');\n await response.body(buffer);\n }\n }\n },\n {\n request: {method: 'GET', path: /^\\/api\\/nodes\\/(?<nodeId>.+)$/}, options: {cors: true, authorize},\n handler: async ({request, response}, {nodeId}) => {\n const result = connections.find(nodeId)?.map((node) => toRequestNode(node, request));\n if (result !== undefined) {\n const buffer = Buffer.from(JSON.stringify(result), 'utf8');\n response.setRawStatusCode(200 /* OK */);\n response.headers.set('Content-Type', 'application/json; charset=utf8');\n await response.body(buffer);\n } else {\n response.setRawStatusCode(404 /* Not Found */);\n await response.end();\n }\n },\n } as ServerConfigurerHandlerSpec<'nodeId'>,\n {\n request: {method: 'DELETE', path: /^\\/api\\/nodes\\/(?<nodeId>.*)$/}, options: {cors: true, authorize},\n handler: async ({response}, {nodeId}) => {\n\n const removed = connections.remove(nodeId);\n if (removed) {\n response.setRawStatusCode(200 /* OK */);\n } else {\n response.setRawStatusCode(404 /* Not Found */);\n }\n await response.end();\n }\n } as ServerConfigurerHandlerSpec<'nodeId'>,\n );\n}\n\nexport default routes;\n", "import type {InternalRelays} from '../../relays.js';\n\nimport type {ServerWebSocketHandler} from '@interopio/gateway-server/web/server';\nimport {IOGateway} from '@interopio/gateway';\n\nlet handlerId = 0;\nasync function create(log: IOGateway.Logging.Logger,\n internal: InternalRelays,\n env: { endpoint: string }): Promise<ServerWebSocketHandler> {\n\n const id = ++handlerId;\n log.info(`relays-${id} server is listening on ${env.endpoint}`);\n let keyId = 0;\n return async ({socket, handshake}) => {\n const logPrefix = handshake.logPrefix;\n const key = `r.${id}.${++keyId}`\n log.info(`${logPrefix}connected on /relays with assigned key ${key}`);\n internal.add(key, socket);\n //onOpen(connectedNodes, key);\n socket.on('error', (err: Error) => {\n log.error(`${logPrefix}websocket error: ${err.message}`, 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 log.warn(`${logPrefix}error processing received data '${data}'`, e);\n }\n });\n socket.on('close', (code, reason) => {\n internal.remove(key);\n\n log.info(`${logPrefix}disconnected from relays (code: ${code}, reason: '${reason.toString('utf8')}')`);\n });\n };\n}\n\nexport const meshRelays = ({logger, internal}: { logger: IOGateway.Logging.Logger, internal: InternalRelays }) => {\n return async (env: { endpoint: string }) => {\n return await create(logger, internal, env);\n }\n}\n", "import type {WebSocket} from 'ws';\nimport type {Relays} from '../../types.ts';\nimport type {ServerWebSocketHandler} from '@interopio/gateway-server/web/server';\nimport {IOGateway} from '@interopio/gateway';\n\nfunction onMessage(relays: Relays,\n log: IOGateway.Logging.Logger,\n key: string,\n node: string | undefined,\n socketsByNodeId: Map<string, Map<string, WebSocket>>,\n msg: string) {\n try {\n relays.send(key, node, msg, (k, err?: Error) => {\n if (err) {\n log.warn(`${k} error writing msg ${msg}: ${err}`);\n return;\n }\n if (log.enabledFor('debug')) {\n log.debug(`${k} sent msg ${msg}`);\n }\n });\n } catch (ex) {\n log.error(`${key} unable to process message`, ex);\n if (node) {\n const socket = socketsByNodeId.get(node)?.get(key);\n socket?.terminate();\n }\n }\n}\nlet handlerId = 0;\nasync function create(\n log: IOGateway.Logging.Logger,\n relays: Relays,\n env: { endpoint: string }\n): Promise<ServerWebSocketHandler> {\n const socketsByNodeId = new Map<string, Map<string, 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 log.warn(`${key} error writing from ${k} msg ${msg}: ${err}`);\n return;\n }\n if (log.enabledFor('debug')) {\n log.debug(`${key} sent from ${k} msg ${msg}`);\n }\n });\n }\n } else {\n log.warn(`${k} dropped msg ${msg}.`);\n }\n } catch (ex) {\n log.error(`${k} unable to process message`, ex);\n }\n };\n\n const id = ++handlerId;\n let keyId = 0;\n\n return async ({socket, handshake}) => {\n const logPrefix = handshake.logPrefix ?? '';\n const query = handshake.url.searchParams;\n const key = `c.${id}.${++keyId}`;\n log.info(`${logPrefix}connected on /cluster with ${query} with assigned key ${key}`);\n\n const node = query.get('node');\n if (node) {\n let sockets = socketsByNodeId.get(node);\n if (!sockets) {\n sockets = new Map<string, WebSocket>();\n socketsByNodeId.set(node, sockets);\n }\n sockets.set(key, socket);\n } else {\n socket.terminate();\n return;\n }\n //onOpen(connectedNodes, key);\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 onMessage(relays, log, key, node, socketsByNodeId, data as unknown as string);\n });\n socket.on('close', (_code, _reason) => {\n log.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}\n\nexport const meshCluster = ({logger, relays}: { logger: IOGateway.Logging.Logger, relays: Relays }) => {\n return async (environment: { endpoint: string }) => {\n return await create(logger, relays, environment);\n }\n};\n", "import NodeConnections from './mesh/connections.ts';\nimport {InternalRelays} from './mesh/relays.ts';\nimport restDirectory from './mesh/rest-directory/routes.ts';\nimport {meshRelays} from './mesh/ws/relays/core.ts';\nimport {meshCluster} from './mesh/ws/cluster/core.ts';\nimport type {ServerConfigurer, ServerWebSocketOptions} from '@interopio/gateway-server/web/server';\nimport {GatewayServer} from '@interopio/gateway-server';\nimport {IOGateway} from '@interopio/gateway';\n\nexport const mesh = async (\n options: {\n logger: IOGateway.Logging.Logger,\n enabled?: boolean,\n timeout?: number,\n socket: ServerWebSocketOptions\n },\n configurer: ServerConfigurer,\n config: GatewayServer.ServerConfig\n) => {\n const {enabled, logger} = options;\n if (enabled !== true) {\n logger.debug(`no mesh`);\n return;\n }\n let {socket, timeout} = options;\n const authorize = socket.authorize ?? {access: config.auth.type === 'none' ? 'permitted' : 'authenticated'};\n socket = {ping: 30000, authorize: authorize, ...socket};\n timeout ??= 60000; // default timeout is 60 seconds\n const connections = new NodeConnections(logger, timeout);\n const relays = new InternalRelays(logger);\n\n restDirectory({connections, authorize}, configurer);\n configurer.socket(\n {\n path: '/cluster', options: socket,\n factory: meshCluster({logger, relays})\n },\n {\n path: '/relays', options: socket,\n factory: meshRelays({logger, internal: relays})\n }\n );\n}\n", "import {BridgeNode} from './instance/BridgeNode.ts';\nimport {Config} from './config/Config.ts';\nimport {BOOLEAN, NUMBER, type PropertyType, type PropertyTypeConverter, STRING} from './config/Properties.ts';\n\nimport info from '../package.json' with {type: 'json'};\n\nimport {readFileSync} from 'node:fs';\n\nlet hadFatalError = false;\nconst reportedErrors = new Set();\nfunction onFatalError(error) {\n\n process.exitCode = 2;\n hadFatalError = true;\n\n const errorMessage = `io.Bridge: ${info.version}`\n\n if (!reportedErrors.has(errorMessage)) {\n console.error(error);\n reportedErrors.add(errorMessage);\n }\n}\n\nfunction propertyNameToEnvKey(name: string): string {\n return `IO_BRIDGE_${name.toUpperCase().replaceAll('-', '').replaceAll('.', '_')}`;\n}\n\nfunction loadConfig<T extends PropertyType=string>(name: string, converter: PropertyTypeConverter<T>): T | undefined {\n const cmdArg = process.argv.find(arg => {return arg.startsWith(`--${name}=`);})?.split('=')[1];\n if (cmdArg) {\n return converter.convert(cmdArg);\n }\n const envKey = propertyNameToEnvKey(name);\n const envVar = process.env[envKey];\n if (envVar) {\n return converter.convert(envVar);\n }\n}\n\nfunction loadLicense() {\n const config = loadConfig('license.key', STRING);\n if (config !== undefined) {\n return config;\n }\n const file = loadConfig('license.key.file', STRING);\n if (file !== undefined) {\n return readFileSync(file, {encoding: 'ascii'}).trim();\n }\n}\n\ntry {\n process.on('uncaughtException', onFatalError);\n process.on('unhandledRejection', onFatalError);\n\n await import('dotenv/config');\n\n const config = new Config();\n config.license ??= loadLicense();\n config.server.port ??= loadConfig('server.port', NUMBER) ?? 8383;\n config.server.host ??= loadConfig('server.host', STRING);\n config.server.wsPingInterval ??= loadConfig('server.ws-ping-interval', NUMBER);\n config.gateway.enabled ??= loadConfig('gateway.enabled', BOOLEAN);\n config.gateway.contexts.lifetime ??= loadConfig('gateway.contexts.lifetime', STRING) as 'retained' | 'ref-counted' | 'ownership';\n config.server.auth.type = (loadConfig('server.auth.type', STRING) ?? 'none') as 'none' | 'basic' | 'oauth2';\n config.server.cors.allowOrigin = loadConfig('server.cors.allow-origin', STRING) ?? '*';\n config.server.cors.allowCredentials = loadConfig('server.cors.allow-credentials', BOOLEAN) ?? true;\n const bridge = new BridgeNode(config);\n\n await bridge.start();\n\n}\ncatch (error) {\n onFatalError(error);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import {nanoid} from 'nanoid';\n\nexport function newUUID() : string {\n return nanoid();\n}\n", "import {networkInterfaces} from 'node:os';\nimport {ADDRCONFIG, type LookupAddress} from 'node:dns';\nimport {lookup, lookupService} from 'node:dns/promises';\n\nimport {textToNumericFormatV4, textToNumericFormatV6} from './internal/IpAddressUtil.ts';\nimport {readFileSync} from \"node:fs\";\n\nconst INET_ADDRESS_V4_SIZE = 4;\n\nclass IpAddress {\n readonly address: string;\n readonly family: 4 | 6;\n private _hostname?: string;\n\n constructor(host: string | undefined, address: string, family: 4 | 6) {\n this._hostname = host;\n this.address = address;\n this.family = family;\n }\n\n get addressBytes(): Uint8Array {\n if (this.family === 4) {\n return textToNumericFormatV4(this.address);\n }\n //return textToNumericFormatV6(this.address);\n }\n\n async getHost(): Promise<string> {\n if (!this._hostname) {\n this._hostname = (await lookupService(this.address, 0)).hostname;\n }\n return this._hostname;\n }\n\n async getIpAddress(nonLoopback: boolean = false): Promise<LookupAddress> {\n const hints = nonLoopback ? ADDRCONFIG : undefined;\n return await lookup(this.address, {family: this.family, hints: hints});\n }\n}\n\nexport type {IpAddress};\n\nexport function isLoopback(address: IpAddress): boolean {\n return address.family === 4 && address.address.startsWith('127.') || address.family === 6 && address.address.startsWith('::1');\n}\n\nexport async function getByName(host: string): Promise<IpAddress> {\n const {address, family} = await lookup(host, {family: 4});\n if (family !== 4 && family !== 6) {\n throw new Error('unexpected address type');\n }\n return new IpAddress(undefined, address, family);\n}\n\nlet _anyLocalAddress: IpAddress;\n\nexport function anyLocalAddress(): IpAddress {\n if (!_anyLocalAddress) {\n _anyLocalAddress = getByAddress('0.0.0.0', 0);\n }\n return _anyLocalAddress;\n}\n\nexport function getByAddress(host: string, bytes: Uint8Array | number): IpAddress {\n if (typeof bytes === 'number') {\n const n = bytes;\n bytes = new Uint8Array(INET_ADDRESS_V4_SIZE);\n new DataView(bytes.buffer).setInt32(0, n);\n }\n const family = bytes.length === INET_ADDRESS_V4_SIZE ? 4 : 6;\n const address = Array.from(bytes).join('.');\n return new IpAddress(host, address, family);\n}\n\nexport async function resolveByAddress(host: string, address: string): Promise<IpAddress> {\n const byName = await getByName(address);\n // todo: check if address and host names are correct\n return new IpAddress(host, byName.address, byName.family);\n}\n\nexport async function getAllByName(host: string): Promise<IpAddress[]> {\n const addresses = await lookup(host, {all: true});\n return addresses.map(({address, family}) => {\n if (family !== 4 && family !== 6) {\n throw new Error('unexpected address type');\n }\n return new IpAddress(undefined, address, family);\n });\n}\n\nexport interface NetworkInterface {\n name: string\n loopback: boolean\n addresses: Array<IpAddress>\n}\n\nexport function getNetworkInterfaces(): NetworkInterface[] {\n return Object.entries(networkInterfaces()).map(([name, addresses]) => {\n return {\n name,\n loopback: addresses.some(info => info.internal),\n addresses: addresses.map(info => {\n return new IpAddress(undefined, info.address, info.family === 'IPv6' ? 6 : 4);\n })\n };\n });\n}\n\nfunction soMaxConn() {\n let somaxconn;\n if (process.platform === 'win32') {\n somaxconn = 200;\n }\n else if (process.platform === 'darwin') {\n somaxconn = 128;\n }\n else {\n somaxconn = 4096;\n }\n\n try {\n somaxconn = parseInt(readFileSync('/proc/sys/net/core/somaxconn').toString());\n } catch (error) {\n // todo log\n }\n return somaxconn;\n}\n\nexport const SOMAXCONN = soMaxConn();\n\n", "const DOT = '.'.charCodeAt(0);\nconst INET_ADDRESS_V4_SIZE = 4;\nconst INET_ADDRESS_V6_SIZE = 16;\nconst BYTE_SIZE = 2; // 8 bits in hex\nconst COLON = ':'.charCodeAt(0);\n\nexport function textToNumericFormatV4(address: string): Uint8Array {\n const result = new Uint8Array(4);\n const len = address.length;\n if (len == 0 || len > 15) {\n return;\n }\n\n let currentValue = 0;\n let currentByte = 0;\n let newByte = true;\n for (let i = 0; i < len; i++) {\n const ch = address.charCodeAt(i);\n if (ch === DOT) {\n if (newByte || currentValue < 0 || currentValue > 0xff || currentByte > 3) {\n return;\n }\n result[currentByte++] = currentValue & 0xff;\n currentValue = 0;\n newByte = true;\n } else {\n const digit = ch - 48;\n if (digit < 0) {\n return;\n }\n currentValue *= 10;\n currentValue += digit;\n newByte = false;\n }\n }\n if (newByte || currentValue < 0 || currentValue >= (1 << ((4 - currentByte) * 8))) {\n return;\n }\n\n switch (currentByte) {\n case 0:\n result[0] = (currentValue >> 24) & 0xff;\n //fall through\n case 1:\n result[1] = (currentValue >> 16) & 0xff;\n //fall through\n case 2:\n result[2] = (currentValue >> 8) & 0xff;\n //fall through\n case 3:\n result[3] = (currentValue >> 0) & 0xff;\n }\n return result;\n}\n\nexport function textToNumericFormatV6(address: string): Uint8Array {\n if (address.length < 2) {\n return;\n }\n\n // let colonp: number;\n // let char: number;\n // let saw_xdigit: boolean;\n // let val: number;\n // const dst = new Uint8Array(INET_ADDRESS_V6_SIZE);\n //\n // const srcb_length = address.length;\n // const pc = src.indexOf('%');\n // if (pc === srcb_length -1) {\n // return;\n // }\n //\n // colonp = -1;\n //\n // let i = 0, j = 0;\n // /* Leading :: requires some special handling. */\n // if (address.charAt(i) === ':')\n // if (address.charAt(++i) !== ':')\n // return;\n // curtok = i;\n // saw_xdigit = false;\n // val = 0;\n // while (i < srcb_length) {\n // const ch = address.charCodeAt(i++);\n // const chval = ch - 48;\n // if (chval !== -1) {\n // val <<= 4;\n // val |= chval;\n // if (val > 0xffff)\n // return;\n // saw_xdigit = true;\n // continue;\n // }\n // if (ch == ':') {\n // curtok = i;\n // if (!saw_xdigit) {\n // if (colonp != -1)\n // return null;\n // colonp = j;\n // continue;\n // } else if (i == srcb_length) {\n // return null;\n // }\n // if (j + INT16SZ > INADDR16SZ)\n // return null;\n // dst[j++] = (byte) ((val >> 8) & 0xff);\n // dst[j++] = (byte) (val & 0xff);\n // saw_xdigit = false;\n // val = 0;\n // continue;\n // }\n // if (ch == '.' && ((j + BYTE_SIZE) <= INET_ADDRESS_V6_SIZE)) {\n // const ia4 = address.substring(curtok, srcb_length);\n // /* check this IPv4 address has 3 dots, ie. A.B.C.D */\n // let dot_count = 0, index=0;\n // while ((index = ia4.indexOf ('.', index)) != -1) {\n // dot_count ++;\n // index ++;\n // }\n // if (dot_count != 3) {\n // return null;\n // }\n // const v4addr = textToNumericFormatV4(ia4);\n // if (v4addr == null) {\n // return null;\n // }\n // for (let k = 0; k < INET_ADDRESS_V4_SIZE; k++) {\n // dst[j++] = v4addr[k];\n // }\n // saw_xdigit = false;\n // break; /* '\\0' was seen by inet_pton4(). */\n // }\n // return null;\n // }\n // if (saw_xdigit) {\n // if (j + INT16SZ > INADDR16SZ)\n // return null;\n // dst[j++] = (byte) ((val >> 8) & 0xff);\n // dst[j++] = (byte) (val & 0xff);\n // }\n //\n // if (colonp != -1) {\n // const n = j - colonp;\n //\n // if (j == INADDR16SZ)\n // return null;\n // for (i = 1; i <= n; i++) {\n // dst[INADDR16SZ - i] = dst[colonp + n - i];\n // dst[colonp + n - i] = 0;\n // }\n // j = INADDR16SZ;\n // }\n // if (j != INADDR16SZ)\n // return null;\n // const newdst = convertFromIPv4MappedAddress(dst);\n // if (newdst != null) {\n // return newdst;\n // } else {\n // return dst;\n // }\n}\n", "import {getByName, type IpAddress} from '../utils/network.ts';\nimport {type Comparator, compareArrays} from '../utils/collections.ts';\n\nexport type Address = Readonly<{\n type: 4 | 6,\n host: string,\n port: number,\n address: IpAddress\n}>;\nexport function addressAsString(address: Pick<Address, 'host' | 'port' | 'type'>): string {\n // todo: do better for ipv6\n return `${address.host}:${address.port}`;\n}\nexport async function toIpAddress(address: Address): Promise<IpAddress> {\n return await getByName(scopedHost(address));\n}\n\nexport async function fromHostname(hostname: string, port: number): Promise<Address> {\n return new AddressImpl(hostname, await getByName(hostname), port);\n}\nexport function fromIpAddress(address: IpAddress, port: number): Address {\n\n return new AddressImpl(undefined, address, port);\n}\n\nclass AddressImpl {\n readonly type: 4 | 6;\n readonly host: string;\n readonly port: number;\n readonly address: IpAddress;\n\n constructor(hostname: string | undefined, ipAddress: IpAddress, port : number) {\n const type = ipAddress.family;\n if (type !== 4 && type !== 6) {\n throw new Error('unexpected address type');\n }\n this.type= type;\n this.host = hostname ?? ipAddress.address;\n this.port = port;\n this.address = ipAddress;\n }\n}\n\nfunction scopedHost(address: Address): string {\n if (address.type === 6) {\n return `[${address.host}]`;\n }\n return address.host;\n}\n\nexport const compareAddress: Comparator<Address> = (a1: Address, a2: Address) => {\n const addressBytes1 = a1.address.addressBytes;\n const addressBytes2 = a2.address.addressBytes;\n const result = compareArrays(addressBytes1, 0, addressBytes1.length, addressBytes2, 0, addressBytes2.length, (b1, b2) => {\n return b1 === b2 ? 0 : (b1 > b2 ? 1 : -1);\n });\n if (result !== 0) {\n return result;\n }\n\n return a1.port === a2.port ? 0 : (a1.port > a2.port ? 1 : -1);\n}\n", "export interface PropertyDefinition {\n readonly key: string\n readonly optional: boolean\n readonly converter: PropertyTypeConverter<PropertyType>\n}\n\nexport type PropertyType = string | number | boolean;\nexport type Properties = { [key: string]: PropertyType };\n\nexport interface PropertyTypeConverter<T extends PropertyType> {\n convert(value: unknown): T\n}\n\nexport const BOOLEAN = new class implements PropertyTypeConverter<boolean> {\n convert(value: unknown): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n else if (typeof value === \"string\") {\n return value.toLowerCase() === \"true\";\n }\n throw new Error(\"Cannot convert value to boolean: \" + value);\n }\n};\n\nexport const STRING = new class implements PropertyTypeConverter<string> {\n convert(value: unknown): string {\n if (value === undefined) {\n throw new Error(\"Cannot convert undefined \");\n }\n return String(value);\n }\n}\n\nexport const NUMBER = new class implements PropertyTypeConverter<number> {\n convert(value: unknown): number {\n if (value === undefined) {\n throw new Error(\"Cannot convert undefined \");\n }\n if (typeof value === \"object\") {\n throw new Error(\"Cannot convert object/array to number: \" + value);\n }\n return Number(value);\n }\n}\n\nexport function property<T extends PropertyType>(name: string, converter: PropertyTypeConverter<T>): PropertyDefinition {\n return {key: name, optional: true, converter: converter};\n}\n", "import type {DiscoveryServiceFactory, DiscoveryStrategyFactory} from '../discovery/index.ts';\nimport type {Properties} from './Properties.ts';\n\nexport interface DiscoveryStrategyConfig {\n readonly discoveryStrategyFactory?: DiscoveryStrategyFactory\n readonly properties: Properties\n}\nexport interface DiscoveryConfig {\n readonly discoveryStrategyConfigs: ReadonlyArray<DiscoveryStrategyConfig>\n readonly discoveryServiceFactory?: DiscoveryServiceFactory\n}\n\nexport class DefaultDiscoveryConfig implements DiscoveryConfig\n{\n discoveryStrategyConfigs: DiscoveryStrategyConfig[] = [];\n discoveryServiceFactory?: DiscoveryServiceFactory;\n\n get enabled() {\n return this.discoveryStrategyConfigs.length > 0;\n }\n}\n", "import {IOGateway} from '@interopio/gateway';\n\nexport type Logger = ReturnType<typeof IOGateway.Logging.getLogger>;\n\nexport default function getLogger(name: string): Logger {\n return IOGateway.Logging.getLogger(`gateway.bridge.${name}`);\n}\n", "import {type DiscoveryNode, type DiscoveryStrategyFactory, DiscoveryStrategyPriorities} from '../discovery/index.ts';\nimport {stat} from 'node:fs/promises';\nimport {lookup} from 'node:dns/promises'\nimport {KubernetesDiscoveryStrategy} from './KubernetesDiscoveryStrategy.ts';\nimport type {Properties, PropertyDefinition} from '../config/Properties.ts';\nimport {\n EXPOSE_EXTERNALLY, KUBERNETES_API_TOKEN,\n KUBERNETES_MASTER_URL,\n NAMESPACE, POD_LABEL_NAME, POD_LABEL_VALUE, RESOLVE_NOT_READY_ADDRESSES,\n SERVICE_DNS,\n SERVICE_LABEL_NAME,\n SERVICE_LABEL_VALUE,\n SERVICE_NAME, SERVICE_PORT\n} from './KubernetesProperties.ts';\nimport {type ClusterTopologyIntentTracker} from '../instance/ClusterTopologyIntentTracker.ts';\nimport {type Logger} from '../logging.ts';\n\nconst PROPERTY_DEFINITIONS: ReadonlyArray<PropertyDefinition> = [\n SERVICE_DNS,\n SERVICE_NAME,\n SERVICE_LABEL_NAME,\n SERVICE_LABEL_VALUE,\n NAMESPACE,\n POD_LABEL_NAME,\n POD_LABEL_VALUE,\n RESOLVE_NOT_READY_ADDRESSES,\n EXPOSE_EXTERNALLY,\n KUBERNETES_MASTER_URL,\n KUBERNETES_API_TOKEN,\n SERVICE_PORT\n];\n\nexport class KubernetesDiscoveryStrategyFactory implements DiscoveryStrategyFactory {\n private readonly tokenPath: string;\n readonly priority = DiscoveryStrategyPriorities.PLATFORM;\n constructor(tokenPath = '/var/run/secrets/kubernetes.io/serviceaccount/token') {\n this.tokenPath = tokenPath;\n }\n\n private async defaultKubernetesMasterReachable() {\n try {\n await lookup('kubernetes.default.svc');\n return true;\n } catch (e) {\n // todo log that io.Bridge running on Kubernetes, but \"kubernetes.default.svc\" is not reachable.\n return false;\n }\n }\n\n async tokenFileExists(){\n try {\n await stat(this.tokenPath);\n return true;\n } catch (e) {\n return false;\n }\n }\n\n async isAutoDetectionApplicable() {\n return await this.tokenFileExists() && await this.defaultKubernetesMasterReachable()\n }\n\n newDiscoveryStrategy(node: DiscoveryNode | undefined, logger: Logger, properties: Properties) {\n const tracker = node?.properties.get(\"internal.discovery.cluster.topology.intent.tracker\");\n return new KubernetesDiscoveryStrategy(logger, properties, tracker as ClusterTopologyIntentTracker | undefined);\n }\n\n getConfigurationProperties(): ReadonlyArray<PropertyDefinition> {\n return PROPERTY_DEFINITIONS;\n }\n}\n", "import { readFileSync} from 'node:fs';\nimport { getOrDefault, getOrUndefined } from '../discovery/settings.ts';\nimport {\n KUBERNETES_API_TOKEN,\n KUBERNETES_MASTER_URL,\n KUBERNETES_ENV_PREFIX,\n NAMESPACE,\n RESOLVE_NOT_READY_ADDRESSES,\n SERVICE_DNS,\n SERVICE_NAME,\n SERVICE_PORT,\n EXPOSE_EXTERNALLY,\n SERVICE_LABEL_NAME,\n SERVICE_LABEL_VALUE,\n POD_LABEL_NAME,\n POD_LABEL_VALUE,\n SERVICE_PER_POD_LABEL_NAME, SERVICE_PER_POD_LABEL_VALUE\n} from './KubernetesProperties.ts';\nimport {type Properties} from '../config/Properties.ts';\n\nexport type DiscoveryMode = 'kubernetes-api' | 'dns-lookup';\nexport type ExposeExternallyMode = 'auto' | 'enabled' | 'disabled';\n\nfunction readFileContents(fileName: string): string {\n return readFileSync(fileName, 'utf-8').toString();\n}\n\n\nexport class KubernetesConfig {\n readonly serviceDns?: string\n\n readonly serviceName?: string\n readonly serviceLabelName?: string\n readonly serviceLabelValue?: string\n readonly namespace: string\n readonly podLabelName?: string\n readonly podLabelValue?: string\n readonly resolveNotReadyAddresses: boolean\n readonly exposeExternallyMode: ExposeExternallyMode\n readonly servicePerPodLabelName?: string\n readonly servicePerPodLabelValue?: string\n readonly kubernetesMasterUrl: string\n readonly kubernetesApiToken?: string\n\n readonly servicePort: number\n private readonly fileContentsReader: (fileName: string) => string;\n\n readonly tokenProvider: () => string;\n\n constructor(properties: Properties, fileContentsReader: (fileName: string) => string = readFileContents) {\n this.fileContentsReader = fileContentsReader;\n this.serviceDns = getOrDefault(properties, KUBERNETES_ENV_PREFIX, SERVICE_DNS);\n this.serviceName = getOrDefault(properties, KUBERNETES_ENV_PREFIX, SERVICE_NAME);\n this.serviceLabelName = getOrUndefined(properties, KUBERNETES_ENV_PREFIX, SERVICE_LABEL_NAME);\n this.serviceLabelValue = getOrDefault(properties, KUBERNETES_ENV_PREFIX, SERVICE_LABEL_VALUE, \"true\");\n this.resolveNotReadyAddresses = getOrDefault(properties, KUBERNETES_ENV_PREFIX, RESOLVE_NOT_READY_ADDRESSES, true);\n this.podLabelName = getOrUndefined(properties, KUBERNETES_ENV_PREFIX, POD_LABEL_NAME);\n this.podLabelValue = getOrUndefined(properties, KUBERNETES_ENV_PREFIX, POD_LABEL_VALUE);\n\n this.exposeExternallyMode = this.getExposeExternallyMode(properties);\n this.servicePerPodLabelName = getOrUndefined(properties, KUBERNETES_ENV_PREFIX, SERVICE_PER_POD_LABEL_NAME);\n this.servicePerPodLabelValue = getOrUndefined(properties, KUBERNETES_ENV_PREFIX, SERVICE_PER_POD_LABEL_VALUE);\n this.kubernetesMasterUrl = getOrDefault(properties, KUBERNETES_ENV_PREFIX, KUBERNETES_MASTER_URL, \"https://kubernetes.default.svc\");\n this.tokenProvider = this.buildTokenProvider(properties);\n this.servicePort = getOrDefault(properties, KUBERNETES_ENV_PREFIX, SERVICE_PORT, 0);\n this.namespace = this.getNamespaceWithFallbacks(properties);\n }\n\n private getExposeExternallyMode(properties: Properties): ExposeExternallyMode {\n const exposeExternally: boolean | undefined = getOrUndefined<boolean>(properties, KUBERNETES_ENV_PREFIX, EXPOSE_EXTERNALLY);\n if (exposeExternally === undefined) {\n return 'auto';\n }\n else if (exposeExternally) {\n return 'enabled';\n }\n else {\n return 'disabled';\n }\n }\n\n private getNamespaceWithFallbacks(properties: Properties): string {\n let namespace: string | undefined = getOrDefault(properties, KUBERNETES_ENV_PREFIX, NAMESPACE);\n if (!namespace) {\n namespace = process.env['KUBERNETES_NAMESPACE'];\n }\n if (!namespace && this.mode === 'kubernetes-api') {\n namespace = this.readNamespace();\n }\n return namespace;\n }\n\n private buildTokenProvider(properties: {}): () => string {\n const apiToken: string | undefined = getOrUndefined(properties, KUBERNETES_ENV_PREFIX, KUBERNETES_API_TOKEN);\n if (!apiToken && this.mode === 'kubernetes-api') {\n return () => readFileContents('/var/run/secrets/kubernetes.io/serviceaccount/token')\n } else {\n return () => apiToken;\n }\n }\n\n private readNamespace(): string {\n return this.fileContentsReader('/var/run/secrets/kubernetes.io/serviceaccount/namespace');\n }\n\n\n get mode(): DiscoveryMode {\n if (this.serviceDns) {\n return 'dns-lookup';\n }\n return 'kubernetes-api';\n }\n\n toString() {\n return \"KubernetesConfig: {\"\n + \"service-dns: \" + this.serviceDns\n + \", service-name: \" + this.serviceName\n + \", service-port: \" + this.servicePort\n + \", service-label-name: \" + this.serviceLabelName\n + \", service-label-value: \" + this.serviceLabelValue\n + \", namespace: \" + this.namespace\n + \", pod-label-name: \" + this.podLabelName\n + \", pod-label-value: \" + this.podLabelValue\n + \", resolve-not-ready-addresses: \" + this.resolveNotReadyAddresses\n + \", expose-externally-mode: \" + this.exposeExternallyMode\n + \", service-per-pod-label-name: \" + this.servicePerPodLabelName\n + \", service-per-pod-label-value: \" + this.servicePerPodLabelValue\n + \", kubernetes-master-url: \" + this.kubernetesMasterUrl + \"}\";\n }\n}\n", "import {type Properties, type PropertyDefinition, type PropertyType} from '../config/Properties.ts';\n\nfunction getProperty(prefix: string, property: PropertyDefinition) {\n let s = prefix;\n if (!s.endsWith('.')) {\n s += '.';\n }\n return s + property.key;\n}\n\nfunction readProperty(prefix: string | undefined, property: PropertyDefinition): PropertyType | undefined {\n if (prefix) {\n const p = getProperty(prefix, property);\n const v = process.env[p];\n // todo convert\n return v;\n }\n}\n\nexport function getOrUndefined<T extends PropertyType>(properties: Properties, prefix: string, property?: PropertyDefinition): T | undefined {\n return getOrDefault(properties, prefix, property);\n}\n\nexport function getOrDefault<T extends PropertyType>(properties: Properties, prefix: string, property?: PropertyDefinition, defaultValue?: T) {\n if (property === undefined) {\n return defaultValue;\n }\n\n let value = readProperty(prefix, property);\n if (value === undefined) {\n value = properties[property.key];\n }\n if (value === undefined) {\n return defaultValue;\n }\n return value as T;\n}\n", "import {BOOLEAN, NUMBER, property, STRING} from '../config/Properties.ts';\n\nexport const KUBERNETES_ENV_PREFIX = 'io.bridge.kubernetes';\n\n\n\n\nexport const SERVICE_DNS = property<string>('service-dns', STRING);\nexport const SERVICE_NAME = property<string>('service-name', STRING);\nexport const SERVICE_LABEL_NAME = property<string>('service-label-name', STRING);\nexport const SERVICE_LABEL_VALUE = property<string>('service-label-value', STRING);\nexport const NAMESPACE = property<string>('namespace', STRING);\nexport const POD_LABEL_NAME = property<string>('pod-label-name', STRING);\nexport const POD_LABEL_VALUE = property<string>('pod-label-value', STRING);\nexport const EXPOSE_EXTERNALLY = property<boolean>('expose-externally', BOOLEAN);\nexport const SERVICE_PER_POD_LABEL_NAME = property<string>('service-per-pod-label-name', STRING);\nexport const SERVICE_PER_POD_LABEL_VALUE = property<string>('service-per-pod-label-value', STRING);\nexport const RESOLVE_NOT_READY_ADDRESSES = property<boolean>('resolve-not-ready-addresses', BOOLEAN);\n\nexport const KUBERNETES_MASTER_URL = property<string>('kubernetes-master', STRING);\nexport const KUBERNETES_API_TOKEN = property<string>('api-token', STRING);\nexport const SERVICE_PORT = property<number>('service-port', NUMBER);\n", "import {Endpoint, EndpointAddress} from './KubernetesClient.ts';\n\nexport interface KubernetesApiProvider {\n getEndpointsByNameUrlString(kubernetesMaster: string, namespace: string, endpointName: string): string;\n\n getEndpointsByServiceLabelUrlString(kubernetesMaster: string, namespace: string, serviceLabel: string): string;\n\n parseEndpoints(param: any): Endpoint[];\n}\n\nexport class KubernetesApiEndpointSlicesProvider implements KubernetesApiProvider {\n getEndpointsByServiceLabelUrlString(kubernetesMaster: string, namespace: string, param: string): string {\n return `${kubernetesMaster}/apis/discovery.k8s.io/v1/namespaces/${namespace}/endpointslices?${param}`;\n }\n\n getEndpointsByNameUrlString(kubernetesMaster: string, namespace: string, endpointName: string): string {\n return `${kubernetesMaster}/apis/discovery.k8s.io/v1/namespaces/${namespace}/endpointslices?labelSelector=kubernetes.io/service-name=${endpointName}`;\n }\n\n parseEndpoints(param: {\n items: Array<{ endpoints: Array<{ conditions: { ready: boolean }, addresses: Array<string> }>, ports: Array<{}> }>\n }): Endpoint[] {\n const endpoints = new Array<Endpoint>();\n for (const item of param.items) {\n endpoints.push(...this.parseEndpointSlices(item));\n }\n return endpoints;\n }\n\n private parseEndpointSlices(item: {\n endpoints: Array<{\n conditions: {\n ready: boolean\n },\n addresses: Array<string>\n }>,\n ports: Array<{name?: string, port?: number}>\n }): Endpoint[] {\n const addresses = new Array<Endpoint>();\n const endpointPort = this.extractPort(item);\n for (const endpoint of item.endpoints) {\n const ready = endpoint.conditions.ready;\n for (const address of endpoint.addresses) {\n addresses.push(new Endpoint(new EndpointAddress({ip: address, port: endpointPort}), undefined, ready))\n }\n\n }\n return addresses;\n }\n\n private extractPort(item: {\n ports: Array<{\n name?: string,\n port?: number\n\n }>\n }): number | undefined {\n for (const port of item.ports) {\n const bridgeServicePort = port.name;\n if (bridgeServicePort && bridgeServicePort === 'io-bridge') {\n const servicePort = port.port;\n if (servicePort !== undefined) {\n return servicePort;\n }\n }\n }\n if (item.ports.length === 1) {\n const port = item.ports[0];\n const servicePort = port.port;\n if (servicePort !== undefined) {\n return servicePort;\n }\n }\n }\n}\n", "import {type ExposeExternallyMode} from './KubernetesConfig.ts';\nimport {KubernetesApiEndpointSlicesProvider, type KubernetesApiProvider} from './KubernetesApiProvider.ts';\nimport {type ClusterTopologyIntentTracker} from '../instance/ClusterTopologyIntentTracker.ts';\n\nclass Address {\n readonly ip: string;\n\n readonly port?: number;\n\n constructor(ip: string, port?: number) {\n this.ip = ip;\n this.port = port;\n }\n}\n\nexport type {Address};\n\nexport class EndpointAddress {\n readonly targetRefName?: string;\n\n private readonly address: Address;\n\n constructor(address: Address, targetRefName?: string) {\n this.address = address;\n this.targetRefName = targetRefName;\n }\n\n get ip(): string {\n return this.address.ip;\n }\n\n get port(): number | undefined {\n return this.address.port;\n }\n}\n\nexport class Endpoint {\n\n readonly privateAddress: EndpointAddress;\n readonly publicAddress: EndpointAddress | undefined = undefined;\n readonly ready: boolean;\n readonly additionalProperties: ReadonlyMap<string, string> = new Map();\n\n constructor(privateAddress: EndpointAddress,\n publicAddress: EndpointAddress | undefined = undefined,\n ready: boolean,\n additionalProperties: ReadonlyMap<string, string> = new Map()) {\n this.privateAddress = privateAddress;\n this.publicAddress = publicAddress;\n this.ready = ready;\n this.additionalProperties = additionalProperties;\n }\n}\n\nconst READ_TIMEOUT_SECONDS = 10;\n\nfunction isReady(podItemStatus: { containerStatuses?: Array<{ ready?: boolean }> }): boolean {\n for (const containerStatus of podItemStatus.containerStatuses) {\n if (containerStatus.ready !== true) {\n return false;\n }\n }\n return true;\n}\n\nfunction containerPort(container: {\n ports?: Array<{\n containerPort?: number\n }>\n}): number | undefined {\n const ports = container.ports;\n if (ports.length > 0) {\n const port = ports[0];\n return port.containerPort;\n }\n}\n\nfunction extractContainerPort(item: {\n spec: {\n containers?: Array<{ name?: string, ports?: Array<{ containerPort?: number }> }>\n }\n}): number | undefined {\n const containers = item.spec.containers;\n if (containers.length === 1) {\n const container = containers[0];\n return containerPort(container);\n } else {\n for (const container of containers) {\n if (container.name === 'io-bridge') {\n return containerPort(container);\n }\n }\n }\n}\n\nfunction parsePodsList(podList: {\n items?: Array<{\n metadata: {\n name: string\n },\n status: {\n podIP?: string\n containerStatuses?: Array<{ ready?: boolean }>\n },\n spec: {}\n }>\n}): Array<Endpoint> {\n const addresses = new Array<Endpoint>();\n for (const item of podList.items) {\n const podName = item.metadata.name;\n const status = item.status;\n const ip = status.podIP;\n if (ip) {\n const port = extractContainerPort(item);\n addresses.push(new Endpoint(new EndpointAddress({ip, port}, podName), undefined, isReady(status)));\n }\n }\n return addresses;\n}\n\nfunction getLabelSelectorParameter(labelNames: string, labelValues: string): string {\n const labelNameArray = labelNames.split(',');\n const labelValueArray = labelValues.split(',');\n const selectorList = [];\n for (let i = 0; i < labelNameArray.length; i++) {\n selectorList[i] = (`${labelNameArray[i]}=${labelValueArray[i]}`);\n }\n return `labelSelector=${selectorList.join(',')}`;\n}\n\nexport class KubernetesClient {\n\n private readonly namespace: string;\n private readonly kubernetesMaster: string;\n private readonly exposeExternallyMode: ExposeExternallyMode;\n private readonly tokenProvider: () => string;\n private readonly servicePerPodLabelName?: string;\n private readonly servicePerPodLabelValue?: string;\n private readonly clientTopologyIntentTracker?: ClusterTopologyIntentTracker;\n private readonly apiProvider: KubernetesApiProvider\n\n /*testing*/\n constructor(namespace: string,\n kubernetesMaster: string,\n exposeExternallyMode: ExposeExternallyMode,\n tokenProvider: () => string,\n servicePerPodLabelName?: string,\n servicePerPodLabelValue?: string,\n clientTopologyIntentTracker?: ClusterTopologyIntentTracker,\n apiProvider?: KubernetesApiProvider) {\n\n this.namespace = namespace;\n this.kubernetesMaster = kubernetesMaster;\n this.exposeExternallyMode = exposeExternallyMode;\n this.tokenProvider = tokenProvider;\n this.servicePerPodLabelName = servicePerPodLabelName;\n this.servicePerPodLabelValue = servicePerPodLabelValue;\n if (clientTopologyIntentTracker) {\n clientTopologyIntentTracker.init();\n }\n this.apiProvider = apiProvider ?? new KubernetesApiEndpointSlicesProvider();\n }\n\n start(): void {\n\n }\n\n destroy(): void {\n if (this.clientTopologyIntentTracker) {\n this.clientTopologyIntentTracker.destroy();\n }\n }\n\n /**\n * Returns POD addresses in the specified namespace.\n *\n */\n async endpoints(): Promise<Endpoint[]> {\n try {\n const url = `${this.kubernetesMaster}/api/v1/namespaces/${this.namespace}/pods`;\n return this.enrichWithPublicAddresses(parsePodsList(await this.callGet(url)));\n } catch (e) {\n return this.handleUnknownError(e);\n }\n }\n\n /**\n * Retrieves POD addresses for all services in the specified namespace filtered by service labels and values.\n * @param serviceLabels comma separated list of service labels\n * @param serviceLabelValues comma separated list of service label values\n * @return all POD addresses from the specified namespace filtered by labels\n */\n async endpointsByServiceLabel(serviceLabels: string, serviceLabelValues: string): Promise<Endpoint[]> {\n try {\n const param = getLabelSelectorParameter(serviceLabels, serviceLabelValues);\n const url = this.apiProvider.getEndpointsByServiceLabelUrlString(this.kubernetesMaster, this.namespace, param);\n return this.enrichWithPublicAddresses(this.apiProvider.parseEndpoints(this.callGet(url)));\n } catch (e) {\n return this.handleUnknownError(e);\n }\n }\n\n /**\n * Retrieves POD addresses from the specified namespace and given endpointName.\n * @param endpointName endpoint name\n * @return all POD addresses from the specified namespace and the given endpointName\n */\n async endpointsByName(endpointName: string): Promise<Endpoint[]> {\n try {\n const url = this.apiProvider.getEndpointsByNameUrlString(this.kubernetesMaster, this.namespace, endpointName);\n return this.enrichWithPublicAddresses(this.apiProvider.parseEndpoints(await this.callGet(url)));\n } catch (e) {\n return this.handleUnknownError(e);\n }\n }\n\n /**\n * Retrieves POD addresses for all services in the specified namespace filtered by pod labels and values.\n * @param podLabels comma separated list of pod labels\n * @param podLabelValues comma separated list of pod label values\n * @return all POD addresses from the specified namespace filtered by the labels\n */\n async endpointsByPodLabel(podLabels: string, podLabelValues: string) {\n try {\n const param = getLabelSelectorParameter(podLabels, podLabelValues);\n const url = `${this.kubernetesMaster}/api/v1/namespaces/${this.namespace}/pods?${param}`;\n return this.enrichWithPublicAddresses(parsePodsList(await this.callGet(url)));\n } catch (e) {\n return this.handleUnknownError(e);\n }\n }\n\n private enrichWithPublicAddresses(endpoints: Endpoint[]): Endpoint[] {\n if (this.exposeExternallyMode === 'disabled') {\n return endpoints;\n }\n\n }\n\n private handleUnknownError(e): Endpoint[] {\n // todo handle error\n return [];\n }\n\n private async callGet(url: string): Promise<any> {\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort(`request to ${url} timed out`);\n }, READ_TIMEOUT_SECONDS * 1000);\n try {\n const response = await fetch(url, {\n signal: controller.signal,\n headers: [[\"Authorization\", `Bearer ${this.tokenProvider()}`]]\n }).catch((err) => {\n throw err;\n });\n\n return await response.json();\n\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n", "import {type DiscoveryNode} from '../discovery/index.ts';\nimport {getByName} from '../utils/network.ts';\nimport type {Logger} from '../logging.ts';\n\nconst DNS_RETRY = 5;\n\nexport abstract class KubernetesEndpointResolver {\n protected readonly logger: Logger;\n constructor(logger: Logger) {\n this.logger = logger;\n }\n async start() {\n // do nothing\n }\n\n abstract resolve(): Promise<DiscoveryNode[]>\n\n async close() {\n // do nothing\n }\n\n protected async mapAddress(address?: string) {\n if (!address) {\n return;\n }\n\n try {\n let retry = 0;\n try {\n return await getByName(address);\n } catch (e) {\n if (retry < DNS_RETRY) {\n retry++;\n } else {\n throw e;\n }\n }\n } catch (e) {\n // todo log address cloud not be resolved\n }\n\n }\n}\n", "export abstract class NamedDiscoveryConfig<T extends NamedDiscoveryConfig<T>> {\n readonly tag;\n private _enabled: boolean = false;\n\n constructor(tag: string) {\n this.tag = tag;\n }\n\n setEnabled(enabled: boolean): T {\n this._enabled = enabled;\n return this as unknown as T;\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n}\n", "import { NamedDiscoveryConfig } from './NamedDiscoveryConfig.ts';\n\nexport class KubernetesConfig extends NamedDiscoveryConfig<KubernetesConfig> {\n constructor() {\n super(\"kubernetes\");\n }\n}\n", "import {type Properties, type PropertyType} from './Properties.ts';\nimport {KubernetesConfig} from './KubernetesConfig.ts';\nimport {\n DefaultDiscoveryConfig,\n type DiscoveryConfig\n} from './DiscoveryConfig.ts';\n\nexport class AutoDetectionConfig {\n enabled: boolean = true;\n}\n\nexport interface MulticastConfig {\n readonly group: string\n readonly port: number\n}\n\nclass DefaultMulticastConfig implements MulticastConfig {\n enabled: boolean = false;\n group: string = '239.1.2.3';\n port: number = 34567;\n}\n\nexport interface TcpIpConfig {\n members: string[]\n}\n\nclass DefaultTcpIpConfig implements TcpIpConfig {\n enabled: boolean = false;\n members: string[] = [];\n}\n\nexport class JoinConfig {\n private _multicast = new DefaultMulticastConfig();\n private _tcpIp = new DefaultTcpIpConfig();\n private _kubernetes = new KubernetesConfig();\n private _discovery = new DefaultDiscoveryConfig();\n private _autoDetection = new AutoDetectionConfig();\n\n get discovery(): DiscoveryConfig {\n return this._discovery;\n }\n\n get multicast(): MulticastConfig {\n return this._multicast;\n }\n\n get autoDetectionEnabled(): boolean {\n return this._autoDetection.enabled\n && !this._multicast.enabled\n && !this._tcpIp.enabled\n && !this._kubernetes.enabled\n && !this._discovery.enabled;\n }\n}\n\nexport class NetworkConfig {\n public static readonly DEFAULT_PORT: number = 8383;\n port: number = NetworkConfig.DEFAULT_PORT;\n reuseAddress: boolean;\n publicAddress?: string;\n join = new JoinConfig();\n\n constructor() {\n this.reuseAddress = process.platform !== \"win32\";\n }\n}\n\nexport class CorsConfig {\n #allowOrigin?: '*' | string[] = undefined;\n set allowOrigin(value: string | undefined) {\n if (value !== undefined) {\n if (value === '*') {\n this.#allowOrigin = value;\n } else if (Array.isArray(value)) {\n this.#allowOrigin = value;\n } else {\n this.#allowOrigin = value.split(',')\n }\n }\n }\n\n get allowOrigin(): '*' | string[] | undefined {\n return this.#allowOrigin;\n }\n\n allowCredentials: boolean = false;\n}\n\nexport class ServerConfig {\n port?: number = undefined;\n host?: string = undefined;\n cors = new CorsConfig();\n auth: {\n type: 'none' | 'basic' | 'oauth2',\n basic?: {\n realm?: string\n }\n } = {\n type: 'none',\n basic: {\n realm: 'io.Bridge'\n }\n };\n wsPingInterval?: number = 30000; // 30 seconds\n}\n\nexport class MeshConfig {\n timeout?: number\n}\n\nexport class GatewayConfig {\n enabled?: boolean;\n contexts: {\n lifetime: 'retained' | 'ref-counted' | 'ownership'\n } = {lifetime: 'retained'};\n}\n\nexport class Config {\n properties: Properties = {};\n network = new NetworkConfig();\n license: string\n readonly server: ServerConfig;\n readonly mesh: MeshConfig;\n readonly gateway: GatewayConfig;\n\n constructor() {\n this.server = new ServerConfig();\n this.mesh = new MeshConfig();\n this.gateway = new GatewayConfig();\n }\n\n get<T extends PropertyType>(name: string): T {\n const value = this.properties[name] as T;\n return value;\n }\n\n set<T extends PropertyType>(name: string, value: T): this {\n this.properties[name] = value;\n return this;\n }\n}\n", "import {type DiscoveryNode} from './index.ts';\nimport {type Address} from '../cluster/Address.ts';\n\nexport class SimpleDiscoveryNode implements DiscoveryNode {\n readonly privateAddress: Address;\n readonly publicAddress: Address;\n readonly properties: ReadonlyMap<string, unknown>;\n constructor(privateAddress: Address, publicAddress?: Address, properties?: ReadonlyMap<string, unknown>)\n {\n this.privateAddress = privateAddress;\n this.publicAddress = publicAddress ?? privateAddress;\n this.properties = properties ?? new Map();\n }\n}\n", "import {Endpoint, EndpointAddress, KubernetesClient} from './KubernetesClient.ts';\nimport {type DiscoveryNode} from '../discovery/index.ts';\nimport {type Address, fromIpAddress} from '../cluster/Address.ts';\nimport {type Logger} from '../logging.ts';\nimport {KubernetesEndpointResolver} from './KubernetesEndpointResolver.ts';\nimport {KubernetesConfig} from './KubernetesConfig.ts';\nimport {NetworkConfig} from '../config/Config.ts';\nimport {type ClusterTopologyIntentTracker} from '../instance/ClusterTopologyIntentTracker.ts';\nimport {SimpleDiscoveryNode} from '../discovery/SimpleDiscoveryNode.ts';\n\nfunction buildKubernetesClient(config: KubernetesConfig, clusterTopologyIntentTracker?: ClusterTopologyIntentTracker): KubernetesClient {\n return new KubernetesClient(config.namespace, config.kubernetesMasterUrl, config.exposeExternallyMode, config.tokenProvider, config.servicePerPodLabelName, config.servicePerPodLabelValue, clusterTopologyIntentTracker);\n}\n\nexport class KubernetesApiEndpointResolver extends KubernetesEndpointResolver {\n\n private readonly client: KubernetesClient;\n private readonly serviceName?: string;\n private readonly port: number = 0;\n private readonly serviceLabel?: string;\n private readonly serviceLabelValue?: string;\n private readonly podLabel?: string;\n private readonly podLabelValue?: string;\n private readonly resolveNotReadyAddresses?: boolean;\n\n static of(logger: Logger, config: KubernetesConfig, tracker?: ClusterTopologyIntentTracker): KubernetesApiEndpointResolver {\n return new KubernetesApiEndpointResolver(logger, buildKubernetesClient(config, tracker),\n config.serviceName, config.servicePort, config.serviceLabelName,\n config.serviceLabelValue, config.podLabelName, config.podLabelValue, config.resolveNotReadyAddresses);\n }\n\n /*testing*/ constructor(logger: Logger,\n client: KubernetesClient,\n serviceName?: string,\n port: number = 0,\n serviceLabel?: string,\n serviceLabelValue?: string,\n podLabel?: string,\n podLabelValue?: string,\n resolveNotReadyAddresses?: boolean) {\n super(logger);\n this.client = client;\n this.serviceName = serviceName;\n this.port = port;\n this.serviceLabel = serviceLabel;\n this.serviceLabelValue = serviceLabelValue;\n this.podLabel = podLabel;\n this.podLabelValue = podLabelValue;\n this.resolveNotReadyAddresses = resolveNotReadyAddresses;\n }\n\n async resolve(): Promise<DiscoveryNode[]> {\n if (this.serviceName) {\n return await this.getSimpleDiscoveryNodes(await this.client.endpointsByName(this.serviceName));\n }\n else if (this.serviceLabel) {\n return await this.getSimpleDiscoveryNodes(await this.client.endpointsByServiceLabel(this.serviceLabel, this.serviceLabelValue));\n }\n else if (this.podLabel) {\n return await this.getSimpleDiscoveryNodes(await this.client.endpointsByPodLabel(this.podLabel, this.podLabelValue));\n }\n return await this.getSimpleDiscoveryNodes(await this.client.endpoints());\n }\n\n private async getSimpleDiscoveryNodes(endpoints: readonly Endpoint[]): Promise<DiscoveryNode[]> {\n const discoveredNodes = new Array<DiscoveryNode>();\n for (const endpoint of endpoints) {\n await this.addAddress(discoveredNodes, endpoint);\n }\n return discoveredNodes;\n }\n\n private async addAddress(discoveredNodes: Array<DiscoveryNode>, endpoint: Endpoint): Promise<void> {\n if (this.resolveNotReadyAddresses === true || endpoint.ready) {\n const privateAddress = await this.createAddress(endpoint.privateAddress, this.resolvePort.bind(this));\n const publicAddress = await this.createAddress(endpoint.publicAddress, this.resolvePortPublic.bind(this));\n discoveredNodes.push(new SimpleDiscoveryNode(privateAddress, publicAddress, new Map<string, string>()));\n }\n }\n\n private async createAddress(address: EndpointAddress | undefined, portResolver: (address: EndpointAddress) => number): Promise<Address> {\n if (address === undefined) {\n return undefined;\n }\n const ip = address.ip;\n const ipAddress = await this.mapAddress(ip);\n const port = portResolver(address);\n return fromIpAddress(ipAddress, port);\n }\n\n private resolvePort(address: EndpointAddress) {\n if (this.port > 0) {\n return this.port;\n }\n if (address.port) {\n\n return address.port;\n }\n return NetworkConfig.DEFAULT_PORT;\n }\n\n private resolvePortPublic(address: EndpointAddress) {\n if (address.port) {\n return address.port;\n }\n if (this.port > 0) {\n return this.port;\n }\n return NetworkConfig.DEFAULT_PORT;\n }\n}\n", "import {type DiscoveryNode, type DiscoveryStrategy} from '../discovery/index.ts';\nimport {KubernetesConfig} from './KubernetesConfig.ts';\nimport {KubernetesApiEndpointResolver} from './KubernetesApiEndpointResolver.ts';\nimport {KubernetesEndpointResolver} from './KubernetesEndpointResolver.ts';\nimport {type ClusterTopologyIntentTracker} from '../instance/ClusterTopologyIntentTracker.ts';\nimport {type Logger} from '../logging.ts';\n\nexport class KubernetesDiscoveryStrategy implements DiscoveryStrategy {\n private readonly logger: Logger;\n private readonly endpointResolver: KubernetesEndpointResolver;\n\n constructor(logger: Logger, properties: {[key: string]: string | number | boolean}, intentTracker?: ClusterTopologyIntentTracker) {\n this.logger = logger;\n const config = new KubernetesConfig(properties);\n this.logger.info(`${config}`);\n this.endpointResolver = KubernetesApiEndpointResolver.of(this.logger, config, intentTracker);\n this.logger.info(`Kubernetes Discovery activated with mode: ${config.mode}`);\n }\n async start() {\n await this.endpointResolver.start();\n }\n\n async discover(): Promise<Iterable<DiscoveryNode> | undefined> {\n return undefined\n }\n\n async close() {\n await this.endpointResolver.close();\n }\n}\n", "import {createSocket, type RemoteInfo, Socket} from 'node:dgram';\nimport {type DiscoveryNode, type DiscoveryStrategy} from '../index.ts';\nimport {SimpleDiscoveryNode} from '../SimpleDiscoveryNode.ts';\nimport {type Properties} from '../../config/Properties.ts';\nimport {GROUP, PORT} from './MulticastProperties.ts';\nimport {getOrDefault} from '../settings.ts';\nimport {fromHostname, toIpAddress} from '../../cluster/Address.ts';\nimport {isLoopback} from '../../utils/network.ts';\nimport {type Logger} from '../../logging.ts';\n\nconst DATA_OUTPUT_BUFFER_SIZE = 64 * 1024;\nconst DEFAULT_MULTICAST_PORT = 34567;\nconst DEFAULT_MULTICAST_GROUP = '239.1.2.3';\nconst SOCKET_TIME_TO_LIVE = 255; // unrestricted (other possible values would be 1 (local-network), 15 (site-local), 32(local-area), 64(regional), 128(global))\n\ninterface MulticastMemberInfo {\n readonly host: string;\n readonly port: number;\n}\n\nfunction multicastDiscoverySender(discoveryNode: DiscoveryNode | undefined, socket: Socket, group: string, port: number): () => void {\n let multicastMemberInfo: MulticastMemberInfo;\n if (discoveryNode) {\n const address = discoveryNode.publicAddress;\n multicastMemberInfo = {host: address.host, port: address.port};\n }\n const msg: Buffer = Buffer.from(JSON.stringify(multicastMemberInfo));\n\n return () => {\n socket.send(msg, port, group, (error) => {\n console.error(error);\n });\n }\n}\n\nfunction multicastDiscoveryReceiver(socket: Socket): () => Promise<MulticastMemberInfo> {\n return () => {\n return new Promise<MulticastMemberInfo>((resolve, reject) => {\n socket.on('message', (message: Buffer, remote: RemoteInfo) => {\n resolve(JSON.parse(message as unknown as string));\n });\n socket.on('error', (err: Error) => {\n reject(err);\n });\n });\n }\n}\n\nexport class MulticastDiscoveryStrategy implements DiscoveryStrategy {\n private readonly logger: Logger;\n private readonly properties: Properties;\n private readonly discoveryNode?: DiscoveryNode;\n private isClient?: boolean;\n private discoverySender?: () => void;\n private discoveryReceiver?: () => Promise<MulticastMemberInfo>;\n private sendIntervalId?: ReturnType<typeof setInterval>;\n private socket?: Socket;\n constructor(discoveryNode: DiscoveryNode | undefined,\n logger: Logger,\n properties: Properties) {\n this.logger = logger;\n this.properties = properties;\n this.discoveryNode = discoveryNode;\n }\n\n private async initializeMulticastSocket() {\n const port = getOrDefault(this.properties, '', PORT, DEFAULT_MULTICAST_PORT);\n if (port < 0 || port > 65535) {\n throw new Error('port number must be between 0 and 65535');\n }\n const group = getOrDefault(this.properties, '', GROUP, DEFAULT_MULTICAST_GROUP);\n this.socket = createSocket({\n type: 'udp4',\n reuseAddr: true,\n recvBufferSize: DATA_OUTPUT_BUFFER_SIZE,\n sendBufferSize: DATA_OUTPUT_BUFFER_SIZE});\n\n if (this.discoveryNode) {\n const address = await toIpAddress(this.discoveryNode.privateAddress);\n if (!isLoopback(address)) {\n this.socket.setMulticastInterface(address.address);\n }\n }\n\n this.socket.bind(port, () => {\n this.socket.setMulticastTTL(SOCKET_TIME_TO_LIVE);\n this.socket.addMembership(group);\n });\n\n this.discoverySender = multicastDiscoverySender(this.discoveryNode, this.socket, group, port);\n this.discoveryReceiver = multicastDiscoveryReceiver(this.socket);\n if (this.discoveryNode == null) {\n this.isClient = true;\n }\n }\n\n async discover(): Promise<Iterable<DiscoveryNode> | undefined> {\n const multicastMemberInfo = await this.discoveryReceiver();\n if (multicastMemberInfo) {\n const list = [];\n try {\n const discoveryNode = new SimpleDiscoveryNode(await fromHostname(multicastMemberInfo.host, multicastMemberInfo.port));\n list.push(discoveryNode);\n }\n catch (e) {\n if (this.logger.enabledFor('trace')) {\n this.logger.debug(e.message);\n }\n }\n return list;\n }\n }\n\n async start() {\n await this.initializeMulticastSocket();\n if (!this.isClient) {\n this.sendIntervalId = setInterval(() => {\n this.discoverySender();\n }, 2000);\n }\n }\n\n async close() {\n if (this.sendIntervalId) {\n clearInterval(this.sendIntervalId);\n delete this.sendIntervalId;\n }\n return new Promise<void>((resolve, reject) => {\n if (this.socket)\n {\n this.socket.close(() => {\n resolve()\n });\n }\n else\n {\n resolve();\n }\n });\n\n }\n\n}\n", "import {NUMBER, property, STRING} from '../../config/Properties.ts';\n\nexport const PORT = property<number>('port', NUMBER);\nexport const GROUP = property<string>('group', STRING);\n", "import {\n type DiscoveryNode,\n type DiscoveryStrategy,\n type DiscoveryStrategyFactory,\n DiscoveryStrategyPriorities\n} from '../index.ts';\nimport {MulticastDiscoveryStrategy} from './MulticastDiscoveryStrategy.ts';\nimport {GROUP, PORT} from './MulticastProperties.ts';\nimport {type Properties, type PropertyDefinition} from '../../config/Properties.ts';\nimport {type Logger} from '../../logging.ts';\n\nconst PROPERTY_DEFINITIONS: ReadonlyArray<PropertyDefinition> = [\n GROUP,\n PORT\n];\n\nexport class MulticastDiscoveryStrategyFactory implements DiscoveryStrategyFactory {\n readonly priority = DiscoveryStrategyPriorities.UNKNOWN;\n newDiscoveryStrategy(discoveryNode: DiscoveryNode, logger: Logger, prop: Properties): DiscoveryStrategy {\n return new MulticastDiscoveryStrategy(discoveryNode, logger, prop);\n }\n\n async isAutoDetectionApplicable(): Promise<boolean> {\n return false;\n }\n\n getConfigurationProperties(): ReadonlyArray<PropertyDefinition> {\n return PROPERTY_DEFINITIONS;\n }\n}\n", "import {type Address} from '../cluster/Address.ts';\nimport {type Properties, type PropertyDefinition} from '../config/Properties.ts';\nimport {type DiscoveryConfig, type DiscoveryStrategyConfig} from '../config/DiscoveryConfig.ts';\nimport {type Logger} from '../logging.ts';\nimport {KubernetesDiscoveryStrategyFactory} from '../kubernetes/KubernetesDiscoveryStrategyFactory.ts';\nimport {MulticastDiscoveryStrategyFactory} from './multicast/MulticastDiscoveryStrategyFactory.ts';\n\nexport interface DiscoveryServiceFactory {\n newDiscoveryService(settings: DiscoveryServiceSettings): DiscoveryService\n}\n\nexport interface DiscoveryService {\n start(): Promise<void>\n discover(): Promise<Iterable<DiscoveryNode>>\n close(): Promise<void>\n}\n\n\nexport type DiscoveryServiceSettings = {\n readonly node: Promise<DiscoveryNode>\n readonly mode: DiscoveryMode\n readonly conf: DiscoveryConfig\n readonly auto: boolean\n readonly logger: Logger\n}\n\nexport type DiscoveryMode = 'member' | 'client';\n\nexport class DefaultDiscoveryServiceFactory implements DiscoveryServiceFactory {\n newDiscoveryService(settings: DiscoveryServiceSettings): DiscoveryService {\n return new DefaultDiscoveryService(settings);\n }\n}\n\nfunction verifyNoUnknownProperties(mappedProperties: Properties, allProperties: Properties) {\n const unknownProperties = Object.keys(allProperties).filter(key => !mappedProperties.hasOwnProperty(key));\n if (unknownProperties.length > 0) {\n throw new Error(`Unknown properties: ${unknownProperties.join(', ')} on discovery strategy`);\n }\n}\n\nfunction prepareProperties(properties: Properties,\n propertyDefinitions: readonly PropertyDefinition[]) {\n const mappedProperties: Properties = {};\n for (const propertyDefinition of propertyDefinitions) {\n const propertyKey = propertyDefinition.key;\n if (properties[propertyKey] == undefined) {\n if (!propertyDefinition.optional) {\n throw new Error(`Missing required property: ${propertyKey} on discovery strategy`);\n }\n continue;\n }\n const value = properties[propertyKey];\n const converter = propertyDefinition.converter;\n const mappedValue = converter.convert(value);\n\n mappedProperties[propertyKey] = mappedValue;\n }\n\n verifyNoUnknownProperties(mappedProperties, properties);\n return mappedProperties;\n\n}\n\nexport class DefaultDiscoveryService implements DiscoveryService {\n private readonly settings: DiscoveryServiceSettings;\n private readonly strategies: Array<DiscoveryStrategy> = [];\n constructor(settings: DiscoveryServiceSettings) {\n this.settings = settings;\n }\n\n async start(): Promise<void> {\n this.strategies.push(...await this.loadDiscoveryStrategies());\n for (const strategy of this.strategies) {\n await strategy.start();\n }\n }\n\n async discover(): Promise<Iterable<DiscoveryNode>> {\n const discoveryNodes = new Set<DiscoveryNode>();\n for (const strategy of this.strategies) {\n const candidates = await strategy.discover();\n if (candidates) {\n for (const candidate of candidates) {\n if (this.validateCandidate(candidate)) {\n discoveryNodes.add(candidate);\n }\n }\n }\n\n }\n\n return discoveryNodes;\n }\n\n async close(): Promise<void> {\n for (const strategy of this.strategies) {\n await strategy.close();\n }\n }\n\n private validateCandidate(candidate: DiscoveryNode) : boolean {\n // todo\n return true;\n }\n\n private async loadDiscoveryStrategies(): Promise<Iterable<DiscoveryStrategy>> {\n\n const discoveryStrategyConfigs = this.settings.conf.discoveryStrategyConfigs;\n const factories = this.collectFactories(discoveryStrategyConfigs);\n\n const discoveryStrategies = new Array<DiscoveryStrategy>();\n for (const config of discoveryStrategyConfigs) {\n const discoveryStrategy = await this.buildDiscoveryStrategy(config, factories);\n discoveryStrategies.push(discoveryStrategy);\n }\n const logger = this.settings.logger;\n if (discoveryStrategies.length == 0 && this.settings.auto) {\n logger.debug(`Discovery auto-detection enabled, trying to detect discovery strategy`);\n const autoDetectedFactory = await this.detectDiscoveryStrategyFactory(factories);\n if (autoDetectedFactory) {\n logger.debug(`Auto-detected discovery strategy: ${autoDetectedFactory.constructor.name}`);\n discoveryStrategies.push(autoDetectedFactory.newDiscoveryStrategy(await this.settings.node, logger, {}));\n }\n else {\n logger.debug(`No discovery strategy auto-detected`);\n }\n }\n return discoveryStrategies;\n }\n\n private collectFactories(strategyConfigs: ReadonlyArray<DiscoveryStrategyConfig>): DiscoveryStrategyFactory[] {\n\n const knownFactories = [new MulticastDiscoveryStrategyFactory(), new KubernetesDiscoveryStrategyFactory()]\n\n const factories = new Array<DiscoveryStrategyFactory>();\n\n for (const factory of knownFactories) {\n factories.push(factory);\n }\n\n for (const config of strategyConfigs) {\n const factory = config.discoveryStrategyFactory;\n if (factory) {\n factories.push(factory);\n }\n }\n\n return factories;\n }\n\n private async buildDiscoveryStrategy(config: DiscoveryStrategyConfig,\n factories: DiscoveryStrategyFactory[]): Promise<DiscoveryStrategy> {\n const discoveryNode = await this.settings.node;\n const logger = this.settings.logger;\n\n for (const factory of factories) {\n if (factory.constructor.name == config.discoveryStrategyFactory.constructor.name) {\n const properties = prepareProperties(config.properties, factory.getConfigurationProperties());\n return factory.newDiscoveryStrategy(discoveryNode, logger, properties);\n }\n }\n throw new Error('DiscoveryStrategyFactory not found');\n }\n\n private async detectDiscoveryStrategyFactory(factories: DiscoveryStrategyFactory[]) {\n let highestPriorityFactory: DiscoveryStrategyFactory;\n for (const factory of factories) {\n try {\n if (await factory.isAutoDetectionApplicable()) {\n if (highestPriorityFactory === undefined || factory.priority > highestPriorityFactory.priority) {\n highestPriorityFactory = factory;\n }\n }\n } catch (error) {\n // todo log error\n }\n }\n return highestPriorityFactory;\n }\n\n\n}\n\nexport interface DiscoveryStrategy {\n start(): Promise<void>\n discover(): Promise<Iterable<DiscoveryNode> | undefined>\n close(): Promise<void>\n}\n\nexport interface DiscoveryStrategyFactory {\n readonly priority: number\n isAutoDetectionApplicable(): Promise<boolean>\n newDiscoveryStrategy(node: DiscoveryNode, logger: Logger, settings: Properties): DiscoveryStrategy\n getConfigurationProperties(): ReadonlyArray<PropertyDefinition>\n}\nexport const DiscoveryStrategyPriorities = {\n UNKNOWN: 0,\n PLATFORM: 20,\n CUSTOM: 50,\n}\n\nexport interface DiscoveryNode {\n readonly publicAddress: Address;\n readonly privateAddress: Address;\n readonly properties: ReadonlyMap<string, unknown>;\n}\n", "function parse(version: string): [number, number, number] {\n // https://regex101.com/r/Ly7O1x/3/\n const pattern = /^(?<major>0|[1-9]\\d*)\\.(?<minor>0|[1-9]\\d*)\\.(?<patch>0|[1-9]\\d*)(?:-(?<prerelease>(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+(?<buildmetadata>[0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/g;\n\n const {groups} = pattern.exec(version);\n const major = parseInt(groups['major']);\n const minor = parseInt(groups['minor']);\n const patch = parseInt(groups['patch']);\n\n return [major, minor, patch];\n}\n\nclass MemberVersion {\n\n readonly major: number;\n readonly minor: number;\n readonly patch: number;\n\n public get isUnknown(): boolean {\n return this.major === 0 && this.minor === 0 && this.patch === 0;\n }\n\n public toString(): string {\n return `${this.major}.${this.minor}.${this.patch}`;\n }\n\n constructor(major: number, minor: number, patch: number) {\n this.major = major;\n this.minor = minor;\n this.patch = patch;\n }\n}\n\nexport const UNKNOWN_VERSION: MemberVersion = new MemberVersion(0, 0, 0);\n\nexport function parseVersion(version?: string): MemberVersion {\n if (!version || version.startsWith('0.0.0')) {\n return UNKNOWN_VERSION;\n }\n return new MemberVersion(...parse(version));\n}\n\nexport type {MemberVersion};\n", "{\n \"name\": \"@interopio/bridge\",\n \"version\": \"0.0.4-beta.4\",\n \"license\": \"see license in license.md\",\n \"author\": \"interop.io\",\n \"homepage\": \"https://docs.interop.io/bridge\",\n \"keywords\": [\n \"io.bridge\",\n \"bridge\",\n \"io.connect\",\n \"glue42\",\n \"interop.io\"\n ],\n \"type\": \"module\",\n \"exports\": {\n \"./package.json\": \"./package.json\",\n \".\": {\n \"default\": \"./dist/index.js\"\n },\n \"./main\": {\n \"import\": {\n \"types\": \"./types/main.d.ts\",\n \"default\": \"./dist/main.js\"\n }\n }\n },\n \"bin\": {\n \"bridge\": \"./bin/bridge.js\"\n },\n \"scripts\": {\n \"test\": \"mocha test --recursive\",\n \"build:types\": \"tsc --declaration --emitDeclarationOnly --outDir types\",\n \"build:main\": \"esbuild src/main.mts --outdir=dist --bundle --packages=external --sourcemap --platform=node --format=esm --target=node20.15\",\n \"build:index\": \"esbuild src/index.ts --outdir=dist --target=node20.15\",\n \"build\": \"npm run build:main && npm run build:index\"\n },\n \"dependencies\": {\n \"@interopio/gateway-server\": \"^0.8.1-beta.2\",\n \"dotenv\": \"^17.2.1\",\n \"jsrsasign\": \"^11.1.0\",\n \"nanoid\": \"^5.0.9\"\n },\n \"devDependencies\": {\n \"@types/jsrsasign\": \"^10.5.15\",\n \"@types/ws\": \"^8.18.1\",\n \"rand-seed\": \"^3.0.0\"\n },\n \"engines\": {\n \"node\": \">= 20.15 || >=22.2.0 || >=24.0\"\n }\n}\n", "import {type Address} from '../cluster/Address.ts';\nimport {getByName, getNetworkInterfaces, type IpAddress} from '../utils/network.ts';\nimport { type AddressInfo, Server, createServer} from 'node:net';\nimport { type Logger } from '../logging.ts';\nimport { type Config} from '../config/Config.ts';\n\nexport interface AddressPicker {\n pickAddress(): Promise<void>;\n getPublicAddressFor(endpoint: 'member' | 'client'): Address ;\n getServers(): ReadonlyMap<string, Server>;\n}\n\nasync function createAddress(addressDef: AddressDef, port: number): Promise<Address> {\n if (addressDef.host) {\n return {type: addressDef.ipAddress.family, host: addressDef.host, port, address: addressDef.ipAddress};\n }\n return {type: addressDef.ipAddress.family, host: await addressDef.ipAddress.getHost(), port, address: addressDef.ipAddress}\n}\n\nfunction createNetServer(logger: Logger, host: string, range: number | string): Promise<Server> {\n const ports = portRange(range);\n return new Promise((resolve, reject) => {\n let server = createServer({}, () => {});\n server.on('error', (err: Error) => {\n if (err['code'] === 'EADDRINUSE') {\n logger.debug(`port ${err['port']} already in use on address ${err['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) ${range} are in use. closing...`);\n server.close();\n reject(err);\n }\n } else {\n logger.error(`server error: ${err.message}`, err);\n reject(err);\n }\n });\n server.on('listening', () => {\n const info = server.address() as AddressInfo;\n logger.info(`listening on ${info.address}:${info.port}`);\n resolve(server);\n });\n try {\n const {value: port} = ports.next();\n server.listen(port, host);\n } catch (e) {\n logger.error(`error starting socket server`, e);\n reject(e instanceof Error ? e : new Error(`listen failed: ${e}`));\n }\n });\n}\n\nclass InterfaceAddress {\n readonly address: string;\n readonly host?: string;\n constructor(address: string, host?: string) {\n this.address = address;\n this.host = host;\n }\n}\n\nclass AddressDef extends InterfaceAddress {\n\n readonly ipAddress: IpAddress;\n readonly port: number;\n constructor(ipAddress: IpAddress, host?: string, port?: number) {\n super(ipAddress.address, host);\n this.ipAddress = ipAddress;\n this.port = port ?? 0;\n }\n}\n\nexport class DefaultAddressPicker implements AddressPicker {\n\n readonly #logger: Logger;\n readonly #config: Config;\n readonly #publicAddressConfig?: string;\n #publicAddress: Address;\n #bindAddress: Address;\n private server: Server;\n readonly #port: string | number;\n constructor(config: Config,\n logger: Logger)\n {\n this.#logger = logger;\n this.#config = config;\n this.#port = config.network.port;\n this.#publicAddressConfig = config.network.publicAddress;\n }\n\n async pickAddress(): Promise<void> {\n if (this.#publicAddress || this.#bindAddress)\n {\n return;\n }\n const publicAddressDef = await this.getPublicAddressByPortSearch();\n this.#publicAddress = this.#bindAddress;\n\n }\n\n getPublicAddressFor(endpoint: 'member' | 'client'): Address {\n return this.#publicAddress;\n }\n\n getServers(): ReadonlyMap<string, Server> {\n return new Map([['member', this.server]]);\n }\n\n private async getPublicAddressByPortSearch() {\n const bindAddressDef = await this.pickAddressDef();\n\n\n this.server = await createNetServer(this.#logger, '0.0.0.0', bindAddressDef.port === 0 ? this.#port: bindAddressDef.port);\n\n const port = (this.server.address() as AddressInfo).port;\n this.#bindAddress = await createAddress(bindAddressDef, port);\n\n return this.getPublicAddress(port);\n }\n\n private async getPublicAddress(port: number) {\n let address = this.#publicAddressConfig;\n if (address) {\n address = address.trim();\n if (!address) {\n throw new Error('Public address is empty');\n } else if ('127.0.0.1' === address) {\n return this.pickLoopbackAddressDef(address, port);\n }\n else\n {\n const ipAddress = await getByName(address);\n return new AddressDef(ipAddress, address, port);\n }\n }\n }\n\n private async pickAddressDef() {\n let addressDef = this.pickInterfaceAddressDef();\n if (addressDef) {\n\n }\n if (addressDef === undefined) {\n addressDef = await this.pickLoopbackAddressDef();\n }\n return addressDef;\n }\n\n private pickInterfaceAddressDef(): AddressDef {\n const interfaces = this.getInterfaces();\n if (interfaces) {\n const address = this.pickMatchingAddress(interfaces);\n if (address) {\n return address;\n }\n }\n return this.pickMatchingAddress();\n }\n\n private getInterfaces(): InterfaceAddress[] | undefined {\n return [];\n }\n\n private async pickLoopbackAddressDef(host?: string, defaultPort?: number) {\n const address = await getByName('127.0.0.1');\n return new AddressDef(address, host, defaultPort);\n }\n\n private match(ipAddress: IpAddress, interfaces: InterfaceAddress[]) {\n for (const iface of interfaces) {\n if (ipAddress.address === iface.address) {\n return iface;\n }\n }\n return undefined;\n }\n\n private getMatchingAddress(ipAddress: IpAddress, interfaces?: InterfaceAddress[]) {\n if (interfaces) {\n return this.match(ipAddress, interfaces);\n } else {\n return ipAddress;\n }\n }\n\n private pickMatchingAddress(interfaces?: InterfaceAddress[]): AddressDef | undefined {\n const preferIPv4 = true;\n const networkInterfaces = getNetworkInterfaces();\n let matchingAddress;\n for (const ni of networkInterfaces) {\n if (!interfaces && ni.loopback) {\n continue;\n }\n for (const ipAddress of ni.addresses) {\n if (preferIPv4 && ipAddress.family === 6) {\n continue;\n }\n const address = this.getMatchingAddress(ipAddress, interfaces);\n break;\n }\n }\n return matchingAddress;\n }\n}\n\n\n\n// stolen from gateway-server\n\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 */\nfunction* 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", "import {newUUID} from '../utils/uuid.ts';\nimport {DefaultDiscoveryServiceFactory, type DiscoveryService, type DiscoveryServiceSettings} from '../discovery/index.ts';\nimport {SimpleDiscoveryNode} from '../discovery/SimpleDiscoveryNode.ts';\nimport {type Member} from '../cluster/Member.ts';\nimport {type MemberVersion, parseVersion} from '../version/MemberVersion.ts';\nimport {type DiscoveryConfig} from '../config/DiscoveryConfig.ts';\nimport info from '../../package.json' with {type: 'json'};\nimport {type AddressPicker, DefaultAddressPicker} from './AddressPicker.ts';\nimport getLogger, {type Logger} from '../logging.ts';\nimport gatewayServer, {GatewayServer} from '@interopio/gateway-server';\nimport {Config} from '../config/Config.ts';\nimport {BridgeLicenseValidator} from \"../license/BridgeLicenseValidator.ts\";\nimport { type LicenseValidator} from \"../license/LicenseValidator.ts\";\nimport {userInfo} from 'node:os';\nimport {mesh} from '../../../bridge-mesh/src/index.ts';\n\nfunction logStartingInfo(logger: Logger) {\n logger.info(`Starting io.Bridge v${info.version} using Node.js ${process.version} with PID ${process.pid} (started by ${userInfo().username} in ${process.cwd()})`);\n}\n\nfunction createDiscoveryService(logger: Logger,\n conf: DiscoveryConfig,\n isAutoDetectionEnabled: boolean,\n localMember: Promise<Member>): DiscoveryService {\n const factory = new DefaultDiscoveryServiceFactory();\n\n const node = localMember.then(member => new SimpleDiscoveryNode(member.address)) ;\n\n const settings: DiscoveryServiceSettings = {\n mode: 'member',\n node: node,\n conf: conf,\n auto: isAutoDetectionEnabled,\n logger: logger,\n };\n return factory.newDiscoveryService(settings);\n}\n\nfunction createAddressPicker(node: BridgeNode): AddressPicker {\n const config = node.config;\n const logger = node.getLogger('AddressPicker');\n return new DefaultAddressPicker(config, logger);\n}\n\nexport class BridgeNode {\n readonly config: Config;\n private readonly uuid: string;\n private readonly discoveryService: DiscoveryService;\n private readonly version: MemberVersion;\n private server?: GatewayServer.Server;\n private readonly licenseValidator: LicenseValidator;\n\n constructor(config: Config) {\n this.config = config;\n\n this.licenseValidator = BridgeLicenseValidator(this.getLogger('license-validator'));\n this.licenseValidator.validate(config.license);\n\n this.uuid = newUUID();\n this.version = parseVersion(info.version);\n const addressPicker = createAddressPicker(this);\n\n\n const localMemberPromise: Promise<Member> = addressPicker.pickAddress()\n .then(() => addressPicker.getPublicAddressFor('member'))\n .then((publicAddress) => {\n return {\n local: true,\n address: publicAddress,\n uuid: this.uuid,\n version: this.version,\n };\n });\n\n const joinConfig = config.network.join;\n\n const isAutoDetectionEnabled = joinConfig.autoDetectionEnabled;\n\n const discoveryConfig: DiscoveryConfig = joinConfig.discovery;\n\n this.discoveryService = createDiscoveryService(getLogger(\"discovery-service\"), discoveryConfig, isAutoDetectionEnabled, localMemberPromise);\n }\n\n getLogger(name: string) {\n return getLogger(name);\n }\n\n private async scheduleLicenseCheck() {\n const task = async () => {\n try {\n this.licenseValidator.validate(this.config.license, {\n logSuccessMessages: false,\n });\n }\n catch (error) {\n // this.logger.error(error);\n await this.stop();\n }\n };\n\n const licenseCheckInterval = 1000 * 60 * 60 * 24; // 1 day\n return setInterval(task, licenseCheckInterval);\n }\n\n async start() {\n const config: GatewayServer.ServerConfig = {\n port: this.config.server.port,\n host: this.config.server.host,\n app: async (configurer, config) => {\n await mesh({\n logger: this.getLogger('mesh'),\n enabled: true,\n timeout: this.config.mesh.timeout ?? 60000, // 60 seconds\n socket: {\n ping: this.config.server.wsPingInterval ?? 30000, // 30 seconds\n }\n }, configurer, config);\n },\n auth: {type: 'none', ...this.config.server.auth},\n cors: this.config.server.cors\n };\n if (this.config.gateway.enabled) {\n config.gateway = {\n clients: {\n inactive_seconds: 0,\n },\n ping: this.config.server.wsPingInterval ?? undefined,\n mesh: {\n cluster: {\n endpoint: `http://localhost:${this.config.server.port}`,\n directory: {interval: 1000 * 30}, // 30 seconds\n }\n },\n contexts: {\n lifetime: this.config.gateway.contexts.lifetime,\n visibility: [\n {context: /___channel___.+/, restrictions: 'cluster'},\n {context: /T42\\..*/, restrictions: 'local'},\n {context: \"___platform_prefs___\", restrictions: 'local'},\n\n {restrictions: 'cluster'}\n ]\n },\n methods: {\n visibility: [\n {method: /T42\\..*/, restrictions: 'local'},\n {restrictions: 'cluster'}\n ]\n },\n peers: {\n visibility: [\n {domain: 'context', restrictions: 'cluster'},\n {domain: 'interop', restrictions: 'cluster'},\n {domain: 'bus', restrictions: 'local'}\n ]\n }\n }\n }\n logStartingInfo(this.getLogger('node'));\n this.server = await gatewayServer(config);\n if (false) {\n await this.discoveryService.start();\n }\n await this.scheduleLicenseCheck();\n }\n\n async stop() {\n if (this.server)\n {\n await this.server.close()\n }\n try {\n await this.discoveryService.close();\n } catch (e) {\n // ignore\n }\n }\n}\n", "import type {Logger} from \"../logging.ts\";\n\nexport type LicenseValidatorOptions = {\n validationKey: string;\n logger?: Logger\n}\n\nexport type LicenseValidationOptions = {\n logSuccessMessages?: boolean\n};\n\nexport type LicensePayload = {\n \"type\": \"paid\" | \"trial\";\n \"expiration\": number // in milliseconds\n \"email\": string,\n \"issuedBy\": string;\n \"iat\": number; // in seconds\n \"licensee\": string;\n \"organization\": {\n \"displayName\": string,\n \"identifier\": string\n }\n}\n\nexport type LicenseEvaluationResult = {\n licenseType: 'paid' | 'trial' | 'none';\n expired: boolean;\n fatal: boolean;\n license?: LicensePayload;\n error?: string;\n}\n\n\nexport const licenseValidationResults = {\n TRIAL_LICENSE_EXPIRED: {licenseType: 'trial', expired: true, fatal: true} as LicenseEvaluationResult,\n TRIAL_LICENSE_VALID: {licenseType: 'trial', expired: false, fatal: false} as LicenseEvaluationResult,\n PAID_LICENSE_EXPIRED: {licenseType: 'paid', expired: true, fatal: false} as LicenseEvaluationResult,\n PAID_LICENSE_VALID: {licenseType: 'paid', expired: false, fatal: false} as LicenseEvaluationResult,\n NO_LICENSE: {licenseType: 'none', expired: false, fatal: true} as LicenseEvaluationResult,\n};", "import getLogger, {type Logger} from \"../logging.ts\";\nimport {\n type LicensePayload,\n type LicenseEvaluationResult,\n type LicenseValidatorOptions,\n licenseValidationResults, type LicenseValidationOptions\n} from \"./types.ts\";\nimport {KJUR} from 'jsrsasign';\n\nexport class LicenseError extends Error {\n public readonly licensePayload: LicensePayload | string;\n\n constructor(message: string, licensePayload: string | LicensePayload) {\n super(message);\n this.licensePayload = licensePayload;\n }\n}\n\nexport class LicenseEvaluator {\n private readonly tokenResultMap = {\n 'trial-false': licenseValidationResults.TRIAL_LICENSE_VALID,\n 'trial-true': licenseValidationResults.TRIAL_LICENSE_EXPIRED,\n 'paid-false': licenseValidationResults.PAID_LICENSE_VALID,\n 'paid-true': licenseValidationResults.PAID_LICENSE_EXPIRED,\n };\n\n private readonly validationKey: string;\n\n constructor(validationKey: string) {\n if (!validationKey || typeof validationKey !== 'string') {\n throw new Error(`Validation key must be a non-empty string`);\n }\n this.validationKey = validationKey;\n }\n\n private decrypt(token: string): object {\n if (KJUR.jws.JWS.verifyJWT(token, this.validationKey, {alg: ['RS256']})) {\n return KJUR.jws.JWS.parse(token).payloadObj;\n } else {\n throw new LicenseError('invalid jwt token', token);\n }\n }\n\n private validateBasicTokenData(token: string): LicensePayload {\n const decoded = this.decrypt(token) as LicensePayload;\n if (['paid', 'trial'].indexOf(decoded.type) === -1) {\n throw new LicenseError('Invalid license type', token);\n }\n return decoded;\n }\n\n getLicenseStatus(token: string, now: Date = new Date()): LicenseEvaluationResult {\n try {\n const license = this.validateBasicTokenData(token);\n const isExpired = license.expiration < now.getTime();\n const licenseValidationResult = this.tokenResultMap[`${license.type}-${isExpired}`];\n return {\n ...licenseValidationResult,\n license\n };\n } catch (e) {\n return {\n ...licenseValidationResults.NO_LICENSE,\n error: e.message,\n };\n }\n\n }\n}\n\nexport class LicenseValidator {\n private readonly licenseHelper: LicenseEvaluator;\n private readonly logger: Logger;\n\n constructor({validationKey, logger}: LicenseValidatorOptions) {\n this.licenseHelper = new LicenseEvaluator(validationKey);\n this.logger = logger ?? getLogger(\"LicenseValidator\"); // Default to console if no logger provided\n }\n\n public validate(licenseKeyString: string, options?: LicenseValidationOptions): void {\n if (typeof licenseKeyString !== 'string') {\n throw new LicenseError('Invalid license key format', licenseKeyString);\n }\n\n const licenseStatus = this.licenseHelper.getLicenseStatus(licenseKeyString);\n this.printLicenseMessage(licenseStatus, options?.logSuccessMessages ?? true);\n if (licenseStatus.fatal) {\n throw new LicenseError('License validation failed', licenseStatus.license);\n }\n }\n\n private printLicenseMessage(licenseStatus: LicenseEvaluationResult, logSuccessMessages: boolean): void {\n if (!licenseStatus || licenseStatus.licenseType === 'none') {\n this.logger.error('This license is invalid. Please contact us at sales@interop.io to get a valid license');\n return;\n }\n\n const message = [\n licenseStatus.licenseType === 'paid' ? `This is a paid license that was issued for client ` : `This is a trial license that was issued for `,\n licenseStatus.license.organization.displayName,\n licenseStatus.expired ? `, but it has expired at ` : ` and is valid until `,\n new Date(licenseStatus.license.expiration).toString(),\n '.'\n ].join('');\n\n if (licenseStatus.fatal) {\n this.logger.error(message);\n } else if (licenseStatus.expired) {\n this.logger.warn(message);\n } else if(logSuccessMessages) {\n this.logger.info(message);\n }\n }\n}", "import type {Logger} from \"../logging.ts\";\nimport {LicenseValidator} from \"./LicenseValidator.ts\";\n\nconst validationKey = `-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyyZrtwcQCMfyOkZDcjxZ\n+07BrvgcAvoQETF+ho8VLfaDxgNPZd6Q7jZEfrtv0+wn0pxx8pUDeBh8mCYvkwmb\n9tkFH47GJuDhWasNgyp4ugRX4bzoPV3SnHsBR4KJ/F76kBbike6sdIfO2lYGZ36s\nLJPHV7epOYsfhoc4343/vOxEPvNbwacbXWl4NsCGev4qUmWhe9iMpb/JPd3o4hIU\nSR31AmR2xoh3BkAJc2q/cSeQK6Kn9nZYocyW367+7FOvYsrOYotsuUASp0OWp+Lh\nWGfR7F6d016+u6kbvLvcceGztiP1u25QmPNCUmw49cTatthiEwwGHb01CR58mStZ\nxg5t9+N7X9hPO2K59b8EbOnnFTlwtMMF7MKR56S4YwMamCChr9WGgpOQV+lrqyx2\nyn9lwn8Yf4gLoLPKBEhHTEy6r/we9qymmlSSe4wr5Fctov2odSE535nvtdRYZkKk\nt32gOXuwnKg2kRlRSAErpyou1mz7/mWEt1H3sGTRArjNTP2KqZkc14vPToEEJt93\nZKjhD1pVEchDiWBOMj9o12pq80tGZ8PhGJasJVVi0JPUiaznG4r12JdyDAjuXMru\n6f4Tx0ULkdwn9ia7lchcq7xC2PlTnYz+fGpfU7V0Ci56QDTp6oP567L1EIeddkaI\nnIsi4KHT7Ctp047FTTelntUCAwEAAQ==\n-----END PUBLIC KEY-----`;\n\nexport const BridgeLicenseValidator = (logger: Logger) => new LicenseValidator({validationKey, logger});\n", "import {IOGateway} from '@interopio/gateway';\nimport type {Node, NodeConnection, NodeConnections} from './types.ts';\n\ntype NodeValue = Omit<Node, 'users'> & {\n users: Set<string>,\n memberId: number,\n lastAccess: number\n}\n\nexport default class InMemoryNodeConnections implements NodeConnections {\n readonly #logger: IOGateway.Logging.Logger;\n readonly #nodes = new Map<string, NodeValue>();\n readonly #nodesByEndpoint = new Map<string, string>();\n #memberIds: number = 0;\n readonly #timeout: number;\n\n constructor(logger: IOGateway.Logging.Logger,\n timeout: number = 60000) {\n this.#logger = logger;\n this.#timeout = timeout;\n }\n\n announce(nodes: Node[]): NodeConnection[] {\n for (const node of nodes) {\n const {node: nodeId, users, endpoint} = node;\n const foundId = this.#nodesByEndpoint.get(endpoint);\n if (foundId) {\n if (foundId !== nodeId) {\n this.#logger.warn(`endpoint ${endpoint} clash. replacing node ${foundId} with ${nodeId}`);\n this.#nodesByEndpoint.set(endpoint, nodeId);\n this.#nodes.delete(foundId);\n }\n } else {\n this.#logger.info(`endpoint ${endpoint} announced for ${nodeId}`);\n this.#nodesByEndpoint.set(endpoint, nodeId);\n }\n this.#nodes.set(nodeId, this.updateNode(node, new Set<string>(users ?? []), nodeId, this.#nodes.get(nodeId)));\n }\n this.cleanupOldNodes();\n const sortedNodes = this.sortedNodeValues();\n return nodes.map((e) => {\n const {node} = e;\n const connect = this.findConnections(sortedNodes, this.#nodes.get(node));\n return {node, connect};\n });\n }\n\n find(nodeId: string): Node[] | undefined {\n const e = this.#nodes.get(nodeId);\n if (e !== undefined) {\n const sortedNodes = this.sortedNodeValues();\n const {node} = e;\n return this.findConnections(sortedNodes, this.#nodes.get(node));\n }\n return undefined;\n }\n\n remove(nodeId: string) {\n const removed = this.#nodes.get(nodeId);\n if (removed !== undefined) {\n this.#nodes.delete(nodeId);\n const endpoint = removed.endpoint;\n this.#nodesByEndpoint.delete(endpoint);\n this.#logger.info(`endpoint ${endpoint} removed for ${nodeId}`);\n return true;\n }\n return false;\n }\n\n private updateNode(newNode: Node, users: Set<string>, _key: string, oldNode?: NodeValue): NodeValue {\n const node: Omit<NodeValue, 'lastAccess' | 'users'> = oldNode ?? {...newNode, memberId: this.#memberIds++};\n return {...node, users, lastAccess: Date.now()};\n }\n\n private sortedNodeValues() {\n return Array.from(this.#nodes.values()).sort((a, b) => a.memberId - b.memberId);\n }\n\n private cleanupOldNodes() {\n const threshold = Date.now() - this.#timeout;\n for (const [nodeId,v] of this.#nodes) {\n if (v.lastAccess < threshold) {\n if (this.#logger.enabledFor('debug')) {\n this.#logger.debug(`${nodeId} expired - no announcement since ${new Date(v.lastAccess).toISOString()}, timeout is ${this.#timeout} ms.`);\n }\n this.#nodes.delete(nodeId);\n }\n }\n }\n\n private findConnections(sortedNodes: NodeValue[], node?: NodeValue): Node[] {\n return sortedNodes.reduce((l, c) => {\n if (node !== undefined && c.memberId < node.memberId) {\n const intersection = new Set(c.users);\n node.users.forEach(user => {\n if (!c.users.has(user)) {\n intersection.delete(user);\n }\n });\n c.users.forEach(user => {\n if (!node.users.has(user)) {\n intersection.delete(user);\n }\n });\n if (intersection.size > 0) {\n const e: Node = {node: c.node, endpoint: c.endpoint};\n return l.concat(e);\n }\n }\n return l;\n }, new Array<Node>());\n }\n}\n", "import type {Relays} from './types.ts';\nimport {IOGateway} from '@interopio/gateway';\nimport type {WebSocket} from 'ws';\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 = IOGateway.Encoding.transit<Command>({\n keywordize: new Map<string, IOGateway.Encoding.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 class InternalRelays implements Relays {\n readonly #logger: IOGateway.Logging.Logger;\n // key -> socket\n readonly #clients = new Map<string, WebSocket>();\n // node -> key\n 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 constructor(logger: IOGateway.Logging.Logger) {\n this.#logger = logger;\n }\n\n add(key: string, soc: 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 (this.#logger.enabledFor('debug')) {\n this.#logger.debug(`${key} registers node ${from}`);\n }\n this.#links.set(from, key);\n break;\n }\n case 'bye': {\n if (this.#logger.enabledFor('debug')) {\n this.#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 } else {\n this.#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 (this.#logger.enabledFor('debug')) {\n this.#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}\n", "import type {Node, NodeConnections} from '../types.ts';\nimport type {\n ServerConfigurer,\n ServerConfigurerHandlerSpec,\n ServerHttpRequest\n} from '@interopio/gateway-server/web/server';\nimport type {AuthorizationRule} from '@interopio/gateway-server/auth/api';\n\nfunction buildCanonicalBaseURL(request: ServerHttpRequest): URL {\n const requestURL = request.URL;\n const protocol = requestURL.protocol === 'https:' ? 'wss://' : 'ws://';\n return new URL(protocol + requestURL.host);\n}\n\nfunction toCanonicalEndpoint(endpoint: string, request: ServerHttpRequest): string {\n\n const canonicalBaseURL = buildCanonicalBaseURL(request);\n\n const endpointURL = new URL(endpoint, canonicalBaseURL);\n if (endpointURL.protocol == canonicalBaseURL.protocol && endpointURL.host === canonicalBaseURL.host) {\n return endpointURL.pathname + endpointURL.search + endpointURL.hash;\n }\n else {\n return endpointURL.href;\n }\n}\n\nfunction fromCanonicalEndpoint(endpoint: string, request: ServerHttpRequest): string {\n const canonicalBaseURL = buildCanonicalBaseURL(request);\n const endpointURL = new URL(endpoint, canonicalBaseURL);\n return endpointURL.href;\n}\n\nfunction fromRequestNode(node: Node, request: ServerHttpRequest): Node {\n const endpoint = toCanonicalEndpoint(node.endpoint ?? `/cluster?node=${node.node}`, request);\n if (endpoint !== node.endpoint) {\n return {...node, endpoint};\n }\n return node;\n}\nfunction toRequestNode(node: Node, request: ServerHttpRequest): Node {\n const endpoint = fromCanonicalEndpoint(node.endpoint, request);\n if (endpoint !== node.endpoint) {\n return {...node, endpoint};\n }\n return node;\n}\n\nfunction routes(config: { connections: NodeConnections, authorize?: AuthorizationRule }, {handle}: ServerConfigurer) {\n const {connections, authorize} = config;\n handle(\n {\n request: {method: 'POST', path: '/api/nodes'}, options: {cors: true, authorize},\n handler: async ({request, response}) => {\n const json = await request.json();\n if (!Array.isArray(json)) {\n response.setRawStatusCode(400 /*Bad Request*/);\n await response.end();\n } else {\n const nodes = (json as Node[]).map((node) => fromRequestNode(node, request));\n const result = connections.announce(nodes).map((connection) => {\n const connect = connection.connect?.map((node) => toRequestNode(node, request));\n return {...connection, connect: connect}\n });\n const buffer = Buffer.from(JSON.stringify(result), 'utf8');\n response.setRawStatusCode(200 /*OK*/);\n response.headers.set('Content-Type', 'application/json; charset=utf8');\n await response.body(buffer);\n }\n }\n },\n {\n request: {method: 'GET', path: /^\\/api\\/nodes\\/(?<nodeId>.+)$/}, options: {cors: true, authorize},\n handler: async ({request, response}, {nodeId}) => {\n const result = connections.find(nodeId)?.map((node) => toRequestNode(node, request));\n if (result !== undefined) {\n const buffer = Buffer.from(JSON.stringify(result), 'utf8');\n response.setRawStatusCode(200 /* OK */);\n response.headers.set('Content-Type', 'application/json; charset=utf8');\n await response.body(buffer);\n } else {\n response.setRawStatusCode(404 /* Not Found */);\n await response.end();\n }\n },\n } as ServerConfigurerHandlerSpec<'nodeId'>,\n {\n request: {method: 'DELETE', path: /^\\/api\\/nodes\\/(?<nodeId>.*)$/}, options: {cors: true, authorize},\n handler: async ({response}, {nodeId}) => {\n\n const removed = connections.remove(nodeId);\n if (removed) {\n response.setRawStatusCode(200 /* OK */);\n } else {\n response.setRawStatusCode(404 /* Not Found */);\n }\n await response.end();\n }\n } as ServerConfigurerHandlerSpec<'nodeId'>,\n );\n}\n\nexport default routes;\n", "import type {InternalRelays} from '../../relays.js';\n\nimport type {ServerWebSocketHandler} from '@interopio/gateway-server/web/server';\nimport {IOGateway} from '@interopio/gateway';\n\nlet handlerId = 0;\nasync function create(log: IOGateway.Logging.Logger,\n internal: InternalRelays,\n env: { endpoint: string }): Promise<ServerWebSocketHandler> {\n\n const id = ++handlerId;\n log.info(`relays-${id} server is listening on ${env.endpoint}`);\n let keyId = 0;\n return async ({socket, handshake}) => {\n const logPrefix = handshake.logPrefix;\n const key = `r.${id}.${++keyId}`\n log.info(`${logPrefix}connected on /relays with assigned key ${key}`);\n internal.add(key, socket);\n //onOpen(connectedNodes, key);\n socket.on('error', (err: Error) => {\n log.error(`${logPrefix}websocket error: ${err.message}`, 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 log.warn(`${logPrefix}error processing received data '${data}'`, e);\n }\n });\n socket.on('close', (code, reason) => {\n internal.remove(key);\n\n log.info(`${logPrefix}disconnected from relays (code: ${code}, reason: '${reason.toString('utf8')}')`);\n });\n };\n}\n\nexport const meshRelays = ({logger, internal}: { logger: IOGateway.Logging.Logger, internal: InternalRelays }) => {\n return async (env: { endpoint: string }) => {\n return await create(logger, internal, env);\n }\n}\n", "import type {WebSocket} from 'ws';\nimport type {Relays} from '../../types.ts';\nimport type {ServerWebSocketHandler} from '@interopio/gateway-server/web/server';\nimport {IOGateway} from '@interopio/gateway';\n\nfunction onMessage(relays: Relays,\n log: IOGateway.Logging.Logger,\n key: string,\n node: string | undefined,\n socketsByNodeId: Map<string, Map<string, WebSocket>>,\n msg: string) {\n try {\n relays.send(key, node, msg, (k, err?: Error) => {\n if (err) {\n log.warn(`${k} error writing msg ${msg}: ${err}`);\n return;\n }\n if (log.enabledFor('debug')) {\n log.debug(`${k} sent msg ${msg}`);\n }\n });\n } catch (ex) {\n log.error(`${key} unable to process message`, ex);\n if (node) {\n const socket = socketsByNodeId.get(node)?.get(key);\n socket?.terminate();\n }\n }\n}\nlet handlerId = 0;\nasync function create(\n log: IOGateway.Logging.Logger,\n relays: Relays,\n env: { endpoint: string }\n): Promise<ServerWebSocketHandler> {\n const socketsByNodeId = new Map<string, Map<string, 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 log.warn(`${key} error writing from ${k} msg ${msg}: ${err}`);\n return;\n }\n if (log.enabledFor('debug')) {\n log.debug(`${key} sent from ${k} msg ${msg}`);\n }\n });\n }\n } else {\n log.warn(`${k} dropped msg ${msg}.`);\n }\n } catch (ex) {\n log.error(`${k} unable to process message`, ex);\n }\n };\n\n const id = ++handlerId;\n let keyId = 0;\n\n return async ({socket, handshake}) => {\n const logPrefix = handshake.logPrefix ?? '';\n const query = handshake.url.searchParams;\n const key = `c.${id}.${++keyId}`;\n log.info(`${logPrefix}connected on /cluster with ${query} with assigned key ${key}`);\n\n const node = query.get('node');\n if (node) {\n let sockets = socketsByNodeId.get(node);\n if (!sockets) {\n sockets = new Map<string, WebSocket>();\n socketsByNodeId.set(node, sockets);\n }\n sockets.set(key, socket);\n } else {\n socket.terminate();\n return;\n }\n //onOpen(connectedNodes, key);\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 onMessage(relays, log, key, node, socketsByNodeId, data as unknown as string);\n });\n socket.on('close', (_code, _reason) => {\n log.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}\n\nexport const meshCluster = ({logger, relays}: { logger: IOGateway.Logging.Logger, relays: Relays }) => {\n return async (environment: { endpoint: string }) => {\n return await create(logger, relays, environment);\n }\n};\n", "import NodeConnections from './mesh/connections.ts';\nimport {InternalRelays} from './mesh/relays.ts';\nimport restDirectory from './mesh/rest-directory/routes.ts';\nimport {meshRelays} from './mesh/ws/relays/core.ts';\nimport {meshCluster} from './mesh/ws/cluster/core.ts';\nimport type {ServerConfigurer, ServerWebSocketOptions} from '@interopio/gateway-server/web/server';\nimport {GatewayServer} from '@interopio/gateway-server';\nimport {IOGateway} from '@interopio/gateway';\n\nexport const mesh = async (\n options: {\n logger: IOGateway.Logging.Logger,\n enabled?: boolean,\n timeout?: number,\n socket: ServerWebSocketOptions\n },\n configurer: ServerConfigurer,\n config: GatewayServer.ServerConfig\n) => {\n const {enabled, logger} = options;\n if (enabled !== true) {\n logger.debug(`no mesh`);\n return;\n }\n let {socket, timeout} = options;\n const authorize = socket.authorize ?? {access: config.auth.type === 'none' ? 'permitted' : 'authenticated'};\n socket = {ping: 30000, authorize: authorize, ...socket};\n timeout ??= 60000; // default timeout is 60 seconds\n const connections = new NodeConnections(logger, timeout);\n const relays = new InternalRelays(logger);\n\n restDirectory({connections, authorize}, configurer);\n configurer.socket(\n {\n path: '/cluster', options: socket,\n factory: meshCluster({logger, relays})\n },\n {\n path: '/relays', options: socket,\n factory: meshRelays({logger, internal: relays})\n }\n );\n}\n", "import {BridgeNode} from './instance/BridgeNode.ts';\nimport {Config} from './config/Config.ts';\nimport {BOOLEAN, NUMBER, type PropertyType, type PropertyTypeConverter, STRING} from './config/Properties.ts';\n\nimport info from '../package.json' with {type: 'json'};\n\nimport {readFileSync} from 'node:fs';\n\nlet hadFatalError = false;\nconst reportedErrors = new Set();\nfunction onFatalError(error) {\n\n process.exitCode = 2;\n hadFatalError = true;\n\n const errorMessage = `io.Bridge: ${info.version}`\n\n if (!reportedErrors.has(errorMessage)) {\n console.error(error);\n reportedErrors.add(errorMessage);\n }\n}\n\nfunction propertyNameToEnvKey(name: string): string {\n return `IO_BRIDGE_${name.toUpperCase().replaceAll('-', '').replaceAll('.', '_')}`;\n}\n\nfunction loadConfig<T extends PropertyType=string>(name: string, converter: PropertyTypeConverter<T>): T | undefined {\n const cmdArg = process.argv.find(arg => {return arg.startsWith(`--${name}=`);})?.split('=')[1];\n if (cmdArg) {\n return converter.convert(cmdArg);\n }\n const envKey = propertyNameToEnvKey(name);\n const envVar = process.env[envKey];\n if (envVar) {\n return converter.convert(envVar);\n }\n}\n\nfunction loadLicense() {\n const config = loadConfig('license.key', STRING);\n if (config !== undefined) {\n return config;\n }\n const file = loadConfig('license.key.file', STRING);\n if (file !== undefined) {\n return readFileSync(file, {encoding: 'ascii'}).trim();\n }\n}\n\ntry {\n process.on('uncaughtException', onFatalError);\n process.on('unhandledRejection', onFatalError);\n\n await import('dotenv/config');\n\n const config = new Config();\n config.license ??= loadLicense();\n config.server.port ??= loadConfig('server.port', NUMBER) ?? 8383;\n config.server.host ??= loadConfig('server.host', STRING);\n config.server.wsPingInterval ??= loadConfig('server.ws-ping-interval', NUMBER);\n config.gateway.enabled ??= loadConfig('gateway.enabled', BOOLEAN);\n config.gateway.contexts.lifetime ??= loadConfig('gateway.contexts.lifetime', STRING) as 'retained' | 'ref-counted' | 'ownership';\n config.server.auth.type = (loadConfig('server.auth.type', STRING) ?? 'none') as 'none' | 'basic' | 'oauth2';\n config.server.cors.allowOrigin = loadConfig('server.cors.allow-origin', STRING) ?? '*';\n config.server.cors.allowCredentials = loadConfig('server.cors.allow-credentials', BOOLEAN) ?? true;\n const bridge = new BridgeNode(config);\n\n await bridge.start();\n\n}\ncatch (error) {\n onFatalError(error);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["lookup", "readFileSync", "property", "readFileSync", "KubernetesConfig", "KubernetesConfig", "lookup", "PROPERTY_DEFINITIONS", "networkInterfaces", "portRange", "validationKey", "IOGateway", "handlerId", "create", "config", "readFileSync"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@interopio/bridge",
|
|
3
|
-
"version": "0.0.4-beta.
|
|
3
|
+
"version": "0.0.4-beta.4",
|
|
4
4
|
"license": "see license in license.md",
|
|
5
5
|
"author": "interop.io",
|
|
6
6
|
"homepage": "https://docs.interop.io/bridge",
|
|
@@ -15,7 +15,13 @@
|
|
|
15
15
|
"exports": {
|
|
16
16
|
"./package.json": "./package.json",
|
|
17
17
|
".": {
|
|
18
|
-
"
|
|
18
|
+
"default": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./main": {
|
|
21
|
+
"import": {
|
|
22
|
+
"types": "./types/main.d.ts",
|
|
23
|
+
"default": "./dist/main.js"
|
|
24
|
+
}
|
|
19
25
|
}
|
|
20
26
|
},
|
|
21
27
|
"bin": {
|
|
@@ -24,10 +30,12 @@
|
|
|
24
30
|
"scripts": {
|
|
25
31
|
"test": "mocha test --recursive",
|
|
26
32
|
"build:types": "tsc --declaration --emitDeclarationOnly --outDir types",
|
|
27
|
-
"build": "esbuild src/main.mts --outdir=dist --bundle --packages=external --sourcemap --platform=node --format=esm --target=
|
|
33
|
+
"build:main": "esbuild src/main.mts --outdir=dist --bundle --packages=external --sourcemap --platform=node --format=esm --target=node20.15",
|
|
34
|
+
"build:index": "esbuild src/index.ts --outdir=dist --target=node20.15",
|
|
35
|
+
"build": "npm run build:main && npm run build:index"
|
|
28
36
|
},
|
|
29
37
|
"dependencies": {
|
|
30
|
-
"@interopio/gateway-server": "^0.8.1-beta.
|
|
38
|
+
"@interopio/gateway-server": "^0.8.1-beta.2",
|
|
31
39
|
"dotenv": "^17.2.1",
|
|
32
40
|
"jsrsasign": "^11.1.0",
|
|
33
41
|
"nanoid": "^5.0.9"
|
package/readme.md
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
# @interopio/bridge
|
|
2
2
|
|
|
3
|
+
`io.Bridge` is a distributed scalable application that provides connectivity between `io.Connect` platforms.
|
|
4
|
+
|
|
3
5
|
## Getting Started
|
|
4
6
|
|
|
5
|
-
- Install Node.js 24.
|
|
6
|
-
- Set IO_BRIDGE_LICENSE_KEY environment variable
|
|
7
|
+
- Install Node.js 20.15+/22.2+/24.0+
|
|
7
8
|
- From command line, run:
|
|
8
9
|
```shell
|
|
9
|
-
npx @interopio/bridge
|
|
10
|
+
npx @interopio/bridge --license.key.file=<path to license key file>
|
|
10
11
|
```
|
|
12
|
+
## Documentation
|
|
13
|
+
|
|
14
|
+
[io.Bridge Documentation](https://docs.interop.io/bridge)
|