{
  "version": 3,
  "sources": ["../src/logger.ts", "../src/common/filters.ts", "../src/common/utilities.ts", "../src/domains/metrics/filters.ts", "../src/metrics/common.ts", "../src/worker/nodeWorker.ts", "../src/worker/core.ts", "../src/metrics/publisher.ts", "../src/metrics/rest.ts", "../src/metrics/file.ts", "../src/main/index.ts", "../src/main/main.ts", "../src/common/encoders.ts", "../src/gateway/core.ts", "../src/constants.ts", "../src/node.ts", "../src/common/messages.ts", "../src/common/types.ts", "../src/reason.ts", "../src/restrictions/compat.ts", "../src/restrictions/antlr4/RestrictionsParser.ts", "../src/restrictions/antlr4/RestrictionsLexer.ts", "../src/restrictions/antlr4/RestrictionsVisitor.ts", "../src/restrictions/visitor.ts", "../src/restrictions.ts", "../src/common/ids.ts", "../src/state/core.ts", "../src/state/peers.ts", "../src/local-node/core.ts", "../src/domains/global/constants.ts", "../src/domains/global/core.ts", "../src/domains/global/messages.ts", "../src/common/peerIdentity.ts", "../src/common/jwt.ts", "../src/common/tokens.ts", "../src/common/context/state.ts", "../src/common/context/messages.ts", "../src/common/context/constants.ts", "../src/common/context/ops.ts", "../src/address.ts", "../src/domains/global/state.ts", "../src/auth/impl.ts", "../src/auth/core.ts", "../src/common/asyncSerializer.ts", "../src/auth/basic.ts", "../src/auth/oauth2.ts", "../src/auth/custom.ts", "../src/domains/agm/constants.ts", "../src/domains/agm/messages.ts", "../src/domains/agm/mthds.ts", "../src/domains/agm/state.ts", "../src/domains/agm/utilities.ts", "../src/domains/agm/subscriptions.ts", "../src/domains/agm/core.ts", "../src/domains/agm/calls.ts", "../src/domains/activity/constants.ts", "../src/domains/activity/core.ts", "../src/state/types/activity.ts", "../src/domains/activity/state.ts", "../src/domains/activity/activities.ts", "../src/domains/activity/messages.ts", "../src/domains/activity/gatewayRequest.ts", "../src/domains/activity/factories.ts", "../src/domains/metrics/core.ts", "../src/domains/metrics/constants.ts", "../src/state/types/metrics.ts", "../src/metrics/custom.ts", "../src/gateway/metrics.ts", "../src/domains/context/core.ts", "../src/state/types/context.ts", "../src/domains/context/constants.ts", "../src/domains/context/messages.ts", "../src/domains/bus/core.ts", "../src/domains/bus/constants.ts", "../src/domains/bus/messages.ts", "../src/gateway/clients.ts", "../src/gateway/scavenger.ts", "../src/versions.ts", "../src/state/types/common.ts", "../src/mesh-node/core.ts", "../src/common/ws/factory.ts", "../src/mesh/ws/broker/client.ts", "../src/mesh/compat.ts", "../src/mesh/ws-mesh.ts", "../src/mesh/ws-mesh/relay.ts", "../src/mesh/rest-directory.ts", "../src/gateway/visibility.ts", "../src/mesh/static-directory.ts"],
  "sourcesContent": ["import {IOGateway} from '../gateway';\n\nenum LogLevel {\n    trace,\n    debug,\n    info,\n    warn,\n    error,\n}\n\nconst loggers: {[key: string]: Logger} = Object.create(null);\nconst logLevels: Record<string, LogLevel> = {};\nconst ROOT = 'gateway';\nlogLevels[ROOT] = LogLevel.trace;\nlet appender : (e: IOGateway.Logging.LogEvent) => void  = (e) => {\n    console[e.level](`${e.time.toISOString()} ${e.level.toUpperCase()} [${e.name}] - ${e.message}`, ...e.data);\n};\n\ntype LogLevelKey = keyof typeof LogLevel;\n\nexport interface Logger extends IOGateway.Logging.Logger {\n    (level: LogLevelKey, message?: string, ...args: unknown[])\n    child(name: string): Logger\n}\nexport function logEvent(event: IOGateway.Logging.LogEvent) {\n    const {name, level} = event;\n    checkNameAndConfigureLevel(name);\n    if (isLevelEnabledFor(level, name)) {\n        appender(event);\n    }\n}\n\nfunction log(this: Logger, name: string, level: LogLevelKey, message: string, ...data: unknown[]) {\n    if (this.enabledFor(level)) {\n        const time = new Date();\n        const event: IOGateway.Logging.LogEvent = {time, level, name, message, data};\n        appender(event);\n    }\n}\n\nfunction isLevelEnabledFor(level: LogLevelKey, name: string) {\n    const logLevelValue = LogLevel[level];\n    const configuredLevel = logLevels[name];\n    return configuredLevel <= logLevelValue;\n}\n\nfunction newLogger(name: string): Logger {\n    checkNameAndConfigureLevel(name);\n    const logger: Logger = function(level: LogLevelKey, message: string, ...args:unknown[]) {\n        log.call(logger, name, level, message, ...args);\n    } as Logger;\n    function methods(key: string): key is LogLevelKey {\n        return isNaN(Number(key));\n    }\n    for (const method of Object.keys(LogLevel).filter(methods)) {\n        logger[method] = function(message: string, ...args: unknown[]) {\n            log.call(logger, name, method, message, ...args);\n        };\n    }\n    logger.enabledFor = function(level: LogLevelKey) {\n        return isLevelEnabledFor(level, name);\n    }\n    logger.child = function (suffix: string) {\n        return getLogger(`${name}.${suffix}`);\n    }\n    return logger;\n}\n\nfunction checkNameAndConfigureLevel(name: string) {\n    if (!name.startsWith(ROOT)) throw new Error(`Logger name must start with ${ROOT}`);\n    if (!logLevels[name]) {\n        const orderedEntries = Object.entries(logLevels).sort(([n1,], [n2,])=> n2.localeCompare(n1));\n        const [, level] = orderedEntries.find(([prefix,]) => name.startsWith(prefix))!;\n        logLevels[name] = level;\n    }\n}\n\nexport function getLogger(name: string): Logger {\n    let logger: Logger | undefined = loggers[name];\n    if (logger === undefined) {\n        logger = newLogger(name);\n        loggers[name] = logger;\n    }\n    return logger;\n}\n\nexport function configure(config: IOGateway.Logging.LogConfig) {\n    function updateLevels(prefix: string, level: LogLevelKey) {\n        for (const name of Object.keys(logLevels).filter(k => k.startsWith(prefix))) {\n            logLevels[name] = LogLevel[level];\n        }\n    }\n\n    const logLevel = config.level;\n\n    if (typeof logLevel === 'string') {\n        logLevels[ROOT] = LogLevel[logLevel];\n        updateLevels(ROOT, logLevel);\n    } else if (typeof logLevel === 'object') {\n        const orderedEntries = Object.entries(logLevel).sort(([n1], [n2]) => n1.localeCompare(n2));\n        for (const [prefix, level] of orderedEntries) {\n            updateLevels(prefix, level);\n        }\n    }\n\n    appender = config.appender ?? appender;\n}\n", "import {IOGateway} from '../../gateway';\n\nfunction isExactMatch(matcher: IOGateway.Filtering.Matcher): matcher is IOGateway.Filtering.ExactMatch {\n    return typeof matcher === 'string';\n}\n\nexport function valueMatches(lhs: IOGateway.Filtering.Matcher, rhs?: unknown): boolean {\n    if (isExactMatch(lhs)) {\n        return lhs === rhs\n    } else {\n        if (typeof rhs === 'string') {\n            return lhs.test(rhs);\n        }\n        return false;\n    }\n}\n\nexport function valuesMatch(matchers: IOGateway.Filtering.Matcher[], value?: string): boolean {\n    for (const matcher of matchers) {\n        if (valueMatches(matcher, value)) {\n            return true;\n        }\n    }\n    return false;\n}\n//https://cljs.github.io/api/syntax/regex\nconst CLOJURESCRIPT_REGEX = /^#(\\(\\?(?<flags>[im]*)\\))?(?<pattern>.*)$/;\n\nconst JAVASCRIPT_REGEX = /^\\/(?<pattern>(?:[^/\\\\]|\\\\.)+)\\/(?<flags>[gimsuyd]*)$/;\n\nexport function regexify(expression: IOGateway.Filtering.Matcher): IOGateway.Filtering.Matcher {\n    if (typeof expression === 'string') {\n        let groups = JAVASCRIPT_REGEX.exec(expression)?.groups;\n        groups ??= CLOJURESCRIPT_REGEX.exec(expression)?.groups;\n\n        if (groups?.pattern) {\n            return new RegExp(groups.pattern, groups.flags ?? '');\n        }\n\n    }\n    return expression;\n}\n", "import {DomainKeys, Peer} from '../state/types/state.js';\nimport {Draft, produce} from 'immer';\nimport {JoinedPeer} from '../state/peers.js';\n\nexport type WithRequired<Type, Key extends keyof Type> = Type & {\n    [Property in Key]-?: Type[Property]\n}\n\nexport type Omit<Type, Key extends keyof Type> = Pick<Type, Exclude<keyof Type, Key>>\nexport type PartialBy<Type, Key extends keyof Type> = Pick<Partial<Type>, Key> & Omit<Type, Key>;\n\nexport function removev<T>(el: T, c: T[]): T[] {\n    return c.reduce((r: T[], e: T) => {\n        if (e === el) {\n            return r;\n        }\n        return r.concat(e);\n    }, [] as T[]);\n}\n\nexport function ensureDomain<D extends DomainKeys>(peer: Peer, domain: D): JoinedPeer<D> {\n    if (peer[domain]) {\n        return peer as JoinedPeer<D>;\n    }\n    return produce(peer, (p: Draft<Peer>) => {\n        p[domain] = {} as unknown as any;\n    }) as JoinedPeer<D>;\n}\n\nexport function friendlily(o) {\n    // Set => array\n    // Map => object\n    // function is not tested\n    if (o instanceof Set) {\n        return Array.from(o as Set<unknown>).map(friendlily);\n    } else if (o instanceof Array) {\n        return o.map(friendlily);\n    } else if (o instanceof Map) {\n        return friendlily(Object.fromEntries(o));\n    } else if (o instanceof Object) {\n        return Object.keys(o).reduce((a, k) => {\n            a[k] = friendlily(o[k]);\n            return a;\n        }, {});\n    } else {\n        return o;\n    }\n}\n\nfunction replacerWithPath(replacer: (this: unknown, field: string | number, value: unknown, path: string) => unknown): (this: unknown, field: string | number, value: unknown) => unknown {\n    const paths = new Map<unknown, string>();\n    return function (this: unknown, field, value) {\n        const path = paths.get(this) + (Array.isArray(this) ? `[${field}]` : `.${field}`);\n        if (value === Object(value)) paths.set(value, path);\n        if (value instanceof RegExp) value = `#${value.source}`;\n        return replacer.call(this, field, value, path.replace(/undefined\\.\\.?/, ''));\n    };\n}\n/**\n * Creates a function to be used as JSON.stringify() replacer that will replace values for fields in specified paths.\n *\n * @param paths field paths to be sanitized.\n */\nexport function sanitizerOf(...paths: string[]): (this: unknown, field: string | number, value: unknown) => unknown {\n    return replacerWithPath((field: string | number, value: unknown, path: string) => {\n        if (paths.indexOf(path) !== -1) {\n            return '******';\n        }\n        return value;\n    });\n}\n\nconst KEY_COMPARE_FN: ((a: string, b: string) => number) | undefined = (a: string, b: string) => a.localeCompare(b);\n/**\n * Converts an object to a string representations that is stable enough to be used as property or map key.\n */\nexport function objectAsKey(obj: Record<string, unknown>) {\n    return JSON.stringify(obj, Object.keys(obj).sort(KEY_COMPARE_FN));\n}\n\nexport function some<T>(e: T | undefined): e is T {\n    return  !!e;\n}\n", "import {valueMatches, valuesMatch} from '../../common/filters.js';\nimport {IOGateway} from '../../../gateway';\n\nexport function publisherMatches(publisherFilter: Record<string, IOGateway.Filtering.Matcher>,\n                                 repoId: IOGateway.Metrics.Identity): boolean {\n    for (const [k, v] of Object.entries(publisherFilter)) {\n        const rv = repoId[k];\n        if (!valueMatches(v, rv)) {\n            return false;\n        }\n    }\n    return true;\n}\n\nexport function metricMatches(metricFilter: IOGateway.Filtering.Matcher[],\n                              name: IOGateway.Metrics.Name): boolean {\n    return valuesMatch(metricFilter, name);\n}\n\nexport function isAllowed(repoId: IOGateway.Metrics.Identity,\n                          name: IOGateway.Metrics.Name,\n                          filters?: IOGateway.MetricFilters): boolean {\n    const result = filters?.publishers?.reduce((r: boolean | undefined, filterConfig) => {\n        if (publisherMatches(filterConfig.identity, repoId)) {\n            const blocked = filterConfig.metrics.block ?? filterConfig.metrics.blacklist ?? [];\n            if (blocked.length > 0 && metricMatches(blocked, name)) {\n                return false;\n            } else {\n                const allowed = filterConfig.metrics.allow ?? filterConfig.metrics.whitelist ?? [];\n                return r || metricMatches(allowed, name);\n            }\n        }\n        return r;\n    }, undefined);\n    if (result !== undefined) {\n        return result;\n    }\n    const nonMatched: IOGateway.Filtering.Action = filters?.non_matched ?? 'allow';\n    return nonMatched === 'allow' || nonMatched === 'whitelist';\n}\n", "import {DataPoint} from './core.js';\nimport {getLogger} from '../logger.js';\nimport {objectAsKey} from '../common/utilities.js';\nimport {IOGateway} from '../../gateway';\n\nconst log = getLogger('gateway.metrics.common');\n\nexport type MetricsEvent = StatusUpdateEvent | DataPointEvent;\n\nexport type StatusUpdateEvent = {\n    identity: IOGateway.Metrics.Identity\n    status: IOGateway.Metrics.Status\n    metadata?: Record<string, unknown>\n}\n\nexport type DataPointEvent = {\n    identity: IOGateway.Metrics.Identity,\n    metric: IOGateway.Metrics.Definition,\n    datapoint: Omit<DataPoint, 'name'>\n}\n\nfunction extractMetadata(metadata?: Record<string, unknown>) {\n    if (metadata && Object.keys(metadata).length > 0) {\n        return metadata;\n    }\n    return undefined;\n}\n\nfunction value(v: string | number | object): IOGateway.Metrics.Value {\n    if (typeof v === 'object') {\n        const composite = Object.entries(v).reduce((acc, [key, val]) => {\n            acc[key] = value(val);\n            return acc;\n        }, {});\n        return {value: composite};\n    } else if (typeof v === 'string') {\n        return {value: v};\n    } else {\n        return {value: v};\n    }\n}\n\nfunction datapoint(dp: Omit<DataPoint, 'name'>): IOGateway.Metrics.DataPoint {\n    return {timestamp: dp.timestamp ?? Date.now(), value: value(dp.value)};\n}\n\n\nfunction groupBy<T>(data: Iterable<T>, keyFn: (t: T) => string): Iterable<[string, T[]]> {\n    return Array.from(data).reduce((acc, t) => {\n        const key = keyFn(t);\n        const values = acc.get(key) ?? [];\n        if (values.length === 0) {\n            acc.set(key, values);\n        }\n        values.push(t);\n        return acc;\n    }, new Map<string, T[]>());\n}\n\n/**\n * Conflates a vector of metric updates based on their repository's identity.\n */\nexport function* conflateRepo(maxCount: number, data: MetricsEvent[]): Generator<IOGateway.Metrics.Update> {\n    if (log.enabledFor('trace')) {\n        log.debug(`conflating ${JSON.stringify(data)}`);\n    }\n    const dataByIdentity = groupBy(data, (update) => objectAsKey(update.identity));\n\n    let current: IOGateway.Metrics.Update | undefined = undefined;\n    for (const [, dps] of dataByIdentity) {\n        // need to port partition-all?\n        for (const e of dps) {\n            if (e['status']) {\n                const {identity, status, metadata} = e as StatusUpdateEvent;\n                // this is a status event\n                // emit the current + status message and clear current\n                if (current) {\n                    yield current;\n                }\n                yield {identity, status, metrics: undefined, metadata: extractMetadata(metadata)};\n                current = undefined;\n            } else {\n\n                // this is a data point\n                const {metric: definition, identity, datapoint: dp} = (e as DataPointEvent);\n                const name = definition?.name;\n                if (!current) {\n                    current = {identity};\n                }\n                current.metrics = current.metrics ?? {};\n                current.metrics[name] = current.metrics[name] ?? {definition: {...definition}, datapoints: []};\n                delete (current.metrics[name].definition as { name?: string })['name'];\n\n                current.metrics[name].datapoints.push(datapoint(dp));\n            }\n        }\n        if (current) {\n            yield current;\n        }\n    }\n}\n", "import { fork, ChildProcess } from 'child_process';\nimport {EventEmitter} from 'events';\nimport {fileURLToPath} from 'url';\n\ntype ProcessMessage = {\n    type: 'error' | 'message'\n    message: string\n    data?: unknown\n}\n\nexport class NodeWorker implements Worker {\n    private readonly events = new EventEmitter();\n    private readonly ps: ChildProcess;\n    constructor(url: string | URL, args: readonly string[], options?) {\n        this.events = new EventEmitter();\n        const modulePath = fileURLToPath(url);\n        this.ps = fork(modulePath, args, options);\n        this.ps.on('message', (message: string) => {\n            let parsed: ProcessMessage;\n            try {\n                parsed = JSON.parse(message) as ProcessMessage;\n                if (parsed?.type === undefined) {\n                    this.events.emit('messageerror', new Error(`Invalid message: ${message}`));\n                }\n            } catch (e) {\n                this.events.emit('messageerror', e);\n                return;\n            }\n            if (parsed.type === 'error') {\n                this.events.emit('error', new Error(parsed.message));\n            } else {\n                this.events.emit('message', {data: parsed.data});\n            }\n        });\n        this.ps.stdout?.on('data', (data) => {\n            console.log(data);\n        });\n        this.ps.stderr?.on('data', (data) => {\n            console.error(data);\n        });\n        this.ps.on('error', (error) => {\n            this.events.emit('error', error);\n        });\n        this.events.on('message', (message) => {\n            if (this.onmessage) {\n                this.onmessage(message);\n            }\n        });\n        this.events.on('error', (error) => {\n            if (this.onerror) {\n                this.onerror(error);\n            }\n        });\n        this.events.on('messageerror', (error) => {\n            if (this.onmessageerror) {\n                this.onmessageerror(error);\n            }\n        });\n\n    }\n    onerror: ((error) => void) | null = null;\n    onmessage: ((message) => void) | null = null;\n    onmessageerror: ((error) => void) | null = null;\n\n\n    postMessage(message: unknown): void {\n        this.ps.send({data: message}, (error) =>{\n            if (error) {\n                this.events.emit('error', error);\n            }\n        });\n    }\n\n    terminate(): void {\n        this.ps.kill();\n    }\n\n    addEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void {\n        this.events.addListener(type, listener);\n    }\n    removeEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void {\n        this.events.removeListener(type, listener);\n    }\n\n    dispatchEvent(event: Event): boolean {\n        return this.events.emit(event.type, event);\n    }\n}\n", "\nasync function nodeWorker(url: URL, parameters?: Record<string, string>, options?) {\n    const {NodeWorker} = await import('./nodeWorker.js');\n    const args = Object.entries(parameters ?? {}).map(([k,v]) => `--${k}=${v}`);\n    return new NodeWorker(url, args, options);\n}\n\nasync function webWorker(url: URL, parameters?: Record<string, string>, options?: & WorkerOptions) {\n    Object.entries(parameters ?? {}).forEach(([k, v]) => url.searchParams.append(k, v));\n    return new Worker(url, options);\n}\n\nexport function newWorker({url, parameters, options}: {url: URL, parameters?: Record<string, string>, options?: unknown}): Promise<Worker> {\n    return (\n        typeof process !== 'undefined'\n            ? nodeWorker(url, parameters, options)\n            : webWorker(url, parameters, options as WorkerOptions))\n    ;\n}\n", "import * as core from './core.js';\nimport * as common from './common.js';\nimport {newWorker} from '../worker/core.js'\nimport {getLogger, logEvent} from '../logger.js';\nimport {deserializeError} from 'serialize-error';\nimport {sanitizerOf} from '../common/utilities.js';\nimport {isAllowed} from '../domains/metrics/filters.js';\nimport {PublishCommand} from './publisher/types.js';\nimport {IOGateway} from '../../gateway';\n\nconst log = getLogger('gateway.metrics.publisher');\n\nfunction makeStatusUpdate(repoId: IOGateway.Metrics.Identity,\n                          status: core.Status, metadata?: unknown): common.StatusUpdateEvent {\n    const statusUpdate = {identity: repoId, status: {...status, 'updated-at': status.updated, 'expires-at': status.expires}};\n    if (metadata) {\n        statusUpdate['metadata'] = metadata;\n    }\n    return statusUpdate;\n}\n\ntype LatestStatus = {\n    status: Omit<core.Status, 'timestamp' | 'expires' | 'expires-at' | 'updated-at'>\n    timestamp?: number,\n    expires?: number,\n    initial: boolean,\n    stopped: boolean\n}\n\nclass BasicRepository implements core.Repository {\n    private running: boolean = true;\n    private readonly latestStatus: LatestStatus = {\n        initial: true,\n        stopped: false,\n        status: {state: 0, updated: Date.now(), description: 'Running'}\n    };\n    private heartbeatCleanup?: NodeJS.Timeout;\n    private readonly metrics: Map<string, IOGateway.Metrics.Definition> = new Map();\n\n    constructor(private readonly publisher: Publisher,\n                private readonly filters: IOGateway.MetricFilters | undefined,\n                private readonly repoId: IOGateway.Metrics.Identity,\n                private readonly heartbeatInterval: number,\n                private readonly metadata?: unknown) {\n    }\n\n    start() {\n        log.info(`starting repository for ${JSON.stringify(this.repoId)} with heartbeat interval ${this.heartbeatInterval}ms`);\n        const now = Date.now();\n        if (this.latestStatus.stopped) {\n            this.latestStatus.status.state = 0;\n            this.latestStatus.status.description = 'Running';\n            this.latestStatus.status.updated = now;\n            this.latestStatus.initial = true;\n            this.latestStatus.stopped = false;\n        }\n        if (this.heartbeatInterval >= 0) {\n            const latest = this.latestStatus.status;\n            const status: core.Status = {\n                ...latest,\n                timestamp: now,\n                expires: now + (3 * this.heartbeatInterval)\n            };\n            const msg = makeStatusUpdate(this.repoId, status, this.metadata);\n            this.publisher(msg);\n        }\n        this.running = true;\n        if (this.heartbeatInterval > 0) {\n            this.heartbeatCleanup = setInterval(() => {\n                if (!this.running) {\n                    return;\n                }\n                const now = Date.now();\n                const latest = this.latestStatus.status;\n                const status: core.Status = {\n                    ...latest,\n                    timestamp: now,\n                    expires: now + (3 * this.heartbeatInterval)\n                };\n                const msg = makeStatusUpdate(this.repoId, status, this.metadata);\n                this.publisher(msg);\n            }, this.heartbeatInterval);\n        }\n    }\n\n    stop() {\n        log.info(`stopping repository for ${JSON.stringify(this.repoId)}`);\n        this.running = false;\n        if (this.heartbeatCleanup) {\n            clearInterval(this.heartbeatCleanup);\n        }\n        const now = Date.now();\n        this.latestStatus.stopped = true;\n        this.status({\n            state: -1,\n            timestamp: now,\n            updated: now,\n            expires: now,\n            description: 'Repository Stopped'\n        });\n    }\n\n    add(definitions: core.Definitions) {\n        for (const def of definitions) {\n            const key = def.name;\n            if (!(this.metrics.has(key) || !(this.filters === undefined || isAllowed(this.repoId, key, this.filters)))) {\n                this.metrics.set(key, def);\n            }\n        }\n    }\n\n    publish(dataPoints: core.DataPoints) {\n        if (this.running && dataPoints.length > 0) {\n            for (const dp of dataPoints) {\n                const metric = this.metrics.get(dp.name);\n                if (metric) {\n                    const msg: common.DataPointEvent = {\n                        identity: this.repoId,\n                        metric: metric,\n                        datapoint: {...dp}\n                    };\n                    delete msg.datapoint['name'];\n                    this.publisher(msg);\n                }\n            }\n        }\n    }\n\n    status(status: core.Status) {\n        const publisherStatus: LatestStatus = {...this.latestStatus};\n        Object.assign(publisherStatus.status, status);\n        publisherStatus.timestamp = status.timestamp;\n        publisherStatus.expires = status.expires;\n\n        const statusChanged = publisherStatus.status.state !== this.latestStatus.status.state;\n        if (this.latestStatus.initial || statusChanged) {\n            publisherStatus.status.updated = status.timestamp;\n        }\n        publisherStatus.initial = false;\n\n        Object.assign(this.latestStatus, publisherStatus);\n\n        if (this.running || publisherStatus.stopped) {\n            const msg = makeStatusUpdate(this.repoId, status, this.metadata);\n            this.publisher(msg);\n        }\n    }\n}\n\nexport class BasicRepositoryFactory implements core.RepositoryFactory {\n    constructor(\n        private readonly config: IOGateway.BasicMetricsPublisherConfig | undefined,\n        private readonly publisher: Publisher) {\n    }\n\n    repository(peerIdentity: IOGateway.Metrics.Identity, opts?: core.Options): core.Repository {\n        const peerMetadata = opts?.metadata;\n        const heartbeatInterval = this.config?.heartbeats ?? 0;\n        return new BasicRepository(this.publisher, this.config?.filters, peerIdentity, heartbeatInterval, peerMetadata);\n    }\n\n    async shutdown() {\n        await this.publisher.close();\n    }\n\n    on(listener: (event: common.MetricsEvent) => void) {\n        this.publisher.on(listener);\n    }\n}\n\n\nexport interface Publisher {\n    (msg: common.MetricsEvent): void\n    on(listener: (event: common.MetricsEvent) => void): void\n    close(): Promise<void>\n}\n\nexport type WorkerConfig =  {\n    preload?: string,\n    worker?: { url: URL, parameters: {logLevel?: IOGateway.Logging.LogConfig['level']}, options?: unknown  }\n    publishFn?: ((command: PublishCommand) => Promise<unknown>) | string\n}\n\n\nexport interface WorkerCommandType {\n    \"start\": {\n        cfg: BasicPublisherConfig | undefined,\n        publishFn: ((command: PublishCommand) => Promise<unknown>) | string\n    }\n    \"update\": IOGateway.Metrics.Update\n    \"stop\": unknown\n}\n\nexport type WorkerRequest<C extends keyof WorkerCommandType> = {\n    id: number\n    cmd: C,\n    arg: WorkerCommandType[C]\n}\n\nexport type BasicPublisherConfig = IOGateway.BasicMetricsPublisherConfig & {preload?: string, worker?: {url: URL, options?: unknown}};\n\nexport async function basicPublisher<C extends BasicPublisherConfig>(\n    cfg: C | undefined,\n    xform: (data: common.MetricsEvent[]) => Iterable<IOGateway.Metrics.Update>,\n    publishFn: ((command: PublishCommand) => Promise<unknown>) | string\n): Promise<Publisher> {\n    log.info(`creating publisher with configuration\\n${JSON.stringify(cfg, sanitizerOf('authentication.password'))}`);\n\n    // add support for in process publishing\n    const workerCfg = cfg?.worker;\n    if (workerCfg === undefined) {\n        throw new Error('in proc publishing is not supported. please provide worker configuration');\n    }\n    const cfgWithoutWorker = cfg ?\n        Object.fromEntries(\n            Object.entries(cfg)\n                .filter(([key]) => key !== 'worker')\n        ) : {};\n\n    try {\n        return await publishInWorker(publishFn as string, cfgWithoutWorker, xform, workerCfg);\n    } catch (e) {\n        log.error(`Failed to create basic publisher`, e);\n        throw e;\n    }\n}\n\nclass WorkerPublisher {\n    private readonly maxQueueSize: number;\n    private readonly cfg: Omit<BasicPublisherConfig, 'worker'>;\n    private readonly worker: Worker\n    private lastId: number;\n    private readonly processing: Map<number, {resolver: {resolve, reject}}>;\n    private readonly promises: Map<number, Promise<void>>;\n    private readonly listeners: ((event: common.MetricsEvent) => void)[];\n    constructor(worker: Worker, cfg: Omit<BasicPublisherConfig, 'worker'>) {\n        const {buffer_size: bufferSize} = cfg;\n        this.maxQueueSize = bufferSize ?? 1000;\n        this.cfg = cfg;\n        this.lastId = 0;\n        this.worker = worker;\n        this.processing = new Map<number, { resolver: { resolve, reject } }>();\n        this.promises = new Map<number, Promise<void>>();\n        this.listeners = [];\n    }\n\n    async start(publishFn: string) {\n        await new Promise<void>((resolve) => {\n            this.worker.onerror = (event) => {\n                log.error(`error from worker: ${event.message}`);\n            };\n            this.worker.onmessageerror = (event) => {\n                log.error(`error receiving message: ${event.data}`);\n            }\n            this.worker.onmessage = (event) => {\n                if (event.data.ready) {\n                    resolve();\n                    return;\n                }\n                if (event.data.id) {\n                    const {id, result, error} = event.data;\n                    const p = this.processing.get(id);\n                    if (p) {\n                        const {resolver} = p;\n                        try {\n                            if (error) {\n                                resolver.reject(deserializeError(error));\n                            } else {\n                                resolver.resolve(result);\n                            }\n                        } finally {\n                            this.processing.delete(id);\n                        }\n                    } else {\n                        log.error(`unknown message id: ${id}`);\n                    }\n                } else if (event.data.log) {\n                    const {level, time, name, message, data} = event.data.log as IOGateway.Logging.LogEvent;\n                    logEvent({level, time: new Date(time), name, message, data: data.map(d => deserializeError(d))});\n                } else if (event.data.event) {\n                    this.listeners.forEach(l => l(event.data.event));\n                }\n            };\n        });\n        try {\n            /*const context = */await this.enqueue('start', {cfg: this.cfg, publishFn})[1];\n            log.info(`publisher worker [${publishFn}] started`);\n        } catch (e) {\n            log.error(`error starting publisher worker [${publishFn}]: ${e}`);\n            this.worker.terminate();\n            throw e;\n        }\n    }\n\n    private enqueue<T, K extends keyof WorkerCommandType>(cmd: K, arg: WorkerCommandType[K]): [number, Promise<T>] {\n        if (this.processing.size >= this.maxQueueSize) {\n            log.warn(`processing queue is full. dropping cmd: ${JSON.stringify(cmd)}`);\n        }\n        const id = ++this.lastId;\n        return [id, new Promise<T>((resolve, reject) => {\n            this.processing.set(id, {resolver: {resolve, reject}});\n            const request: WorkerRequest<K> = {id, cmd, arg};\n            this.worker.postMessage(request);\n        })];\n    }\n\n    next(u: IOGateway.Metrics.Update) {\n        const [id, p] = this.enqueue<void, 'update'>('update', u);\n        p.catch((e) => {\n            log.warn(`update [${id}] error`, e);\n        }).finally(() => {\n            this.promises.delete(id);\n        });\n    }\n\n    async stop(rejectProcessing = false, timeout = 1000) {\n        log.info(`stopping publisher worker rejectProcessing: ${rejectProcessing}, timeout: ${timeout}, promises: ${this.promises.size}`);\n        const rejectProcessingFn = (reason: 'now' | 'timeout') => {\n            this.processing.forEach(({resolver}) => {\n                resolver.reject(new Error(`reject on stop: ${reason}`));\n            });\n        };\n        try {\n            if (rejectProcessing) {\n                rejectProcessingFn('now');\n            }\n            const pending = Promise.allSettled(this.promises);\n            const stopPromise = this.enqueue('stop', undefined)[1];\n            await new Promise<void>((resolve, reject) => {\n                const timeoutId = setTimeout(() => {\n                    rejectProcessingFn('timeout');\n                    reject(new Error('timeout'));\n                }, timeout);\n                pending.then((outcomes) => {\n                    clearTimeout(timeoutId);\n                    for (const outcome of outcomes) {\n                        if (outcome.status === 'rejected') {\n                            log.error(`Pending future failed with ${outcome.reason} on stop`)\n                        }\n                    }\n                    resolve();\n                });\n            });\n            await stopPromise;\n            if (this.promises.size > 0) {\n                log.error(`uncleared promises: ${this.promises.size}`);\n            }\n            log.info(`publisher worker stopped`);\n        } finally {\n            this.worker.terminate();\n        }\n    }\n\n    on(listener: (event: common.MetricsEvent) => void) {\n        this.listeners.push(listener);\n    }\n\n}\n\nasync function publishInWorker(publishFn: string,\n                               cfg: Omit<BasicPublisherConfig, 'worker'>,\n                               xform: (data: common.MetricsEvent[]) => Iterable<IOGateway.Metrics.Update>,\n                               workerCfg: {url: URL, parameters?: Record<string, string>, options?: unknown}): Promise<Publisher> {\n\n\n    const worker = new WorkerPublisher(await newWorker(workerCfg), cfg);\n    await worker.start(publishFn);\n\n\n    const publisher: Publisher = (msg: common.MetricsEvent): void => {\n        for (const u of xform([msg])) {\n            worker.next(u);\n        }\n    };\n    publisher.close = async (): Promise<void> => {\n        await worker.stop();\n    };\n    publisher.on = (listener: (event: common.MetricsEvent) => void): void => {\n        worker.on(listener);\n    };\n\n    return publisher;\n}\n\nexport function basicRepositoryFactory(config: IOGateway.BasicMetricsPublisherConfig | undefined, publisher: Publisher): BasicRepositoryFactory {\n    return new BasicRepositoryFactory(config, publisher);\n}\n", "import {basicRepositoryFactory, basicPublisher, WorkerConfig} from './publisher.js';\nimport {conflateRepo} from './common.js';\nimport * as core from './core.js';\nimport {IOGateway} from '../../gateway';\n\nexport type RestConfig = IOGateway.RestMetricsPublisherConfig & WorkerConfig\n\nexport async function restPublisher(config?: RestConfig) {\n    const conflationMaxCount = config?.conflation?.[\"max-datapoints-repo\"] ?? 50;\n    return await basicPublisher<RestConfig>(\n        config,\n        (data) => conflateRepo(conflationMaxCount, data),\n        config?.publishFn ?? '@interopio/gateway/metrics/publisher/rest'\n    );\n}\n\nexport async function restRepositoryFactory(config?: RestConfig): Promise<core.RepositoryFactory> {\n    return basicRepositoryFactory(config, await restPublisher(config));\n}\n", "import {basicPublisher, basicRepositoryFactory, Publisher, WorkerConfig} from './publisher.js';\nimport {conflateRepo} from './common.js';\nimport * as core from './core.js';\nimport {getLogger} from '../logger.js';\nimport {IOGateway} from '../../gateway';\n\nconst log = getLogger('gateway.metrics.file');\n\nexport type FileConfig = IOGateway.FileMetricsPublisherConfig & WorkerConfig\n\nasync function filePublisher(config: FileConfig): Promise<Publisher> {\n    const conflationMaxCount = config.conflation?.[\"max-datapoints-repo\"] ?? 50;\n    log.info(`will record metrics to ${config.location}`);\n    return await basicPublisher(\n        config,\n        (data) => conflateRepo(conflationMaxCount ?? 1, data),\n        config?.publishFn ?? '@interopio/gateway/metrics/publisher/file');\n}\n\nexport async function fileRepositoryFactory(config: FileConfig) : Promise<core.RepositoryFactory> {\n    return basicRepositoryFactory(config, await filePublisher(config));\n}\n", "import * as IOGateway from './main.js';\n\nexport {IOGateway};\n\nexport default IOGateway.Factory;\n", "export * as Encoding from '../common/encoders.js';\nexport * as Logging from '../logger.js';\nexport * as Filtering from '../common/filters.js';\nexport * from '../gateway/core.js';\n", "import t from 'transit-js';\n\nclass BiMap {\n    private readonly map: Map<string, string>;\n    private readonly reverse = new Map<string, string>();\n    constructor(map?: Map<string, string>) {\n        if (map) {\n            for (const [k, v] of map) {\n                this.reverse.set(v, k);\n            }\n        } else {\n            // just to not be undefined\n            map = this.reverse;\n        }\n        this.map = map;\n    }\n\n    public get(key: string): string | undefined {\n        return this.map.get(key);\n    }\n    public rev(value: string): string | undefined {\n        return this.reverse.get(value);\n    }\n}\n\nfunction namespacedKeyword(value: string, namespaces: BiMap): Keyword {\n    const idx = value.indexOf('/');\n    if (idx === -1) {\n        return t.keyword(value);\n    }\n    const prefix = value.substring(0, idx);\n    const namespace = namespaces?.get(prefix) ?? prefix;\n    return t.keyword(namespace + value.substring(idx));\n}\ninterface Keyword {\n    name(): string\n    namespace(): string | null\n}\nfunction parseKeyword(keyword: Keyword, namespaces: BiMap): string {\n    const name = keyword.name();\n    const namespace = keyword.namespace();\n    if (namespace === null) {\n        return name;\n    }\n    const prefix = namespaces.rev(namespace) ?? namespace;\n    return prefix + '/' + name;\n}\n\nfunction toTransit<T>(m: T, namespaces: BiMap, keywordize?: Map<string, KeywordizeCommand>, root = '') {\n    if (m instanceof Array) {\n        return m.map((v) => {\n            // todo support array paths\n            return v;\n        });\n    } else if (m instanceof Object) {\n        const data = t.map();\n        for (const k in m) {\n            const kc = keywordize?.get(root);\n            const key = kc === null ? k : namespacedKeyword(k, namespaces);\n            const v = m[k];\n            const path = `${root}/${k}`; // allow over\n\n            const vc = keywordize?.get(path);\n            const keywordizeValue = vc !== undefined && typeof v === 'string' && (vc === '*' || vc?.has(v));\n            if (keywordizeValue) {\n                data.set(key, namespacedKeyword(v, namespaces));\n            } else {\n                if (kc === null && !keywordize?.has(path)) {\n                    keywordize?.set(path, null);\n                }\n                const value = toTransit(v, namespaces, keywordize, path);\n                data.set(key, value);\n            }\n        }\n        return data;\n    } else {\n        return m;\n    }\n}\n\nfunction toJS<T>(data: any, namespaces: BiMap): T {\n    if (t.isKeyword(data)) {\n        return parseKeyword(data as Keyword, namespaces) as T;\n    } else if (t.isMap(data)) {\n        const map = {};\n        for (const [k, v] of data) {\n            const key = t.isKeyword(k) ? parseKeyword(k as Keyword, namespaces) : k;\n            map[key] = toJS(v, namespaces);\n        }\n        return map as T;\n    } else if (t.isList(data) || data instanceof Array) {\n        const list = [];\n        for (const e of data) {\n            list.push(toJS(e, namespaces));\n        }\n        return list as T;\n    }\n    return data;\n}\n\n// exports\nexport type Codec<T, R> = {\n    encode: (msg: T) => R;\n    decode: (data: R) => T;\n};\n\nexport type KeywordizeCommand\n    = '*' // keywordize for all string values for ex {:type :cluster}\n    | Set<string> // keywordize only specific values\n    | null // stop keywordization (even for keys)\n    ;\n\nexport function transit<T>(opts?: { keywordize?: Map<string, KeywordizeCommand>, verbose?: boolean, namespaces?: Map<string, string> }): Codec<T, string> {\n    const type: t.Encodings = opts?.verbose ? 'json-verbose' : 'json';\n    const namespaces = new BiMap(opts?.namespaces);\n    return {\n        encode: (msg: T): string => {\n            const data = toTransit(msg, namespaces, opts?.keywordize);\n            return t.writer(type).write(data);\n        },\n        decode: (data: string): T => {\n            let map;\n            try {\n                map = t.reader(type).read(data);\n            } catch (err) {\n                throw new Error(`\"${data}\" is not valid TRANSIT`, {cause: err});\n            }\n            return toJS<T>(map, namespaces);\n        }\n    }\n}\n\nexport function json<T>(): Codec<T, string> {\n    return {\n        encode: JSON.stringify,\n        decode: JSON.parse\n    }\n}\n\nfunction identity<T>(v: T): T {\n    return v;\n}\n\nfunction transform<T>(v: T): T {\n    // clojurescript compatibility with (js->clj)\n    // https://github.com/clojure/clojurescript/blob/067eaef03678a06d83caf3f66ddf20f9ee71db5b/src/main/cljs/cljs/core.cljs#L11193\n\n    // deep transform arrays\n    if (v instanceof Array || Array.isArray(v)) {\n        return v.map(transform) as T;\n    }\n    // deep transform objects (but not dates for example)\n    if (v?.constructor === Object) {\n        return Object.keys(v).reduce((a: T, k: string) => {\n            a[k] = transform(v[k]);\n            return a;\n        }, {} as T);\n    }\n    // nullify undefined values\n    if (v === undefined) {\n        return null as T;\n    }\n    return v;\n}\n\nexport function direct<T>(opts?: {cljs?: boolean}): Codec<T, T> {\n    return {\n        encode: identity,\n        decode: (opts?.cljs ?? false) ? transform : identity\n    }\n}\n", "import {getLogger} from '../logger.js';\nimport {localNode} from '../local-node/core.js';\nimport {Authenticators, globalDomain} from '../domains/global/core.js';\nimport {Authenticator} from '../auth/core.ts';\nimport * as basic from '../auth/basic.js';\nimport * as oauth2 from '../auth/oauth2.js';\nimport * as custom from '../auth/custom.js';\nimport {GatewayNode, MessageType, RequestType} from '../node.js';\nimport {LocalAddress} from '../state/types/common.js';\nimport {agmDomain} from '../domains/agm/core.js';\nimport {activityDomain} from '../domains/activity/core.js';\nimport {metricsDomain, MetricPublishers} from '../domains/metrics/core.js';\nimport {metrics} from './metrics.js';\nimport {contextDomain, ContextDomainOptions} from '../domains/context/core.js';\nimport {busDomain} from '../domains/bus/core.js';\nimport Scavenger from './scavenger.js';\nimport {GATEWAY_VERSION} from '../versions.js';\nimport {sanitizerOf, WithRequired} from '../common/utilities.js';\nimport {meshNode} from '../mesh-node/core.js';\nimport {Domain} from '../domain.js';\nimport {websocketBrokerMesh} from '../mesh/ws/broker/client.js';\nimport {websocketCluster} from '../mesh/ws-mesh.js';\nimport {restDirectory} from '../mesh/rest-directory.js';\nimport {ClientInfo, Clients, addClient, removeClient} from './clients.js';\nimport * as GatewayEncoders from '../common/encoders.js';\nimport {IOGateway} from '../../gateway';\nimport {defaultPeerRestrictions, defaultRestrictions} from './visibility.js';\nimport { Mesh } from '../mesh.js';\nimport {staticDirectory} from '../mesh/static-directory.js';\n\nconst log = getLogger('gateway');\n\nfunction authenticators(config?: IOGateway.AuthenticationConfig,\n                        globals?: IOGateway.GatewayConfig['globals']): Authenticators {\n    const available = (config?.available as Exclude<string, 'default' | 'available'>[] ?? ['basic']).reduce((a, k) => {\n        if (k === 'basic') {\n            a[k] = basic.authenticator(config?.basic ?? {});\n            return a;\n        }\n        if (k === 'oauth2') {\n            a[k] = oauth2.authenticator(config?.oauth2 ?? {}, globals?.fetch ?? globalThis.fetch);\n            return a;\n        }\n        const authConfig = config?.[k] ?? {};\n        if (authConfig['authenticator']) {\n            const authFn = authConfig['authenticator'];\n            const configWithoutAuthenticator = {...authConfig};\n            delete configWithoutAuthenticator['authenticator'];\n            a[k] = custom.authenticator(configWithoutAuthenticator, authFn);\n            return a;\n        }\n        return a;\n\n    }, {} as Record<string, Authenticator>);\n    return {'default': config?.default as string ?? 'basic', available};\n}\n\nfunction createWebSocketCluster(endpoint: string, relays?: string, directory?: IOGateway.StaticMeshDirectoryConfig | IOGateway.RestMeshDirectoryConfig, globals?: IOGateway.GatewayConfig['globals']): Mesh {\n    let clusterUri = endpoint;\n    if (endpoint.startsWith('http')) {\n        clusterUri = endpoint.replace('http', 'ws');\n        clusterUri += endpoint.endsWith('/') ? '' : '/';\n        clusterUri += 'cluster';\n    }\n    let relaysUri = relays ?? endpoint;\n    if (relays === undefined && relaysUri.startsWith('http')) {\n        relaysUri = relaysUri.replace('http', 'ws');\n        relaysUri += relaysUri.endsWith('/') ? '' : '/';\n        relaysUri += 'relays';\n    }\n    if (directory?.['members'] !== undefined) {\n        return websocketCluster(\n            {\n                cluster: `${clusterUri}`,\n                relays: `${relaysUri}`\n            },\n            staticDirectory((directory as IOGateway.StaticMeshDirectoryConfig).members),\n            globals?.websocket);\n    } else {\n        const announceUri = (directory as IOGateway.RestMeshDirectoryConfig | undefined)?.uri ?? endpoint;\n        const announceInterval = (directory as IOGateway.RestMeshDirectoryConfig | undefined)?.interval;\n        return websocketCluster(\n            {\n                cluster: `${clusterUri}`,\n                relays: `${relaysUri}`\n            },\n            restDirectory({uri: announceUri, announceInterval}, globals?.fetch),\n            globals?.websocket);\n    }\n}\n\nfunction gatewayNode<T extends MessageType = MessageType>(domains: Domain<T>[],\n                                                          nodeId?: string,\n                                                          signingKey?: string,\n                                                          mesh?: IOGateway.MeshConfig,\n                                                          globals?: IOGateway.GatewayConfig['globals']): GatewayNode {\n    if (mesh) {\n        nodeId = mesh?.node ?? nodeId;\n\n        const clusterConfig = mesh.cluster;\n        if (clusterConfig) {\n            const {endpoint, relays, directory} = clusterConfig;\n            const cluster = createWebSocketCluster(endpoint, relays, directory, globals);\n            return meshNode(cluster, domains, {nodeId, signingKey});\n\n        }\n\n        const endpoint = mesh.broker?.endpoint;\n\n        if (endpoint) {\n            const cluster = websocketBrokerMesh(endpoint, globals?.websocket);\n            return meshNode(cluster, domains, {nodeId, signingKey});\n        }\n\n    }\n    return localNode(domains, {nodeId, signingKey});\n}\n\ntype GatewayState = {\n    config: IOGateway.GatewayConfig,\n    auth: Authenticators,\n    factories: MetricPublishers,\n    node: GatewayNode\n    clients: Clients,\n    scavenger: Scavenger,\n    environment?: {endpoint?: string},\n};\n\nconst codec = GatewayEncoders.direct<IOGateway.Message>({cljs: true});\n\nconst DEFAULT_CLIENT_BUFFER_SIZE = 100;\nconst INFO_DESCRIPTION = 'io.Gateway';\nconst INFO = {version: GATEWAY_VERSION, description: INFO_DESCRIPTION};\n\nclass Gateway implements IOGateway.Gateway {\n\n    #gateway: GatewayState | undefined;\n    readonly #config: Readonly<IOGateway.GatewayConfig>;\n\n    constructor(config: Readonly<IOGateway.GatewayConfig>) {\n        this.#config = config;\n    }\n\n    protected async doStart(configuration: Readonly<IOGateway.GatewayConfig>,\n                            environment?: {endpoint?: string }): Promise<GatewayState> {\n        const auth = authenticators(configuration.authentication, configuration.globals);\n        const configuredContextLifetime = configuration.contexts?.lifetime;\n        const contextPeerRestrictions = defaultPeerRestrictions('context', configuration.peers?.visibility) ?? 'cluster';\n        const contextOptions: ContextDomainOptions = {\n            retainedOverride: configuredContextLifetime === 'retained' ? undefined : (configuredContextLifetime ?? 'ref-counted'),\n            defaultPeerRestrictions: contextPeerRestrictions,\n            defaultContextRestrictions: defaultRestrictions('context', configuration.contexts?.visibility)\n        };\n        const factories: MetricPublishers = await metrics(configuration.metrics, environment?.endpoint);\n        const agmPeerRestrictions = (defaultPeerRestrictions('interop', configuration.peers?.visibility) ?? defaultPeerRestrictions('agm', configuration.peers?.visibility)) ?? 'local';\n        const domains = [\n            globalDomain(auth, {...contextOptions, welcomeInfo: INFO}),\n            contextDomain(contextOptions),\n            agmDomain({defaultPeerRestrictions: agmPeerRestrictions, defaultMethodRestrictions: defaultRestrictions('method', configuration.methods?.visibility)}),\n            activityDomain(),\n            busDomain({defaultPeerRestrictions: defaultPeerRestrictions('bus', configuration.peers?.visibility)}),\n            metricsDomain(factories, configuration.metrics?.filters)];\n        const node = gatewayNode(domains, configuration.node, configuration.token?.key, configuration.mesh, configuration.globals);\n        const clients: Clients = new Map<string, ClientInfo>();\n        const scavenger = new Scavenger(clients, node, configuration.clients?.inactive_seconds ?? 0);\n        return {config: configuration, auth, factories, node, clients, scavenger, environment};\n    }\n\n    protected async startGateway(configuration: IOGateway.GatewayConfig, environment?: {endpoint?: string}): Promise<GatewayState> {\n        return await this.doStart(configuration, environment);\n    }\n\n    async start(environment?: {endpoint?: string}) {\n        const cfg = this.#config;\n        log.info(`starting gateway with configuration ${JSON.stringify(cfg, sanitizerOf('token.key'))} and environment ${JSON.stringify(environment)}`);\n        this.#gateway = await this.startGateway(cfg, environment);\n        return this;\n    }\n\n    protected async doStop(gateway: GatewayState) {\n        log.info(`stopping gateway [${JSON.stringify(gateway)}]`);\n        Object.values(gateway.clients).forEach(c => {\n            if (c.onStop) {\n                c.onStop();\n            }\n        });\n        gateway.scavenger.stop();\n        gateway.node.close();\n        for (const f of gateway.factories) {\n            await f.shutdown();\n        }\n        Object.values(gateway.auth.available).forEach((a) => a.stop());\n    }\n\n    async stop() {\n        if (this.#gateway) {\n            await this.doStop(this.#gateway);\n            this.#gateway = undefined;\n        }\n        return this;\n    }\n\n    info(): { version: string, description: string, endpoint?: string } {\n        return {...INFO, endpoint: this.#gateway?.environment?.endpoint};\n    }\n\n    private cnt = 0;\n\n    async connect(handler: (client: IOGateway.GatewayClient, msg: IOGateway.Message) => void): Promise<IOGateway.GatewayClient> {\n        if (!this.#gateway) {\n            throw new Error(`(no gateway) did you call start?`);\n        }\n        const gw = this.#gateway;\n\n        const bufferSize = this.#gateway?.config.clients?.buffer_size ?? DEFAULT_CLIENT_BUFFER_SIZE;\n        log.info(`local client connected, buffer-size: ${bufferSize}`);\n\n        const key = `local:${++this.cnt}`;\n        return new GatewayClient(handler, gw, {key, codec});\n\n    }\n\n    client<T>(handler: ((this: IOGateway.GatewayClient<T>, msg: T) => void),\n              opts?: IOGateway.GatewayClientOptions<T>): IOGateway.GatewayClient<T> {\n        if (!this.#gateway) {\n            throw new Error(`(no gateway) did you call start() and waited for completion?`);\n        }\n        if (handler.length !== 1) {\n            throw new Error(`expecting function with one arg`);\n        }\n        const key = `local:${++this.cnt}`;\n        const gw = this.#gateway;\n\n        return new GatewayClient(handler, gw, {key, codec: codec as unknown as  GatewayEncoders.Codec<IOGateway.Message, T>, ...opts});\n\n    }\n}\n\nclass GatewayClient<T> implements IOGateway.GatewayClient<T> {\n    private readonly receive: (this: GatewayClient<T>, msg: T) => void;\n    readonly key: string;\n    private readonly codec: GatewayEncoders.Codec<IOGateway.Message, T>;\n    private readonly host?: string;\n    private readonly ping?: (this:GatewayClient<T>, payload?: unknown) => void;\n    private readonly auth?: (this: GatewayClient<T>, request: IOGateway.Auth.AuthenticationRequest) => Promise<IOGateway.Auth.AuthenticationSuccess>\n    constructor(receive: ((this: IOGateway.GatewayClient<T>, msg: T) => void) | ((client: IOGateway.GatewayClient, msg: IOGateway.Message) => void),\n                private readonly gw: GatewayState,\n                opts: WithRequired<IOGateway.GatewayClientOptions<T>, 'key' | 'codec'> & {host?: string}) {\n\n        function handler(this: IOGateway.GatewayClient<T>, msg: T): void {\n            (receive as ((client: IOGateway.GatewayClient, msg: IOGateway.Message) => void))(this as IOGateway.GatewayClient, msg as IOGateway.Message);\n        }\n        this.receive = receive.length === 1 ? receive as ((this: GatewayClient<T>, msg: T) => void): handler.bind(this);\n        this.key = opts.key;\n        this.codec = opts.codec;\n        this.host = opts.host;\n        this.ping = opts.onPing?.bind(this);\n        this.auth = opts.onAuthenticate?.bind(this);\n        const source: LocalAddress = {\n            type: 'local',\n            receive: (msg) => {\n                let m;\n                try {\n                    if (msg.type === 'ping' && this.ping) {\n                        if (log.enabledFor('info')) {\n                            log.info(`checking ${this.key}`);\n                        }\n                        this.ping();\n                    }\n                    else {\n                        m = this.codec.encode(msg);\n                        if (log.enabledFor('trace')) {\n                            log.debug(`sending message ${m} to ${this.key}`);\n                        }\n                        Promise.resolve().then(() => {\n                            try {\n                                this.receive(m)\n                            } catch (e) {\n                                log.error(`custom client error, that we're looking for ${m}`, e);\n                            }\n                        });\n                    }\n                } catch (e) {\n                    log.error(`unable to send message ${m}`, e);\n                }\n            },\n            endpoint: this.key,\n            host: this.host,\n            auth: this.auth\n        }\n        const onDisconnect = opts.onDisconnect?.bind(this);\n        addClient(this.gw.clients, this.gw.node, this.key, source, onDisconnect ? () => {\n            onDisconnect('inactive');\n        }: undefined, onDisconnect ? () => {\n            onDisconnect('shutdown');\n        } : undefined);\n\n    }\n\n    close(): void {\n        removeClient(this.gw.clients, this.gw.node, this.key);\n    }\n    // backward compatibility\n    async disconnect() {\n        this.close();\n        return true;\n    }\n\n    send(msg: T): void {\n        try {\n            const message = this.codec.decode(msg) as IOGateway.Message<RequestType>;\n            if (log.enabledFor('debug')) {\n                log.debug(`processing incoming message from client [${this.key}]`);\n            }\n            const client = this.gw.clients.get(this.key);\n            if (client?.source) {\n                if (message.type === 'ping') {\n                    const lastAccess = Date.now();\n                    if (log.enabledFor('debug')) {\n                        log.debug(`received ping from ${this.key} at ${lastAccess}`);\n                    }\n                    client.lastAccess = lastAccess;\n                } else {\n                    this.gw.node.message({origin: 'local', source: client.source, body: message});\n                }\n            } else {\n                log.warn(`cannot process message from non-registered client key ${this.key}`);\n            }\n        } catch (ex) {\n            this.receive(ex?.['message']);\n        }\n    }\n}\nexport const Factory = (config: IOGateway.GatewayConfig): IOGateway.Gateway => {\n    return new Gateway(config);\n}\n", "import {DomainUri} from './state/types/domain-registry.js';\n\n// domain base URI\nexport const globalDomainUri: DomainUri = 'global';\nexport const contextDomainUri: DomainUri = 'context';\n\n// errors\nexport const failure = `${globalDomainUri}.errors.failure`\n", "import {Domain, HandleReturnType} from './domain.js';\nimport {failure, globalDomainUri} from './constants.js';\nimport {getLogger} from './logger.js';\nimport {error} from './common/messages.js';\nimport {reason} from './reason.js';\nimport {byId} from './state/peers.js';\nimport {State} from './state/types/state.js';\nimport {DomainUri, RegisteredDomains} from './state/types/domain-registry.js';\nimport {PeerId, Source, OriginType} from './state/types/common.js';\nimport {exceptionInfo} from './common/types.js';\nimport {PeerMessage} from './common/types/messages.js';\nimport {IOGateway} from '../gateway';\n\nexport type CommandType = 'commands/source-removed';\nexport type DomainType = 'domain/join' | 'domain/leave';\n\nexport type InternalType\n    = 'internal/authenticated'\n    | 'internal/authentication-request'\n    | 'internal/authentication-failed';\n\nexport type ContextRequestType\n    = 'create-context'\n    | 'update-context'\n    | 'subscribe-context'\n    | 'unsubscribe-context'\n    | 'destroy-context';\n\nexport type GlobalRequestType\n    = 'hello'\n    | 'join'\n    | 'leave'\n    | 'ping'\n    | 'create-token'\n    | ContextRequestType;\n\nexport type GlobalResponseType\n    = 'welcome'\n    | 'authentication-request'\n    | 'token'\n    | ContextResponseType;\n\nexport type ContextResponseType = 'subscribed-context' | 'context-created';\nexport type ContextBroadcastType = 'context-added' | 'context-destroyed' | 'context-updated';\nexport type ActivityIncomingType\n    = 'ready'\n    | 'subscribe'\n    | 'unsubscribe'\n    | 'add-types'\n    | 'remove-types'\n    | 'create'\n    | 'destroy'\n    | 'join-activity'\n    | 'add-peer-factories'\n    | 'remove-peer-factories'\n    | 'create-peer'\n    | 'error'\n    | 'update-context'\n    ;\nexport type ActivityResponseType = 'accepted' | 'initiated' | 'peer-requested';\nexport type ActivityBroadcastType\n    = 'peer-added'\n    | 'peer-removed'\n    | 'peer-factories-added'\n    | 'peer-factories-removed'\n    | 'types-removed'\n    | 'types-added'\n    | 'peer-created'\n    | 'dispose-peer'\n    | 'activity-joined'\n    | 'activity-left'\n    | 'left'\n    | 'joined'\n    | 'created'\n    | 'owner-changed';\n\nexport type MetricsIncomingType = 'publish' | 'define';\nexport type BusIncomingType = 'publish' | 'subscribe' | 'unsubscribe';\n\nexport type AgmIncomingType\n    = 'register'\n    | 'unregister'\n    | 'call'\n    | 'yield'\n    | 'subscribe'\n    | 'unsubscribe'\n    | 'accepted'\n    | 'drop-subscription'\n    | 'publish'\n    | 'post'\n    | 'error'\n    ;\n\nexport type AgmResponseType\n    = 'subscribed'\n    | 'result';\n\nexport type AgmBroadcastType\n    = 'peer-added'\n    | 'methods-added'\n    | 'methods-removed'\n    | 'add-interest'\n    | 'remove-interest'\n    | 'invoke'\n    | 'subscription-cancelled'\n    | 'event';\n\nexport type RequestType = GlobalRequestType | AgmIncomingType | ContextRequestType | ActivityIncomingType | BusIncomingType | MetricsIncomingType;\nexport type ResponseType = GlobalResponseType | AgmResponseType | ContextResponseType | ActivityResponseType;\nexport type BroadcastType = AgmBroadcastType | ContextBroadcastType | ActivityBroadcastType;\n\nexport type MessageType = RequestType | ResponseType | BroadcastType | 'error' | 'success' | 'token';\n\nexport interface DomainMessage extends IOGateway.Message<MessageType> {\n    domain: DomainUri\n}\n\n// export interface BroadcastMessage<T extends BroadcastType> extends Message<T>, DomainMessage, PeerMessage {}\n\nexport type SendMessageAction<T> = { receiver: Source, body: IOGateway.Message<T> };\n\n\nexport type NodeMessage<T> = { origin: OriginType, source: Source, body: IOGateway.Message<T> }\n\nexport type NodeOptions = { bufferSize?: number, nodeId?: string, signingKey?: string };\n\nexport interface GatewayNode {\n    message(msg: NodeMessage<RequestType>): void;\n\n    addSource(source: Source): void;\n\n    removeSource(source: Source): void;\n\n    close(): void;\n}\n\nfunction matchSource(source1: Source, source2: Source): boolean {\n    if (source1 === source2) {\n        return true;\n    }\n    const sourceKeys = Object.keys(source1);\n    if (sourceKeys.length !== Object.keys(source2).length) {\n        return false;\n    }\n    for (const key of sourceKeys) {\n        // only level one nesting is enough.\n        if (source1[key] !== source2[key]) {\n            return false;\n        }\n    }\n    return true;\n}\n\nfunction validateSource(state: State, source: Source, body: Partial<PeerMessage>): void {\n    const {peer_id: peerId} = body;\n    const peer = byId(state, peerId);\n    if (peer && !matchSource(source, peer.source)) {\n        throw exceptionInfo(`The original source ${JSON.stringify(peer.source)} of peer ${peerId} doesnt match the current source ${JSON.stringify(source)}`, {message: 'Bad Source'});\n    }\n}\n\nconst log = getLogger('gateway.node');\n\n/*\n * sends source-removed command to all domains while keeping the global one last\n */\nfunction sourceRemoved(msg: NodeMessage<'commands/source-removed'>, state: State): HandleReturnType {\n\n    const domains = Object.values(state.registeredDomains!)\n        .filter((registeredDomain) => {\n            return registeredDomain.info.uri !== globalDomainUri\n        }).map(registeredDomain => registeredDomain.domain);\n    if (state.registeredDomains![globalDomainUri]) {\n        domains.push(state.registeredDomains![globalDomainUri].domain);\n    }\n\n    return domains.reduce(([curState, curMsgs], domain) => {\n        if (log.enabledFor('debug')) {\n            log.debug(`About to remove source from domain ${JSON.stringify(domain.info())}`);\n        }\n        const result = domain.handleMessage(curState, msg);\n        if (result) {\n            if (log.enabledFor('debug')) {\n                log.debug(`removed source from domain ${JSON.stringify(domain.info())}`);\n            }\n            const [newState, newMsgs] = result;\n            return [newState, curMsgs.concat(newMsgs)];\n        } else {\n            return [curState, curMsgs];\n        }\n    }, [state, []] as HandleReturnType);\n}\n\nexport function handleMessage(state: State, msg: NodeMessage<CommandType | InternalType | RequestType>, source: Source): HandleReturnType {\n    if (msg.body.type === 'commands/source-removed') {\n        return sourceRemoved(msg as NodeMessage<CommandType>, state);\n    } else {\n        const {body} = msg;\n        const {registeredDomains: domains} = state;\n        const domainUri: DomainUri = (body as DomainMessage).domain ?? globalDomainUri;\n        const domain = domains![domainUri]?.domain;\n        if (domain) {\n            if (log.enabledFor('debug')) {\n                log.debug(`Handling message with domain ${JSON.stringify(domain.info())} message: \\n ${JSON.stringify(msg, null, '\\t')}`);\n            }\n            validateSource(state, source, body as { peer_id?: PeerId });\n            return domain.handleMessage(state, msg);\n        } else {\n            const m = body as { domain?: DomainUri, request_id?, peer_id?: PeerId };\n            return [state, [error(m.domain, source, m.request_id, m.peer_id, reason(failure, `Unable to find domain for message ${JSON.stringify(msg)}`))]]\n        }\n    }\n}\n\nexport function buildDomains<T extends MessageType = MessageType>(domains: Domain<T>[]): RegisteredDomains {\n    return domains.reduce((target, domain) => {\n        const info = domain.info();\n        const source: RegisteredDomains = {};\n        source[info.uri] = {domain, info};\n        return Object.assign(target, source);\n    }, {});\n}\n", "import {Reason} from '../reason.js';\nimport {DomainMessage, SendMessageAction} from '../node.js';\nimport {DomainUri} from '../state/types/domain-registry.js';\nimport {ErrorMessage, PeerAdded, PeerMessage, PeerRemoved, RequestMessage, SuccessMessage} from './types/messages.js';\nimport {Identity, PeerId, Source} from '../state/types/common.js';\nimport {IOGateway} from '../../gateway';\n\nexport type TokenMessage = IOGateway.Message<'token'> & DomainMessage & PeerMessage & RequestMessage & { token: string }\n\nexport function outgoing<T>(recipient: Source, message: IOGateway.Message<T>): SendMessageAction<T> {\n    return {receiver: recipient, body: message};\n}\n\n\nexport function broadcast<T>(source: Source, message: IOGateway.Message<T>): SendMessageAction<T> & { source: Source } {\n    return {...outgoing({type: 'cluster'}, message), source}\n}\n\nexport function unicast<T>(source: Source, recipient: Source, message: IOGateway.Message<T>): SendMessageAction<T> & { source: Source } {\n    return {...outgoing(recipient, message), source};\n}\n\nfunction errorMsg(domainUri: DomainUri | undefined, requestId: string | undefined, peerId: string | undefined, reason: Reason, context?): ErrorMessage {\n    const error: ErrorMessage = {\n        type: 'error',\n        request_id: requestId,\n        reason_uri: reason.uri,\n        reason: reason.message\n    };\n    if (domainUri) {\n        error.domain = domainUri;\n    }\n    if (peerId) {\n        error.peer_id = peerId;\n    }\n    if (context) {\n        error.context = context;\n    }\n    return error;\n}\n\nexport function error(domainUri: DomainUri | undefined, recipient: Source, requestId: string | undefined, peerId: PeerId | undefined, reason: Reason, context?): SendMessageAction<'error'> {\n    return outgoing(recipient, errorMsg(domainUri, requestId, peerId, reason, context));\n}\n\nfunction successMsg(domainUri, requestId: string, peerId: string): SuccessMessage {\n    return {type: 'success', request_id: requestId, domain: domainUri, peer_id: peerId};\n}\n\nexport function success(domainUri: DomainUri, recipient: Source, requestId, peerId): SendMessageAction<'success'> {\n    return outgoing(recipient, successMsg(domainUri, requestId, peerId))\n}\n\nexport function isLocalSource(source: Source): boolean {\n    const type = source.type;\n    return type && type === 'local';\n}\n\nexport function isRemoteSource(source: Source): boolean {\n    return !isLocalSource(source);\n}\n\nfunction tokenMsg(domainUri: DomainUri, requestId: string, peerId: string, t: string): TokenMessage {\n    return {domain: domainUri, type: 'token', request_id: requestId, peer_id: peerId, token: t};\n}\n\nexport function token(domainUri: DomainUri, recipient: Source, requestId: string, peerId: PeerId, t: string): SendMessageAction<'token'> {\n    return outgoing(recipient, tokenMsg(domainUri, requestId, peerId, t))\n}\n\nfunction peerAddedMsg(domainUri: DomainUri, peerId: PeerId, newPeerId: PeerId, newPeerIdentity: Identity, meta: {local: boolean}): PeerAdded {\n    return {\n        domain: domainUri,\n        type: 'peer-added',\n        peer_id: peerId,\n        new_peer_id: newPeerId,\n        identity: newPeerIdentity,\n        meta\n    };\n}\n\nexport function peerAdded(domainUri: DomainUri, recipient: Source, peerId: PeerId, newPeerId: PeerId, newPeerIdentity: Identity, meta: {local: boolean}): SendMessageAction<'peer-added'> {\n    return outgoing(recipient, peerAddedMsg(domainUri, peerId, newPeerId, newPeerIdentity, meta));\n}\n\nfunction peerRemovedMsg(domainUri: DomainUri, peerId: PeerId, removedPeerId: PeerId, reason: Reason): PeerRemoved {\n    return {\n        domain: domainUri,\n        type: 'peer-removed',\n        peer_id: peerId,\n        removed_id: removedPeerId,\n        reason_uri: reason.uri,\n        reason: reason.message\n    }\n}\n\nexport function peerRemoved(domainUri: DomainUri, recipient, peerId, removedPeerId, reason: Reason): SendMessageAction<'peer-removed'> {\n    return outgoing(recipient, peerRemovedMsg(domainUri, peerId, removedPeerId, reason))\n}\n", "import {Reason} from '../reason.js';\n\nexport type ExceptionData = Partial<Reason> & {\n    [key: string]: unknown\n}\n\nexport class ExceptionInfo extends Error {\n\n    constructor(message: string, readonly data: ExceptionData, readonly cause?: unknown) {\n        super(message);\n        this.name = 'ExceptionInfo';\n        this.data = data;\n        this.cause = cause;\n    }\n}\n\nexport function exceptionInfo(msg: string, data: ExceptionData, cause?: unknown) {\n    return new ExceptionInfo(msg, data, cause);\n}\n\n\nexport function exceptionData(ex: unknown): ExceptionData | undefined {\n    if (ex instanceof ExceptionInfo) {\n        return ex.data;\n    }\n}\n\n\nexport function exceptionMessage(ex: unknown): string | undefined {\n    if (ex instanceof Error) {\n        return ex.message;\n    }\n}\n\nexport function exceptionCause(ex: unknown): unknown {\n    if (ex instanceof ExceptionInfo) {\n        return ex.cause;\n    }\n}\n", "import {ExceptionInfo, exceptionData, exceptionMessage} from './common/types.js';\nimport {ReasonUri} from './common/types/messages.js';\n\nexport type Reason = { uri: ReasonUri, message: string };\n\nexport function reason(uri: ReasonUri, message: string): Reason {\n    return {uri, message};\n}\n\nexport function exceptionToReason(ex: unknown, defaultUri: string): Reason {\n    const r = exceptionData(ex);\n    return {uri: r?.uri ?? defaultUri, message: r?.message ?? exceptionMessage(ex) ?? ''};\n}\n\nexport function throwReason(uri: ReasonUri, message: string): never {\n    const reason: Reason = {uri, message};\n    throw new ExceptionInfo(message, reason);\n}\n\nexport function requestToReason(request: {reason_uri: ReasonUri, reason: string}): Reason {\n    return {uri: request.reason_uri, message: request.reason};\n}\n", "import {CharStreams, CommonTokenStream} from 'antlr4';\n\nimport RestrictionsParser from './antlr4/RestrictionsParser.js';\nimport RestrictionsLexer from './antlr4/RestrictionsLexer.js';\nimport {Hiccup} from './types.js';\nimport visitor from './visitor.js';\n\nexport function parse(input: string): Hiccup {\n    const chars = CharStreams.fromString(input);\n    const lexer = new RestrictionsLexer(chars);\n    const tokens = new CommonTokenStream(lexer);\n    const parser = new RestrictionsParser(tokens);\n    const tree = parser.parse();\n    // todo validate\n    return tree.accept(visitor) as Hiccup;\n}\n\ninterface Visitor {\n    and: (lhs, rhs) => boolean\n    or: (lhs, rhs) => boolean\n    eq: (lhs, rhs) => boolean\n    neq: (lhs, rhs) => boolean\n    match: (lhs, rhs) => boolean\n    str: (x) => string\n    number: (x) => number\n    expr: (x) => Hiccup<Omit<keyof Visitor, 'expr'>>\n    \"own-ident\": ([_, idn]) => unknown\n    ident: ([_, idn]) => unknown\n}\n\nfunction hiccupTransform(visitor: Visitor, tree): unknown {\n    if (Array.isArray(tree)) {\n        const [first, ...next] = tree;\n        const transform = visitor[first];\n        if (transform) {\n            const args = next.map((x) => hiccupTransform(visitor, x));\n            return transform.apply(visitor, args);\n        }\n        const rest = next.map((x) => hiccupTransform(visitor, x));\n        return [first].concat(rest);\n    }\n    return tree;\n}\n\nexport function check(restrictions: Readonly<undefined | Hiccup>, ownContext, context) {\n    if ((restrictions?.length ?? 0) > 0) {\n        return hiccupTransform({\n            and: (rhs, lhs) => {\n                return rhs && lhs;\n            },\n            or: (rhs, lhs) => {\n                return rhs || lhs;\n            },\n            eq: (rhs, lhs) => {\n                return rhs === lhs;\n            },\n            neq: (rhs, lhs) => {\n                return rhs !== lhs;\n            },\n            match: (lhs, rhs) => {\n                if (rhs && lhs) {\n                    return new RegExp(rhs).test(lhs);\n                }\n                return lhs;\n            },\n            str(x) {\n                return x;\n            },\n            number: (x) => {\n                return JSON.parse(x);\n            },\n            expr: (x) => {\n                return x;\n            },\n            \"own-ident\": ([_, idn]) => {\n                return ownContext[idn];\n            },\n            ident([_, idn]) {\n                return context[idn];\n            },\n        }, restrictions as Hiccup<keyof Visitor>);\n    } else {\n        return true;\n    }\n}\n", "// Generated from ./Restrictions.g4 by ANTLR 4.13.2\n// noinspection ES6UnusedImports,JSUnusedGlobalSymbols,JSUnusedLocalSymbols\n\nimport {\n\tATN,\n\tATNDeserializer, DecisionState, DFA, FailedPredicateException,\n\tRecognitionException, NoViableAltException, BailErrorStrategy,\n\tParser, ParserATNSimulator,\n\tRuleContext, ParserRuleContext, PredictionMode, PredictionContextCache,\n\tTerminalNode, RuleNode,\n\tToken, TokenStream,\n\tInterval, IntervalSet\n} from 'antlr4';\nimport RestrictionsListener from \"./RestrictionsListener.js\";\nimport RestrictionsVisitor from \"./RestrictionsVisitor.js\";\n\n// for running tests with parameters, TODO: discuss strategy for typed parameters in CI\n// eslint-disable-next-line no-unused-vars\ntype int = number;\n\nexport default class RestrictionsParser extends Parser {\n\tpublic static readonly OR = 1;\n\tpublic static readonly AND = 2;\n\tpublic static readonly EQ = 3;\n\tpublic static readonly NEQ = 4;\n\tpublic static readonly MATCH = 5;\n\tpublic static readonly LPAREN = 6;\n\tpublic static readonly RPAREN = 7;\n\tpublic static readonly DOLLAR = 8;\n\tpublic static readonly POUND = 9;\n\tpublic static readonly STR = 10;\n\tpublic static readonly WORD = 11;\n\tpublic static readonly NUMBER = 12;\n\tpublic static readonly WS = 13;\n\tpublic static override readonly EOF = Token.EOF;\n\tpublic static readonly RULE_parse = 0;\n\tpublic static readonly RULE_expr = 1;\n\tpublic static readonly RULE_andOr = 2;\n\tpublic static readonly RULE_eqNeq = 3;\n\tpublic static readonly RULE_term = 4;\n\tpublic static readonly RULE_ident = 5;\n\tpublic static readonly RULE_ownIdent = 6;\n\tpublic static readonly RULE_str = 7;\n\tpublic static readonly RULE_word = 8;\n\tpublic static readonly RULE_number = 9;\n\tpublic static readonly literalNames: (string | null)[] = [ null, \"'||'\", \n                                                            \"'&&'\", \"'=='\", \n                                                            \"'!='\", \"'?'\", \n                                                            \"'('\", \"')'\", \n                                                            \"'$'\", \"'#'\" ];\n\tpublic static readonly symbolicNames: (string | null)[] = [ null, \"OR\", \n                                                             \"AND\", \"EQ\", \n                                                             \"NEQ\", \"MATCH\", \n                                                             \"LPAREN\", \"RPAREN\", \n                                                             \"DOLLAR\", \"POUND\", \n                                                             \"STR\", \"WORD\", \n                                                             \"NUMBER\", \"WS\" ];\n\t// tslint:disable:no-trailing-whitespace\n\tpublic static readonly ruleNames: string[] = [\n\t\t\"parse\", \"expr\", \"andOr\", \"eqNeq\", \"term\", \"ident\", \"ownIdent\", \"str\", \n\t\t\"word\", \"number\",\n\t];\n\tpublic get grammarFileName(): string { return \"Restrictions.g4\"; }\n\tpublic get literalNames(): (string | null)[] { return RestrictionsParser.literalNames; }\n\tpublic get symbolicNames(): (string | null)[] { return RestrictionsParser.symbolicNames; }\n\tpublic get ruleNames(): string[] { return RestrictionsParser.ruleNames; }\n\tpublic get serializedATN(): number[] { return RestrictionsParser._serializedATN; }\n\n\tprotected createFailedPredicateException(predicate?: string, message?: string): FailedPredicateException {\n\t\treturn new FailedPredicateException(this, predicate, message);\n\t}\n\n\tconstructor(input: TokenStream) {\n\t\tsuper(input);\n\t\tthis._interp = new ParserATNSimulator(this, RestrictionsParser._ATN, RestrictionsParser.DecisionsToDFA, new PredictionContextCache());\n\t}\n\t// @RuleVersion(0)\n\tpublic parse(): ParseContext {\n\t\tlet localctx: ParseContext = new ParseContext(this, this._ctx, this.state);\n\t\tthis.enterRule(localctx, 0, RestrictionsParser.RULE_parse);\n\t\ttry {\n\t\t\tthis.enterOuterAlt(localctx, 1);\n\t\t\t{\n\t\t\tthis.state = 20;\n\t\t\tthis.expr();\n\t\t\tthis.state = 21;\n\t\t\tthis.match(RestrictionsParser.EOF);\n\t\t\t}\n\t\t}\n\t\tcatch (re) {\n\t\t\tif (re instanceof RecognitionException) {\n\t\t\t\tlocalctx.exception = re;\n\t\t\t\tthis._errHandler.reportError(this, re);\n\t\t\t\tthis._errHandler.recover(this, re);\n\t\t\t} else {\n\t\t\t\tthrow re;\n\t\t\t}\n\t\t}\n\t\tfinally {\n\t\t\tthis.exitRule();\n\t\t}\n\t\treturn localctx;\n\t}\n\t// @RuleVersion(0)\n\tpublic expr(): ExprContext {\n\t\tlet localctx: ExprContext = new ExprContext(this, this._ctx, this.state);\n\t\tthis.enterRule(localctx, 2, RestrictionsParser.RULE_expr);\n\t\ttry {\n\t\t\tthis.enterOuterAlt(localctx, 1);\n\t\t\t{\n\t\t\tthis.state = 23;\n\t\t\tthis.andOr(0);\n\t\t\t}\n\t\t}\n\t\tcatch (re) {\n\t\t\tif (re instanceof RecognitionException) {\n\t\t\t\tlocalctx.exception = re;\n\t\t\t\tthis._errHandler.reportError(this, re);\n\t\t\t\tthis._errHandler.recover(this, re);\n\t\t\t} else {\n\t\t\t\tthrow re;\n\t\t\t}\n\t\t}\n\t\tfinally {\n\t\t\tthis.exitRule();\n\t\t}\n\t\treturn localctx;\n\t}\n\n\tpublic andOr(): AndOrContext;\n\tpublic andOr(_p: number): AndOrContext;\n\t// @RuleVersion(0)\n\tpublic andOr(_p?: number): AndOrContext {\n\t\tif (_p === undefined) {\n\t\t\t_p = 0;\n\t\t}\n\n\t\tlet _parentctx: ParserRuleContext = this._ctx;\n\t\tlet _parentState: number = this.state;\n\t\tlet localctx: AndOrContext = new AndOrContext(this, this._ctx, _parentState);\n\t\tlet _prevctx: AndOrContext = localctx;\n\t\tlet _startState: number = 4;\n\t\tthis.enterRecursionRule(localctx, 4, RestrictionsParser.RULE_andOr, _p);\n\t\ttry {\n\t\t\tlet _alt: number;\n\t\t\tthis.enterOuterAlt(localctx, 1);\n\t\t\t{\n\t\t\t{\n\t\t\tlocalctx = new AndOrEqNeqContext(this, localctx);\n\t\t\tthis._ctx = localctx;\n\t\t\t_prevctx = localctx;\n\n\t\t\tthis.state = 26;\n\t\t\tthis.eqNeq(0);\n\t\t\t}\n\t\t\tthis._ctx.stop = this._input.LT(-1);\n\t\t\tthis.state = 36;\n\t\t\tthis._errHandler.sync(this);\n\t\t\t_alt = this._interp.adaptivePredict(this._input, 1, this._ctx);\n\t\t\twhile (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) {\n\t\t\t\tif (_alt === 1) {\n\t\t\t\t\tif (this._parseListeners != null) {\n\t\t\t\t\t\tthis.triggerExitRuleEvent();\n\t\t\t\t\t}\n\t\t\t\t\t_prevctx = localctx;\n\t\t\t\t\t{\n\t\t\t\t\tthis.state = 34;\n\t\t\t\t\tthis._errHandler.sync(this);\n\t\t\t\t\tswitch ( this._interp.adaptivePredict(this._input, 0, this._ctx) ) {\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t{\n\t\t\t\t\t\tlocalctx = new AndContext(this, new AndOrContext(this, _parentctx, _parentState));\n\t\t\t\t\t\tthis.pushNewRecursionContext(localctx, _startState, RestrictionsParser.RULE_andOr);\n\t\t\t\t\t\tthis.state = 28;\n\t\t\t\t\t\tif (!(this.precpred(this._ctx, 2))) {\n\t\t\t\t\t\t\tthrow this.createFailedPredicateException(\"this.precpred(this._ctx, 2)\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.state = 29;\n\t\t\t\t\t\tthis.match(RestrictionsParser.AND);\n\t\t\t\t\t\tthis.state = 30;\n\t\t\t\t\t\tthis.eqNeq(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t{\n\t\t\t\t\t\tlocalctx = new OrContext(this, new AndOrContext(this, _parentctx, _parentState));\n\t\t\t\t\t\tthis.pushNewRecursionContext(localctx, _startState, RestrictionsParser.RULE_andOr);\n\t\t\t\t\t\tthis.state = 31;\n\t\t\t\t\t\tif (!(this.precpred(this._ctx, 1))) {\n\t\t\t\t\t\t\tthrow this.createFailedPredicateException(\"this.precpred(this._ctx, 1)\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.state = 32;\n\t\t\t\t\t\tthis.match(RestrictionsParser.OR);\n\t\t\t\t\t\tthis.state = 33;\n\t\t\t\t\t\tthis.eqNeq(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.state = 38;\n\t\t\t\tthis._errHandler.sync(this);\n\t\t\t\t_alt = this._interp.adaptivePredict(this._input, 1, this._ctx);\n\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (re) {\n\t\t\tif (re instanceof RecognitionException) {\n\t\t\t\tlocalctx.exception = re;\n\t\t\t\tthis._errHandler.reportError(this, re);\n\t\t\t\tthis._errHandler.recover(this, re);\n\t\t\t} else {\n\t\t\t\tthrow re;\n\t\t\t}\n\t\t}\n\t\tfinally {\n\t\t\tthis.unrollRecursionContexts(_parentctx);\n\t\t}\n\t\treturn localctx;\n\t}\n\n\tpublic eqNeq(): EqNeqContext;\n\tpublic eqNeq(_p: number): EqNeqContext;\n\t// @RuleVersion(0)\n\tpublic eqNeq(_p?: number): EqNeqContext {\n\t\tif (_p === undefined) {\n\t\t\t_p = 0;\n\t\t}\n\n\t\tlet _parentctx: ParserRuleContext = this._ctx;\n\t\tlet _parentState: number = this.state;\n\t\tlet localctx: EqNeqContext = new EqNeqContext(this, this._ctx, _parentState);\n\t\tlet _prevctx: EqNeqContext = localctx;\n\t\tlet _startState: number = 6;\n\t\tthis.enterRecursionRule(localctx, 6, RestrictionsParser.RULE_eqNeq, _p);\n\t\ttry {\n\t\t\tlet _alt: number;\n\t\t\tthis.enterOuterAlt(localctx, 1);\n\t\t\t{\n\t\t\t{\n\t\t\tlocalctx = new EqNeqTermContext(this, localctx);\n\t\t\tthis._ctx = localctx;\n\t\t\t_prevctx = localctx;\n\n\t\t\tthis.state = 40;\n\t\t\tthis.term();\n\t\t\t}\n\t\t\tthis._ctx.stop = this._input.LT(-1);\n\t\t\tthis.state = 53;\n\t\t\tthis._errHandler.sync(this);\n\t\t\t_alt = this._interp.adaptivePredict(this._input, 3, this._ctx);\n\t\t\twhile (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) {\n\t\t\t\tif (_alt === 1) {\n\t\t\t\t\tif (this._parseListeners != null) {\n\t\t\t\t\t\tthis.triggerExitRuleEvent();\n\t\t\t\t\t}\n\t\t\t\t\t_prevctx = localctx;\n\t\t\t\t\t{\n\t\t\t\t\tthis.state = 51;\n\t\t\t\t\tthis._errHandler.sync(this);\n\t\t\t\t\tswitch ( this._interp.adaptivePredict(this._input, 2, this._ctx) ) {\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t{\n\t\t\t\t\t\tlocalctx = new EqContext(this, new EqNeqContext(this, _parentctx, _parentState));\n\t\t\t\t\t\tthis.pushNewRecursionContext(localctx, _startState, RestrictionsParser.RULE_eqNeq);\n\t\t\t\t\t\tthis.state = 42;\n\t\t\t\t\t\tif (!(this.precpred(this._ctx, 3))) {\n\t\t\t\t\t\t\tthrow this.createFailedPredicateException(\"this.precpred(this._ctx, 3)\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.state = 43;\n\t\t\t\t\t\tthis.match(RestrictionsParser.EQ);\n\t\t\t\t\t\tthis.state = 44;\n\t\t\t\t\t\tthis.term();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t{\n\t\t\t\t\t\tlocalctx = new NeqContext(this, new EqNeqContext(this, _parentctx, _parentState));\n\t\t\t\t\t\tthis.pushNewRecursionContext(localctx, _startState, RestrictionsParser.RULE_eqNeq);\n\t\t\t\t\t\tthis.state = 45;\n\t\t\t\t\t\tif (!(this.precpred(this._ctx, 2))) {\n\t\t\t\t\t\t\tthrow this.createFailedPredicateException(\"this.precpred(this._ctx, 2)\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.state = 46;\n\t\t\t\t\t\tthis.match(RestrictionsParser.NEQ);\n\t\t\t\t\t\tthis.state = 47;\n\t\t\t\t\t\tthis.term();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\t{\n\t\t\t\t\t\tlocalctx = new MatchContext(this, new EqNeqContext(this, _parentctx, _parentState));\n\t\t\t\t\t\tthis.pushNewRecursionContext(localctx, _startState, RestrictionsParser.RULE_eqNeq);\n\t\t\t\t\t\tthis.state = 48;\n\t\t\t\t\t\tif (!(this.precpred(this._ctx, 1))) {\n\t\t\t\t\t\t\tthrow this.createFailedPredicateException(\"this.precpred(this._ctx, 1)\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.state = 49;\n\t\t\t\t\t\tthis.match(RestrictionsParser.MATCH);\n\t\t\t\t\t\tthis.state = 50;\n\t\t\t\t\t\tthis.term();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.state = 55;\n\t\t\t\tthis._errHandler.sync(this);\n\t\t\t\t_alt = this._interp.adaptivePredict(this._input, 3, this._ctx);\n\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (re) {\n\t\t\tif (re instanceof RecognitionException) {\n\t\t\t\tlocalctx.exception = re;\n\t\t\t\tthis._errHandler.reportError(this, re);\n\t\t\t\tthis._errHandler.recover(this, re);\n\t\t\t} else {\n\t\t\t\tthrow re;\n\t\t\t}\n\t\t}\n\t\tfinally {\n\t\t\tthis.unrollRecursionContexts(_parentctx);\n\t\t}\n\t\treturn localctx;\n\t}\n\t// @RuleVersion(0)\n\tpublic term(): TermContext {\n\t\tlet localctx: TermContext = new TermContext(this, this._ctx, this.state);\n\t\tthis.enterRule(localctx, 8, RestrictionsParser.RULE_term);\n\t\ttry {\n\t\t\tthis.enterOuterAlt(localctx, 1);\n\t\t\t{\n\t\t\tthis.state = 64;\n\t\t\tthis._errHandler.sync(this);\n\t\t\tswitch ( this._interp.adaptivePredict(this._input, 4, this._ctx) ) {\n\t\t\tcase 1:\n\t\t\t\t{\n\t\t\t\tthis.state = 56;\n\t\t\t\tthis.ident();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\t{\n\t\t\t\tthis.state = 57;\n\t\t\t\tthis.ownIdent();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\t{\n\t\t\t\tthis.state = 58;\n\t\t\t\tthis.number_();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\t{\n\t\t\t\tthis.state = 59;\n\t\t\t\tthis.str();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\t{\n\t\t\t\tthis.state = 60;\n\t\t\t\tthis.match(RestrictionsParser.LPAREN);\n\t\t\t\tthis.state = 61;\n\t\t\t\tthis.andOr(0);\n\t\t\t\tthis.state = 62;\n\t\t\t\tthis.match(RestrictionsParser.RPAREN);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (re) {\n\t\t\tif (re instanceof RecognitionException) {\n\t\t\t\tlocalctx.exception = re;\n\t\t\t\tthis._errHandler.reportError(this, re);\n\t\t\t\tthis._errHandler.recover(this, re);\n\t\t\t} else {\n\t\t\t\tthrow re;\n\t\t\t}\n\t\t}\n\t\tfinally {\n\t\t\tthis.exitRule();\n\t\t}\n\t\treturn localctx;\n\t}\n\t// @RuleVersion(0)\n\tpublic ident(): IdentContext {\n\t\tlet localctx: IdentContext = new IdentContext(this, this._ctx, this.state);\n\t\tthis.enterRule(localctx, 10, RestrictionsParser.RULE_ident);\n\t\ttry {\n\t\t\tthis.enterOuterAlt(localctx, 1);\n\t\t\t{\n\t\t\tthis.state = 66;\n\t\t\tthis.match(RestrictionsParser.DOLLAR);\n\t\t\tthis.state = 67;\n\t\t\tthis.word();\n\t\t\t}\n\t\t}\n\t\tcatch (re) {\n\t\t\tif (re instanceof RecognitionException) {\n\t\t\t\tlocalctx.exception = re;\n\t\t\t\tthis._errHandler.reportError(this, re);\n\t\t\t\tthis._errHandler.recover(this, re);\n\t\t\t} else {\n\t\t\t\tthrow re;\n\t\t\t}\n\t\t}\n\t\tfinally {\n\t\t\tthis.exitRule();\n\t\t}\n\t\treturn localctx;\n\t}\n\t// @RuleVersion(0)\n\tpublic ownIdent(): OwnIdentContext {\n\t\tlet localctx: OwnIdentContext = new OwnIdentContext(this, this._ctx, this.state);\n\t\tthis.enterRule(localctx, 12, RestrictionsParser.RULE_ownIdent);\n\t\ttry {\n\t\t\tthis.enterOuterAlt(localctx, 1);\n\t\t\t{\n\t\t\tthis.state = 69;\n\t\t\tthis.match(RestrictionsParser.POUND);\n\t\t\tthis.state = 70;\n\t\t\tthis.word();\n\t\t\t}\n\t\t}\n\t\tcatch (re) {\n\t\t\tif (re instanceof RecognitionException) {\n\t\t\t\tlocalctx.exception = re;\n\t\t\t\tthis._errHandler.reportError(this, re);\n\t\t\t\tthis._errHandler.recover(this, re);\n\t\t\t} else {\n\t\t\t\tthrow re;\n\t\t\t}\n\t\t}\n\t\tfinally {\n\t\t\tthis.exitRule();\n\t\t}\n\t\treturn localctx;\n\t}\n\t// @RuleVersion(0)\n\tpublic str(): StrContext {\n\t\tlet localctx: StrContext = new StrContext(this, this._ctx, this.state);\n\t\tthis.enterRule(localctx, 14, RestrictionsParser.RULE_str);\n\t\tlet _la: number;\n\t\ttry {\n\t\t\tthis.enterOuterAlt(localctx, 1);\n\t\t\t{\n\t\t\tthis.state = 75;\n\t\t\tthis._errHandler.sync(this);\n\t\t\t_la = this._input.LA(1);\n\t\t\twhile (_la===13) {\n\t\t\t\t{\n\t\t\t\t{\n\t\t\t\tthis.state = 72;\n\t\t\t\tthis.match(RestrictionsParser.WS);\n\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.state = 77;\n\t\t\t\tthis._errHandler.sync(this);\n\t\t\t\t_la = this._input.LA(1);\n\t\t\t}\n\t\t\tthis.state = 78;\n\t\t\tthis.match(RestrictionsParser.STR);\n\t\t\t}\n\t\t}\n\t\tcatch (re) {\n\t\t\tif (re instanceof RecognitionException) {\n\t\t\t\tlocalctx.exception = re;\n\t\t\t\tthis._errHandler.reportError(this, re);\n\t\t\t\tthis._errHandler.recover(this, re);\n\t\t\t} else {\n\t\t\t\tthrow re;\n\t\t\t}\n\t\t}\n\t\tfinally {\n\t\t\tthis.exitRule();\n\t\t}\n\t\treturn localctx;\n\t}\n\t// @RuleVersion(0)\n\tpublic word(): WordContext {\n\t\tlet localctx: WordContext = new WordContext(this, this._ctx, this.state);\n\t\tthis.enterRule(localctx, 16, RestrictionsParser.RULE_word);\n\t\ttry {\n\t\t\tthis.enterOuterAlt(localctx, 1);\n\t\t\t{\n\t\t\tthis.state = 80;\n\t\t\tthis.match(RestrictionsParser.WORD);\n\t\t\t}\n\t\t}\n\t\tcatch (re) {\n\t\t\tif (re instanceof RecognitionException) {\n\t\t\t\tlocalctx.exception = re;\n\t\t\t\tthis._errHandler.reportError(this, re);\n\t\t\t\tthis._errHandler.recover(this, re);\n\t\t\t} else {\n\t\t\t\tthrow re;\n\t\t\t}\n\t\t}\n\t\tfinally {\n\t\t\tthis.exitRule();\n\t\t}\n\t\treturn localctx;\n\t}\n\t// @RuleVersion(0)\n\tpublic number_(): NumberContext {\n\t\tlet localctx: NumberContext = new NumberContext(this, this._ctx, this.state);\n\t\tthis.enterRule(localctx, 18, RestrictionsParser.RULE_number);\n\t\tlet _la: number;\n\t\ttry {\n\t\t\tthis.enterOuterAlt(localctx, 1);\n\t\t\t{\n\t\t\tthis.state = 85;\n\t\t\tthis._errHandler.sync(this);\n\t\t\t_la = this._input.LA(1);\n\t\t\twhile (_la===13) {\n\t\t\t\t{\n\t\t\t\t{\n\t\t\t\tthis.state = 82;\n\t\t\t\tthis.match(RestrictionsParser.WS);\n\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.state = 87;\n\t\t\t\tthis._errHandler.sync(this);\n\t\t\t\t_la = this._input.LA(1);\n\t\t\t}\n\t\t\tthis.state = 88;\n\t\t\tthis.match(RestrictionsParser.NUMBER);\n\t\t\t}\n\t\t}\n\t\tcatch (re) {\n\t\t\tif (re instanceof RecognitionException) {\n\t\t\t\tlocalctx.exception = re;\n\t\t\t\tthis._errHandler.reportError(this, re);\n\t\t\t\tthis._errHandler.recover(this, re);\n\t\t\t} else {\n\t\t\t\tthrow re;\n\t\t\t}\n\t\t}\n\t\tfinally {\n\t\t\tthis.exitRule();\n\t\t}\n\t\treturn localctx;\n\t}\n\n\tpublic sempred(localctx: RuleContext, ruleIndex: number, predIndex: number): boolean {\n\t\tswitch (ruleIndex) {\n\t\tcase 2:\n\t\t\treturn this.andOr_sempred(localctx as AndOrContext, predIndex);\n\t\tcase 3:\n\t\t\treturn this.eqNeq_sempred(localctx as EqNeqContext, predIndex);\n\t\t}\n\t\treturn true;\n\t}\n\tprivate andOr_sempred(localctx: AndOrContext, predIndex: number): boolean {\n\t\tswitch (predIndex) {\n\t\tcase 0:\n\t\t\treturn this.precpred(this._ctx, 2);\n\t\tcase 1:\n\t\t\treturn this.precpred(this._ctx, 1);\n\t\t}\n\t\treturn true;\n\t}\n\tprivate eqNeq_sempred(localctx: EqNeqContext, predIndex: number): boolean {\n\t\tswitch (predIndex) {\n\t\tcase 2:\n\t\t\treturn this.precpred(this._ctx, 3);\n\t\tcase 3:\n\t\t\treturn this.precpred(this._ctx, 2);\n\t\tcase 4:\n\t\t\treturn this.precpred(this._ctx, 1);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static readonly _serializedATN: number[] = [4,1,13,91,2,0,7,0,2,\n\t1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,1,\n\t0,1,0,1,0,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,5,2,35,8,2,10,2,12,\n\t2,38,9,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,5,3,52,8,3,10,\n\t3,12,3,55,9,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,3,4,65,8,4,1,5,1,5,1,5,1,\n\t6,1,6,1,6,1,7,5,7,74,8,7,10,7,12,7,77,9,7,1,7,1,7,1,8,1,8,1,9,5,9,84,8,\n\t9,10,9,12,9,87,9,9,1,9,1,9,1,9,0,2,4,6,10,0,2,4,6,8,10,12,14,16,18,0,0,\n\t91,0,20,1,0,0,0,2,23,1,0,0,0,4,25,1,0,0,0,6,39,1,0,0,0,8,64,1,0,0,0,10,\n\t66,1,0,0,0,12,69,1,0,0,0,14,75,1,0,0,0,16,80,1,0,0,0,18,85,1,0,0,0,20,21,\n\t3,2,1,0,21,22,5,0,0,1,22,1,1,0,0,0,23,24,3,4,2,0,24,3,1,0,0,0,25,26,6,2,\n\t-1,0,26,27,3,6,3,0,27,36,1,0,0,0,28,29,10,2,0,0,29,30,5,2,0,0,30,35,3,6,\n\t3,0,31,32,10,1,0,0,32,33,5,1,0,0,33,35,3,6,3,0,34,28,1,0,0,0,34,31,1,0,\n\t0,0,35,38,1,0,0,0,36,34,1,0,0,0,36,37,1,0,0,0,37,5,1,0,0,0,38,36,1,0,0,\n\t0,39,40,6,3,-1,0,40,41,3,8,4,0,41,53,1,0,0,0,42,43,10,3,0,0,43,44,5,3,0,\n\t0,44,52,3,8,4,0,45,46,10,2,0,0,46,47,5,4,0,0,47,52,3,8,4,0,48,49,10,1,0,\n\t0,49,50,5,5,0,0,50,52,3,8,4,0,51,42,1,0,0,0,51,45,1,0,0,0,51,48,1,0,0,0,\n\t52,55,1,0,0,0,53,51,1,0,0,0,53,54,1,0,0,0,54,7,1,0,0,0,55,53,1,0,0,0,56,\n\t65,3,10,5,0,57,65,3,12,6,0,58,65,3,18,9,0,59,65,3,14,7,0,60,61,5,6,0,0,\n\t61,62,3,4,2,0,62,63,5,7,0,0,63,65,1,0,0,0,64,56,1,0,0,0,64,57,1,0,0,0,64,\n\t58,1,0,0,0,64,59,1,0,0,0,64,60,1,0,0,0,65,9,1,0,0,0,66,67,5,8,0,0,67,68,\n\t3,16,8,0,68,11,1,0,0,0,69,70,5,9,0,0,70,71,3,16,8,0,71,13,1,0,0,0,72,74,\n\t5,13,0,0,73,72,1,0,0,0,74,77,1,0,0,0,75,73,1,0,0,0,75,76,1,0,0,0,76,78,\n\t1,0,0,0,77,75,1,0,0,0,78,79,5,10,0,0,79,15,1,0,0,0,80,81,5,11,0,0,81,17,\n\t1,0,0,0,82,84,5,13,0,0,83,82,1,0,0,0,84,87,1,0,0,0,85,83,1,0,0,0,85,86,\n\t1,0,0,0,86,88,1,0,0,0,87,85,1,0,0,0,88,89,5,12,0,0,89,19,1,0,0,0,7,34,36,\n\t51,53,64,75,85];\n\n\tprivate static __ATN: ATN;\n\tpublic static get _ATN(): ATN {\n\t\tif (!RestrictionsParser.__ATN) {\n\t\t\tRestrictionsParser.__ATN = new ATNDeserializer().deserialize(RestrictionsParser._serializedATN);\n\t\t}\n\n\t\treturn RestrictionsParser.__ATN;\n\t}\n\n\n\tstatic DecisionsToDFA = RestrictionsParser._ATN.decisionToState.map( (ds: DecisionState, index: number) => new DFA(ds, index) );\n\n}\n\nexport class ParseContext extends ParserRuleContext {\n\tconstructor(parser?: RestrictionsParser, parent?: ParserRuleContext, invokingState?: number) {\n\t\tsuper(parent, invokingState);\n    \tthis.parser = parser;\n\t}\n\tpublic expr(): ExprContext {\n\t\treturn this.getTypedRuleContext(ExprContext, 0) as ExprContext;\n\t}\n\tpublic EOF(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.EOF, 0);\n\t}\n    public get ruleIndex(): number {\n    \treturn RestrictionsParser.RULE_parse;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterParse) {\n\t \t\tlistener.enterParse(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitParse) {\n\t \t\tlistener.exitParse(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitParse) {\n\t\t\treturn visitor.visitParse(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\n\n\nexport class ExprContext extends ParserRuleContext {\n\tconstructor(parser?: RestrictionsParser, parent?: ParserRuleContext, invokingState?: number) {\n\t\tsuper(parent, invokingState);\n    \tthis.parser = parser;\n\t}\n\tpublic andOr(): AndOrContext {\n\t\treturn this.getTypedRuleContext(AndOrContext, 0) as AndOrContext;\n\t}\n    public get ruleIndex(): number {\n    \treturn RestrictionsParser.RULE_expr;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterExpr) {\n\t \t\tlistener.enterExpr(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitExpr) {\n\t \t\tlistener.exitExpr(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitExpr) {\n\t\t\treturn visitor.visitExpr(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\n\n\nexport class AndOrContext extends ParserRuleContext {\n\tconstructor(parser?: RestrictionsParser, parent?: ParserRuleContext, invokingState?: number) {\n\t\tsuper(parent, invokingState);\n    \tthis.parser = parser;\n\t}\n    public get ruleIndex(): number {\n    \treturn RestrictionsParser.RULE_andOr;\n\t}\n\tpublic override copyFrom(ctx: AndOrContext): void {\n\t\tsuper.copyFrom(ctx);\n\t}\n}\nexport class AndOrEqNeqContext extends AndOrContext {\n\tconstructor(parser: RestrictionsParser, ctx: AndOrContext) {\n\t\tsuper(parser, ctx.parentCtx, ctx.invokingState);\n\t\tsuper.copyFrom(ctx);\n\t}\n\tpublic eqNeq(): EqNeqContext {\n\t\treturn this.getTypedRuleContext(EqNeqContext, 0) as EqNeqContext;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterAndOrEqNeq) {\n\t \t\tlistener.enterAndOrEqNeq(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitAndOrEqNeq) {\n\t \t\tlistener.exitAndOrEqNeq(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitAndOrEqNeq) {\n\t\t\treturn visitor.visitAndOrEqNeq(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\nexport class OrContext extends AndOrContext {\n\tconstructor(parser: RestrictionsParser, ctx: AndOrContext) {\n\t\tsuper(parser, ctx.parentCtx, ctx.invokingState);\n\t\tsuper.copyFrom(ctx);\n\t}\n\tpublic andOr(): AndOrContext {\n\t\treturn this.getTypedRuleContext(AndOrContext, 0) as AndOrContext;\n\t}\n\tpublic OR(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.OR, 0);\n\t}\n\tpublic eqNeq(): EqNeqContext {\n\t\treturn this.getTypedRuleContext(EqNeqContext, 0) as EqNeqContext;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterOr) {\n\t \t\tlistener.enterOr(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitOr) {\n\t \t\tlistener.exitOr(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitOr) {\n\t\t\treturn visitor.visitOr(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\nexport class AndContext extends AndOrContext {\n\tconstructor(parser: RestrictionsParser, ctx: AndOrContext) {\n\t\tsuper(parser, ctx.parentCtx, ctx.invokingState);\n\t\tsuper.copyFrom(ctx);\n\t}\n\tpublic andOr(): AndOrContext {\n\t\treturn this.getTypedRuleContext(AndOrContext, 0) as AndOrContext;\n\t}\n\tpublic AND(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.AND, 0);\n\t}\n\tpublic eqNeq(): EqNeqContext {\n\t\treturn this.getTypedRuleContext(EqNeqContext, 0) as EqNeqContext;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterAnd) {\n\t \t\tlistener.enterAnd(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitAnd) {\n\t \t\tlistener.exitAnd(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitAnd) {\n\t\t\treturn visitor.visitAnd(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\n\n\nexport class EqNeqContext extends ParserRuleContext {\n\tconstructor(parser?: RestrictionsParser, parent?: ParserRuleContext, invokingState?: number) {\n\t\tsuper(parent, invokingState);\n    \tthis.parser = parser;\n\t}\n    public get ruleIndex(): number {\n    \treturn RestrictionsParser.RULE_eqNeq;\n\t}\n\tpublic override copyFrom(ctx: EqNeqContext): void {\n\t\tsuper.copyFrom(ctx);\n\t}\n}\nexport class MatchContext extends EqNeqContext {\n\tconstructor(parser: RestrictionsParser, ctx: EqNeqContext) {\n\t\tsuper(parser, ctx.parentCtx, ctx.invokingState);\n\t\tsuper.copyFrom(ctx);\n\t}\n\tpublic eqNeq(): EqNeqContext {\n\t\treturn this.getTypedRuleContext(EqNeqContext, 0) as EqNeqContext;\n\t}\n\tpublic MATCH(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.MATCH, 0);\n\t}\n\tpublic term(): TermContext {\n\t\treturn this.getTypedRuleContext(TermContext, 0) as TermContext;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterMatch) {\n\t \t\tlistener.enterMatch(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitMatch) {\n\t \t\tlistener.exitMatch(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitMatch) {\n\t\t\treturn visitor.visitMatch(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\nexport class NeqContext extends EqNeqContext {\n\tconstructor(parser: RestrictionsParser, ctx: EqNeqContext) {\n\t\tsuper(parser, ctx.parentCtx, ctx.invokingState);\n\t\tsuper.copyFrom(ctx);\n\t}\n\tpublic eqNeq(): EqNeqContext {\n\t\treturn this.getTypedRuleContext(EqNeqContext, 0) as EqNeqContext;\n\t}\n\tpublic NEQ(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.NEQ, 0);\n\t}\n\tpublic term(): TermContext {\n\t\treturn this.getTypedRuleContext(TermContext, 0) as TermContext;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterNeq) {\n\t \t\tlistener.enterNeq(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitNeq) {\n\t \t\tlistener.exitNeq(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitNeq) {\n\t\t\treturn visitor.visitNeq(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\nexport class EqContext extends EqNeqContext {\n\tconstructor(parser: RestrictionsParser, ctx: EqNeqContext) {\n\t\tsuper(parser, ctx.parentCtx, ctx.invokingState);\n\t\tsuper.copyFrom(ctx);\n\t}\n\tpublic eqNeq(): EqNeqContext {\n\t\treturn this.getTypedRuleContext(EqNeqContext, 0) as EqNeqContext;\n\t}\n\tpublic EQ(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.EQ, 0);\n\t}\n\tpublic term(): TermContext {\n\t\treturn this.getTypedRuleContext(TermContext, 0) as TermContext;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterEq) {\n\t \t\tlistener.enterEq(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitEq) {\n\t \t\tlistener.exitEq(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitEq) {\n\t\t\treturn visitor.visitEq(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\nexport class EqNeqTermContext extends EqNeqContext {\n\tconstructor(parser: RestrictionsParser, ctx: EqNeqContext) {\n\t\tsuper(parser, ctx.parentCtx, ctx.invokingState);\n\t\tsuper.copyFrom(ctx);\n\t}\n\tpublic term(): TermContext {\n\t\treturn this.getTypedRuleContext(TermContext, 0) as TermContext;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterEqNeqTerm) {\n\t \t\tlistener.enterEqNeqTerm(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitEqNeqTerm) {\n\t \t\tlistener.exitEqNeqTerm(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitEqNeqTerm) {\n\t\t\treturn visitor.visitEqNeqTerm(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\n\n\nexport class TermContext extends ParserRuleContext {\n\tconstructor(parser?: RestrictionsParser, parent?: ParserRuleContext, invokingState?: number) {\n\t\tsuper(parent, invokingState);\n    \tthis.parser = parser;\n\t}\n\tpublic ident(): IdentContext {\n\t\treturn this.getTypedRuleContext(IdentContext, 0) as IdentContext;\n\t}\n\tpublic ownIdent(): OwnIdentContext {\n\t\treturn this.getTypedRuleContext(OwnIdentContext, 0) as OwnIdentContext;\n\t}\n\tpublic number_(): NumberContext {\n\t\treturn this.getTypedRuleContext(NumberContext, 0) as NumberContext;\n\t}\n\tpublic str(): StrContext {\n\t\treturn this.getTypedRuleContext(StrContext, 0) as StrContext;\n\t}\n\tpublic LPAREN(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.LPAREN, 0);\n\t}\n\tpublic andOr(): AndOrContext {\n\t\treturn this.getTypedRuleContext(AndOrContext, 0) as AndOrContext;\n\t}\n\tpublic RPAREN(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.RPAREN, 0);\n\t}\n    public get ruleIndex(): number {\n    \treturn RestrictionsParser.RULE_term;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterTerm) {\n\t \t\tlistener.enterTerm(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitTerm) {\n\t \t\tlistener.exitTerm(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitTerm) {\n\t\t\treturn visitor.visitTerm(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\n\n\nexport class IdentContext extends ParserRuleContext {\n\tconstructor(parser?: RestrictionsParser, parent?: ParserRuleContext, invokingState?: number) {\n\t\tsuper(parent, invokingState);\n    \tthis.parser = parser;\n\t}\n\tpublic DOLLAR(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.DOLLAR, 0);\n\t}\n\tpublic word(): WordContext {\n\t\treturn this.getTypedRuleContext(WordContext, 0) as WordContext;\n\t}\n    public get ruleIndex(): number {\n    \treturn RestrictionsParser.RULE_ident;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterIdent) {\n\t \t\tlistener.enterIdent(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitIdent) {\n\t \t\tlistener.exitIdent(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitIdent) {\n\t\t\treturn visitor.visitIdent(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\n\n\nexport class OwnIdentContext extends ParserRuleContext {\n\tconstructor(parser?: RestrictionsParser, parent?: ParserRuleContext, invokingState?: number) {\n\t\tsuper(parent, invokingState);\n    \tthis.parser = parser;\n\t}\n\tpublic POUND(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.POUND, 0);\n\t}\n\tpublic word(): WordContext {\n\t\treturn this.getTypedRuleContext(WordContext, 0) as WordContext;\n\t}\n    public get ruleIndex(): number {\n    \treturn RestrictionsParser.RULE_ownIdent;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterOwnIdent) {\n\t \t\tlistener.enterOwnIdent(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitOwnIdent) {\n\t \t\tlistener.exitOwnIdent(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitOwnIdent) {\n\t\t\treturn visitor.visitOwnIdent(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\n\n\nexport class StrContext extends ParserRuleContext {\n\tconstructor(parser?: RestrictionsParser, parent?: ParserRuleContext, invokingState?: number) {\n\t\tsuper(parent, invokingState);\n    \tthis.parser = parser;\n\t}\n\tpublic STR(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.STR, 0);\n\t}\n\tpublic WS_list(): TerminalNode[] {\n\t    \treturn this.getTokens(RestrictionsParser.WS);\n\t}\n\tpublic WS(i: number): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.WS, i);\n\t}\n    public get ruleIndex(): number {\n    \treturn RestrictionsParser.RULE_str;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterStr) {\n\t \t\tlistener.enterStr(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitStr) {\n\t \t\tlistener.exitStr(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitStr) {\n\t\t\treturn visitor.visitStr(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\n\n\nexport class WordContext extends ParserRuleContext {\n\tconstructor(parser?: RestrictionsParser, parent?: ParserRuleContext, invokingState?: number) {\n\t\tsuper(parent, invokingState);\n    \tthis.parser = parser;\n\t}\n\tpublic WORD(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.WORD, 0);\n\t}\n    public get ruleIndex(): number {\n    \treturn RestrictionsParser.RULE_word;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterWord) {\n\t \t\tlistener.enterWord(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitWord) {\n\t \t\tlistener.exitWord(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitWord) {\n\t\t\treturn visitor.visitWord(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\n\n\nexport class NumberContext extends ParserRuleContext {\n\tconstructor(parser?: RestrictionsParser, parent?: ParserRuleContext, invokingState?: number) {\n\t\tsuper(parent, invokingState);\n    \tthis.parser = parser;\n\t}\n\tpublic NUMBER(): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.NUMBER, 0);\n\t}\n\tpublic WS_list(): TerminalNode[] {\n\t    \treturn this.getTokens(RestrictionsParser.WS);\n\t}\n\tpublic WS(i: number): TerminalNode {\n\t\treturn this.getToken(RestrictionsParser.WS, i);\n\t}\n    public get ruleIndex(): number {\n    \treturn RestrictionsParser.RULE_number;\n\t}\n\tpublic enterRule(listener: RestrictionsListener): void {\n\t    if(listener.enterNumber) {\n\t \t\tlistener.enterNumber(this);\n\t\t}\n\t}\n\tpublic exitRule(listener: RestrictionsListener): void {\n\t    if(listener.exitNumber) {\n\t \t\tlistener.exitNumber(this);\n\t\t}\n\t}\n\t// @Override\n\tpublic accept<Result>(visitor: RestrictionsVisitor<Result>): Result {\n\t\tif (visitor.visitNumber) {\n\t\t\treturn visitor.visitNumber(this);\n\t\t} else {\n\t\t\treturn visitor.visitChildren(this);\n\t\t}\n\t}\n}\n", "// Generated from ./Restrictions.g4 by ANTLR 4.13.2\n// noinspection ES6UnusedImports,JSUnusedGlobalSymbols,JSUnusedLocalSymbols\nimport {\n\tATN,\n\tATNDeserializer,\n\tCharStream,\n\tDecisionState, DFA,\n\tLexer,\n\tLexerATNSimulator,\n\tRuleContext,\n\tPredictionContextCache,\n\tToken\n} from \"antlr4\";\nexport default class RestrictionsLexer extends Lexer {\n\tpublic static readonly OR = 1;\n\tpublic static readonly AND = 2;\n\tpublic static readonly EQ = 3;\n\tpublic static readonly NEQ = 4;\n\tpublic static readonly MATCH = 5;\n\tpublic static readonly LPAREN = 6;\n\tpublic static readonly RPAREN = 7;\n\tpublic static readonly DOLLAR = 8;\n\tpublic static readonly POUND = 9;\n\tpublic static readonly STR = 10;\n\tpublic static readonly WORD = 11;\n\tpublic static readonly NUMBER = 12;\n\tpublic static readonly WS = 13;\n\tpublic static readonly EOF = Token.EOF;\n\n\tpublic static readonly channelNames: string[] = [ \"DEFAULT_TOKEN_CHANNEL\", \"HIDDEN\" ];\n\tpublic static readonly literalNames: (string | null)[] = [ null, \"'||'\", \n                                                            \"'&&'\", \"'=='\", \n                                                            \"'!='\", \"'?'\", \n                                                            \"'('\", \"')'\", \n                                                            \"'$'\", \"'#'\" ];\n\tpublic static readonly symbolicNames: (string | null)[] = [ null, \"OR\", \n                                                             \"AND\", \"EQ\", \n                                                             \"NEQ\", \"MATCH\", \n                                                             \"LPAREN\", \"RPAREN\", \n                                                             \"DOLLAR\", \"POUND\", \n                                                             \"STR\", \"WORD\", \n                                                             \"NUMBER\", \"WS\" ];\n\tpublic static readonly modeNames: string[] = [ \"DEFAULT_MODE\", ];\n\n\tpublic static readonly ruleNames: string[] = [\n\t\t\"OR\", \"AND\", \"EQ\", \"NEQ\", \"MATCH\", \"LPAREN\", \"RPAREN\", \"DOLLAR\", \"POUND\", \n\t\t\"STR\", \"WORD\", \"NUMBER\", \"WS\",\n\t];\n\n\n\tconstructor(input: CharStream) {\n\t\tsuper(input);\n\t\tthis._interp = new LexerATNSimulator(this, RestrictionsLexer._ATN, RestrictionsLexer.DecisionsToDFA, new PredictionContextCache());\n\t}\n\n\tpublic get grammarFileName(): string { return \"Restrictions.g4\"; }\n\n\tpublic get literalNames(): (string | null)[] { return RestrictionsLexer.literalNames; }\n\tpublic get symbolicNames(): (string | null)[] { return RestrictionsLexer.symbolicNames; }\n\tpublic get ruleNames(): string[] { return RestrictionsLexer.ruleNames; }\n\n\tpublic get serializedATN(): number[] { return RestrictionsLexer._serializedATN; }\n\n\tpublic get channelNames(): string[] { return RestrictionsLexer.channelNames; }\n\n\tpublic get modeNames(): string[] { return RestrictionsLexer.modeNames; }\n\n\tpublic static readonly _serializedATN: number[] = [4,0,13,86,6,-1,2,0,7,\n\t0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,\n\t9,2,10,7,10,2,11,7,11,2,12,7,12,1,0,1,0,1,0,1,1,1,1,1,1,1,2,1,2,1,2,1,3,\n\t1,3,1,3,1,4,1,4,1,5,1,5,1,6,1,6,1,7,1,7,1,8,1,8,1,9,1,9,4,9,52,8,9,11,9,\n\t12,9,53,1,9,1,9,1,10,4,10,59,8,10,11,10,12,10,60,1,11,3,11,64,8,11,1,11,\n\t5,11,67,8,11,10,11,12,11,70,9,11,1,11,3,11,73,8,11,1,11,4,11,76,8,11,11,\n\t11,12,11,77,1,12,4,12,81,8,12,11,12,12,12,82,1,12,1,12,0,0,13,1,1,3,2,5,\n\t3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,1,0,5,1,0,39,39,4,\n\t0,45,45,65,90,95,95,97,122,2,0,43,43,45,45,1,0,48,57,2,0,9,9,32,32,92,0,\n\t1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,\n\t0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,\n\t0,0,0,0,25,1,0,0,0,1,27,1,0,0,0,3,30,1,0,0,0,5,33,1,0,0,0,7,36,1,0,0,0,\n\t9,39,1,0,0,0,11,41,1,0,0,0,13,43,1,0,0,0,15,45,1,0,0,0,17,47,1,0,0,0,19,\n\t49,1,0,0,0,21,58,1,0,0,0,23,63,1,0,0,0,25,80,1,0,0,0,27,28,5,124,0,0,28,\n\t29,5,124,0,0,29,2,1,0,0,0,30,31,5,38,0,0,31,32,5,38,0,0,32,4,1,0,0,0,33,\n\t34,5,61,0,0,34,35,5,61,0,0,35,6,1,0,0,0,36,37,5,33,0,0,37,38,5,61,0,0,38,\n\t8,1,0,0,0,39,40,5,63,0,0,40,10,1,0,0,0,41,42,5,40,0,0,42,12,1,0,0,0,43,\n\t44,5,41,0,0,44,14,1,0,0,0,45,46,5,36,0,0,46,16,1,0,0,0,47,48,5,35,0,0,48,\n\t18,1,0,0,0,49,51,7,0,0,0,50,52,8,0,0,0,51,50,1,0,0,0,52,53,1,0,0,0,53,51,\n\t1,0,0,0,53,54,1,0,0,0,54,55,1,0,0,0,55,56,7,0,0,0,56,20,1,0,0,0,57,59,7,\n\t1,0,0,58,57,1,0,0,0,59,60,1,0,0,0,60,58,1,0,0,0,60,61,1,0,0,0,61,22,1,0,\n\t0,0,62,64,7,2,0,0,63,62,1,0,0,0,63,64,1,0,0,0,64,68,1,0,0,0,65,67,7,3,0,\n\t0,66,65,1,0,0,0,67,70,1,0,0,0,68,66,1,0,0,0,68,69,1,0,0,0,69,72,1,0,0,0,\n\t70,68,1,0,0,0,71,73,9,0,0,0,72,71,1,0,0,0,72,73,1,0,0,0,73,75,1,0,0,0,74,\n\t76,7,3,0,0,75,74,1,0,0,0,76,77,1,0,0,0,77,75,1,0,0,0,77,78,1,0,0,0,78,24,\n\t1,0,0,0,79,81,7,4,0,0,80,79,1,0,0,0,81,82,1,0,0,0,82,80,1,0,0,0,82,83,1,\n\t0,0,0,83,84,1,0,0,0,84,85,6,12,0,0,85,26,1,0,0,0,8,0,53,60,63,68,72,77,\n\t82,1,6,0,0];\n\n\tprivate static __ATN: ATN;\n\tpublic static get _ATN(): ATN {\n\t\tif (!RestrictionsLexer.__ATN) {\n\t\t\tRestrictionsLexer.__ATN = new ATNDeserializer().deserialize(RestrictionsLexer._serializedATN);\n\t\t}\n\n\t\treturn RestrictionsLexer.__ATN;\n\t}\n\n\n\tstatic DecisionsToDFA = RestrictionsLexer._ATN.decisionToState.map( (ds: DecisionState, index: number) => new DFA(ds, index) );\n}", "// Generated from ./Restrictions.g4 by ANTLR 4.13.2\n\nimport {ParseTreeVisitor} from 'antlr4';\n\n\nimport { ParseContext } from \"./RestrictionsParser.js\";\nimport { ExprContext } from \"./RestrictionsParser.js\";\nimport { AndOrEqNeqContext } from \"./RestrictionsParser.js\";\nimport { OrContext } from \"./RestrictionsParser.js\";\nimport { AndContext } from \"./RestrictionsParser.js\";\nimport { MatchContext } from \"./RestrictionsParser.js\";\nimport { NeqContext } from \"./RestrictionsParser.js\";\nimport { EqContext } from \"./RestrictionsParser.js\";\nimport { EqNeqTermContext } from \"./RestrictionsParser.js\";\nimport { TermContext } from \"./RestrictionsParser.js\";\nimport { IdentContext } from \"./RestrictionsParser.js\";\nimport { OwnIdentContext } from \"./RestrictionsParser.js\";\nimport { StrContext } from \"./RestrictionsParser.js\";\nimport { WordContext } from \"./RestrictionsParser.js\";\nimport { NumberContext } from \"./RestrictionsParser.js\";\n\n\n/**\n * This interface defines a complete generic visitor for a parse tree produced\n * by `RestrictionsParser`.\n *\n * @param <Result> The return type of the visit operation. Use `void` for\n * operations with no return type.\n */\nexport default class RestrictionsVisitor<Result> extends ParseTreeVisitor<Result> {\n\t/**\n\t * Visit a parse tree produced by `RestrictionsParser.parse`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitParse?: (ctx: ParseContext) => Result;\n\t/**\n\t * Visit a parse tree produced by `RestrictionsParser.expr`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitExpr?: (ctx: ExprContext) => Result;\n\t/**\n\t * Visit a parse tree produced by the `andOrEqNeq`\n\t * labeled alternative in `RestrictionsParser.andOr`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitAndOrEqNeq?: (ctx: AndOrEqNeqContext) => Result;\n\t/**\n\t * Visit a parse tree produced by the `or`\n\t * labeled alternative in `RestrictionsParser.andOr`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitOr?: (ctx: OrContext) => Result;\n\t/**\n\t * Visit a parse tree produced by the `and`\n\t * labeled alternative in `RestrictionsParser.andOr`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitAnd?: (ctx: AndContext) => Result;\n\t/**\n\t * Visit a parse tree produced by the `match`\n\t * labeled alternative in `RestrictionsParser.eqNeq`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitMatch?: (ctx: MatchContext) => Result;\n\t/**\n\t * Visit a parse tree produced by the `neq`\n\t * labeled alternative in `RestrictionsParser.eqNeq`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitNeq?: (ctx: NeqContext) => Result;\n\t/**\n\t * Visit a parse tree produced by the `eq`\n\t * labeled alternative in `RestrictionsParser.eqNeq`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitEq?: (ctx: EqContext) => Result;\n\t/**\n\t * Visit a parse tree produced by the `eqNeqTerm`\n\t * labeled alternative in `RestrictionsParser.eqNeq`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitEqNeqTerm?: (ctx: EqNeqTermContext) => Result;\n\t/**\n\t * Visit a parse tree produced by `RestrictionsParser.term`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitTerm?: (ctx: TermContext) => Result;\n\t/**\n\t * Visit a parse tree produced by `RestrictionsParser.ident`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitIdent?: (ctx: IdentContext) => Result;\n\t/**\n\t * Visit a parse tree produced by `RestrictionsParser.ownIdent`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitOwnIdent?: (ctx: OwnIdentContext) => Result;\n\t/**\n\t * Visit a parse tree produced by `RestrictionsParser.str`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitStr?: (ctx: StrContext) => Result;\n\t/**\n\t * Visit a parse tree produced by `RestrictionsParser.word`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitWord?: (ctx: WordContext) => Result;\n\t/**\n\t * Visit a parse tree produced by `RestrictionsParser.number`.\n\t * @param ctx the parse tree\n\t * @return the visitor result\n\t */\n\tvisitNumber?: (ctx: NumberContext) => Result;\n}\n\n", "import {ParserRuleContext} from 'antlr4';\nimport RestrictionsVisitor from './antlr4/RestrictionsVisitor.js';\nimport {Hiccup} from './types.js';\n\nconst visitor = new RestrictionsVisitor<Hiccup | Hiccup[]>();\n\nconst inline = (ctx: ParserRuleContext) => {\n    const children = visitor.visitChildren(ctx);\n    return children.length == 1 ? children[0] as Hiccup[] : children;\n};\nvisitor.visitParse = ctx => ctx.expr().accept(visitor);\nvisitor.visitExpr = ctx => {\n    return ['expr', inline(ctx)];\n};\nvisitor.visitAndOrEqNeq = inline;\nvisitor.visitEqNeqTerm = inline;\nvisitor.visitTerm = ctx => {\n    if (ctx.getChildCount() === 3) {\n        // lparen andOr rparen\n        return visitor.visit(ctx.getChild(1));\n    }\n    return inline(ctx);\n};\nvisitor.visitEq = ctx => {\n    const lhs = inline(ctx.eqNeq());\n    const rhs = ctx.term().accept(visitor);\n    return ['eq', lhs, rhs];\n}\nvisitor.visitNeq = ctx => {\n    const lhs = inline(ctx.eqNeq());\n    const rhs = ctx.term().accept(visitor);\n    return ['neq', lhs, rhs];\n}\nvisitor.visitMatch = ctx => {\n    return ['match', visitor.visitChildren(ctx.eqNeq())[0], ctx.term().accept(visitor)]\n}\nvisitor.visitAnd = ctx => {\n    const lhs = visitor.visitChildren(ctx.andOr());\n    const rhs = visitor.visitChildren(ctx.eqNeq());\n    return ['and', lhs[0], rhs[0]];\n}\nvisitor.visitIdent = (ctx) => {\n    return ['ident', ctx.word().accept(visitor)];\n};\nvisitor.visitOwnIdent = (ctx) => {\n    return ['own-ident', ctx.word().accept(visitor)];\n};\nvisitor.visitWord = ctx => ['word', ctx.WORD().symbol.text];\nvisitor.visitNumber = (ctx) => {\n    return ['number', ctx.NUMBER().symbol.text];\n};\nvisitor.visitStr = (ctx) => {\n    return ['str', ctx.STR().symbol.text.slice(1, -1)];\n};\n\nexport default visitor;\n", "import {Identity, Restrictions, Source} from './state/types/common.js';\nimport * as compat from './restrictions/compat.js';\n\nexport function parse(restrictions: string | Restrictions): Restrictions {\n    if (typeof restrictions === 'string') {\n        if (restrictions === 'cluster' || restrictions === 'local') {\n            return restrictions;\n        }\n        return compat.parse(restrictions);\n    }\n    return restrictions;\n}\n\n/**\n * Check a restriction for given for a given source and identity against some context (another source and identity).\n * Context may be another peer identity or another source (with type for ex. 'local' or 'cluster')\n * @param parsedRestrictions\n * @param own\n * @param ctx\n */\nexport function check(parsedRestrictions: Restrictions,\n                      own: [Source | undefined, Identity | undefined],\n                      ctx: [Source | undefined, Identity | undefined]): boolean {\n    const [ownSource, ownContext] = own;\n    const [source, context] = ctx;\n    switch (parsedRestrictions) {\n        case 'local': {\n            if (ownSource) {\n                if (ownSource.type === 'local') {\n                    return source?.type === 'local';\n                }\n                if (ownSource.type === 'peer') {\n                    if (source?.type === 'peer') {\n                        return source?.[\"node\"] === ownSource?.[\"node\"];\n                    }\n                    return false;\n                }\n            }\n            else {\n                return source === undefined || source.type === 'local';\n            }\n            return true;\n        }\n        case 'cluster': {\n            return true;\n        }\n        default: {\n            if (source?.type === 'cluster') {\n                return true;\n            }\n            return !!compat.check(parsedRestrictions, ownContext, context);\n        }\n    }\n}\n", "import {type Ids} from '../state/types/state.js';\n\nif (globalThis.crypto === undefined) {\n    throw new Error('Crypto API is not available. If Running Node 18, try --experimental-global-webcrypto.');\n}\n\n/**\n * Generates a random id, using CSPRNG.\n */\nexport function randomId(): string {\n    return globalThis.crypto.randomUUID().replaceAll('-', '');\n}\n\nexport function nodeId(ids?: Ids) {\n    if (ids) {\n        return ids.nodeId;\n    }\n    return randomId();\n}\n\nexport function requestId(ids: Ids): [Ids, string] {\n    const nextId = ids.currentId ?? 1;\n    const id = `r-${ids.nodeId}-${nextId}`;\n    return [{...ids, currentId: nextId + 1}, id];\n}\n\nexport function instanceId(ids: Ids): [Ids, string] {\n    const nextId = ids.currentId ?? 1;\n    const id = `i-${ids.nodeId}-${nextId}`;\n    return [{...ids, currentId: nextId + 1}, id];\n}\n\nexport function contextId(ids: Ids): [Ids, string] {\n    const nextId = ids.currentId ?? 1;\n    const id = `c-${ids.nodeId}-${nextId}`;\n    return [{...ids, currentId: nextId + 1}, id];\n}\n\nexport function activityId(ids: Ids): [Ids, string] {\n    const nextId = ids.currentId ?? 1;\n    const id = `a-${ids.nodeId}-${nextId}`;\n    return [{...ids, currentId: nextId + 1}, id];\n}\n\nexport function peerId(ids: Ids): [Ids, string] {\n    const nextId = ids.currentId ?? 1;\n    const id = `p-${ids.nodeId}-${nextId}`;\n    return [{...ids, currentId: nextId + 1}, id];\n}\n", "import {randomId} from '../common/ids.js';\r\nimport {PeerId, Restrictions} from './types/common.js';\r\nimport {DomainKeys, Peer, State} from './types/state.js';\r\nimport {DomainUri} from './types/domain-registry.js';\r\nimport {Draft, enableMapSet, produce} from 'immer';\r\nimport {HandleReturnType} from '../domain.js';\r\nimport {GatewayRequest, GwRequestId} from './types/pending-requests.js';\r\nimport {JoinedPeer} from './peers.js';\r\n\r\nenableMapSet();\r\n\r\n// state manipulation\r\n\r\nexport function emptyState(nodeId: string, signingKey?: string): State {\r\n    const signatureKey = signingKey ?? randomId();\r\n    return {\r\n        ids: {nodeId, currentId: 1},\r\n        signatureKey\r\n    };\r\n}\r\n\r\nexport function joinDomain(state: State, peerId: PeerId, domain: DomainKeys, restrictions?: Restrictions): State {\r\n    return produce(state, (draft: Draft<State>) => {\r\n        draft.peers![peerId][domain] = (restrictions ? {restrictions} : {}) as unknown as undefined;\r\n        draft.domains = draft.domains || {};\r\n        draft.domains![domain] = draft.domains![domain] || new Set<PeerId>();\r\n        draft.domains![domain]!.add(peerId);\r\n    });\r\n}\r\n\r\nexport function leaveDomain(state: State, peerId: PeerId, domain: DomainKeys): State {\r\n    return produce(state, (s: Draft<State>) => {\r\n        if (s.peers) {\r\n\r\n            delete s.peers![peerId][domain];\r\n        }\r\n        if (s.domains && s.domains[domain]) {\r\n            s.domains[domain]!.delete(peerId)\r\n        }\r\n    });\r\n}\r\n\r\nexport function inDomain(state: State, peerId: PeerId, domain: DomainKeys): boolean {\r\n    const has = state.domains?.[domain]?.has(peerId);\r\n    return !!has;\r\n}\r\n\r\nexport function peerInDomain<D extends DomainKeys>(peer: Peer, domain: D): peer is JoinedPeer<D> {\r\n    return !!peer[domain];\r\n}\r\n\r\n// requests\r\n\r\nexport function setGatewayRequest(state: State, gwRequestId: GwRequestId, request: GatewayRequest): State {\r\n    if (gwRequestId) {\r\n        return produce(state, (draft: Draft<State>) => {\r\n            draft.gatewayRequests = draft.gatewayRequests || {}\r\n            draft.gatewayRequests[gwRequestId] = request;\r\n        });\r\n    }\r\n    return state;\r\n}\r\n\r\nexport function gatewayRequest(state: State, requestId: GwRequestId): GatewayRequest | undefined {\r\n    if (requestId) {\r\n        return state.gatewayRequests?.[requestId];\r\n    }\r\n}\r\n\r\nexport function removeGatewayRequest<S extends State>(state: S, requestId: GwRequestId): { state: S, removed?: GatewayRequest } {\r\n    return produce({state}, (draft: Draft<{ state: S, removed?: GatewayRequest }>) => {\r\n        if (draft.state.gatewayRequests) {\r\n            draft.removed = draft.state.gatewayRequests[requestId];\r\n            delete draft.state.gatewayRequests[requestId];\r\n            if (Object.keys(draft.state.gatewayRequests).length === 0) {\r\n                delete draft.state.gatewayRequests;\r\n            }\r\n        }\r\n    });\r\n}\r\n\r\n// domain registry\r\n\r\nexport function domainForUri(state: State, domainUri: DomainUri) {\r\n    return state.registeredDomains?.[domainUri]?.domain;\r\n}\r\n\r\nexport function threadStateAndActions<S extends State>(state: S, ...functions: Array<(state: S) => HandleReturnType>): HandleReturnType {\r\n    return functions.reduce(([cs, cas], fun) => {\r\n        const [s, as]: HandleReturnType = fun(cs as S);\r\n        return [s, cas.concat(as)];\r\n    }, [state, []] as HandleReturnType);\r\n}\r\n\r\n", "import {exceptionInfo} from '../common/types.js';\r\nimport {Identity, PeerId, Restrictions, Source} from './types/common.js';\r\nimport {DomainKeys, Options, Peer, Peers, State} from './types/state.js';\r\nimport {check} from '../restrictions.js';\r\nimport * as c from './core.js';\r\nimport {castDraft, Draft, produce} from 'immer';\r\nimport {DomainUri} from './types/domain-registry.js';\r\nimport {MessageType, SendMessageAction} from '../node.js';\r\nimport {peerAdded, peerRemoved} from '../common/messages.js';\r\nimport {HandleReturnType} from '../domain.js';\r\nimport {Reason} from '../reason.js';\r\nimport {some, objectAsKey, WithRequired} from '../common/utilities.js';\r\n\r\nfunction isSourceSubsetOf(source, subset): boolean {\r\n    switch (subset.type) {\r\n        case 'node':\r\n            return subset.node === source.node;\r\n        case 'peer':\r\n            return (subset.node === source.node) && (subset.peer === source.peer);\r\n        case 'local':\r\n            return (subset.receive === source.receive);\r\n        default:\r\n            return false;\r\n    }\r\n}\r\n\r\nexport function bySourceInDomain<D extends DomainKeys>(state: State, source: Source, domain: D): Array<JoinedPeer<D>> {\r\n    return peersInDomain(state, domain).filter(peer => isSourceSubsetOf(peer.source, source));\r\n}\r\nexport function bySource(state: State, source: Source): Array<Peer> {\r\n    return peers(state).filter(peer => isSourceSubsetOf(peer.source, source));\r\n}\r\n\r\n// todo move this type in types/common.ts\r\nexport type JoinedPeer<D extends DomainKeys> = WithRequired<Peer, D>\r\n\r\nexport function byIdInDomain<D extends DomainKeys>(state: State, peerId: PeerId | undefined, domain: D): JoinedPeer<D> | undefined {\r\n    const peer = byId(state, peerId);\r\n    if (peer?.[domain]) {\r\n        return peer as JoinedPeer<D>;\r\n    }\r\n}\r\n\r\nexport function byId(state: State, peerId?: PeerId): Peer | undefined {\r\n    return peerId ? state.peers?.[peerId] : undefined;\r\n}\r\n\r\nexport function byIdThrows(state: State, peerId?: PeerId): Peer {\r\n    if (peerId) {\r\n        const peer = byId(state, peerId);\r\n        if (peer) {\r\n            return peer;\r\n        } else {\r\n            throw exceptionInfo(`Unable to find peer ${peerId}`, {});\r\n        }\r\n    } else {\r\n        throw exceptionInfo(`Peer id is missing`, {});\r\n    }\r\n}\r\n\r\nexport function byIdInDomainThrows<D extends DomainKeys>(state: State, peerId: PeerId | undefined, domain: D): JoinedPeer<D> {\r\n    if (peerId) {\r\n        const peer = byIdInDomain<D>(state, peerId, domain);\r\n        if (peer) {\r\n            return peer;\r\n        } else {\r\n            throw exceptionInfo(`Unable to find peer ${peerId} in domain ${domain}`, {});\r\n        }\r\n    } else {\r\n        throw exceptionInfo(`Peer id is missing`, {});\r\n    }\r\n}\r\n\r\nexport function isLocalPeer(peer?: Peer): boolean {\r\n    return peer?.source.type === 'local';\r\n}\r\n\r\nexport function isClusterPeer<D extends DomainKeys>(domain: D, peer?: Peer, ctx?: Identity): boolean {\r\n    return check(peer?.[domain]?.restrictions, [peer?.source, peer?.identity], [{type: 'cluster'}, ctx]);\r\n}\r\n\r\nexport function byIdentity(state: State, identity: Identity): PeerId | undefined {\r\n    const key = objectAsKey(identity);\r\n    return state.identities?.get(key);\r\n}\r\n\r\nexport function peers(state: State): Array<Peer> {\r\n    return Object.values(state.peers || {});\r\n}\r\n\r\nexport function peersInDomain<D extends DomainKeys>(state: State, domain: D): Array<JoinedPeer<D>> {\r\n    return Array.from<PeerId, JoinedPeer<D> | undefined>(state.domains?.[domain] ?? [], (peerId: PeerId) => {\r\n        return byIdInDomain<D>(state, peerId, domain);\r\n    }).filter(some<JoinedPeer<D>>);\r\n}\r\n\r\nexport function ensurePeerWithId(state: State, source: Source, peerId: PeerId, resolvedIdentity: Identity, creationRequest?, options?: Options): [State, Peer] {\r\n    const p = byId(state, peerId);\r\n    if (p) {\r\n        return [state, p];\r\n    }\r\n\r\n    const newPeer: Peer = produce({id: peerId, identity: resolvedIdentity, source}, (draft: Draft<Peer>) => {\r\n        if (options) {\r\n            draft.options = options;\r\n        }\r\n        if (creationRequest) {\r\n            draft.creationRequest = creationRequest;\r\n        }\r\n    });\r\n    return [produce(state, (draft: Draft<State>) => {\r\n\r\n        // const user = resolvedIdentity.user ?? noUser;\r\n        draft.users = draft.users || {};\r\n        if (resolvedIdentity.user) {\r\n            draft.users.byName = draft.users.byName || new Map();\r\n            const userPeers = draft.users.byName.get(resolvedIdentity.user);\r\n            if (userPeers) {\r\n                userPeers.add(peerId);\r\n            } else {\r\n                draft.users.byName.set(resolvedIdentity.user, new Set<string>([peerId]));\r\n            }\r\n        } else {\r\n            draft.users.noUser = draft.users.noUser || new Set<PeerId>();\r\n            draft.users.noUser.add(peerId);\r\n        }\r\n        draft.identities = draft.identities || new Map<string, PeerId>();\r\n        draft.identities.set(objectAsKey(resolvedIdentity), peerId);\r\n\r\n        draft.peers = draft.peers || {};\r\n        draft.peers[peerId] = castDraft(newPeer);\r\n        if (options?.service) {\r\n            draft.services = draft.services || new Set<PeerId>();\r\n            draft.services.add(peerId)\r\n        }\r\n\r\n    }), newPeer];\r\n\r\n}\r\n\r\nexport function removePeer<S extends State>(state: S, peer: Peer): S {\r\n    const idnt = peer.identity;\r\n    const id: PeerId = peer.id;\r\n    const user: string | undefined = idnt.user;\r\n\r\n    return produce(state, (draft: Draft<S>) => {\r\n        if (draft.identities) {\r\n            draft.identities.delete(objectAsKey(idnt));\r\n        }\r\n        if (draft.users) {\r\n            if (user) {\r\n                const userPeers = draft.users.byName?.get(user);\r\n                if (userPeers) {\r\n                    userPeers.delete(id);\r\n                    if (userPeers.size == 0) {\r\n                        draft.users.byName?.delete(user);\r\n                    }\r\n                }\r\n                if (draft.users.byName && draft.users.byName.size === 0) {\r\n                    delete draft.users.byName;\r\n                }\r\n            } else {\r\n                draft.users.noUser?.delete(id);\r\n                if (draft.users.noUser?.size === 0) {\r\n                    delete draft.users.noUser;\r\n                }\r\n            }\r\n        }\r\n        if (draft.peers) {\r\n            delete draft.peers[id];\r\n        }\r\n        draft.services = draft.services || new Set<PeerId>();\r\n        if (draft.services) {\r\n            draft.services.delete(id);\r\n            // if (s.services.size == 0) {\r\n            //     delete s.services;\r\n            // }\r\n        }\r\n    });\r\n}\r\n\r\nexport function setPeer<S extends State>(state: S, peerId: PeerId, peer: Peer): S {\r\n    return produce(state, (s: Draft<S>) => {\r\n        s.peers = s.peers || castDraft({} as Peers);\r\n        s.peers[peerId] = castDraft(peer);\r\n    });\r\n}\r\n\r\nexport function updatePeer<P = Draft<Peer>>(state: State, peerId: PeerId, f: (draft: P) => void): State {\r\n    return produce(state, (s: Draft<State>) => {\r\n        s.peers![peerId] = produce(s.peers![peerId], f);\r\n    })\r\n}\r\n\r\nexport function isPeerVisibleIdentity(\r\n    lhs: [source: Source | undefined, identity: Identity | undefined, restrictions?: Restrictions, service?: boolean],\r\n    rhs: [source: Source | undefined, identity: Identity, restrictions?: Restrictions, service?: boolean]) {\r\n\r\n    const [lhsSource, lhsIdentity, lhsRestrictions, lhsService] = lhs;\r\n    const [rhsSource, rhsIdentity, rhsRestrictions, rhsService] = rhs;\r\n\r\n    if (!lhsRestrictions && !rhsRestrictions) {\r\n        const rhsUser = rhsIdentity?.user;\r\n        const lhsUser = lhsIdentity?.user;\r\n        return (rhsService || lhsService || (rhsUser === lhsUser));\r\n    } else {\r\n        return check(lhsRestrictions, [lhsSource, lhsIdentity], [rhsSource, rhsIdentity]) && check(rhsRestrictions, [rhsSource, rhsIdentity], [lhsSource, lhsIdentity]);\r\n    }\r\n}\r\n\r\n/**\r\n * Returns whether two peers can see each other.\r\n * @param domain\r\n * @param lhsPeer\r\n * @param rhsPeer\r\n */\r\nexport function isPeerVisible<D extends DomainKeys>(domain: D, lhsPeer: JoinedPeer<D>, rhsPeer: JoinedPeer<D>): boolean {\r\n\r\n    return (rhsPeer.id !== lhsPeer.id)\r\n        && isPeerVisibleIdentity(\r\n            [lhsPeer.source, lhsPeer.identity, lhsPeer[domain]?.restrictions, lhsPeer.options?.service],\r\n            [rhsPeer.source, rhsPeer.identity, rhsPeer[domain]?.restrictions, rhsPeer.options?.service]);\r\n}\r\n\r\n/* Matches all visible peers disregarding their user */\r\nfunction allVisiblePeers<D extends DomainKeys>(state: State, domain: D, peer: JoinedPeer<D>, includeSelf = false): Array<JoinedPeer<D>> {\r\n    return peersInDomain(state, domain)\r\n        .concat(\r\n            Array.from(state.services ?? [], (peerId: PeerId) => {\r\n                return byId(state, peerId) as JoinedPeer<D>; // todo do we use services at all???\r\n            }).filter(some<JoinedPeer<D>>)\r\n        ).filter(other => {\r\n            return (includeSelf && (peer.id === other.id)) || isPeerVisible(domain, peer, other);\r\n        });\r\n}\r\n\r\n/**\r\n * Returns a sequence of ids of the consumers that are seen by a provider\r\n */\r\nexport function visiblePeers<D extends DomainKeys>(state: State, domain: D, peer: JoinedPeer<D>, includeSelf?: boolean): Array<Peer> {\r\n    if (peer.options?.service) {\r\n        return allVisiblePeers<D>(state, domain, peer, includeSelf);\r\n    } else {\r\n        const user = peer.identity.user;\r\n        if (user) {\r\n            return Array.from<PeerId>(state.users?.byName?.get(user) ?? []).concat(Array.from<PeerId>(state.services ?? []))\r\n                .map((peerId: PeerId) => {\r\n                    return byId(state, peerId);\r\n                })\r\n                .filter(some<Peer>)\r\n                .filter((p: Peer) => {\r\n                    return (c.peerInDomain(p, domain) && isPeerVisible(domain, peer, p)) || (includeSelf && p.id === peer.id);\r\n                });\r\n        } else {\r\n            return allVisiblePeers(state, domain, peer, includeSelf);\r\n        }\r\n    }\r\n}\r\n\r\n/*Generates the peer announcement messages for both sides*/\r\nfunction announcePeerMessages(domainUri: DomainUri, existingMessages: SendMessageAction<'peer-added'>[], receiver: Source, newPeer: Peer, existingPeer: Peer): SendMessageAction<'peer-added'>[] {\r\n    const existingIdentity = existingPeer.identity;\r\n    const existingId = existingPeer.id;\r\n\r\n    const newPeerId = newPeer.id;\r\n    const isLocal = isLocalPeer(newPeer);\r\n    return produce(existingMessages, (m) => {\r\n        if (isLocal) {\r\n            m.push(peerAdded(domainUri, receiver, newPeerId, existingId, existingIdentity, {local: isLocal}));\r\n        }\r\n        if (isLocalPeer(existingPeer)) {\r\n            m.push(peerAdded(domainUri, existingPeer.source, existingId, newPeerId, newPeer.identity, {local: isLocal}));\r\n        }\r\n    });\r\n}\r\n\r\nexport function announcePeer<D extends DomainKeys>(domainUri: DomainUri, domain: D, state: State, receiver: Source, peer: JoinedPeer<D>): SendMessageAction<'peer-added'>[] {\r\n    return visiblePeers(state, domain, peer).reduce((messages, existingPeer) => {\r\n        return announcePeerMessages(domainUri, messages, receiver, peer, existingPeer);\r\n    }, [] as Array<SendMessageAction<'peer-added'>>);\r\n}\r\n\r\n/**\r\n * Peer is leaving the domain.\r\n *\r\n *        Updates the state and generates messages for all other local peers\r\n */\r\nexport function leaveDomain<D extends DomainKeys>(domainUri: DomainUri, domain: D, state: State, leavingPeer: JoinedPeer<D>, reason: Reason, isSourceRemoved: boolean): HandleReturnType {\r\n    const peerId = leavingPeer.id;\r\n    return [\r\n        c.leaveDomain(state, peerId, domain),\r\n        visiblePeers(state, domain, leavingPeer)\r\n            .filter(isLocalPeer)\r\n            .reduce((messages, removedFrom) => {\r\n                messages = messages.concat(peerRemoved(domainUri, removedFrom.source, removedFrom.id, peerId, reason));\r\n                if (!isSourceRemoved) {\r\n                    messages = messages.concat(peerRemoved(domainUri, leavingPeer.source, peerId, removedFrom.id, reason));\r\n                }\r\n                return messages;\r\n            }, [] as SendMessageAction<MessageType>[])\r\n    ];\r\n}\r\n", "import {\n    CommandType,\n    handleMessage as nodeHandleMessage,\n    buildDomains,\n    InternalType,\n    MessageType,\n    GatewayNode,\n    NodeMessage,\n    NodeOptions,\n    RequestType,\n    SendMessageAction\n} from '../node.js';\nimport {HandleReturnType, Domain} from '../domain.js';\nimport {emptyState} from '../state/core.js';\nimport {failure} from '../constants.js';\nimport {nodeId} from '../common/ids.js';\nimport {getLogger} from '../logger.js';\nimport {error} from '../common/messages.js';\nimport {exceptionToReason} from '../reason.js';\nimport {PeerId, Source} from '../state/types/common.js';\nimport {friendlily} from '../common/utilities.js';\nimport {MessageReceiver} from '../common/channel.js';\nimport {State} from '../state/types/state.js';\nimport {IOGateway} from '../../gateway';\n\ntype LocalNodeOptions = NodeOptions\n\nexport class LocalNode implements GatewayNode {\n    constructor(private readonly handler: MessageReceiver<NodeMessage<CommandType | RequestType>>) {\n    }\n\n    close(): void {\n        // do nothing\n    }\n\n    message(msg: NodeMessage<RequestType>) {\n        this.handler(msg);\n    }\n\n    addSource(source: Source): void {\n        // do nothing\n    }\n\n    removeSource(source: Source): void {\n        const msg: NodeMessage<CommandType> = {\n            origin: 'local',\n            source,\n            body: {type: 'commands/source-removed'}\n        }\n        return this.handler(msg);\n    }\n}\n\nconst log = getLogger('gateway.node.local');\n\nfunction handleMessage(state: State, msg: NodeMessage<RequestType | InternalType | CommandType>): HandleReturnType {\n    const {source, body, origin} = msg;\n    // const nodeId = state.ids.nodeId;\n    try {\n        if (body['dump']) {\n            log.info(`state dump:\\n${JSON.stringify(friendlily(state), null, '\\t')}`);\n            return [state, []];\n        } else if (origin === 'cluster') {\n            return [state, []];\n        } else {\n            return nodeHandleMessage(state, msg, source);\n        }\n    } catch (e) {\n        log.error(`Error handling message ${JSON.stringify(msg)}`, e);\n        const m = body as {\n            request_id?: string\n            peer_id?: PeerId\n        };\n        return [state, [error(undefined, source, m.request_id, m.peer_id, exceptionToReason(e, failure))]];\n    }\n\n}\n\nfunction hasReceiver(address): address is { receive: MessageReceiver<IOGateway.Message<unknown>> } {\n    return 'receive' in address && address.receive;\n}\n\nfunction processResponse<T>(response: SendMessageAction<T>) {\n    switch (response.receiver.type) {\n        case 'cluster':\n            return;\n        case 'node':\n            return;\n        case 'peer':\n            return;\n        case 'local': {\n            const {receiver, body} = response;\n            if (log.enabledFor('debug')) {\n                log.debug(`Sending message ${JSON.stringify(body, null, '\\t')} to ${JSON.stringify(receiver)}`);\n            }\n            if (hasReceiver(receiver)) {\n                receiver.receive(body);\n            }\n            break;\n        }\n        default: {\n            log.error(`Unable to process response ${JSON.stringify(response)}`);\n            break;\n        }\n    }\n}\n\nfunction processMessage(state: State, msg: NodeMessage<CommandType | InternalType | RequestType>) {\n    try {\n        if (log.enabledFor('trace')) {\n            log.debug(`domain handler processing message ${JSON.stringify(msg)}`);\n        }\n        // todo event logger\n        const [newState, responses] = handleMessage(state, msg);\n        if (responses) {\n            for (const response of responses) {\n                processResponse(response);\n            }\n        }\n        return newState ?? state;\n    } catch (e) {\n        log.error(`error handling message ${JSON.stringify(msg)}`, e);\n        return state;\n    }\n\n}\n\nexport function localNode<T extends MessageType = MessageType>(domains: Domain<T>[], options?: LocalNodeOptions): GatewayNode {\n    let state: State;\n    // const ser = new AsyncSerializer()\n    const handler = (msg: NodeMessage<CommandType | InternalType | RequestType>) => {\n        try {\n            // state = await ser.put(() => {\n                // todo handle close and destroy domains\n                state = processMessage(state, msg);\n                // return processMessage(state, msg);\n            // });\n        } catch (e) {\n            log.error(`Error processing internal message ${JSON.stringify(msg)}`, e);\n            throw e;\n        }\n    };\n\n    const registeredDomains = buildDomains(domains);\n\n    state = domains.reduce(\n        (s, domain) => {\n            return domain.init(s);\n        },\n        {\n            ...emptyState(options?.nodeId ?? nodeId(), options?.signingKey),\n            registeredDomains: registeredDomains,\n            handler: handler\n        } as State);\n    return new LocalNode(handler);\n}\n", "import * as c from '../../constants.js';\n\nexport const globalDomainUri = c.globalDomainUri;\n\nexport const failure = c.failure;\n\nexport const globalUnhandledMessage = `${globalDomainUri}.errors.unhandled_message`;\nexport const globalAlreadySeen = `${globalDomainUri}.errors.already_seen`;\nexport const globalInvalidDomain = `${globalDomainUri}.errors.invalid_domain`;\nexport const globalInvalidContext = `${globalDomainUri}.errors.invalid_context`;\nexport const globalAuthenticationFailure = `${globalDomainUri}.errors.authentication.failure`;\nexport const globalInvalidPeer = `${globalDomainUri}.errors.invalid_peer`;\n", "import {AuthenticationData, AuthenticationRequest, AuthenticationResponse} from '../../auth/types.js';\nimport {broadcast, error, isLocalSource, isRemoteSource, token} from '../../common/messages.js';\nimport {exceptionToReason, reason} from '../../reason.js';\nimport {\n    failure,\n    globalAlreadySeen,\n    globalAuthenticationFailure,\n    globalDomainUri,\n    globalInvalidDomain,\n    globalInvalidPeer,\n    globalUnhandledMessage\n} from './constants.js';\nimport {Domain, HandleReturnType, StateToMessagesReturnType} from '../../domain.js';\nimport {\n    CommandType,\n    DomainType,\n    GlobalRequestType,\n    InternalType,\n    NodeMessage,\n    SendMessageAction\n} from '../../node.js';\nimport {domainForUri, removeGatewayRequest, threadStateAndActions} from '../../state/core.js';\nimport {ExceptionInfo, exceptionData, exceptionInfo, exceptionMessage} from '../../common/types.js';\nimport {getLogger} from '../../logger.js';\nimport * as msg from './messages.js';\nimport {instanceId, peerId} from '../../common/ids.js';\nimport {byId, byIdentity, byIdThrows, bySource, ensurePeerWithId, removePeer} from '../../state/peers.js';\nimport {checkIdentity, machine} from '../../common/peerIdentity.js';\nimport {forAuthentication} from '../../common/tokens.js';\nimport * as ctx from '../../common/context/ops.js';\nimport {BroadcastDestroy, ContextOverrides} from '../../common/context/ops.js';\nimport {Peer, State} from '../../state/types/state.js';\nimport {DomainInfo} from '../../state/types/domain-registry.js';\nimport {CreateToken, DomainJoin, Hello, Join, Leave, RemoteJoin, WelcomeOptions} from './types/messages.js';\nimport {Authenticator} from '../../auth/core.js';\nimport {Identity, LocalAddress, PeerId, Source} from '../../state/types/common.js';\nimport {peerToAddress} from '../../address.js';\nimport {\n    CreateContext,\n    DestroyContext,\n    SubscribeContext,\n    UnsubscribeContext,\n    UpdateContext\n} from '../../common/context/types/messages.js';\nimport {contextDomainUri} from '../../constants.js';\nimport {HelloRequest, JoinRequest} from './types/requests.js';\nimport {MessageReceiver} from '../../common/channel.js';\nimport {PartialBy} from '../../common/utilities.js';\nimport {IOGateway} from '../../../gateway';\nimport {ping} from \"./messages.js\";\n// import {announceContexts} from \"../../common/context/ops\";\n\nexport type Authenticators = { 'default': string, available: { [keys: string]: Authenticator } };\n\nexport type RequestSource = {\n    request_id: string\n    // todo remote identity?\n    identity: Identity\n}\n\nexport type Authenticated = IOGateway.Message<'internal/authenticated'> & AuthenticationData & RequestSource\nexport type AuthenticationContinue =\n    IOGateway.Message<'internal/authentication-request'>\n    & AuthenticationData\n    & RequestSource\nexport type AuthenticationError = IOGateway.Message<'internal/authentication-failed'> & RequestSource & {\n    message: string\n}\n\nexport function handleHello(state: State, source: Source, request: HelloRequest, authenticators: Authenticators, handler: MessageReceiver<NodeMessage<InternalType>>): HandleReturnType {\n    const {request_id: requestId, identity: remoteIdentity, authentication, options} = request;\n    const requestedProvider: string = authentication?.provider ?? authenticators['default'];\n    const authenticator = authenticators.available[requestedProvider];\n    if (authenticator) {\n        const authenticationRequest: AuthenticationRequest = {\n            requestId,\n            remoteIdentity,\n            authentication,\n            signatureKey: state.signatureKey,\n            clientAuth: source['auth']\n        };\n        authenticator.authenticate(authenticationRequest)\n            .then((msg: AuthenticationResponse) => {\n                let type = msg.type as InternalType;\n                if (msg.type === 'success') {\n                    type = 'internal/authenticated';\n                }\n                else if (msg.type === 'continue') {\n                    type = 'internal/authentication-request';\n                }\n\n                return {...msg, type} as IOGateway.Message<InternalType>;\n            })\n            .catch((err) => {\n                log.debug(`authentication request rejected`, err);\n                return {\n                    message: exceptionMessage(err),\n                    ...exceptionData(err),\n                    type: 'internal/authentication-failed'\n                } as IOGateway.Message<InternalType>;\n            }).then((msg: IOGateway.Message<InternalType>) => {\n                // add request source\n                const m = {...msg, request_id: requestId, identity: remoteIdentity};\n                if (m.type === 'internal/authenticated') {\n                    (m as Authenticated).options = options;\n                }\n                const internal: NodeMessage<InternalType> = {\n                    origin: 'local',\n                    source,\n                    body: m\n                };\n                handler(internal);\n            });\n        return [state, []];\n    } else {\n        return [state, [error(globalDomainUri,\n            source,\n            requestId,\n            undefined,\n            reason(globalAuthenticationFailure, `Requested authentication provider ${requestedProvider} is not available`))]]\n    }\n}\n\nfunction remoteJoin(state: State, source: Source, request: RemoteJoin): HandleReturnType {\n    const {peer_id: peerId, identity, options} = request;\n    const destinationDomain = domainForUri(state, request.destination);\n    if (destinationDomain) {\n        [state,] = ensurePeerWithId(state, source, peerId, identity, null, options);\n        return destinationDomain.handleMessage(state, {\n            origin: 'cluster',\n            source: source,\n            body: {...request, type: 'domain/join'}\n        });\n    }\n    return [state, []];\n}\n\nfunction localJoin(state: State, source: Source, request: JoinRequest): HandleReturnType {\n\n    const {peer_id: peerId, request_id: requestId, destination: domainUri} = request;\n\n    const peer = byId(state, peerId);\n    if (peer?.identity) {\n        const destinationDomain = domainForUri(state, domainUri);\n        if (destinationDomain) {\n            const body: DomainJoin = {\n                ...request,\n                type: 'domain/join',\n                identity: peer.identity\n            };\n            return destinationDomain.handleMessage(state, {\n                origin: 'local',\n                source: source,\n                body\n            })\n        } else {\n            return [state, [error(globalDomainUri, source, requestId, peerId, reason(globalInvalidDomain, `Unable to join missing domain ${domainUri}`))]];\n        }\n    } else {\n        return [state, [error(globalDomainUri, source, requestId, peerId, reason(globalInvalidPeer, `Unable to find peer with id ${peerId}`))]];\n    }\n}\n\nfunction forwardJoin(state: State, source: Source, request: JoinRequest): HandleReturnType {\n    if (isRemoteSource(source)) {\n        return remoteJoin(state, source, request as RemoteJoin);\n    } else {\n        return localJoin(state, source, request);\n    }\n}\n\nfunction contextCompatibility(state: State, source: Source, request): HandleReturnType {\n    return localJoin(state, source, request);\n}\n\nfunction remoteLeave(state: State, source: Source, request: Leave): HandleReturnType {\n    const {peer_id: peerId, destination: domainUri} = request;\n    if (byId(state, peerId)) {\n        const destinationDomain = domainForUri(state, domainUri);\n        if (destinationDomain) {\n            return destinationDomain.handleMessage(state, {\n                origin: 'local',\n                source: source,\n                body: {...request, type: 'domain/leave'}\n            });\n        }\n    }\n    return [state, []];\n}\n\nfunction localLeave(state: State, source: Source, request: Leave): HandleReturnType {\n\n    const {peer_id: peerId, request_id: requestId, destination: domainUri} = request;\n\n    if (byId(state, peerId)) {\n        const destinationDomain = domainForUri(state, domainUri);\n        if (destinationDomain) {\n            return destinationDomain.handleMessage(state, {\n                origin: 'local',\n                source: source,\n                body: {...request, type: 'domain/leave'}\n            });\n        } else {\n            return [state, [error(globalDomainUri, source, requestId, peerId, reason(globalInvalidDomain, `Unable to join missing domain ${domainUri}`))]];\n        }\n    } else {\n        return [state, [error(globalDomainUri, source, requestId, peerId, reason(globalInvalidPeer, `Unable to find peer with id ${peerId}`))]];\n    }\n}\n\nfunction forwardLeave(state: State, source: Source, request: Leave): HandleReturnType {\n    return isRemoteSource(source) ? remoteLeave(state, source, request) : localLeave(state, source, request);\n}\n\n\nconst log = getLogger('gateway.domains.global');\n\nexport function sourceRemoved(state: State, source: Source, command: IOGateway.Message<\"commands/source-removed\">): HandleReturnType {\n    if (log.enabledFor('debug')) {\n        log.debug(`removing source ${JSON.stringify(source)} from global domain`);\n    }\n\n    const nodeId = state.ids.nodeId;\n    const [newState, msgs] = bySource(state, source).reduce(([s, m], p: Peer) => {\n        s = removePeer(s, p);\n        if (isLocalSource(source)) {\n            if (log.enabledFor('info')) {\n                log.info(`removed peer ${p.id} was on endpoint ${source['endpoint']}`);\n            }\n            m = m.concat(broadcast(peerToAddress(nodeId, p.id), command))\n        }\n        return [s, m];\n    }, [state, []] as HandleReturnType);\n\n    if (log.enabledFor('debug')) {\n        log.debug(`removed source ${JSON.stringify(source)} from global domain`);\n    }\n    // todo measurements\n    return [newState, msgs];\n}\n\nfunction resolveQMarks(identity: Record<string, unknown>, peerId: PeerId): Record<string, unknown> {\n    return Object\n        .keys(identity)\n        .filter((key) => identity[key] === '?')\n        .reduce((unresolved, key) => {\n            const resolved = {};\n            resolved[key] = peerId;\n            return Object.assign(unresolved, resolved);\n        }, identity);\n}\n\n/*The gateway token authentication allows a peer to assume part (currently the user) of the\n  identity of the peer that has requested its creation*/\nfunction impersonate(remoteIdentity: Identity, impersonateIdentity?: {user: string}) {\n    const user = impersonateIdentity?.user;\n    if (user) {\n        return {...remoteIdentity, user};\n    }\n    return remoteIdentity;\n}\n\nfunction authenticationFailed(state: State, source: Source, request: AuthenticationError): HandleReturnType {\n    const {request_id: requestId, message: msg} = request;\n    return [state, [error(globalDomainUri, source, requestId, undefined, reason(globalAuthenticationFailure, msg))]];\n}\n\nfunction authenticationRequest(state: State, source: LocalAddress, request: AuthenticationContinue): HandleReturnType {\n    const {request_id: requestId, authentication} = request;\n    return [state, [msg.authenticationRequest(globalDomainUri, source, requestId, undefined, authentication)]];\n}\n\nfunction checkExisting(state: State, source: Source, identity: Identity) {\n    const existingId = byIdentity(state, identity);\n    if (existingId) {\n        const existing = byId(state, existingId);\n        throw new ExceptionInfo(\n            `peer for ${JSON.stringify(identity)} already accepted on source ${JSON.stringify(existing?.source)} with id ${existingId}, ignoring request on source ${JSON.stringify(source)}`,\n            {uri: globalAlreadySeen, message: 'Hello already received once', existing}\n        );\n    }\n}\n\nexport function authenticated(state: State, source: LocalAddress, authenticated: PartialBy<Authenticated, 'type'>, settings?: GlobalDomainOptions): HandleReturnType {\n    const {\n        request_id: requestId,\n        identity: remoteIdentity,\n        user,\n        login,\n        impersonatePeer,\n        gwRequest,\n        accessToken\n    } = authenticated;\n    if (gwRequest?.id) {\n        state = removeGatewayRequest(state, gwRequest.id).state;\n    }\n    let resolvedIdentity: Record<string, unknown> = {\n        machine: machine(source.host, '127.0.0.1'),\n        ...remoteIdentity\n    };\n    if (user) {\n        resolvedIdentity = {...resolvedIdentity, user};\n    }\n    if (login) {\n        resolvedIdentity = {...resolvedIdentity, login};\n    }\n    if (impersonatePeer) {\n        resolvedIdentity = impersonate(resolvedIdentity, impersonatePeer)\n    }\n    if (!resolvedIdentity.instance) {\n        const [ids, instance] = instanceId(state.ids);\n        resolvedIdentity = {...resolvedIdentity, instance};\n        state = {...state, ids}\n    }\n    const options = {...authenticated.options};\n    if (!('context_compatibility_mode' in options)) {\n        options.context_compatibility_mode = settings?.contextCompatibility ?? true;\n    }\n    options[\"context-compatibility-mode?\"] = options.context_compatibility_mode;\n    delete options.context_compatibility_mode;\n\n    try {\n        checkExisting(state, source, resolvedIdentity);\n        checkIdentity(resolvedIdentity)\n        //todo limits\n\n        const [ids, id] = peerId(state.ids);\n        resolvedIdentity = resolveQMarks(resolvedIdentity, id);\n        let peer;\n        [state, peer] = ensurePeerWithId({\n            ...state,\n            ids\n        }, source, id, resolvedIdentity, gwRequest, options);\n        if (log.enabledFor('info')) {\n            log.info(`added peer ${peer.id} on endpoint ${source.endpoint} with ${JSON.stringify(resolvedIdentity)}`);\n        }\n        const welcomeOptions: WelcomeOptions = {};\n        if (accessToken) {\n            welcomeOptions.access_token = accessToken;\n        }\n        if (settings?.welcomeInfo) {\n            welcomeOptions.info = settings?.welcomeInfo;\n        }\n        const availableDomains = Object.values<{ info: DomainInfo }>(state.registeredDomains ?? {})\n            .map((domain) => domain.info);\n\n        const sendWelcome = msg.welcome(source,\n            requestId,\n            peer.id,\n            availableDomains,\n            resolvedIdentity,\n            Object.keys(welcomeOptions).length === 0 ? undefined : welcomeOptions);\n        return threadStateAndActions(state,\n            s => [s, [sendWelcome]],\n            // s => announceContexts(globalDomainUri, s, peer),\n            s => options[\"context-compatibility-mode?\"] ? contextCompatibility(s, source, {\n                request_id: requestId,\n                peer_id: peer.id,\n                identity: resolvedIdentity,\n                options,\n                destination: contextDomainUri,\n                domain: globalDomainUri\n            }) : [s, []]);\n    } catch (e) {\n        const messages: SendMessageAction<'ping' | 'error'>[] = [];\n        const data = exceptionData(e);\n        log.warn(`authenticated peer not welcomed`, e);\n        if (data?.['uri'] === globalAlreadySeen) {\n            const existing = data['existing'] as Peer;\n            if (existing) {\n                messages.push(ping(existing.source));\n            }\n        }\n        if (isLocalSource(source)) {\n            messages.push(error(globalDomainUri, source, requestId, undefined, exceptionToReason(e, failure)));\n        }\n        return [state, messages];\n    }\n}\n\nexport function forwardUpdate(state: State, source: Source, request: UpdateContext): HandleReturnType {\n    return ctx.forwardUpdate(globalDomainUri, state, source, request);\n}\n\nexport function forwardCreate(state: State, source: Source, request: Omit<CreateContext, 'type'>, options?: ContextOverrides): HandleReturnType {\n    return ctx.forwardCreate(globalDomainUri, state, source, request, options);\n}\n\nexport function forwardDestroy(state: State, source: Source, request: DestroyContext | BroadcastDestroy): HandleReturnType {\n    return ctx.forwardDestroy(globalDomainUri, state, source, request);\n}\n\nexport function forwardSubscribe(state: State, source: Source, request): HandleReturnType {\n    return ctx.forwardSubscribe(globalDomainUri, state, source, request);\n}\n\nexport function forwardUnsubscribe(state: State, source: Source, request: UnsubscribeContext): HandleReturnType {\n    return ctx.forwardUnsubscribe(globalDomainUri, state, source, request);\n}\n\nexport function handleRequest(state: State, source: Source, request: IOGateway.Message<GlobalMessageType>, authenticators: Authenticators, options?: GlobalDomainOptions): HandleReturnType {\n    switch (request.type) {\n        case 'hello': {\n            return handleHello(state, source, request as Hello, authenticators, state.handler!);\n        }\n        case 'join': {\n            return forwardJoin(state, source, request as Join);\n        }\n        case 'leave': {\n            return forwardLeave(state, source, request as Leave);\n        }\n        case 'internal/authenticated': {\n            return authenticated(state, source as LocalAddress, request as Authenticated, options);\n        }\n        case 'internal/authentication-failed': {\n            return authenticationFailed(state, source, request as AuthenticationError);\n        }\n        case 'internal/authentication-request': {\n            return authenticationRequest(state, source as LocalAddress, request as AuthenticationContinue);\n        }\n        case 'create-context': {\n            return forwardCreate(state, source, request as CreateContext, options);\n        }\n        case 'update-context': {\n            return forwardUpdate(state, source, request as UpdateContext);\n        }\n        case 'subscribe-context': {\n            return forwardSubscribe(state, source, request as SubscribeContext);\n        }\n        case 'unsubscribe-context': {\n            return forwardUnsubscribe(state, source, request as UnsubscribeContext);\n        }\n        case 'destroy-context': {\n            return forwardDestroy(state, source, request as DestroyContext);\n        }\n        case 'ping': {\n            return [state, []];\n        }\n        case 'commands/source-removed': {\n            return sourceRemoved(state, source, request as IOGateway.Message<'commands/source-removed'>);\n        }\n        case 'create-token': {\n            const {request_id, peer_id} = (request as CreateToken);\n            const peer = byIdThrows(state, peer_id);\n            if (peer.identity.user) {\n                // todo ttl\n                return [state, [token(globalDomainUri, source, request_id, peer_id, forAuthentication(state, {user: peer.identity.user}))]];\n            }\n            throw exceptionInfo('Cannot create token for peer without user', {});\n        }\n        default: {\n            const message = `Unhandled message ${JSON.stringify(request)}`;\n            log.error(message);\n            return [state, [error(globalDomainUri, source, request['request_id'] ?? -1, request['peer_id'], reason(globalUnhandledMessage, message))]]\n        }\n    }\n}\n\ntype GlobalMessageType = GlobalRequestType | InternalType | CommandType | DomainType;\n\nfunction handleMessage(state: State,\n                       msg: NodeMessage<GlobalMessageType>,\n                       authenticators: Authenticators,\n                       options: GlobalDomainOptions): HandleReturnType {\n    const {source, body} = msg;\n\n    try {\n        return handleRequest(state, source, body, authenticators, options);\n    } catch (e) {\n        return [state, [error(globalDomainUri, source, body['request_id'] ?? -1, body['peer_id'], exceptionToReason(e, failure))]];\n    }\n}\n\nclass GlobalDomain implements Domain<GlobalRequestType> {\n    constructor(private readonly authenticators: Authenticators,\n                private readonly options: GlobalDomainOptions) {\n    }\n\n    info() {\n        return {\n            uri: globalDomainUri,\n            description: '',\n            version: 2\n        }\n    }\n\n    init(state: State) {\n        return state;\n    }\n\n    destroy(state: State) {\n        return state;\n    }\n\n    handleMessage(state: State, request: NodeMessage<GlobalRequestType | InternalType | CommandType | DomainType>): HandleReturnType {\n\n        return handleMessage(state, request, this.authenticators, this.options);\n    }\n\n    stateToMessages(state: State): StateToMessagesReturnType {\n        return [];\n    }\n}\n\nexport type GlobalDomainOptions = {\n    welcomeInfo?: Record<string, unknown>,\n    contextCompatibility?: boolean\n} & ContextOverrides\n\nexport function globalDomain(authenticators: Authenticators, options?: GlobalDomainOptions): GlobalDomain {\n\n    return new GlobalDomain(authenticators, options ?? {contextCompatibility: true});\n}\n", "import {SendMessageAction} from '../../node.js';\nimport {outgoing} from '../../common/messages.js';\nimport {globalDomainUri} from './constants.js';\nimport {DomainInfo, DomainUri} from '../../state/types/domain-registry.js';\nimport {RemoteJoin, Welcome, WelcomeOptions} from './types/messages.js';\nimport {Identity, LocalAddress, Restrictions, Source} from '../../state/types/common.js';\nimport {Options} from '../../state/types/state.js';\n\nexport function welcome(recipient: LocalAddress,\n                        requestId: string,\n                        peerId: string,\n                        availableDomains: Array<DomainInfo>,\n                        resolvedIdentity: Record<string, unknown>,\n                        options?: WelcomeOptions): SendMessageAction<'welcome'> {\n    const message: Welcome = {\n        domain: globalDomainUri,\n        type: 'welcome',\n        request_id: requestId,\n        peer_id: peerId,\n        available_domains: availableDomains,\n        resolved_identity: resolvedIdentity\n    };\n    if (options) {\n        message.options = options;\n    }\n    return outgoing(recipient, message);\n}\n\nexport function authenticationRequest(domainUri: DomainUri, recipient: LocalAddress, requestId: string, peerId: string | undefined, details: unknown): SendMessageAction<'authentication-request'> {\n    const message: {domain, type, request_id, authentication, peer_id?} =\n        {domain: domainUri, type: 'authentication-request', request_id: requestId, authentication: details};\n    if (peerId) {\n        message.peer_id = peerId;\n    }\n    return outgoing(recipient, message);\n}\n\n\nexport function join(requestId: string| undefined,peerId: string, restrictions: Restrictions, domainUri: DomainUri, peerIdentity: Identity, options?: Options): RemoteJoin {\n    const message: RemoteJoin = {\n        domain: globalDomainUri,\n        type: 'join',\n        request_id: requestId as string,\n        peer_id: peerId,\n        destination: domainUri,\n        identity: peerIdentity\n    }\n    if (restrictions) {\n        message.restrictions = restrictions;\n    }\n    if (options) {\n        message.options = options;\n    }\n    return message;\n}\n\nexport function ping(recipient: Source): SendMessageAction<'ping'> {\n    return outgoing(recipient, {type: 'ping'})\n}\n", "import {ExceptionInfo} from './types.js';\nimport {Identity} from '../state/types/common.js';\n\nconst knownKeys: Record<string, {required: boolean}> = {\n    application: {required: true},\n    instance: {required: false},\n    region: {required: false},\n    environment: {required: false},\n    machine: {required: false},\n    user: {required: false}\n}\n\nfunction missingKey(identity: Identity): string | undefined {\n    return Object.keys(knownKeys).find((key: string) => {\n        return knownKeys[key] && knownKeys[key].required && identity[key] === undefined;\n    })\n}\n\nexport function checkIdentity(identity: Identity) {\n    const missing = missingKey(identity);\n    if (missing) {\n        throw new ExceptionInfo(`Identity ${JSON.stringify(identity)} is missing required key: ${missing}`, {});\n    }\n}\n\nexport function machine(endpoint?: string, ip?: string): string | undefined {\n    let host = endpoint;\n    if (host && host.indexOf(':') !== -1) {\n        host = host.substring(0, host.indexOf(':'));\n    }\n    if (host && host.indexOf('127.0.0.1') >= 0) {\n        return ip ?? host;\n    } else {\n        return host ?? ip;\n    }\n}\n", "import {KJUR} from 'jsrsasign';\n\nexport function sign(data: Record<string, unknown>, key: string): string {\n    const kjurToken = KJUR.jws.JWS.sign(null, {alg: 'HS256', typ: 'JWT'} as {alg: string}, data, key);\n    return kjurToken;\n\n}\n\nexport function unsign(message: string, key: string, opts?: { now?: number }): Record<string, unknown> {\n    let kjurResult;\n    if (KJUR.jws.JWS.verifyJWT(message, key, {alg: ['HS256'], verifyAt: opts?.now})) {\n        kjurResult = KJUR.jws.JWS.parse(message);\n    } else {\n        throw new Error('invalid jwt token');\n    }\n    return kjurResult.payloadObj;\n}\n", "import {sign, unsign} from './jwt.js';\nimport {State} from '../state/types/state.js';\nimport {GatewayRequest} from '../state/types/pending-requests.js';\n\nexport function forRequest(state: State, impersonateIdentity: unknown, gwRequest: GatewayRequest, expMs?: number): string {\n    const payload = {type: 'gw-request', 'impersonate-peer': impersonateIdentity, 'gw-request': gwRequest};\n    if (expMs) {\n        payload['exp'] = Math.floor(expMs / 1000);\n    }\n    return sign(payload, state.signatureKey);\n}\n\nexport function forAuthentication(state: State, impersonateIdentity: {user: string}, expMs?: number): string {\n    const payload = {type: 'authentication', user: impersonateIdentity.user}\n    if (expMs) {\n        payload['exp'] = Math.floor(expMs / 1000);\n    }\n    return sign(payload, state.signatureKey);\n}\n\nexport function convertToken(signatureKey: string, token: string, expMs?: number): Record<string, unknown> {\n    if (expMs === undefined) {\n        expMs = expMs ?? Date.now()\n    }\n    const opts: {now?: number} = {};\n    if (expMs) {\n        opts.now = Math.floor(expMs / 1000);\n    }\n    return unsign(token, signatureKey, opts);\n}\n", "import {Peer, State} from '../../state/types/state.js';\nimport {Context, ContextData, Lifetime, Version, ContextId} from '../../state/types/context.js';\nimport {PeerId, Restrictions} from '../../state/types/common.js';\nimport {castDraft, Draft, produce} from 'immer';\nimport {exceptionInfo} from '../types.js';\nimport {ContextDelta, ContextDeltaCommand} from './types/requests.js';\nimport {check} from '../../restrictions.js';\nimport {WithRequired} from '../utilities.js';\n\nexport function contexts(state: State): ReadonlyArray<Context> {\n    return Object.values(state.contexts || {});\n}\n\nexport function addContext(state: State, context: Context): State {\n    return produce(state, (draft: Draft<State>) => {\n        draft.contexts = draft.contexts || {};\n        draft.contexts[context.id] = castDraft(context);\n    });\n}\n\nexport function removeContext(state: State, contextId: string): State {\n    return produce(state, (draft: Draft<State>) => {\n        if (draft.contexts) {\n            delete draft.contexts[contextId];\n            if (Object.values(draft.contexts).length === 0) {\n                delete draft.contexts;\n            }\n        }\n    });\n}\n\n\n/**\n * Finds a context by name. Actually faster than filter/some\n */\nexport function contextByName(state: State, name: string | undefined, peer: Peer): Context {\n    const peerUser = peer.identity.user;\n    const isService = peer.options?.service;\n    const contexts: Context[] = Object.values(state.contexts || {});\n\n    let result;\n    // try to match against the same user\n    result = contexts.find((c) => {\n        return name === c.name && c.identity.user === peerUser\n    });\n    if (!result) {\n        // try to match against a context that was created by a service\n        result = contexts.find((c: Context) => {\n            return name === c.name && (isService || c.options?.service)\n        });\n    }\n    return result;\n}\n\nexport function contextById(state: State, contextId: string): Context | undefined {\n    if (contextId) {\n        return state.contexts?.[contextId];\n    }\n}\n\nexport function contextByIdThrows(state: State, contextId: string): Context {\n    const context = state.contexts?.[contextId];\n    if (context) {\n        return context;\n    }\n    throw exceptionInfo(`Unable to find context with id ${contextId}`, {});\n}\n\n/**\n * Adds a peer as a member to a context\n */\nexport function addContextMember(state: State, context: Context | undefined, peerId: PeerId): State {\n    if (context && peerId) {\n        const existingMembers = context.members;\n        if (existingMembers.has(peerId)) {\n            return state;\n        }\n        return produce(state, (s: Draft<State>) => {\n            s.contexts = s.contexts || {};\n            s.contexts[context.id] = castDraft(produce(context, (c: Draft<Context>) => {\n                c.members = c.members || new Set<PeerId>();\n                c.members.add(peerId);\n            }));\n        });\n    }\n    return state;\n}\n\n\n/**\n * Removes a peer from the context members\n */\nexport function removeContextMember(state: State, context: Context, peerId: PeerId): [State, Context] {\n    return produce([state, context], ([draftState, draftContext]: Draft<[State, Context]>) => {\n        draftContext.members.delete(peerId);\n        if (peerId === draftContext.owner) {\n            delete draftContext.owner;\n        }\n        draftState.contexts = draftState.contexts || {};\n        draftState.contexts[context.id] = draftContext;\n    });\n}\n\n\nfunction setIn(targetData: { [name: string]: unknown }, targetPath: string[] | undefined, value: unknown) {\n    if (!targetPath) {\n        return value;\n    }\n    if (targetPath.length === 1) {\n        targetData[targetPath[0]] = value;\n    } else {\n        let nextTargetData = targetData[targetPath[0]];\n        if (nextTargetData === undefined || Array.isArray(nextTargetData) || typeof nextTargetData === 'number' || typeof nextTargetData === 'boolean') {\n            nextTargetData = {};\n        }\n        targetData[targetPath[0]] = setIn(nextTargetData as { [name: string]: unknown }, targetPath.slice(1), value);\n    }\n    return targetData\n}\n\n\nfunction merge(a: object, b: object): object {\n    return {...a, ...b};\n}\n\nfunction applyDeltaCmd(data: Draft<ContextData | undefined>, cmd: [string, unknown]): Draft<ContextData | undefined> {\n    const [command, args] = cmd as ['removed' | 'added' | 'updated' | 'reset' | 'commands', unknown];\n    switch (command) {\n        case 'removed': {\n            (args as Array<string>).forEach((removed: string) => {\n                delete data?.[removed];\n            });\n            break;\n        }\n        case 'added': {\n            data = Object.entries((args as Record<string, unknown>)).reduce((d, [k, v]) => {\n                d[k] = v;\n                return d;\n            }, data ?? {});\n            break;\n        }\n        case 'updated': {\n            data = Object.entries((args as Record<string, unknown>)).reduce((cd, [k, v]) => {\n                if (Array.isArray(v) && Array.isArray(cd[k])) {\n                    cd[k] = v;\n                } else if (v instanceof Object && cd[k] instanceof Object) {\n                    cd[k] = merge(cd[k] as object, v);\n                } else {\n                    cd[k] = v;\n                }\n                return cd;\n            }, data ?? {});\n            break;\n        }\n        case 'reset': {\n            if (args) {\n                data = args as ContextData;\n            }\n            break;\n        }\n        case 'commands': {\n            data = (args as Array<ContextDeltaCommand>).reduce((cd: { [name: string]: unknown } | undefined, cmd: ContextDeltaCommand) => {\n                switch (cmd.type) {\n                    case 'set': {\n                        return setIn(cd ?? {}, stringToPath(cmd.path), cmd.value) as ContextData;\n                    }\n                    case 'remove': {\n                        const p = stringToPath(cmd.path);\n                        if (!p) {\n                            return {};\n                        } else {\n                            let currentElement = cd;\n                            for (let i = 0; i < p.length - 1; i++) {\n                                let next;\n                                if (typeof currentElement !== 'object') {\n                                    return cd;\n                                } else {\n                                    next = currentElement?.[p[i]];\n                                }\n                                currentElement = next;\n                            }\n                            if (currentElement) {\n                                delete currentElement[p[p.length - 1]];\n                            }\n\n                        }\n                        return cd;\n                    }\n                }\n            }, data);\n            break;\n        }\n    }\n    return data;\n}\n\n\nexport function applyDelta(state: State, contextId: string, delta: ContextDelta, version: Version): State {\n\n    return produce(state, (draft: Draft<Required<Pick<State, 'contexts'>>>) => {\n        draft.contexts[contextId].data = Object.entries<unknown>(delta).reduce((data: Draft<ContextData | undefined>, [command, args]: [string, unknown]) => {\n            return applyDeltaCmd(data, [command, args]);\n        }, draft.contexts[contextId].data);\n        draft.contexts[contextId].version = version;\n    });\n}\n\nfunction stringToPath(s: string): string[] | undefined {\n    if (s) {\n        return s.split('.');\n    }\n}\n\nexport function toCtx(creator: Peer, name: string, data, lifetime: Lifetime, readPermissions: Restrictions, writePermissions: Restrictions, ctxId: ContextId, version: Version): WithRequired<Context, 'version'> {\n    const identity = creator.identity;\n    const options = creator.options;\n    const ctx: WithRequired<Context, 'version'> = {\n        id: ctxId,\n        data: data ?? {},\n        identity: identity,\n        lifetime: lifetime,\n        read_permissions: readPermissions,\n        write_permissions: writePermissions,\n        members: new Set<PeerId>(),\n        version: version,\n        name: name,\n        creator: creator.id\n    };\n    if (options) {\n        castDraft(ctx).options = options;\n    }\n    return ctx;\n}\n\nexport function nextVersion(context: Context): Version {\n    let updates = context.version?.updates || 0;\n    updates++;\n    const timestamp = Date.now();\n    return {updates, timestamp};\n}\n\nexport function newVersion(): Version {\n    return {updates: 0, timestamp: Date.now()};\n}\n\nexport function isClusterContext(ctx: Context): boolean {\n    return check(ctx.read_permissions, [{type: ctx.local ? 'local' : 'cluster'}, ctx.identity], [{type: 'cluster'}, undefined]);\n}\n", "import {PeerId, Source} from '../../state/types/common.js';\nimport {DomainUri} from '../../state/types/domain-registry.js';\nimport {outgoing} from '../messages.js';\nimport {Reason} from '../../reason.js';\nimport {SendMessageAction} from '../../node.js';\nimport {ContextAdded, ContextCreated, ContextDestroyed, ContextUpdated, SubscribedContext} from './types/messages.js';\nimport {ContextData, ContextId} from '../../state/types/context.js';\nimport {ContextDelta} from './types/requests.js';\n\nexport function subscribedContext(domainUri: DomainUri, recipient: Source, requestId: string, peerId: PeerId, contextId: ContextId, data?: ContextData): SendMessageAction<'subscribed-context'> {\n    const message: SubscribedContext = {\n        domain: domainUri,\n        type: 'subscribed-context',\n        request_id: requestId,\n        peer_id: peerId,\n        context_id: contextId,\n        data\n    };\n    return outgoing(recipient, message);\n}\n\nexport function contextAdded(domainUri: DomainUri, recipient: Source, peerId: PeerId, creatorId: PeerId, ctxId, ctxName): SendMessageAction<'context-added'> {\n    const message: ContextAdded = {\n        domain: domainUri,\n        type: 'context-added',\n        peer_id: peerId,\n        creator_id: creatorId,\n        context_id: ctxId,\n        name: ctxName\n    };\n    return outgoing(recipient, message);\n}\n\nexport function contextDestroyed(domainUri: DomainUri, recipient, peerId: PeerId, ctxId, reason: Reason): SendMessageAction<'context-destroyed'> {\n    const message: ContextDestroyed = {\n        domain: domainUri,\n        type: 'context-destroyed',\n        peer_id: peerId,\n        context_id: ctxId,\n        reason_uri: reason.uri,\n        reason: reason.message\n    };\n    return outgoing(recipient, message);\n}\n\nexport function contextCreated(domainUri: DomainUri, recipient: Source, requestId: string, peerId: PeerId, contextId: ContextId): SendMessageAction<'context-created'> {\n    const message: ContextCreated = {\n        domain: domainUri,\n        type: 'context-created',\n        request_id: requestId,\n        peer_id: peerId,\n        context_id: contextId\n    };\n    return outgoing(recipient, message);\n}\n\nexport function contextUpdated(domainUri: DomainUri, recipient: Source, peerId: PeerId, updaterId: PeerId, contextId: ContextId, delta: ContextDelta): SendMessageAction<'context-updated'> {\n    const message: ContextUpdated = {\n        domain: domainUri,\n        type: 'context-updated',\n        peer_id: peerId,\n        updater_id: updaterId,\n        context_id: contextId,\n        delta: delta\n    };\n    return outgoing(recipient, message);\n}\n", "import {DomainUri} from '../../state/types/domain-registry.js';\nimport {Reason, reason} from '../../reason.js';\n\nexport function contextNotAuthorized(domainUri: DomainUri) {\n    return `${domainUri}.errors.not_authorized`;\n}\nexport function contextBadLifetime(domainUri: DomainUri) {\n    return `${domainUri}.errors.bad_lifetime`;\n}\n\nexport function contextDestroyedExplicitly(domainUri: DomainUri): Reason {\n    return reason(`${domainUri}.destroyed`, 'Context destroyed explicitly');\n}\n\n\nexport function contextDestroyedPeerLeft(domainUri: DomainUri): Reason {\n    return reason(`${domainUri}.peer-left`, 'Context destroyed because its owner/last peer left');\n}\n\nexport function failure(domainUri: DomainUri) {\n    return `${domainUri}.errors.failure`;\n}\n", "import {Context, Lifetime, Version} from '../../state/types/context.js';\r\nimport {DomainKeys, Peer, State} from '../../state/types/state.js';\r\nimport {check, parse} from '../../restrictions.js';\r\nimport {DomainUri} from '../../state/types/domain-registry.js';\r\nimport {HandleReturnType} from '../../domain.js';\r\nimport {ContextCreateRequest, ContextDelta, ParsedCreateRequest, RemoteContextCreateRequest} from './types/requests.js';\r\nimport {broadcast, error, isRemoteSource, success} from '../messages.js';\r\nimport {\r\n    byId,\r\n    byIdInDomainThrows,\r\n    byIdThrows,\r\n    isLocalPeer,\r\n    JoinedPeer,\r\n    leaveDomain,\r\n    peersInDomain,\r\n    visiblePeers\r\n} from '../../state/peers.js';\r\nimport {\r\n    addContext,\r\n    addContextMember,\r\n    applyDelta,\r\n    contextByIdThrows,\r\n    contextByName,\r\n    isClusterContext,\r\n    newVersion,\r\n    nextVersion,\r\n    removeContext,\r\n    removeContextMember,\r\n    toCtx\r\n} from './state.js';\r\nimport {Identity, PeerId, Restrictions, Source} from '../../state/types/common.js';\r\nimport {contextAdded, contextCreated, contextDestroyed, contextUpdated, subscribedContext} from './messages.js';\r\nimport {exceptionToReason, Reason, throwReason} from '../../reason.js';\r\nimport {\r\n    contextBadLifetime,\r\n    contextDestroyedExplicitly,\r\n    contextDestroyedPeerLeft,\r\n    contextNotAuthorized,\r\n    failure\r\n} from './constants.js';\r\nimport {contextDomainUri, globalDomainUri} from '../../constants.js';\r\nimport {contextId, nodeId} from '../ids.js';\r\nimport {Draft, produce} from 'immer';\r\nimport {DomainMessage, MessageType, SendMessageAction} from '../../node.js';\r\nimport {peerToAddress} from '../../address.js';\r\nimport {getLogger} from '../../logger.js';\r\nimport {contexts} from '../../domains/global/state.js';\r\nimport {threadStateAndActions} from '../../state/core.js';\r\nimport {CreateContext, DestroyContext, SubscribeContext, UnsubscribeContext, UpdateContext} from './types/messages.js';\r\nimport {PartialBy, some, WithRequired} from '../utilities.js'\r\n\r\n/**\r\n * Checks if the request should be applied on an existing context\r\n */\r\nfunction shouldUpdate(request: RemoteCreateContext | BroadcastUpdate, context: Context): boolean {\r\n    const requestVersion = request.version;\r\n    const contextVersion = context.version!;\r\n    return (requestVersion.updates > contextVersion.updates)\r\n        || ((requestVersion.updates === contextVersion.updates) && (requestVersion.timestamp >= contextVersion.timestamp));\r\n}\r\n\r\n// context permission\r\nfunction canWrite(context: Context, peer: Peer, isExplicit = false): boolean {\r\n    const lifetime = context.lifetime;\r\n\r\n    if (peer.id === context.creator) return true;\r\n\r\n    if (lifetime === 'activity') {\r\n        //only members can write to an activity\r\n        return context.members.has(peer.id);\r\n    }\r\n    // normal context - permissions apply\r\n    if (peer.id === context.creator || peer.id === context.owner) {\r\n        return true;\r\n    }\r\n    if (!isExplicit) {\r\n        return check(context.write_permissions, [undefined, context.identity], [peer.source, peer.identity]);\r\n    } else {\r\n        if (context.write_permissions) {\r\n            return check(context.write_permissions, [undefined, context.identity], [peer.source, peer.identity]);\r\n        }\r\n        return false;\r\n    }\r\n}\r\n\r\n/**\r\n * Checks whether a not a given peer can destroy a context\r\n */\r\nfunction checkCanDestroy(domainUri: DomainUri, context: Context, peer: Peer) {\r\n    if (context.lifetime === 'activity') {\r\n        throwReason(contextNotAuthorized(domainUri), 'Activity contexts cannot be explicitly destroyed');\r\n    }\r\n    const owned = context.lifetime === 'ownership';\r\n    if (!((owned && context.owner === peer.id) || (!owned && canWrite(context, peer)))) {\r\n        throwReason(contextNotAuthorized(domainUri), 'Not authorized to destroy context');\r\n    }\r\n}\r\n\r\n/**\r\n * Checks if a peer matches the restrictions of a context.\r\n */\r\nfunction canRead(context: Context, peer: Peer): boolean {\r\n    return peer.id === context.creator\r\n        || peer.id === context.owner\r\n        || check(context.read_permissions, [undefined, context.identity], [peer.source, peer.identity])\r\n        || canWrite(context, peer, true);\r\n}\r\n\r\n/**\r\n * Check if a context can be announced to a peer\r\n */\r\nfunction canAnnounce(peer: Peer, context: Context): boolean {\r\n    return isLocalPeer(peer) && context.lifetime !== 'activity' && canRead(context, peer);\r\n}\r\n\r\n/**\r\n * Checks if a peer matches the restrictions of a context.\r\n */\r\nfunction checkCanRead(domainUri: DomainUri, context: Context, peer: Peer) {\r\n    if (!canRead(context, peer)) {\r\n        throwReason(contextNotAuthorized(domainUri), 'Not authorized to read context');\r\n    }\r\n}\r\n\r\nfunction checkCanCreate(isLocal: boolean, context: Context) {\r\n    if (!isLocal && !isClusterContext(context)) {\r\n        throw new Error(`cannot create remote context '${context.name}' locally`);\r\n    }\r\n}\r\n\r\nfunction remoteUnsubscribe(domainUri: DomainUri, state: State, source: Source, request: BroadcastUnsubscribe): HandleReturnType {\r\n    const {peer_id: peerId, name} = request;\r\n    try {\r\n        const peer = byIdThrows(state, peerId);\r\n        const context = contextByName(state, name, peer);\r\n        if (context) {\r\n            return removePeerFromContext(domainUri, state, peerId, context);\r\n        } else {\r\n            logger.warn(`unable to find remote context ${name}`);\r\n            return [state, []];\r\n        }\r\n\r\n    } catch (e) {\r\n        logger.warn(`unable to process remote unsubscribe ${request}`, e);\r\n        return [state, []];\r\n    }\r\n\r\n}\r\n\r\nfunction localUnsubscribe(domainUri: DomainUri, state: State, source: Source, request: UnsubscribeContext): HandleReturnType {\r\n    const {request_id: requestId, peer_id: peerId, context_id: contextId} = request;\r\n    try {\r\n        byIdThrows(state, peerId);\r\n        const context = contextByIdThrows(state, contextId);\r\n        let [ns, ms] = removePeerFromContext(domainUri, state, peerId, context);\r\n        ms = ms.concat([\r\n            success(domainUri, source, requestId, peerId)\r\n        ]);\r\n        if (isClusterContext(context)) {\r\n            const message: BroadcastUnsubscribe = {\r\n                ...request,\r\n                type: 'unsubscribe-context',\r\n                name: context.name\r\n            };\r\n            ms = ms.concat([broadcast(peerToAddress(nodeId(ns.ids), peerId), message)]);\r\n        }\r\n        return [ns, ms];\r\n    } catch (e) {\r\n        return [state, [error(domainUri, source, requestId, peerId, exceptionToReason(e, failure(domainUri)))]];\r\n    }\r\n\r\n\r\n}\r\n\r\n/**\r\n * Unsubscribes a peer from context data change notifications\r\n */\r\nexport function forwardUnsubscribe(domainUri: DomainUri, state: State, source: Source, request: UnsubscribeContext) {\r\n    return isRemoteSource(source) ? remoteUnsubscribe(domainUri, state, source, request as BroadcastUnsubscribe) : localUnsubscribe(domainUri, state, source, request);\r\n}\r\n\r\n/**\r\n * Checks which contexts the peer can see and sends announcements message correspondingly\r\n */\r\nexport function announceContexts(domainUri: DomainUri, state: State, peer: Peer): SendMessageAction<'context-added'>[] {\r\n    const {source, id: peerId} = peer;\r\n    return contexts(state)\r\n        .filter(ctx => canAnnounce(peer, ctx))\r\n        .map((ctx) => {\r\n            const {creator: creatorId, id: ctxId, name: ctxName} = ctx;\r\n            return contextAdded(domainUri, source, peerId, creatorId, ctxId, ctxName);\r\n        });\r\n}\r\n\r\nexport function peerToDomainUri(peer: Peer): DomainUri {\r\n    if (peer.options?.[\"context-compatibility-mode?\"]) {\r\n        return globalDomainUri;\r\n    } else {\r\n        return contextDomainUri;\r\n    }\r\n}\r\n\r\n// operations\r\n\r\n\r\n/**\r\n * Updates a context. Returns a new state and announcement messages\r\n */\r\nfunction update(state: State, context: Context, updaterId: PeerId, delta: ContextDelta, version: Version, requestId): HandleReturnType {\r\n    const contextId = context.id;\r\n    const updatedState = applyDelta(state, context.id, delta, version);\r\n    // todo log action\r\n\r\n    return [updatedState,\r\n        Array.from(context.members)\r\n            .filter((member) => {\r\n                return member !== updaterId\r\n            })\r\n            .map((peerId) => {\r\n                return byId(updatedState, peerId);\r\n            })\r\n            .filter(some<Peer>)\r\n            .filter((peer) => {\r\n                return isLocalPeer(peer)\r\n            })\r\n            .map((peer) => {\r\n                return contextUpdated(peerToDomainUri(peer), peer.source, peer.id, updaterId, contextId, delta)\r\n            })];\r\n}\r\n\r\n/**\r\n * Processes a context creation request coming from a remote node\r\n */\r\nfunction remoteUpdate(domainUri: DomainUri, state: State, request: BroadcastUpdate): HandleReturnType {\r\n    const {request_id: requestId, peer_id: peerId, name, delta, version} = request;\r\n    try {\r\n        const peer = byIdThrows(state, peerId);\r\n        const context = contextByName(state, name, peer);\r\n        if (context) {\r\n            if (canWrite(context, peer) && shouldUpdate(request, context)) {\r\n                return update(state, context, peerId, delta, version, requestId);\r\n            } else {\r\n                return [state, []];\r\n            }\r\n        } else {\r\n            logger.warn(`unable to find remote context ${name}`);\r\n            return [state, []];\r\n        }\r\n    } catch (e) {\r\n        logger.error(`error performing remote context update ${name}`);\r\n        return [state, []];\r\n    }\r\n}\r\n\r\nfunction localUpdate(domainUri: DomainUri, state: State, source: Source, request: UpdateContext): HandleReturnType {\r\n    const {request_id:  requestId, peer_id: peerId, context_id: contextId, delta} = request;\r\n\r\n    try {\r\n        const peer = byIdThrows(state, peerId);\r\n        const context = contextByIdThrows(state, contextId);\r\n        const version: Version = nextVersion(context);\r\n        if (!canWrite(context, peer)) {\r\n            throwReason(contextNotAuthorized(domainUri), `Not authorized to update context`);\r\n        }\r\n        const message: BroadcastUpdate = {...request, type: 'update-context', version: version, name: context.name, delta};\r\n        return threadStateAndActions(state,\r\n            s => update(s, context, peerId, delta, version, requestId),\r\n            s => [s, [success(domainUri, source, requestId, peerId)]],\r\n            s => [s, isClusterContext(context) ? [broadcast(peerToAddress(nodeId(s.ids), peerId), message)] : []]);\r\n    } catch (e) {\r\n        return [state, [error(domainUri, source, requestId, peerId, exceptionToReason(e, failure(domainUri)))]];\r\n    }\r\n\r\n}\r\n\r\nexport function forwardUpdate(domainUri: DomainUri, state: State, source: Source, request: UpdateContext): HandleReturnType {\r\n    return isRemoteSource(source) ? remoteUpdate(domainUri, state, request as BroadcastUpdate) : localUpdate(domainUri, state, source, request);\r\n}\r\n\r\n\r\ntype RequestToContextOptions = {\r\n    isLocal: boolean,\r\n    defaultLifetime?: 'ref-counted' | 'ownership',\r\n    defaultPermissions?: (type: 'read'|'write', name: string, creator: Identity) => Restrictions\r\n};\r\n\r\ntype VersionedContext = WithRequired<Context, 'version'>;\r\n/**\r\n * Builds the context state map\r\n */\r\nfunction requestToContext(state: State, creator: Peer, request: ParsedCreateRequest, options: RequestToContextOptions): [State, VersionedContext] {\r\n    const {name, data, peer_id: peerId} = request;\r\n\r\n    // when not local always respect request lifetime, otherwise use override if not present or (retained and respect is not set)\r\n    const requestedLifetime = request.lifetime ?? options.defaultLifetime;\r\n    const overwriteRetained = options.isLocal && !(creator.options?.respect_context_lifetime ?? false);\r\n    const lifetime: Lifetime = overwriteRetained && (requestedLifetime === 'retained' || requestedLifetime === undefined) ? options.defaultLifetime ?? 'retained' : requestedLifetime!;\r\n\r\n    // set default read permissions\r\n    const rp = request.read_permissions ?? options?.defaultPermissions?.('read', name, creator.identity);\r\n    const wp = request.write_permissions ?? options?.defaultPermissions?.('write', name, creator.identity);\r\n\r\n    const [newIds, ctxId] = contextId(state.ids);\r\n    const version = request.version ?? newVersion();\r\n    const ctx = produce(toCtx(creator, name, data, lifetime, rp, wp, ctxId, version), (draft: Draft<Context>) => {\r\n        draft.members = new Set<PeerId>([peerId]);\r\n        draft.local = options.isLocal;\r\n        draft.lifetime =  lifetime;\r\n        if (lifetime === 'ownership') {\r\n            draft.owner = peerId;\r\n        }\r\n    });\r\n    checkCanCreate(options.isLocal, ctx);\r\n\r\n    return [addContext({...state, ids: newIds}, ctx), ctx]\r\n}\r\n\r\n/**\r\n * Adds peer as a member of a context. Updates the state and generates messages.\r\n */\r\nfunction subscribe(domainUri: DomainUri, state: State, sender: Source, requestId, context: Context, peerId: PeerId): HandleReturnType {\r\n    // todo log action\r\n    const updatedState = addContextMember(state, context, peerId);\r\n    return [updatedState, [subscribedContext(domainUri, sender, requestId, peerId, context.id, context.data)]];\r\n}\r\n\r\n/**\r\n * Add the peer to the context members for the purpose of ref-counted context destruction\r\n */\r\nfunction remoteSubscribe(domainUri: DomainUri, state: State, source: Source, request: RemoteSubscribeContext): HandleReturnType {\r\n    const {peer_id: peerId, name} = request;\r\n    try {\r\n        const peer = byIdThrows(state, peerId);\r\n        const context = contextByName(state, name, peer);\r\n        if (context) {\r\n            checkCanRead(domainUri, context, peer);\r\n            return [addContextMember(state, context, peerId), []];\r\n        } else {\r\n            logger.warn(`unable to find remote context ${name}`);\r\n            return [state, []];\r\n        }\r\n\r\n    } catch (e) {\r\n        if (logger.enabledFor('debug')) {\r\n            logger.debug(`error handling remote subscribe`, e);\r\n        }\r\n        return [state, []];\r\n    }\r\n}\r\n\r\n/**\r\n * Processes a subscription request\r\n */\r\nfunction localSubscribe(domainUri: DomainUri, state: State, source: Source, request: SubscribeContext): HandleReturnType {\r\n    const {request_id: requestId, peer_id: peerId, context_id: contextId} = request;\r\n    try {\r\n        const peer = byIdThrows(state, peerId);\r\n        const context = contextByIdThrows(state, contextId);\r\n        checkCanRead(domainUri, context, peer);\r\n        const [ns, ms] = subscribe(domainUri, state, source, requestId, context, peerId);\r\n        if (isClusterContext(context)) {\r\n            const message: RemoteSubscribeContext = {\r\n                ...request,\r\n                type: 'subscribe-context',\r\n                name: context.name\r\n            };\r\n            return [ns, ms.concat([broadcast(peerToAddress(nodeId(ns.ids), peerId), message)])];\r\n        }\r\n        return [ns, ms];\r\n    } catch (e) {\r\n        return [state, [error(domainUri, source, requestId, peerId, exceptionToReason(e, failure(domainUri)))]];\r\n    }\r\n}\r\n\r\n/**\r\n * Subscribes a peer to context data changes\r\n */\r\nexport function forwardSubscribe(domainUri: DomainUri, state: State, source: Source, request): HandleReturnType {\r\n    return isRemoteSource(source) ? remoteSubscribe(domainUri, state, source, request) : localSubscribe(domainUri, state, source, request);\r\n}\r\n\r\n//Broadcasts that the context is added to the local peers. The remote peers will be told so by their own node\r\nfunction broadcastAdded(state: State, context: Context, creator: JoinedPeer<DomainKeys.Context>): SendMessageAction<'context-added'>[] {\r\n    const ctxName = context.name;\r\n    const ctxId = context.id;\r\n    const creatorId = creator.id;\r\n    return visiblePeers(state, DomainKeys.Context, creator, true)\r\n        .filter((peer) => {\r\n            return isLocalPeer(peer);\r\n        })\r\n        .filter((peer) => {\r\n            return canRead(context, peer)\r\n        })\r\n        .map((peer) => {\r\n            return contextAdded(peerToDomainUri(peer), peer.source, peer.id, creatorId, ctxId, ctxName)\r\n        });\r\n}\r\n\r\n/**\r\n * Broadcasts that the context has been destroyed to the local peers. The remote peers will be told so by their own node\r\n */\r\nfunction broadcastDestroyed(context: Context, peers: Peer[], reason: Reason): SendMessageAction<'context-destroyed'>[] {\r\n    const ctxId = context.id;\r\n    return peers\r\n        .filter((peer) => isLocalPeer(peer))\r\n        .filter((peer) => canRead(context, peer))\r\n        .map((peer) => contextDestroyed(peerToDomainUri(peer), peer.source, peer.id, ctxId, reason));\r\n}\r\n\r\nfunction preprocess(domainUri: DomainUri, request: ContextCreateRequest): ParsedCreateRequest {\r\n    const rp = parse(request.read_permissions);\r\n    const wp = parse(request.write_permissions);\r\n    const lifetime = request.lifetime; // todo no activity?\r\n    if (!lifetime) {\r\n        throwReason(contextBadLifetime(domainUri), `Bad lifetime value ${lifetime}`);\r\n    }\r\n    const result: ParsedCreateRequest = {...(request as Omit<ContextCreateRequest, 'read_permissions' | 'write_permissions'>), domain: domainUri, lifetime: lifetime};\r\n    if (rp) {\r\n        result.read_permissions = rp;\r\n    }\r\n    if (wp) {\r\n        result.write_permissions = rp;\r\n    }\r\n    return result;\r\n}\r\n\r\n/**\r\n * Processes a context creation request coming from a remote node\r\n */\r\nfunction remoteCreate(domainUri: DomainUri, state: State, request: RemoteCreateContext): HandleReturnType {\r\n    const {request_id: requestId, peer_id: peerId, name} = request;\r\n    try {\r\n        const peer = byIdInDomainThrows(state, peerId, DomainKeys.Context);\r\n\r\n        const existingContext = contextByName(state, name, peer);\r\n        if (existingContext) {\r\n            // the context already exists, we should either reset its image or ignore the request\r\n            checkCanRead(domainUri, existingContext, peer)\r\n            if (shouldUpdate(request, existingContext)) {\r\n                return update(state, existingContext, peerId, {reset: request.data}, request.version, requestId);\r\n            } else {\r\n                return [state, []];\r\n            }\r\n        } else {\r\n            // new context\r\n            const processed = preprocess(domainUri, request);\r\n            const [newState, ctx] = requestToContext(state, peer, processed, {isLocal:false});\r\n            return [newState, broadcastAdded(newState, ctx, peer)];\r\n        }\r\n    } catch (ex) {\r\n        logger.warn(`error processing remote create ${JSON.stringify(request)}`);\r\n        // swallow the exception since we cant send it back to the remote peer\r\n        return [state, []];\r\n    }\r\n}\r\n\r\nconst logger = getLogger('gateway.contexts');\r\n\r\n/**\r\n * Creates a context or subscribes for an already existing one\r\n */\r\nfunction localCreate(domainUri: DomainUri, state: State, source: Source, request: ContextCreateRequest & Omit<DomainMessage, 'type'>, options?: ContextOverrides): HandleReturnType {\r\n    const {request_id: requestId, peer_id: peerId, name} = request;\r\n    try {\r\n        const peer = byIdInDomainThrows(state, peerId, DomainKeys.Context);\r\n        const existingContext = contextByName(state, name, peer);\r\n        if (existingContext) {\r\n            // the context already exists\r\n\r\n            checkCanRead(domainUri, existingContext, peer);\r\n            return subscribe(domainUri, state, source, requestId, existingContext, peerId);\r\n        } else {\r\n            // new context\r\n\r\n            const processed = preprocess(domainUri, request);\r\n            const [newState, ctx] = requestToContext(\r\n                state,\r\n                peer,\r\n                processed,\r\n                {isLocal: true, defaultLifetime: options?.retainedOverride, defaultPermissions: (_type, name, creator) => options?.defaultContextRestrictions?.apply(creator, [name])}\r\n            );\r\n            // todo log action\r\n            const messages: SendMessageAction<MessageType>[] = broadcastAdded(newState, ctx, peer);\r\n            messages.push(contextCreated(domainUri, source, requestId, peerId, ctx.id));\r\n            if (isClusterContext(ctx)) {\r\n                const message: RemoteCreateContext = {\r\n                    ...request,\r\n                    type: 'create-context',\r\n                    version: ctx.version,\r\n                    lifetime: ctx.lifetime as 'ref-counted' | 'ownership' | 'retained'\r\n                };\r\n                messages.push(broadcast<'create-context'>(peerToAddress(nodeId(state.ids), peerId), message))\r\n            }\r\n            return [newState, messages];\r\n        }\r\n    } catch (e) {\r\n        logger.error(`error creating context from request ${JSON.stringify(request)}`, e);\r\n        return [state, [error(domainUri, source, requestId, peerId, exceptionToReason(e, failure(domainUri)))]];\r\n    }\r\n}\r\n\r\nexport type ContextOverrides = {\r\n    retainedOverride?: 'ref-counted' | 'ownership'\r\n    defaultContextRestrictions?: (this: Identity, name?: string) => Restrictions\r\n}\r\n\r\nexport function forwardCreate(domainUri: DomainUri, state: State, source: Source, request: PartialBy<CreateContext | RemoteCreateContext, 'type' >, options?: ContextOverrides): HandleReturnType {\r\n    return isRemoteSource(source) ? remoteCreate(domainUri, state, request as RemoteCreateContext) : localCreate(domainUri, state, source, request as CreateContext, options);\r\n}\r\n\r\n/**\r\n * Checks if a context is orphaned and can be destroyed\r\n */\r\nfunction isOrphaned(context: Context): boolean {\r\n    switch (context.lifetime) {\r\n        case 'ownership': {\r\n            return !context.owner;\r\n        }\r\n        case 'ref-counted': {\r\n            return context.members.size === 0;\r\n        }\r\n        default: {\r\n            return false;\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * Destroys a context. Returns an updated state and vector of messages to send\r\n */\r\nfunction destroy(domainUri: DomainUri, state: State, context: Context, reason: Reason): HandleReturnType {\r\n    // todo log action\r\n    const ctxId = context.id;\r\n    const members = context.members;\r\n\r\n    return [\r\n        removeContext(state, ctxId),\r\n        broadcastDestroyed(\r\n            context,\r\n            peersInDomain(state, DomainKeys.Context).filter(p => !members.has(p.id)),\r\n            reason\r\n        ).reduce(\r\n            (a: SendMessageAction<MessageType>[], b: SendMessageAction<MessageType>) => {\r\n                return a.concat(b);\r\n            },\r\n            Array.from(members)\r\n                .map((peerId) => byId(state, peerId))\r\n                .filter(some<Peer>)\r\n                .filter(peer => isLocalPeer(peer))\r\n                .map(peer => contextDestroyed(domainUri, peer.source, peer.id, ctxId, reason)))];\r\n\r\n}\r\n\r\nfunction remoteDestroy(domainUri: DomainUri, state: State, source: Source, request: BroadcastDestroy): HandleReturnType {\r\n    const {peer_id: peerId, name} = request;\r\n    try {\r\n        const peer = byIdThrows(state, peerId);\r\n        const context = contextByName(state, name, peer);\r\n        if (context) {\r\n            checkCanDestroy(domainUri, context, peer);\r\n            // destroy the context and send success\r\n            return destroy(domainUri, state, context, contextDestroyedExplicitly(domainUri));\r\n        }\r\n        logger.warn(`unable to find remote context ${name}`);\r\n\r\n        return [state, []];\r\n\r\n    } catch (e) {\r\n        return [state, []];\r\n    }\r\n\r\n\r\n}\r\n\r\nfunction localDestroy(domainUri: DomainUri, state: State, source: Source, request: DestroyContext): HandleReturnType {\r\n    const {request_id: requestId, peer_id: peerId, context_id: contextId} = request;\r\n    try {\r\n        const peer = byIdThrows(state, peerId);\r\n        const context = contextByIdThrows(state, contextId);\r\n        checkCanDestroy(domainUri, context, peer);\r\n\r\n        // destroy the context and send success\r\n\r\n        const message: BroadcastDestroy = {\r\n            ...request,\r\n            type: 'destroy-context',\r\n            name: context.name\r\n        };\r\n        return threadStateAndActions(state,\r\n            s => destroy(domainUri, s, context, contextDestroyedExplicitly(domainUri)),\r\n            s => [s, [success(domainUri, source, requestId, peerId)]],\r\n            s => [s, isClusterContext(context) ? [broadcast(peerToAddress(nodeId(state.ids), peerId), message)] : []]);\r\n\r\n    } catch (e) {\r\n        return [state, [error(domainUri, source, requestId, peerId, exceptionToReason(e, failure(domainUri)))]];\r\n    }\r\n}\r\n\r\nexport type RemoteSubscribeContext = SubscribeContext & { name?: string };\r\nexport type RemoteCreateContext = CreateContext & RemoteContextCreateRequest;\r\nexport type BroadcastUnsubscribe = UnsubscribeContext & { name?: string };\r\nexport type BroadcastDestroy = DestroyContext & { name?: string };\r\nexport type BroadcastUpdate = UpdateContext & { name?: string, version: Version };\r\n\r\n/**\r\n * Destroys a context\r\n */\r\nexport function forwardDestroy(domainUri: DomainUri, state: State, source: Source, request: DestroyContext | BroadcastDestroy): HandleReturnType {\r\n    return isRemoteSource(source) ? remoteDestroy(domainUri, state, source, request as BroadcastDestroy) : localDestroy(domainUri, state, source, request);\r\n}\r\n\r\n/**\r\n * Handles an implicit context destruction caused by peer removal\r\n */\r\nfunction removePeerFromContexts(domainUri: DomainUri, state: State, peer: Peer): HandleReturnType {\r\n    const peerId = peer.id;\r\n    return contexts(state).reduce(([s, ms]: HandleReturnType, c: Context) => {\r\n        const [ns, nms] = removePeerFromContext(domainUri, s, peerId, c);\r\n        return [ns, ms.concat(nms)] as HandleReturnType;\r\n    }, [state, []] as HandleReturnType);\r\n}\r\n\r\nfunction removePeerFromContext(domainUri: DomainUri, state: State, peerId: PeerId, context: Context): HandleReturnType {\r\n    if (context.members.has(peerId)) {\r\n        const [newState, updatedCtx] = removeContextMember(state, context, peerId);\r\n        if (isOrphaned(updatedCtx)) {\r\n            return destroy(domainUri, newState, updatedCtx, contextDestroyedPeerLeft(domainUri));\r\n        }\r\n        return [newState, []];\r\n    } else {\r\n        return [state, []];\r\n    }\r\n}\r\n\r\n/**\r\n * Peer is leaving the domain.\r\n *\r\n *   Updates the state and generates messages for all other peers and eventual destruction of contexts\r\n */\r\nexport function removePeer(domainUri: DomainUri, state: State, leavingPeer: JoinedPeer<DomainKeys.Context>, reason: Reason, isSourceRemoved: boolean): HandleReturnType {\r\n    const [s, ms] = leaveDomain(domainUri, DomainKeys.Context, state, leavingPeer, reason, isSourceRemoved);\r\n\r\n    const [ns, nms] = removePeerFromContexts(domainUri, s, leavingPeer);\r\n\r\n    return [ns, nms.concat(ms.filter((m) => {\r\n        return compatibilityModeFilter(ns, m);\r\n    }))];\r\n}\r\n\r\nexport function compatibilityModeFilter(state: State, msg: SendMessageAction<unknown>): boolean {\r\n    const destinationPeer = byId(state, msg.body['peer_id']);\r\n    if (destinationPeer) {\r\n        return !destinationPeer.options?.[\"context-compatibility-mode?\"];\r\n    }\r\n    return false;\r\n}\r\n", "import {NodeAddress, PeerAddress, PeerId} from './state/types/common.js';\n\nexport function peerToAddress(nodeId: string, peerId: PeerId): PeerAddress {\n    return {type: 'peer', peer: peerId, node: nodeId};\n}\nexport function nodeToAddress(nodeId: string): NodeAddress {\n    return {type: 'node', node: nodeId};\n}\n", "import {State} from '../../state/types/state.js';\nimport {castDraft, Draft, produce} from 'immer';\nimport {Context} from '../../state/types/context.js';\n\nexport function contexts(state: State): Context[] {\n    return Object.values(state.contexts || {});\n}\n\nexport function addContext(state: State, context: Context) {\n    return produce(state, (s: Draft<State>) => {\n        s.contexts = s.contexts || {};\n        s.contexts[context.id] = castDraft(context);\n    });\n}\n\n", "import {getLogger} from '../logger.js';\nimport {Authenticator, gatewayToken, isGatewayClientAuthentication} from './core.js';\nimport {\n    AuthenticationRequest,\n    AuthenticationResponse\n} from './types.js';\nimport {convertToken} from '../common/tokens.js';\nimport AsyncSerializer from '../common/asyncSerializer.js';\nimport {GatewayRequest} from '../state/types/pending-requests.js';\nimport {sanitizerOf} from '../common/utilities.js';\n\nexport interface AuthImpl {\n    auth(authenticationRequest: AuthenticationRequest): Promise<AuthenticationResponse>\n}\n\nasync function handleGwTokenAuthentication(signatureKey: string, token: string): Promise<AuthenticationResponse> {\n    const gwToken = convertToken(signatureKey, token);\n    switch (gwToken.type) {\n        case 'gw-request': {\n            const gwRequest = gwToken['gw-request'] as GatewayRequest | undefined;\n            if (gwRequest) {\n                const impersonatePeer = gwToken['impersonate-peer'] as {user: string} | undefined;\n                return {type: 'success', gwRequest, impersonatePeer};\n            }\n            throw new Error('Token is missing the gateway request information');\n        }\n        case 'authentication': {\n            const user = gwToken['user'] as string | undefined;\n            if (user) {\n                return {type: 'success', user};\n            }\n            throw new Error('Token is missing the impersonation information');\n        }\n        default: {\n            throw new Error(`Invalid gateway token type: ${gwToken.type}`);\n        }\n    }\n}\n\nasync function handleGwClientAuthentication({clientAuth, authentication, remoteIdentity, requestId}: AuthenticationRequest): Promise<AuthenticationResponse> {\n    if (clientAuth === undefined) {\n        throw new Error(\"'gateway-client' authentication method requires a client authentication callback to be provided\");\n    }\n    return await clientAuth({requestId, authentication, remoteIdentity});\n}\n\nconst logger = getLogger(\"gateway.auth.impl\")\n\nclass DefaultAuthenticator implements Authenticator {\n    private readonly ch: AsyncSerializer;\n\n    constructor(private readonly timeout: number,\n                maxPendingRequests: number,\n                private readonly processor: (resolve: (response: PromiseLike<AuthenticationResponse> | AuthenticationResponse) => void, reject: (err?: unknown) => void, authenticationRequest: AuthenticationRequest) => void) {\n        this.ch = new AsyncSerializer(maxPendingRequests);\n\n    }\n\n    stop() {\n        this.ch.close();\n    }\n\n    async authenticate(authenticationRequest: AuthenticationRequest): Promise<AuthenticationResponse> {\n        const token = gatewayToken(authenticationRequest.authentication)\n        if (token) {\n            return await handleGwTokenAuthentication(authenticationRequest.signatureKey, token);\n        } else if (isGatewayClientAuthentication(authenticationRequest.authentication)) {\n            return await handleGwClientAuthentication(authenticationRequest);\n        } else {\n            let timeoutId: NodeJS.Timeout;\n            return await Promise.race<AuthenticationResponse>([\n                this.ch.put<AuthenticationResponse>(() => {\n                    return new Promise<AuthenticationResponse>((resolve, reject) => {\n                        const {authentication} = authenticationRequest;\n                        if (logger.enabledFor('debug')) {\n                            logger.debug(`processing authentication ${JSON.stringify(authentication, sanitizerOf('secret', 'token', 'providerContext'))}`)\n                        }\n                        this.processor(resolve, reject, authenticationRequest)\n                    })\n                }),\n                new Promise<AuthenticationResponse>((resolve, reject) => {\n                    timeoutId = setTimeout(() => {\n                        reject(new Error(\"timeout\"));\n                    }, this.timeout);\n                })\n            ]).finally(() => clearTimeout(timeoutId));\n        }\n    }\n}\n\nconst defaultConfig = {timeout: 5000, max_pending_requests: 20000}\n\nexport interface DefaultAuthenticatorConfig {\n    timeout?: number,\n    max_pending_requests?: number\n}\n\nexport function authenticator(config: DefaultAuthenticatorConfig, impl: AuthImpl): Authenticator {\n    return new DefaultAuthenticator(\n        config.timeout ?? defaultConfig.timeout,\n        config.max_pending_requests ?? defaultConfig.max_pending_requests,\n        (resolve, reject, authenticationRequest: AuthenticationRequest) => {\n            impl.auth(authenticationRequest)\n                .then((v) => resolve(v))\n                .catch((err) => reject(err));\n        });\n}\n", "import {Authentication, AuthenticationRequest, AuthenticationResponse} from './types.js';\nimport {exceptionInfo} from '../common/types.js';\n\nexport interface Authenticator {\n    // returns a promise that will either be resolved or rejected depending on the authentication result\n    authenticate(request: AuthenticationRequest): Promise<AuthenticationResponse>\n\n    stop(): void\n}\n\nexport function authenticateSecret(authentication: Authentication): Promise<AuthenticationResponse> {\n    const {login, secret} = authentication;\n    if (login && (secret || secret === '')) {\n        return Promise.resolve({type: 'success', user: login, login})\n    }\n    return Promise.reject(exceptionInfo(\"Missing login/secret\", {type: 'failure', message: 'Missing login/secret'}));\n}\n\nexport function gatewayToken(authentication?: Authentication): string | undefined {\n    if (isGatewayTokenAuthentication(authentication)) {\n        return authentication.token;\n    }\n    return undefined;\n}\n\nexport function isGatewayTokenAuthentication(authentication?: Authentication): authentication is Authentication & { method: 'gateway-token' } {\n    return authentication?.method === 'gateway-token';\n}\nexport function isGatewayClientAuthentication(authentication?: Authentication): authentication is Authentication & { method: 'gateway-client' } {\n    return authentication?.method === 'gateway-client';\n}\n", "type QueueEntry<T> = { action: () => Promise<T>, resolve: (value: T | PromiseLike<T>) => void, reject: (err?: unknown) => void }\n\nexport default class AsyncSerializer {\n    private readonly queue: Array<QueueEntry<unknown>> = [];\n    private closed = false;\n    private draining = false;\n\n    constructor(private readonly bufferSize: number = -1) {\n    }\n\n    public put<T>(action: () => Promise<T>): Promise<T> {\n        return new Promise<T>((resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: unknown) => void) => {\n            if (this.closed) {\n                reject(new Error(\"cannot enqueue promise serializer is closed\"));\n            }\n            const msg: QueueEntry<T> = {action, resolve, reject};\n            if (this.bufferSize < 0 || this.queue.length < this.bufferSize) {\n                this.queue.push(msg as QueueEntry<unknown>);\n                this.drain();\n            } else {\n                this.handle(msg);\n            }\n        });\n    }\n\n    public close() {\n        this.closed = true;\n    }\n\n    private async drain() {\n        if (this.draining) {\n            return;\n        }\n        try {\n            this.draining = true;\n            while (this.queue.length) {\n                const msg = this.queue.shift();\n                if (msg) await this.handle(msg);\n            }\n        } finally {\n            this.draining = false;\n        }\n    }\n\n    private async handle<T>(msg: QueueEntry<T>) {\n        try {\n            const result = await msg.action();\n            msg.resolve(result);\n        } catch (error) {\n            msg.reject(error);\n        }\n    }\n}\n", "import * as impl from './impl.js';\nimport {authenticateSecret, Authenticator} from './core.js';\nimport {randomId} from '../common/ids.js';\nimport {sign, unsign} from '../common/jwt.js';\nimport {Authentication, AuthenticationRequest, AuthenticationResponse} from './types.js';\nimport {exceptionInfo, exceptionMessage} from '../common/types.js';\nimport {getLogger} from '../logger.js';\n\nconst log = getLogger('gateway.auth.basic');\nasync function authenticate({authentication}: AuthenticationRequest,\n                            secret: string,\n                            ttl: number,\n                            secretVerifier?: (username?: string, password?: string) => Promise<boolean>): Promise<AuthenticationResponse> {\n    switch (authentication?.method) {\n        case 'secret': {\n            if (secretVerifier) {\n                if (!(await secretVerifier(authentication.login, authentication.secret))) {\n                    throw exceptionInfo(\"Invalid login/secret\", {type: 'failure', message: 'Invalid login/secret'});\n                }\n            }\n            const response = await authenticateSecret(authentication);\n            const accessToken = sign({\n                user: response.user,\n                exp: Math.floor((Date.now() + ttl) / 1000 )\n            }, secret);\n            return {...response, accessToken}\n\n        }\n        case 'access-token': {\n            try {\n                const token = (authentication as Required<Pick<Authentication, 'token'>>).token;\n                const user = (unsign(token, secret)).user as string | undefined;\n                // also consider now/ttl\n                return {type: 'success', login: user, user, accessToken: token};\n            } catch (e) {\n                throw exceptionInfo(`Invalid or expired token:${exceptionMessage(e)}`, {type: 'failure', message: 'Invalid or expired token: ' + exceptionMessage(e)}, e);\n            }\n        }\n        default: {\n            const msg = `Unknown authentication method '${authentication?.method}'`;\n            log.debug(msg);\n            throw exceptionInfo(msg, {type: 'failure', message: msg});\n        }\n    }\n}\n\nclass BasicAuthenticator implements impl.AuthImpl {\n    constructor(\n        private readonly secret: string,\n        private readonly ttl: number,\n        private readonly secretVerifier?: (username?: string, password?: string) => Promise<boolean>) {}\n\n    auth(authenticationRequest: AuthenticationRequest) {\n        return authenticate(authenticationRequest, this.secret, this.ttl, this.secretVerifier);\n    }\n}\n\nexport interface BasicAuthenticatorConfig extends impl.DefaultAuthenticatorConfig {\n    ttl?: number,\n    secretVerifier?: (login?: string, secret?: string) => Promise<boolean>\n}\n\nexport function authenticator(config: BasicAuthenticatorConfig): Authenticator {\n    const ttl = 1000 * (config.ttl ?? 60000);\n    const secretVerifier = config.secretVerifier;\n    if (secretVerifier) {\n        log.debug('will use secret verifier');\n    }\n    return impl.authenticator(config, new BasicAuthenticator(randomId(), ttl, secretVerifier))\n}\n", "import * as impl from './impl.js';\r\nimport {AuthenticationRequest, AuthenticationResponse} from './types.js';\r\nimport {jwtVerifier, type VerifyJwt} from '@interopio/gateway/jose/jwt';\r\n\r\nexport interface Oauth2AuthenticatorConfig extends impl.DefaultAuthenticatorConfig {\r\n    issuerBaseURL?: string\r\n    audience?: string\r\n}\r\n\r\nclass Oauth2Authenticator implements impl.AuthImpl {\r\n    readonly #jwtVerifier: VerifyJwt;\r\n\r\n    constructor(config: Oauth2AuthenticatorConfig, fetchFn: typeof fetch) {\r\n        this.#jwtVerifier = jwtVerifier({\r\n            issuerBaseUri: config.issuerBaseURL,\r\n            audience: config.audience ? [config.audience] : [],\r\n            clockTolerance: 3600,\r\n            timeout: 5000,\r\n            cacheMaxAge: 60000,\r\n            fetchFn\r\n        });\r\n    }\r\n\r\n    async auth(authenticationRequest: AuthenticationRequest): Promise<AuthenticationResponse> {\r\n        const {method, token: accessToken} = authenticationRequest.authentication;\r\n        if (method !== 'access-token') {\r\n            throw new Error(`unsupported authentication method`);\r\n        }\r\n        if (!accessToken) {\r\n            throw new Error('missing access token');\r\n        }\r\n\r\n        try {\r\n            const {payload} = await this.#jwtVerifier(accessToken);\r\n            const user = payload.sub;\r\n            return {type: 'success', user};\r\n        }\r\n        catch (e) {\r\n            throw new Error(`invalid token`, {cause: e});\r\n        }\r\n    }\r\n}\r\n\r\nexport function authenticator(config: Oauth2AuthenticatorConfig, fetchFn: typeof fetch) {\r\n    return impl.authenticator(config, new Oauth2Authenticator(config, fetchFn));\r\n}\r\n", "import {Authenticator} from './core.js';\nimport * as impl from '../auth/impl.js';\nimport * as api from '../../types/auth/api';\n\nclass CustomAuthenticator implements impl.AuthImpl {\n    private readonly authFn: api.Authenticator;\n    constructor(authFn: api.Authenticator) {\n        this.authFn = authFn;\n    }\n\n    async auth(authenticationRequest: api.AuthenticationRequest): Promise<api.AuthenticationResponse> {\n        const authenticationResponse = await this.authFn(authenticationRequest);\n        return authenticationResponse;\n    }\n}\nexport function authenticator(config: impl.DefaultAuthenticatorConfig, authFn: api.Authenticator): Authenticator {\n    return impl.authenticator(config, new CustomAuthenticator(authFn))\n}\n", "import {DomainUri} from '../../state/types/domain-registry.js';\nimport {reason} from '../../reason.js';\n\nexport const agmDomainUri: DomainUri = 'agm';\nexport const agmFailure = `${agmDomainUri}.errors.failure`;\n\nexport const agmUnhandledMessage = `${agmDomainUri}.errors.unhandled_message`;\nexport const agmUnregistrationFailure = `${agmDomainUri}.errors.unregistration.failure`;\nexport const agmInvocationFailure = `${agmDomainUri}.errors.invocation.failure`;\nexport const agmSubscriptionFailure = `${agmDomainUri}.errors.subscription.failure`;\nexport const agmInvalidSubscription =  `${agmDomainUri}.errors.subscription.invalid_subscription`;\nexport const reasonPeerRemoved = reason(`${agmDomainUri}.peer-removed`, 'Peer has been removed');\nexport const reasonMethodRemoved = reason(`${agmDomainUri}.method-removed`, 'Method has been removed');\nexport const reasonBadDrop = reason(agmInvalidSubscription, 'Trying to drop a subscription that wasnt established. Did you mean to return an error instead?');\n", "import * as m from '../../common/messages.js';\nimport {outgoing} from '../../common/messages.js';\nimport {agmDomainUri} from './constants.js';\nimport {AddressType, PeerId, Source} from '../../state/types/common.js';\nimport {\n    AddInterest,\n    Event,\n    Invoke,\n    MethodsAdded,\n    MethodsRemoved,\n    Register,\n    RemoveInterest,\n    Result,\n    Subscribed,\n    SubscriptionCancelled\n} from './types/messages.js';\nimport {Reason} from '../../reason.js';\nimport {SendMessageAction} from '../../node.js';\n\nfunction methodsAddedMsg(toPeerId: PeerId, serverId: PeerId, methods, sourceType: AddressType): MethodsAdded {\n    return {\n        domain: agmDomainUri,\n        type: 'methods-added',\n        peer_id: toPeerId,\n        source_type: sourceType,\n        server_id: serverId,\n        methods\n    }\n}\n\nexport function methodsAdded(recipient: Source, toPeerId: PeerId, serverId: PeerId, methods, sourceType: AddressType): SendMessageAction<'methods-added'> {\n    return m.outgoing(recipient, methodsAddedMsg(toPeerId, serverId, methods, sourceType));\n}\n\nexport function register(requestId, serverId: PeerId, methods): Register {\n    return {\n        domain: agmDomainUri,\n        type: 'register',\n        request_id: requestId,\n        peer_id: serverId,\n        methods: methods\n    }\n}\n\nfunction methodsRemovedMsg(peerId: PeerId, serverId: PeerId, methodIds): MethodsRemoved {\n    return {\n        domain: agmDomainUri,\n        type: 'methods-removed',\n        peer_id: peerId,\n        server_id: serverId,\n        methods: methodIds\n    }\n}\n\nexport function methodsRemoved(recipient: Source, fromPeerId: PeerId, serverId: PeerId, methodIds): SendMessageAction<'methods-removed'> {\n    return m.outgoing(recipient, methodsRemovedMsg(fromPeerId, serverId, methodIds));\n}\n\nfunction invokeMsg(invocationId, peerId: PeerId, methodId, callerId: PeerId, args, argsKv, ctx): Invoke {\n    return {\n        domain: agmDomainUri,\n        type: 'invoke',\n        invocation_id: invocationId,\n        peer_id: peerId,\n        method_id: methodId,\n        caller_id: callerId,\n        arguments: args,\n        arguments_kv: argsKv,\n        context: ctx\n    }\n}\n\nexport function invoke(recipient: Source, invocationId, peerId: PeerId, methodId, callerId: PeerId, args, argsKv, ctx): SendMessageAction<'invoke'> {\n    return outgoing(recipient, invokeMsg(invocationId, peerId, methodId, callerId, args, argsKv, ctx))\n}\n\nfunction resultMsg(requestId, callerId: PeerId, results): Result {\n    return {\n        domain: agmDomainUri,\n        type: 'result',\n        request_id: requestId,\n        peer_id: callerId,\n        result: results\n    }\n}\n\nexport function result(recipient: Source, requestId, callerId: PeerId, results) {\n    return outgoing(recipient, resultMsg(requestId, callerId, results));\n}\n\nfunction addInterestMsg(subscriptionId, serverId: PeerId, methodId, subscriberId: PeerId, args, argsKv, flags, ctx): AddInterest {\n    return {\n        domain: agmDomainUri,\n        type: 'add-interest',\n        subscription_id: subscriptionId,\n        peer_id: serverId,\n        method_id: methodId,\n        caller_id: subscriberId,\n        arguments: args,\n        arguments_kv: argsKv,\n        flags: flags,\n        context: ctx\n    };\n}\n\nexport function addInterest(recipient: Source, subscriptionId, serverId: PeerId, methodId, subscriberId: PeerId, args, argsKv, flags, ctx): SendMessageAction<'add-interest'> {\n    return m.outgoing(recipient, addInterestMsg(subscriptionId, serverId, methodId, subscriberId, args, argsKv, flags, ctx));\n}\n\nfunction removeInterestMsg(subscriptionId, serverId: PeerId, methodId, subscriberId: PeerId, reason: Reason): RemoveInterest {\n    return {\n        domain: agmDomainUri,\n        type: 'remove-interest',\n        subscription_id: subscriptionId,\n        peer_id: serverId,\n        method_id: methodId,\n        caller_id: subscriberId,\n        reason_uri: reason.uri,\n        reason: reason.message\n    };\n}\n\nexport function removeInterest(recipient: Source, subscriptionId, serverId: PeerId, methodId, subscriberId: PeerId, reason: Reason): SendMessageAction<'remove-interest'> {\n    return m.outgoing(recipient, removeInterestMsg(subscriptionId, serverId, methodId, subscriberId, reason));\n}\n\nfunction subscribedMsg(requestId, subscriberId: PeerId, subscriptionId): Subscribed {\n    return {\n        domain: agmDomainUri,\n        type: 'subscribed',\n        request_id: requestId,\n        peer_id: subscriberId,\n        subscription_id: subscriptionId\n    };\n}\n\nexport function subscribed(recipient: Source, requestId, subscriberId: PeerId, subscriptionId): SendMessageAction<'subscribed'> {\n    return m.outgoing(recipient, subscribedMsg(requestId, subscriberId, subscriptionId));\n}\n\nfunction eventMsg(subscriberId: PeerId, subscriptionId, isOob, sqn, isSnapshot, data): Event {\n    return {\n        domain: agmDomainUri,\n        type: 'event',\n        peer_id: subscriberId,\n        subscription_id: subscriptionId,\n        oob: isOob,\n        sequence: sqn,\n        snapshot: isSnapshot,\n        data\n    };\n}\n\nexport function event(recipient: Source, subscriberId: PeerId, subscriptionId, isOob, sqn, isSnapshot, data): SendMessageAction<'event'> {\n    return m.outgoing(recipient, eventMsg(subscriberId, subscriptionId, isOob, sqn, isSnapshot, data));\n}\n\nfunction subscriptionCancelledMsg(subscriptionId, subscriberId: PeerId, reason: Reason): SubscriptionCancelled {\n    return {\n        domain: agmDomainUri,\n        type: 'subscription-cancelled',\n        subscription_id: subscriptionId,\n        peer_id: subscriberId,\n        reason_uri: reason.uri,\n        reason: reason.message\n    };\n}\n\nexport function subscriptionCancelled(recipient: Source, subscriptionId, subscriberId: PeerId, reason: Reason): SendMessageAction<'subscription-cancelled'> {\n    return m.outgoing(recipient, subscriptionCancelledMsg(subscriptionId, subscriberId, reason));\n}\n\nexport function peerRemoved(recipient: Source, peerId: PeerId, removedPeerId: PeerId, reason: Reason) {\n    return m.peerRemoved(agmDomainUri, recipient, peerId, removedPeerId, reason);\n}\n", "import {\n    byIdInDomain,\n    byIdInDomainThrows,\n    byIdThrows,\n    isClusterPeer,\n    isLocalPeer,\n    setPeer,\n    updatePeer,\n    visiblePeers\n} from '../../state/peers.js';\nimport {DomainKeys, type Peer, type State} from '../../state/types/state.js';\nimport type {AgmPeer} from '../../state/types/agm.js';\nimport {methodsAdded, methodsRemoved} from './messages.js';\nimport type {Id, MethodDef, MethodDefWithParsedRestrictions, PeerMethods} from '../../state/types/mthds.js';\nimport * as rst from '../../restrictions.js';\nimport {HandleReturnType} from '../../domain.js';\nimport {broadcast, isRemoteSource, success} from '../../common/messages.js';\nimport {Register, Unregister} from './types/messages.js';\nimport {agmDomainUri, agmUnregistrationFailure, reasonMethodRemoved} from './constants.js';\nimport {peerToAddress} from '../../address.js';\nimport {nodeId} from '../../common/ids.js';\nimport {throwReason} from '../../reason.js';\nimport {ensureDomain} from '../../common/utilities.js';\nimport {Identity, PeerId, Restrictions, Source} from '../../state/types/common.js';\nimport {isClusterMethod} from './state.js';\nimport {cancelInterest} from './subscriptions.js';\nimport {MessageType, SendMessageAction} from '../../node.js';\nimport {castDraft, Draft, produce} from 'immer';\n\nfunction methodToMap(method: MethodDef): MethodDefWithParsedRestrictions {\n    const parsedRestrictions: Restrictions | undefined = rst.parse(method.restrictions);\n    if (parsedRestrictions) {\n        return {...method, parsedRestrictions};\n    }\n    return method;\n\n}\n\nfunction mapToMethod(method: MethodDefWithParsedRestrictions): MethodDef {\n    const m = {...method};\n    delete m['parsedRestrictions'];\n    return m;\n}\n\nfunction isVisible(method: MethodDefWithParsedRestrictions, provider:[Source, Identity], consumer: [Source, Identity]): boolean {\n    const restrictions = method.parsedRestrictions;\n    if (restrictions) {\n        return rst.check(restrictions, provider, consumer);\n    }\n    return true;\n}\n\n// Registers methods from a given provider to a given consumer.\n//\n// It is assumed that the consumer and the provider can see each other\nexport function registerWithConsumer(state: State, provider: Peer, methods: MethodDefWithParsedRestrictions[], consumer: Peer): HandleReturnType {\n    const providerId = provider.id;\n    const consumerId = consumer.id;\n    const existingMethods: PeerMethods = consumer[DomainKeys.Agm]?.methods?.[provider.id] || {};\n\n    const [remote, mthds] = methods\n        .filter(m => isVisible(m, [provider.source, provider.identity], [consumer.source, consumer.identity]))\n        .reduce(([r, ms], v) => {\n            r = produce(r, (rd: Draft<PeerMethods>) => {\n                rd[v.id] = castDraft(v);\n            });\n            return [r, ms.concat(mapToMethod(v))];\n        }, [existingMethods, new Array<MethodDef>()]);\n\n    if (mthds.length > 0) {\n        consumer = produce(consumer, (cd: Draft<Peer>) => {\n            cd[DomainKeys.Agm]!.methods = cd[DomainKeys.Agm]!.methods || {};\n            cd[DomainKeys.Agm]!.methods![providerId] = castDraft(remote);\n        });\n\n        return [\n            setPeer(state, consumerId, consumer),\n            isLocalPeer(consumer) ? methodsAdded(consumer.source, consumerId, providerId, mthds, provider.source.type) : []] as HandleReturnType\n    } else {\n        return [state, []];\n    }\n}\n\nfunction register(state: State, provider: AgmPeer, methods: MethodDef[]): HandleReturnType {\n    const providerId = provider.id;\n    // add the methods to the provider\n    const translatedMethods: MethodDefWithParsedRestrictions[] = methods.map((m) => {\n        return methodToMap(m);\n    });\n    provider = translatedMethods.reduce((provider: AgmPeer, method: MethodDefWithParsedRestrictions) => {\n        const result: AgmPeer = produce(provider, (p: Draft<AgmPeer>) => {\n            p[DomainKeys.Agm].methods = p[DomainKeys.Agm].methods || {};\n            p[DomainKeys.Agm].methods[providerId] = p[DomainKeys.Agm].methods[providerId] || {};\n            p[DomainKeys.Agm].methods[providerId][method.id] = castDraft(method);\n        });\n        return result;\n    }, provider);\n    const updatedState = setPeer(state, providerId, provider);\n\n    return visiblePeers(state, DomainKeys.Agm, provider).reduce(([state, actions], consumer) => {\n        const [nextState, nextActions] = registerWithConsumer(state, provider, translatedMethods, consumer);\n        return [nextState, actions.concat(nextActions)];\n    }, [updatedState, []] as HandleReturnType);\n}\n\n/*Adds a sequence of methods belonging to a remote peer to all local peers\n\n   Returns a [state (messages)]*/\nfunction remoteRegister(state: State, source: Source, request: Register): HandleReturnType {\n    const {peer_id: peerId, methods} = request;\n    const peer = byIdInDomain(state, peerId, DomainKeys.Agm);\n    if (peer) {\n        return register(state, peer, methods);\n    }\n    return [state, []];\n}\n\nexport function remoteMethodsFilter(peer: AgmPeer, defaultRestrictions?: MethodOverrides['defaultMethodRestrictions']): (m: MethodDef) => boolean {\n    return (m: MethodDef) => {\n        if ((m.restrictions === undefined || m.restrictions === null) && defaultRestrictions !== undefined) {\n            const parsedRestrictions = defaultRestrictions.call(peer.identity, m.name);\n            return isClusterMethod(peer, {parsedRestrictions})\n        }\n        return true;\n    }\n}\n\nfunction localRegister(state: State, source: Source, request: Register, options?: MethodOverrides): HandleReturnType {\n    const {request_id: requestId, peer_id: providerId, methods} = request;\n    const peer = byIdInDomainThrows(state, providerId, DomainKeys.Agm);\n    let [newState, actions] = register(state, peer, methods);\n    actions = actions.concat([\n        methodsAdded(source, providerId, providerId, methods, 'local'),\n        success(agmDomainUri, source, requestId, providerId)\n    ]);\n    if (isClusterPeer(DomainKeys.Agm, peer)) {\n        const remoteMethods = methods.filter(remoteMethodsFilter(peer, options?.defaultMethodRestrictions));\n        const remoteRegister = {...request, methods: remoteMethods};\n        actions = actions.concat([broadcast(peerToAddress(nodeId(state.ids), providerId), remoteRegister)]);\n    }\n    return [newState, actions];\n}\nexport type MethodOverrides = {\n    defaultMethodRestrictions?: (this: Identity, name?: string) => Restrictions\n}\nexport function forwardRegister(state: State, source: Source, request: Register, options?: MethodOverrides): HandleReturnType {\n    return isRemoteSource(source) ? remoteRegister(state, source, request) : localRegister(state, source, request, options);\n}\n\n/*Removes all methods of a given provider from a consumer. Generates announcement messages for the\n  actually removed methods (those that were visible to the consumer)*/\nexport function removeMethodsFromConsumer(state: State, providerId: PeerId, consumer: Peer, methodIds?: Id[]): HandleReturnType {\n    if (!methodIds) {\n        methodIds = Object.keys(consumer[DomainKeys.Agm]?.methods?.[providerId] ?? {});\n        if (!methodIds || methodIds.length == 0) {\n            return [updatePeer(state, consumer.id, (c: Draft<Peer>) => {\n                const domain = c[DomainKeys.Agm]!;\n                if (domain.methods) {\n                    delete domain.methods[providerId];\n                }\n                // todo delete domain.methods if empty\n            }), []];\n        }\n    }\n    // build the list of method ids that are actually present on the consumer\n\n    let removedIds: Set<Id>;\n    [consumer, removedIds] = methodIds.reduce(([c, rids], mid) => {\n        if (c[DomainKeys.Agm]?.methods?.[providerId]?.[mid]) {\n            c = produce(c, (d) => {\n                const ms = d[DomainKeys.Agm]?.methods;\n                if (ms?.[providerId]?.[mid]) {\n                    delete ms[providerId][mid];\n                    if (Object.keys(ms[providerId]).length === 0) {\n                        delete ms[providerId];\n                    }\n                    if (Object.keys(ms).length === 0) {\n                        delete d[DomainKeys.Agm]?.methods;\n                    }\n                }\n            });\n            rids.add(mid);\n        }\n        return [c, rids];\n    }, [consumer, new Set<Id>()]);\n    if (removedIds.size == 0) {\n        // nothing has been removed - state is unchanged\n        return [state, []];\n    } else {\n        // originally it does not use throws\n        const provider = byIdThrows(state, providerId);\n        let messages;\n        [state, messages] = cancelInterest(state, consumer, provider, removedIds, reasonMethodRemoved);\n        if (isLocalPeer(consumer)) {\n            messages = messages.concat(methodsRemoved(consumer.source, consumer.id, providerId, Array.from(removedIds)));\n        }\n        return [state, messages] as HandleReturnType;\n    }\n}\n\nfunction unregister(state: State, peer: AgmPeer, methods): HandleReturnType {\n    const peerId = peer.id;\n    const updatedPeer = ensureDomain(methods.reduce((peer: AgmPeer, mid) => {\n        if (peer[DomainKeys.Agm].methods?.[peerId][mid]) {\n            peer = produce(peer, (p: Draft<AgmPeer>) => {\n                delete p[DomainKeys.Agm]?.methods?.[peerId][mid];\n            });\n        } else {\n            throwReason(agmUnregistrationFailure, `Unable to unregister missing method ${mid}`);\n        }\n        return peer;\n    }, peer), DomainKeys.Agm);\n    let [newState, messages]: HandleReturnType = [setPeer(state, peerId, updatedPeer), new Array<SendMessageAction<MessageType>>()];\n    [newState, messages] = visiblePeers(state, DomainKeys.Agm, updatedPeer)\n        .filter((p) => {\n            return p.id !== peerId;\n        })\n        .reduce(([, m]: HandleReturnType, consumer) => {\n            const [ns, nm] = removeMethodsFromConsumer(state, peerId, consumer, methods);\n            return [ns, m.concat(nm)];\n        }, [newState, new Array<SendMessageAction<MessageType>>()]);\n\n    // todo log action\n    return [newState, messages];\n}\n\nfunction remoteUnregister(state: State, request: Unregister): HandleReturnType {\n    const {peer_id: peerId, methods} = request;\n    const peer = byIdInDomain(state, peerId, DomainKeys.Agm);\n    if (peer) {\n        return unregister(state, peer, methods);\n    }\n    return [state, []];\n}\n\n/*Adds a sequence of methods belonging to a local peer to all local peers\n\n   Returns a [state (messages)]*/\nfunction localUnregister(state: State, source: Source, request: Unregister): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, methods} = request;\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Agm);\n    let [newState, messages] = unregister(state, peer, methods);\n    messages = messages.concat([\n        methodsRemoved(source, peerId, peerId, methods),\n        success(agmDomainUri, source, requestId, peerId),\n    ]);\n    if (isClusterPeer(DomainKeys.Agm, peer)) {\n        messages = messages.concat([broadcast(peerToAddress(nodeId(state.ids), peerId), request)]);\n    }\n    return [newState, messages];\n}\n\nexport function forwardUnregister(state: State, source: Source, request: Unregister): HandleReturnType {\n    return isRemoteSource(source) ? remoteUnregister(state, request) : localUnregister(state, source, request);\n}\n", "import type {MethodDefWithParsedRestrictions} from '../../state/types/mthds.js';\nimport type {JoinedPeer} from '../../state/peers.js';\nimport {DomainKeys} from \"../../state/types/state.js\";\nimport {check} from '../../restrictions.js';\n\nexport function isClusterMethod(peer: JoinedPeer<DomainKeys.Agm>,\n                                {parsedRestrictions}: Pick<MethodDefWithParsedRestrictions, 'parsedRestrictions'>): boolean {\n    return check(parsedRestrictions, [{type: peer.source.type === 'local' ? 'local' : 'cluster'}, peer.identity], [{type: 'cluster'}, undefined]);\n}\n", "import {DomainKeys} from '../../state/types/state.js';\nimport {CallRequest, SubscribeRequest} from './types/requests.js';\nimport {isPeerVisible, JoinedPeer} from '../../state/peers.js';\nimport {agmInvocationFailure} from './constants.js';\nimport {throwReason} from '../../reason.js';\n\nexport function validate(caller: JoinedPeer<DomainKeys.Agm>, callee: JoinedPeer<DomainKeys.Agm>, request: SubscribeRequest | CallRequest) {\n    const {server_id: serverId, method_id: methodId, arguments: args, arguments_kv: argsKv} = request;\n    if ((caller.id !== callee.id) && !isPeerVisible(DomainKeys.Agm, caller, callee)) {\n        throwReason(agmInvocationFailure, 'Unable to invoke methods across different users');\n    }\n    if (!caller[DomainKeys.Agm].methods?.[serverId]?.[methodId]) {\n        throwReason(agmInvocationFailure, `Unable to find method with id ${methodId} on server id ${serverId} registered with this peer`);\n    }\n    if (args && argsKv) {\n        throwReason(agmInvocationFailure, `Cant use positional and by-name arguments at the same time`);\n    }\n}\n", "import {HandleReturnType} from '../../domain.js';\nimport {AgmPeer, Interest, StreamId, StreamPeerInfo, Subscription, SubscriptionId} from '../../state/types/agm.js';\nimport {DomainKeys, Peer, State} from '../../state/types/state.js';\nimport {\n    byId,\n    byIdInDomain,\n    byIdInDomainThrows,\n    byIdThrows,\n    isLocalPeer,\n    setPeer,\n    updatePeer\n} from '../../state/peers.js';\nimport {NodeAddress, PeerId, Source} from '../../state/types/common.js';\nimport * as msg from './messages.js';\nimport {reason, Reason, requestToReason, throwReason} from '../../reason.js';\nimport {\n    AcceptedRequest,\n    DropSubscriptionRequest,\n    PostRequest,\n    PublishRequest,\n    SubscribeRequest,\n    UnsubscribeRequest\n} from './types/requests.js';\nimport {error, isLocalSource, success, unicast} from '../../common/messages.js';\nimport {nodeId, requestId} from '../../common/ids.js';\nimport {exceptionInfo} from '../../common/types.js';\nimport {nodeToAddress, peerToAddress} from '../../address.js';\nimport {validate} from './utilities.js';\nimport {getLogger} from '../../logger.js';\nimport {agmDomainUri, agmInvalidSubscription, agmSubscriptionFailure, reasonBadDrop} from './constants.js';\nimport {Draft, produce} from 'immer';\nimport {CommandType, MessageType, SendMessageAction} from '../../node.js';\nimport {Accepted, DropSubscription, Post, Publish, Subscribe} from './types/messages.js';\nimport {Id} from '../../state/types/mthds.js';\n\nfunction cancelSubscriptionsFrom(state: State, subscriptionId: SubscriptionId, subscription: Subscription, subscriberId: PeerId, reason: Reason): HandleReturnType {\n    const {server: serverId, stream: streamId, method_id: methodId} = subscription;\n    const peer = produce(byIdThrows(state, serverId), removeInterestAndStream(subscriptionId, subscriberId, streamId));\n    state = setPeer(state, serverId, peer);\n\n    if (isLocalPeer(peer)) {\n        return [state, [msg.removeInterest(peer.source, subscriptionId, serverId, methodId, subscriberId, reason)]];\n    }\n    // the remote servers will receive their own when the peer is removed on their node\n    return [state, []];\n\n}\n\n/**\n * Cancels all subscriptions made by peer with subscriber-id and generates messages for the servers.\n * @return [state, [messages]]\n */\nexport function cancelSubscriptions(state: State, subscriber: Peer, reason: Reason): HandleReturnType {\n    const subscriptions = subscriber[DomainKeys.Agm]?.subscriptions;\n    const subscriberId = subscriber.id;\n    const [newState, messages] =\n        Object.entries(subscriptions || {} as Record<string, Subscription>)\n            .reduce(([s, m], [subscriptionId, subscription]) => {\n                const [ns, nm] = cancelSubscriptionsFrom(s, subscriptionId, subscription, subscriberId, reason);\n                return [ns, m.concat(nm)];\n            }, [state, []] as HandleReturnType);\n    return [newState, messages];\n}\n\nfunction collectSubscriptions(subscriptions: Record<SubscriptionId, Subscription>, serverId: PeerId, methodIds?: Set<Id>): { removed: Record<SubscriptionId, Subscription>, remaining: Record<SubscriptionId, Subscription> } {\n    return Object.entries(subscriptions).reduce((result, [subId, sub]) => {\n        if ((serverId === sub.server)\n            && ((!methodIds || methodIds.size === 0) || methodIds.has(sub.method_id))) {\n            result.removed[subId] = sub;\n        } else {\n            result.remaining[subId] = sub;\n        }\n        return result;\n    }, {removed: {}, remaining: {}});\n}\n\n/*Cancels all interest that subscriber-id might have on server-id methods\n\n  Returns [state [message]]*/\nexport function cancelInterest(state: State, subscriber: Peer, server: Peer, methodIds: Set<Id> | undefined, reason): HandleReturnType {\n    const serverId = server.id;\n    const {\n        removed,\n        remaining\n    } = collectSubscriptions(subscriber[DomainKeys.Agm]?.subscriptions || {}, serverId, methodIds);\n    const stateWithoutInterests = Object.entries(removed).reduce((s, [subId, sub]) => {\n        let messages;\n        [state, messages] = cancelSubscriptionsFrom(state, subId, sub, subscriber.id, reason);\n        return state;\n    }, state);\n    if (Object.keys(removed).length > 0) {\n        // todo trace unsubscription\n        return [updatePeer(stateWithoutInterests, subscriber.id, (p) => {\n            if (Object.keys(remaining).length > 0) {\n                p[DomainKeys.Agm]!.subscriptions = remaining;\n            } else if (p[DomainKeys.Agm]) {\n                delete p[DomainKeys.Agm].subscriptions;\n            }\n        }), isLocalSource(subscriber.source)\n            ? Object.keys(removed).map((k) => msg.subscriptionCancelled(subscriber.source, k, subscriber.id, reason))\n            : []]\n    }\n    return [state, []];\n}\n\ntype RemoteSubscribeRequest = Subscribe & { subscriptionId: SubscriptionId };\n\nfunction addInterest(caller: AgmPeer, state: State, request: RemoteSubscribeRequest): HandleReturnType {\n    const {\n        peer_id: peerId,\n        server_id: serverId,\n        subscriptionId, // is this with underscore???(where the unicast goes?)\n        method_id: methodId,\n        arguments: args,\n        arguments_kv: argsKv,\n        context,\n        flags\n    } = request;\n    let callee = byId(state, serverId);\n    if (callee) {\n        callee = produce(callee, (c) => {\n            c[DomainKeys.Agm]!.interests = c[DomainKeys.Agm]!.interests || {} as Record<SubscriptionId, Interest>;\n            c[DomainKeys.Agm]!.interests[subscriptionId] = {subscriber: peerId, method_id: methodId};\n        });\n        const calleeSrc = callee.source;\n        const method = callee[DomainKeys.Agm]!.methods![serverId][methodId];\n        // todo feature metric\n        return [\n            setPeer(state, serverId, callee),\n            isLocalSource(calleeSrc)\n                ? [msg.addInterest(calleeSrc, subscriptionId, serverId, methodId, peerId, args, argsKv, flags, context)]\n                : [unicast(peerToAddress(nodeId(state.ids), peerId), nodeToAddress(calleeSrc['node']), request as Subscribe)]];\n    }\n    throw exceptionInfo(`unable to find server with id ${serverId}`, {});\n}\n\nfunction subscribe(state: State, request: SubscribeRequest, subscriptionId: SubscriptionId): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, server_id: serverId, method_id: methodId} = request;\n    const caller = produce(byIdInDomainThrows(state, peerId, DomainKeys.Agm), (draft: Draft<AgmPeer>) => {\n        draft[DomainKeys.Agm].subscriptions = draft[DomainKeys.Agm].subscriptions || {};\n        draft[DomainKeys.Agm].subscriptions![subscriptionId] = {\n            server: serverId,\n            method_id: methodId,\n            request_id: requestId\n        };\n    });\n    const callee = byIdInDomainThrows(state, serverId, DomainKeys.Agm);\n    validate(caller, callee, request);\n\n    // todo log large msg\n    // todo log action\n    const message: RemoteSubscribeRequest = {...request as Subscribe, subscriptionId};\n    return addInterest(caller, setPeer(state, peerId, caller), message);\n}\n\nfunction localSubscribe(state: State, source: Source, request): HandleReturnType {\n    const [newIds, subscriptionId] = requestId(state.ids);\n    return subscribe({...state, ids: newIds}, request, subscriptionId);\n}\n\nfunction remoteSubscribe(state: State, request: RemoteSubscribeRequest): HandleReturnType {\n    const {subscriptionId, server_id: serverId} = request;\n    return byId(state, serverId) ? subscribe(state, request, subscriptionId) : [state, []];\n}\n\nexport function forwardSubscribe(state: State, source: Source, request: SubscribeRequest): HandleReturnType {\n    return isLocalSource(source) ? localSubscribe(state, source, request) : remoteSubscribe(state, request as RemoteSubscribeRequest);\n}\n\nfunction dropSubscription(state: State, subscriber: Peer | undefined, subscriberId, subscriptionId: SubscriptionId, reason, ctx, isError: boolean): HandleReturnType {\n    if (subscriber) {\n        const subscription: Subscription | undefined = subscriber[DomainKeys.Agm]?.subscriptions?.[subscriptionId];\n        const requestId = subscription?.request_id;\n        const subSrc = subscriber.source;\n\n        // todo log action\n\n        return [setPeer(state, subscriberId, produce(subscriber, (s: Draft<Peer>) => {\n            const d = s[DomainKeys.Agm]!;\n            if (d.subscriptions) {\n                delete d.subscriptions[subscriptionId];\n                if (Object.keys(d.subscriptions).length === 0) {\n                    delete d.subscriptions;\n                }\n            }\n        })),\n            isLocalSource(subSrc)\n                ? isError\n                    ? [error(agmDomainUri, subSrc, requestId, subscriberId, reason, ctx)]\n                    : [msg.subscriptionCancelled(subSrc, subscriptionId, subscriberId, reason)]\n                : []]\n    } else {\n        return [state, []];\n    }\n}\n\nconst log = getLogger('gateway.domains.agm.subscriptions');\n\n/*Marks a request from a given subscriber as successful as a result of an accepted message.\n  If the subscriber is a local one - it receives a direct message. Otherwise a message for the\n  specific peer is sent to the cluster*/\nfunction subscribed(state: State, subscriberId: PeerId, subscriptionId: SubscriptionId, streamId: StreamId, request: Accepted): HandleReturnType {\n    const subscriber = byId(state, subscriberId);\n    if (subscriber) {\n        const requestId = subscriber[DomainKeys.Agm]?.subscriptions?.[subscriptionId]?.request_id;\n        state = setPeer(state, subscriberId, produce(subscriber, (s) => {\n            s[DomainKeys.Agm]!.subscriptions![subscriptionId].stream = streamId;\n        }));\n        const subSrc = subscriber.source;\n        // todo log action\n        if (isLocalPeer(subscriber)) {\n            return [state, [msg.subscribed(subSrc, requestId, subscriberId, subscriptionId)]];\n        } else {\n            return [state, [unicast(peerToAddress(nodeId(state.ids), request.peer_id), nodeToAddress(subSrc['node']), request)]];\n        }\n    } else {\n        return [state, []];\n    }\n}\n\n/*Handles an 'accepted' message.\n  The returned stream is associated with the subscriber and the interest*/\nfunction accepted(state: State, peer: AgmPeer, request: AcceptedRequest): HandleReturnType {\n    const {subscription_id: subscriptionId, peer_id: peerId, stream_id: streamId} = request;\n    if (!streamId) {\n        throwReason(agmInvalidSubscription, 'Invalid or missing stream id');\n    }\n    const interest = peer[DomainKeys.Agm].interests?.[subscriptionId];\n    if (interest) {\n        const subscriberId = interest.subscriber;\n        state = setPeer(state, peerId, produce(peer, (p) => {\n            const domain = p[DomainKeys.Agm];\n            domain.interests = domain.interests || {};\n            domain.interests[subscriptionId] = domain.interests[subscriptionId] || {};\n            domain.interests[subscriptionId].stream = streamId;\n            domain.streams = domain.streams || {};\n            domain.streams[streamId] = domain.streams[streamId] || {};\n            domain.streams[streamId][subscriberId] = domain.streams[streamId][subscriberId] || new Set<SubscriptionId>();\n            domain.streams[streamId][subscriberId].add(subscriptionId);\n        }));\n        return subscribed(state, subscriberId, subscriptionId, streamId, request as Accepted);\n    } else {\n        if (log.enabledFor('debug')) {\n            log.debug(`Subscription accept response ${JSON.stringify(request)} for missing interest`);\n        }\n        return [state, []] as HandleReturnType;\n    }\n}\n\n/*Handles a subscription accept response coming from a remote peer*/\nfunction remoteAccepted(state: State, request): HandleReturnType {\n    const {subscription_id: subscriptionId, peer_id: peerId, subscriber_id: subscriberId} = request;\n    const peer = byIdInDomain(state, peerId, DomainKeys.Agm);\n    if (peer) {\n        return accepted(state, peer, request);\n    } else {\n        log.warn(`Subscription accept response ${JSON.stringify(request)} from missing peer`);\n        return dropSubscription(state, byId(state, subscriberId), subscriberId, subscriptionId, reason(agmSubscriptionFailure, 'Received a response from a missing server'), null, true);\n    }\n}\n\n/*Handles a subscription accept response coming from a local peer*/\nfunction localAccepted(state: State, source: Source, request): HandleReturnType {\n    const {subscription_id, peer_id: peerId} = request;\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Agm);\n    return accepted(state, peer, request);\n}\n\nexport function forwardAccepted(state: State, source: Source, request: AcceptedRequest) {\n    return isLocalSource(source) ? localAccepted(state, source, request) : remoteAccepted(state, request);\n}\n\nfunction removeInterestAndStream(subscriptionId: SubscriptionId, subscriberId: PeerId, streamId?): (p: Draft<Peer>) => void {\n    return (p: Draft<Peer>) => {\n        const d = p[DomainKeys.Agm];\n        if (d) {\n            if (d.interests) {\n                delete d.interests[subscriptionId];\n                if (Object.keys(d.interests).length === 0) {\n                    delete d.interests;\n                }\n            }\n            if (streamId) {\n                if (d.streams) {\n                    d.streams[streamId][subscriberId].delete(subscriptionId);\n                    if (d.streams[streamId][subscriberId].size === 0) {\n                        delete d.streams[streamId][subscriberId];\n                        if (Object.keys(d.streams[streamId]).length === 0) {\n                            delete d.streams[streamId];\n                            if (Object.keys(d.streams).length === 0) {\n                                delete d.streams;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nexport function dropInterest(state: State, source: Source, request: DropSubscriptionRequest/* | ErrorMessage*/, isError: boolean): HandleReturnType {\n    const peerId = request.peer_id;\n    const subscriptionId = isError ? request['request_id'] : request.subscription_id;\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Agm);\n\n    const interest: Interest | undefined = peer[DomainKeys.Agm].interests?.[subscriptionId];\n    if (interest) {\n        const subscriberId = interest.subscriber;\n        const streamId = interest.stream;\n        const subscriber = byId(state, subscriberId);\n        const subscriberSrc = subscriber!.source;\n        if (streamId || isError) {\n            state = setPeer(state, peerId, produce(peer, removeInterestAndStream(subscriptionId, subscriberId, streamId)));\n            let m : readonly SendMessageAction<MessageType | CommandType>[];\n            [state, m] = dropSubscription(state, subscriber, subscriberId, subscriptionId, requestToReason(request), request['context'], isError);\n            if (subscriber && !isLocalSource(subscriberSrc)) {\n                m = m.concat(unicast(peerToAddress(nodeId(state.ids), peerId), nodeToAddress(subscriberSrc['node']), request as DropSubscription));\n            }\n            return [state, m];\n        } else {\n            return [state, [error(agmDomainUri, source, subscriptionId, peerId, reasonBadDrop)]]\n        }\n    } else {\n        return [state, [error(agmDomainUri, source, subscriptionId, peerId, reason(agmInvalidSubscription, 'Trying to drop a non-existing subscription'))]]\n    }\n}\n\nfunction removeInterest(state: State, subscriber, serverId: PeerId, subscriptionId, request): HandleReturnType | undefined {\n    const server = byId(state, serverId);\n    if (server) {\n        const interest = server[DomainKeys.Agm]?.interests?.[subscriptionId];\n        if (interest) {\n            //todo features\n            const subscriberId = subscriber.id;\n            const serverSrc = server.source;\n            state = setPeer(state, serverId, produce(server, removeInterestAndStream(subscriptionId, subscriberId, interest.stream)));\n\n            return [state, [isLocalSource(serverSrc) ? msg.removeInterest(serverSrc, subscriptionId, serverId, interest.method_id, subscriberId, requestToReason(request))\n                : unicast(peerToAddress(nodeId(state.ids), subscriberId), nodeToAddress(serverSrc['node']), request)]];\n        }\n    }\n}\n\nfunction unsubscribe(state: State, request, subscriberId: PeerId, subscriptionId: SubscriptionId, requestId: string): HandleReturnType {\n    const subscriber = byIdInDomainThrows(state, subscriberId, DomainKeys.Agm);\n    const serverId = subscriber[DomainKeys.Agm].subscriptions?.[subscriptionId]?.server;\n    // todo log action\n    if (!serverId) {\n        throwReason(agmInvalidSubscription,\n            `Unable to find subscription with id ${subscriptionId} on subscriber id ${subscriberId}`);\n    }\n\n    state = setPeer(state, subscriberId, produce(subscriber, (s: Draft<AgmPeer>) => {\n        const d = s[DomainKeys.Agm];\n        if (d.subscriptions) {\n            delete d.subscriptions[subscriptionId];\n            if (Object.keys(d.subscriptions).length === 0) {\n                delete d.subscriptions;\n            }\n        }\n    }));\n    const result = removeInterest(state, subscriber, serverId!, subscriptionId, request);\n    return result || [state, []];\n}\n\n/**\n * Processes a remote unsubscription request.\n * Returns [state [messages]]\n */\nfunction remoteUnsubscribe(state: State, request): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, subscription_id: subscriptionId} = request;\n    return unsubscribe(state, request, peerId, subscriptionId, requestId);\n}\n\n/**\n * Processes a local unsubscription request.\n * Returns [state [messages]]\n */\nfunction localUnsubscribe(state: State, source: Source, request): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, subscription_id: subscriptionId} = request;\n    let messages;\n    [state, messages] = unsubscribe(state, request, peerId, subscriptionId, requestId);\n    return [state, messages.concat(success(agmDomainUri, source, requestId, peerId))] as HandleReturnType;\n}\n\nexport function forwardUnsubscribe(state: State, source: Source, request: UnsubscribeRequest): HandleReturnType {\n    return isLocalSource(source) ? localUnsubscribe(state, source, request) : remoteUnsubscribe(state, request);\n}\n\nexport function forwardPublish(state: State, source: Source, request: PublishRequest): HandleReturnType {\n    const {peer_id: serverId, stream_id: streamId, sequence: sqn, snapshot: isSnapshot, data} = request;\n    // todo large msg\n    const server = byIdInDomain(state, serverId, DomainKeys.Agm);\n    const destinations: StreamPeerInfo = server?.[DomainKeys.Agm].streams?.[streamId] || {};\n    const remotes = new Set<string>();\n    return [state, Object.entries(destinations).flatMap(([subscriberId, subscriptions]: [PeerId, ReadonlySet<SubscriptionId>]) => {\n        const subscriber = byId(state, subscriberId);\n        const subSource = subscriber!.source;\n        let msgs: Array<SendMessageAction<MessageType>> = [];\n        if (isLocalSource(subSource)) {\n            //todo trace\n\n            msgs = Array.from(subscriptions, (subscriptionId) => {\n                return msg.event(subSource, subscriberId, subscriptionId, false, sqn, isSnapshot, data);\n            });\n        } else {\n            // remote source - we need to propagate the request to a unique list of nodes\n            // otherwise there will be event duplication\n            const node = subSource['node'];\n            if (!remotes.has(node)) {\n                remotes.add(node);\n                msgs = [unicast<'publish'>(peerToAddress(nodeId(state.ids), serverId), nodeToAddress(node), request as Publish)];\n            }\n        }\n        return msgs;\n    })];\n}\n\nexport function forwardPost(state: State, source: Source, request: PostRequest): HandleReturnType {\n    const {peer_id: serverId, subscription_id: subscriptionId, sequence: sqn, snapshot: isSnapshot, data} = request;\n\n    const server = byIdInDomain(state, serverId, DomainKeys.Agm);\n    const subscriberId = server?.[DomainKeys.Agm].interests?.[subscriptionId].subscriber;\n    const subscriber = byIdInDomain(state, subscriberId, DomainKeys.Agm);\n    // todo large msg\n    const subSrc = subscriber?.source;\n    if (subSrc) {\n        let messages: Array<SendMessageAction<MessageType>>;\n        if (isLocalPeer(subscriber)) {\n            messages = [msg.event(subSrc, subscriberId!, subscriptionId, true, sqn, isSnapshot, data)];\n        } else {\n            const recipient: NodeAddress = {\n                type: 'node',\n                node: subSrc['node']\n            };\n            messages = [unicast(peerToAddress(nodeId(state.ids), serverId), recipient, request as Post)];\n        }\n        return [state, messages];\n    }\n    return [state, []];\n}\n", "import {Domain, HandleReturnType, StateToMessagesReturnType} from '../../domain.js';\nimport {agmDomainUri, agmFailure, agmUnhandledMessage, reasonPeerRemoved} from './constants.js';\nimport {\n    broadcast,\n    error,\n    isLocalSource,\n    isRemoteSource,\n    peerAdded,\n    peerRemoved,\n    success,\n    unicast\n} from '../../common/messages.js';\nimport {join as gJoin} from '../global/messages.js';\nimport {inDomain, joinDomain, leaveDomain, threadStateAndActions} from '../../state/core.js';\nimport {AgmIncomingType, CommandType, DomainType, MessageType, NodeMessage, SendMessageAction} from '../../node.js';\nimport {\n    byId,\n    byIdInDomain,\n    byIdInDomainThrows,\n    byIdThrows,\n    bySourceInDomain,\n    isClusterPeer,\n    isLocalPeer,\n    peersInDomain,\n    visiblePeers\n} from '../../state/peers.js';\nimport {peerToAddress} from '../../address.js';\nimport {nodeId} from '../../common/ids.js';\nimport * as rst from '../../restrictions.js';\nimport {forwardRegister, forwardUnregister, registerWithConsumer, removeMethodsFromConsumer, remoteMethodsFilter} from './mthds.js';\nimport {DomainKeys, Peer, State} from '../../state/types/state.js';\nimport {DomainInfo} from '../../state/types/domain-registry.js';\nimport {AgmPeer} from '../../state/types/agm.js';\nimport {getLogger} from '../../logger.js';\nimport {\n    cancelInterest,\n    cancelSubscriptions,\n    dropInterest,\n    forwardAccepted,\n    forwardPost,\n    forwardPublish,\n    forwardSubscribe,\n    forwardUnsubscribe\n} from './subscriptions.js';\nimport {cancelInvocations, completeInvocation, forwardCall, forwardYield} from './calls.js';\nimport {Identity, OriginType, PeerId, Restrictions, Source} from '../../state/types/common.js';\nimport {exceptionToReason, Reason, reason, requestToReason} from '../../reason.js';\nimport {MethodDefWithParsedRestrictions} from '../../state/types/mthds.js';\nimport {DomainJoin, DomainLeave} from '../global/types/messages.js';\nimport {\n    Accepted,\n    Call,\n    DropSubscription,\n    Post,\n    Publish,\n    Register,\n    Subscribe,\n    Unregister,\n    Unsubscribe,\n    Yield\n} from './types/messages.js';\nimport {register} from './messages.js';\nimport {IOGateway} from '../../../gateway';\n\nconst log = getLogger('gateway.domains.agm');\n\n/*Adds a new peer to the list of peers of an existing peer. Only the local peers receive announcement messages*/\nfunction addPeer(state: State, receiver: Source, newPeer: Peer, existingPeer: Peer): HandleReturnType {\n    const {identity: existingIdentity, id: existingId} = existingPeer;\n    const existingMethods: MethodDefWithParsedRestrictions[] = Object.values(existingPeer[DomainKeys.Agm]?.methods?.[existingId] || {});\n    const newPeerId = newPeer.id;\n    const local: boolean = isLocalPeer(newPeer);\n    const existingLocal: boolean = isLocalPeer(existingPeer);\n\n    // generate messages announcing the link to both sides\n    const actions = new Array<SendMessageAction<MessageType | CommandType>>();\n\n    if (local) {\n        actions.push(peerAdded(agmDomainUri, receiver, newPeerId, existingId, existingIdentity, {local: existingLocal}));\n    }\n    if (existingLocal) {\n        actions.push(peerAdded(agmDomainUri, existingPeer.source, existingId, newPeerId, newPeer.identity, {local: local}));\n    }\n\n    // and finally register all the existing methods to the consumer\n    let action: readonly SendMessageAction<MessageType | CommandType>[];\n    [state, action] = registerWithConsumer(state, existingPeer, existingMethods, newPeer);\n\n    return [state, actions.concat(action)];\n}\n\nfunction announcePeer(state: State, receiver: Source, peerId: PeerId): HandleReturnType {\n    const peer: AgmPeer = byIdInDomainThrows(state, peerId, DomainKeys.Agm);\n    const result: HandleReturnType = visiblePeers(state, DomainKeys.Agm, peer)\n        .reduce(([s, actions]: HandleReturnType, el: Peer) => {\n            const [newState, moreActions] = addPeer(s, receiver, byId(s, peerId)!, el);\n            const result: HandleReturnType = [newState, actions.concat(moreActions)];\n            return result;\n        }, [state, []] as HandleReturnType);\n    return result;\n}\n\nfunction join(state: State, source: Source, peerId: PeerId, identity, parsedRestrictions?: Restrictions): HandleReturnType {\n\n    // todo log-action\n    state = joinDomain(state, peerId, DomainKeys.Agm, parsedRestrictions);\n    return announcePeer(state, source, peerId);\n}\n\n/**\n * Remote peer is joining the domain.\n *\n * Updates the state and generates messages to all existing peers announcing the new peer\n */\nfunction remoteJoin(state: State, source: Source, request): HandleReturnType {\n    const {peer_id: peerId, identity: peerIdentity, restrictions} = request;\n    if (!inDomain(state, peerId, DomainKeys.Agm)) {\n        return join(state, source, peerId, peerIdentity, restrictions);\n    } else {\n        return [state, []] as HandleReturnType;\n    }\n}\n\n/**\n * Local peer is joining the domain.\n *\n * Updates the state and generates messages to all existing peers announcing the new peer\n */\nfunction localJoin(state: State, source: Source, request, options?: AgmDomainOptions): HandleReturnType {\n    const {peer_id: peerId, request_id: requestId, identity, restrictions} = request;\n    if (inDomain(state, peerId, DomainKeys.Agm)) {\n        // the peer is already in the domain\n        return [state, [success(agmDomainUri, source, requestId, peerId)]];\n    } else {\n        // we need to join it\n\n        const parsedRestrictions = rst.parse(restrictions) ?? options?.defaultPeerRestrictions;\n        let actions;\n        [state, actions] = join(state, source, peerId, identity, parsedRestrictions);\n        actions = actions.concat([success(agmDomainUri, source, requestId, peerId)]);\n        const peer = byIdInDomainThrows(state, peerId, DomainKeys.Agm);\n        if (isClusterPeer(DomainKeys.Agm, peer)) {\n            const joinMessage = {...request, type: 'join', restrictions: peer[DomainKeys.Agm].restrictions};\n            if (peer.options) {\n                joinMessage.options = peer.options;\n            }\n            actions = actions.concat([broadcast(peerToAddress(nodeId(state.ids), peerId), joinMessage)]);\n        }\n        return [state, actions];\n    }\n}\n\nexport function forwardJoin(state: State, source: Source, request, options?: AgmDomainOptions): HandleReturnType {\n    if (isRemoteSource(source)) {\n        return remoteJoin(state, source, request);\n    } else {\n        return localJoin(state, source, request, options);\n    }\n}\n\n/*Detaches a peer from an existing one*/\nfunction detachPeer(state: State, peer: Peer, fromPeerId: PeerId, reason: Reason): HandleReturnType {\n    const fromPeer = byIdThrows(state, fromPeerId);\n    const recipient = fromPeer.source;\n    let msgs;\n    [state, msgs] = threadStateAndActions(\n        state,\n        (s) => cancelInvocations(s, recipient, fromPeer, peer),\n        (s) => cancelInterest(s, fromPeer, peer, undefined, reasonPeerRemoved),\n        (s) => removeMethodsFromConsumer(s, peer.id, byIdThrows(s, fromPeer.id)));\n\n    return [state, isLocalSource(recipient) ? msgs.concat(peerRemoved(agmDomainUri, recipient, fromPeerId, peer.id, reason)) : msgs];\n}\n\n/*Peer is leaving the domain.\n\n  Updates the state and generates messages for the peer and its registered methods being removed\n */\nexport function removePeer(state: State, peer: AgmPeer, reason: Reason): HandleReturnType {\n    const peerId = peer.id;\n    const [newState, messages] = visiblePeers(state, DomainKeys.Agm, peer)\n        .map(peer => peer.id)\n        .reduce(([s, m], fromId) => {\n            const [ns, nm] = detachPeer(s, peer, fromId, reason);\n            return [ns, m.concat(nm)];\n        }, cancelSubscriptions(state, peer, reason));\n    return [leaveDomain(newState, peerId, DomainKeys.Agm), messages];\n}\n\nfunction remoteLeave(state: State, source: Source, request: DomainLeave): HandleReturnType {\n    const {peer_id: peerId} = request;\n    const peer = byIdInDomain(state, peerId, DomainKeys.Agm);\n    if (peer) {\n        return removePeer(state, peer, requestToReason(request));\n    }\n    return [state, []];\n}\n\nfunction localLeave(state: State, source: Source, request: DomainLeave): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId} = request;\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Agm);\n    let [newState, actions] = removePeer(state, peer, requestToReason(request))\n    actions = actions.concat(success(agmDomainUri, source, requestId, peerId));\n    if (isClusterPeer(DomainKeys.Agm, peer)) {\n        actions = actions.concat([broadcast(peerToAddress(nodeId(state.ids), peerId), {\n            ...request,\n            type: 'leave'\n        })]);\n    }\n    return [newState, actions];\n}\n\nfunction leave(state: State, source: Source, request: DomainLeave) {\n    if (isRemoteSource(source)) {\n        return remoteLeave(state, source, request);\n    }\n    return localLeave(state, source, request);\n}\n\n/* Source has disconnected from the system */\nexport function sourceRemoved(state: State, source: Source, request): HandleReturnType {\n    if (log.enabledFor('debug')) {\n        log.debug(`removing source ${JSON.stringify(source)} from agm domain`);\n    }\n    const affected = bySourceInDomain(state, source, DomainKeys.Agm);\n    const stateWithoutAffected = affected\n        .map(p => p.id)\n        .reduce((s, peerId) => {\n            return leaveDomain(s, peerId, DomainKeys.Agm);\n        }, state);\n    const r: HandleReturnType = affected.reduce(([s, m], peer) => {\n        const [ns, nm] = removePeer(s, peer, reasonPeerRemoved);\n        return [ns, m.concat(nm)];\n    }, [stateWithoutAffected, []] as HandleReturnType);\n    if (log.enabledFor('debug')) {\n        log.debug(`removed source ${JSON.stringify(source)} from agm domain`);\n    }\n    return r;\n}\n\n/**\n * Handles an error that is coming as a response to either an invocation on subscription.\n *\n *   Returns [<new state> <messages>]\n */\nexport function handleError(state: State, source: Source, request): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId} = request;\n    byIdThrows(state, peerId);\n    const response = completeInvocation(state, requestId, peerId, request, {failure: request});\n    if (response) {\n        return response;\n    }\n    return dropInterest(state, source, request, true);\n}\n\nfunction handleRequest(state: State, source: Source, request: IOGateway.Message<AgmIncomingType | DomainType | CommandType>, options?: AgmDomainOptions): HandleReturnType {\n\n    switch (request.type) {\n        case 'domain/join': {\n            return forwardJoin(state, source, request as DomainJoin, options)\n        }\n        case 'domain/leave': {\n            return leave(state, source, request as DomainLeave);\n        }\n        case 'register': {\n            return forwardRegister(state, source, request as Register, options);\n        }\n        case 'unregister': {\n            return forwardUnregister(state, source, request as Unregister);\n        }\n        case 'call': {\n            return forwardCall(state, source, request as Call);\n        }\n        case 'yield': {\n            return forwardYield(state, source, request as Yield);\n        }\n        case 'subscribe': {\n            return forwardSubscribe(state, source, request as Subscribe);\n        }\n        case 'unsubscribe': {\n            return forwardUnsubscribe(state, source, request as Unsubscribe);\n        }\n        case 'drop-subscription': {\n            return dropInterest(state, source, request as DropSubscription, false);\n        }\n        case 'accepted': {\n            return forwardAccepted(state, source, request as Accepted);\n        }\n        case 'publish': {\n            return forwardPublish(state, source, request as Publish);\n        }\n        case 'post': {\n            return forwardPost(state, source, request as Post);\n        }\n        case 'error': {\n            return handleError(state, source, request);\n        }\n        case 'commands/source-removed': {\n            return sourceRemoved(state, source, request);\n        }\n        default: {\n            log.error(`Unhandled message ${JSON.stringify(request)}`);\n            return [state, [error(agmDomainUri, source, request['request_id'] ?? -1, request['peer_id'], reason(agmUnhandledMessage, `Unhandled message ${JSON.stringify(request)}`))]]\n        }\n    }\n}\n\nclass AgmDomain implements Domain<AgmIncomingType> {\n    constructor(private readonly options?: AgmDomainOptions) {}\n    info(): DomainInfo {\n        return {uri: agmDomainUri, description: '', version: 1};\n    }\n\n    init(state) {\n        return state;\n    }\n\n    destroy(state: State) {\n        return state;\n    }\n\n    handleMessage(state: State, request: NodeMessage<CommandType | DomainType | AgmIncomingType>): HandleReturnType {\n        const {source, body} = request;\n        try {\n            return handleRequest(state, source, body, this.options);\n        } catch (e) {\n            if (isLocalSource(source)) {\n                return [state, [error(agmDomainUri, source, body['request_id'], body['peer_id'], exceptionToReason(e, agmFailure))]]\n            }\n            return [state, []];\n        }\n    }\n\n    stateToMessages(state: State): StateToMessagesReturnType {\n        const nodeId = state.ids.nodeId;\n        const receiver = undefined as unknown as Source;\n        const result = peersInDomain(state, DomainKeys.Agm)\n            .filter(peer => isLocalSource(peer.source) && isClusterPeer(DomainKeys.Agm, peer))\n            .flatMap(peer => {\n                const peerId = peer.id;\n                const methods = Object.values(peer[DomainKeys.Agm].methods?.[peerId] ?? {})\n                    .filter(remoteMethodsFilter(peer, this.options?.defaultMethodRestrictions));\n                const messages: IOGateway.Message<'join' | 'register'>[] = [\n                    gJoin(undefined, peerId, peer[DomainKeys.Agm].restrictions, agmDomainUri, peer.identity, peer.options),\n                    register(undefined, peerId, methods)\n                ];\n                return messages.map(msg => unicast(peerToAddress(nodeId, peerId), receiver, msg));\n            });\n\n        return result;\n    }\n}\nexport type AgmDomainOptions = {\n    defaultPeerRestrictions?: OriginType;\n    defaultMethodRestrictions?: (this: Identity, name?: string) => OriginType | undefined;\n}\nexport function agmDomain(options?: AgmDomainOptions): AgmDomain {\n    return new AgmDomain(options);\n}\n", "import {DomainKeys, Peer, State} from '../../state/types/state.js';\nimport * as agm from '../../state/types/agm.js';\nimport {AgmDomain, Invocation, InvocationId} from '../../state/types/agm.js';\nimport {PeerId, RequestId, Source} from '../../state/types/common.js';\nimport {error, isLocalSource, isRemoteSource, unicast} from '../../common/messages.js';\nimport {agmDomainUri, agmInvocationFailure} from './constants.js';\nimport {reason, requestToReason} from '../../reason.js';\nimport {byId, byIdInDomain, byIdInDomainThrows, isLocalPeer, setPeer, updatePeer} from '../../state/peers.js';\nimport {Draft, produce} from 'immer';\nimport {HandleReturnType} from '../../domain.js';\nimport * as msg from './messages.js';\nimport {nodeToAddress, peerToAddress} from '../../address.js';\nimport {nodeId, requestId} from '../../common/ids.js';\nimport {CallRequest, RemoteCallRequest, YieldRequest} from './types/requests.js';\nimport {validate} from './utilities.js';\nimport {Call} from './types/messages.js';\nimport {DomainMessage} from '../../node.js';\n\n\n/**\n * Records and generates a method invocation.\n *\n *   If the callee is local - direct invocation message. Otherwise, we'll broadcast the call request and it\n *   will be processed by the node that owns the callee peer\n */\nfunction invoke(state: State, request: RemoteCallRequest, callee: Peer): HandleReturnType {\n    const {\n        request_id: requestId,\n        peer_id: peerId,\n        server_id: serverId,\n        invocation_id: invocationId,\n        method_id: methodId,\n        arguments: args,\n        arguments_kv: argsKv,\n        context\n    } = request;\n    callee = produce(callee, (c) => {\n        const d: Draft<agm.AgmDomain> = c[DomainKeys.Agm]!;\n        d.invocations = d.invocations || {};\n        d.invocations[invocationId] = {caller: peerId, method_id: methodId, request_id: requestId};\n    });\n    const isRemoteCallee = !isLocalPeer(callee);\n    return [\n        setPeer(state, serverId, callee),\n        isRemoteCallee\n            ? [unicast(peerToAddress(nodeId(state.ids), peerId), nodeToAddress(callee.source['node']), {domain: agmDomainUri, type: 'call', ...request} as Call)]\n            : [msg.invoke(callee.source, invocationId, serverId, methodId, peerId, args, argsKv, context)]];\n}\n\nfunction call(state: State, request: CallRequest, invocationId: string, callee: Peer, caller: Peer): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, server_id: serverId, method_id: methodId} = request;\n    // todo large msg\n    // todo log action\n\n\n    caller = produce(caller, (c) => {\n        const d: Draft<AgmDomain> = c[DomainKeys.Agm]!;\n        d.calls = d.calls || {};\n        d.calls[requestId] = {callee: serverId, method_id: methodId, invocation_id: invocationId};\n    });\n\n    // todo feature metric\n\n    return invoke(\n        setPeer(state, peerId, caller),\n        {...request, invocation_id: invocationId},\n        peerId === serverId ? caller : callee);\n}\n\n/**\n * Processes a remote call request. Ignored if the callee is not owned by this node\n */\nfunction remoteCall(state: State, source: Source, request: RemoteCallRequest) : HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, server_id: serverId, invocation_id: invocationId} = request;\n    const callee = byIdInDomain(state, serverId, DomainKeys.Agm);\n    if (isLocalPeer(callee)) {\n        return call(state, request, invocationId, callee!, byIdInDomainThrows(state, peerId, DomainKeys.Agm));\n    }\n    return [state, []];\n}\n\n/**\n * Processes a local call request\n */\nfunction localCall(state: State, source: Source, request: CallRequest): HandleReturnType {\n    const {peer_id: peerId, server_id: serverId} = request;\n    const callee = byIdInDomainThrows(state, serverId, DomainKeys.Agm);\n    const caller = byIdInDomainThrows(state, peerId, DomainKeys.Agm);\n    const [newIds, invocationId] = requestId(state.ids);\n    validate(caller, callee, request);\n    return call({...state, ids: newIds}, request, invocationId, callee, caller)\n}\n\nexport function forwardCall(state: State, source: Source, request: CallRequest | (RemoteCallRequest & DomainMessage)): HandleReturnType {\n    return isRemoteSource(source) ? remoteCall(state, source, request as (RemoteCallRequest & DomainMessage)) : localCall(state, source, request);\n}\n\n/* Cancels any pending invocations made by caller-id to callee-id. Returns a [state [message]]*/\nexport function cancelInvocations(state: State, receiver, caller: Peer, callee: Peer): HandleReturnType {\n    const calleeId = callee.id;\n    const [removed, remaining] = Object.entries(caller[DomainKeys.Agm]?.calls ?? {}).reduce(([removedAgg, remainingAgg], [requestId, call]) => {\n        (call.callee === calleeId ? removedAgg : remainingAgg).push([requestId, call]);\n        return [removedAgg, remainingAgg];\n    }, [new Array<[RequestId, agm.Call]>(), new Array<[RequestId, agm.Call]>()]);\n\n    function errorFn([requestId, ]:[string, agm.Call]) {\n        return error(agmDomainUri, receiver, requestId, caller.id, reason(agmInvocationFailure, 'Peer has left while waiting for result'))\n    }\n\n    if (removed.length > 0) {\n\n        return [updatePeer(state, caller.id, (p: Draft<Peer>) => {\n            const domain = p[DomainKeys.Agm]!;\n            if (remaining.length > 0) {\n                domain.calls = remaining.reduce((agg, [requestId, call]) => {\n                    agg = produce(agg, (a: Draft<agm.Calls>) => {\n                        a[requestId] = call;\n                    });\n                    return agg;\n                }, {} as agm.Calls);\n            } else {\n                delete domain.calls;\n            }\n        }), isLocalPeer(caller) ? removed.map(errorFn) : []];\n    } else {\n        return [state, []];\n    }\n}\n\nfunction completeCall(state: State, calleeId: PeerId, invocation: Invocation, request, successFailure: { success?: { result }, failure? }): HandleReturnType {\n    const {request_id: requestId, caller: callerId, method_id: methodId} = invocation;\n    let caller = byId(state, callerId);\n    if (caller) {\n        caller = produce(caller, (c) => {\n            if (c[DomainKeys.Agm]) {\n                if (c[DomainKeys.Agm].calls) {\n                    delete c[DomainKeys.Agm].calls[requestId];\n                    if (Object.keys(c[DomainKeys.Agm].calls).length === 0) {\n                        delete c[DomainKeys.Agm].calls;\n                    }\n                }\n            }\n        });\n    }\n    if (caller) {\n        state = setPeer(state, callerId, caller);\n        const callee = byId(state, calleeId);\n        const method = callee?.[DomainKeys.Agm]?.methods?.[calleeId][methodId];\n        const success = successFailure.success;\n        const failure = successFailure.failure;\n        if (isLocalPeer(caller)) {\n            if (success) {\n                // todo features\n                // todo large msg\n                // todo log action\n                return [state, [msg.result(caller.source, requestId, callerId, success.result)]]\n            } else {\n                // todo features\n                // todo log action\n                return [state, [error(agmDomainUri, caller.source, requestId, callerId, requestToReason(failure), failure.context)]];\n            }\n        } else {\n            return [state, [unicast(peerToAddress(nodeId(state.ids), calleeId), nodeToAddress(caller.source['node']), request)]];\n        }\n    }\n    return [state, []];\n}\n\n/*Removes the call/invocation information from the caller and the callee.*/\nexport function completeInvocation(state: State, invocationId: InvocationId, peerId, request, successFailure): HandleReturnType | undefined {\n    const callee = byId(state, peerId);\n    const invocation: Invocation | undefined = callee?.[DomainKeys.Agm]?.invocations?.[invocationId];\n    if (invocation) {\n        state = setPeer(state, peerId, produce(callee!, (p: Draft<Peer>) => {\n            if (p[DomainKeys.Agm]?.invocations) {\n                delete p[DomainKeys.Agm].invocations[invocationId];\n                if (Object.keys(p[DomainKeys.Agm].invocations).length === 0) {\n                    delete p[DomainKeys.Agm].invocations;\n                }\n            }\n        }));\n        return completeCall(state, peerId, invocation, request, successFailure);\n    }\n}\n\nfunction completeYield(state: State, source, request: YieldRequest): HandleReturnType {\n    const {invocation_id: invocationId, peer_id: peerId} = request;\n    byIdInDomainThrows(state, peerId, DomainKeys.Agm);\n    return completeInvocation(state, invocationId, peerId, request, {success: request}) ?? [state, []];\n}\n\nfunction remoteYield(state, source, request): HandleReturnType {\n    return completeYield(state, source, request);\n}\n\nfunction localYield(state, source, request): HandleReturnType {\n    return completeYield(state, source, request);\n}\n\nexport function forwardYield(state: State, source, request: YieldRequest): HandleReturnType {\n    return isLocalSource(source) ? localYield(state, source, request) : remoteYield(state, source, request);\n}\n", "import {reason} from '../../reason.js';\n\nexport const activityDomainUri = 'activity';\n\nexport const failure = `${activityDomainUri}.errors.failure`;\n\nexport const activityRegistrationFailure = `${activityDomainUri}.errors.registration.failure`;\nexport const activityMissingFactory = `${activityDomainUri}.errors.missing_factory`;\nexport const activityFactoryAlreadyRegistered = `${activityDomainUri}.errors.factory_already_registered`;\nexport const activityOwnerCreationFailed = `${activityDomainUri}.errors.owner_creation`;\nexport const activityMissingActivityType = `${activityDomainUri}.errors.missing_type`;\nexport const activityInvalid = `${activityDomainUri}.errors.invalid_activity`;\nexport const activityIsChild = `${activityDomainUri}.errors.activity_is_child`;\nexport const activityInvalidPeer = `${activityDomainUri}.errors.invalid_peer`;\nexport const activityNotAuthorized = `${activityDomainUri}.errors.not_authorized`;\nexport const activityUnhandledMessage = `${activityDomainUri}.errors.unhandled_message`;\n\nexport const reasonPeerRemoved = reason(`${activityDomainUri}.peer-removed`, \"Peer has been removed\");\nexport const reasonActivityDestroyed = reason(`${activityDomainUri}.destroyed`, \"Activity destroyed\");\n", "import {Domain, HandleReturnType, StateToMessagesReturnType} from '../../domain.js';\nimport {DomainInfo} from '../../state/types/domain-registry.js';\nimport {activityDomainUri, activityUnhandledMessage, failure, reasonPeerRemoved} from './constants.js';\nimport {DomainKeys, Peer, State} from '../../state/types/state.js';\nimport {getLogger} from '../../logger.js';\nimport * as rst from '../../restrictions.js';\nimport {error, isLocalSource, success} from '../../common/messages.js';\nimport {exceptionToReason, Reason, reason, requestToReason} from '../../reason.js';\nimport * as activity from '../../state/types/activity.js';\nimport {\n    inDomain,\n    joinDomain,\n    leaveDomain as stateLeaveDomain,\n    removeGatewayRequest,\n    threadStateAndActions\n} from '../../state/core.js';\nimport {\n    ActivityIncomingType,\n    CommandType,\n    DomainType,\n    MessageType,\n    NodeMessage,\n    SendMessageAction\n} from '../../node.js';\nimport {\n    announcePeer,\n    byIdInDomainThrows,\n    byIdThrows,\n    bySourceInDomain,\n    JoinedPeer,\n    leaveDomain,\n    setPeer\n} from '../../state/peers.js';\nimport {Draft, produce} from 'immer';\nimport * as activities from './activities.js';\nimport * as factories from './factories.js';\nimport {PeerMessage, RequestMessage} from '../../common/types/messages.js';\nimport {forwardUpdate} from '../../common/context/ops.js';\nimport {\n    ActivityError,\n    AddPeerFactories,\n    AddTypes,\n    CreateActivity,\n    CreatePeer,\n    DestroyActivity,\n    JoinActivity,\n    Ready,\n    RemovePeerFactories,\n    Subscribe,\n    Unsubscribe\n} from './types/messages.js';\nimport {DomainJoin, DomainLeave} from '../global/types/messages.js';\nimport {UpdateContext} from '../../common/context/types/messages.js';\nimport {Source} from '../../state/types/common.js';\nimport {PartialBy} from '../../common/utilities.js';\nimport {IOGateway} from '../../../gateway';\n\nconst log = getLogger('gateway.domains.activity');\n\nexport function handleError(state: State, source: Source, request: RequestMessage & {reason: string, reason_uri: string}): HandleReturnType {\n    const {state: stateWithoutR, removed: gatewayR} = removeGatewayRequest(state, request.request_id);\n    if (gatewayR) {\n        const type = gatewayR.type;\n        switch (type) {\n            case 'activity': {\n                const activity = gatewayR.activity;\n                if (activity) {\n                    return activities.handleError(stateWithoutR, activity);\n                }\n                break;\n            }\n            case 'create-peer': {\n                return factories.handleCreatePeerError(stateWithoutR, requestToReason(request), gatewayR.clientRequest, gatewayR);\n            }\n            default: {\n                log.error('Unable to handle error for an unknown incoming request type ' + type);\n                break;\n            }\n        }\n    }\n    return [state, []];\n}\n\n\n/*Handles the case where a peer has joined in a response of a gateway request*/\nfunction joinGwRequest(state: State, peer?: Peer): State {\n    const creationRequest = peer?.creationRequest;\n    if (creationRequest) {\n        const {peer_name: peerName, peer_type: peerType} = creationRequest;\n        peer = produce(peer!, (d: Draft<Peer>) => {\n            if (peerName) {\n                d.peerName = peerName;\n            }\n            if (peerType) {\n                d.peerType = peerType;\n            }\n        });\n        switch (creationRequest.type) {\n            case 'activity': {\n                return activities.activityMemberJoined(state, creationRequest.activity?.id, peer, creationRequest);\n            }\n            case 'create-peer': {\n                return setPeer(state, peer.id, peer);\n            }\n        }\n    }\n    return state;\n}\n\n/*Peer is joining the domain.*/\nexport function forwardJoin(state: State, source: Source, request: PartialBy<DomainJoin, 'type' | 'destination'>): HandleReturnType {\n\n    const {request_id: requestId, peer_id: peerId, restrictions} = request;\n    if (inDomain(state, peerId, activity.activityDomain)) {\n        // peer already in the domain\n        return [state, [success(activityDomainUri, source, requestId, peerId)]];\n    }\n    // join it in\n    const parsedRestrictions = rst.parse(restrictions);\n    state = joinDomain(state, peerId, activity.activityDomain, parsedRestrictions);\n\n    // todo do we throw here?\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Activity);\n\n    state = joinGwRequest(state, peer);\n    let messages = new Array<SendMessageAction<MessageType>>;\n    messages = messages.concat(announcePeer(activityDomainUri, activity.activityDomain, state, source, peer));\n    messages = messages.concat(activities.announceTypes(state, peer));\n    messages = messages.concat(factories.announceExisting(state, peer));\n    // messages = messages.concat(activities.announceExisting(state, peer));\n    messages = messages.concat([success(activityDomainUri, source, requestId, peerId)]);\n    return [state, messages];\n\n}\n\n/**\n * Peer is leaving the domain - deal with activities and factories\n */\nfunction removePeer(state: State, peer: JoinedPeer<DomainKeys.Activity>, reason: Reason, isSourceRemoved: boolean): HandleReturnType {\n    return threadStateAndActions(state,\n        (s) => activities.removePeer(s, peer, reason),\n        (s) => factories.removePeer(s, peer),\n        (s) => leaveDomain(activityDomainUri, activity.activityDomain, s, peer, reason, isSourceRemoved));\n}\n\nfunction forwardLeave(state: State, source: Source, request: DomainLeave): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId} = request;\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Activity);\n    return threadStateAndActions(state,\n        (s) => removePeer(s, peer, requestToReason(request), false),\n        (s) => [s, [success(activityDomainUri, source, requestId, peerId)]]);\n}\n\nexport function ready(state: State, source: Source, request: PeerMessage): HandleReturnType {\n    const peerId = request.peer_id;\n    const peer = byIdThrows(state, peerId);\n    const activityId = peer[activity.activityDomain]?.member;\n    if (activityId) {\n        return activities.peerReady(state, source, activityId, peer);\n    } else {\n        return factories.peerReady(state, peer);\n    }\n\n}\n/**\n * Source has disconnected from the system\n */\nexport function sourceRemoved(state: State, source: Source): HandleReturnType {\n    if (log.enabledFor('debug')) {\n       log.debug(`removing source ${JSON.stringify(source)} from activity domain`);\n    }\n    const affected = bySourceInDomain(state, source, activity.activityDomain);\n    const stateWithoutAffected = affected\n        .map(p => p.id)\n        .reduce((s, peerId) => {\n            return stateLeaveDomain(s, peerId, activity.activityDomain);\n        }, state);\n    const r: HandleReturnType = affected.reduce(([s, m], peer) => {\n        const [ns, nm] = removePeer(s, peer, reasonPeerRemoved, true);\n        return [ns, m.concat(nm)];\n    }, [stateWithoutAffected, []] as HandleReturnType);\n    if (log.enabledFor('debug')) {\n        log.debug(`removed source ${JSON.stringify(source)} from activity domain`);\n    }\n    return r;\n}\n\nexport function handleRequest(state: State, source: Source, request: IOGateway.Message<ActivityIncomingType | DomainType | CommandType>): HandleReturnType {\n    switch (request.type) {\n        case 'domain/join': {\n            return forwardJoin(state, source, request as DomainJoin);\n        }\n        case 'domain/leave': {\n            return forwardLeave(state, source, request as DomainLeave);\n        }\n        case 'ready': {\n            return ready(state, source, request as Ready);\n        }\n        case 'add-types': {\n            const {request_id: requestId, peer_id: peerId, types} = request as AddTypes;\n            return activities.addTypes(state, source, requestId, peerId, types);\n        }\n        case 'remove-types': {\n            return activities.removeTypes(state, source, request);\n        }\n        case 'create': {\n            // todo ttl\n            const {configuration, ...rq} = request as CreateActivity;\n            return activities.createActivity(state, source, rq, configuration)\n        }\n        case 'destroy': {\n            return activities.forwardDestroyActivity(state, source, request as DestroyActivity);\n        }\n        case 'subscribe': {\n            return activities.subscribe(state, source, request as Subscribe);\n        }\n        case 'unsubscribe': {\n            return activities.unsubscribe(state, source, request as Unsubscribe);\n        }\n        case 'join-activity': {\n            return activities.joinActivity(state, source, request as JoinActivity);\n        }\n        case 'add-peer-factories': {\n            return factories.add(state, source, request as AddPeerFactories);\n        }\n        case 'remove-peer-factories': {\n            return factories.removeFactories(state, source, request as RemovePeerFactories);\n        }\n        case 'create-peer': {\n            // todo ttl\n            return factories.create(state, source, request as CreatePeer);\n        }\n        case 'error': {\n            return handleError(state, source, request as ActivityError);\n        }\n        case 'update-context': {\n            return forwardUpdate(activityDomainUri, state, source, request as UpdateContext);\n        }\n        case 'commands/source-removed': {\n            return sourceRemoved(state, source);\n        }\n        default: {\n            log.error(`Unhandled message ${JSON.stringify(request)}`);\n            return [state, [error(activityDomainUri, source, request['request_id'] ?? -1, request['peer_id'], reason(activityUnhandledMessage, `Unhandled message ${JSON.stringify(request)}`))]]\n        }\n    }\n}\n\nclass ActivityDomain implements Domain<ActivityIncomingType> {\n    info(): DomainInfo {\n        return {\n            uri: activityDomainUri,\n            description: '',\n            version: 2\n        };\n    }\n\n    init(state: State): State {\n        return state;\n    }\n\n    destroy(state: State): State {\n        return state;\n    }\n\n    handleMessage(state: State, request: NodeMessage<CommandType | DomainType | ActivityIncomingType>): HandleReturnType {\n        const {source, body} = request;\n        try {\n            return handleRequest(state, source, body);\n        } catch (e) {\n            if (isLocalSource(source)) {\n                return [state, [error(activityDomainUri, source, body['request_id'], body['peer_id'], exceptionToReason(e, failure))]]\n            } else {\n                return [state, []]\n            }\n        }\n    }\n\n    stateToMessages(state: State): StateToMessagesReturnType {\n        return [];\n    }\n\n}\n\nexport function activityDomain(): ActivityDomain {\n    return new ActivityDomain();\n}\n", "import {Immutable} from 'immer';\r\nimport {Factories} from './factory.js';\r\nimport {PeerId, Restrictions} from './common.js';\r\nimport {GwRequestId} from './pending-requests.js';\r\nimport {Context, ContextData} from './context.js';\r\nimport {DomainKeys} from './state.js';\r\nimport {PeerMessage, RequestMessage} from '../../common/types/messages.js';\r\n\r\n// export const activityDomain: unique symbol = Symbol(\"activity-domain\");\r\nexport const activityDomain = DomainKeys.Activity;\r\n\r\nexport type ActivityPeer = Immutable<{\r\n    type: string,\r\n    name?: string,\r\n    configuration?: object\r\n}>\r\n\r\nexport type ActivityType = Immutable<{\r\n    name: string,\r\n    owner_type: ActivityPeer\r\n    helper_types?: ActivityPeer[]\r\n    default_context?: ContextData\r\n    visibility?: Restrictions\r\n}>\r\n\r\nexport type ActivityChild = Immutable<{\r\n    type: string,\r\n    context: Context,\r\n    owner: PeerId,\r\n    participants?: Set<PeerId>\r\n    properties?: unknown\r\n    children?: ActivityChildren\r\n}>;\r\nexport type ActivityId = string;\r\nexport type ActivityChildren = { [id: ActivityId]: ActivityChild };\r\nexport type Activity = Immutable<{\r\n    // the activity id generated by the gateway\r\n    id: ActivityId,\r\n    // the activity type\r\n    type: string,\r\n    // activity's own context\r\n    contextId: string,\r\n    // id of the peer that has created it\r\n    initiator: PeerId\r\n    // flag signaling if the activity is ready (i.e. owner is ready)\r\n    'ready?'?: boolean\r\n    // owner peer id\r\n    owner?: PeerId\r\n    //collection of participant ids\r\n    participants?: Set<PeerId>\r\n    //collection of ready members of the activity. once a member becomes ready, its moved from the participants collection here\r\n    readyMembers?: Set<PeerId>\r\n    // collection of activities that are direct children\r\n    children?: ActivityChildren\r\n\r\n    gatewayRequests?: Set<GwRequestId>\r\n    reloading?: Set<string>\r\n    clientRequest?: PeerMessage & RequestMessage\r\n    read_permissions?: Restrictions\r\n    write_permissions?: Restrictions\r\n\r\n}>\r\n\r\nexport type ActivityDomain = Immutable<{\r\n    restrictions: Exclude<Restrictions, 'cluster'>\r\n    factories?: Factories,\r\n    member?: ActivityId\r\n    owner?\r\n    reload?: boolean\r\n}>\r\n", "import {PeerTypeFactories, State} from '../../state/types/state.js';\nimport {PeerType} from '../../state/types/factory.js';\nimport {PeerId} from '../../state/types/common.js';\nimport {castDraft, Draft, produce} from 'immer';\nimport {removev} from '../../common/utilities.js';\nimport {throwReason} from '../../reason.js';\nimport {activityInvalid} from './constants.js';\nimport {Activity, ActivityId, ActivityType} from '../../state/types/activity.js';\n\n\nexport function addFactories(state: State, factoryTypes: PeerType[], peerId: PeerId): State {\n    return factoryTypes.reduce((s: State, ft: PeerType) => {\n        return produce(s, (d: Draft<State>) => {\n            if (!d.factories) {\n                d.factories = {};\n            }\n            if (!d.factories[ft]) {\n                d.factories[ft] = [];\n            }\n            d.factories[ft].push(peerId);\n        });\n    }, state);\n}\n\n\nexport function removeFactories(state: State, factoryTypes: PeerType[], peerId: PeerId): State {\n    if (factoryTypes.length > 0 && peerId) {\n        return factoryTypes.reduce((s: State, ft: PeerType) => {\n            return produce(s, (draft: Draft<State>) => {\n                if (draft.factories) {\n                    draft.factories[ft] = removev(peerId, draft.factories[ft]);\n                    if (draft.factories[ft].length == 0) {\n                        delete draft.factories[ft];\n                    }\n                    if (Object.keys(draft.factories).length === 0) {\n                        delete draft.factories;\n                    }\n                }\n            });\n        }, state);\n\n    }\n    return state;\n}\n\nexport function factories(state: State): PeerTypeFactories | undefined {\n    return state.factories;\n}\n\nexport function factoriesByType(state: State, peerType: PeerType): ReadonlyArray<PeerId> | undefined {\n    return state.factories?.[peerType];\n}\n\n// activities\nexport function activity(state: State, activityId?: ActivityId): Activity | undefined {\n    if (activityId) {\n        return state.activities?.[activityId];\n    }\n}\n\nexport function setActivity(state: State, activityId: string | undefined, activity): State {\n    if (activityId) {\n        return produce(state, (draft: Draft<State>) => {\n            draft.activities = draft.activities || {};\n            draft.activities[activityId] = activity;\n        });\n    }\n    return state;\n}\n\nexport function removeActivity(state: State, activityId: string): State {\n    return produce(state, (draft: Draft<State>) => {\n        if (draft.activities) {\n            delete draft.activities[activityId];\n            if (Object.keys(draft.activities).length === 0) {\n                delete draft.activities;\n            }\n        }\n    });\n}\n\nexport function activities(state: State): Activity[] {\n    return Object.values<Activity>(state.activities ?? {});\n}\n\n// activity types\n\nexport function activityTypes(state: State, user?: string): { [type: string]: ActivityType } | undefined {\n    if (user) {\n        return state.activityTypes?.[user];\n    }\n}\n\nexport function addActivityTypes(state: State, user: string, types: ActivityType[]): State {\n    return types.reduce((s: State, type) => {\n        return produce(s, (draft: Draft<State>) => {\n            draft.activityTypes = draft.activityTypes || {};\n            draft.activityTypes[user] = draft.activityTypes[user] || {};\n            draft.activityTypes[user][type.name] = castDraft(type);\n        });\n    }, state);\n}\n\nexport function removeActivityTypes(state: State, user: string, typesNames: string[]): State {\n    return Array.from(typesNames).reduce((s: State, typeName: string) => {\n        return produce(s, (draft: Draft<State>) => {\n            if (draft.activityTypes) {\n                if (draft.activityTypes[user]) {\n                    delete draft.activityTypes[user][typeName];\n                    if (Object.keys(draft.activityTypes[user]).length === 0) {\n                        delete draft.activityTypes[user];\n                    }\n                }\n                if (Object.keys(draft.activityTypes).length === 0) {\n                    delete draft.activityTypes;\n                }\n            }\n        });\n    }, state);\n}\n\n\n/**\n * Returns a list of ids for the peers that have subscribed for a given activity type\n */\nexport function activitySubscribers(state: State, activityType: string) {\n    const result = new Set<PeerId>();\n    state.activitySubscribers?.byType?.[activityType].forEach(result.add);\n    state.activitySubscribers?.all?.forEach(result.add);\n    return result;\n}\n\nexport function addActivitySubscriber(state: State, peerId: PeerId, activityType: true | string): State {\n    return produce(state, (draft: Draft<State>) => {\n        draft.activitySubscribers = draft.activitySubscribers || {};\n        if (activityType === true) { // all\n            draft.activitySubscribers.all = draft.activitySubscribers.all || new Set<PeerId>();\n            draft.activitySubscribers.all.add(peerId);\n        } else {\n            draft.activitySubscribers.byType = draft.activitySubscribers.byType || {};\n            draft.activitySubscribers.byType[activityType] = draft.activitySubscribers.byType[activityType] || new Set<PeerId>();\n            draft.activitySubscribers.byType[activityType].add(peerId);\n        }\n    });\n}\n\nexport function removeActivitySubscriber(state: State, peerId: PeerId, activityType: true | string): State {\n    return produce(state, (draft: Draft<State>) => {\n        if (draft.activitySubscribers) {\n            if (activityType === true) { // all\n                if (draft.activitySubscribers.all) {\n                    draft.activitySubscribers.all.delete(peerId);\n                    if (draft.activitySubscribers.all.size === 0) {\n                        delete draft.activitySubscribers.all;\n                    }\n                }\n            } else {\n                if (draft.activitySubscribers.byType) {\n                    if (draft.activitySubscribers.byType[activityType]) {\n                        draft.activitySubscribers.byType[activityType].delete(peerId);\n                        if (draft.activitySubscribers.byType[activityType].size === 0) {\n                            delete draft.activitySubscribers.byType[activityType];\n                        }\n                    }\n                    if (Object.keys(draft.activitySubscribers.byType).length === 0) {\n                        delete draft.activitySubscribers.byType;\n                    }\n                }\n            }\n            if (Object.keys(draft.activitySubscribers).length === 0) {\n                delete draft.activitySubscribers;\n            }\n        }\n    });\n}\n\n\nexport function activityThrows(state: State, activityId: ActivityId): Activity  | never {\n    const a = activity(state, activityId);\n    if (a) {\n        return a;\n    }\n    throwReason(activityInvalid, `Unable to find activity with id ${activityId}`);\n}\n\n/**\n * Retrieves an activity with a given id, throwing an exception if missing\n */\nexport function activityMaybeThrows(state: State, activityId?: ActivityId): Activity | undefined | never {\n    if (activityId) {\n        return activityThrows(state, activityId);\n    }\n}\n\n", "import {DomainKeys, Peer, State} from '../../state/types/state.js';\nimport {GatewayRequest, GwRequestId} from '../../state/types/pending-requests.js';\nimport {HandleReturnType} from '../../domain.js';\nimport * as activityState from './state.js'\nimport {activityThrows, setActivity} from './state.js'\nimport * as contextState from './../../common/context/state.js'\nimport {addContext, contextById, newVersion, toCtx} from '../../common/context/state.js'\nimport {castDraft, Draft, Immutable, produce} from 'immer';\nimport {byId, byIdInDomainThrows, byIdThrows, isPeerVisibleIdentity, peersInDomain, setPeer} from '../../state/peers.js';\nimport {Activity, activityDomain, ActivityPeer, ActivityType} from '../../state/types/activity.js';\nimport {PeerId, Source} from '../../state/types/common.js';\nimport {reason, Reason, requestToReason, throwReason} from '../../reason.js';\nimport {getLogger} from '../../logger.js';\nimport {CommandType, MessageType, SendMessageAction} from '../../node.js';\nimport {removeGatewayRequest, threadStateAndActions} from '../../state/core.js';\nimport {\n    activityCreated,\n    activityInitiated,\n    activityJoined,\n    activityLeft,\n    activityTypesAdded,\n    activityTypesRemoved,\n    disposePeer,\n    error,\n    joinedActivity,\n    ownerChanged,\n    success\n} from './messages.js';\nimport {\n    activityIsChild,\n    activityMissingActivityType,\n    activityNotAuthorized,\n    activityOwnerCreationFailed,\n    activityRegistrationFailure,\n    reasonActivityDestroyed\n} from './constants.js';\nimport {\n    CreateActivityRequest,\n    DestroyRequest,\n    JoinActivityRequest,\n    SubscribeRequest,\n    UnsubscribeRequest\n} from './types/requests.js';\nimport {createActivityPeer} from './factories.js';\nimport {Context} from '../../state/types/context.js';\nimport {activityId, contextId} from '../../common/ids.js';\nimport {parse} from '../../restrictions.js';\n\nconst log = getLogger('gateway.domains.activity.activities');\n\nexport function requestToActivity(state: State, request: CreateActivityRequest, peer: Peer): [State, Activity, Context] {\n    const [idsAfterContext, ctxId] = contextId(state.ids);\n    const rp = parse(request.read_permissions);\n    const wp = parse(request.write_permissions);\n    const context = toCtx(peer, ctxId, request.initial_context, 'activity', rp, wp, ctxId, newVersion());\n    const [idsAfterActivity, actId] = activityId(idsAfterContext);\n    const activity = {id: actId, type: request.activity_type, contextId: ctxId, initiator: request.peer_id};\n\n    activity['client_request'] = request;\n    return [{...state, ids: idsAfterActivity}, activity, context];\n\n}\n\n\n/**\n * Handles the case where a joining peer should be part of an activity.\n\n - joins the peer to the context\n - associates the peer with the activity and sets as owner if needed\n\n */\nexport function activityMemberJoined(state: State, activityId: string | undefined, peer: Peer, gwRequest: GatewayRequest): State {\n    const activity = activityState.activity(state, activityId);\n    if (activity) {\n        const peerId = peer.id;\n        const isOwner = gwRequest.activity?.['owner?'];\n        const context = contextState.contextById(state, activity.contextId);\n        state = activityState.setActivity(state, activity.id, produce(activity, (draft: Draft<Activity>) => {\n            if (!draft.participants) {\n                draft.participants = new Set<PeerId>();\n            }\n            draft.participants.add(peerId)\n            if (isOwner) {\n                draft.owner = peer.id;\n            }\n            if (draft.gatewayRequests) {\n                draft.gatewayRequests.delete(gwRequest.id);\n                if (draft.gatewayRequests.size === 0) {\n                    delete draft.gatewayRequests;\n                }\n            }\n        }));\n        state = setPeer(state, peerId, produce(peer, (draft: Draft<Peer>) => {\n            draft[DomainKeys.Activity]!.member = activity.id;\n            draft[DomainKeys.Activity]!.reload = gwRequest.reload;\n        }));\n        state = contextState.addContextMember(state, context, peerId);\n    }\n    return state;\n}\n\nfunction broadcastAddTypes(state: State, user: string, types: ActivityType[]): SendMessageAction<'types-added'>[] {\n    return peersInDomain(state, activityDomain)\n        .filter(peer => peer.identity.user === user)\n        .map(peer => activityTypesAdded(peer.source, peer.id, types));\n}\n\nfunction broadcastRemoveTypes(state: State, user: string, types: string[]): SendMessageAction<'types-removed'>[] {\n    return peersInDomain(state, activityDomain)\n        .filter(peer => peer.identity.user === user)\n        .map(peer => activityTypesRemoved(peer.source, peer.id, types));\n}\n\nexport function addTypes(state: State, source: Source, requestId: string, peerId: PeerId, types: ActivityType[]): HandleReturnType {\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Activity);\n    const user = peer.identity.user;\n    if (user) {\n        let messages: SendMessageAction<MessageType>[] = broadcastAddTypes(state, user, types);\n        messages = messages.concat(success(source, requestId, peerId));\n        return [activityState.addActivityTypes(state, user, types), messages];\n    }\n    return [state, [error(source, requestId, peerId, reason(activityRegistrationFailure, `Registering peer is missing an user in its identity ${JSON.stringify(peer.identity)}`))]];\n}\n\nexport function removeTypes(state: State, source:Source, request): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, types} = request;\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Activity);\n    const user = peer.identity.user;\n    if (user) {\n        const typeNames = new Set<string>(types);\n        const actualTypes = Array.from<string>(new Set<string>(Object.keys(activityState.activityTypes(state, user)!).filter(typeName => typeNames.has(typeName))));\n        let messages: SendMessageAction<MessageType>[] = broadcastRemoveTypes(state, user, actualTypes);\n        messages = messages.concat(success(source, requestId, peerId))\n        return [activityState.removeActivityTypes(state, user, actualTypes), messages];\n    } else {\n        return [state, [error(source, requestId, peerId, reason(activityRegistrationFailure, `Removing peer is missing an user in its identity ${JSON.stringify(peer.identity)}`))]];\n    }\n}\n\nexport function announceTypes(state: State, peer: Peer): SendMessageAction<'types-added'>[] {\n\n    const activityTypes = activityState.activityTypes(state, peer.identity['user']);\n    if (activityTypes) {\n        // todo distinct??\n        const userTypes = Object.values<ActivityType>(activityTypes);\n        return [activityTypesAdded(peer.source, peer.id, userTypes)];\n    }\n    return [];\n}\n\nfunction activityTypeThrows(state: State, peer: Peer, typeName: string): ActivityType {\n    const at: ActivityType | undefined = activityState.activityTypes(state, peer.identity.user)?.[typeName];\n    if (!at) {\n        throwReason(activityMissingActivityType, `Unable to find activity type ${typeName}`);\n    }\n    return at;\n}\n\nfunction mergeConfig(activityPeer: ActivityPeer, configuration) {\n    const baseConfiguration = activityPeer.configuration;\n    // todo\n}\n\ntype CreateArgs = Immutable<{ state: State, activity: Activity, messages: Array<SendMessageAction<MessageType>> }>;\n\nfunction createOwner(ctx: CreateArgs, ownerType: ActivityPeer, creatorId: PeerId, context: Context, configuration): CreateArgs {\n    const {\n        state,\n        messages,\n        requestId\n    } = createActivityPeer(ctx.state, creatorId, ownerType, ctx.activity, context, true, mergeConfig(ownerType, configuration));\n    const result: CreateArgs = produce(ctx, (draft: Draft<CreateArgs>) => {\n        draft.state = castDraft(state);\n        draft.messages = draft.messages.concat(messages);\n        draft.activity.gatewayRequests = draft.activity.gatewayRequests || new Set<GwRequestId>();\n        draft.activity.gatewayRequests.add(requestId);\n    });\n    return result;\n}\n\nfunction createParticipants(ctx: CreateArgs, helperTypes: readonly ActivityPeer[] | undefined, creatorId: PeerId, context: Context, configuration): CreateArgs {\n    if (helperTypes) {\n        return helperTypes.reduce((xxx: CreateArgs, peerType: ActivityPeer) => {\n            const {\n                state,\n                messages,\n                requestId\n            } = createActivityPeer(xxx.state, creatorId, peerType, xxx.activity, context, false, mergeConfig(peerType, configuration))\n            const result: CreateArgs = produce(ctx, (draft: Draft<CreateArgs>) => {\n                draft.state = castDraft(state);\n                draft.messages = draft.messages.concat(messages);\n                draft.activity.gatewayRequests = draft.activity.gatewayRequests || new Set<GwRequestId>();\n                draft.activity.gatewayRequests.add(requestId);\n            });\n            return result;\n        }, ctx);\n    }\n    return ctx;\n}\n\nexport function createActivity(state: State, source: Source, request: Omit<CreateActivityRequest, 'configuration'>, cfg?: ReadonlyArray<ActivityPeer>): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId} = request;\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Activity);\n    const activityTypeName = request.activity_type;\n    const activityType: ActivityType = activityTypeThrows(state, peer, activityTypeName);\n    //the configuration is now keyed by the activity peer's type and name\n    const configuration: { [key: string]: object | null } = (cfg || [] as ActivityPeer[]).reduce((a, c) => {\n        const key = `[${c.type},${c.name ?? ''}]`;\n        a[key] = c.configuration ?? null;\n        return a;\n    }, {} as { [key: string]: object | null });\n    const typesOverride = request.types_override;\n    if (typesOverride && Object.keys(configuration).length !== 0) {\n        throwReason(activityIsChild, `Cannot specify types override and custom configuration at the same time`);\n    }\n\n    let ctx: Context;\n    let activity: Activity;\n    [state, activity, ctx] = requestToActivity(state, request, peer);\n    let messages: ReadonlyArray<SendMessageAction<MessageType>> = [activityInitiated(source, requestId, peerId, activity.id)];\n    let args: CreateArgs = {state, messages, activity}\n    args = createOwner(args, typesOverride?.owner_type ?? activityType.owner_type, peerId, ctx, configuration);\n    const helperTypes: readonly ActivityPeer[] | undefined = typesOverride?.helper_types ?? (activityType.helper_types);\n    args = createParticipants(args, helperTypes, peerId, ctx, configuration);\n\n    ({state, activity, messages} = args);\n\n    state = addContext(state, ctx);\n    state = setActivity(state, activity.id, activity);\n\n\n    return [state, messages];\n}\n\n/**\n * Sends a message to all peers in the activity domain that can see the activity and the activity participants\n */\nfunction broadcastOwnerChanged(state: State, activity: Activity, owner: Peer): SendMessageAction<'owner-changed'>[] {\n    if (activity[\"ready?\"]) {\n        // if the activity is ready (i.e. created message have been sent), we send a destroyed message\n        // either participants or peers that can see the activity\n        const ownerId = owner.id;\n        return broadcastTargets(state, ownerId, activity, owner, true)\n            .map(t => ownerChanged(t.source, t.id, activity.id, owner));\n    }\n    return []\n}\n\n/**\n * Processes a ready message from an activity owner. The activity becomes ready itself and messages for the\n currently ready members are broadcast. The activity created message is broadcast as well\n */\nfunction ownerReady(state: State, activity: Activity, peer: Peer): { state: State, messages: Array<SendMessageAction<MessageType>>, activity: Activity } {\n    const contextId = activity.contextId;\n    const contextData = contextById(state, contextId)?.data || {};\n    const ownerId = peer.id;\n    const isReloading = peer[activityDomain]?.reload;\n    activity = produce(activity, (draft: Draft<Activity>) => {\n        draft.owner = ownerId;\n        draft[\"ready?\"] = true;\n        delete draft.clientRequest;\n    });\n    let messages: SendMessageAction<MessageType>[] = [];\n    if (isReloading) {\n        messages = messages.concat(joinedActivity(state, peer.source, peer, activity, contextData));\n        messages = messages.concat(broadcastOwnerChanged(state, activity, peer));\n    } else {\n        messages = messages.concat(broadcastJoinedActivity(state, activity, contextData));\n        messages = messages.concat(broadcastActivityCreated(state, activity));\n    }\n    // returning a vector of the new state, the modified activity and the resulting messages\n    return {\n        state,\n        // mark it as ready\n        activity,\n\n        messages\n    }\n}\n\n/**\n * An activity can be seen by a peer in the activity domain that matches the read permissions. If there\n are no permissions set, the user of the peer must match the user of the activity owner\n */\nfunction seesActivity(activity: Activity, owner: Peer, peer: Peer): boolean {\n    const peerId = peer.id;\n    if (activity.readyMembers?.has(peerId) || activity.participants?.has(peerId) || activity.owner === peerId) {\n        // any activity members can actually see it\n        return true;\n    } else {\n        // the rest are subject to permissions\n        return isPeerVisibleIdentity([owner.source, owner.identity, activity.read_permissions, owner.options?.service], [peer.source, peer.identity, undefined, peer.options?.service]);\n    }\n}\n\n/**\n * Broadcasts a message that a participant has joined an activity that has already started. The message is sent to\n all that can see the activity minus the participant itself (it should receive joined-activity)\n */\nfunction broadcastActivityJoined(state: State, peer: Peer, activity: Activity, owner: Peer): SendMessageAction<'activity-joined'>[] {\n    const peerId = peer.id;\n    return broadcastTargets(state, peerId, activity, owner, true).map((p) => {\n        return activityJoined(p.source, p.id, peer, activity.id);\n    });\n}\n\n/**\n * Broadcasts a message that a participant has left the activity to everyone that can see it\n */\nfunction broadcastActivityLeft(state: State, peerId: PeerId, activity: Activity, reason: Reason, includeParticipants: boolean): SendMessageAction<'left'>[] {\n    const owner = byIdThrows(state, activity.owner);\n    return broadcastTargets(state, peerId, activity, owner, includeParticipants).map((p) => {\n        return activityLeft(p.source, p.id, peerId, activity.id, reason);\n    });\n}\n\n/**\n * An activity can be destroyed by any of its members, or peers that can have write permissions for it.\n */\nfunction canDestroy(state: State, activity: Activity, peer: Peer): boolean {\n    const peerId = peer.id;\n\n    if (activity.readyMembers?.has(peerId) || activity.participants?.has(peerId) || activity.owner === peerId) {\n        // any activity member\n        return true;\n    } else {\n        // the rest are subject to permissions\n        const owner = byId(state, activity.owner);\n        return isPeerVisibleIdentity([owner?.source, owner?.identity, activity.write_permissions, false], [peer.source, peer.identity, undefined, false]);\n    }\n}\n\n/**\n * Sends a message to all participants in the activity that are ready plus the owner itself\n */\nfunction broadcastJoinedActivity(state: State, activity: Activity, contextData): SendMessageAction<'joined'>[] {\n    const ownerId = activity.owner;\n    const readyMembers = activity.readyMembers;\n    return (ownerId ? [ownerId] : []).concat(Array.from<PeerId>(readyMembers || []))\n        .map(peerId => byId(state, peerId))\n        .filter((peer): peer is Peer => !!peer)\n        .map(peer => joinedActivity(state, peer.source, peer, activity, contextData));\n}\n\nfunction activityParticipants(state, activity: Activity, ownerId?: PeerId) {\n    const result = new Set<PeerId>();\n    if (ownerId) result.add(ownerId);\n    if (activity.participants) activity.participants.forEach(result.add);\n    if (activity.readyMembers) activity.readyMembers.forEach(result.add);\n    return result;\n}\n\n\nfunction broadcastTargets(state, peerId, activity: Activity, owner: Peer, includeParticipants): Peer[] {\n    const ids = new Set<PeerId>();\n    activityState.activitySubscribers(state, activity.type).forEach(ids.add);\n    if (includeParticipants) {\n        activityParticipants(state, activity, owner?.id);\n    }\n    ids.delete(peerId);\n    return Array.from(ids)\n        .map((id) => byId(state, id)).filter((p): p is Peer => !!p)\n        .filter((peer) => seesActivity(activity, owner, peer))\n}\n\n/**\n * Sends a message to all peers in the activity domain that are subscribed for that type of an activity\n */\nfunction broadcastActivityCreated(state: State, activity: Activity): SendMessageAction<'created'>[] {\n    const activityType = activity.type;\n    const owner = byId(state, activity.owner)!;\n    return Array.from(activityState.activitySubscribers(state, activityType))\n        .map(p => byId(state, p)).filter((p): p is Peer => !!p)\n        .filter(p => seesActivity(activity, owner, p))\n        .map(p => activityCreated(state, p.source, p.id, activity));\n}\n\n/**\n * Processes a ready message from an activity participant. If the activity is ready, we need to broadcast events\n that we've joined the activity. Otherwise just add the peer to the set of ready members\n */\nfunction participantReady(state: State, activity: Activity, peer: Peer): { state: State, messages: Array<SendMessageAction<MessageType>>, activity: Activity } {\n    const peerId = peer.id;\n    const contextId = activity.contextId;\n    const context = contextState.contextById(state, contextId);\n    activity = produce(activity, (draft: Draft<Activity>) => {\n        draft.readyMembers = draft.readyMembers || new Set<PeerId>();\n        draft.readyMembers.add(peerId);\n    });\n    let messages = new Array<SendMessageAction<MessageType>>();\n    if (activity[\"ready?\"]) {\n        const ownerId = activity.owner;\n        const owner = byIdThrows(state, ownerId);\n        messages = messages.concat(broadcastActivityJoined(state, peer, activity, owner));\n        messages = messages.concat(joinedActivity(state, peer.source, peer, activity, context?.data || {}));\n    }\n    return {state: contextState.addContextMember(state, context, peerId), activity, messages};\n}\n\nfunction cleanDomainInfo(peer: Peer): Peer {\n    return produce(peer, (draft: Draft<Peer>) => {\n        delete draft[activityDomain]?.member;\n        delete draft[activityDomain]?.owner;\n    });\n}\n\n/**\n * An activity member has sent a ready message\n */\nexport function peerReady(state: State, source, activityId, peer: Peer): HandleReturnType {\n    const peerId = peer.id;\n    let activity = activityState.activity(state, activityId);\n    if (activity) {\n        const isOwner = activity.owner === peerId;\n        activity = produce(activity, (draft: Draft<Activity>) => {\n            if (!isOwner) {\n                draft.readyMembers = draft.readyMembers || new Set<PeerId>();\n                draft.readyMembers.add(peerId);\n            }\n            draft.participants?.delete(peerId);\n            if (draft.participants?.size === 0) {\n                delete draft.participants;\n            }\n        });\n\n        const {\n            state: s,\n            activity: a,\n            messages: m\n        } = isOwner ? ownerReady(state, activity, peer) : participantReady(state, activity, peer);\n        return [activityState.setActivity(s, activityId, a), m];\n    }\n    // peer is ready for an activity that no longer exist - it should go away\n    return [setPeer(state, peerId, cleanDomainInfo(peer)), [disposePeer(source, peerId, undefined, reasonActivityDestroyed)]];\n}\n\nfunction destroyParticipants(state: State, participantIds: PeerId[], reason: Reason): HandleReturnType {\n    return participantIds.reduce(([s, m], pid) => {\n        const participant = byId(s, pid);\n        if (participant) {\n            return [setPeer(s, pid, cleanDomainInfo(participant)), m.concat(disposePeer(participant.source, pid, undefined, reason))];\n        }\n        return [s, m];\n    }, [state, [] as Array<SendMessageAction<'dispose-peer'>>]);\n}\n\nfunction removeGatewayRequests(state: State, activity: Activity): State {\n    return (activity.gatewayRequests ? Array.from(activity.gatewayRequests) : []).reduce((s: State, requestId: GwRequestId) => {\n        return removeGatewayRequest(s, requestId).state;\n    }, state);\n}\n\n/**\n * Cleans up state associated with an activity\n */\nfunction cleanupActivity(state: State, activity: Activity): State {\n    state = removeGatewayRequests(state, activity);\n    state = activityState.removeActivity(state, activity.id);\n    state = contextState.removeContext(state, activity.contextId);\n    return state;\n}\n\n/**\n * Dismantle the whole activity and send destroy messages to\n all participants that are already created. The outgoing and client requests are removed as well, so if a\n participant tries to join it receives an error\n */\nfunction destroyActivity(state: State, activity: Activity, reason: Reason): HandleReturnType {\n    const clientRequest = activity.clientRequest\n    const ownerId = activity.owner;\n    const activityId = activity.id;\n    let messages: readonly SendMessageAction<MessageType | CommandType>[];\n    [state, messages] = threadStateAndActions(state,\n        s => [cleanupActivity(s, activity), []],\n        (s) => {\n            const participantIds = new Set<PeerId>();\n            if (ownerId) participantIds.add(ownerId);\n            if (activity.participants) activity.participants.forEach(participantIds.add);\n            if (activity.readyMembers) activity.readyMembers.forEach(participantIds.add);\n            return destroyParticipants(s, Array.from(participantIds), reason);\n        });\n    const requester = byId(state, clientRequest?.peer_id);\n    if (requester) {\n        return [state, messages.concat(error(requester.source, clientRequest?.request_id, clientRequest?.peer_id, reason))];\n    }\n    return [state, messages];\n}\n\nexport function forwardDestroyActivity(state: State, source, request: DestroyRequest): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, activity_id: activityId} = request;\n    const peer: Peer = byIdThrows(state, peerId);\n    const activity: Activity = activityThrows(state, activityId);\n    if (canDestroy(state, activity, peer)) {\n        return threadStateAndActions(state,\n            s => destroyActivity(s, activity, requestToReason(request)),\n            s => [s, [success(source, requestId, peerId)]]);\n    }\n    return [state, [error(source, requestId, peerId, reason(activityNotAuthorized, 'Not authorized to destroy activity'))]];\n}\n\n/**\n * The owner of the activity failed to create. Dismantle the whole activity and send destroy messages to\n all participants that are already created. The outgoing and client requests are removed as well, so if a\n participant tries to join it receives an error\n */\nfunction ownerFailed(state: State, activityInfo: { id: string; \"owner?\": boolean }): HandleReturnType {\n    // todo do we throw here?\n    const activity = activityState.activityThrows(state, activityInfo.id)!;\n    return destroyActivity(state, activity, reason(activityOwnerCreationFailed, 'Activity owner cannot be created'));\n}\n\nexport function handleError(state: State, activityInfo: { id: string; \"owner?\": boolean }): HandleReturnType {\n    if (activityInfo[\"owner?\"]) {\n        return ownerFailed(state, activityInfo);\n    }\n    return [state, []];\n}\n\nfunction joinParticipant(state: State, activity: Activity, participant: Peer): { state: State, activity: Activity, messages: ReadonlyArray<SendMessageAction<MessageType>> } {\n    return {\n        state: state,\n        activity: activity,\n        messages: []\n    };\n}\n\n/**\n * Processes a request to join a target peer in an activity\n */\nexport function joinActivity(state: State, source: Source, request: JoinActivityRequest): HandleReturnType {\n    const {\n        request_id: requestId,\n        peer_id: peerId,\n        target_id: targetId,\n        activity_id: activityId,\n        peer_type: peerType,\n        peer_name: peerName\n    } = request;\n    byIdInDomainThrows(state, peerId, DomainKeys.Activity);\n    const activity = activityThrows(state, activityId);\n    const targetPeer: Peer = produce(byIdInDomainThrows(state, targetId, activityDomain), (draft: Draft<Peer>) => {\n        if (peerType) {\n            draft.peerType = peerType;\n        }\n        if (peerName) {\n            draft.peerName = peerName;\n        }\n    });\n\n    const memberId = targetPeer[activityDomain]?.member;\n    const ownerId = targetPeer[activityDomain]?.owner;\n    const existingActivity = activityState.activity(state, memberId ?? ownerId);\n\n\n    if (existingActivity?.id === activityId) {\n        // the peer is already in the same activity\n        return [state, [success(source, requestId, peerId)]];\n    } else if (existingActivity) {\n        // in some other activity\n        throwReason(activityIsChild, `Peer is already in activity ${existingActivity.id}`);\n    }\n\n    // joining a new activity\n    const {state: nextState, messages} = joinParticipant(state, activity, targetPeer);\n    return [nextState, messages.concat(success(source, requestId, peerId))];\n}\n\n\n/**\n * Removes a participant from the activity state\n */\nfunction removeParticipant(activity: Activity, peerId: PeerId) {\n    return produce(activity, (draft: Draft<Activity>) => {\n        if (draft.participants) {\n            draft.participants.delete(peerId);\n            if (draft.participants.size === 0) {\n                delete draft.participants;\n            }\n        }\n        if (draft.readyMembers) {\n            draft.readyMembers.delete(peerId);\n            if (draft.readyMembers.size === 0) {\n                delete draft.readyMembers;\n            }\n        }\n    });\n}\n\ntype ActivityStateAndMessages = {state: State, activity: Activity, messages: readonly SendMessageAction<MessageType>[]};\n\n/**\n * A participant in an activity has left. Clean it up from the activity and its children\n */\nfunction participantLeft(state: State, activity: Activity, peer: Peer, reason: Reason): ActivityStateAndMessages {\n    if (log.enabledFor('debug')) {\n        log.debug(`a participant ${peer.id} of activity ${activity.id} has left.`);\n    }\n    const peerId = peer.id;\n    activity = removeParticipant(activity, peerId);\n    const activityId = activity.id;\n    const messages = broadcastActivityLeft(state, peerId, activity, reason, true);\n    state = setPeer(state, peerId, cleanDomainInfo(peer));\n    state = activityState.setActivity(state, activityId, activity);\n    [state, ] = contextState.removeContextMember(state, contextState.contextById(state, activity.contextId)!, peerId);\n    return {state, activity, messages};\n\n}\n\n/**\n * An owner of an activity has left. Dismantle the whole activity destroying all its children\n */\nfunction ownerLeft(state: State, activity: Activity, peer: Peer, reason: Reason, shouldDestroy: boolean): HandleReturnType {\n    const peerId = peer.id;\n    if (log.enabledFor('debug')) {\n        log.debug(`the owner ${peerId} of activity ${activity.id} has left`);\n    }\n    if (shouldDestroy) {\n        return destroyActivity(setPeer(state, peerId, cleanDomainInfo(peer)), activity, reason);\n    } else {\n        const {state: nextState, messages} = participantLeft(state, activity, peer, reason);\n        return [nextState, messages];\n    }\n}\n\n/**\n * A peer is being removed from the domain, check if it belongs to any activities and deal with that accordingly\n */\nexport function removePeer(state: State, peer: Peer, reason: Reason): HandleReturnType {\n    const activityId = peer[activityDomain]?.member;\n    let activity = activityState.activity(state, activityId);\n    if (activity) {\n        const ownerId = activity.owner;\n        const peerId = peer.id;\n        const isReloading = activity.reloading && activity.reloading.has(peerId);\n        activity = produce(activity, (draft: Draft<Activity>) => {\n            if (isReloading) {\n                if (draft.reloading) {\n                    draft.reloading.delete(peerId);\n                    if (draft.reloading.size === 0) {\n                        delete draft.reloading;\n                    }\n                }\n            }\n        });\n        if (ownerId === peerId) {\n            return ownerLeft(state, activity, peer, reason, !isReloading);\n        } else {\n            const {state: s, messages} = participantLeft(state, activity, peer, reason);\n            return [s, messages];\n        }\n    }\n    return [state, []];\n}\n\nfunction subscribeUnsubscribe(state: State, source, requestId, peerId: PeerId, activityTypes: string[] | undefined, actionFn: (state: State, peerId: PeerId, activityType: true | string) => State): HandleReturnType {\n    if (activityTypes) {\n        state = activityTypes.filter((activityType): activityType is string => !!activityType).reduce((currentState: State, activityType: string) => {\n            return actionFn(currentState, peerId, activityType);\n        }, state);\n    } else {\n        state = actionFn(state, peerId, true);\n    }\n    return [state, [success(source, requestId, peerId)]];\n}\n\nexport function subscribe(state: State, source: Source, request: SubscribeRequest): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, activity_types: activityTypes} = request;\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Activity);\n    let messages: readonly SendMessageAction<MessageType | CommandType>[];\n    [state, messages] = subscribeUnsubscribe(state, source, requestId, peerId, activityTypes, activityState.addActivitySubscriber);\n    // activities that are ready and not children to other ones are announced\n    const readyActivities = activityState.activities(state).filter((activity) => activity[\"ready?\"]);\n\n    messages = messages.concat(\n        (activityTypes ? readyActivities.filter((a) => activityTypes.indexOf(a.type) !== -1) : readyActivities)\n            .map((activity) => {\n                return activityCreated(state, peer.source, peer.id, activity);\n            }));\n\n    return [state, messages];\n}\n\nexport function unsubscribe(state: State, source, request: UnsubscribeRequest): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, activity_types: activityTypes} = request;\n    byIdInDomainThrows(state, peerId, DomainKeys.Activity);\n    return subscribeUnsubscribe(state, source, requestId, peerId, activityTypes, activityState.removeActivitySubscriber);\n}\n", "import * as m from '../../common/messages.js';\nimport {outgoing} from '../../common/messages.js';\nimport {activityDomainUri} from './constants.js';\nimport {Factory, FactoryId} from '../../state/types/factory.js';\nimport {PeerId, Source} from '../../state/types/common.js';\nimport {Reason} from '../../reason.js';\nimport {SendMessageAction} from '../../node.js';\nimport {Activity, ActivityChild, ActivityChildren, ActivityId, ActivityType} from '../../state/types/activity.js';\nimport {Peer, State} from '../../state/types/state.js';\nimport {byId} from '../../state/peers.js';\nimport {Draft, Immutable, produce} from 'immer';\nimport {\n    ActivityJoined,\n    Created,\n    DisposePeer,\n    Initiated,\n    Joined,\n    Left,\n    OwnerChanged,\n    PeerCreated,\n    PeerFactoriesAdded,\n    PeerFactoriesRemoved,\n    PeerInfo,\n    PeerRequested,\n    TypesAdded,\n    TypesRemoved\n} from './types/messages.js';\nimport {ContextData} from '../../state/types/context.js';\n\n\nfunction peerFactoriesAddedMsg(peerId: PeerId, ownerId: PeerId, factories: Factory[]): PeerFactoriesAdded {\n    return {\n        domain: activityDomainUri,\n        type: 'peer-factories-added',\n        peer_id: peerId,\n        owner_id: ownerId,\n        factories: factories\n    };\n}\n\nexport function peerFactoriesAdded(recipient: Source, peerId: PeerId, ownerId: PeerId, factories: Factory[]): SendMessageAction<'peer-factories-added'> {\n    return outgoing(recipient, peerFactoriesAddedMsg(peerId, ownerId, factories));\n}\n\nfunction peerFactoriesRemovedMsg(peerId: PeerId, ownerId: PeerId, factoryIds: FactoryId[]): PeerFactoriesRemoved {\n    return {\n        domain: activityDomainUri,\n        type: 'peer-factories-removed',\n        peer_id: peerId,\n        owner_id: ownerId,\n        factory_ids: factoryIds\n    };\n}\n\nexport function peerFactoriesRemoved(recipient: Source, peerId: PeerId, ownerId: PeerId, factoryIds): SendMessageAction<'peer-factories-removed'> {\n    return outgoing(recipient, peerFactoriesRemovedMsg(peerId, ownerId, factoryIds));\n}\n\nfunction peerRequestedMsg(requestId: string, peerId: PeerId, factoryId: FactoryId, token: string, configuration: object, activityRq): PeerRequested {\n    return {\n        domain: activityDomainUri,\n        type: 'peer-requested',\n        request_id: requestId,\n        peer_id: peerId,\n        peer_factory: factoryId,\n        gateway_token: token,\n        configuration,\n        ...activityRq\n    };\n}\n\nexport function peerRequested(recipient: Source, requestId, peerId: PeerId, factoryId: FactoryId, token: string, configuration: object, activityRq): SendMessageAction<'peer-requested'> {\n    return outgoing(recipient, peerRequestedMsg(requestId, peerId, factoryId, token, configuration, activityRq));\n}\n\nexport function disposePeer(recipient: Source, peerId: PeerId, requestorId, reason: Reason): SendMessageAction<'dispose-peer'> {\n    const message: DisposePeer = {\n        domain: activityDomainUri,\n        type: 'dispose-peer',\n        peer_id: peerId,\n        requestor_id: requestorId,\n        reason_uri: reason.uri,\n        reason: reason.message\n    };\n    return outgoing(recipient, message);\n}\n\nfunction peerCreatedMsg(requestId, peerId: PeerId, createdId: PeerId): PeerCreated {\n    return {\n        domain: activityDomainUri,\n        type: 'peer-created',\n        request_id: requestId,\n        peer_id: peerId,\n        created_id: createdId\n    }\n}\n\nexport function peerCreated(recipient: Source, requestId, peerId: PeerId, createdId: PeerId): SendMessageAction<'peer-created'> {\n    return outgoing(recipient, peerCreatedMsg(requestId, peerId, createdId));\n}\n\nexport function activityTypesAdded(recipient: Source, peerId: PeerId, types: ActivityType[]): SendMessageAction<'types-added'> {\n    const message: TypesAdded = {domain: activityDomainUri, type: 'types-added', peer_id: peerId, types: types};\n    return outgoing(recipient, message);\n}\n\nexport function activityTypesRemoved(recipient: Source, peerId: PeerId, types: string[]): SendMessageAction<'types-removed'> {\n    const message: TypesRemoved = {domain: activityDomainUri, type: 'types-removed', peer_id: peerId, types: types};\n    return outgoing(recipient, message);\n}\n\nexport function activityInitiated(recipient: Source, requestId: string, peerId: PeerId, activityId: ActivityId): SendMessageAction<'initiated'> {\n    const message: Initiated = {\n        domain: activityDomainUri,\n        type: 'initiated',\n        request_id: requestId,\n        peer_id: peerId,\n        activity_id: activityId\n    };\n    return outgoing(recipient, message);\n}\n\n\ntype ActivityWithFilteredContext = Immutable<{\n    context?: ContextData\n    children?: { [id: string]: ActivityWithFilteredContext }\n}>\n\nfunction filterContext(children: ActivityChildren): ActivityWithFilteredContext {\n    return Object.entries(children).reduce((acc, [k, c]) => {\n        acc[k] = produce(c as ActivityWithFilteredContext, (draft: Draft<ActivityWithFilteredContext>) => {\n            draft.context = (draft as ActivityChild).context.data;\n            if (draft.children) {\n                draft.children = filterContext(draft.children as ActivityChildren);\n            }\n        });\n        return acc;\n    }, {} as ActivityWithFilteredContext);\n}\n\nfunction peerInfo(state: State, peerId?: PeerId): PeerInfo {\n    const p = byId(state, peerId);\n    return {peer_id: peerId, name: p?.peerName, type: p?.peerType};\n}\n\nfunction joinedActivityMsg(state: State, peer: Peer, activity: Activity, contextSnapshot: ContextData): Joined {\n    const children = activity.children;\n    const peerName = peer.peerName;\n    const peerType = peer.peerType;\n    const msg: Joined = {\n        domain: activityDomainUri,\n        type: 'joined',\n        peer_id: peer.id,\n        activity_id: activity.id,\n        activity_type: activity.type,\n        initiator: activity.initiator,\n        context_id: activity.contextId,\n        owner: peerInfo(state, activity.owner),\n        participants: Array.from<PeerId>(activity.readyMembers || []).map((peerId) => peerInfo(state, peerId)),\n        context_snapshot: contextSnapshot\n    };\n    if (peerName) {\n        msg['peer_name'] = peerName;\n    }\n    if (peerType) {\n        msg['peer_type'] = peerType;\n    }\n    if (children) {\n        msg['children'] = filterContext(children)\n    }\n\n    return msg;\n}\n\nexport function joinedActivity(state: State, recipient: Source, peer: Peer, activity, contextSnapshot: ContextData): SendMessageAction<'joined'> {\n    return outgoing(recipient, joinedActivityMsg(state, peer, activity, contextSnapshot));\n}\n\nfunction activityJoinedMsg(peerId: PeerId, joinedPeer: Peer, activityId): ActivityJoined {\n    const peerName = joinedPeer.peerName;\n    const msg: ActivityJoined = {\n        domain: activityDomainUri,\n        type: 'activity-joined',\n        peer_id: peerId,\n        activity_id: activityId,\n        joined_id: joinedPeer.id,\n        joined_type: joinedPeer.peerType\n    };\n    if (peerName) msg['peer_name'] = peerName;\n    return msg;\n}\n\nexport function activityJoined(recipient: Source, peerId: PeerId, joinedPeer, activityId): SendMessageAction<'activity-joined'> {\n    return outgoing(recipient, activityJoinedMsg(peerId, joinedPeer, activityId));\n}\n\nfunction activityCreatedMsg(state: State, peerId: PeerId, activity: Activity): Created {\n    const children = activity.children;\n    const msg: Created = {\n        domain: activityDomainUri,\n        type: 'created',\n        peer_id: peerId,\n        activity_id: activity.id,\n        context_id: activity.contextId,\n        owner: peerInfo(state, activity.owner),\n        participants: Array.from<PeerId>(activity.readyMembers || []).concat(Array.from<PeerId>(activity.participants || [])).map((peerId) => peerInfo(state, peerId)),\n        activity_type: activity.type,\n        initiator: activity.initiator\n    };\n    if (children) {\n        msg['children'] = filterContext(children);\n    }\n    return msg;\n}\n\nexport function activityCreated(state: State, recipient: Source, peerId: PeerId, activity: Activity): SendMessageAction<'created'> {\n    return outgoing(recipient, activityCreatedMsg(state, peerId, activity));\n}\n\nexport function activityLeft(recipient: Source, peerId: PeerId, leftId: PeerId, activityId, reason: Reason): SendMessageAction<'left'> {\n    const message: Left = {\n        domain: activityDomainUri,\n        type: 'left',\n        peer_id: peerId,\n        activity_id: activityId,\n        left_id: leftId,\n        reason_uri: reason.uri,\n        reason: reason.message\n    };\n    return outgoing(recipient, message);\n}\n\nfunction ownerChangedMsg(peerId: PeerId, activityId: string, owner: Peer): OwnerChanged {\n    const peerName = owner.peerName;\n    const peerType = owner.peerType;\n    const msg: OwnerChanged = {\n        domain: activityDomainUri,\n        type: 'owner-changed',\n        peer_id: peerId,\n        activity_id: activityId,\n        owner_id: owner.id\n    };\n    if (peerName) msg['peer_name'] = peerName;\n    if (peerType) msg['peer_type'] = peerType;\n    return msg;\n}\n\nexport function ownerChanged(recipient: Source, peerId: PeerId, activityId: string, owner: Peer): SendMessageAction<'owner-changed'> {\n    return outgoing(recipient, ownerChangedMsg(peerId, activityId, owner));\n}\n\nexport function success(recipient: Source, requestId, peerId): SendMessageAction<'success'> {\n    return m.success(activityDomainUri, recipient, requestId, peerId);\n}\nexport function error(recipient: Source, requestId, peerId, reason, context?): SendMessageAction<'error'> {\n    return m.error(activityDomainUri, recipient, requestId, peerId, reason, context);\n}\nexport function peerRemoved(recipient: Source, peerId, removedPeerId, reason: Reason): SendMessageAction<'peer-removed'> {\n    return m.peerRemoved(activityDomainUri, recipient, peerId, removedPeerId, reason);\n}\n\nexport function peerAdded(recipient: Source, peerId, newPeerId, newPeerIdentity, meta): SendMessageAction<'peer-added'> {\n    return m.peerAdded(activityDomainUri, recipient, peerId, newPeerId, newPeerIdentity, meta);\n}\n", "import {GatewayRequest, GwRequestId} from '../../state/types/pending-requests.js';\nimport {PeerType} from '../../state/types/factory.js';\nimport {Activity, ActivityPeer} from '../../state/types/activity.js';\n\nexport function activity(requestId: GwRequestId, activityPeer: ActivityPeer, activity: Activity, isActivityOwner: boolean): GatewayRequest {\n    const request: GatewayRequest = {\n        type: 'activity',\n        id: requestId,\n        peer_type: activityPeer.type,\n        activity: {id: activity.id, 'owner?': isActivityOwner}\n    };\n    if (activityPeer.name) {\n        request.peer_name = activityPeer.name;\n    }\n    return request;\n}\n\nexport function reload(requestId: GwRequestId, activityPeer: ActivityPeer, activity: Activity): GatewayRequest {\n    const request: GatewayRequest = {\n        type: 'activity',\n        id: requestId,\n        peer_type: activityPeer.type,\n        activity: {id: activity.id, 'owner?': activity.owner === activityPeer['id']},\n        reload: true\n    };\n    if (activityPeer.name) {\n        request.peer_name = activityPeer.name;\n    }\n    return request;\n}\n\nexport function factory(requestId: GwRequestId, peerType: PeerType, peerName, clientRequest): GatewayRequest {\n    const request: GatewayRequest = {\n        type: 'create-peer',\n        id: requestId,\n        peer_type: peerType,\n        clientRequest\n    };\n    if (peerName) {\n        request.peer_name = peerName;\n    }\n    return request;\n}\n", "import {DomainKeys, Peer, State} from '../../state/types/state.js';\r\nimport {HandleReturnType} from '../../domain.js';\r\nimport {Activity, activityDomain, ActivityId, ActivityPeer} from '../../state/types/activity.js';\r\nimport * as gatewayRequest from './gatewayRequest.js';\r\nimport * as activityState from './state.js';\r\nimport {\r\n    byId,\r\n    byIdInDomain,\r\n    byIdInDomainThrows,\r\n    byIdThrows,\r\n    isPeerVisible,\r\n    setPeer,\r\n    visiblePeers\r\n} from '../../state/peers.js';\r\nimport {peerCreated, peerFactoriesAdded, peerFactoriesRemoved, peerRequested} from './messages.js';\r\nimport {MessageType, SendMessageAction} from '../../node.js';\r\nimport {Draft, produce} from 'immer';\r\nimport {Factory, FactoryId, PeerType} from '../../state/types/factory.js';\r\nimport {Reason, throwReason} from '../../reason.js';\r\nimport {\r\n    activityDomainUri,\r\n    activityFactoryAlreadyRegistered,\r\n    activityInvalidPeer,\r\n    activityMissingFactory\r\n} from './constants.js';\r\nimport {PeerMessage, RequestMessage} from '../../common/types/messages.js';\r\nimport {error, success} from '../../common/messages.js';\r\nimport {AddPeerFactoriesRequest, CreatePeerRequest, RemovePeerFactoriesRequest} from './types/requests.js';\r\nimport {PeerId} from '../../state/types/common.js';\r\nimport {requestId} from '../../common/ids.js';\r\nimport {forRequest} from '../../common/tokens.js';\r\nimport {setGatewayRequest} from '../../state/core.js';\r\nimport {contextById} from '../../common/context/state.js';\r\nimport {GatewayRequest, GwRequestId} from '../../state/types/pending-requests.js';\r\nimport {Context, ContextData, ContextId} from '../../state/types/context.js';\r\nimport {some, WithRequired} from '../../common/utilities.js';\r\n\r\ntype JoinedPeer = WithRequired<Peer, DomainKeys.Activity>;\r\n\r\nfunction addFactories(state: State, peer: JoinedPeer, factories: Factory[]) {\r\n    const factoriesByType: { [type: PeerType]: Factory[] } = factories.reduce((grouped, f) => {\r\n        if (grouped[f.peer_type]) {\r\n            grouped[f.peer_type].push(f);\r\n        } else {\r\n            grouped[f.peer_type] = [f];\r\n        }\r\n        return grouped;\r\n    }, {} as { [type: PeerType]: Factory[] });\r\n    state = setPeer(state, peer.id, produce(peer, (draft: Draft<JoinedPeer>) => {\r\n        draft[activityDomain].factories = draft[activityDomain].factories || {}\r\n        for (const [ft, fs] of Object.entries(factoriesByType)) {\r\n            draft[activityDomain].factories[ft] = fs[0];\r\n        }\r\n\r\n    }));\r\n    state = activityState.addFactories(state, Object.keys(factoriesByType), peer.id);\r\n    return state;\r\n}\r\n\r\nfunction broadcastFactoriesAdded(state: State, owner: JoinedPeer, factories: Factory[]) {\r\n    return visiblePeers(state, activityDomain, owner).map((peer) => {\r\n        return peerFactoriesAdded(peer.source, peer.id, owner.id, factories);\r\n    });\r\n}\r\n\r\nexport function announceExisting(state: State, peer: JoinedPeer): SendMessageAction<'peer-factories-added'>[] {\r\n    return Array.from(new Set(Object.values<readonly PeerId[]>(activityState.factories(state) || {}).flat(1)))\r\n        .map((peerId) => {\r\n            return byIdInDomain(state, peerId, DomainKeys.Activity);\r\n        })\r\n        .filter((p): p is JoinedPeer => {\r\n            return !!p;\r\n        })\r\n        .filter(p => {\r\n            return isPeerVisible(DomainKeys.Activity, peer, p);\r\n        })\r\n        .map((factoryPeer) => {\r\n            const factories = factoryPeer[DomainKeys.Activity].factories;\r\n            if (factories) {\r\n                return peerFactoriesAdded(peer.source, peer.id, factoryPeer.id, Object.values<Factory>(factories));\r\n            }\r\n        })\r\n        .filter(some<SendMessageAction<'peer-factories-added'>>);\r\n}\r\n\r\n\r\nfunction validateFactory(peer, factory: Factory) {\r\n    const peerType = factory.peer_type;\r\n    if (peer[activityDomain]?.factories?.[peerType]) {\r\n        throwReason(activityFactoryAlreadyRegistered, `Factory for type ${peerType} is already registered by this peer`);\r\n    }\r\n}\r\n\r\nexport function add(state: State, source, request: AddPeerFactoriesRequest): HandleReturnType {\r\n    const {request_id: requestId, peer_id: peerId, factories} = request;\r\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Activity);\r\n    factories.forEach(f => validateFactory(peer, f));\r\n\r\n    const updatedState = addFactories(state, peer, factories);\r\n    const messages: Array<SendMessageAction<MessageType>> = broadcastFactoriesAdded(updatedState, peer, factories);\r\n    return [updatedState, messages.concat(success(activityDomainUri, source, requestId, peerId))]\r\n}\r\n\r\n\r\nfunction broadcastRemoved(state: State, owner: JoinedPeer, factoryIds, includeOwner: boolean): SendMessageAction<'peer-factories-removed'>[] {\r\n    const ownerId = owner.id;\r\n    return visiblePeers(state, activityDomain, owner)\r\n        .filter((p: Peer) => {\r\n            return includeOwner || (ownerId !== p.id);\r\n        }).map((peer) => {\r\n            return peerFactoriesRemoved(peer.source, peer.id, owner.id, factoryIds);\r\n        });\r\n}\r\n\r\nfunction factoryById(factories: Record<PeerType, Factory> | undefined, id: FactoryId): Factory | undefined {\r\n    return Object.values(factories || {}).find((f) => f.id === id);\r\n}\r\n\r\n/**\r\n * Removes a set of factory ids from a peer. Returns the updated peer and a vector of removed factories\r\n */\r\nfunction removeFactoriesFromPeer(peer: Peer, factoryIds: FactoryId[]): [Peer, Factory[]] {\r\n    const factories = peer[activityDomain]?.factories;\r\n    const [updatedPeer, removed] = factoryIds.reduce(([p, removed], factoryId) => {\r\n        const factory = factoryById(factories, factoryId);\r\n        if (factory) {\r\n            return [produce(p, (draft: Draft<Peer>) => {\r\n                if (draft[activityDomain]?.factories) {\r\n                    delete draft[activityDomain]?.factories?.[factory.peer_type];\r\n                    if (Object.keys(draft[activityDomain]?.factories).length === 0) {\r\n                        delete draft[activityDomain]?.factories;\r\n                    }\r\n                }\r\n            }), removed.concat(factory)];\r\n        }\r\n        return [p, removed];\r\n    }, [peer, [] as Factory[]]);\r\n    return [updatedPeer, removed];\r\n\r\n}\r\n\r\nexport function removeFactories(state: State, source, request: RemovePeerFactoriesRequest): HandleReturnType {\r\n    const {request_id: requestId, peer_id: peerId, factory_ids: factoryIds} = request;\r\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Activity);\r\n    const [updatedPeer, removed] = removeFactoriesFromPeer(peer, factoryIds);\r\n    const updatedState = activityState.removeFactories(setPeer(state, peerId, updatedPeer), removed.map(f => f.peer_type), peerId);\r\n    let messages: SendMessageAction<MessageType>[] = broadcastRemoved(updatedState, peer, removed.map(r => r.id), true);\r\n    messages = messages.concat([success(activityDomainUri, source, requestId, peerId)]);\r\n    return [updatedState, messages];\r\n}\r\n\r\nexport function requestPeer(state: State, owner: Peer, factory: Factory, configuration, token: string, requestId: GwRequestId, activity, context: Context | undefined, peerName): SendMessageAction<MessageType> {\r\n    const activityRequest: { activity?: { id: ActivityId, type: string, context_id?: ContextId, 'initial-context'?: ContextData }, peer_name? } = {};\r\n    if (activity) {\r\n        activityRequest.activity = {\r\n            id: activity.id,\r\n            type: activity.type,\r\n            context_id: context?.id,\r\n            'initial-context': context?.data\r\n        };\r\n    }\r\n    if (peerName) {\r\n        activityRequest.peer_name = peerName;\r\n    }\r\n    // for those wondering why there is no peer type here - the factory id : peer type is 1 : 1\r\n    return peerRequested(owner.source, requestId, owner.id, factory.id, token, {...factory.configuration, ...configuration}, activityRequest);\r\n}\r\n\r\nexport function peerReady(state: State, peer: Peer): HandleReturnType {\r\n    const clientRequest = peer.creationRequest?.clientRequest;\r\n    if (!clientRequest) {\r\n        throwReason(activityInvalidPeer, `Unable to find originating request for a ready message from peer ${peer.id}`);\r\n    }\r\n    const callerId = clientRequest!.peer_id;\r\n    const caller = byId(state, callerId)!;\r\n    return [state, [peerCreated(caller.source, clientRequest!.request_id, callerId, peer.id)]];\r\n}\r\n\r\n/**\r\n * Peer is leaving the domain.\r\n *\r\n * Updates the state and generates messages for the peer and its registered methods being removed\r\n */\r\nexport function removePeer(state: State, peer: JoinedPeer): HandleReturnType {\r\n    const factories = Object.values<Factory>(peer[activityDomain]?.factories || {});\r\n    if (factories) {\r\n        // remove the factories that this peer had\r\n        return [activityState.removeFactories(state, factories.map(f => f.peer_type), peer.id), broadcastRemoved(state, peer, factories.map(f => f.id), false)];\r\n    }\r\n    return [state, []];\r\n}\r\n\r\nfunction createPeerFailed(state: State, request: PeerMessage & RequestMessage | undefined, failure: Reason): HandleReturnType {\r\n    const creator = byId(state, request?.peer_id);\r\n    if (creator) {\r\n        return [state, [error(activityDomainUri, creator.source, request!.request_id, creator.id, failure)]];\r\n    }\r\n    return [state, []];\r\n}\r\n\r\nexport function handleCreatePeerError(state: State, failure: Reason, incomingR: PeerMessage & RequestMessage | undefined, gatewayR: GatewayRequest): HandleReturnType {\r\n    return createPeerFailed(state, incomingR, failure);\r\n}\r\n\r\nfunction factoryOwner(state: State, ownerId: PeerId | undefined, peerType: PeerType): [Peer, Factory] {\r\n    const owner = byId(state, ownerId ?? activityState.factoriesByType(state, peerType)?.[0]);\r\n    const factory: Factory | undefined = owner?.[activityDomain]?.factories?.[peerType];\r\n    if (!factory) {\r\n        throwReason(activityMissingFactory, `Unable to find factory owner for type ${peerType}`);\r\n    }\r\n    return [owner!, factory!];\r\n}\r\n\r\nexport function createActivityPeer(state: State, creatorId: PeerId, activityPeer: ActivityPeer, activity: Activity, context: Context, isActivityOwner: boolean, configuration): { state: State, messages: Array<SendMessageAction<MessageType>>, requestId: GwRequestId } {\r\n    const [owner, factory] = factoryOwner(state, undefined, activityPeer.type);\r\n    const creator: Peer = byIdThrows(state, creatorId);\r\n    const [newIds, gwRequestId] = requestId(state.ids);\r\n    const gwRequest = gatewayRequest.activity(gwRequestId, activityPeer, activity, isActivityOwner);\r\n    const token = forRequest(state, creator.identity, gwRequest);\r\n    state = setGatewayRequest({...state, ids: newIds}, gwRequestId, gwRequest);\r\n    return {\r\n        state: state,\r\n        messages: [requestPeer(state, owner, factory, configuration, token, gwRequestId, activity, context, null)],\r\n        requestId: gwRequestId\r\n    }\r\n}\r\n\r\nfunction createPeer(state: State, creatorId: PeerId, factoryOwnerId: PeerId | undefined, peerType: PeerType, peerName, activity, configuration, clientRequest): { state: State, messages: Array<SendMessageAction<MessageType>>, requestId: GwRequestId } {\r\n    const [owner, factory] = factoryOwner(state, factoryOwnerId, peerType);\r\n    const creator = byIdThrows(state, creatorId);\r\n    const [newIds, gwRequestId] = requestId(state.ids);\r\n    const gwRequest = gatewayRequest.factory(gwRequestId, peerType, peerName, {\r\n        request_id: clientRequest.request_id,\r\n        peer_id: clientRequest.peer_id\r\n    });\r\n    const token = forRequest(state, creator.identity, gwRequest);\r\n    state = setGatewayRequest({...state, ids: newIds}, gwRequestId, gwRequest);\r\n    return {\r\n        state,\r\n        messages: [requestPeer(state, owner, factory, configuration, token, gwRequestId, activity, contextById(state, activity?.contextId), peerName)],\r\n        requestId: gwRequestId\r\n    };\r\n}\r\n\r\nexport function create(state: State, source, request: CreatePeerRequest): HandleReturnType {\r\n    const {\r\n        request_id: requestId,\r\n        peer_id: peerId,\r\n        owner_id: ownerId,\r\n        peer_type: peerType,\r\n        peer_name: peerName,\r\n        activity_id: activityId\r\n    } = request;\r\n    byIdInDomainThrows(state, peerId, DomainKeys.Activity);\r\n    const activity = activityState.activityMaybeThrows(state, activityId);\r\n    const result = createPeer(state, peerId, ownerId, peerType, peerName ?? peerType, activity, request.configuration, request);\r\n    return [result.state, result.messages.concat(success(activityDomainUri, source, requestId, peerId))];\r\n}\r\n", "import {Domain, HandleReturnType, StateToMessagesReturnType} from '../../domain.js';\nimport {CommandType, DomainType, MetricsIncomingType, NodeMessage} from '../../node.js';\nimport {DomainInfo} from '../../state/types/domain-registry.js';\nimport {Peer, State} from '../../state/types/state.js';\nimport {getLogger} from '../../logger.js';\nimport {Repository, RepositoryFactory} from '../../metrics/core.js';\nimport {error, isLocalSource, success} from '../../common/messages.js';\nimport {exceptionToReason, Reason, reason, requestToReason, throwReason} from '../../reason.js';\nimport {\n    metricsBadIdentity,\n    metricsDomainUri,\n    metricsFailure,\n    metricsUnhandledMessage,\n    reasonPeerRemoved\n} from './constants.js';\nimport {inDomain, joinDomain, leaveDomain} from '../../state/core.js';\nimport * as metrics from '../../state/types/metrics.js';\nimport {Draft, produce} from 'immer';\nimport {DomainJoin} from '../global/types/messages.js';\nimport {byIdInDomainThrows, byIdThrows, bySourceInDomain, peersInDomain} from '../../state/peers.js';\nimport {PeerId, Source} from '../../state/types/common.js';\nimport {DefineRequest, PublishRequest} from './types/requests.js';\nimport {isAllowed} from './filters.js';\nimport {IOGateway} from \"../../../gateway\";\n\nconst log = getLogger('gateway.domains.metrics');\n\n// this is list is rtt specific can be reduced in the future\nconst REQUIRED_PROPERTIES = ['system', 'service', 'instance'];\nfunction checkIdentity(repoIdentity) {\n    const missing = REQUIRED_PROPERTIES.find((key) => !(key in repoIdentity));\n    if (missing) {\n        throwReason(metricsBadIdentity, `Repository is missing required ${missing} property`);\n    }\n}\n\nfunction defaultRepositoryId(source: Source, peerIdentity: { system?: string, application?: string, machine?: string}) {\n    return {\n        machine: peerIdentity.machine,\n        system: peerIdentity.system,\n        service: peerIdentity.application,\n        'start-time': Date.now()\n    };\n}\n\n/*Local peer is joining the domain.\n\n  Updates the state and generates messages to all existing peers announcing the new peer*/\nexport function joinPeer(state: State, source: Source, request: DomainJoin): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, identity: peerIdentity, options} = request;\n    const repoId = Object.assign({}, defaultRepositoryId(source, peerIdentity), options, peerIdentity);\n    if (inDomain(state, peerId, metrics.metricsDomain)) {\n        // the peer is already in the domain\n        return [state, [success(metricsDomainUri, source, requestId, peerId)]];\n    }\n    // we need to join it\n\n    checkIdentity(repoId);\n    state = produce(joinDomain(state, peerId, metrics.metricsDomain, undefined), (s: Draft<State>) => {\n        const peer = s.peers?.[peerId];\n        peer![metrics.metricsDomain] = {restrictions: 'local', repoId};\n    });\n\n    return [state, [success(metricsDomainUri, source, requestId, peerId)]];\n}\n\nfunction removePeer(state: State, peer: Peer, reason: Reason): State {\n    const peerId = peer.id;\n    const repositories = peer[metrics.metricsDomain]?.repos;\n    if (repositories) {\n        log.info(`stopping metrics publishing for peer ${peerId}, reason: ${JSON.stringify(reason)}`);\n        repositories.forEach((r) => {\n            r.stop();\n        });\n    }\n    return leaveDomain(state, peerId, metrics.metricsDomain);\n}\n\nfunction leave(state: State, source: Source, request): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId} = request;\n    const peer = byIdThrows(state, peerId);\n    const newState = removePeer(state, peer, requestToReason(request));\n    return [newState, [success(metricsDomainUri, source, requestId, peerId)]];\n}\n\n\nfunction ensureRepositories(state: State, factories: RepositoryFactory[], peerId: PeerId, repoId: IOGateway.Metrics.Identity): [State, readonly Repository[]] {\n    const nextState = produce(state, (draft: Draft<State>) => {\n        const peer = draft.peers?.[peerId];\n        let repositories: Repository[] | undefined;\n        if (peer) {\n            const domain = peer[metrics.metricsDomain];\n            if (domain) {\n                repositories = domain.repos;\n                if (!repositories) {\n                    repositories = domain.repos = factories.map(f => {\n                        const repository = f.repository(repoId);\n                        repository.start();\n                        return repository;\n                    });\n                    domain.repos = repositories;\n                }\n            }\n        }\n    });\n    return [nextState, nextState.peers?.[peerId]?.[metrics.metricsDomain]?.repos ?? []];\n}\n\nexport function defineMetrics(state: State, source: Source, request: DefineRequest, factories: RepositoryFactory[], filters?: IOGateway.MetricFilters): HandleReturnType {\n    const {peer_id: peerId, metrics: ms} = request;\n    const peer = byIdInDomainThrows(state, peerId, metrics.metricsDomain);\n    const repoId: IOGateway.Metrics.Identity = peer[metrics.metricsDomain].repoId;\n    const definitions = ms.filter(m => isAllowed(repoId, m.name, filters));\n\n    if (definitions.length > 0) {\n        if (log.enabledFor('debug')) {\n            log.debug(`publisher ${JSON.stringify(repoId)} adding metrics [${definitions.map(d => d.name).join(',')}]`);\n        }\n        const [newState, repositories] = ensureRepositories(state, factories, peer.id, repoId);\n        repositories.forEach(r => r.add(definitions));\n        return [newState, []];\n    }\n    return [state, []];\n}\n\nexport function publishMetrics(state: State, source: Source, request: PublishRequest, filters?: IOGateway.MetricFilters): HandleReturnType {\n    const {peer_id: peerId, values: vs} = request;\n    const peer = byIdInDomainThrows(state, peerId, metrics.metricsDomain);\n    const repoId = peer[metrics.metricsDomain].repoId;\n    const values = vs.filter(v => isAllowed(repoId, v.name, filters));\n    //also log large msg\n    if (values.length > 0) {\n        const repositories = peer[metrics.metricsDomain].repos;\n        if (repositories) {\n            repositories.forEach(r => r.publish(values));\n        }\n    }\n    return [state, []];\n}\n\n/**\n * Source has disconnected from the system\n */\nfunction sourceRemoved(state: State, source: Source): HandleReturnType {\n    if (log.enabledFor('debug')) {\n        log.debug(`removing source ${JSON.stringify(source)} from metrics domain`);\n    }\n    state = bySourceInDomain(state, source, metrics.metricsDomain).reduce((s, p) => {\n        return removePeer(s, p, reasonPeerRemoved);\n    }, state);\n    return [state, []];\n}\n\nfunction handleRequest(state: State, source: Source, request, factories: RepositoryFactory[], filters?: IOGateway.MetricFilters): HandleReturnType {\n\n    switch (request.type) {\n        case 'domain/join': {\n            return joinPeer(state, source, request);\n        }\n        case 'domain/leave': {\n            return leave(state, source, request);\n        }\n        case 'commands/source-removed': {\n            return sourceRemoved(state, source);\n        }\n        case 'define': {\n            return defineMetrics(state, source, request, factories, filters);\n        }\n        case 'publish': {\n            return publishMetrics(state, source, request, filters);\n        }\n        default: {\n            log.error(`Unhandled message ${JSON.stringify(request)}`);\n            return [state, [error(metricsDomainUri, source, request['request_id'] ?? -1, request['peer_id'], reason(metricsUnhandledMessage, `Unhandled message ${JSON.stringify(request)}`))]]\n        }\n    }\n}\n\nclass MetricsDomain implements Domain<MetricsIncomingType> {\n    constructor(private readonly factories: RepositoryFactory[],\n                private readonly filters?: IOGateway.MetricFilters) {\n    }\n    info(): DomainInfo {\n        return {\n            uri: metricsDomainUri,\n            description: '',\n            version: 1\n        };\n    }\n\n    init(state: State): State {\n        return state;\n    }\n\n    destroy(state: State): State {\n        state = peersInDomain(state, metrics.metricsDomain).reduce((s, p) => {\n            return removePeer(s, p, reasonPeerRemoved);\n        }, state);\n\n        return state;\n    }\n\n    handleMessage(state: State, msg: NodeMessage<CommandType | DomainType | MetricsIncomingType>): HandleReturnType {\n        const {source, body} = msg;\n        try {\n            return handleRequest(state, source, body, this.factories, this.filters);\n        } catch (e) {\n            if (isLocalSource(source)) {\n                return [state, [error(metricsDomainUri, source, body['request_id'], body['peer_id'], exceptionToReason(e, metricsFailure))]]\n            } else {\n                return [state, []]\n            }\n        }\n    }\n\n    stateToMessages(state: State): StateToMessagesReturnType {\n        return [];\n    }\n\n}\nexport type MetricPublishers = RepositoryFactory[];\n\nexport function metricsDomain(factories: MetricPublishers, filters?: IOGateway.MetricFilters): MetricsDomain {\n    if (log.enabledFor('debug')) {\n        log.debug(`Initializing metrics domain with filters ${filters ? JSON.stringify(filters) : '<none>'}`);\n    }\n    return new MetricsDomain(factories, filters);\n}\n", "import {reason} from '../../reason.js';\n\nexport const metricsDomainUri = 'metrics';\n\nexport const metricsFailure = `${metricsDomainUri}.errors.failure`;\nexport const metricsUnhandledMessage = `${metricsDomainUri}.errors.unhandled_message`;\nexport const metricsBadIdentity = `${metricsDomainUri}.errors.bad_identity`;\nexport const reasonPeerRemoved = reason(`${metricsDomainUri}.peer-removed`, 'Peer has been removed');\n", "import {DomainKeys} from './state.js';\nimport {Repository} from '../../metrics/core.js';\nimport {Immutable} from 'immer';\nimport {IOGateway} from '../../../gateway';\n\nexport const metricsDomain = DomainKeys.Metrics;\n\nexport type MetricsDomain = Immutable<{\n    restrictions: 'local',\n    repoId: Immutable<IOGateway.Metrics.Identity>\n    repos?: readonly Repository[]\n}>\n", "import {IOGateway} from '../../gateway';\nimport * as metrics from './core.js';\nimport {conflateRepo, MetricsEvent} from './common.js';\nimport {basicPublisher, basicRepositoryFactory, WorkerConfig} from './publisher.js';\n\ntype CustomConfig = IOGateway.CustomMetricsPublisherConfig & WorkerConfig\n\nexport async function wrap(conf: CustomConfig): Promise<metrics.RepositoryFactory> {\n    return basicRepositoryFactory(conf,\n        // we need to update filters\n        await basicPublisher(conf,\n            (data: MetricsEvent[]) => conflateRepo(conf.split_size ?? 1, data),\n            conf?.publishFn ?? './metrics-publisher-custom.js'));\n}\n", "import {RepositoryFactory} from '../metrics/core.js';\nimport {wrap} from '../metrics/custom.js';\nimport {some} from '../common/utilities.js';\nimport {getLogger} from '../logger.js';\nimport {Draft, produce} from 'immer';\nimport {IOGateway} from '../../gateway';\n\nconst log = getLogger('gateway.metrics');\nasync function publisher<T extends keyof IOGateway.MetricPublishersConfig>(type: T, config?: IOGateway.MetricPublishersConfig[T]): Promise<RepositoryFactory | undefined> {\n    if (type === 'rest') {\n        const {restRepositoryFactory} = await import('../metrics/rest.js');\n        return await restRepositoryFactory(config as IOGateway.RestMetricsPublisherConfig);\n    } else if (type === 'file') {\n        if (typeof process !== 'undefined') {\n            const {fileRepositoryFactory} = await import('../metrics/file.js');\n            return await fileRepositoryFactory(config as IOGateway.FileMetricsPublisherConfig);\n        } else {\n            throw new Error(`file publisher is supported only in nodejs`);\n        }\n    }\n    return undefined;\n}\n\nexport async function metrics(config?: IOGateway.MetricsConfig, endpoint?: string): Promise<RepositoryFactory[]> {\n    const c = config ?? {publishers: []};\n    return Promise.all((c.publishers)\n        .map(async (f) => {\n            try {\n                if (typeof f === 'string') {\n                    return await publisher(f, c[f]);\n                } else {\n                    //add gw url to custom publisher's context\n                    const conf = produce(f, (draft: Draft<IOGateway.CustomMetricsPublisherConfig>) => {\n                        if (endpoint) {\n                            draft.context = draft.context || {};\n                            draft.context.gw = draft.context.gw || {url: endpoint};\n                            draft.context.gw.url = endpoint;\n                        }\n                    });\n                    return await wrap(conf);\n                }\n            } catch (e) {\n                log.error(`failed to create repository factory ${JSON.stringify(f)}`, e);\n                return undefined;\n            }\n        })).then((rs) => rs.filter(some<RepositoryFactory>));\n}\n", "import {Domain, HandleReturnType, StateToMessagesReturnType} from '../../domain.js';\nimport {DomainKeys, Peer, State} from '../../state/types/state.js';\nimport {DomainInfo} from '../../state/types/domain-registry.js';\nimport {broadcast, error, isLocalSource, isRemoteSource, success, unicast} from '../../common/messages.js';\nimport {join as gJoin} from '../global/messages.js'\nimport {metricsDomainUri, metricsFailure, metricsUnhandledMessage} from '../metrics/constants.js';\nimport {exceptionToReason, reason, requestToReason} from '../../reason.js';\nimport {getLogger} from '../../logger.js';\nimport {\n    announcePeer,\n    byId,\n    byIdInDomain,\n    byIdInDomainThrows,\n    bySourceInDomain,\n    isClusterPeer,\n    JoinedPeer,\n    peersInDomain,\n    updatePeer\n} from '../../state/peers.js';\nimport {inDomain, joinDomain, leaveDomain} from '../../state/core.js';\nimport * as ctx from '../../state/types/context.js'\nimport {Context} from '../../state/types/context.js'\nimport {\n    announceContexts,\n    compatibilityModeFilter,\n    ContextOverrides,\n    forwardCreate,\n    forwardDestroy,\n    forwardSubscribe,\n    forwardUnsubscribe,\n    forwardUpdate,\n    peerToDomainUri,\n    removePeer\n} from '../../common/context/ops.js';\nimport {contextDomainUri, reasonPeerRemoved} from './constants.js';\nimport {peerToAddress} from '../../address.js';\nimport {nodeId} from '../../common/ids.js';\nimport {globalDomainUri} from '../global/constants.js';\nimport {CommandType, ContextRequestType, DomainType, MessageType, NodeMessage, SendMessageAction} from '../../node.js';\nimport {parse} from '../../restrictions.js';\nimport {Identity, OriginType, PeerId, Restrictions, Source} from '../../state/types/common.js';\nimport {DomainJoin, Leave, RemoteJoin} from '../global/types/messages.js';\nimport {Draft} from 'immer';\nimport {contexts, isClusterContext} from '../../common/context/state.js';\nimport {createContext, subscribe} from './messages.js';\nimport {IOGateway} from '../../../gateway';\n\nconst log = getLogger('gateway.domains.context');\n\n// conversion functions\n\nfunction contextToRequest(peerId: PeerId, ctx: Context) {\n    return createContext(\n        undefined as unknown as string, // requestId\n        peerId,\n        ctx.name,\n        ctx.data,\n        ctx.lifetime,\n        ctx.read_permissions,\n        ctx.write_permissions,\n        ctx.version);\n}\n\nfunction announceJoinedPeer(state: State, receiver: Source, peerId: PeerId, wasInCompat?: boolean): SendMessageAction<'context-added' | 'peer-added'>[] {\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Context);\n    let announceMessages: SendMessageAction<'context-added' | 'peer-added'>[] =\n        announcePeer(contextDomainUri, DomainKeys.Context, state, receiver, peer)\n            .filter((m) => compatibilityModeFilter(state, m));\n    if (wasInCompat) {\n        // if the peer was already implicitly joined, then its already announced\n        announceMessages = announceMessages.filter((m) => peerId !== m.body['new_peer_id']);\n    }\n    // if the peer was implicitly joined already, it has received the contexts\n    const contextMessages: SendMessageAction<'context-added' | 'peer-added'>[] = !wasInCompat ? announceContexts(peerToDomainUri(peer), state, peer) : [];\n    return announceMessages.concat(contextMessages);\n}\n\nfunction join(state: State, source: Source, peerId: PeerId, peerIdentity: Identity, restrictions: Restrictions, wasInCompat?: boolean): HandleReturnType {\n    let nextState = joinDomain(state, peerId, ctx.contextDomain, restrictions);\n    //todo log action\n    if (wasInCompat) {\n        nextState = updatePeer(nextState, peerId, (draft: Draft<Peer>) => {\n            if (draft.options) {\n                delete draft.options[\"context-compatibility-mode?\"];\n                if (Object.keys(draft.options).length === 0) {\n                    delete draft.options;\n                }\n            }\n        });\n    }\n    return [nextState, announceJoinedPeer(nextState, source, peerId, wasInCompat)];\n}\n\nfunction localJoin(state: State, source: Source, request: DomainJoin): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, identity: peerIdentity, restrictions} = request;\n    const contextCompatMode = request.options?.[\"context-compatibility-mode?\"]\n    const wasInCompat = byId(state, peerId)?.options?.[\"context-compatibility-mode?\"];\n    const alreadyHere = inDomain(state, peerId, ctx.contextDomain);\n\n    if (alreadyHere && !wasInCompat) {\n        // already in the domain\n        return [state, [success(contextDomainUri, source, requestId, peerId)]]\n    } else {\n        // we need to join it\n        const parsedRestrictions = parse(restrictions);\n        let [nextState, msgs] = join(state, source, peerId, peerIdentity, parsedRestrictions, alreadyHere && wasInCompat);\n        const peer = byId(nextState, peerId);\n\n        const messages: SendMessageAction<MessageType>[] = []\n        if (!contextCompatMode) {\n            messages.push(success(contextDomainUri, source, requestId, peerId));\n        }\n        if (isClusterPeer(DomainKeys.Context, peer)) {\n            const message: Omit<RemoteJoin, 'restrictions'> & { restrictions?: unknown } = {\n                ...request,\n                domain: globalDomainUri,\n                type: 'join',\n                destination: contextDomainUri,\n                identity: peerIdentity\n            };\n            if (peer?.options) {\n                message.options = peer.options;\n            }\n            if (parsedRestrictions) {\n                message.restrictions = parsedRestrictions;\n            }\n            messages.push(broadcast(peerToAddress(nodeId(state.ids), peerId), message));\n        }\n        return [nextState, msgs.concat(messages)];\n    }\n}\n\nfunction remoteJoin(state: State, source: Source, request: RemoteJoin): HandleReturnType {\n    const {peer_id: peerId, identity: peerIdentity, restrictions} = request;\n    const wasInCompat = byId(state, peerId)?.options?.[\"context-compatibility-mode?\"];\n    if (!(wasInCompat && inDomain(state, peerId, ctx.contextDomain))) {\n        return join(state, source, peerId, peerIdentity, restrictions, wasInCompat);\n    }\n    return [state, []];\n}\n\nexport function forwardJoin(state: State, source: Source, request: Omit<DomainJoin, 'type'>): HandleReturnType {\n    return isRemoteSource(source) ? remoteJoin(state, source, request as RemoteJoin) : localJoin(state, source, request as DomainJoin);\n}\n\nfunction remoteLeave(state: State, source: Source, request): HandleReturnType {\n    const {peer_id: peerId} = request;\n    const peer = byIdInDomain(state, peerId, DomainKeys.Context);\n    if (peer) {\n        return removePeer(contextDomainUri, state, peer, requestToReason(request), false);\n    }\n    return [state, []];\n}\n\nfunction localLeave(state: State, source: Source, request): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId} = request;\n    const [newState, msg] = removePeer(contextDomainUri, state, byIdInDomainThrows(state, peerId, DomainKeys.Context), requestToReason(request), false);\n\n    return [\n        newState,\n        msg.concat([\n            success(contextDomainUri, source, requestId, peerId),\n            broadcast(\n                peerToAddress(nodeId(newState.ids), peerId),\n                {\n                    ...request,\n                    type: 'leave'\n                })])];\n\n}\n\nexport function forwardLeave(state: State, source: Source, request): HandleReturnType {\n    return isRemoteSource(source) ? remoteLeave(state, source, request) : localLeave(state, source, request);\n}\n\nexport function sendState(state: State): StateToMessagesReturnType {\n    const nodeId = state.ids.nodeId;\n    const receiver = undefined as unknown as Source;\n    const joinMessages: StateToMessagesReturnType = peersInDomain(state, DomainKeys.Context)\n        .filter(peer => isLocalSource(peer.source) && isClusterPeer(DomainKeys.Context, peer))\n        .map(peer => {\n            const peerId = peer.id;\n            return unicast(\n                peerToAddress(nodeId, peerId),\n                receiver,\n                gJoin(undefined, peerId, peer[DomainKeys.Context].restrictions, contextDomainUri, peer.identity, peer.options));\n        });\n    const createMessages: StateToMessagesReturnType = contexts(state)\n        .filter(ctx => (ctx.local === true) && isClusterContext(ctx))\n        .flatMap(ctx => {\n            const members = ctx.members;\n            // it is not obvious which peer should create the context in the remote nodes in case the peer is not present anymore\n            const peerId: PeerId = ctx.owner ?? members.values().next().value!;\n            const creates: StateToMessagesReturnType = [unicast(peerToAddress(nodeId, peerId), receiver, contextToRequest(peerId, ctx))];\n            const subscribes: StateToMessagesReturnType = Array.from(members)\n                .map((member) => {\n                    return unicast(peerToAddress(nodeId, member), receiver, subscribe(undefined as unknown as string, member, ctx));\n                });\n            return creates.concat(subscribes);\n        });\n    const messages = joinMessages.concat(createMessages);\n    return messages;\n}\n\n/**\n * Source has disconnected from the system\n */\nexport function sourceRemoved(state: State, source: Source, request: IOGateway.Message<'commands/source-removed'>): HandleReturnType {\n    if (log.enabledFor('debug')) {\n        log.debug(`removing source ${JSON.stringify(source)} from context domain`);\n    }\n    const affected = bySourceInDomain(state, source, ctx.contextDomain);\n    const stateWithoutAffected = affected\n        .map(p => p.id)\n        .reduce((s, peerId) => {\n            return leaveDomain(s, peerId, ctx.contextDomain);\n        }, state);\n    const leaveRequest: Omit<Leave, 'peer_id'> = {\n        domain: globalDomainUri,\n        type: 'leave',\n        destination: contextDomainUri,\n        reason_uri: reasonPeerRemoved.uri,\n        reason: reasonPeerRemoved.message\n    };\n    const r: HandleReturnType = affected.reduce(([s, ms]: HandleReturnType, peer: JoinedPeer<DomainKeys.Context>) => {\n        const [ns, nms]: HandleReturnType = removePeer(contextDomainUri, s, peer, reasonPeerRemoved, true);\n\n        const bs: SendMessageAction<MessageType>[] = [];\n        if (isLocalSource(peer.source) && isClusterPeer(DomainKeys.Context, peer)) {\n            const message: Leave = {\n                ...leaveRequest,\n                peer_id: peer.id\n            };\n            bs.push(broadcast(peerToAddress(nodeId(state.ids), peer.id), message));\n        }\n        return [ns, ms.concat(nms.concat(bs))] as HandleReturnType;\n    }, [stateWithoutAffected, []] as HandleReturnType);\n    if (log.enabledFor('debug')) {\n        log.debug(`removed source ${JSON.stringify(source)} from context domain`);\n    }\n    return r;\n}\n\nexport function handleRequest(state: State, source: Source, request, options?: ContextDomainOptions): HandleReturnType {\n\n    switch (request.type) {\n        case 'domain/join': {\n            return forwardJoin(state, source, request as DomainJoin);\n        }\n        case 'domain/leave': {\n            return forwardLeave(state, source, request);\n        }\n        case 'create-context': {\n            return forwardCreate(contextDomainUri, state, source, request, options);\n        }\n        case 'update-context': {\n            return forwardUpdate(contextDomainUri, state, source, request);\n        }\n        case 'subscribe-context': {\n            return forwardSubscribe(contextDomainUri, state, source, request);\n        }\n        case 'unsubscribe-context': {\n            return forwardUnsubscribe(contextDomainUri, state, source, request);\n        }\n        case 'destroy-context': {\n            return forwardDestroy(contextDomainUri, state, source, request);\n        }\n        case 'commands/source-removed': {\n            return sourceRemoved(state, source, request);\n        }\n\n        default: {\n            log.error(`Unhandled message ${JSON.stringify(request)}`);\n            return [state, [error(metricsDomainUri, source, request['request_id'] ?? -1, request['peer_id'], reason(metricsUnhandledMessage, `Unhandled message ${JSON.stringify(request)}`))]]\n        }\n    }\n}\n\n\nclass ContextDomain implements Domain<ContextRequestType> {\n\n    constructor(private readonly options?: ContextDomainOptions) {}\n\n    destroy(state: State): State {\n        return state;\n    }\n\n    handleMessage(state: State, request: NodeMessage<CommandType | DomainType | ContextRequestType>): HandleReturnType {\n        const {source, body} = request;\n        try {\n            return handleRequest(state, source, body, this.options);\n        } catch (e) {\n            if (isLocalSource(source)) {\n                return [state, [error(metricsDomainUri, source, body['request_id'], body['peer_id'], exceptionToReason(e, metricsFailure))]]\n            } else {\n                return [state, []]\n            }\n        }\n    }\n\n    info(): DomainInfo {\n        return {uri: contextDomainUri, description: '', version: 3};\n    }\n\n    init(state: State): State {\n        return state;\n    }\n\n    stateToMessages(state: State): StateToMessagesReturnType {\n        return sendState(state);\n    }\n}\nexport type ContextDomainOptions = ContextOverrides & {\n    defaultPeerRestrictions?: OriginType;\n}\n\nexport function contextDomain(options?: ContextDomainOptions) {\n    return new ContextDomain(options);\n}\n", "import {Identity, PeerId, Restrictions} from './common.js';\nimport {Immutable} from 'immer';\nimport {DomainKeys, Options} from './state.js';\n\nexport const contextDomain = DomainKeys.Context;\nexport type ContextId = string;\nexport type Lifetime = 'ref-counted' | 'ownership' | 'retained' | 'activity';\nexport type Version = Immutable<{ updates: number, timestamp: number }>;\nexport type ContextData = Immutable<{ [name: string]: unknown }>\nexport type Context = Immutable<{\n    id: ContextId,\n    lifetime: Lifetime,\n    members: Set<PeerId>\n    creator: PeerId\n    identity: Identity\n    name?: string\n    read_permissions?: Restrictions\n    write_permissions?: Restrictions\n    data?: ContextData\n    owner?: PeerId\n    version?: Version\n    local?: boolean\n    options?: Options\n}>\n\nexport type ContextDomain = {\n    restrictions: Restrictions\n}\n", "import * as c from '../../constants.js';\nimport * as cc from '../../common/context/constants.js';\nimport {reason} from '../../reason.js';\n\nexport const contextDomainUri = c.contextDomainUri;\nexport const failure = cc.failure(contextDomainUri);\nexport const reasonPeerRemoved = reason(`${contextDomainUri}.peer-removed`, \"Peer has been removed\");\n", "import {contextDomainUri} from './constants.js';\nimport {CreateContext} from '../../common/context/types/messages.js';\nimport {RemoteSubscribeContext} from '../../common/context/ops.js';\nimport {PeerId} from '../../state/types/common.js';\nimport {Context, Version} from '../../state/types/context.js';\n\nexport function createContext(requestId: string, peerId: PeerId, name, data, lifetime, readPermissions, writePermissions, version?: Version): CreateContext & {version?: Version} {\n    return {\n        domain: contextDomainUri,\n        type: 'create-context',\n        request_id: requestId,\n        peer_id: peerId,\n        name,\n        data,\n        lifetime,\n        read_permissions: readPermissions,\n        write_permissions: writePermissions,\n        version\n    };\n}\n\nexport function subscribe(requestId: string, peerId: PeerId, context: Context): RemoteSubscribeContext {\n    return {\n        domain: contextDomainUri,\n        type: 'subscribe-context',\n        peer_id: peerId,\n        request_id: requestId,\n        context_id: context.id,\n        name: context.name\n    };\n}\n", "import {Domain, HandleReturnType, StateToMessagesReturnType} from '../../domain.js';\nimport {BusIncomingType, CommandType, DomainType, MessageType, NodeMessage, SendMessageAction} from '../../node.js';\nimport {DomainInfo} from '../../state/types/domain-registry.js';\nimport {DomainKeys, Peer, State} from '../../state/types/state.js';\nimport {getLogger} from '../../logger.js';\nimport {broadcast, error, isLocalSource, isRemoteSource, success, unicast} from '../../common/messages.js';\nimport {join as gJoin} from '../global/messages.js'\nimport {exceptionToReason, reason} from '../../reason.js';\nimport {busDomainUri, busUnhandledMessage, failure} from './constants.js';\nimport {inDomain, joinDomain, leaveDomain} from '../../state/core.js';\nimport {Subscription, SubscriptionId} from '../../state/types/bus.js';\nimport {DomainJoin, RemoteJoin} from '../global/types/messages.js';\nimport {\n    byId,\n    byIdInDomain,\n    byIdInDomainThrows,\n    bySourceInDomain,\n    isClusterPeer,\n    JoinedPeer,\n    peersInDomain,\n    setPeer,\n    visiblePeers\n} from '../../state/peers.js';\nimport {exceptionData} from '../../common/types.js';\nimport {parse} from '../../restrictions.js';\nimport {peerToAddress} from '../../address.js';\nimport {nodeId, requestId} from '../../common/ids.js';\nimport {PublishRequest, SubscribeRequest, SubscriptionData, UnsubscribeRequest} from './types/requests.js';\nimport {Draft, produce} from 'immer';\nimport {event, subscribed} from './messages.js';\nimport {Identity, NodeAddress, OriginType, PeerId, Restrictions, Source} from '../../state/types/common.js';\nimport {Publish, Subscribe, Unsubscribe} from './types/messages.js';\nimport {IOGateway} from '../../../gateway';\n\nconst log = getLogger('gateway.domains.bus')\n\n// joining and leaving the domain\n\n/**\n * Remote peer is joining the domain.\n *\n *   Updates the state and generates messages to all existing peers announcing the new peer\n */\nfunction remoteJoin(state: State, source: Source, request: {peer_id: PeerId, restrictions: Restrictions}): HandleReturnType {\n    const {peer_id: peerId, restrictions} = request;\n    if (!inDomain(state, peerId, DomainKeys.Bus)) {\n        return [joinDomain(state, peerId, DomainKeys.Bus, restrictions), []];\n    }\n    return [state, []];\n}\n\n/*Local peer is joining the domain.\n\n  Updates the state and generates messages to all existing peers announcing the new peer*/\nfunction localJoin(state: State, source: Source, request: DomainJoin, options?: BusDomainOptions): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, restrictions} = request;\n    if (inDomain(state, peerId, DomainKeys.Bus)) {\n        // the peer is already in the domain\n        return [state, [success(busDomainUri, source, requestId, peerId)]];\n    }\n    // we need to join it\n\n    const parsedRestrictions = parse(restrictions) ?? options?.defaultPeerRestrictions;\n    state = joinDomain(state, peerId, DomainKeys.Bus, parsedRestrictions);\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Bus);\n\n    const messages: SendMessageAction<'success' | 'join'>[] = [success(busDomainUri, source, requestId, peerId)];\n    if (isClusterPeer(DomainKeys.Bus, peer)) {\n        const message = {...request, type: 'join', options: peer?.options, restrictions: peer[DomainKeys.Bus].restrictions} as unknown as RemoteJoin;\n        messages.push(broadcast(peerToAddress(nodeId(state.ids), peerId), message));\n    }\n    return [state, messages];\n}\n\nfunction forwardJoin(state: State, source: Source, request, options) {\n    return isRemoteSource(source) ? remoteJoin(state, source, request) : localJoin(state, source, request, options);\n}\n\n\n/**\n * Source has disconnected from the system\n */\nfunction sourceRemoved(state: State, source: Source): HandleReturnType {\n    if (log.enabledFor('debug')) {\n        log.debug(`removing source ${JSON.stringify(source)} from bus domain`);\n    }\n    state = bySourceInDomain(state, source, DomainKeys.Bus).reduce((s, p) => {\n        return leaveDomain(s, p.id, DomainKeys.Bus);\n    }, state);\n    return [state, []];\n}\n\n\nfunction remoteLeave(state: State, source: Source, request): HandleReturnType {\n    const {peer_id: peerId} = request;\n    const peer = byId(state, peerId);\n    if (peer) {\n        return [leaveDomain(state, peerId, DomainKeys.Bus), []];\n    }\n    return [state, []];\n}\n\nfunction localLeave(state: State, source: Source, request): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId} = request;\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Bus);\n    const newState = leaveDomain(state, peerId, DomainKeys.Bus);\n    const messages: SendMessageAction<'success' | 'leave'>[] = [success(busDomainUri, source, requestId, peerId)];\n    if (isClusterPeer(DomainKeys.Bus, peer)) {\n        messages.push(broadcast(peerToAddress(nodeId(state.ids), peerId), {\n            ...request,\n            type: 'leave'\n        }));\n    }\n    return [newState, messages];\n}\n\nfunction forwardLeave(state: State, source: Source, request): HandleReturnType {\n    return isRemoteSource(source) ? remoteLeave(state, source, request) : localLeave(state, source, request);\n}\n\n// event publishing\n\n/**\n * given a collection of peers, returns a [[peer subscription-a] [peer subscription-b]] where\n *   subscription-a and subscription-b are the topic subscriptions of the peer\n */\nfunction zipPeerSubscriptions(peers: Peer[]): Array<{ peer: Peer, subscription: [SubscriptionId, Subscription] }> {\n    return peers.map((peer: Peer) => {\n        const result: [Peer, Array<[SubscriptionId, Subscription]>] = [peer, Object.entries<Subscription>(peer[DomainKeys.Bus]?.subscriptions || {})];\n        return result;\n    }).flatMap(([peer, entries]: [Peer, Array<[SubscriptionId, Subscription]>]) => {\n        return entries\n            .map(([id, subscription]: [SubscriptionId, Subscription]) => {\n                return {peer, subscription: [id, subscription]};\n            });\n    });\n}\n\n/**\n * checks if sub-topic matches topic\n */\nfunction matchesTopic({\n                          topic: subTopic,\n                          topicRepattern: subPattern\n                      }: { topic: string, topicRepattern?: RegExp }, topic: string): boolean {\n\n    if (subPattern) {\n        const match = topic.match(subPattern);\n        return match !== null && topic === match[0];\n    } else {\n        return subTopic === topic;\n    }\n}\n\nfunction matchesRouting(subKey?: string, key?: string): boolean {\n    return !subKey || !key || subKey === key;\n}\n\n/**\n * checks if given topic and routing key match an existing subscription\n */\nfunction matchesSubscription(topic: string, routingKey: string | undefined, [, subscription]: [SubscriptionId, Subscription]): boolean {\n    return matchesTopic(subscription, topic) && matchesRouting(subscription.routingKey, routingKey);\n}\n\nfunction matchesTarget(target: Identity | undefined, peer: Peer): boolean {\n    if (target) {\n        const peerIdentity = peer.identity;\n        for (const [k, v] of Object.entries(target)) {\n            if (peerIdentity[k] !== v) {\n                return false;\n            }\n        }\n    }\n    return true;\n}\n\n/**\n * distributes a message onto all matching subscribers\n */\nfunction publish(state: State, request: PublishRequest, publisher: BusPeer): HandleReturnType {\n    const {data} = request;\n    if (data) {\n        const {topic, routing_key: routingKey, peer_id: publisherId, target_identity: target} = request;\n        const matcher: (entry: [SubscriptionId, Subscription]) => boolean = (entry) => matchesSubscription(topic, routingKey, entry);\n        const targetMatcher: (peer: Peer) => boolean = (peer) => matchesTarget(target, peer);\n        const publisherIdentity = publisher.identity;\n        const remotes = new Set<string>();\n        const messages: SendMessageAction<MessageType>[] =\n            zipPeerSubscriptions(\n                visiblePeers(state, DomainKeys.Bus, publisher, true)\n                    .filter(targetMatcher)\n            ).filter(({subscription}) => matcher(subscription))\n                .reduce((messages: SendMessageAction<MessageType>[], {\n                    peer: subscriber,\n                    subscription\n                }: { peer: Peer, subscription: [SubscriptionId, Subscription] }) => {\n                    const subSource = subscriber.source;\n                    const subscriberId = subscriber.id;\n                    const [first, ] = subscription;\n                    const msg = isLocalSource(subSource)\n                        ? event(subSource, subscriberId, first, publisherIdentity, data)\n                        : function (): SendMessageAction<'publish'> | undefined {\n                            // remote source - we need to propagate the request to a unique list of nodes\n                            // otherwise there will be event duplication\n\n                            if (publisherId !== subscriberId) {\n                                const node = subSource['node'];\n                                if (remotes.has(node)) {\n                                    remotes.add(node);\n                                    const recipient: NodeAddress = {\n                                        type: 'node',\n                                        node: node\n                                    };\n                                    return unicast(peerToAddress(nodeId(state.ids), publisherId), recipient, request as Publish);\n                                }\n                            }\n                        }();\n                    return msg ? messages.concat(msg) : messages;\n                }, []);\n        return [state, messages];\n    }\n    return [state, []];\n}\n\nfunction localPublish(state: State, request: PublishRequest): HandleReturnType {\n    const {peer_id: publisherId} = request;\n    const peer = byIdInDomainThrows(state, publisherId, DomainKeys.Bus);\n    if (peer) {\n        return publish(state, request, peer);\n    }\n    return [state, []];\n}\n\nfunction remotePublish(state: State, request: PublishRequest): HandleReturnType {\n    const {peer_id: publisherId} = request;\n    const peer = byIdInDomain(state, publisherId, DomainKeys.Bus);\n    if (peer) {\n        return publish(state, request, peer);\n    }\n    return [state, []];\n}\n\nexport function forwardPublish(state: State, source: Source, request): HandleReturnType {\n    return isLocalSource(source) ? localPublish(state, request) : remotePublish(state, request);\n}\n\nfunction isWildcard(topic: string): boolean {\n    return topic.indexOf('>') !== -1 || topic.indexOf('*') !== -1;\n}\n\nfunction topicToPattern(topic: string): RegExp {\n    return new RegExp(\n        topic\n            .replace(/\\./g, '\\\\.')\n            .replace(/\\*/g, '[a-zA-Z_0-9]+')\n            .replace(/>/g, '.*'), 'g');\n}\n\ntype BusPeer = JoinedPeer<DomainKeys.Bus>\n\nfunction subscribe(state: State, request: SubscribeRequest, subscriptionId: SubscriptionId, peer: BusPeer): HandleReturnType {\n    const {topic, routing_key: routingKey, request_id: requestId, peer_id: peerId} = request;\n    const source = peer.source;\n    peer = produce(peer, (draft: Draft<BusPeer>) => {\n        draft[DomainKeys.Bus].subscriptions = draft[DomainKeys.Bus].subscriptions || {};\n        draft[DomainKeys.Bus].subscriptions[subscriptionId] = {topic, routingKey};\n        if (isWildcard(topic)) {\n            draft[DomainKeys.Bus].subscriptions[subscriptionId].topicRepattern = topicToPattern(topic);\n        }\n    });\n    const message: BroadcastSubscribe = {...request as Subscribe, ...{subscription_id: subscriptionId}};\n    return [setPeer(state, peerId, peer), isLocalSource(source) ? [\n        subscribed(source, requestId, peerId, subscriptionId),\n        broadcast(peerToAddress(nodeId(state.ids), peerId), message)\n    ] : []]\n}\n\ntype BroadcastSubscribe = Subscribe & SubscriptionData;\n\nfunction localSubscribe(state: State, source: Source, request: SubscribeRequest): HandleReturnType {\n    const [newIds, subscriptionId] = requestId(state.ids);\n    const peerId = request.peer_id;\n    const peer = byIdInDomainThrows(state, peerId, DomainKeys.Bus);\n    return subscribe({...state, ids: newIds}, request, subscriptionId, peer);\n}\n\nfunction remoteSubscribe(state: State, source: Source, request: BroadcastSubscribe): HandleReturnType {\n    const {subscription_id: subscriptionId, peer_id: peerId} = request;\n    const peer = byIdInDomain(state, peerId, DomainKeys.Bus);\n    if (peer) {\n        return subscribe(state, request, subscriptionId, peer);\n    }\n    return [state, []];\n}\n\nexport function forwardSubscribe(state: State, source: Source, request: SubscribeRequest | BroadcastSubscribe): HandleReturnType {\n    return isLocalSource(source) ? localSubscribe(state, source, request) : remoteSubscribe(state, source, request as BroadcastSubscribe);\n}\n\nfunction unsubscribe(state: State, request: UnsubscribeRequest, peer: BusPeer): HandleReturnType {\n    const {request_id: requestId, peer_id: peerId, subscription_id: subscriptionId} = request;\n    const source = peer.source;\n    peer = produce(peer, (draft: Draft<BusPeer>) => {\n        if (draft[DomainKeys.Bus].subscriptions) {\n            delete draft[DomainKeys.Bus].subscriptions[subscriptionId];\n        }\n    });\n    return [setPeer(state, peerId, peer), isLocalSource(source) ? [\n        success(busDomainUri, source, requestId, peerId),\n        broadcast(peerToAddress(nodeId(state.ids), peerId), request as Unsubscribe)\n    ] : []];\n}\n\nfunction localUnsubscribe(state: State, source: Source, request: UnsubscribeRequest): HandleReturnType {\n    const peer = byIdInDomainThrows(state, request.peer_id, DomainKeys.Bus);\n    return unsubscribe(state, request, peer);\n}\n\nfunction remoteUnsubscribe(state: State, request): HandleReturnType {\n    const peer = byIdInDomain(state, request.peer_id, DomainKeys.Bus);\n    if (peer) {\n        return unsubscribe(state, request, peer);\n    }\n    return [state, []];\n}\n\nexport function forwardUnsubscribe(state: State, source: Source, request: UnsubscribeRequest): HandleReturnType {\n    return isLocalSource(source) ? localUnsubscribe(state, source, request) : remoteUnsubscribe(state, request);\n}\n\n\nfunction handleRequest(state: State, source: Source, request, options?: BusDomainOptions): HandleReturnType {\n\n    switch (request.type) {\n        case 'domain/join': {\n            return forwardJoin(state, source, request as DomainJoin, options);\n        }\n        case 'domain/leave': {\n            return forwardLeave(state, source, request);\n        }\n        case 'commands/source-removed': {\n            return sourceRemoved(state, source);\n        }\n        case 'publish': {\n            return forwardPublish(state, source, request);\n        }\n        case 'subscribe': {\n            return forwardSubscribe(state, source, request);\n        }\n        case 'unsubscribe': {\n            return forwardUnsubscribe(state, source, request);\n        }\n        default: {\n            log.error(`Unhandled message ${JSON.stringify(request)}`);\n            return [state, [error(busDomainUri, source, request['request_id'] ?? -1, request['peer_id'], reason(busUnhandledMessage, `Unhandled message ${JSON.stringify(request)}`))]];\n        }\n    }\n}\n\nclass BusDomain implements Domain<BusIncomingType> {\n    constructor(private readonly options?: BusDomainOptions) {}\n    info(): DomainInfo {\n        return {\n            uri: busDomainUri,\n            description: '',\n            version: 1\n        };\n    }\n\n    init(state: State): State {\n        return state;\n    }\n\n    destroy(state: State): State {\n        return state;\n    }\n\n    handleMessage(state: State, msg: NodeMessage<CommandType | DomainType | BusIncomingType>): HandleReturnType {\n        const {source, body} = msg;\n        try {\n            return handleRequest(state, source, body, this.options);\n        } catch (e) {\n            if (!exceptionData(e)) {\n                log.error(`Error processing message ${JSON.stringify(msg)}`, e);\n            }\n            return [state, [error(busDomainUri, source, body['request_id'], body['peer_id'], exceptionToReason(e, failure))]];\n        }\n    }\n\n    stateToMessages(state: State): StateToMessagesReturnType {\n        const node = nodeId(state.ids);\n        const receiver = undefined as unknown as Source;\n        const result = peersInDomain(state, DomainKeys.Bus)\n            .filter(peer => isLocalSource(peer.source) && isClusterPeer(DomainKeys.Bus, peer))\n            .flatMap(peer => {\n                const peerId = peer.id;\n                const messages: IOGateway.Message<'join'>[]= [\n                    gJoin(undefined, peerId, peer[DomainKeys.Bus].restrictions, busDomainUri, peer.identity, peer.options),\n                ];\n                return messages.map(msg => unicast(peerToAddress(node, peerId), receiver, msg));\n            });\n\n        return result;\n    }\n\n}\n\nexport type BusDomainOptions = {\n    defaultPeerRestrictions?: OriginType;\n}\nexport function busDomain(options?: BusDomainOptions): BusDomain {\n    return new BusDomain(options);\n}\n", "export const busDomainUri = 'bus';\n\nexport const failure = `${busDomainUri}.errors.failure`;\nexport const busUnhandledMessage = `${busDomainUri}.errors.unhandled_message`;\n", "import {SendMessageAction} from '../../node.js';\nimport {outgoing} from '../../common/messages.js';\nimport {Subscribed, Event} from './types/messages.js';\nimport {busDomainUri} from './constants.js';\nimport {SubscriptionId} from '../../state/types/bus.js';\nimport {Identity, PeerId, Source} from '../../state/types/common.js';\n\nexport function event(recipient: Source, subscriberId: PeerId, subscriptionId: SubscriptionId, publisherIdentity: Identity, data): SendMessageAction<'event'> {\n    const message: Event = {\n        domain: busDomainUri,\n        type: 'event',\n        peer_id: subscriberId,\n        subscription_id: subscriptionId,\n        \"publisher-identity\": publisherIdentity,\n        data\n    }\n    return outgoing(recipient, message)\n\n}\n\nexport function subscribed(recipient: Source, requestId, subscriberId: PeerId, subscriptionId: SubscriptionId): SendMessageAction<'subscribed'> {\n    const message: Subscribed = {\n        domain: busDomainUri,\n        type: 'subscribed',\n        request_id: requestId,\n        peer_id: subscriberId,\n        subscription_id: subscriptionId\n    }\n    return outgoing(recipient, message);\n}\n", "import {LocalAddress} from '../state/types/common.js';\nimport {getLogger} from '../logger.js';\nimport {GatewayNode} from '../node.js';\n\nconst log = getLogger('gateway.clients');\n\nexport type ClientInfo = {\n    source: LocalAddress,\n    lastAccess: number,\n    onScavenge?: (this: ClientInfo) => void,\n    onStop?: (this: ClientInfo) => void\n};\nexport type Clients = Map<string, ClientInfo>\n\nexport function addClient(clients: Clients, node: GatewayNode, key: string, source: LocalAddress, onScavenge?: () => void, onStop?: () => void) {\n    log.info(`adding client for key ${key}`);\n    const client = {source, lastAccess: Date.now(), onScavenge, onStop};\n    clients.set(key, client);\n    try {\n        node.addSource(source);\n    } catch (e) {\n        log.error(`Unable to add client for key ${key}`, e);\n    }\n}\n\nexport function removeClient(clients: Clients, node: GatewayNode, key: string) {\n    log.info(`removing client for key ${key}`);\n    const client = clients.get(key);\n    if (client) {\n        clients.delete(key);\n        try {\n            node.removeSource(client.source);\n        } catch (e) {\n            log.error(`Unable to remove client for ${key}`, e);\n        }\n    }\n}\n", "import {Clients, removeClient} from './clients.js';\nimport {getLogger} from '../logger.js';\nimport {GatewayNode} from '../node.js';\n\nconst log = getLogger('gateway.scavenger');\n\nfunction scavengeClients(clients: Clients, node: GatewayNode, olderThan: number) {\n    if (log.enabledFor('trace')) {\n        log.debug(`running client scavenger. collecting everything older than ${olderThan}`);\n    }\n    clients.forEach((v, key) => {\n        if (v.lastAccess <= olderThan) {\n            log.info(`scavenging client for ${key}. Last access ${new Date(v.lastAccess)} < ${new Date(olderThan)}`);\n            try {\n                removeClient(clients, node, key);\n                if (v.onScavenge) {\n                        v.onScavenge();\n                }\n            }\n            catch (ex) {\n                log.warn(`error scavenging client for ${key}`, ex);\n            }\n        }\n    });\n\n}\nconst MIN_INACTIVE_SECONDS = 10;\nconst MILLIS_IN_SECOND = 1000;\nexport default class Scavenger {\n\n    private scavenging: boolean = false;\n    private readonly cancel: ReturnType<typeof setTimeout> | undefined;\n\n    constructor(private readonly clients: Clients,\n                private readonly node: GatewayNode,\n                private readonly inactiveSeconds: number) {\n        if (inactiveSeconds > 0) {\n            log.info(`clients inactive for ${inactiveSeconds} seconds will be scavenged`);\n            this.cancel = setInterval(async () => {\n                this.scavengeClients();\n            }, MILLIS_IN_SECOND);\n        }\n    }\n\n    scavengeClients() {\n        if (this.scavenging) {\n            return;\n        }\n        try {\n            this.scavenging = true;\n            const lastAccess = 2 * Math.max(this.inactiveSeconds, MIN_INACTIVE_SECONDS) * MILLIS_IN_SECOND;\n            const olderThan = Date.now() - lastAccess;\n            scavengeClients(this.clients, this.node, olderThan);\n\n        } finally {\n            this.scavenging = false;\n        }\n    }\n\n    stop() {\n        clearTimeout(this.cancel);\n    }\n}\n", "// generated\nexport const GATEWAY_VERSION = \"0.13.0-beta.0\";\n", "import {ResponseType} from '../../node.js';\nimport {MessageReceiver} from '../../common/channel.js';\nimport {Hiccup} from '../../restrictions/types.js';\nimport {IOGateway} from '../../../gateway';\n\nexport type OriginType = 'local' | 'cluster';\nexport type AddressType = OriginType | 'peer' | 'node';\n\nexport type PeerId = string;\nexport type RequestId = string;\n\nexport type Identity = {\n    user?: string,\n    application?: string\n    [key: string]: unknown\n}\n\nexport type Restrictions = Readonly<undefined | OriginType | Hiccup>;\n\nexport interface Source {\n    type: AddressType\n}\n\n// if its a local peer, then it has a channel (receive function)\nexport interface LocalAddress extends Source {\n    type: 'local'\n    receive: MessageReceiver<IOGateway.Message<ResponseType | 'ping'>> | string | null\n    endpoint: string\n    host?: string\n    auth?: (request: IOGateway.Auth.AuthenticationRequest) => Promise<IOGateway.Auth.AuthenticationSuccess>\n}\n\n// if its a remote peer, then it has a peer(-id)\nexport interface PeerAddress extends Source {\n    type: 'peer'\n    peer: PeerId\n    node: string\n}\n\n// broadcast address\nexport interface ClusterAddress extends Source {\n    type: 'cluster'\n}\n\n// unicast node address\nexport interface NodeAddress extends Source {\n    type: 'node'\n    node: string\n}\n\n\nexport function isPeerAddress(source?: Source): source is PeerAddress {\n    return source?.type === 'peer';\n}\n\nexport function isNodeAddress(source?: Source): source is NodeAddress {\n    return source?.type === 'node';\n}\n\nexport function isClusterAddress(source?: Source): source is ClusterAddress {\n    return source?.type === 'cluster';\n}\n", "import {\n    CommandType,\n    handleMessage as nodeHandleMessage,\n    buildDomains,\n    InternalType,\n    MessageType,\n    GatewayNode,\n    NodeMessage,\n    NodeOptions,\n    RequestType,\n    SendMessageAction\n} from '../node.js';\nimport {\n    isClusterAddress,\n    isNodeAddress,\n    isPeerAddress,\n    NodeAddress,\n    PeerId,\n    Source\n} from '../state/types/common.js';\nimport {ClusterType, Mesh, MeshMessageAction} from '../mesh.js';\nimport {HandleReturnType, Domain} from '../domain.js';\nimport {failure} from '../constants.js';\nimport {emptyState} from '../state/core.js';\nimport {getLogger} from '../logger.js';\nimport {error} from '../common/messages.js';\nimport {exceptionToReason} from '../reason.js';\nimport {friendlily, some} from '../common/utilities.js';\nimport {MessageReceiver} from '../common/channel.js';\nimport {byId} from '../state/peers.js';\nimport {State} from '../state/types/state.js';\nimport {IOGateway} from '../../gateway';\n\ntype MeshNodeOptions = NodeOptions\n\nclass MeshNode implements GatewayNode {\n    constructor(private readonly handler: MessageReceiver<NodeMessage<RequestType | CommandType>>,\n                private readonly cluster: Mesh,\n                private readonly nodeId: string) {\n    }\n\n    close(): void {\n        this.cluster.unregister(this.nodeId);\n        this.cluster.close();\n    }\n\n    message(msg: NodeMessage<RequestType>) {\n        this.handler(msg);\n    }\n\n    addSource(source: Source) {\n        // do nothing\n    }\n\n    removeSource(source: Source): void {\n        const msg: NodeMessage<CommandType> = {\n            origin: 'local',\n            source,\n            body: {type: 'commands/source-removed'}\n        }\n        return this.handler(msg);\n    }\n}\n\nconst log = getLogger('gateway.node.mesh');\n\ntype MeshNodeMessage<T> = NodeMessage<T> & { receiver: Source }\ntype ClusterNodeMessage = MeshNodeMessage<CommandType | ClusterType> & { origin: 'cluster' };\n\nfunction handleMessage(state: State, msg: MeshNodeMessage<CommandType | MessageType | ClusterType> | NodeMessage<RequestType | CommandType | InternalType>): HandleReturnType {\n    const {source, body, origin/*, receiver*/} = msg;\n    // const nodeId = state.ids.nodeId;\n    try {\n        if (body['dump']) {\n            log.info(`state dump:\\n${JSON.stringify(friendlily(state), null, '\\t')}`);\n            return [state, []];\n        } else if (origin === 'cluster') {\n            return handleClusterMessage(state, msg as ClusterNodeMessage);\n        } else {\n            return nodeHandleMessage(state, msg as NodeMessage<RequestType | CommandType | InternalType>, source);\n        }\n    } catch (e) {\n        log.error(`Error handling message ${JSON.stringify(msg)}`, e);\n        const m = body as {\n            request_id?: string\n            peer_id?: PeerId\n        };\n        return [state, [error(undefined, source, m.request_id, m.peer_id, exceptionToReason(e, failure))]];\n    }\n}\n\nfunction sendState(state: State, nodeId: string, targetNodeId: string): HandleReturnType {\n    log.info(`Node ${nodeId} is sending state to node ${targetNodeId}`);\n    const receiver: NodeAddress = {type: 'node', node: targetNodeId};\n    const msgs = Object.values(state.registeredDomains || [])\n        .map(value => value.domain)\n        .flatMap(domain => domain.stateToMessages(state))\n        .filter(some<Omit<SendMessageAction<MessageType>, 'receiver'>>)\n        .map<SendMessageAction<MessageType>>(m => {\n            return {...m, receiver};\n        });\n    return [state, msgs];\n}\n\nfunction hasReceiver(address): address is { receive: MessageReceiver<IOGateway.Message<unknown>> } {\n    return 'receive' in address && address.receive;\n}\n\nfunction handleClusterMessage(state: State, msg: ClusterNodeMessage): HandleReturnType {\n    const nodeId = state.ids.nodeId;\n    const {source, body, origin, receiver} = msg;\n    if (isPeerAddress(receiver)) {\n        // who sets node in the receiver?\n        if (nodeId === receiver.node) {\n            const peer = byId(state, receiver.peer);\n            if (peer) {\n                if (hasReceiver(peer.source)) {\n                    peer.source.receive(body);\n                }\n            }\n        }\n        return [state, []];\n    } else if (isNodeAddress(receiver)) {\n        if (nodeId === receiver.node) {\n            if (body.type === 'send-state') {\n                return sendState(state, nodeId, source['node']);\n            }\n            return nodeHandleMessage(state, msg as NodeMessage<CommandType | RequestType>, source);\n        }\n        return [state, []];\n    } else if (isClusterAddress(receiver)) {\n        if (nodeId !== source['node']) {\n            if (body.type === 'send-state') {\n                return sendState(state, nodeId, source['node']);\n            }\n            return nodeHandleMessage(state, msg as NodeMessage<CommandType | RequestType>, source);\n        }\n        return [state, []];\n    } else {\n        return nodeHandleMessage(state, msg as NodeMessage<CommandType | RequestType>, source);\n    }\n}\n\n// response processing\n\nfunction processResponse<T extends MessageType>(nodeId: string, cluster: Mesh, response: MeshMessageAction<T | CommandType>) {\n    switch (response.receiver.type) {\n        case 'cluster': {\n            if (log.enabledFor('debug')) {\n                log.debug(`broadcasting message ${JSON.stringify(response)}`);\n            }\n            cluster.publish(nodeId, response);\n            break;\n        }\n        case 'node': {\n            if (log.enabledFor('debug')) {\n                log.debug(`unicasting message ${JSON.stringify(response)}`);\n            }\n            cluster.publish(nodeId, response);\n            break;\n        }\n        case 'peer': {\n            if (log.enabledFor('debug')) {\n                const {receiver, body} = response;\n                if (log.enabledFor('debug')) {\n                    log.debug(`Sending message ${JSON.stringify(body, null, '\\t')} to remote peer ${JSON.stringify(receiver)}`);\n                }\n            }\n            cluster.publish(nodeId, response);\n            break;\n        }\n        case 'local': {\n            const {receiver, body} = response;\n            if (log.enabledFor('debug')) {\n                log.debug(`Sending message ${JSON.stringify(body, null, '\\t')} to local peer ${JSON.stringify(receiver)}`);\n            }\n            if (hasReceiver(receiver)) {\n                receiver.receive(body);\n            }\n            break;\n        }\n        default: {\n            log.error(`Unable to process response ${JSON.stringify(response)}`);\n            break;\n        }\n    }\n}\n\nfunction localUsers(state: State): ReadonlySet<string> {\n    return new Set(state.users?.byName?.keys())\n}\n\nfunction processMessage(state: State, cluster: Mesh, msg: MeshNodeMessage<MessageType | CommandType | ClusterType> | NodeMessage<InternalType | CommandType | RequestType>) {\n    try {\n        if (log.enabledFor('trace')) {\n            log.debug(`domain handler processing message ${JSON.stringify(msg)}`);\n        }\n        const nodeId = state.ids.nodeId;\n        const [newState, responses] = handleMessage(state, msg);\n        const newUsers = localUsers(newState);\n        const oldUsers = localUsers(state);\n        try {\n            for (const m of responses) {\n\n                const x = {...m, source: {...m['source'], node: nodeId}};\n                processResponse(nodeId, cluster, x);\n            }\n        } catch (e) {\n            log.error(`error processing responses`, e);\n        }\n        const added = Array.from(newUsers ?? []).filter((u) => !oldUsers?.has(u));\n        if (added && added.length > 0) {\n            cluster.addUsers(nodeId, added);\n        }\n        const removed = Array.from(oldUsers ?? []).filter((u) => !newUsers?.has(u));\n        if (removed && removed.length > 0) {\n            cluster.removeUsers(nodeId, removed);\n        }\n        return newState ?? state;\n    } catch (e) {\n        log.error(`error handling message ${JSON.stringify(msg)}`, e);\n        return state;\n    }\n\n}\n\nexport function meshNode<T extends MessageType = MessageType>(cluster: Mesh, domains: Array<Domain<T>>, options: MeshNodeOptions): GatewayNode {\n    let state: State;\n    // const ser = new AsyncSerializer();\n\n    const handler = (msg: MeshNodeMessage<CommandType | MessageType | ClusterType> | NodeMessage<InternalType | CommandType | RequestType>) => {\n        state = processMessage(state, cluster, msg);\n    };\n\n    const registeredDomains = buildDomains(domains);\n\n    const nodeId = cluster.register(options.nodeId, Object.values(registeredDomains).map(domain => domain.info),\n        {\n            onMessage: (nodeId: string, msg: MeshMessageAction<MessageType | CommandType | ClusterType>) => {\n                if (log.enabledFor('debug')) {\n                    log.debug(`Node ${nodeId} received a message from cluster ${JSON.stringify(msg)}`);\n                }\n                return handler({...msg, origin: 'cluster'});\n            },\n            onMemberAdded: (nodeId: string, newNodeId: string) => {\n                if (log.enabledFor('debug')) {\n                    log.debug(`Node ${nodeId} received a node ${newNodeId} add to cluster.`)\n                }\n                const receiver: NodeAddress = {type: 'node', node: newNodeId};\n                const source: NodeAddress = {type: 'node', node: nodeId};\n                const msg: MeshNodeMessage<'send-state'> = {\n                    origin: 'cluster',\n                    receiver,\n                    source,\n                    body: {type: 'send-state'}\n                };\n                return cluster.publish(nodeId, msg);\n            },\n            onMemberRemoved: (nodeId, removedNodeId) => {\n                if (log.enabledFor('debug')) {\n                    log.debug(`Node ${nodeId} received a node ${removedNodeId} dropped from cluster`);\n                }\n                const receiver: NodeAddress = {type: 'node', node: nodeId};\n                const source: NodeAddress = {type: 'node', node: removedNodeId};\n                const msg: MeshNodeMessage<'commands/source-removed'> = {\n                    origin: 'cluster',\n                    receiver,\n                    source,\n                    body: {type: 'commands/source-removed'}\n                };\n                return handler(msg);\n            }\n        });\n\n    state = domains.reduce(\n        (s: State, domain) => {\n            return domain.init(s);\n        },\n        {\n            ...emptyState(nodeId, options.signingKey),\n            registeredDomains,\n            handler: (msg: NodeMessage<InternalType>) => {\n                handler(msg);\n            }\n        });\n\n    return new MeshNode(handler, cluster, nodeId);\n}\n", "import {getLogger} from '../../logger.js';\nimport {WebsocketConnectionFactory, WebsocketConnection} from './types.js';\nimport * as GatewayEncoders from '../encoders.js';\nimport {IOGateway} from '../../../gateway';\n\nconst logger = getLogger('gateway.ws.common');\n\nconst ConnectionStates = Object.freeze({\n    _initial:  -1,\n    connecting: 0,\n    connected:  1,\n    closing:    2,\n    closed:     3,\n});\ntype ConnectionState = keyof typeof ConnectionStates;\n\nabstract class InternalConnection<T> {\n    constructor(codec: GatewayEncoders.Codec<T, string>,\n                maxEnqueued: number,\n                retry?: Retry) {\n        this.codec = codec;\n        this.maxEnqueued = maxEnqueued;\n        this.retry = retry;\n    }\n\n    state: ConnectionState = '_initial';\n    codec: GatewayEncoders.Codec<T, string>;\n    socket?: WebSocket;\n    maxEnqueued: number;\n    queue: string[] = [];\n    retry?: Retry;\n    reconnectAttempt = 0;\n    reconnectTimeout?: ReturnType<typeof setTimeout>;\n    abstract createSocket(): WebSocket;\n}\n\nconst DEFAULT_RETRY = {\n    min: 1000 + (Math.random() * 4000), // between 1 and 5 seconds\n    max: 60 * 1000, // 60 seconds\n    factor: 1.3\n};\n\nfunction calculateReconnectDelay(attempt: number, retry?: Partial<typeof DEFAULT_RETRY>) {\n    const min = Math.max(1000, retry?.min ?? DEFAULT_RETRY.min);\n    const max = Math.max(min, retry?.max ?? DEFAULT_RETRY.max);\n    const factor = Math.max(1.0, retry?.factor ?? DEFAULT_RETRY.factor);\n    const delay = Math.round(Math.min(max, min * Math.pow(factor, attempt)));\n    return delay;\n}\n\nclass WsConnection<T> implements WebsocketConnection<T> {\n    readonly #internal: InternalConnection<T>;\n    constructor(uri: string | URL, internal: InternalConnection<T>) {\n        this.uri = typeof uri === 'string' ? uri : uri.href;\n        this.#internal = internal;\n    }\n\n    readonly uri: string;\n\n    onConnect?: (protocol?: string) => void\n    onReceive?: (msg: T) => void\n    onError?: (e: Error) => void\n    onDisconnect?: () => void\n    onClose?: () => void\n\n    private createAndInit() {\n        if (logger.enabledFor('debug')) {\n            logger.debug(`connecting to ${this.uri}`);\n        }\n        try {\n            const c = this.#internal.createSocket()\n            this.initSocket(c);\n        } catch(e) {\n            if (this.onError) {\n                this.onError(e instanceof Error ? e : new Error(`Failed to create socket: ${e}`));\n            } else {\n                logger.warn(`init socket error: ${e}`, e);\n            }\n        }\n    }\n\n    private initSocket(c: WebSocket) {\n        c.onopen = () => {\n            logger.info(`connection to ${this.uri} is up.`);\n            const wasConnecting = this.#internal.state === 'connecting';\n            if (this.#internal.queue.length > 0) {\n                logger.debug(`flushing ${this.#internal.queue.length} pending messages`);\n                while (this.#internal.queue.length > 0) {\n                    const data = this.#internal.queue.shift();\n                    if (data) {\n                        if (wasConnecting) {\n                            c.send(data);\n                        }\n                        else {\n                            logger.warn(`connection to ${this.uri} is ${this.#internal.state} state, dropping message ${data}`);\n                        }\n                    }\n                }\n            }\n            if (this.#internal.state === 'closing') {\n                c.close();\n                return;\n            }\n            this.#internal.state = 'connected';\n            this.#internal.socket = c;\n            if (this.onConnect) {\n                this.onConnect(c.protocol);\n            }\n        }\n        c.onerror = (e: Event) => {\n            if (this.onError) {\n                this.onError(e['error'] as Error);\n            } else {\n                logger.warn(`got error: ${e}`, e);\n            }\n        }\n        c.onmessage = (msg) => {\n            const data = this.#internal.codec.decode(msg.data);\n            if (logger.enabledFor('debug')) {\n                logger.debug(`got message ${JSON.stringify(data)} from ${this.uri}`);\n            }\n            if (this.onReceive) {\n                this.onReceive(data);\n            }\n        };\n        c.onclose = (e: CloseEvent) => {\n            let wasOpen = false;\n            if (this.#internal.socket !== undefined) {\n                wasOpen = true;\n                this.#internal.socket = undefined;\n            }\n            if (this.#internal.state === 'closing') {\n                if (wasOpen) {\n                    if (this.onDisconnect) {\n                        this.onDisconnect();\n                    }\n                }\n                this.#internal.state = 'closed';\n                logger.info(`connection to ${this.uri} has closed (${e.reason}:${e.code})`);\n                if (this.onClose) {\n                    this.onClose();\n                }\n            }\n            else {\n                const wasConnected = this.#internal.state === 'connected';\n                if (this.#internal.retry === false) {\n                    this.#internal.state = '_initial';\n                }\n                else {\n                    if (this.#internal.state !== 'connecting') {\n                        this.#internal.reconnectAttempt = 0;\n                        this.#internal.state = 'connecting';\n                    }\n                    const reconnectDelay = calculateReconnectDelay(this.#internal.reconnectAttempt, this.#internal.retry);\n                    this.#internal.reconnectAttempt ++;\n                    if (logger.enabledFor(`debug`)) {\n                        logger.debug(`will reconnect to ${this.uri} in ${reconnectDelay} ms. [attempt: ${this.#internal.reconnectAttempt}]`);\n                    }\n                    this.#internal.reconnectTimeout = setTimeout(() => {\n                        this.createAndInit();\n                    }, reconnectDelay);\n                }\n                if (wasConnected) {\n                    logger.info(`connection to ${this.uri} disconnected`);\n                    if (this.onDisconnect) {\n                        this.onDisconnect();\n                    }\n                }\n            }\n        }\n    }\n\n    connect() {\n        if (this.#internal.state !== '_initial') {\n            return;\n        }\n        this.#internal.state = 'connecting';\n\n        this.createAndInit();\n    }\n\n    close() {\n        if (this.#internal.state === 'closed' || this.#internal.state === 'closing') {\n            return;\n        }\n        const wasConnecting = this.#internal.state === 'connecting';\n        this.#internal.state = 'closing';\n        const socket = this.#internal.socket;\n        if (logger.enabledFor('debug')) {\n            logger.debug(`closing connection to ${this.uri} (opened?: ${socket !== undefined})`);\n        }\n        if (this.#internal.reconnectTimeout) {\n            clearTimeout(this.#internal.reconnectTimeout);\n            this.#internal.reconnectTimeout = undefined;\n        }\n\n        if (socket) {\n            this.#internal.socket = undefined;\n            socket.close();\n        }\n        else if (!wasConnecting) {\n            this.#internal.state = 'closed';\n            if (this.onClose) {\n                this.onClose();\n            }\n        } else {\n            // if wasConnecting wait for close/open\n        }\n    }\n\n    send(msg: T) {\n        if (this.#internal.state === 'closing' || this.#internal.state === 'closed') {\n            throw new Error(`connection to ${this.uri} is closed.`);\n        }\n        const socket = this.#internal.socket;\n        const enqueue = socket === undefined && this.#internal.maxEnqueued > 0 && this.#internal.queue.length < this.#internal.maxEnqueued;\n        if (logger.enabledFor('debug')) {\n            if (logger.enabledFor('debug')) {\n                let action: 'sending' | 'enqueueing' | 'dropping';\n                if (socket !== undefined) {\n                    action  = 'sending';\n                } else if (enqueue) {\n                    action = 'enqueueing';\n                }\n                else {\n                    action = 'dropping';\n                }\n                logger.debug(`${action} message ${JSON.stringify(msg)} to ${this.uri}`);\n            }\n        }\n        if (socket || enqueue) {\n            const data = this.#internal.codec.encode(msg);\n            if (socket) {\n                socket.send(data);\n            } else {\n                this.#internal.queue.push(data);\n            }\n        }\n    }\n\n    toJSON() {\n        return {uri: this.uri, state: this.#internal.state, enqueued: this.#internal.queue.length, attempts: this.#internal.reconnectAttempt};\n    }\n}\n\nfunction wsConstructor(websocket?: typeof WebSocket): (typeof WebSocket) {\n    if (websocket) {\n        return websocket;\n    }\n    if (globalThis.WebSocket) {\n        return globalThis.WebSocket;\n    }\n    else {\n        return WebSocket;\n    }\n}\n\nclass WsConnectionFactory<T> implements WebsocketConnectionFactory<T> {\n    readonly #codec: GatewayEncoders.Codec<T, string>;\n    readonly #retry?: Retry;\n    readonly #websocket?: typeof WebSocket;\n    readonly #connections = new Array<WsConnection<T>>();\n    constructor(codec: GatewayEncoders.Codec<T, string>, retry?: Retry, websocket?: typeof WebSocket) {\n        this.#codec = codec;\n        this.#retry = retry;\n        this.#websocket = websocket;\n    }\n\n    create(uri: string | URL, protocols?: string|string[], maxEnqueued: number = -1): WebsocketConnection<T> {\n        const websocketOverride = this.#websocket;\n        const internal = new class extends InternalConnection<T> {\n            createSocket() {\n                const WebSocketConstructor = wsConstructor(websocketOverride);\n                return new WebSocketConstructor(uri, protocols);\n            }\n        }(this.#codec, maxEnqueued, this.#retry);\n        const wsc = new WsConnection(uri, internal);\n        this.#connections.push(wsc);\n        return wsc;\n    }\n\n    close(): void {\n        while(this.#connections.length > 0) {\n            const connection = this.#connections.pop();\n            if (connection !== undefined) {\n                connection.close();\n            }\n        }\n\n    }\n\n}\n\nexport type Retry = Readonly<{\n    min?: number,\n    max?: number,\n    factor?: number\n} | false>\n\n\nexport type WebSocketConnectionFactoryOptions<T extends IOGateway.Message<unknown>> = {\n    /**\n     * Codec used to encode/decode messages. Defaults to JSON.\n     */\n    codec?: GatewayEncoders.Codec<T, string>\n    /**\n     * WebSocket constructor to use.\n     * If not specified, the global WebSocket constructor will be used or if not available will try to load it from the `ws` package.\n     */\n    websocket?: typeof WebSocket\n\n    retry?: Retry\n}\n\nexport function websocketConnectionFactory<T extends IOGateway.Message<unknown>>(opts?: WebSocketConnectionFactoryOptions<T>): WebsocketConnectionFactory<T> {\n    const codec = opts?.codec ?? GatewayEncoders.json();\n    const retry = opts?.retry;\n    const websocket = opts?.websocket;\n    return new WsConnectionFactory<T>(codec, retry, websocket);\n}\n", "import {Mesh, MeshCallbacks, MeshMessageType} from '../../../mesh.js';\nimport {MessageReceiver} from '../../../common/channel.js';\nimport {randomId} from '../../../common/ids.js';\nimport {WebsocketConnection} from '../../../common/ws/types.js';\nimport {websocketConnectionFactory} from '../../../common/ws/factory.js';\nimport {getLogger} from '../../../logger.js';\nimport {Source} from '../../../state/types/common.js';\nimport {DomainInfo} from '../../../state/types/domain-registry.js';\nimport * as compat from '../../compat.js';\n\ntype Register = {\n    type: 'register',\n    nodeId: string,\n    users?: string[],\n    domains?: Array<DomainInfo>,\n    callbacks?: MeshCallbacks\n};\ntype Unregister = { type: 'unregister', nodeId: string, users?: string[] };\ntype Publish = { type: 'publish', nodeId: string, message: MeshMessageType };\n\n// action to be taken (may contain non serializable data)\ntype Action\n    = Register\n    | Unregister\n    | Publish;\n\n\ntype Data = { type: 'data', from: string, to: 'all' | string, message: compat.TransportMessage };\ntype NodeAdded = { type: 'node-added', 'node-id': string, 'new-node': string };\ntype NodeRemoved = { type: 'node-removed', 'node-id': string, 'removed-node': string };\ntype Command =\n    { type: 'hello', 'node-id': string, domains}\n    | { type: 'bye', 'node-id': string }\n    | Data\n    // received\n    | NodeAdded\n    | NodeRemoved\n    ;\n\ntype Event = { type: 'connected' } | { type: 'disconnected' };\n\ntype Message = Event | Command | Action;\n\nconst logger = getLogger('gateway.mesh.ws.broker.client');\n\nfunction hasNodeAddress(source?: Source): source is Source & { node: string } {\n    return source !== undefined && 'node' in source && source.node !== undefined;\n}\n\nfunction publishNodePeer(connection: WebsocketConnection<Command>, nodeId: string, msg: compat.TransportMessage): void {\n    const {receiver, body, source} = msg;\n    if (hasNodeAddress(receiver)) {\n        connection.send({type: 'data', from: nodeId, to: receiver.node, message: msg});\n    } else {\n        logger.error(`Destination nodeId is missing when sending message ${JSON.stringify(msg)}`);\n    }\n\n}\n\nfunction publish(connection: WebsocketConnection<Command>, nodeId: string, msg: MeshMessageType) {\n    const [receiverType, transportMessage] = compat.toTransportMessage(msg);\n    switch (receiverType) {\n        case 'cluster': {\n            connection.send({type: 'data', from: nodeId, to: 'all', message: transportMessage});\n            break;\n        }\n        case 'node': {\n            publishNodePeer(connection, nodeId, transportMessage)\n            break;\n        }\n        case 'peer': {\n            publishNodePeer(connection, nodeId, transportMessage);\n            break;\n        }\n        default: {\n            logger.error(`Unhandled receiver type when publishing ${JSON.stringify(msg)}`);\n            break;\n        }\n    }\n}\n\nclass WebsocketBrokerMesh implements Mesh {\n    constructor(private readonly ch: MessageReceiver<Action>) {\n    }\n\n    close() {\n        this.ch(undefined as unknown as Action);// close it\n    }\n\n    register(nodeId: string | undefined, domains: Array<DomainInfo>, callbacks?: MeshCallbacks): string {\n        if (nodeId === 'all') {\n            throw new Error(`cannot register with node id 'all'`);\n        }\n        nodeId = nodeId ?? randomId();\n        this.ch({type: 'register', nodeId, domains, callbacks});\n        return nodeId;\n    }\n\n    unregister(nodeId: string) {\n        this.ch({type: 'unregister', nodeId});\n    }\n\n    publish(nodeId: string, message: MeshMessageType) {\n        this.ch({type: 'publish', nodeId, message});\n    }\n\n    addUsers(nodeId: string, added: string[]) {\n        // do nothing\n    }\n\n    removeUsers(nodeId: string, removed: string[]) {\n        // do nothing\n    }\n}\n\ntype NodeData = {callbacks?: MeshCallbacks, domains?: Array<DomainInfo>};\n\nfunction handleRegister(msg: Register, nodes: Map<string, NodeData>, connection: WebsocketConnection<Command>) {\n    const {nodeId, domains, callbacks} = msg;\n    nodes.set(nodeId, {domains, callbacks});\n    connection.send({type: 'hello', \"node-id\": nodeId, domains});\n}\n\nfunction handleUnregister(msg: Unregister, nodes: Map<string, NodeData>, connection: WebsocketConnection<Command>) {\n    const nodeId = msg.nodeId;\n    nodes.delete(nodeId);\n    connection.send({type: 'bye', \"node-id\": nodeId});\n}\n\nfunction handlePublish(msg: Publish, connection: WebsocketConnection<Command>) {\n    const nodeId = msg.nodeId;\n    publish(connection, nodeId, msg.message);\n}\n\nfunction handleConnected(nodes: Map<string, NodeData>, connection: WebsocketConnection<Command>) {\n    logger.info(`connected to mesh broker`);\n    for (const [nodeId, {domains}] of nodes) {\n        connection.send({type: 'hello', \"node-id\": nodeId, domains});\n    }\n}\n\nfunction handleDisconnected(remote: Set<string>, nodes: Map<string, NodeData>) {\n    logger.info(`disconnected from mesh broker`);\n\n    const removed = new Set<string>(remote);\n    remote.clear();\n\n    for (const removedId of removed) {\n        for (const [nodeId, {callbacks}] of nodes) {\n            const cb = callbacks?.onMemberRemoved;\n            if (cb) {\n                cb(nodeId, removedId);\n            }\n        }\n    }\n}\n\nfunction handleNodeAdded(msg: NodeAdded, remote: Set<string>, nodes: Map<string, NodeData>) {\n    const {'node-id': nodeId, 'new-node': newNodeId} = msg;\n    remote.add(newNodeId);\n    const cb = nodes.get(nodeId)?.callbacks?.onMemberAdded;\n    if (cb) {\n        logger.info(`on-msg ${nodeId}, ${newNodeId}`);\n        cb(nodeId, newNodeId);\n    }\n}\n\nfunction handleNodeRemoved(msg: NodeRemoved, remote: Set<string>, nodes: Map<string, NodeData>) {\n    const {'node-id': nodeId, 'removed-node': removedNodeId} = msg;\n    remote.delete(removedNodeId);\n    const cb = nodes.get(nodeId)?.callbacks?.onMemberRemoved;\n    if (cb) {\n        cb(nodeId, removedNodeId);\n    }\n}\n\nfunction handleData(msg: Data, nodes: Map<string, NodeData>) {\n    const {to: dest, from} = msg;\n    for (const [nodeId, {callbacks}] of nodes) {\n        if (nodeId !== from) {\n            const cb = callbacks?.onMessage;\n            if (cb) {\n                cb(nodeId, compat.fromTransportMessage(msg.message));\n            }\n        }\n    }\n}\n\nfunction handle(msg: Message, connection: WebsocketConnection<Command>, nodes: Map<string, NodeData>, remote: Set<string>) {\n    switch (msg.type) {\n        case 'register': {\n            handleRegister(msg, nodes, connection);\n            break;\n        }\n        case 'unregister': {\n            handleUnregister(msg, nodes, connection);\n            break;\n        }\n        case 'publish': {\n            handlePublish(msg, connection);\n            break;\n        }\n        case 'connected': {\n            handleConnected(nodes, connection);\n            break;\n        }\n        case 'disconnected': {\n            handleDisconnected(remote, nodes);\n            break;\n        }\n        case 'node-added': {\n            handleNodeAdded(msg, remote, nodes);\n            break;\n        }\n        case 'node-removed': {\n            handleNodeRemoved(msg, remote, nodes);\n            break;\n        }\n        case 'data': {\n            handleData(msg, nodes);\n            break;\n        }\n    }\n}\n\nexport function websocketBrokerMesh(endpoint: string, websocket?: typeof WebSocket) {\n\n    const nodes = new Map<string, { callbacks?: MeshCallbacks, domains: Array<DomainInfo> }>();\n    const remote = new Set<string>();\n\n    const connectionFactory = websocketConnectionFactory<Command>({codec: compat.codec<Command>(), websocket});\n    const connection = connectionFactory.create(endpoint);\n\n\n    const handler = (msg: Message) => {\n        if (msg) {\n            if (logger.enabledFor('debug')) {\n                logger.debug(`mesh node processing command ${JSON.stringify(msg, null, '\\t')}`);\n            }\n            handle(msg, connection, nodes, remote);\n        }\n    }\n\n    connection.onConnect = () => handler({type: 'connected'});\n    connection.onReceive = (msg) => handler(msg);\n    // connection.onError = (err) => ;\n    connection.onDisconnect = () => handler({type: 'disconnected'});\n\n    connection.connect();\n    return new WebsocketBrokerMesh(handler);\n}\n", "import {AddressType, ClusterAddress, isPeerAddress, NodeAddress, Source} from '../state/types/common.js';\nimport {peerToAddress} from '../address.js';\nimport {MeshMessageType} from '../mesh.js';\nimport * as GatewayEncoders from '../common/encoders.js';\n\n// compatibility with clojure\nexport type TransportAddress = ClusterAddress | NodeAddress | {type: 'peer', node: string, \"peer-id\": string};\nexport type TransportMessage = MeshMessageType & {\n    source: TransportAddress;\n    receiver?: TransportAddress;\n}\n\nfunction sourceToTransport(source: Source): TransportAddress {\n    if (isPeerAddress(source)) {\n        return {type: 'peer', node: source.node, \"peer-id\": source.peer};\n    }\n    return (source as TransportAddress);\n}\n\nfunction sourceFromTransport(source: TransportAddress): Source {\n    if (source.type === 'peer') {\n        return peerToAddress(source[\"node\"], source[\"peer-id\"]);\n    }\n    return (source as Source);\n}\n\n\n// returns receiver type and transport message\nexport function toTransportMessage(msg: MeshMessageType): [AddressType, TransportMessage] {\n    const {receiver, body, source} = msg;\n    const transportReceiver = sourceToTransport(receiver);\n    const transportSource = sourceToTransport(source);\n    return  [receiver.type, {...msg, source: transportSource, receiver: transportReceiver}];\n}\n\nexport function fromTransportMessage(msg: TransportMessage): MeshMessageType {\n    const {receiver: transportReceiver, body, source: transportSource} = msg;\n    const receiver = sourceFromTransport(transportReceiver);\n    const source = sourceFromTransport(transportSource);\n    return {...msg, source, receiver}\n}\n\nexport function codec<T> () {\n    return GatewayEncoders.transit<T>(\n        {\n            namespaces: new Map<string, string>([\n                ['commands', 'gateway.common.commands']\n            ]),\n            keywordize: new Map<string, GatewayEncoders.KeywordizeCommand>([\n                //common\n                ['/type', '*'],\n                ['/to', new Set<string>(['all'])],\n                // broker mesh\n                ['/message/origin', '*'],\n                ['/message/receiver/type', '*'],\n                ['/message/source/type', '*'],\n                ['/message/body/type', '*'],\n                // ws mesh\n                ['/data/origin', '*'],\n                ['/data/receiver/type', '*'],\n                ['/data/source/type', '*'],\n                ['/data/body/type', '*'],\n            ])\n        }\n    );\n}\n", "import {Mesh, MeshCallbacks, MeshMessageType} from '../mesh.js';\nimport {Connect, Directory, Disconnect} from './directory.js';\nimport {randomId} from '../common/ids.js';\nimport {getLogger} from '../logger.js';\nimport {DomainInfo} from '../state/types/domain-registry.js';\nimport {WebsocketConnection, WebsocketConnectionFactory} from '../common/ws/types.js';\nimport {MessageReceiver} from '../common/channel.js';\nimport {websocketConnectionFactory} from '../common/ws/factory.js';\nimport {Connection, Command, WsMeshServer} from './ws-mesh/types.js';\nimport {createRelay} from './ws-mesh/relay.js';\nimport * as compat from './compat.js';\n\nconst logger = getLogger('gateway.mesh.ws');\n\ntype NodeConnections = {\n    connections: Map<string, Connection>\n    callbacks?: MeshCallbacks\n}\n\nfunction publishNodePeer(msg: compat.TransportMessage, from: string, node?: NodeConnections) {\n    const {receiver, body} = msg;\n    const to = receiver['node'];\n    if (to) {\n        const nodeConnection = node?.connections.get(to);\n        if (nodeConnection) {\n            nodeConnection.send({type: 'data', from, to, data: msg});\n        }\n    }\n}\n\nfunction publishMessage(msg: MeshMessageType, from: string, node?: NodeConnections) {\n    const [receiverType, transportMessage] = compat.toTransportMessage(msg);\n    switch (receiverType) {\n        case \"cluster\": {\n            node?.connections.forEach((connection, to) => {\n                connection.send({type: 'data', from, to, data: transportMessage});\n            });\n            break;\n        }\n        case \"node\": // fall-through\n        case \"peer\": {\n            publishNodePeer(transportMessage, from, node);\n            break;\n        }\n        default: {\n            logger.error(`Unhandled receiver type when publishing ${JSON.stringify(msg)}`);\n            break;\n        }\n\n    }\n}\n\nfunction closeConnections(connections: Map<string, Connection>)\n{\n    for (const connection of connections.values()) {\n        connection.close();\n    }\n}\n\ntype ConnectingNodes = {type: 'connecting-nodes', from: string, to: string, connection: Connection};\ntype DisconnectingNodes = {type: 'disconnecting-nodes', from: string, to: string};\ntype Action\n    = ConnectingNodes\n    | DisconnectingNodes\n    ;\ntype NodeConnected = { type: 'node-connected', from: string, to: string };\ntype NodeDisconnected = { type: 'node-disconnected', from: string, to: string };\ntype NodeData = { type: 'node-data', from: string, to: string, msg: compat.TransportMessage };\ntype Event\n    = NodeConnected\n    | NodeDisconnected\n    | NodeData\n    ;\ntype Message = Event | Action;\nfunction directoryConnectNodes<T>(handler: MessageReceiver<Message>, connectionFactory: WebsocketConnectionFactory<Command>, msg: Connect)\n{\n    const from = msg.node;\n    const to = msg.to.node;\n    const uri = msg.to.endpoint;\n    if (logger.enabledFor('debug')) {\n        logger.debug(`directory connect ${from} to ${to} via ${uri}`);\n    }\n    const connection = connectionFactory.create(uri);\n    connection.onConnect = () => {\n        handler({type: 'node-connected', from, to});\n    };\n    connection.onReceive = (msg) => {\n        if (msg.type === 'data') {\n            handler({type: 'node-data', to: from, from: to, msg: msg.data });\n        }\n    };\n    connection.onDisconnect = () => {\n        handler({type: 'node-disconnected', from, to})\n    };\n    handler({type: 'connecting-nodes', from, to, connection});\n    connection.connect();\n}\n\nfunction directoryDisconnectNodes(handler: MessageReceiver<Action> , msg: Disconnect) {\n    const from = msg.node;\n    const to = msg.from.node;\n    if (logger.enabledFor('debug')) {\n        logger.debug(`directory disconnect ${from} to ${to}`);\n    }\n    handler({type: 'disconnecting-nodes', from, to});\n}\n\n\nclass WebSocketCluster implements Mesh {\n    constructor(private readonly localNodes: Map<string, NodeConnections>,\n                private readonly server: WsMeshServer,\n                private readonly directory: Directory,\n                private readonly endpointUri: string,\n                private readonly handler: MessageReceiver<Message>,\n                private readonly connectionFactory: WebsocketConnectionFactory<Command>) {}\n\n    register(nodeId: string | undefined, domains: Array<DomainInfo>, callbacks?: MeshCallbacks): string {\n        nodeId = nodeId ?? randomId();\n        const endpoint = `${this.endpointUri}?node=${nodeId}`;\n        this.localNodes.set(nodeId, {callbacks, connections: new Map<string, WebsocketConnection<Command>>()});\n        this.server.register(nodeId);\n        this.directory.add(nodeId, endpoint, {\n            connect: m => {\n                directoryConnectNodes(this.handler, this.connectionFactory, m);\n            },\n            disconnect: m => {\n                directoryDisconnectNodes(this.handler, m);\n            }\n        });\n        return nodeId;\n    }\n\n    unregister(nodeId: string) {\n        this.directory.remove(nodeId);\n        this.server.unregister(nodeId);\n        const data = this.localNodes.get(nodeId);\n        if (data) {\n            this.localNodes.delete(nodeId);\n            closeConnections(data.connections);\n        }\n    }\n\n    publish<T>(nodeId: string, message: MeshMessageType) {\n        publishMessage(message, nodeId, this.localNodes.get(nodeId));\n    }\n\n    addUsers(nodeId: string, added: string[]) {\n        this.directory.addUsers(nodeId, ...added);\n    }\n\n    removeUsers(nodeId: string, removed: string[]) {\n        this.directory.removeUsers(nodeId, ...removed);\n    }\n\n    close() {\n        this.directory.close();\n        this.server.stop();\n        this.connectionFactory.close();\n    }\n}\n\nfunction handleConnectingNodes(localNodes: Map<string, NodeConnections>, msg: ConnectingNodes) {\n    const {from: nodeId, to, connection} = msg;\n    const node = localNodes.get(nodeId);\n    if (node) {\n        if (logger.enabledFor('debug')) {\n            logger.debug(`processing connection request from ${to} to ${nodeId}`);\n        }\n        node.connections.set(to, connection);\n    }\n    else {\n        logger.warn(`discarding connection request from ${to} to ${nodeId}`);\n        connection.close();\n    }\n}\n\nfunction handleDisconnectingNodes(localNodes: Map<string, NodeConnections>, msg: DisconnectingNodes) {\n    const {from, to} = msg;\n    const node = localNodes.get(from);\n    if (node) {\n        const connection = node.connections.get(to);\n        if (connection) {\n            logger.debug(`processing disconnection request from ${to} to ${from}`);\n            node.connections.delete(to);\n            connection.close();\n            return;\n        }\n    }\n    logger.warn(`discarding disconnection request from ${to} to ${from}`);\n}\n\nfunction handleNodeConnected(localNodes: Map<string, NodeConnections>, msg: NodeConnected) {\n    const {from, to} = msg;\n    const node = localNodes.get(from);\n    if (node) {\n        const connection = node.connections.get(to);\n        if (connection) {\n            logger.info(`mesh connected ${from} to ${to}`);\n            connection.send({type:'hello', from, to});\n            const cb = node.callbacks?.onMemberAdded;\n            if (cb) {\n                cb(from, to);\n            }\n        }\n    }\n}\n\nfunction handleNodeDisconnected(localNodes: Map<string, NodeConnections>, msg: NodeDisconnected) {\n    const {from, to} = msg;\n    const node = localNodes.get(from);\n    if (node) {\n        const cb = node.callbacks?.onMemberRemoved;\n        if (cb) {\n            cb(from, to);\n        }\n    }\n}\n\nfunction handleNodeData(localNodes: Map<string, NodeConnections>, msg: NodeData) {\n    const {from, to} = msg;\n    const localNode = localNodes.get(to);\n    if (localNode) {\n        const connection = localNode.connections.get(from);\n        if (connection) {\n            const cb = localNode.callbacks?.onMessage;\n            if (cb) {\n                cb(to, compat.fromTransportMessage(msg.msg));\n            }\n        }\n    }\n}\n\nexport function websocketCluster(config:{relays: string, cluster: string}, directory: Directory, websocket?: typeof WebSocket): Mesh {\n    const localNodes = new Map<string, NodeConnections>();\n    const handler = (msg: Message) => {\n        if (msg) {\n            if (logger.enabledFor('debug')) {\n                logger.debug(`mesh processing command ${JSON.stringify(msg, (key, value) => {\n                    if (key === 'connection') {\n                        return undefined;\n                    }\n                    return value;\n                }, '\\t')}`);\n            }\n            switch (msg.type) {\n                case 'connecting-nodes': {\n                    handleConnectingNodes(localNodes, msg);\n                    break;\n                }\n                case 'disconnecting-nodes': {\n                    handleDisconnectingNodes(localNodes, msg)\n                    break;\n                }\n                case 'node-connected': {\n                    handleNodeConnected(localNodes, msg);\n                    break;\n                }\n                case 'node-disconnected': {\n                    handleNodeDisconnected(localNodes, msg);\n                    break;\n                }\n                case 'node-data': {\n                    handleNodeData(localNodes, msg);\n                    break;\n                }\n            }\n        }\n    };\n    const factory = websocketConnectionFactory<Command>({codec: compat.codec<Command>(), websocket});\n    const server = createRelay(factory, `${config.relays}`, {\n        onConnect: (from, to, connection) => {\n            if (logger.enabledFor('debug')) {\n                logger.debug(`server relay connected ${from} to ${to}`);\n            }\n            handler({type: 'connecting-nodes', from, to, connection});\n            handler({type: 'node-connected', from, to});\n        },\n        onDisconnect:(from, to) => {\n            handler({type: 'node-disconnected', from, to});\n        },\n        onReceive: (to, from, msg) => {\n            handler({type: 'node-data', from, to, msg});\n        }\n    });\n\n    return new WebSocketCluster(localNodes, server, directory, `${config.cluster}`, handler, factory);\n}\n", "import {Command, Connection, Data, WsMeshServer} from './types.js';\nimport {WebsocketConnection, WebsocketConnectionFactory} from '../../common/ws/types.js';\n\nexport type ServerCallbacks = {\n    onConnect: (source: string, target: string, connection: Connection) => void\n    onDisconnect: (source: string, target: string) => void;\n    onReceive: (target: string, source: string, msg: Data['data']) => void\n}\n\ntype NodeConnection = {\n    readonly from: string;\n    readonly to: string,\n    readonly connection: Connection\n}\nfunction ensureConnection(from: string, to: string, connected: Map<string, NodeConnection>, relayConnection: WebsocketConnection<Command>) {\n    const k = `${from}:${to}`;\n    const c = connected.get(k);\n    if (c) {\n        return c.connection;\n    }\n    const connection = new class implements Connection {\n        close(): void {\n            relayConnection.send({type: 'bye', from: to, to: from});\n            connected.delete(k);\n        }\n\n        send(cmd: Command): void {\n            relayConnection.send(cmd);\n        }\n\n        toJSON() {\n            return {type: 'relay', uri: relayConnection.uri};\n        }\n    };\n    connected.set(k, {from, to , connection});\n    return connection;\n}\n\nfunction processMessage(connected: Map<string, NodeConnection>, callbacks: ServerCallbacks, relayConnection: WebsocketConnection<Command>, msg: Command) {\n    switch (msg.type) {\n        case 'hello': {\n            const {from, to} = msg;\n            const connection = ensureConnection(from, to, connected, relayConnection);\n            callbacks.onConnect(to, from, connection);\n            break;\n        }\n        case 'data': {\n            const {from, to, data} = msg;\n            callbacks.onReceive(to, from, data);\n            break;\n        }\n    }\n}\n\nexport function createRelay(factory: WebsocketConnectionFactory<Command>, endpoint: string, callbacks: ServerCallbacks): WsMeshServer {\n    const nodes = new Set<string>();\n    const connected = new Map<string, NodeConnection>();\n    const relayConnection = factory.create(endpoint);\n    relayConnection.onConnect = () => {\n        nodes.forEach(from => relayConnection.send({type: 'hello', from, to: 'all'}));\n    };\n    relayConnection.onReceive = (msg) => {\n        processMessage(connected, callbacks, relayConnection, msg);\n    };\n    relayConnection.onDisconnect = () => {\n        for (const [k, c] of connected) {\n            c.connection.close();\n            callbacks.onDisconnect(c.to, c.from);\n        }\n    };\n    relayConnection.connect();\n    return {\n        register: (node: string) => {\n            nodes.add(node);\n        },\n        unregister: (node: string) => {\n            nodes.delete(node);\n        },\n        stop: () => {\n            relayConnection.close();\n        }\n    };\n}\n", "import {Callbacks, Directory, Member} from './directory.js';\nimport {getLogger} from '../logger.js';\nimport {NodeConnections, Nodes} from './types/rest.js';\nimport {MessageReceiver} from '../common/channel.js';\n\nconst logger = getLogger('gateway.mesh.rest-directory');\n\ntype MemberData = {\n    node: string\n    endpoint: string\n    callbacks?: Callbacks\n    users: Set<string>\n    connected?: Member[]\n}\n\nfunction fireCallbacks(nodeId: string, callbacks: Callbacks | undefined, toAdd: Member[], toRemove: Member[]) {\n    const dcb = callbacks?.disconnect;\n    if (dcb) {\n        toRemove.forEach((t) => dcb({cmd: 'disconnect', node: nodeId, from: t}));\n    }\n\n    const ccb = callbacks?.connect;\n    if (ccb) {\n        toAdd.forEach((t) => ccb({cmd: 'connect', node: nodeId, to: t}));\n    }\n}\n\ntype CommandAnnounce = {command: 'announce', nodes: Nodes};\ntype CommandResponse = {command: 'response', response: NodeConnections};\ntype CommandRemoveUsers = {command: 'remove-users', node: string, removed: string[]};\ntype CommandAddUsers = { command: 'add-users', node: string, added: string[] };\ntype CommandRemove = { command: 'remove', node: string };\ntype CommandAdd = { command: 'add', node: string, callbacks?: Callbacks, endpoint: string };\ntype Command\n    = CommandAdd\n    | CommandRemove\n    | CommandAddUsers\n    | CommandRemoveUsers\n    | CommandAnnounce\n    | CommandResponse\n    ;\n\nclass RestDirectory implements Directory {\n    private announceId?: ReturnType<typeof setTimeout>;\n\n    constructor(\n        private readonly handler: MessageReceiver<Command>,\n        private readonly localNodes: Map<string, MemberData>,\n        announceInterval: number) {\n\n        if (announceInterval > 0) {\n            const task = async () => {\n                maybeAnnounceNodes(this.handler, this.localNodes);\n                clearTimeout(this.announceId);\n                this.announceId = setTimeout(task, announceInterval);\n            }\n            this.announceId = setTimeout(task, announceInterval);\n        }\n    }\n\n    add(nodeId: string, endpointUri: string, callbacks?: Callbacks) {\n        this.handler({command: 'add', node: nodeId, callbacks, endpoint: endpointUri});\n    }\n\n    remove(nodeId: string) {\n        this.handler({command: 'remove', node: nodeId});\n    }\n\n    addUsers(nodeId: string, ...added: string[]) {\n        this.handler({command: 'add-users', node: nodeId, added});\n    }\n\n    removeUsers(nodeId: string, ...removed: string[]) {\n        this.handler({command: 'remove-users', node: nodeId, removed});\n    }\n\n    close() {\n        if (this.announceId) {\n            clearTimeout(this.announceId);\n        }\n    }\n}\n\nfunction removeNode(fetchFn: typeof fetch, directoryUri: string, node?: string) {\n    if (node) {\n        fetchFn(`${directoryUri}/api/nodes/${node}`, {method: 'delete'})\n            .catch((err) => {\n                logger.warn(`remove node request failed`, err);\n            });\n    }\n}\n\nasync function parseAnnounceResponse(handler: MessageReceiver<Command>, response: Response): Promise<NodeConnections> {\n    if (response.ok) {\n        const body = await response.json();\n        return body as NodeConnections;\n    } else {\n        // use body in error?\n        throw new Error(`${response.status} ${response.statusText}`);\n    }\n}\n\nfunction processResponse(localNodes: Map<string, MemberData>, response: NodeConnections): Map<string, MemberData> {\n    if (logger.enabledFor('debug')) {\n        logger.debug(`processing response ${JSON.stringify(response)}`);\n    }\n\n    return response.reduce((n, r) => {\n        const nodeId = r.node;\n        const localNode = n.get(nodeId);\n        if (localNode) {\n            const connected: Member[] | undefined = localNode.connected;\n            const proposed: Member[] | undefined = r.connect;\n            const toRemove: Member[] = (connected ?? []).filter(c => {\n                return proposed === undefined || proposed.find((p) => p.node === c.node) === undefined;\n            });\n            const toAdd: Member[] = (proposed ?? []).filter(c => {\n                return connected === undefined || connected.find((p) => p.node === c.node) === undefined;\n            });\n            fireCallbacks(nodeId, localNode.callbacks, toAdd, toRemove);\n            localNode.connected = proposed;\n            return n;\n        }\n        return n;\n    }, localNodes);\n}\n\nfunction maybeAnnounceNodes(handler: MessageReceiver<Command>, localNodes: Map<string, MemberData>) {\n    const data: Nodes = Array.from(localNodes.values())\n        .map(v => {\n            return {node: v.node, endpoint: v.endpoint, users: Array.from(v.users)};\n        });\n    if (data.length > 0) {\n        handler({command: 'announce', nodes: data});\n    }\n}\n\nfunction announceNodes(handler: MessageReceiver<Command>, fetchFn: typeof fetch, directoryUri: string, nodes: Nodes) {\n    const body = JSON.stringify(nodes);\n    if (logger.enabledFor('debug')) {\n        logger.debug(`announcing nodes ${body}`);\n    }\n    fetchFn(`${directoryUri}/api/nodes`, {\n        method: 'post',\n        body,\n        credentials: 'include',\n        headers: [['content-type', 'application/json']]\n    }).then(async (response) => {\n        const body = await parseAnnounceResponse(handler, response);\n        handler({command: 'response', response: body});\n    }).catch(err => {\n        logger.warn(`announce node request failed`, err);\n    });\n}\n\nfunction processCommand(handler: MessageReceiver<Command>, directoryUri: string, localNodes: Map<string, MemberData>, cmd: Command, fetchFn: typeof fetch) {\n    switch (cmd.command) {\n        case 'add': {\n            const {node, callbacks, endpoint} = cmd;\n            localNodes.set(node, {\n                node: node,\n                callbacks,\n                endpoint,\n                users: new Set(),\n            });\n            // no need to announce it here, since no users\n            //maybeAnnounceNodes\n            break;\n        }\n        case 'remove': {\n            const {node} = cmd;\n            removeNode(fetchFn, directoryUri, node);\n            localNodes.delete(node);\n            break;\n        }\n        case 'add-users': {\n            const {node, added} = cmd;\n            const localNode = localNodes.get(node);\n            if (localNode) {\n                added.forEach(user => localNode.users.add(user));\n                maybeAnnounceNodes(handler, localNodes);\n            }\n            break;\n        }\n        case 'remove-users': {\n            const {node, removed} = cmd;\n            const localNode = localNodes.get(node);\n            if (localNode) {\n                removed.forEach(user => localNode.users.delete(user));\n                maybeAnnounceNodes(handler, localNodes);\n            }\n            break;\n        }\n        case 'announce': {\n            const {nodes} = cmd;\n            announceNodes(handler, fetchFn, directoryUri, nodes);\n            break;\n        }\n        case 'response': {\n            const {response} = cmd;\n            processResponse(localNodes, response);\n            break;\n        }\n    }\n}\n\nfunction handle(handler: MessageReceiver<Command>, directoryUri: string, localNodes: Map<string, MemberData>, msg: Command, fetchFn: typeof fetch) {\n    processCommand(handler, directoryUri, localNodes, msg, fetchFn);\n}\n\nexport function restDirectory(config: { uri: string, announceInterval?: number }, fetchFn?: typeof fetch): Directory {\n    const directoryUri = config.uri;\n    const announceInterval = config.announceInterval ?? 10000;\n    const localNodes = new Map<string, MemberData>();\n    const handler = (msg: Command) => {\n        handle(handler, directoryUri, localNodes, msg, fetchFn ?? globalThis.fetch);\n    }\n    logger.info(`rest directory with uri '${directoryUri}' and announce interval ${announceInterval}ms`);\n    return new RestDirectory(handler, localNodes, announceInterval);\n}\n", "import {regexify, valueMatches} from '../common/filters.js';\nimport {Identity, OriginType} from '../state/types/common.js';\nimport {IOGateway} from '../../gateway';\nimport {DomainUri} from \"../state/types/domain-registry.ts\";\n\nexport function defaultPeerRestrictions(domain: DomainUri, rules?: IOGateway.VisibilityRule<'domain'>[]): OriginType | undefined {\n    return rules?.filter((rule: IOGateway.VisibilityRule<'domain'>) => {\n        return rule.domain === domain;\n    })?.find((rule: IOGateway.VisibilityRule<'domain'>) => {\n        if (rule.identity === undefined) {\n            return true;\n        }\n        throw new Error('identity in default restrictions rules set is not allowed');\n    })?.restrictions;\n}\n\nexport type RestrictedKey = 'context' | 'method';\n\nexport function defaultRestrictions<K extends RestrictedKey>(key: K, rules?: IOGateway.VisibilityRule<K>[]): ((this: Identity, name?: string) => (OriginType | undefined)) {\n    const rs = rules?.map(rule => compile(key, rule));\n    return function (this: Identity, name?: string): OriginType | undefined {\n        return rs?.find((rule: CompiledRule) => {\n            return matches(rule, this, name);\n        })?.restrictions;\n    }\n}\n\ntype CompiledRule = {\n    identity: Record<string, IOGateway.Filtering.Matcher>\n    name?: IOGateway.Filtering.Matcher\n    restrictions: OriginType\n};\n\nfunction compile<K extends RestrictedKey>(name: K, rule: IOGateway.VisibilityRule<K>): CompiledRule {\n    const result: CompiledRule = {identity: {}, restrictions: rule.restrictions};\n    if (rule[name]) {\n        result.name = regexify(rule[name])\n    }\n    if (rule.identity) {\n        for (const [k, v] of Object.entries<IOGateway.Filtering.Matcher>(rule.identity)) {\n            result.identity[k] = regexify(v);\n        }\n    }\n    return result;\n}\n\nfunction matches(rule: CompiledRule, identity: Identity, name?: string): boolean {\n    for (const [k, v] of Object.entries(rule.identity)) {\n        const rv = identity[k];\n        if (!valueMatches(v, rv)) {\n            return false;\n        }\n    }\n    if (rule.name && !valueMatches(rule.name, name)) {\n        return false;\n    }\n    return true;\n}\n", "import {Callbacks, Directory, Member} from './directory.js';\n\ntype MemberInfo = {\n    member: Member;\n    memberId: number,\n    callbacks?: Callbacks;\n}\n\nclass StaticDirectory implements Directory {\n    private readonly members: Map<string, MemberInfo>;\n    constructor(members: Map<string, MemberInfo>) {\n        this.members = members;\n    }\n\n    add(nodeId: string, endpointUri: string, callbacks: Callbacks) {\n        if (this.members.has(nodeId)) {\n            this.members.get(nodeId)!.callbacks = callbacks;\n            const connectCallback = callbacks.connect;\n            const memberId = this.members.get(nodeId)!.memberId;\n            if (connectCallback) {\n                Array.from(this.members.values())\n                    .filter((e) => e.memberId < memberId)\n                    .forEach((e) => {\n                        connectCallback({cmd: 'connect', node: nodeId, to: e.member});\n                    });\n            }\n        }\n    }\n    remove(nodeId: string) {\n        if (this.members.has(nodeId)) {\n            const removed = this.members.get(nodeId)!;\n            delete removed.callbacks;\n            Array.from(this.members.values())\n                .filter((e) => e.memberId > removed.memberId)\n                .filter((e => e.callbacks?.disconnect))\n                .forEach((e) => {\n                    const disconnectCallback = e.callbacks?.disconnect;\n                    if (disconnectCallback) {\n                        disconnectCallback({cmd: 'disconnect', node: e.member.node, from: removed.member});\n                    }\n                });\n        }\n    }\n    addUsers() {\n        // do nothing\n    }\n    removeUsers() {\n        // do nothing\n    }\n    close() {\n        // do nothing\n    }\n}\n\nexport function staticDirectory(members: Member[]): Directory {\n    const map = new Map<string, MemberInfo>();\n    members.forEach((e, idx) => {\n        map.set(e.node, {member: {...e}, memberId: idx})\n    });\n    return new StaticDirectory(map);\n}\n"],
  "mappings": "mnBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,eAAAE,GAAA,cAAAC,EAAA,aAAAC,KAwBO,SAASA,GAASC,EAAmC,CACxD,GAAM,CAAC,KAAAC,EAAM,MAAAC,CAAK,EAAIF,EACtBG,GAA2BF,CAAI,EAC3BG,GAAkBF,EAAOD,CAAI,GAC7BI,GAASL,CAAK,CAEtB,CAEA,SAASM,GAAkBL,EAAcC,EAAoBK,KAAoBC,EAAiB,CAC1F,KAAK,WAAWN,CAAK,GAGrBG,GAD0C,CAAC,KAD9B,IAAI,KACgC,MAAAH,EAAO,KAAAD,EAAM,QAAAM,EAAS,KAAAC,CAAI,CAC7D,CAEtB,CAEA,SAASJ,GAAkBF,EAAoBD,EAAc,CACzD,IAAMQ,EAAgBC,GAASR,CAAK,EAEpC,OADwBS,GAAUV,CAAI,GACZQ,CAC9B,CAEA,SAASG,GAAUX,EAAsB,CACrCE,GAA2BF,CAAI,EAC/B,IAAMY,EAAiB,SAASX,EAAoBK,KAAoBO,EAAgB,CACpFR,GAAI,KAAKO,EAAQZ,EAAMC,EAAOK,EAAS,GAAGO,CAAI,CAClD,EACA,SAASC,EAAQC,EAAiC,CAC9C,OAAO,MAAM,OAAOA,CAAG,CAAC,CAC5B,CACA,QAAWC,KAAU,OAAO,KAAKP,EAAQ,EAAE,OAAOK,CAAO,EACrDF,EAAOI,CAAM,EAAI,SAASV,KAAoBO,EAAiB,CAC3DR,GAAI,KAAKO,EAAQZ,EAAMgB,EAAQV,EAAS,GAAGO,CAAI,CACnD,EAEJ,OAAAD,EAAO,WAAa,SAASX,EAAoB,CAC7C,OAAOE,GAAkBF,EAAOD,CAAI,CACxC,EACAY,EAAO,MAAQ,SAAUK,EAAgB,CACrC,OAAOpB,EAAU,GAAGG,CAAI,IAAIiB,CAAM,EAAE,CACxC,EACOL,CACX,CAEA,SAASV,GAA2BF,EAAc,CAC9C,GAAI,CAACA,EAAK,WAAWkB,EAAI,EAAG,MAAM,IAAI,MAAM,+BAA+BA,EAAI,EAAE,EACjF,GAAI,CAACR,GAAUV,CAAI,EAAG,CAClB,IAAMmB,EAAiB,OAAO,QAAQT,EAAS,EAAE,KAAK,CAAC,CAACU,CAAG,EAAG,CAACC,CAAG,IAAKA,EAAG,cAAcD,CAAE,CAAC,EACrF,CAAC,CAAEnB,CAAK,EAAIkB,EAAe,KAAK,CAAC,CAACG,CAAO,IAAMtB,EAAK,WAAWsB,CAAM,CAAC,EAC5EZ,GAAUV,CAAI,EAAIC,CACtB,CACJ,CAEO,SAASJ,EAAUG,EAAsB,CAC5C,IAAIY,EAA6BW,GAAQvB,CAAI,EAC7C,OAAIY,IAAW,SACXA,EAASD,GAAUX,CAAI,EACvBuB,GAAQvB,CAAI,EAAIY,GAEbA,CACX,CAEO,SAAShB,GAAU4B,EAAqC,CAC3D,SAASC,EAAaH,EAAgBrB,EAAoB,CACtD,QAAWD,KAAQ,OAAO,KAAKU,EAAS,EAAE,OAAOgB,GAAKA,EAAE,WAAWJ,CAAM,CAAC,EACtEZ,GAAUV,CAAI,EAAIS,GAASR,CAAK,CAExC,CAEA,IAAM0B,EAAWH,EAAO,MAExB,GAAI,OAAOG,GAAa,SACpBjB,GAAUQ,EAAI,EAAIT,GAASkB,CAAQ,EACnCF,EAAaP,GAAMS,CAAQ,UACpB,OAAOA,GAAa,SAAU,CACrC,IAAMR,EAAiB,OAAO,QAAQQ,CAAQ,EAAE,KAAK,CAAC,CAACP,CAAE,EAAG,CAACC,CAAE,IAAMD,EAAG,cAAcC,CAAE,CAAC,EACzF,OAAW,CAACC,EAAQrB,CAAK,IAAKkB,EAC1BM,EAAaH,EAAQrB,CAAK,CAElC,CAEAG,GAAWoB,EAAO,UAAYpB,EAClC,CA1GA,IAEKK,GAQCc,GACAb,GACAQ,GAEFd,GAdJwB,EAAAC,GAAA,kBAEKpB,QACDA,IAAA,iBACAA,IAAA,iBACAA,IAAA,eACAA,IAAA,eACAA,IAAA,iBALCA,QAAA,IAQCc,GAAmC,OAAO,OAAO,IAAI,EACrDb,GAAsC,CAAC,EACvCQ,GAAO,UACbR,GAAUQ,EAAI,EAAI,EACdd,GAAuD0B,GAAM,CAC7D,QAAQA,EAAE,KAAK,EAAE,GAAGA,EAAE,KAAK,YAAY,CAAC,IAAIA,EAAE,MAAM,YAAY,CAAC,KAAKA,EAAE,IAAI,OAAOA,EAAE,OAAO,GAAI,GAAGA,EAAE,IAAI,CAC7G,IChBA,IAAAC,GAAA,GAAAC,GAAAD,GAAA,cAAAE,GAAA,iBAAAC,GAAA,gBAAAC,KAEA,SAASC,GAAaC,EAAiF,CACnG,OAAO,OAAOA,GAAY,QAC9B,CAEO,SAASH,GAAaI,EAAkCC,EAAwB,CACnF,OAAIH,GAAaE,CAAG,EACTA,IAAQC,EAEX,OAAOA,GAAQ,SACRD,EAAI,KAAKC,CAAG,EAEhB,EAEf,CAEO,SAASJ,GAAYK,EAAyCC,EAAyB,CAC1F,QAAWJ,KAAWG,EAClB,GAAIN,GAAaG,EAASI,CAAK,EAC3B,MAAO,GAGf,MAAO,EACX,CAMO,SAASR,GAASS,EAAsE,CAC3F,GAAI,OAAOA,GAAe,SAAU,CAChC,IAAIC,EAASC,GAAiB,KAAKF,CAAU,GAAG,OAGhD,GAFAC,IAAWE,GAAoB,KAAKH,CAAU,GAAG,OAE7CC,GAAQ,QACR,OAAO,IAAI,OAAOA,EAAO,QAASA,EAAO,OAAS,EAAE,CAG5D,CACA,OAAOD,CACX,CAzCA,IA0BMG,GAEAD,GA5BNE,GAAAC,GAAA,kBA0BMF,GAAsB,4CAEtBD,GAAmB,0DCjBlB,SAASI,GAAWC,EAAOC,EAAa,CAC3C,OAAOA,EAAE,OAAO,CAAC,EAAQC,IACjBA,IAAMF,EACC,EAEJ,EAAE,OAAOE,CAAC,EAClB,CAAC,CAAQ,CAChB,CAEO,SAASC,GAAmCC,EAAYC,EAA0B,CACrF,OAAID,EAAKC,CAAM,EACJD,KAEJ,YAAQA,EAAOE,GAAmB,CACrCA,EAAED,CAAM,EAAI,CAAC,CACjB,CAAC,CACL,CAEO,SAASE,GAAWC,EAAG,CAI1B,OAAIA,aAAa,IACN,MAAM,KAAKA,CAAiB,EAAE,IAAID,EAAU,EAC5CC,aAAa,MACbA,EAAE,IAAID,EAAU,EAChBC,aAAa,IACbD,GAAW,OAAO,YAAYC,CAAC,CAAC,EAChCA,aAAa,OACb,OAAO,KAAKA,CAAC,EAAE,OAAO,CAACC,EAAGC,KAC7BD,EAAEC,CAAC,EAAIH,GAAWC,EAAEE,CAAC,CAAC,EACfD,GACR,CAAC,CAAC,EAEED,CAEf,CAEA,SAASG,GAAiBC,EAAgK,CACtL,IAAMC,EAAQ,IAAI,IAClB,OAAO,SAAyBC,EAAOC,EAAO,CAC1C,IAAMC,EAAOH,EAAM,IAAI,IAAI,GAAK,MAAM,QAAQ,IAAI,EAAI,IAAIC,CAAK,IAAM,IAAIA,CAAK,IAC9E,OAAIC,IAAU,OAAOA,CAAK,GAAGF,EAAM,IAAIE,EAAOC,CAAI,EAC9CD,aAAiB,SAAQA,EAAQ,IAAIA,EAAM,MAAM,IAC9CH,EAAS,KAAK,KAAME,EAAOC,EAAOC,EAAK,QAAQ,iBAAkB,EAAE,CAAC,CAC/E,CACJ,CAMO,SAASC,MAAeJ,EAAqF,CAChH,OAAOF,GAAiB,CAACG,EAAwBC,EAAgBC,IACzDH,EAAM,QAAQG,CAAI,IAAM,GACjB,SAEJD,CACV,CACL,CAMO,SAASG,GAAYC,EAA8B,CACtD,OAAO,KAAK,UAAUA,EAAK,OAAO,KAAKA,CAAG,EAAE,KAAKC,EAAc,CAAC,CACpE,CAEO,SAASC,GAAQnB,EAA0B,CAC9C,MAAQ,CAAC,CAACA,CACd,CAlFA,IACAoB,GAuEMF,GAxENG,GAAAC,GAAA,kBACAF,GAA6B,iBAuEvBF,GAAiE,CAACX,EAAWgB,IAAchB,EAAE,cAAcgB,CAAC,ICrE3G,SAASC,GAAiBC,EACAC,EAA6C,CAC1E,OAAW,CAACC,EAAGC,CAAC,IAAK,OAAO,QAAQH,CAAe,EAAG,CAClD,IAAMI,EAAKH,EAAOC,CAAC,EACnB,GAAI,CAACG,GAAaF,EAAGC,CAAE,EACnB,MAAO,EAEf,CACA,MAAO,EACX,CAEO,SAASE,GAAcC,EACAC,EAAuC,CACjE,OAAOC,GAAYF,EAAcC,CAAI,CACzC,CAEO,SAASE,GAAUT,EACAO,EACAG,EAA4C,CAClE,IAAMC,EAASD,GAAS,YAAY,OAAO,CAACE,EAAwBC,IAAiB,CACjF,GAAIf,GAAiBe,EAAa,SAAUb,CAAM,EAAG,CACjD,IAAMc,EAAUD,EAAa,QAAQ,OAASA,EAAa,QAAQ,WAAa,CAAC,EACjF,GAAIC,EAAQ,OAAS,GAAKT,GAAcS,EAASP,CAAI,EACjD,MAAO,GACJ,CACH,IAAMQ,EAAUF,EAAa,QAAQ,OAASA,EAAa,QAAQ,WAAa,CAAC,EACjF,OAAOD,GAAKP,GAAcU,EAASR,CAAI,CAC3C,CACJ,CACA,OAAOK,CACX,EAAG,MAAS,EACZ,GAAID,IAAW,OACX,OAAOA,EAEX,IAAMK,EAAyCN,GAAS,aAAe,QACvE,OAAOM,IAAe,SAAWA,IAAe,WACpD,CAvCA,IAAAC,GAAAC,GAAA,kBAAAD,OCqBA,SAASE,GAAgBC,EAAoC,CACzD,GAAIA,GAAY,OAAO,KAAKA,CAAQ,EAAE,OAAS,EAC3C,OAAOA,CAGf,CAEA,SAASC,GAAMC,EAAsD,CACjE,OAAI,OAAOA,GAAM,SAKN,CAAC,MAJU,OAAO,QAAQA,CAAC,EAAE,OAAO,CAACC,EAAK,CAACC,EAAKC,CAAG,KACtDF,EAAIC,CAAG,EAAIH,GAAMI,CAAG,EACbF,GACR,CAAC,CAAC,CACmB,EACjB,OAAOD,GAAM,SACb,CAAC,MAAOA,CAAC,EAET,CAAC,MAAOA,CAAC,CAExB,CAEA,SAASI,GAAUC,EAA0D,CACzE,MAAO,CAAC,UAAWA,EAAG,WAAa,KAAK,IAAI,EAAG,MAAON,GAAMM,EAAG,KAAK,CAAC,CACzE,CAGA,SAASC,GAAWC,EAAmBC,EAAkD,CACrF,OAAO,MAAM,KAAKD,CAAI,EAAE,OAAO,CAACN,EAAKQ,IAAM,CACvC,IAAMP,EAAMM,EAAMC,CAAC,EACbC,EAAST,EAAI,IAAIC,CAAG,GAAK,CAAC,EAChC,OAAIQ,EAAO,SAAW,GAClBT,EAAI,IAAIC,EAAKQ,CAAM,EAEvBA,EAAO,KAAKD,CAAC,EACNR,CACX,EAAG,IAAI,GAAkB,CAC7B,CAKO,SAAUU,GAAaC,EAAkBL,EAA2D,CACnGM,GAAI,WAAW,OAAO,GACtBA,GAAI,MAAM,cAAc,KAAK,UAAUN,CAAI,CAAC,EAAE,EAElD,IAAMO,EAAiBR,GAAQC,EAAOQ,GAAWC,GAAYD,EAAO,QAAQ,CAAC,EAEzEE,EACJ,OAAW,CAAC,CAAEC,CAAG,IAAKJ,EAAgB,CAElC,QAAWK,KAAKD,EACZ,GAAIC,EAAE,OAAW,CACb,GAAM,CAAC,SAAAC,EAAU,OAAAC,EAAQ,SAAAvB,CAAQ,EAAIqB,EAGjCF,IACA,MAAMA,GAEV,KAAM,CAAC,SAAAG,EAAU,OAAAC,EAAQ,QAAS,OAAW,SAAUxB,GAAgBC,CAAQ,CAAC,EAChFmB,EAAU,MACd,KAAO,CAGH,GAAM,CAAC,OAAQK,EAAY,SAAAF,EAAU,UAAWf,CAAE,EAAKc,EACjDI,EAAOD,GAAY,KACpBL,IACDA,EAAU,CAAC,SAAAG,CAAQ,GAEvBH,EAAQ,QAAUA,EAAQ,SAAW,CAAC,EACtCA,EAAQ,QAAQM,CAAI,EAAIN,EAAQ,QAAQM,CAAI,GAAK,CAAC,WAAY,CAAC,GAAGD,CAAU,EAAG,WAAY,CAAC,CAAC,EAC7F,OAAQL,EAAQ,QAAQM,CAAI,EAAE,WAAiC,KAE/DN,EAAQ,QAAQM,CAAI,EAAE,WAAW,KAAKnB,GAAUC,CAAE,CAAC,CACvD,CAEAY,IACA,MAAMA,EAEd,CACJ,CApGA,IAKMJ,GALNW,GAAAC,GAAA,kBACAC,IACAC,KAGMd,GAAMe,EAAU,wBAAwB,ICL9C,IAAAC,GAAA,GAAAC,GAAAD,GAAA,gBAAAE,KAAA,IAAAC,GACAC,GACAC,GAQaH,GAVbI,GAAAC,GAAA,kBAAAJ,GAAmC,yBACnCC,GAA2B,kBAC3BC,GAA4B,eAQfH,GAAN,KAAmC,CACrB,OAAS,IAAI,gBACb,GACjB,YAAYM,EAAmBC,EAAyBC,EAAU,CAC9D,KAAK,OAAS,IAAI,gBAClB,IAAMC,KAAa,kBAAcH,CAAG,EACpC,KAAK,MAAK,SAAKG,EAAYF,EAAMC,CAAO,EACxC,KAAK,GAAG,GAAG,UAAYE,GAAoB,CACvC,IAAIC,EACJ,GAAI,CACAA,EAAS,KAAK,MAAMD,CAAO,EACvBC,GAAQ,OAAS,QACjB,KAAK,OAAO,KAAK,eAAgB,IAAI,MAAM,oBAAoBD,CAAO,EAAE,CAAC,CAEjF,OAASE,EAAG,CACR,KAAK,OAAO,KAAK,eAAgBA,CAAC,EAClC,MACJ,CACID,EAAO,OAAS,QAChB,KAAK,OAAO,KAAK,QAAS,IAAI,MAAMA,EAAO,OAAO,CAAC,EAEnD,KAAK,OAAO,KAAK,UAAW,CAAC,KAAMA,EAAO,IAAI,CAAC,CAEvD,CAAC,EACD,KAAK,GAAG,QAAQ,GAAG,OAASE,GAAS,CACjC,QAAQ,IAAIA,CAAI,CACpB,CAAC,EACD,KAAK,GAAG,QAAQ,GAAG,OAASA,GAAS,CACjC,QAAQ,MAAMA,CAAI,CACtB,CAAC,EACD,KAAK,GAAG,GAAG,QAAUC,GAAU,CAC3B,KAAK,OAAO,KAAK,QAASA,CAAK,CACnC,CAAC,EACD,KAAK,OAAO,GAAG,UAAYJ,GAAY,CAC/B,KAAK,WACL,KAAK,UAAUA,CAAO,CAE9B,CAAC,EACD,KAAK,OAAO,GAAG,QAAUI,GAAU,CAC3B,KAAK,SACL,KAAK,QAAQA,CAAK,CAE1B,CAAC,EACD,KAAK,OAAO,GAAG,eAAiBA,GAAU,CAClC,KAAK,gBACL,KAAK,eAAeA,CAAK,CAEjC,CAAC,CAEL,CACA,QAAoC,KACpC,UAAwC,KACxC,eAA2C,KAG3C,YAAYJ,EAAwB,CAChC,KAAK,GAAG,KAAK,CAAC,KAAMA,CAAO,EAAII,GAAS,CAChCA,GACA,KAAK,OAAO,KAAK,QAASA,CAAK,CAEvC,CAAC,CACL,CAEA,WAAkB,CACd,KAAK,GAAG,KAAK,CACjB,CAEA,iBAAiDC,EAASC,EAA4DR,EAAmD,CACrK,KAAK,OAAO,YAAYO,EAAMC,CAAQ,CAC1C,CACA,oBAAoDD,EAASC,EAA4DR,EAAgD,CACrK,KAAK,OAAO,eAAeO,EAAMC,CAAQ,CAC7C,CAEA,cAAcC,EAAuB,CACjC,OAAO,KAAK,OAAO,KAAKA,EAAM,KAAMA,CAAK,CAC7C,CACJ,ICtFA,eAAeC,GAAWC,EAAUC,EAAqCC,EAAU,CAC/E,GAAM,CAAC,WAAAC,CAAU,EAAI,KAAM,uCACrBC,EAAO,OAAO,QAAQH,GAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAACI,EAAEC,CAAC,IAAM,KAAKD,CAAC,IAAIC,CAAC,EAAE,EAC1E,OAAO,IAAIH,EAAWH,EAAKI,EAAMF,CAAO,CAC5C,CAEA,eAAeK,GAAUP,EAAUC,EAAqCC,EAA2B,CAC/F,cAAO,QAAQD,GAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAACI,EAAGC,CAAC,IAAMN,EAAI,aAAa,OAAOK,EAAGC,CAAC,CAAC,EAC3E,IAAI,OAAON,EAAKE,CAAO,CAClC,CAEO,SAASM,GAAU,CAAC,IAAAR,EAAK,WAAAC,EAAY,QAAAC,CAAO,EAAwF,CACvI,OACI,OAAO,QAAY,IACbH,GAAWC,EAAKC,EAAYC,CAAO,EACnCK,GAAUP,EAAKC,EAAYC,CAAwB,CAEjE,CAlBA,IAAAO,GAAAC,GAAA,oBCYA,SAASC,GAAiBC,EACAC,EAAqBC,EAA8C,CACzF,IAAMC,EAAe,CAAC,SAAUH,EAAQ,OAAQ,CAAC,GAAGC,EAAQ,aAAcA,EAAO,QAAS,aAAcA,EAAO,OAAO,CAAC,EACvH,OAAIC,IACAC,EAAa,SAAcD,GAExBC,CACX,CAsLA,eAAsBC,GAClBC,EACAC,EACAC,EACkB,CAClBC,GAAI,KAAK;AAAA,EAA0C,KAAK,UAAUH,EAAKI,GAAY,yBAAyB,CAAC,CAAC,EAAE,EAGhH,IAAMC,EAAYL,GAAK,OACvB,GAAIK,IAAc,OACd,MAAM,IAAI,MAAM,0EAA0E,EAE9F,IAAMC,EAAmBN,EACrB,OAAO,YACH,OAAO,QAAQA,CAAG,EACb,OAAO,CAAC,CAACO,CAAG,IAAMA,IAAQ,QAAQ,CAC3C,EAAI,CAAC,EAET,GAAI,CACA,OAAO,MAAMC,GAAgBN,EAAqBI,EAAkBL,EAAOI,CAAS,CACxF,OAASI,EAAG,CACR,MAAAN,GAAI,MAAM,mCAAoCM,CAAC,EACzCA,CACV,CACJ,CAsIA,eAAeD,GAAgBN,EACAF,EACAC,EACAI,EAAmG,CAG9H,IAAMK,EAAS,IAAIC,GAAgB,MAAMC,GAAUP,CAAS,EAAGL,CAAG,EAClE,MAAMU,EAAO,MAAMR,CAAS,EAG5B,IAAMW,EAAwBC,GAAmC,CAC7D,QAAWC,KAAKd,EAAM,CAACa,CAAG,CAAC,EACvBJ,EAAO,KAAKK,CAAC,CAErB,EACA,OAAAF,EAAU,MAAQ,SAA2B,CACzC,MAAMH,EAAO,KAAK,CACtB,EACAG,EAAU,GAAMG,GAAyD,CACrEN,EAAO,GAAGM,CAAQ,CACtB,EAEOH,CACX,CAEO,SAASI,GAAuBC,EAA2DL,EAA8C,CAC5I,OAAO,IAAIM,GAAuBD,EAAQL,CAAS,CACvD,CAlYA,IAIAO,GAMMjB,GAmBAkB,GAwHOF,GA8EPR,GAnONW,GAAAC,GAAA,kBAEAC,KACAC,IACAL,GAA+B,2BAC/BM,KACAC,KAIMxB,GAAMyB,EAAU,2BAA2B,EAmB3CP,GAAN,KAAiD,CAU7C,YAA6BR,EACAgB,EACAlC,EACAmC,EACAjC,EAAoB,CAJpB,eAAAgB,EACA,aAAAgB,EACA,YAAAlC,EACA,uBAAAmC,EACA,cAAAjC,CAC7B,CAdQ,QAAmB,GACV,aAA6B,CAC1C,QAAS,GACT,QAAS,GACT,OAAQ,CAAC,MAAO,EAAG,QAAS,KAAK,IAAI,EAAG,YAAa,SAAS,CAClE,EACQ,iBACS,QAAqD,IAAI,IAS1E,OAAQ,CACJM,GAAI,KAAK,2BAA2B,KAAK,UAAU,KAAK,MAAM,CAAC,4BAA4B,KAAK,iBAAiB,IAAI,EACrH,IAAM4B,EAAM,KAAK,IAAI,EAQrB,GAPI,KAAK,aAAa,UAClB,KAAK,aAAa,OAAO,MAAQ,EACjC,KAAK,aAAa,OAAO,YAAc,UACvC,KAAK,aAAa,OAAO,QAAUA,EACnC,KAAK,aAAa,QAAU,GAC5B,KAAK,aAAa,QAAU,IAE5B,KAAK,mBAAqB,EAAG,CAE7B,IAAMnC,EAAsB,CACxB,GAFW,KAAK,aAAa,OAG7B,UAAWmC,EACX,QAASA,EAAO,EAAI,KAAK,iBAC7B,EACMjB,EAAMpB,GAAiB,KAAK,OAAQE,EAAQ,KAAK,QAAQ,EAC/D,KAAK,UAAUkB,CAAG,CACtB,CACA,KAAK,QAAU,GACX,KAAK,kBAAoB,IACzB,KAAK,iBAAmB,YAAY,IAAM,CACtC,GAAI,CAAC,KAAK,QACN,OAEJ,IAAMiB,EAAM,KAAK,IAAI,EAEfnC,EAAsB,CACxB,GAFW,KAAK,aAAa,OAG7B,UAAWmC,EACX,QAASA,EAAO,EAAI,KAAK,iBAC7B,EACMjB,EAAMpB,GAAiB,KAAK,OAAQE,EAAQ,KAAK,QAAQ,EAC/D,KAAK,UAAUkB,CAAG,CACtB,EAAG,KAAK,iBAAiB,EAEjC,CAEA,MAAO,CACHX,GAAI,KAAK,2BAA2B,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,EACjE,KAAK,QAAU,GACX,KAAK,kBACL,cAAc,KAAK,gBAAgB,EAEvC,IAAM4B,EAAM,KAAK,IAAI,EACrB,KAAK,aAAa,QAAU,GAC5B,KAAK,OAAO,CACR,MAAO,GACP,UAAWA,EACX,QAASA,EACT,QAASA,EACT,YAAa,oBACjB,CAAC,CACL,CAEA,IAAIC,EAA+B,CAC/B,QAAWC,KAAOD,EAAa,CAC3B,IAAMzB,EAAM0B,EAAI,KACV,KAAK,QAAQ,IAAI1B,CAAG,GAAK,EAAE,KAAK,UAAY,QAAa2B,GAAU,KAAK,OAAQ3B,EAAK,KAAK,OAAO,IACnG,KAAK,QAAQ,IAAIA,EAAK0B,CAAG,CAEjC,CACJ,CAEA,QAAQE,EAA6B,CACjC,GAAI,KAAK,SAAWA,EAAW,OAAS,EACpC,QAAWC,KAAMD,EAAY,CACzB,IAAME,EAAS,KAAK,QAAQ,IAAID,EAAG,IAAI,EACvC,GAAIC,EAAQ,CACR,IAAMvB,EAA6B,CAC/B,SAAU,KAAK,OACf,OAAQuB,EACR,UAAW,CAAC,GAAGD,CAAE,CACrB,EACA,OAAOtB,EAAI,UAAU,KACrB,KAAK,UAAUA,CAAG,CACtB,CACJ,CAER,CAEA,OAAOlB,EAAqB,CACxB,IAAM0C,EAAgC,CAAC,GAAG,KAAK,YAAY,EAC3D,OAAO,OAAOA,EAAgB,OAAQ1C,CAAM,EAC5C0C,EAAgB,UAAY1C,EAAO,UACnC0C,EAAgB,QAAU1C,EAAO,QAEjC,IAAM2C,EAAgBD,EAAgB,OAAO,QAAU,KAAK,aAAa,OAAO,MAQhF,IAPI,KAAK,aAAa,SAAWC,KAC7BD,EAAgB,OAAO,QAAU1C,EAAO,WAE5C0C,EAAgB,QAAU,GAE1B,OAAO,OAAO,KAAK,aAAcA,CAAe,EAE5C,KAAK,SAAWA,EAAgB,QAAS,CACzC,IAAMxB,EAAMpB,GAAiB,KAAK,OAAQE,EAAQ,KAAK,QAAQ,EAC/D,KAAK,UAAUkB,CAAG,CACtB,CACJ,CACJ,EAEaK,GAAN,KAA+D,CAClE,YACqBD,EACAL,EAAsB,CADtB,YAAAK,EACA,eAAAL,CACrB,CAEA,WAAW2B,EAA0CC,EAAsC,CACvF,IAAMC,EAAeD,GAAM,SACrBX,EAAoB,KAAK,QAAQ,YAAc,EACrD,OAAO,IAAIT,GAAgB,KAAK,UAAW,KAAK,QAAQ,QAASmB,EAAcV,EAAmBY,CAAY,CAClH,CAEA,MAAM,UAAW,CACb,MAAM,KAAK,UAAU,MAAM,CAC/B,CAEA,GAAG1B,EAAgD,CAC/C,KAAK,UAAU,GAAGA,CAAQ,CAC9B,CACJ,EA2DML,GAAN,KAAsB,CACD,aACA,IACA,OACT,OACS,WACA,SACA,UACjB,YAAYD,EAAgBV,EAA2C,CACnE,GAAM,CAAC,YAAa2C,CAAU,EAAI3C,EAClC,KAAK,aAAe2C,GAAc,IAClC,KAAK,IAAM3C,EACX,KAAK,OAAS,EACd,KAAK,OAASU,EACd,KAAK,WAAa,IAAI,IACtB,KAAK,SAAW,IAAI,IACpB,KAAK,UAAY,CAAC,CACtB,CAEA,MAAM,MAAMR,EAAmB,CAC3B,MAAM,IAAI,QAAe0C,GAAY,CACjC,KAAK,OAAO,QAAWC,GAAU,CAC7B1C,GAAI,MAAM,sBAAsB0C,EAAM,OAAO,EAAE,CACnD,EACA,KAAK,OAAO,eAAkBA,GAAU,CACpC1C,GAAI,MAAM,4BAA4B0C,EAAM,IAAI,EAAE,CACtD,EACA,KAAK,OAAO,UAAaA,GAAU,CAC/B,GAAIA,EAAM,KAAK,MAAO,CAClBD,EAAQ,EACR,MACJ,CACA,GAAIC,EAAM,KAAK,GAAI,CACf,GAAM,CAAC,GAAAC,EAAI,OAAAC,EAAQ,MAAAC,CAAK,EAAIH,EAAM,KAC5BI,EAAI,KAAK,WAAW,IAAIH,CAAE,EAChC,GAAIG,EAAG,CACH,GAAM,CAAC,SAAAC,CAAQ,EAAID,EACnB,GAAI,CACID,EACAE,EAAS,UAAO,qBAAiBF,CAAK,CAAC,EAEvCE,EAAS,QAAQH,CAAM,CAE/B,QAAE,CACE,KAAK,WAAW,OAAOD,CAAE,CAC7B,CACJ,MACI3C,GAAI,MAAM,uBAAuB2C,CAAE,EAAE,CAE7C,SAAWD,EAAM,KAAK,IAAK,CACvB,GAAM,CAAC,MAAAM,EAAO,KAAAC,EAAM,KAAAC,EAAM,QAAAC,EAAS,KAAAC,CAAI,EAAIV,EAAM,KAAK,IACtDW,GAAS,CAAC,MAAAL,EAAO,KAAM,IAAI,KAAKC,CAAI,EAAG,KAAAC,EAAM,QAAAC,EAAS,KAAMC,EAAK,IAAI,MAAK,qBAAiB,CAAC,CAAC,CAAC,CAAC,CACnG,MAAWV,EAAM,KAAK,OAClB,KAAK,UAAU,QAAQY,GAAKA,EAAEZ,EAAM,KAAK,KAAK,CAAC,CAEvD,CACJ,CAAC,EACD,GAAI,CACoB,MAAM,KAAK,QAAQ,QAAS,CAAC,IAAK,KAAK,IAAK,UAAA3C,CAAS,CAAC,EAAE,CAAC,EAC7EC,GAAI,KAAK,qBAAqBD,CAAS,WAAW,CACtD,OAASO,EAAG,CACR,MAAAN,GAAI,MAAM,oCAAoCD,CAAS,MAAMO,CAAC,EAAE,EAChE,KAAK,OAAO,UAAU,EAChBA,CACV,CACJ,CAEQ,QAA8CiD,EAAQC,EAAiD,CACvG,KAAK,WAAW,MAAQ,KAAK,cAC7BxD,GAAI,KAAK,2CAA2C,KAAK,UAAUuD,CAAG,CAAC,EAAE,EAE7E,IAAMZ,EAAK,EAAE,KAAK,OAClB,MAAO,CAACA,EAAI,IAAI,QAAW,CAACF,EAASgB,IAAW,CAC5C,KAAK,WAAW,IAAId,EAAI,CAAC,SAAU,CAAC,QAAAF,EAAS,OAAAgB,CAAM,CAAC,CAAC,EACrD,IAAMC,EAA4B,CAAC,GAAAf,EAAI,IAAAY,EAAK,IAAAC,CAAG,EAC/C,KAAK,OAAO,YAAYE,CAAO,CACnC,CAAC,CAAC,CACN,CAEA,KAAK9C,EAA6B,CAC9B,GAAM,CAAC+B,EAAIG,CAAC,EAAI,KAAK,QAAwB,SAAUlC,CAAC,EACxDkC,EAAE,MAAOxC,GAAM,CACXN,GAAI,KAAK,WAAW2C,CAAE,UAAWrC,CAAC,CACtC,CAAC,EAAE,QAAQ,IAAM,CACb,KAAK,SAAS,OAAOqC,CAAE,CAC3B,CAAC,CACL,CAEA,MAAM,KAAKgB,EAAmB,GAAOC,EAAU,IAAM,CACjD5D,GAAI,KAAK,+CAA+C2D,CAAgB,cAAcC,CAAO,eAAe,KAAK,SAAS,IAAI,EAAE,EAChI,IAAMC,EAAsBC,GAA8B,CACtD,KAAK,WAAW,QAAQ,CAAC,CAAC,SAAAf,CAAQ,IAAM,CACpCA,EAAS,OAAO,IAAI,MAAM,mBAAmBe,CAAM,EAAE,CAAC,CAC1D,CAAC,CACL,EACA,GAAI,CACIH,GACAE,EAAmB,KAAK,EAE5B,IAAME,EAAU,QAAQ,WAAW,KAAK,QAAQ,EAC1CC,EAAc,KAAK,QAAQ,OAAQ,MAAS,EAAE,CAAC,EACrD,MAAM,IAAI,QAAc,CAACvB,EAASgB,IAAW,CACzC,IAAMQ,EAAY,WAAW,IAAM,CAC/BJ,EAAmB,SAAS,EAC5BJ,EAAO,IAAI,MAAM,SAAS,CAAC,CAC/B,EAAGG,CAAO,EACVG,EAAQ,KAAMG,GAAa,CACvB,aAAaD,CAAS,EACtB,QAAWE,KAAWD,EACdC,EAAQ,SAAW,YACnBnE,GAAI,MAAM,8BAA8BmE,EAAQ,MAAM,UAAU,EAGxE1B,EAAQ,CACZ,CAAC,CACL,CAAC,EACD,MAAMuB,EACF,KAAK,SAAS,KAAO,GACrBhE,GAAI,MAAM,uBAAuB,KAAK,SAAS,IAAI,EAAE,EAEzDA,GAAI,KAAK,0BAA0B,CACvC,QAAE,CACE,KAAK,OAAO,UAAU,CAC1B,CACJ,CAEA,GAAGa,EAAgD,CAC/C,KAAK,UAAU,KAAKA,CAAQ,CAChC,CAEJ,ICrWA,IAAAuD,GAAA,GAAAC,GAAAD,GAAA,mBAAAE,GAAA,0BAAAC,KAOA,eAAsBD,GAAcE,EAAqB,CACrD,IAAMC,EAAqBD,GAAQ,aAAa,qBAAqB,GAAK,GAC1E,OAAO,MAAME,GACTF,EACCG,GAASC,GAAaH,EAAoBE,CAAI,EAC/CH,GAAQ,WAAa,2CACzB,CACJ,CAEA,eAAsBD,GAAsBC,EAAsD,CAC9F,OAAOK,GAAuBL,EAAQ,MAAMF,GAAcE,CAAM,CAAC,CACrE,CAlBA,IAAAM,GAAAC,GAAA,kBAAAC,KACAC,OCDA,IAAAC,GAAA,GAAAC,GAAAD,GAAA,2BAAAE,KAUA,eAAeC,GAAcC,EAAwC,CACjE,IAAMC,EAAqBD,EAAO,aAAa,qBAAqB,GAAK,GACzE,OAAAE,GAAI,KAAK,0BAA0BF,EAAO,QAAQ,EAAE,EAC7C,MAAMG,GACTH,EACCI,GAASC,GAAaJ,GAAsB,EAAGG,CAAI,EACpDJ,GAAQ,WAAa,2CAA2C,CACxE,CAEA,eAAsBF,GAAsBE,EAAsD,CAC9F,OAAOM,GAAuBN,EAAQ,MAAMD,GAAcC,CAAM,CAAC,CACrE,CArBA,IAMME,GANNK,GAAAC,GAAA,kBAAAC,KACAC,KAEAC,IAGMT,GAAMU,EAAU,sBAAsB,ICN5C,IAAAC,GAAA,GAAAC,GAAAD,GAAA,eAAAE,GAAA,YAAAC,KAAA,eAAAC,GAAAJ,ICAA,IAAAK,GAAA,GAAAC,GAAAD,GAAA,cAAAE,GAAA,YAAAC,GAAA,cAAAC,GAAA,YAAAC,KCAA,IAAAC,GAAA,GAAAC,GAAAD,GAAA,YAAAE,GAAA,SAAAC,GAAA,YAAAC,KAAA,IAAAC,GAAc,4BAERC,GAAN,KAAY,CACS,IACA,QAAU,IAAI,IAC/B,YAAYC,EAA2B,CACnC,GAAIA,EACA,OAAW,CAACC,EAAGC,CAAC,IAAKF,EACjB,KAAK,QAAQ,IAAIE,EAAGD,CAAC,OAIzBD,EAAM,KAAK,QAEf,KAAK,IAAMA,CACf,CAEO,IAAIG,EAAiC,CACxC,OAAO,KAAK,IAAI,IAAIA,CAAG,CAC3B,CACO,IAAIC,EAAmC,CAC1C,OAAO,KAAK,QAAQ,IAAIA,CAAK,CACjC,CACJ,EAEA,SAASC,GAAkBD,EAAeE,EAA4B,CAClE,IAAMC,EAAMH,EAAM,QAAQ,GAAG,EAC7B,GAAIG,IAAQ,GACR,OAAO,GAAAC,QAAE,QAAQJ,CAAK,EAE1B,IAAMK,EAASL,EAAM,UAAU,EAAGG,CAAG,EAC/BG,EAAYJ,GAAY,IAAIG,CAAM,GAAKA,EAC7C,OAAO,GAAAD,QAAE,QAAQE,EAAYN,EAAM,UAAUG,CAAG,CAAC,CACrD,CAKA,SAASI,GAAaC,EAAkBN,EAA2B,CAC/D,IAAMO,EAAOD,EAAQ,KAAK,EACpBF,EAAYE,EAAQ,UAAU,EACpC,OAAIF,IAAc,KACPG,GAEIP,EAAW,IAAII,CAAS,GAAKA,GAC5B,IAAMG,CAC1B,CAEA,SAASC,GAAaC,EAAMT,EAAmBU,EAA6CC,EAAO,GAAI,CACnG,GAAIF,aAAa,MACb,OAAOA,EAAE,IAAKb,GAEHA,CACV,EACE,GAAIa,aAAa,OAAQ,CAC5B,IAAMG,EAAO,GAAAV,QAAE,IAAI,EACnB,QAAWP,KAAKc,EAAG,CACf,IAAMI,EAAKH,GAAY,IAAIC,CAAI,EACzBd,EAAMgB,IAAO,KAAOlB,EAAII,GAAkBJ,EAAGK,CAAU,EACvDJ,EAAIa,EAAEd,CAAC,EACPmB,EAAO,GAAGH,CAAI,IAAIhB,CAAC,GAEnBoB,EAAKL,GAAY,IAAII,CAAI,EAE/B,GADwBC,IAAO,QAAa,OAAOnB,GAAM,WAAamB,IAAO,KAAOA,GAAI,IAAInB,CAAC,GAEzFgB,EAAK,IAAIf,EAAKE,GAAkBH,EAAGI,CAAU,CAAC,MAC3C,CACCa,IAAO,MAAQ,CAACH,GAAY,IAAII,CAAI,GACpCJ,GAAY,IAAII,EAAM,IAAI,EAE9B,IAAMhB,EAAQU,GAAUZ,EAAGI,EAAYU,EAAYI,CAAI,EACvDF,EAAK,IAAIf,EAAKC,CAAK,CACvB,CACJ,CACA,OAAOc,CACX,KACI,QAAOH,CAEf,CAEA,SAASO,GAAQJ,EAAWZ,EAAsB,CAC9C,GAAI,GAAAE,QAAE,UAAUU,CAAI,EAChB,OAAOP,GAAaO,EAAiBZ,CAAU,EAC5C,GAAI,GAAAE,QAAE,MAAMU,CAAI,EAAG,CACtB,IAAMlB,EAAM,CAAC,EACb,OAAW,CAACC,EAAGC,CAAC,IAAKgB,EAAM,CACvB,IAAMf,EAAM,GAAAK,QAAE,UAAUP,CAAC,EAAIU,GAAaV,EAAcK,CAAU,EAAIL,EACtED,EAAIG,CAAG,EAAImB,GAAKpB,EAAGI,CAAU,CACjC,CACA,OAAON,CACX,SAAW,GAAAQ,QAAE,OAAOU,CAAI,GAAKA,aAAgB,MAAO,CAChD,IAAMK,EAAO,CAAC,EACd,QAAWC,KAAKN,EACZK,EAAK,KAAKD,GAAKE,EAAGlB,CAAU,CAAC,EAEjC,OAAOiB,CACX,CACA,OAAOL,CACX,CAcO,SAASrB,GAAW4B,EAA+H,CACtJ,IAAMC,EAAoBD,GAAM,QAAU,eAAiB,OACrDnB,EAAa,IAAIP,GAAM0B,GAAM,UAAU,EAC7C,MAAO,CACH,OAASE,GAAmB,CACxB,IAAMT,EAAOJ,GAAUa,EAAKrB,EAAYmB,GAAM,UAAU,EACxD,OAAO,GAAAjB,QAAE,OAAOkB,CAAI,EAAE,MAAMR,CAAI,CACpC,EACA,OAASA,GAAoB,CACzB,IAAIlB,EACJ,GAAI,CACAA,EAAM,GAAAQ,QAAE,OAAOkB,CAAI,EAAE,KAAKR,CAAI,CAClC,OAASU,EAAK,CACV,MAAM,IAAI,MAAM,IAAIV,CAAI,yBAA0B,CAAC,MAAOU,CAAG,CAAC,CAClE,CACA,OAAON,GAAQtB,EAAKM,CAAU,CAClC,CACJ,CACJ,CAEO,SAASV,IAA4B,CACxC,MAAO,CACH,OAAQ,KAAK,UACb,OAAQ,KAAK,KACjB,CACJ,CAEA,SAASiC,GAAY3B,EAAS,CAC1B,OAAOA,CACX,CAEA,SAAS4B,GAAa5B,EAAS,CAK3B,OAAIA,aAAa,OAAS,MAAM,QAAQA,CAAC,EAC9BA,EAAE,IAAI4B,EAAS,EAGtB5B,GAAG,cAAgB,OACZ,OAAO,KAAKA,CAAC,EAAE,OAAO,CAAC6B,EAAM9B,KAChC8B,EAAE9B,CAAC,EAAI6B,GAAU5B,EAAED,CAAC,CAAC,EACd8B,GACR,CAAC,CAAM,EAGV7B,IAAM,OACC,KAEJA,CACX,CAEO,SAASP,GAAU8B,EAAsC,CAC5D,MAAO,CACH,OAAQI,GACR,OAASJ,GAAM,MAAQ,GAASK,GAAYD,EAChD,CACJ,CDzKAG,IACAC,KEFAC,ICGO,IAAMC,GAA6B,SAC7BC,GAA8B,UAG9BC,GAAU,GAAGF,EAAe,kBCLzCG,ICOO,SAASC,EAAYC,EAAmBC,EAAqD,CAChG,MAAO,CAAC,SAAUD,EAAW,KAAMC,CAAO,CAC9C,CAGO,SAASC,EAAaC,EAAgBF,EAA0E,CACnH,MAAO,CAAC,GAAGF,EAAS,CAAC,KAAM,SAAS,EAAGE,CAAO,EAAG,OAAAE,CAAM,CAC3D,CAEO,SAASC,EAAWD,EAAgBH,EAAmBC,EAA0E,CACpI,MAAO,CAAC,GAAGF,EAASC,EAAWC,CAAO,EAAG,OAAAE,CAAM,CACnD,CAEA,SAASE,GAASC,EAAkCC,EAA+BC,EAA4BC,EAAgBC,EAAwB,CACnJ,IAAMC,EAAsB,CACxB,KAAM,QACN,WAAYJ,EACZ,WAAYE,EAAO,IACnB,OAAQA,EAAO,OACnB,EACA,OAAIH,IACAK,EAAM,OAASL,GAEfE,IACAG,EAAM,QAAUH,GAEhBE,IACAC,EAAM,QAAUD,GAEbC,CACX,CAEO,SAASA,EAAML,EAAkCN,EAAmBO,EAA+BC,EAA4BC,EAAgBC,EAAsC,CACxL,OAAOX,EAASC,EAAWK,GAASC,EAAWC,EAAWC,EAAQC,EAAQC,CAAO,CAAC,CACtF,CAEA,SAASE,GAAWN,EAAWC,EAAmBC,EAAgC,CAC9E,MAAO,CAAC,KAAM,UAAW,WAAYD,EAAW,OAAQD,EAAW,QAASE,CAAM,CACtF,CAEO,SAASK,EAAQP,EAAsBN,EAAmBO,EAAWC,EAAsC,CAC9G,OAAOT,EAASC,EAAWY,GAAWN,EAAWC,EAAWC,CAAM,CAAC,CACvE,CAEO,SAASM,EAAcX,EAAyB,CACnD,IAAMY,EAAOZ,EAAO,KACpB,OAAOY,GAAQA,IAAS,OAC5B,CAEO,SAASC,EAAeb,EAAyB,CACpD,MAAO,CAACW,EAAcX,CAAM,CAChC,CAEA,SAASc,GAASX,EAAsBC,EAAmBC,EAAgBU,EAAyB,CAChG,MAAO,CAAC,OAAQZ,EAAW,KAAM,QAAS,WAAYC,EAAW,QAASC,EAAQ,MAAOU,CAAC,CAC9F,CAEO,SAASC,GAAMb,EAAsBN,EAAmBO,EAAmBC,EAAgBU,EAAuC,CACrI,OAAOnB,EAASC,EAAWiB,GAASX,EAAWC,EAAWC,EAAQU,CAAC,CAAC,CACxE,CAEA,SAASE,GAAad,EAAsBE,EAAgBa,EAAmBC,EAA2BC,EAAmC,CACzI,MAAO,CACH,OAAQjB,EACR,KAAM,aACN,QAASE,EACT,YAAaa,EACb,SAAUC,EACV,KAAAC,CACJ,CACJ,CAEO,SAASC,GAAUlB,EAAsBN,EAAmBQ,EAAgBa,EAAmBC,EAA2BC,EAAyD,CACtL,OAAOxB,EAASC,EAAWoB,GAAad,EAAWE,EAAQa,EAAWC,EAAiBC,CAAI,CAAC,CAChG,CAEA,SAASE,GAAenB,EAAsBE,EAAgBkB,EAAuBjB,EAA6B,CAC9G,MAAO,CACH,OAAQH,EACR,KAAM,eACN,QAASE,EACT,WAAYkB,EACZ,WAAYjB,EAAO,IACnB,OAAQA,EAAO,OACnB,CACJ,CAEO,SAASkB,GAAYrB,EAAsBN,EAAWQ,EAAQkB,EAAejB,EAAmD,CACnI,OAAOV,EAASC,EAAWyB,GAAenB,EAAWE,EAAQkB,EAAejB,CAAM,CAAC,CACvF,CC5FO,IAAMmB,GAAN,cAA4B,KAAM,CAErC,YAAYC,EAA0BC,EAA8BC,EAAiB,CACjF,MAAMF,CAAO,EADqB,UAAAC,EAA8B,WAAAC,EAEhE,KAAK,KAAO,gBACZ,KAAK,KAAOD,EACZ,KAAK,MAAQC,CACjB,CACJ,EAEO,SAASC,EAAcC,EAAaH,EAAqBC,EAAiB,CAC7E,OAAO,IAAIH,GAAcK,EAAKH,EAAMC,CAAK,CAC7C,CAGO,SAASG,GAAcC,EAAwC,CAClE,GAAIA,aAAcP,GACd,OAAOO,EAAG,IAElB,CAGO,SAASC,GAAiBD,EAAiC,CAC9D,GAAIA,aAAc,MACd,OAAOA,EAAG,OAElB,CC3BO,SAASE,EAAOC,EAAgBC,EAAyB,CAC5D,MAAO,CAAC,IAAAD,EAAK,QAAAC,CAAO,CACxB,CAEO,SAASC,EAAkBC,EAAaC,EAA4B,CACvE,IAAM,EAAIC,GAAcF,CAAE,EAC1B,MAAO,CAAC,IAAK,GAAG,KAAOC,EAAY,QAAS,GAAG,SAAWE,GAAiBH,CAAE,GAAK,EAAE,CACxF,CAEO,SAASI,EAAYP,EAAgBC,EAAwB,CAChE,IAAMF,EAAiB,CAAC,IAAAC,EAAK,QAAAC,CAAO,EACpC,MAAM,IAAIO,GAAcP,EAASF,CAAM,CAC3C,CAEO,SAASU,EAAgBC,EAA0D,CACtF,MAAO,CAAC,IAAKA,EAAQ,WAAY,QAASA,EAAQ,MAAM,CAC5D,CCrBA,IAAAC,GAA6C,kBCG7C,IAAAC,EASO,kBAQcC,EAArB,MAAqBC,UAA2B,QAAO,CACtD,OAAuB,GAAK,EAC5B,OAAuB,IAAM,EAC7B,OAAuB,GAAK,EAC5B,OAAuB,IAAM,EAC7B,OAAuB,MAAQ,EAC/B,OAAuB,OAAS,EAChC,OAAuB,OAAS,EAChC,OAAuB,OAAS,EAChC,OAAuB,MAAQ,EAC/B,OAAuB,IAAM,GAC7B,OAAuB,KAAO,GAC9B,OAAuB,OAAS,GAChC,OAAuB,GAAK,GAC5B,OAAgC,IAAM,QAAM,IAC5C,OAAuB,WAAa,EACpC,OAAuB,UAAY,EACnC,OAAuB,WAAa,EACpC,OAAuB,WAAa,EACpC,OAAuB,UAAY,EACnC,OAAuB,WAAa,EACpC,OAAuB,cAAgB,EACvC,OAAuB,SAAW,EAClC,OAAuB,UAAY,EACnC,OAAuB,YAAc,EACrC,OAAuB,aAAkC,CAAE,KAAM,OACN,OAAQ,OACR,OAAQ,MACR,MAAO,MACP,MAAO,KAAM,EACxE,OAAuB,cAAmC,CAAE,KAAM,KACN,MAAO,KACP,MAAO,QACP,SAAU,SACV,SAAU,QACV,MAAO,OACP,SAAU,IAAK,EAE3E,OAAuB,UAAsB,CAC5C,QAAS,OAAQ,QAAS,QAAS,OAAQ,QAAS,WAAY,MAChE,OAAQ,QACT,EACA,IAAW,iBAA0B,CAAE,MAAO,iBAAmB,CACjE,IAAW,cAAkC,CAAE,OAAOA,EAAmB,YAAc,CACvF,IAAW,eAAmC,CAAE,OAAOA,EAAmB,aAAe,CACzF,IAAW,WAAsB,CAAE,OAAOA,EAAmB,SAAW,CACxE,IAAW,eAA0B,CAAE,OAAOA,EAAmB,cAAgB,CAEvE,+BAA+BC,EAAoBC,EAA4C,CACxG,OAAO,IAAI,2BAAyB,KAAMD,EAAWC,CAAO,CAC7D,CAEA,YAAYC,EAAoB,CAC/B,MAAMA,CAAK,EACX,KAAK,QAAU,IAAI,qBAAmB,KAAMH,EAAmB,KAAMA,EAAmB,eAAgB,IAAI,wBAAwB,CACrI,CAEO,OAAsB,CAC5B,IAAII,EAAyB,IAAIC,GAAa,KAAM,KAAK,KAAM,KAAK,KAAK,EACzE,KAAK,UAAUD,EAAU,EAAGJ,EAAmB,UAAU,EACzD,GAAI,CACH,KAAK,cAAcI,EAAU,CAAC,EAE9B,KAAK,MAAQ,GACb,KAAK,KAAK,EACV,KAAK,MAAQ,GACb,KAAK,MAAMJ,EAAmB,GAAG,CAElC,OACOM,EAAI,CACV,GAAIA,aAAc,uBACjBF,EAAS,UAAYE,EACrB,KAAK,YAAY,YAAY,KAAMA,CAAE,EACrC,KAAK,YAAY,QAAQ,KAAMA,CAAE,MAEjC,OAAMA,CAER,QACA,CACC,KAAK,SAAS,CACf,CACA,OAAOF,CACR,CAEO,MAAoB,CAC1B,IAAIA,EAAwB,IAAIG,GAAY,KAAM,KAAK,KAAM,KAAK,KAAK,EACvE,KAAK,UAAUH,EAAU,EAAGJ,EAAmB,SAAS,EACxD,GAAI,CACH,KAAK,cAAcI,EAAU,CAAC,EAE9B,KAAK,MAAQ,GACb,KAAK,MAAM,CAAC,CAEb,OACOE,EAAI,CACV,GAAIA,aAAc,uBACjBF,EAAS,UAAYE,EACrB,KAAK,YAAY,YAAY,KAAMA,CAAE,EACrC,KAAK,YAAY,QAAQ,KAAMA,CAAE,MAEjC,OAAMA,CAER,QACA,CACC,KAAK,SAAS,CACf,CACA,OAAOF,CACR,CAKO,MAAMI,EAA2B,CACnCA,IAAO,SACVA,EAAK,GAGN,IAAIC,EAAgC,KAAK,KACrCC,EAAuB,KAAK,MAC5BN,EAAyB,IAAIO,GAAa,KAAM,KAAK,KAAMD,CAAY,EACvEE,EAAyBR,EACzBS,EAAsB,EAC1B,KAAK,mBAAmBT,EAAU,EAAGJ,EAAmB,WAAYQ,CAAE,EACtE,GAAI,CACH,IAAIM,EAeJ,IAdA,KAAK,cAAcV,EAAU,CAAC,EAG9BA,EAAW,IAAIW,GAAkB,KAAMX,CAAQ,EAC/C,KAAK,KAAOA,EACZQ,EAAWR,EAEX,KAAK,MAAQ,GACb,KAAK,MAAM,CAAC,EAEZ,KAAK,KAAK,KAAO,KAAK,OAAO,GAAG,EAAE,EAClC,KAAK,MAAQ,GACb,KAAK,YAAY,KAAK,IAAI,EAC1BU,EAAO,KAAK,QAAQ,gBAAgB,KAAK,OAAQ,EAAG,KAAK,IAAI,EACtDA,IAAS,GAAKA,IAAS,MAAI,oBAAoB,CACrD,GAAIA,IAAS,EAQZ,OAPI,KAAK,iBAAmB,MAC3B,KAAK,qBAAqB,EAE3BF,EAAWR,EAEX,KAAK,MAAQ,GACb,KAAK,YAAY,KAAK,IAAI,EACjB,KAAK,QAAQ,gBAAgB,KAAK,OAAQ,EAAG,KAAK,IAAI,EAAI,CACnE,IAAK,GACJ,CAIA,GAHAA,EAAW,IAAIY,GAAW,KAAM,IAAIL,GAAa,KAAMF,EAAYC,CAAY,CAAC,EAChF,KAAK,wBAAwBN,EAAUS,EAAab,EAAmB,UAAU,EACjF,KAAK,MAAQ,GACT,CAAE,KAAK,SAAS,KAAK,KAAM,CAAC,EAC/B,MAAM,KAAK,+BAA+B,6BAA6B,EAExE,KAAK,MAAQ,GACb,KAAK,MAAMA,EAAmB,GAAG,EACjC,KAAK,MAAQ,GACb,KAAK,MAAM,CAAC,CACZ,CACA,MACD,IAAK,GACJ,CAIA,GAHAI,EAAW,IAAIa,GAAU,KAAM,IAAIN,GAAa,KAAMF,EAAYC,CAAY,CAAC,EAC/E,KAAK,wBAAwBN,EAAUS,EAAab,EAAmB,UAAU,EACjF,KAAK,MAAQ,GACT,CAAE,KAAK,SAAS,KAAK,KAAM,CAAC,EAC/B,MAAM,KAAK,+BAA+B,6BAA6B,EAExE,KAAK,MAAQ,GACb,KAAK,MAAMA,EAAmB,EAAE,EAChC,KAAK,MAAQ,GACb,KAAK,MAAM,CAAC,CACZ,CACA,KACD,CAGD,KAAK,MAAQ,GACb,KAAK,YAAY,KAAK,IAAI,EAC1Bc,EAAO,KAAK,QAAQ,gBAAgB,KAAK,OAAQ,EAAG,KAAK,IAAI,CAC9D,CAED,OACOR,EAAI,CACV,GAAIA,aAAc,uBACjBF,EAAS,UAAYE,EACrB,KAAK,YAAY,YAAY,KAAMA,CAAE,EACrC,KAAK,YAAY,QAAQ,KAAMA,CAAE,MAEjC,OAAMA,CAER,QACA,CACC,KAAK,wBAAwBG,CAAU,CACxC,CACA,OAAOL,CACR,CAKO,MAAMI,EAA2B,CACnCA,IAAO,SACVA,EAAK,GAGN,IAAIC,EAAgC,KAAK,KACrCC,EAAuB,KAAK,MAC5BN,EAAyB,IAAIc,EAAa,KAAM,KAAK,KAAMR,CAAY,EACvEE,EAAyBR,EACzBS,EAAsB,EAC1B,KAAK,mBAAmBT,EAAU,EAAGJ,EAAmB,WAAYQ,CAAE,EACtE,GAAI,CACH,IAAIM,EAeJ,IAdA,KAAK,cAAcV,EAAU,CAAC,EAG9BA,EAAW,IAAIe,GAAiB,KAAMf,CAAQ,EAC9C,KAAK,KAAOA,EACZQ,EAAWR,EAEX,KAAK,MAAQ,GACb,KAAK,KAAK,EAEV,KAAK,KAAK,KAAO,KAAK,OAAO,GAAG,EAAE,EAClC,KAAK,MAAQ,GACb,KAAK,YAAY,KAAK,IAAI,EAC1BU,EAAO,KAAK,QAAQ,gBAAgB,KAAK,OAAQ,EAAG,KAAK,IAAI,EACtDA,IAAS,GAAKA,IAAS,MAAI,oBAAoB,CACrD,GAAIA,IAAS,EAQZ,OAPI,KAAK,iBAAmB,MAC3B,KAAK,qBAAqB,EAE3BF,EAAWR,EAEX,KAAK,MAAQ,GACb,KAAK,YAAY,KAAK,IAAI,EACjB,KAAK,QAAQ,gBAAgB,KAAK,OAAQ,EAAG,KAAK,IAAI,EAAI,CACnE,IAAK,GACJ,CAIA,GAHAA,EAAW,IAAIgB,GAAU,KAAM,IAAIF,EAAa,KAAMT,EAAYC,CAAY,CAAC,EAC/E,KAAK,wBAAwBN,EAAUS,EAAab,EAAmB,UAAU,EACjF,KAAK,MAAQ,GACT,CAAE,KAAK,SAAS,KAAK,KAAM,CAAC,EAC/B,MAAM,KAAK,+BAA+B,6BAA6B,EAExE,KAAK,MAAQ,GACb,KAAK,MAAMA,EAAmB,EAAE,EAChC,KAAK,MAAQ,GACb,KAAK,KAAK,CACV,CACA,MACD,IAAK,GACJ,CAIA,GAHAI,EAAW,IAAIiB,GAAW,KAAM,IAAIH,EAAa,KAAMT,EAAYC,CAAY,CAAC,EAChF,KAAK,wBAAwBN,EAAUS,EAAab,EAAmB,UAAU,EACjF,KAAK,MAAQ,GACT,CAAE,KAAK,SAAS,KAAK,KAAM,CAAC,EAC/B,MAAM,KAAK,+BAA+B,6BAA6B,EAExE,KAAK,MAAQ,GACb,KAAK,MAAMA,EAAmB,GAAG,EACjC,KAAK,MAAQ,GACb,KAAK,KAAK,CACV,CACA,MACD,IAAK,GACJ,CAIA,GAHAI,EAAW,IAAIkB,GAAa,KAAM,IAAIJ,EAAa,KAAMT,EAAYC,CAAY,CAAC,EAClF,KAAK,wBAAwBN,EAAUS,EAAab,EAAmB,UAAU,EACjF,KAAK,MAAQ,GACT,CAAE,KAAK,SAAS,KAAK,KAAM,CAAC,EAC/B,MAAM,KAAK,+BAA+B,6BAA6B,EAExE,KAAK,MAAQ,GACb,KAAK,MAAMA,EAAmB,KAAK,EACnC,KAAK,MAAQ,GACb,KAAK,KAAK,CACV,CACA,KACD,CAGD,KAAK,MAAQ,GACb,KAAK,YAAY,KAAK,IAAI,EAC1Bc,EAAO,KAAK,QAAQ,gBAAgB,KAAK,OAAQ,EAAG,KAAK,IAAI,CAC9D,CAED,OACOR,EAAI,CACV,GAAIA,aAAc,uBACjBF,EAAS,UAAYE,EACrB,KAAK,YAAY,YAAY,KAAMA,CAAE,EACrC,KAAK,YAAY,QAAQ,KAAMA,CAAE,MAEjC,OAAMA,CAER,QACA,CACC,KAAK,wBAAwBG,CAAU,CACxC,CACA,OAAOL,CACR,CAEO,MAAoB,CAC1B,IAAIA,EAAwB,IAAImB,GAAY,KAAM,KAAK,KAAM,KAAK,KAAK,EACvE,KAAK,UAAUnB,EAAU,EAAGJ,EAAmB,SAAS,EACxD,GAAI,CAKH,OAJA,KAAK,cAAcI,EAAU,CAAC,EAE9B,KAAK,MAAQ,GACb,KAAK,YAAY,KAAK,IAAI,EACjB,KAAK,QAAQ,gBAAgB,KAAK,OAAQ,EAAG,KAAK,IAAI,EAAI,CACnE,IAAK,GAEJ,KAAK,MAAQ,GACb,KAAK,MAAM,EAEX,MACD,IAAK,GAEJ,KAAK,MAAQ,GACb,KAAK,SAAS,EAEd,MACD,IAAK,GAEJ,KAAK,MAAQ,GACb,KAAK,QAAQ,EAEb,MACD,IAAK,GAEJ,KAAK,MAAQ,GACb,KAAK,IAAI,EAET,MACD,IAAK,GAEJ,KAAK,MAAQ,GACb,KAAK,MAAMJ,EAAmB,MAAM,EACpC,KAAK,MAAQ,GACb,KAAK,MAAM,CAAC,EACZ,KAAK,MAAQ,GACb,KAAK,MAAMA,EAAmB,MAAM,EAEpC,KACD,CAED,OACOM,EAAI,CACV,GAAIA,aAAc,uBACjBF,EAAS,UAAYE,EACrB,KAAK,YAAY,YAAY,KAAMA,CAAE,EACrC,KAAK,YAAY,QAAQ,KAAMA,CAAE,MAEjC,OAAMA,CAER,QACA,CACC,KAAK,SAAS,CACf,CACA,OAAOF,CACR,CAEO,OAAsB,CAC5B,IAAIA,EAAyB,IAAIoB,GAAa,KAAM,KAAK,KAAM,KAAK,KAAK,EACzE,KAAK,UAAUpB,EAAU,GAAIJ,EAAmB,UAAU,EAC1D,GAAI,CACH,KAAK,cAAcI,EAAU,CAAC,EAE9B,KAAK,MAAQ,GACb,KAAK,MAAMJ,EAAmB,MAAM,EACpC,KAAK,MAAQ,GACb,KAAK,KAAK,CAEX,OACOM,EAAI,CACV,GAAIA,aAAc,uBACjBF,EAAS,UAAYE,EACrB,KAAK,YAAY,YAAY,KAAMA,CAAE,EACrC,KAAK,YAAY,QAAQ,KAAMA,CAAE,MAEjC,OAAMA,CAER,QACA,CACC,KAAK,SAAS,CACf,CACA,OAAOF,CACR,CAEO,UAA4B,CAClC,IAAIA,EAA4B,IAAIqB,GAAgB,KAAM,KAAK,KAAM,KAAK,KAAK,EAC/E,KAAK,UAAUrB,EAAU,GAAIJ,EAAmB,aAAa,EAC7D,GAAI,CACH,KAAK,cAAcI,EAAU,CAAC,EAE9B,KAAK,MAAQ,GACb,KAAK,MAAMJ,EAAmB,KAAK,EACnC,KAAK,MAAQ,GACb,KAAK,KAAK,CAEX,OACOM,EAAI,CACV,GAAIA,aAAc,uBACjBF,EAAS,UAAYE,EACrB,KAAK,YAAY,YAAY,KAAMA,CAAE,EACrC,KAAK,YAAY,QAAQ,KAAMA,CAAE,MAEjC,OAAMA,CAER,QACA,CACC,KAAK,SAAS,CACf,CACA,OAAOF,CACR,CAEO,KAAkB,CACxB,IAAIA,EAAuB,IAAIsB,GAAW,KAAM,KAAK,KAAM,KAAK,KAAK,EACrE,KAAK,UAAUtB,EAAU,GAAIJ,EAAmB,QAAQ,EACxD,IAAI2B,EACJ,GAAI,CACH,KAAK,cAAcvB,EAAU,CAAC,EAC9B,CAIA,IAHA,KAAK,MAAQ,GACb,KAAK,YAAY,KAAK,IAAI,EAC1BuB,EAAM,KAAK,OAAO,GAAG,CAAC,EACfA,IAAM,IAGZ,KAAK,MAAQ,GACb,KAAK,MAAM3B,EAAmB,EAAE,EAGhC,KAAK,MAAQ,GACb,KAAK,YAAY,KAAK,IAAI,EAC1B2B,EAAM,KAAK,OAAO,GAAG,CAAC,EAEvB,KAAK,MAAQ,GACb,KAAK,MAAM3B,EAAmB,GAAG,CACjC,CACD,OACOM,EAAI,CACV,GAAIA,aAAc,uBACjBF,EAAS,UAAYE,EACrB,KAAK,YAAY,YAAY,KAAMA,CAAE,EACrC,KAAK,YAAY,QAAQ,KAAMA,CAAE,MAEjC,OAAMA,CAER,QACA,CACC,KAAK,SAAS,CACf,CACA,OAAOF,CACR,CAEO,MAAoB,CAC1B,IAAIA,EAAwB,IAAIwB,GAAY,KAAM,KAAK,KAAM,KAAK,KAAK,EACvE,KAAK,UAAUxB,EAAU,GAAIJ,EAAmB,SAAS,EACzD,GAAI,CACH,KAAK,cAAcI,EAAU,CAAC,EAE9B,KAAK,MAAQ,GACb,KAAK,MAAMJ,EAAmB,IAAI,CAEnC,OACOM,EAAI,CACV,GAAIA,aAAc,uBACjBF,EAAS,UAAYE,EACrB,KAAK,YAAY,YAAY,KAAMA,CAAE,EACrC,KAAK,YAAY,QAAQ,KAAMA,CAAE,MAEjC,OAAMA,CAER,QACA,CACC,KAAK,SAAS,CACf,CACA,OAAOF,CACR,CAEO,SAAyB,CAC/B,IAAIA,EAA0B,IAAIyB,GAAc,KAAM,KAAK,KAAM,KAAK,KAAK,EAC3E,KAAK,UAAUzB,EAAU,GAAIJ,EAAmB,WAAW,EAC3D,IAAI2B,EACJ,GAAI,CACH,KAAK,cAAcvB,EAAU,CAAC,EAC9B,CAIA,IAHA,KAAK,MAAQ,GACb,KAAK,YAAY,KAAK,IAAI,EAC1BuB,EAAM,KAAK,OAAO,GAAG,CAAC,EACfA,IAAM,IAGZ,KAAK,MAAQ,GACb,KAAK,MAAM3B,EAAmB,EAAE,EAGhC,KAAK,MAAQ,GACb,KAAK,YAAY,KAAK,IAAI,EAC1B2B,EAAM,KAAK,OAAO,GAAG,CAAC,EAEvB,KAAK,MAAQ,GACb,KAAK,MAAM3B,EAAmB,MAAM,CACpC,CACD,OACOM,EAAI,CACV,GAAIA,aAAc,uBACjBF,EAAS,UAAYE,EACrB,KAAK,YAAY,YAAY,KAAMA,CAAE,EACrC,KAAK,YAAY,QAAQ,KAAMA,CAAE,MAEjC,OAAMA,CAER,QACA,CACC,KAAK,SAAS,CACf,CACA,OAAOF,CACR,CAEO,QAAQA,EAAuB0B,EAAmBC,EAA4B,CACpF,OAAQD,EAAW,CACnB,IAAK,GACJ,OAAO,KAAK,cAAc1B,EAA0B2B,CAAS,EAC9D,IAAK,GACJ,OAAO,KAAK,cAAc3B,EAA0B2B,CAAS,CAC9D,CACA,MAAO,EACR,CACQ,cAAc3B,EAAwB2B,EAA4B,CACzE,OAAQA,EAAW,CACnB,IAAK,GACJ,OAAO,KAAK,SAAS,KAAK,KAAM,CAAC,EAClC,IAAK,GACJ,OAAO,KAAK,SAAS,KAAK,KAAM,CAAC,CAClC,CACA,MAAO,EACR,CACQ,cAAc3B,EAAwB2B,EAA4B,CACzE,OAAQA,EAAW,CACnB,IAAK,GACJ,OAAO,KAAK,SAAS,KAAK,KAAM,CAAC,EAClC,IAAK,GACJ,OAAO,KAAK,SAAS,KAAK,KAAM,CAAC,EAClC,IAAK,GACJ,OAAO,KAAK,SAAS,KAAK,KAAM,CAAC,CAClC,CACA,MAAO,EACR,CAEA,OAAuB,eAA2B,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EACrE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACtE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GACtE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GACpE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACrE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EACrE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EACrE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GACpE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GACtE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EACtE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EACtE,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EACrE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EACrE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EACtE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,EACtE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EACtE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GACrE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EACrE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GACtE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GACrE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GACrE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GACpE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GACrE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GACpE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,G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,GAAG,GACrE,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EACtE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EACtE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,EACtE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EACrE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EACtE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EACrE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GACrE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,GACrE,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GACrE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GACtE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GACpE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GACtE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GACtE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EACtE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EACtE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAA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",
  "names": ["logger_exports", "__export", "configure", "getLogger", "logEvent", "event", "name", "level", "checkNameAndConfigureLevel", "isLevelEnabledFor", "appender", "log", "message", "data", "logLevelValue", "LogLevel", "logLevels", "newLogger", "logger", "args", "methods", "key", "method", "suffix", "ROOT", "orderedEntries", "n1", "n2", "prefix", "loggers", "config", "updateLevels", "k", "logLevel", "init_logger", "__esmMin", "e", "filters_exports", "__export", "regexify", "valueMatches", "valuesMatch", "isExactMatch", "matcher", "lhs", "rhs", "matchers", "value", "expression", "groups", "JAVASCRIPT_REGEX", "CLOJURESCRIPT_REGEX", "init_filters", "__esmMin", "removev", "el", "c", "e", "ensureDomain", "peer", "domain", "p", "friendlily", "o", "a", "k", "replacerWithPath", "replacer", "paths", "field", "value", "path", "sanitizerOf", "objectAsKey", "obj", "KEY_COMPARE_FN", "some", "import_immer", "init_utilities", "__esmMin", "b", "publisherMatches", "publisherFilter", "repoId", "k", "v", "rv", "valueMatches", "metricMatches", "metricFilter", "name", "valuesMatch", "isAllowed", "filters", "result", "r", "filterConfig", "blocked", "allowed", "nonMatched", "init_filters", "__esmMin", "extractMetadata", "metadata", "value", "v", "acc", "key", "val", "datapoint", "dp", "groupBy", "data", "keyFn", "t", "values", "conflateRepo", "maxCount", "log", "dataByIdentity", "update", "objectAsKey", "current", "dps", "e", "identity", "status", "definition", "name", "init_common", "__esmMin", "init_logger", "init_utilities", "getLogger", "nodeWorker_exports", "__export", "NodeWorker", "import_child_process", "import_events", "import_url", "init_nodeWorker", "__esmMin", "url", "args", "options", "modulePath", "message", "parsed", "e", "data", "error", "type", "listener", "event", "nodeWorker", "url", "parameters", "options", "NodeWorker", "args", "k", "v", "webWorker", "newWorker", "init_core", "__esmMin", "makeStatusUpdate", "repoId", "status", "metadata", "statusUpdate", "basicPublisher", "cfg", "xform", "publishFn", "log", "sanitizerOf", "workerCfg", "cfgWithoutWorker", "key", "publishInWorker", "e", "worker", "WorkerPublisher", "newWorker", "publisher", "msg", "u", "listener", "basicRepositoryFactory", "config", "BasicRepositoryFactory", "import_serialize_error", "BasicRepository", "init_publisher", "__esmMin", "init_core", "init_logger", "init_utilities", "init_filters", "getLogger", "filters", "heartbeatInterval", "now", "definitions", "def", "isAllowed", "dataPoints", "dp", "metric", "publisherStatus", "statusChanged", "peerIdentity", "opts", "peerMetadata", "bufferSize", "resolve", "event", "id", "result", "error", "p", "resolver", "level", "time", "name", "message", "data", "logEvent", "l", "cmd", "arg", "reject", "request", "rejectProcessing", "timeout", "rejectProcessingFn", "reason", "pending", "stopPromise", "timeoutId", "outcomes", "outcome", "rest_exports", "__export", "restPublisher", "restRepositoryFactory", "config", "conflationMaxCount", "basicPublisher", "data", "conflateRepo", "basicRepositoryFactory", "init_rest", "__esmMin", "init_publisher", "init_common", "file_exports", "__export", "fileRepositoryFactory", "filePublisher", "config", "conflationMaxCount", "log", "basicPublisher", "data", "conflateRepo", "basicRepositoryFactory", "init_file", "__esmMin", "init_publisher", "init_common", "init_logger", "getLogger", "index_exports", "__export", "main_exports", "index_default", "__toCommonJS", "main_exports", "__export", "encoders_exports", "Factory", "filters_exports", "logger_exports", "encoders_exports", "__export", "direct", "json", "transit", "import_transit_js", "BiMap", "map", "k", "v", "key", "value", "namespacedKeyword", "namespaces", "idx", "t", "prefix", "namespace", "parseKeyword", "keyword", "name", "toTransit", "m", "keywordize", "root", "data", "kc", "path", "vc", "toJS", "list", "e", "opts", "type", "msg", "err", "identity", "transform", "a", "init_logger", "init_filters", "init_logger", "globalDomainUri", "contextDomainUri", "failure", "init_logger", "outgoing", "recipient", "message", "broadcast", "source", "unicast", "errorMsg", "domainUri", "requestId", "peerId", "reason", "context", "error", "successMsg", "success", "isLocalSource", "type", "isRemoteSource", "tokenMsg", "t", "token", "peerAddedMsg", "newPeerId", "newPeerIdentity", "meta", "peerAdded", "peerRemovedMsg", "removedPeerId", "peerRemoved", "ExceptionInfo", "message", "data", "cause", "exceptionInfo", "msg", "exceptionData", "ex", "exceptionMessage", "reason", "uri", "message", "exceptionToReason", "ex", "defaultUri", "exceptionData", "exceptionMessage", "throwReason", "ExceptionInfo", "requestToReason", "request", "import_antlr4", "import_antlr4", "RestrictionsParser", "_RestrictionsParser", "predicate", "message", "input", "localctx", "ParseContext", "re", "ExprContext", "_p", "_parentctx", "_parentState", "AndOrContext", "_prevctx", "_startState", "_alt", "AndOrEqNeqContext", "AndContext", "OrContext", "EqNeqContext", "EqNeqTermContext", "EqContext", "NeqContext", "MatchContext", "TermContext", "IdentContext", "OwnIdentContext", "StrContext", "_la", "WordContext", "NumberContext", "ruleIndex", "predIndex", "ds", "index", "parser", "parent", "invokingState", "listener", "visitor", "ctx", "i", "import_antlr4", "RestrictionsLexer", "_RestrictionsLexer", "input", "ds", "index", "import_antlr4", "RestrictionsVisitor", "visitor", "RestrictionsVisitor", "inline", "ctx", "children", "lhs", "rhs", "visitor_default", "parse", "input", "chars", "lexer", "RestrictionsLexer", "tokens", "RestrictionsParser", "visitor_default", "hiccupTransform", "visitor", "tree", "first", "next", "transform", "args", "x", "rest", "check", "restrictions", "ownContext", "context", "rhs", "lhs", "_", "idn", "parse", "restrictions", "check", "parsedRestrictions", "own", "ctx", "ownSource", "ownContext", "source", "context", "randomId", "nodeId", "ids", "requestId", "nextId", "id", "instanceId", "contextId", "activityId", "peerId", "import_immer", "emptyState", "nodeId", "signingKey", "signatureKey", "randomId", "joinDomain", "state", "peerId", "domain", "restrictions", "draft", "leaveDomain", "s", "inDomain", "peerInDomain", "peer", "setGatewayRequest", "gwRequestId", "request", "removeGatewayRequest", "state", "requestId", "draft", "domainForUri", "domainUri", "threadStateAndActions", "functions", "cs", "cas", "fun", "s", "as", "import_immer", "init_utilities", "isSourceSubsetOf", "source", "subset", "bySourceInDomain", "state", "domain", "peersInDomain", "peer", "bySource", "peers", "byIdInDomain", "peerId", "byId", "byIdThrows", "exceptionInfo", "byIdInDomainThrows", "isLocalPeer", "isClusterPeer", "ctx", "check", "byIdentity", "identity", "key", "objectAsKey", "some", "ensurePeerWithId", "resolvedIdentity", "creationRequest", "options", "p", "newPeer", "draft", "userPeers", "removePeer", "idnt", "id", "user", "setPeer", "s", "updatePeer", "f", "isPeerVisibleIdentity", "lhs", "rhs", "lhsSource", "lhsIdentity", "lhsRestrictions", "lhsService", "rhsSource", "rhsIdentity", "rhsRestrictions", "rhsService", "rhsUser", "lhsUser", "isPeerVisible", "lhsPeer", "rhsPeer", "allVisiblePeers", "includeSelf", "other", "visiblePeers", "peerInDomain", "announcePeerMessages", "domainUri", "existingMessages", "receiver", "existingPeer", "existingIdentity", "existingId", "newPeerId", "isLocal", "m", "peerAdded", "announcePeer", "messages", "leaveDomain", "leavingPeer", "reason", "isSourceRemoved", "removedFrom", "peerRemoved", "matchSource", "source1", "source2", "sourceKeys", "key", "validateSource", "state", "source", "body", "peerId", "peer", "byId", "exceptionInfo", "log", "getLogger", "sourceRemoved", "msg", "domains", "registeredDomain", "globalDomainUri", "curState", "curMsgs", "domain", "result", "newState", "newMsgs", "handleMessage", "domainUri", "m", "error", "reason", "failure", "buildDomains", "target", "info", "init_logger", "init_utilities", "LocalNode", "handler", "msg", "source", "log", "getLogger", "handleMessage", "state", "body", "origin", "friendlily", "e", "m", "error", "exceptionToReason", "failure", "hasReceiver", "address", "processResponse", "response", "receiver", "processMessage", "newState", "responses", "localNode", "domains", "options", "registeredDomains", "buildDomains", "s", "domain", "emptyState", "nodeId", "globalDomainUri", "failure", "globalUnhandledMessage", "globalAlreadySeen", "globalInvalidDomain", "globalInvalidContext", "globalAuthenticationFailure", "globalInvalidPeer", "init_logger", "welcome", "recipient", "requestId", "peerId", "availableDomains", "resolvedIdentity", "options", "message", "globalDomainUri", "outgoing", "authenticationRequest", "domainUri", "details", "join", "restrictions", "peerIdentity", "ping", "knownKeys", "missingKey", "identity", "key", "checkIdentity", "missing", "ExceptionInfo", "machine", "endpoint", "ip", "host", "import_jsrsasign", "sign", "data", "key", "unsign", "message", "opts", "kjurResult", "forRequest", "state", "impersonateIdentity", "gwRequest", "expMs", "payload", "sign", "forAuthentication", "convertToken", "signatureKey", "token", "opts", "unsign", "import_immer", "contexts", "state", "addContext", "context", "draft", "removeContext", "contextId", "contextByName", "name", "peer", "peerUser", "isService", "result", "c", "contextById", "contextByIdThrows", "exceptionInfo", "addContextMember", "peerId", "s", "removeContextMember", "draftState", "draftContext", "setIn", "targetData", "targetPath", "value", "nextTargetData", "merge", "a", "b", "applyDeltaCmd", "data", "cmd", "command", "args", "removed", "d", "k", "v", "cd", "stringToPath", "p", "currentElement", "i", "next", "applyDelta", "delta", "version", "toCtx", "creator", "lifetime", "readPermissions", "writePermissions", "ctxId", "identity", "options", "ctx", "nextVersion", "updates", "timestamp", "newVersion", "isClusterContext", "check", "subscribedContext", "domainUri", "recipient", "requestId", "peerId", "contextId", "data", "outgoing", "contextAdded", "creatorId", "ctxId", "ctxName", "contextDestroyed", "reason", "message", "contextCreated", "contextUpdated", "updaterId", "delta", "contextNotAuthorized", "domainUri", "contextBadLifetime", "contextDestroyedExplicitly", "reason", "contextDestroyedPeerLeft", "failure", "import_immer", "peerToAddress", "nodeId", "peerId", "nodeToAddress", "init_logger", "import_immer", "contexts", "state", "init_utilities", "shouldUpdate", "request", "context", "requestVersion", "contextVersion", "canWrite", "peer", "isExplicit", "lifetime", "check", "checkCanDestroy", "domainUri", "throwReason", "contextNotAuthorized", "owned", "canRead", "canAnnounce", "isLocalPeer", "checkCanRead", "checkCanCreate", "isLocal", "isClusterContext", "remoteUnsubscribe", "state", "source", "peerId", "name", "byIdThrows", "contextByName", "removePeerFromContext", "logger", "e", "localUnsubscribe", "requestId", "contextId", "contextByIdThrows", "ns", "ms", "success", "message", "broadcast", "peerToAddress", "nodeId", "error", "exceptionToReason", "failure", "forwardUnsubscribe", "isRemoteSource", "announceContexts", "contexts", "ctx", "creatorId", "ctxId", "ctxName", "contextAdded", "peerToDomainUri", "globalDomainUri", "contextDomainUri", "update", "updaterId", "delta", "version", "updatedState", "applyDelta", "member", "byId", "some", "contextUpdated", "remoteUpdate", "localUpdate", "nextVersion", "threadStateAndActions", "s", "forwardUpdate", "requestToContext", "creator", "options", "data", "requestedLifetime", "rp", "wp", "newIds", "newVersion", "toCtx", "draft", "addContext", "subscribe", "sender", "addContextMember", "subscribedContext", "remoteSubscribe", "localSubscribe", "forwardSubscribe", "broadcastAdded", "visiblePeers", "broadcastDestroyed", "peers", "reason", "contextDestroyed", "preprocess", "parse", "contextBadLifetime", "result", "remoteCreate", "byIdInDomainThrows", "existingContext", "processed", "newState", "getLogger", "localCreate", "_type", "messages", "contextCreated", "forwardCreate", "isOrphaned", "destroy", "members", "removeContext", "peersInDomain", "p", "a", "b", "remoteDestroy", "contextDestroyedExplicitly", "localDestroy", "forwardDestroy", "removePeerFromContexts", "c", "nms", "updatedCtx", "removeContextMember", "contextDestroyedPeerLeft", "removePeer", "leavingPeer", "isSourceRemoved", "leaveDomain", "m", "compatibilityModeFilter", "msg", "destinationPeer", "handleHello", "state", "source", "request", "authenticators", "handler", "requestId", "remoteIdentity", "authentication", "options", "requestedProvider", "authenticator", "authenticationRequest", "msg", "type", "err", "log", "exceptionMessage", "exceptionData", "m", "error", "globalDomainUri", "reason", "globalAuthenticationFailure", "remoteJoin", "peerId", "identity", "destinationDomain", "domainForUri", "ensurePeerWithId", "localJoin", "domainUri", "peer", "byId", "body", "globalInvalidDomain", "globalInvalidPeer", "forwardJoin", "isRemoteSource", "contextCompatibility", "remoteLeave", "localLeave", "forwardLeave", "getLogger", "sourceRemoved", "command", "nodeId", "newState", "msgs", "bySource", "p", "removePeer", "isLocalSource", "broadcast", "peerToAddress", "resolveQMarks", "key", "unresolved", "resolved", "impersonate", "impersonateIdentity", "user", "authenticationFailed", "checkExisting", "existingId", "byIdentity", "existing", "ExceptionInfo", "globalAlreadySeen", "authenticated", "settings", "login", "impersonatePeer", "gwRequest", "accessToken", "removeGatewayRequest", "resolvedIdentity", "machine", "ids", "instance", "instanceId", "checkIdentity", "id", "welcomeOptions", "availableDomains", "domain", "sendWelcome", "welcome", "threadStateAndActions", "s", "contextDomainUri", "e", "messages", "data", "ping", "exceptionToReason", "failure", "forwardUpdate", "forwardCreate", "forwardDestroy", "forwardSubscribe", "forwardUnsubscribe", "handleRequest", "request_id", "peer_id", "byIdThrows", "token", "forAuthentication", "exceptionInfo", "message", "globalUnhandledMessage", "handleMessage", "GlobalDomain", "globalDomain", "init_logger", "authenticateSecret", "authentication", "login", "secret", "exceptionInfo", "gatewayToken", "isGatewayTokenAuthentication", "isGatewayClientAuthentication", "AsyncSerializer", "bufferSize", "action", "resolve", "reject", "msg", "result", "error", "init_utilities", "handleGwTokenAuthentication", "signatureKey", "token", "gwToken", "convertToken", "gwRequest", "impersonatePeer", "user", "handleGwClientAuthentication", "clientAuth", "authentication", "remoteIdentity", "requestId", "logger", "getLogger", "DefaultAuthenticator", "timeout", "maxPendingRequests", "processor", "AsyncSerializer", "authenticationRequest", "gatewayToken", "isGatewayClientAuthentication", "timeoutId", "resolve", "reject", "sanitizerOf", "defaultConfig", "authenticator", "config", "impl", "v", "err", "init_logger", "log", "getLogger", "authenticate", "authentication", "secret", "ttl", "secretVerifier", "exceptionInfo", "response", "authenticateSecret", "accessToken", "sign", "token", "user", "unsign", "e", "exceptionMessage", "msg", "BasicAuthenticator", "authenticationRequest", "authenticator", "config", "randomId", "import_jwt", "Oauth2Authenticator", "#jwtVerifier", "config", "fetchFn", "authenticationRequest", "method", "accessToken", "payload", "e", "authenticator", "CustomAuthenticator", "authFn", "authenticationRequest", "authenticator", "config", "agmDomainUri", "agmFailure", "agmUnhandledMessage", "agmUnregistrationFailure", "agmInvocationFailure", "agmSubscriptionFailure", "agmInvalidSubscription", "reasonPeerRemoved", "reason", "reasonMethodRemoved", "reasonBadDrop", "methodsAddedMsg", "toPeerId", "serverId", "methods", "sourceType", "agmDomainUri", "methodsAdded", "recipient", "outgoing", "register", "requestId", "methodsRemovedMsg", "peerId", "methodIds", "methodsRemoved", "fromPeerId", "invokeMsg", "invocationId", "methodId", "callerId", "args", "argsKv", "ctx", "invoke", "resultMsg", "results", "result", "addInterestMsg", "subscriptionId", "subscriberId", "flags", "addInterest", "removeInterestMsg", "reason", "removeInterest", "subscribedMsg", "subscribed", "eventMsg", "isOob", "sqn", "isSnapshot", "data", "event", "subscriptionCancelledMsg", "subscriptionCancelled", "init_utilities", "isClusterMethod", "peer", "parsedRestrictions", "check", "validate", "caller", "callee", "request", "serverId", "methodId", "args", "argsKv", "isPeerVisible", "throwReason", "agmInvocationFailure", "init_logger", "import_immer", "cancelSubscriptionsFrom", "state", "subscriptionId", "subscription", "subscriberId", "reason", "serverId", "streamId", "methodId", "peer", "byIdThrows", "removeInterestAndStream", "setPeer", "isLocalPeer", "removeInterest", "cancelSubscriptions", "subscriber", "subscriptions", "newState", "messages", "s", "m", "ns", "nm", "collectSubscriptions", "methodIds", "result", "subId", "sub", "cancelInterest", "server", "removed", "remaining", "stateWithoutInterests", "updatePeer", "p", "isLocalSource", "k", "subscriptionCancelled", "addInterest", "caller", "request", "peerId", "args", "argsKv", "context", "flags", "callee", "byId", "c", "calleeSrc", "method", "unicast", "peerToAddress", "nodeId", "nodeToAddress", "exceptionInfo", "subscribe", "requestId", "byIdInDomainThrows", "draft", "validate", "message", "localSubscribe", "source", "newIds", "remoteSubscribe", "forwardSubscribe", "dropSubscription", "ctx", "isError", "subSrc", "d", "error", "agmDomainUri", "log", "getLogger", "subscribed", "accepted", "throwReason", "agmInvalidSubscription", "interest", "domain", "remoteAccepted", "byIdInDomain", "agmSubscriptionFailure", "localAccepted", "subscription_id", "forwardAccepted", "dropInterest", "subscriberSrc", "requestToReason", "reasonBadDrop", "serverSrc", "unsubscribe", "remoteUnsubscribe", "localUnsubscribe", "success", "forwardUnsubscribe", "forwardPublish", "sqn", "isSnapshot", "data", "destinations", "remotes", "subSource", "msgs", "event", "node", "forwardPost", "recipient", "import_immer", "methodToMap", "method", "parsedRestrictions", "parse", "mapToMethod", "m", "isVisible", "provider", "consumer", "restrictions", "check", "registerWithConsumer", "state", "methods", "providerId", "consumerId", "existingMethods", "remote", "mthds", "r", "ms", "v", "rd", "cd", "setPeer", "isLocalPeer", "methodsAdded", "register", "translatedMethods", "p", "updatedState", "visiblePeers", "actions", "nextState", "nextActions", "remoteRegister", "source", "request", "peerId", "peer", "byIdInDomain", "remoteMethodsFilter", "defaultRestrictions", "isClusterMethod", "localRegister", "options", "requestId", "byIdInDomainThrows", "newState", "success", "agmDomainUri", "isClusterPeer", "remoteMethods", "broadcast", "peerToAddress", "nodeId", "forwardRegister", "isRemoteSource", "removeMethodsFromConsumer", "methodIds", "updatePeer", "c", "domain", "removedIds", "rids", "mid", "d", "byIdThrows", "messages", "cancelInterest", "reasonMethodRemoved", "methodsRemoved", "unregister", "updatedPeer", "ensureDomain", "throwReason", "agmUnregistrationFailure", "ns", "nm", "remoteUnregister", "localUnregister", "forwardUnregister", "init_logger", "import_immer", "invoke", "state", "request", "callee", "requestId", "peerId", "serverId", "invocationId", "methodId", "args", "argsKv", "context", "c", "d", "isRemoteCallee", "isLocalPeer", "setPeer", "unicast", "peerToAddress", "nodeId", "nodeToAddress", "agmDomainUri", "call", "caller", "remoteCall", "source", "byIdInDomain", "byIdInDomainThrows", "localCall", "newIds", "validate", "forwardCall", "isRemoteSource", "cancelInvocations", "receiver", "calleeId", "removed", "remaining", "removedAgg", "remainingAgg", "errorFn", "error", "reason", "agmInvocationFailure", "updatePeer", "p", "domain", "agg", "a", "completeCall", "invocation", "successFailure", "callerId", "byId", "method", "success", "failure", "result", "requestToReason", "completeInvocation", "completeYield", "remoteYield", "localYield", "forwardYield", "isLocalSource", "log", "getLogger", "addPeer", "state", "receiver", "newPeer", "existingPeer", "existingIdentity", "existingId", "existingMethods", "newPeerId", "local", "isLocalPeer", "existingLocal", "actions", "peerAdded", "agmDomainUri", "action", "registerWithConsumer", "announcePeer", "peerId", "peer", "byIdInDomainThrows", "visiblePeers", "s", "el", "newState", "moreActions", "byId", "join", "source", "identity", "parsedRestrictions", "joinDomain", "remoteJoin", "request", "peerIdentity", "restrictions", "inDomain", "localJoin", "options", "requestId", "success", "parse", "isClusterPeer", "joinMessage", "broadcast", "peerToAddress", "nodeId", "forwardJoin", "isRemoteSource", "detachPeer", "fromPeerId", "reason", "fromPeer", "byIdThrows", "recipient", "msgs", "threadStateAndActions", "cancelInvocations", "cancelInterest", "reasonPeerRemoved", "removeMethodsFromConsumer", "isLocalSource", "peerRemoved", "removePeer", "messages", "m", "fromId", "ns", "nm", "cancelSubscriptions", "leaveDomain", "remoteLeave", "byIdInDomain", "requestToReason", "localLeave", "leave", "sourceRemoved", "affected", "bySourceInDomain", "stateWithoutAffected", "p", "r", "handleError", "response", "completeInvocation", "dropInterest", "handleRequest", "forwardRegister", "forwardUnregister", "forwardCall", "forwardYield", "forwardSubscribe", "forwardUnsubscribe", "forwardAccepted", "forwardPublish", "forwardPost", "error", "agmUnhandledMessage", "AgmDomain", "body", "e", "exceptionToReason", "agmFailure", "peersInDomain", "methods", "remoteMethodsFilter", "register", "msg", "unicast", "agmDomain", "activityDomainUri", "failure", "activityRegistrationFailure", "activityMissingFactory", "activityFactoryAlreadyRegistered", "activityOwnerCreationFailed", "activityMissingActivityType", "activityInvalid", "activityIsChild", "activityInvalidPeer", "activityNotAuthorized", "activityUnhandledMessage", "reasonPeerRemoved", "reason", "reasonActivityDestroyed", "init_logger", "activityDomain", "import_immer", "import_immer", "init_utilities", "addFactories", "state", "factoryTypes", "peerId", "s", "ft", "d", "removeFactories", "draft", "removev", "factories", "factoriesByType", "peerType", "activity", "activityId", "setActivity", "removeActivity", "activities", "activityTypes", "user", "addActivityTypes", "types", "type", "removeActivityTypes", "typesNames", "typeName", "activitySubscribers", "activityType", "result", "addActivitySubscriber", "removeActivitySubscriber", "activityThrows", "a", "throwReason", "activityInvalid", "activityMaybeThrows", "import_immer", "init_logger", "import_immer", "peerFactoriesAddedMsg", "peerId", "ownerId", "factories", "activityDomainUri", "peerFactoriesAdded", "recipient", "outgoing", "peerFactoriesRemovedMsg", "factoryIds", "peerFactoriesRemoved", "peerRequestedMsg", "requestId", "factoryId", "token", "configuration", "activityRq", "peerRequested", "disposePeer", "requestorId", "reason", "message", "peerCreatedMsg", "createdId", "peerCreated", "activityTypesAdded", "types", "activityTypesRemoved", "activityInitiated", "activityId", "filterContext", "children", "acc", "k", "c", "draft", "peerInfo", "state", "p", "byId", "joinedActivityMsg", "peer", "activity", "contextSnapshot", "peerName", "peerType", "msg", "joinedActivity", "activityJoinedMsg", "joinedPeer", "activityJoined", "activityCreatedMsg", "activityCreated", "activityLeft", "leftId", "ownerChangedMsg", "owner", "ownerChanged", "success", "error", "context", "activity", "requestId", "activityPeer", "isActivityOwner", "request", "factory", "requestId", "peerType", "peerName", "clientRequest", "request", "import_immer", "init_utilities", "addFactories", "state", "peer", "factories", "factoriesByType", "grouped", "f", "setPeer", "draft", "activityDomain", "ft", "fs", "broadcastFactoriesAdded", "owner", "visiblePeers", "peerFactoriesAdded", "announceExisting", "peerId", "byIdInDomain", "p", "isPeerVisible", "factoryPeer", "some", "validateFactory", "factory", "peerType", "throwReason", "activityFactoryAlreadyRegistered", "add", "source", "request", "requestId", "byIdInDomainThrows", "updatedState", "messages", "success", "activityDomainUri", "broadcastRemoved", "factoryIds", "includeOwner", "ownerId", "peerFactoriesRemoved", "factoryById", "id", "removeFactoriesFromPeer", "updatedPeer", "removed", "factoryId", "removeFactories", "r", "requestPeer", "configuration", "token", "activity", "context", "peerName", "activityRequest", "peerRequested", "peerReady", "clientRequest", "activityInvalidPeer", "callerId", "caller", "byId", "peerCreated", "removePeer", "createPeerFailed", "failure", "creator", "error", "handleCreatePeerError", "incomingR", "gatewayR", "factoryOwner", "activityMissingFactory", "createActivityPeer", "creatorId", "activityPeer", "isActivityOwner", "byIdThrows", "newIds", "gwRequestId", "gwRequest", "forRequest", "setGatewayRequest", "createPeer", "factoryOwnerId", "contextById", "create", "activityId", "activityMaybeThrows", "result", "log", "getLogger", "requestToActivity", "state", "request", "peer", "idsAfterContext", "ctxId", "contextId", "rp", "parse", "wp", "context", "toCtx", "newVersion", "idsAfterActivity", "actId", "activityId", "activity", "activityMemberJoined", "gwRequest", "peerId", "isOwner", "contextById", "setActivity", "draft", "setPeer", "addContextMember", "broadcastAddTypes", "user", "types", "peersInDomain", "activityDomain", "activityTypesAdded", "broadcastRemoveTypes", "activityTypesRemoved", "addTypes", "source", "requestId", "byIdInDomainThrows", "messages", "success", "addActivityTypes", "error", "reason", "activityRegistrationFailure", "removeTypes", "typeNames", "actualTypes", "activityTypes", "typeName", "removeActivityTypes", "announceTypes", "userTypes", "activityTypeThrows", "at", "throwReason", "activityMissingActivityType", "mergeConfig", "activityPeer", "configuration", "baseConfiguration", "createOwner", "ctx", "ownerType", "creatorId", "createActivityPeer", "createParticipants", "helperTypes", "xxx", "peerType", "createActivity", "cfg", "activityTypeName", "activityType", "a", "c", "key", "typesOverride", "activityIsChild", "activityInitiated", "args", "addContext", "broadcastOwnerChanged", "owner", "ownerId", "broadcastTargets", "t", "ownerChanged", "ownerReady", "contextData", "isReloading", "joinedActivity", "broadcastJoinedActivity", "broadcastActivityCreated", "seesActivity", "isPeerVisibleIdentity", "broadcastActivityJoined", "p", "activityJoined", "broadcastActivityLeft", "includeParticipants", "byIdThrows", "activityLeft", "canDestroy", "byId", "readyMembers", "activityParticipants", "result", "ids", "activitySubscribers", "id", "activityCreated", "participantReady", "cleanDomainInfo", "peerReady", "s", "m", "disposePeer", "reasonActivityDestroyed", "destroyParticipants", "participantIds", "pid", "participant", "removeGatewayRequests", "removeGatewayRequest", "cleanupActivity", "removeActivity", "removeContext", "destroyActivity", "clientRequest", "threadStateAndActions", "requester", "forwardDestroyActivity", "activityThrows", "requestToReason", "activityNotAuthorized", "ownerFailed", "activityInfo", "activityOwnerCreationFailed", "handleError", "joinParticipant", "joinActivity", "targetId", "peerName", "targetPeer", "memberId", "existingActivity", "nextState", "removeParticipant", "participantLeft", "removeContextMember", "ownerLeft", "shouldDestroy", "removePeer", "subscribeUnsubscribe", "actionFn", "currentState", "subscribe", "addActivitySubscriber", "readyActivities", "activities", "unsubscribe", "removeActivitySubscriber", "log", "getLogger", "handleError", "state", "source", "request", "stateWithoutR", "gatewayR", "removeGatewayRequest", "type", "activity", "handleCreatePeerError", "requestToReason", "joinGwRequest", "peer", "creationRequest", "peerName", "peerType", "d", "activityMemberJoined", "setPeer", "forwardJoin", "requestId", "peerId", "restrictions", "inDomain", "activityDomain", "success", "activityDomainUri", "parsedRestrictions", "parse", "joinDomain", "byIdInDomainThrows", "messages", "announcePeer", "announceTypes", "announceExisting", "removePeer", "reason", "isSourceRemoved", "threadStateAndActions", "s", "leaveDomain", "forwardLeave", "ready", "byIdThrows", "activityId", "peerReady", "sourceRemoved", "affected", "bySourceInDomain", "stateWithoutAffected", "p", "r", "m", "ns", "nm", "reasonPeerRemoved", "handleRequest", "types", "addTypes", "removeTypes", "configuration", "rq", "createActivity", "forwardDestroyActivity", "subscribe", "unsubscribe", "joinActivity", "add", "removeFactories", "create", "forwardUpdate", "error", "activityUnhandledMessage", "ActivityDomain", "body", "e", "isLocalSource", "exceptionToReason", "failure", "init_logger", "metricsDomainUri", "metricsFailure", "metricsUnhandledMessage", "metricsBadIdentity", "reasonPeerRemoved", "reason", "metricsDomain", "import_immer", "init_filters", "log", "getLogger", "REQUIRED_PROPERTIES", "checkIdentity", "repoIdentity", "missing", "key", "throwReason", "metricsBadIdentity", "defaultRepositoryId", "source", "peerIdentity", "joinPeer", "state", "request", "requestId", "peerId", "options", "repoId", "inDomain", "metricsDomain", "success", "metricsDomainUri", "joinDomain", "s", "peer", "removePeer", "reason", "repositories", "r", "leaveDomain", "leave", "byIdThrows", "requestToReason", "ensureRepositories", "factories", "nextState", "draft", "domain", "f", "repository", "defineMetrics", "filters", "ms", "byIdInDomainThrows", "definitions", "m", "isAllowed", "d", "newState", "publishMetrics", "vs", "values", "v", "sourceRemoved", "bySourceInDomain", "p", "reasonPeerRemoved", "handleRequest", "error", "metricsUnhandledMessage", "MetricsDomain", "peersInDomain", "msg", "body", "e", "isLocalSource", "exceptionToReason", "metricsFailure", "init_common", "init_publisher", "wrap", "conf", "basicRepositoryFactory", "basicPublisher", "data", "conflateRepo", "init_utilities", "init_logger", "import_immer", "log", "getLogger", "publisher", "type", "config", "restRepositoryFactory", "fileRepositoryFactory", "metrics", "endpoint", "c", "f", "conf", "draft", "wrap", "e", "rs", "some", "init_logger", "contextDomain", "contextDomainUri", "failure", "reasonPeerRemoved", "reason", "createContext", "requestId", "peerId", "name", "data", "lifetime", "readPermissions", "writePermissions", "version", "contextDomainUri", "subscribe", "context", "log", "getLogger", "contextToRequest", "peerId", "ctx", "createContext", "announceJoinedPeer", "state", "receiver", "wasInCompat", "peer", "byIdInDomainThrows", "announceMessages", "announcePeer", "contextDomainUri", "m", "compatibilityModeFilter", "contextMessages", "announceContexts", "peerToDomainUri", "join", "source", "peerIdentity", "restrictions", "nextState", "joinDomain", "contextDomain", "updatePeer", "draft", "localJoin", "request", "requestId", "contextCompatMode", "byId", "alreadyHere", "inDomain", "success", "parsedRestrictions", "parse", "msgs", "messages", "isClusterPeer", "message", "globalDomainUri", "broadcast", "peerToAddress", "nodeId", "remoteJoin", "forwardJoin", "isRemoteSource", "remoteLeave", "byIdInDomain", "removePeer", "requestToReason", "localLeave", "newState", "msg", "forwardLeave", "sendState", "joinMessages", "peersInDomain", "isLocalSource", "unicast", "createMessages", "contexts", "isClusterContext", "members", "creates", "subscribes", "member", "subscribe", "sourceRemoved", "affected", "bySourceInDomain", "stateWithoutAffected", "p", "s", "leaveDomain", "leaveRequest", "reasonPeerRemoved", "r", "ms", "ns", "nms", "bs", "handleRequest", "options", "forwardCreate", "forwardUpdate", "forwardSubscribe", "forwardUnsubscribe", "forwardDestroy", "error", "metricsDomainUri", "reason", "metricsUnhandledMessage", "ContextDomain", "body", "e", "exceptionToReason", "metricsFailure", "init_logger", "failure", "busUnhandledMessage", "import_immer", "event", "recipient", "subscriberId", "subscriptionId", "publisherIdentity", "data", "outgoing", "subscribed", "requestId", "log", "getLogger", "remoteJoin", "state", "source", "request", "peerId", "restrictions", "inDomain", "joinDomain", "localJoin", "options", "requestId", "success", "parsedRestrictions", "parse", "peer", "byIdInDomainThrows", "messages", "isClusterPeer", "message", "broadcast", "peerToAddress", "nodeId", "forwardJoin", "isRemoteSource", "sourceRemoved", "bySourceInDomain", "s", "p", "leaveDomain", "remoteLeave", "byId", "localLeave", "newState", "forwardLeave", "zipPeerSubscriptions", "peers", "entries", "id", "subscription", "matchesTopic", "subTopic", "subPattern", "topic", "match", "matchesRouting", "subKey", "key", "matchesSubscription", "routingKey", "matchesTarget", "target", "peerIdentity", "k", "v", "publish", "publisher", "data", "publisherId", "matcher", "entry", "targetMatcher", "publisherIdentity", "remotes", "visiblePeers", "subscriber", "subSource", "subscriberId", "first", "msg", "isLocalSource", "event", "node", "recipient", "unicast", "localPublish", "remotePublish", "byIdInDomain", "forwardPublish", "isWildcard", "topicToPattern", "subscribe", "subscriptionId", "draft", "setPeer", "subscribed", "localSubscribe", "newIds", "remoteSubscribe", "forwardSubscribe", "unsubscribe", "localUnsubscribe", "remoteUnsubscribe", "forwardUnsubscribe", "handleRequest", "error", "reason", "busUnhandledMessage", "BusDomain", "body", "e", "exceptionData", "exceptionToReason", "failure", "receiver", "peersInDomain", "join", "busDomain", "init_logger", "log", "getLogger", "addClient", "clients", "node", "key", "source", "onScavenge", "onStop", "client", "e", "removeClient", "init_logger", "log", "getLogger", "scavengeClients", "clients", "node", "olderThan", "v", "key", "removeClient", "ex", "MIN_INACTIVE_SECONDS", "MILLIS_IN_SECOND", "Scavenger", "inactiveSeconds", "lastAccess", "GATEWAY_VERSION", "init_utilities", "isPeerAddress", "source", "isNodeAddress", "isClusterAddress", "init_logger", "init_utilities", "MeshNode", "handler", "cluster", "nodeId", "msg", "source", "log", "getLogger", "handleMessage", "state", "body", "origin", "friendlily", "handleClusterMessage", "e", "m", "error", "exceptionToReason", "failure", "sendState", "targetNodeId", "receiver", "msgs", "value", "domain", "some", "hasReceiver", "address", "isPeerAddress", "peer", "byId", "isNodeAddress", "isClusterAddress", "processResponse", "response", "localUsers", "processMessage", "newState", "responses", "newUsers", "oldUsers", "x", "added", "removed", "meshNode", "domains", "options", "registeredDomains", "buildDomains", "newNodeId", "removedNodeId", "s", "emptyState", "init_logger", "logger", "getLogger", "ConnectionStates", "InternalConnection", "codec", "maxEnqueued", "retry", "DEFAULT_RETRY", "calculateReconnectDelay", "attempt", "min", "max", "factor", "WsConnection", "#internal", "uri", "internal", "c", "wasConnecting", "data", "e", "msg", "wasOpen", "wasConnected", "reconnectDelay", "socket", "enqueue", "action", "wsConstructor", "websocket", "WsConnectionFactory", "#codec", "#retry", "#websocket", "#connections", "protocols", "websocketOverride", "WebSocketConstructor", "wsc", "connection", "websocketConnectionFactory", "opts", "json", "init_logger", "sourceToTransport", "source", "isPeerAddress", "sourceFromTransport", "peerToAddress", "toTransportMessage", "msg", "receiver", "body", "transportReceiver", "transportSource", "fromTransportMessage", "codec", "transit", "logger", "getLogger", "hasNodeAddress", "source", "publishNodePeer", "connection", "nodeId", "msg", "receiver", "body", "publish", "receiverType", "transportMessage", "toTransportMessage", "WebsocketBrokerMesh", "ch", "domains", "callbacks", "randomId", "message", "added", "removed", "handleRegister", "nodes", "handleUnregister", "handlePublish", "handleConnected", "handleDisconnected", "remote", "removedId", "cb", "handleNodeAdded", "newNodeId", "handleNodeRemoved", "removedNodeId", "handleData", "dest", "from", "fromTransportMessage", "handle", "websocketBrokerMesh", "endpoint", "websocket", "websocketConnectionFactory", "codec", "handler", "init_logger", "ensureConnection", "from", "to", "connected", "relayConnection", "k", "c", "connection", "cmd", "processMessage", "callbacks", "msg", "data", "createRelay", "factory", "endpoint", "nodes", "node", "logger", "getLogger", "publishNodePeer", "msg", "from", "node", "receiver", "body", "to", "nodeConnection", "publishMessage", "receiverType", "transportMessage", "toTransportMessage", "connection", "closeConnections", "connections", "directoryConnectNodes", "handler", "connectionFactory", "uri", "directoryDisconnectNodes", "WebSocketCluster", "localNodes", "server", "directory", "endpointUri", "nodeId", "domains", "callbacks", "randomId", "endpoint", "m", "data", "message", "added", "removed", "handleConnectingNodes", "handleDisconnectingNodes", "handleNodeConnected", "cb", "handleNodeDisconnected", "handleNodeData", "localNode", "fromTransportMessage", "websocketCluster", "config", "websocket", "key", "value", "factory", "websocketConnectionFactory", "codec", "createRelay", "init_logger", "logger", "getLogger", "fireCallbacks", "nodeId", "callbacks", "toAdd", "toRemove", "dcb", "t", "ccb", "RestDirectory", "handler", "localNodes", "announceInterval", "task", "maybeAnnounceNodes", "endpointUri", "added", "removed", "removeNode", "fetchFn", "directoryUri", "node", "err", "parseAnnounceResponse", "response", "processResponse", "n", "r", "localNode", "connected", "proposed", "c", "data", "v", "announceNodes", "nodes", "body", "processCommand", "cmd", "endpoint", "user", "handle", "msg", "restDirectory", "config", "init_filters", "defaultPeerRestrictions", "domain", "rules", "rule", "defaultRestrictions", "key", "rs", "compile", "name", "matches", "result", "regexify", "k", "v", "identity", "rv", "valueMatches", "StaticDirectory", "members", "nodeId", "endpointUri", "callbacks", "connectCallback", "memberId", "e", "removed", "disconnectCallback", "staticDirectory", "map", "idx", "log", "getLogger", "authenticators", "config", "globals", "available", "a", "k", "authenticator", "authConfig", "authFn", "configWithoutAuthenticator", "createWebSocketCluster", "endpoint", "relays", "directory", "clusterUri", "relaysUri", "websocketCluster", "staticDirectory", "announceUri", "announceInterval", "restDirectory", "gatewayNode", "domains", "nodeId", "signingKey", "mesh", "clusterConfig", "cluster", "meshNode", "websocketBrokerMesh", "localNode", "codec", "direct", "DEFAULT_CLIENT_BUFFER_SIZE", "INFO_DESCRIPTION", "INFO", "GATEWAY_VERSION", "Gateway", "#gateway", "#config", "configuration", "environment", "auth", "configuredContextLifetime", "contextPeerRestrictions", "defaultPeerRestrictions", "contextOptions", "defaultRestrictions", "factories", "metrics", "agmPeerRestrictions", "globalDomain", "contextDomain", "agmDomain", "activityDomain", "busDomain", "metricsDomain", "node", "clients", "scavenger", "Scavenger", "cfg", "sanitizerOf", "gateway", "c", "f", "handler", "gw", "bufferSize", "key", "GatewayClient", "opts", "receive", "msg", "source", "m", "e", "onDisconnect", "addClient", "removeClient", "message", "client", "lastAccess", "ex", "Factory", "index_default", "Factory"]
}
