{"version":3,"sources":["supranet.ts"],"sourcesContent":["\n/**\n ╔══════════════════════════════════════════════════════════════════════════════════════╗\n ║  unyt.org Supranet connection handler                                                ║\n ╠══════════════════════════════════════════════════════════════════════════════════════╣\n ║  Visit https://docs.unyt.org/manual/datex/supranet-networking for more information   ║\n ╠═════════════════════════════════════════╦════════════════════════════════════════════╣\n ║  © 2024 unyt.org                        ║                                            ║\n ╚═════════════════════════════════════════╩════════════════════════════════════════════╝\n */\n\nimport { Runtime } from \"../runtime/runtime.ts\";\nimport { Crypto } from \"../runtime/crypto.ts\";\n\nimport {client_type} from \"../utils/constants.ts\";\nimport { Endpoint } from \"../types/addressing.ts\";\nimport { Logger } from \"../utils/logger.ts\";\nimport { endpoint_config } from \"../runtime/endpoint_config.ts\";\nimport { endpoint_name, UnresolvedEndpointProperty } from \"../datex_all.ts\";\nimport { Datex } from \"../mod.ts\";\nimport { Storage } from \"../storage/storage.ts\";\nimport { WebSocketClientInterface } from \"./communication-interfaces/websocket-client-interface.ts\";\nimport { communicationHub } from \"./communication-hub.ts\";\nimport { getCookie } from \"../utils/cookies.ts\";\nimport { reset } from \"../runtime/reset.ts\";\n\nconst logger = new Logger(\"DATEX Supranet\");\n\nexport class Supranet {\n\n    static available_channel_types:string[] = []; // all available interface channel types, sorted by preference\n\n    static #connected = false;\n    static get connected(){return this.#connected}\n\n    static #initialized = false;\n    static get initialized(){return this.#initialized}\n\n    /**\n     * Runs Supranet.connect.\n     * If 'connect' is set to false in the endpoint config, Supranet.init is called instead\n     */\n    public static start() {\n        if (endpoint_config.connect) return this.connect();\n        else return this.init();\n    }\n\n\n    // connect without cache and random endpoint id\n    public static connectAnonymous(){\n        return this.connect(undefined, false);\n    }\n\n    // connect without cache\n    public static connectTemporary(endpoint?:Endpoint){\n        return this.connect(endpoint, false);\n    }\n\n    // connect to Supranet\n    // if local_cache=false, a new endpoint is created and not saved in the cache, even if an endpoint is stored in the cache\n    // TODO problem: using same keys as stored endpoint!\n    public static async connect(endpoint?:Endpoint|UnresolvedEndpointProperty, local_cache?: boolean, sign_keys?:[ArrayBuffer|CryptoKey,ArrayBuffer|CryptoKey], enc_keys?:[ArrayBuffer|CryptoKey,ArrayBuffer|CryptoKey], via_node?:Endpoint) {\n\n        if (this.#connected && (!endpoint || endpoint === Runtime.endpoint)) {\n            // logger.info(\"already connected as\", Runtime.endpoint);\n            return true;\n        }\n\n        const alreadyConnected = this.#connected;\n\n        // load runtime, own endpoint, nodes\n        this.#connected = false;\n        endpoint = await this.init(endpoint, local_cache, sign_keys, enc_keys)\n\n        const shouldSwitchInstance = this.shouldSwitchInstance(endpoint);\n\n        const previousInstance = Runtime.endpoint.instance_number;\n\n        // switching from potentially instance to another instance, make sure current endpoint is not an already active instance and sends HELLO/GOODBYE from here\n        if (shouldSwitchInstance && endpoint !== endpoint.main) {\n            Runtime.init(endpoint.main);\n        }\n\n        // already connected to endpoint during init\n        if (alreadyConnected && endpoint === Runtime.endpoint) {\n            if (shouldSwitchInstance) await this.handleSwitchToInstance(previousInstance)\n            logger.success(\"Connected to the supranet as \" + endpoint)\n            return true;\n        }\n\n        if (alreadyConnected) {\n            if (shouldSwitchInstance) await this.handleSwitchToInstance(previousInstance);\n            return true;\n        }\n        else {\n            const connected = await this._connect(via_node, !shouldSwitchInstance);\n            if (shouldSwitchInstance) await this.handleSwitchToInstance(previousInstance)\n            return connected;\n        }\n\n    }\n\n\n    private static shouldSwitchInstance(endpoint: Endpoint) {\n        // return false;\n        return (endpoint.main === endpoint || Runtime.getActiveLocalStorageEndpoints().includes(endpoint)) && (!!Runtime.Blockchain)\n    }\n\n    /**\n     * Finds an available instance and switches endpoint\n     * @returns true if switched to new instance (and hello sent)\n     */\n    private static async handleSwitchToInstance(previousInstance: number) {\n        if (!Runtime.Blockchain) {\n            logger.error(\"Cannot determine endpoint instance, blockchain not available\")\n        }\n        else {\n            // existing locally available endpoint instances -> hashes\n            const hashes = await Storage.loadOrCreate(\"Datex.Supranet.ENDPOINT_INSTANCE_HASHES\", () => new Map<Endpoint, string>())\n\n            try {\n                logger.debug(\"available cached instances: \" + [...hashes.keys()].map(e=>e.toString()).join(\", \"))\n            }\n            catch (e) {\n                console.error(\"invalid hashes\", hashes)\n                throw e;\n            }\n\n            const activeEndpoints = Runtime.getActiveLocalStorageEndpoints();\n            let hash: string|undefined = undefined;\n            let endpoint = Runtime.endpoint;\n            for (const [storedEndpoint, storedHash] of hashes) {\n                if (Runtime.endpoint.main == storedEndpoint.main && !activeEndpoints.includes(storedEndpoint)) {\n                    hash = storedHash;\n                    endpoint = storedEndpoint;\n                    break;\n                }\n            }\n            if (!hash) hash = Math.random().toString(36).substring(2,18);\n\n            try {\n                const newInstanceEndpoint = (await Runtime.Blockchain.getEndpointInstance(endpoint, hash, previousInstance+1))!;\n                // makes sure hash is set in cache\n                hashes.set(newInstanceEndpoint, hash);\n                // set endpoint to instace\n                Runtime.init(newInstanceEndpoint);\n                endpoint_config.endpoint = newInstanceEndpoint;\n                endpoint_config.save();\n                if (previousInstance!==null) logger.info(\"Switched to endpoint \" + newInstanceEndpoint + \" (previous instance: \" + previousInstance + \")\")\n                this.handleConnect();\n                return true;\n            }\n            catch {\n                logger.error(\"Could not determine endpoint instance (request error)\");\n                this.handleConnect();\n            }\n        }\n        \n        return false;\n    }\n\n    private static async _connect(via_node?:Endpoint, handleOnConnect = true) {\n        // find node for available channel\n        const [node, channel_type] = this.getNode(via_node)\n        const connected = await this.connectToEndpoint(node, channel_type)\n\n        if (!connected) logger.error(\"connection failed\")\n        else if (handleOnConnect) await this.handleConnect();\n\n        // validate current keys against official public keys in network \n        // TODO: (does not work because response never reaches endpoint if valid endpoint already exists in network)\n        // Crypto.validateOwnKeysAgainstNetwork();\n\n        this.#connected = connected;\n\n        return connected;\n    }\n\n    // update Supranet.connected state\n    static _setConnected(connected:boolean) {\n        this.#connected = connected;    \n    }\n\n\n    static getNode(use_node?:Endpoint) {\n        // channel types?\n        if (globalThis.WebSocketStream || client_type!=\"browser\") this.available_channel_types.push(\"websocketstream\")\n        this.available_channel_types.push(\"websocket\");\n\n        // find node for available channel\n        const [node, channel_type] = endpoint_config.getNodeWithInterfaceType(this.available_channel_types, use_node);\n        if (!node) throw (\"Cannot find a node that support any channel type of: \" + this.available_channel_types + (use_node ? \" via \" + use_node : ''));\n        if (!channel_type) throw(\"No channel type for node: \" + node);\n        return [node, channel_type] as const;\n    }\n\n\n\n\t/**\n\t * Connects to a endpoint via an available interface if a known\n\t * interface exists for the endpoint\n\t * @param endpoint endpoint to connect to\n\t * @param interfaceType optional interface type to connect with \n\t * @returns true if a connection could be established\n\t */\n\tpublic static async connectToEndpoint(endpoint: Endpoint, interfaceType?: string, setAsDefault = true): Promise<boolean> {\n\t\t\n        // check if interface is available\n        const info = endpoint.getInterfaceChannelInfo(interfaceType);\n        if (info) {\n            // websocket\n            if (interfaceType == \"websocket\") {\n                if (!(info instanceof URL || typeof info === \"string\")) {\n                    logger.error(\"Invalid data for websocket interface, expected string or URL\");\n                    return false;\n                }\n                const webSocketInterface = new WebSocketClientInterface(info instanceof URL ? info.origin : info, endpoint)\n                await communicationHub.addInterface(webSocketInterface, setAsDefault);\n                return true;\n            }\n            // TODO: more interfaces\n            else {\n                logger.error(\"Interface type not supported: \" + interfaceType);\n                return false;\n            }\n        }\n        else {\n            return false;\n        }\n\n\t}\n\n\n\n    private static handleConnect() {\n        for (const listener of this.#connectListeners) listener();\n        if (this.onConnect) this.onConnect()\n    }\n\n    // @override\n    public static onConnect = ()=>{\n        logger.success(\"Connected as **\"+Runtime.endpoint+\"** to the Supranet via **\" + communicationHub.handler.defaultSocket?.endpoint + \"** (\" + communicationHub.handler.defaultSocket?.toString() + \")\" )\n    }\n\n    static #connectListeners = new Set<()=>void>()\n    public static onConnected(listener: ()=>void) {\n        this.#connectListeners.add(listener);\n    }\n\n    // only init, don't (re)connect\n    public static async init(endpoint?:Endpoint|UnresolvedEndpointProperty|endpoint_name, local_cache?: boolean, sign_keys?:[ArrayBuffer|CryptoKey,ArrayBuffer|CryptoKey], enc_keys?:[ArrayBuffer|CryptoKey,ArrayBuffer|CryptoKey]):Promise<Endpoint>  {\n        if (typeof endpoint == \"string\") endpoint = await Endpoint.fromStringAsync(endpoint);\n\n        await endpoint_config.load(); // load config from storage/file\n\n        let keys:Crypto.ExportedKeySet|undefined;\n\n        // load/create endpoint from cache?\n        if (!endpoint) {\n            [endpoint, keys] = await this.getLocalEndpointAndKeys();\n            sign_keys = keys.sign;\n            enc_keys = keys.encrypt;\n        }\n        // first resolve endpoint, connect anonymous\n        if (endpoint instanceof UnresolvedEndpointProperty) {\n            const tmp_endpoint = <Endpoint> Endpoint.get(Endpoint.createNewID());\n            await this._init(tmp_endpoint, true, sign_keys, enc_keys, keys);\n            await this._connect();\n            const res = await endpoint.resolve(); \n            // use fallback tmp_endpoint if endpoint property is void\n\n            const verificationCode = \"macjiosdfohnfeioaDSgdb\" // TODO: generate\n            const unytAuthURL = `https://auth.unyt.org/register-sub-endpoint?id=${tmp_endpoint}&code=${verificationCode}`\n\n            if (res === undefined) {\n                logger.success `\n    Creating new endpoint ${endpoint.parent}.${endpoint.property} (${tmp_endpoint}).\n    If you have write access to ${endpoint.parent}, you can set ${endpoint.parent}.${endpoint.property} = ${tmp_endpoint}.\n    If you are the owner of ${endpoint.parent}, you can create a certificate for ${tmp_endpoint}.\n    \n    🔑 Register with unyt Auth: #color(white)${unytAuthURL}\n    `\n    // 🔑 VERIFY: ${Crypto.getOwnPublicKeysExported()[0]}\n    // 🔑 ENCRYPT: ${Crypto.getOwnPublicKeysExported()[1]}\n\n                return tmp_endpoint; // already connected to tmp_endpoint\n            }\n            else if (!(res instanceof Endpoint)) {\n                throw new Error(`could not resolve ${endpoint} to an <endpoint> value`);\n            }\n            logger.info(`resolved ${endpoint} to ${res}`);\n            endpoint = res;\n        }\n\n        return this._init(endpoint, local_cache, sign_keys, enc_keys, keys);\n    }\n\n    private static async _init(endpoint:Endpoint, local_cache = !endpoint_config.temporary, sign_keys?:[ArrayBuffer|CryptoKey,ArrayBuffer|CryptoKey], enc_keys?:[ArrayBuffer|CryptoKey,ArrayBuffer|CryptoKey], keys?:Crypto.ExportedKeySet) {\n       \n        // load/create keys, even if endpoint was provided?\n        if (!sign_keys || !enc_keys) {\n            keys = await this.getKeysOrGenerateNew();\n            sign_keys = keys.sign;\n            enc_keys = keys.encrypt;\n        }\n        else { // new keys were provided, save in storage\n            keys = {\n                sign: [\n                    sign_keys[0] instanceof ArrayBuffer ? sign_keys[0] : await Crypto.exportPublicKey(sign_keys[0]),\n                    sign_keys[1] instanceof ArrayBuffer ? sign_keys[1] : await Crypto.exportPrivateKey(sign_keys[1]),\n                ],\n                encrypt: [\n                    enc_keys[0] instanceof ArrayBuffer ? enc_keys[0] : await Crypto.exportPublicKey(enc_keys[0]),\n                    enc_keys[1] instanceof ArrayBuffer ? enc_keys[1] : await Crypto.exportPrivateKey(enc_keys[1]),\n                ]\n            }    \n        }\n\n        if (local_cache == false) endpoint_config.temporary = true;\n\n        endpoint_config.endpoint = endpoint;\n        endpoint_config.keys = keys;\n        endpoint_config.save();\n\n        // save own keys\n        await Crypto.loadOwnKeys(...sign_keys, ...enc_keys);\n\n        // start runtime + set endpoint\n        Runtime.init(endpoint);\n\n        // bind keys to initialized endpoint (already done for @@local in Crypto.loadOwnKeys)\n        Crypto.saveOwnPublicKeysInEndpointKeyMap()\n\n        this.#initialized = true;\n\n        // enable network interface\n\t    await import(\"../network/network-interface.ts\");\n\n        // enable DATEX inspector request interface\n        await import(\"../network/debugging/request-datex-inspector.ts\");\n\n        return endpoint;\n    }\n\n\n    // load stuff ...\n\n\n    public static async getLocalEndpointAndKeys():Promise<[Endpoint, Crypto.ExportedKeySet]> {\n        let endpoint: Endpoint|undefined;\n\n        if (client_type == \"browser\") {\n            // if endpoint cookie does not match the local endpoint, we clear the config and create a new one\n            const didEndpointChange = endpoint_config?.endpoint?.main && Endpoint.getFromCookie()?.main !== endpoint_config.endpoint.main;\n            \n            // if endpoint has already had a session or validation but lost the keys due to localStorage.clear we also request a new endpoint & key pairs\n            // We have to purge everything in this case to avoid duplicate endpoint creation due to existing session\n            const hasLostKeys = getCookie(\"datex-endpoint-validation\") && !endpoint_config.keys;\n            if (hasLostKeys)\n                reset();\n            else if (didEndpointChange)\n                endpoint_config.clear();\n\n        }\n\n        // create new endpoint\n        if (!endpoint_config.endpoint) endpoint = await this.createAndSaveNewEndpoint();\n        // existing endpoint already in cache\n        else {\n            try {endpoint = val(endpoint_config.endpoint);}\n            catch {\n                logger.error(\"Error getting Config Value 'endpoint'\");\n                endpoint = await this.createAndSaveNewEndpoint();\n            }\n        }\n\n        // implicitly create new anonymous endpoint, if set to @@local\n        if (endpoint == Datex.LOCAL_ENDPOINT) endpoint = undefined;\n\n        if (!(endpoint instanceof Endpoint)) {\n            if (endpoint !== undefined) logger.error(\"Config Value 'endpoint' is not of type <Endpoint>\", endpoint);\n            endpoint = await this.createAndSaveNewEndpoint();\n        } \n   \n        // return endpoint + keys\n        return [endpoint, await this.getKeysOrGenerateNew()];\n    }\n\n    /**\n     * Create new anonymous endpoint or load from \"datex-endpoint\" cookie + \"new_keys\" entry\n     */\n    private static createAndSaveNewEndpoint() {\n        const endpoint = Endpoint.getFromCookie() ?? Endpoint.getNewEndpoint();\n        endpoint_config.endpoint = endpoint;\n        endpoint_config.save();\n        return endpoint;\n    }\n\n    private static async getKeysOrGenerateNew(): Promise<Crypto.ExportedKeySet>{\n        // get existing sign + enc keys\n        let keys = endpoint_config.keys;\n        // invalid, create new\n        if (!keys || !keys.sign?.[0] || !keys.sign?.[1] || !keys.encrypt?.[0] || !keys.encrypt?.[1]) {\n            // logger.info(\"creating new keys\");\n            keys = await Crypto.createOwnKeys();\n        }\n\n        return keys;\n    }\n    \n}"],"names":["Runtime","Crypto","client_type","Endpoint","Logger","endpoint_config","UnresolvedEndpointProperty","Datex","Storage","WebSocketClientInterface","communicationHub","getCookie","reset","logger","Supranet","available_channel_types","connected","initialized","start","connect","init","connectAnonymous","undefined","connectTemporary","endpoint","local_cache","sign_keys","enc_keys","via_node","alreadyConnected","shouldSwitchInstance","previousInstance","instance_number","main","handleSwitchToInstance","success","_connect","getActiveLocalStorageEndpoints","includes","Blockchain","hash","hashes","loadOrCreate","Map","debug","keys","map","e","toString","join","console","error","activeEndpoints","storedEndpoint","storedHash","Math","random","substring","newInstanceEndpoint","getEndpointInstance","set","save","info","handleConnect","handleOnConnect","node","channel_type","getNode","connectToEndpoint","_setConnected","use_node","globalThis","WebSocketStream","push","getNodeWithInterfaceType","interfaceType","setAsDefault","getInterfaceChannelInfo","URL","webSocketInterface","origin","addInterface","listener","onConnect","handler","defaultSocket","Set","onConnected","add","fromStringAsync","load","getLocalEndpointAndKeys","sign","encrypt","tmp_endpoint","get","createNewID","_init","res","resolve","unytAuthURL","parent","property","Error","temporary","ArrayBuffer","exportPublicKey","exportPrivateKey","getKeysOrGenerateNew","loadOwnKeys","saveOwnPublicKeysInEndpointKeyMap","didEndpointChange","getFromCookie","clear","val","createAndSaveNewEndpoint","LOCAL_ENDPOINT","getNewEndpoint","createOwnKeys"],"mappings":"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","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/network/","file":"supranet.ts"}