{"version":3,"sources":["server.ts"],"sourcesContent":["/*******************************************************************************************\n * ╔══════════════════════════════════════════════════════════════════════════════════════╗ *\n * ║ UNYT - # - WebServer                                                                 ║ *\n * ╠══════════════════════════════════════════════════════════════════════════════════════╣ *\n * ║ General Web server                                                                   ║ *\n * ║                                                                                      ║ *\n * ╠═════════════════════════════════════════╦════════════════════════════════════════════╣ *\n * ║  © 2020 Jonas & Benedikt Strehle        ║ ██████████████████████████████████████████ ║ *\n * ╚═════════════════════════════════════════╩════════════════════════════════════════════╝ *\n *******************************************************************************************/\n\n\n/** Imports **/\n\n// ---\nimport { Datex } from \"datex-core-legacy\";\nimport { getCallerDir } from \"datex-core-legacy/utils/caller_metadata.ts\";\nimport { Cookie, setCookie } from \"../lib/cookie/cookie.ts\";\n\nimport { Path } from \"datex-core-legacy/utils/path.ts\";\nimport { Transpiler } from \"./transpiler.ts\";\nimport { addCSSScope, addCSSScopeSelector } from \"../utils/css-scoping.ts\";\nimport { getEternalModule } from \"../app/eternal-module-generator.ts\";\nimport { highlightText } from 'https://cdn.jsdelivr.net/npm/@speed-highlight/core@1.2.24/+esm'\nimport {serveFile} from \"https://deno.land/std@0.164.0/http/file_server.ts\"\nimport { cache_path } from \"datex-core-legacy/runtime/cache_path.ts\";\nimport { eternalExts } from \"../app/module-mapping.ts\";\nimport { getDirType } from \"../app/utils.ts\";\nimport { app } from \"../app/app.ts\";\nimport { deleteCookie, getCookie, setCookie as setCookieUIX } from \"../session/cookies.ts\";\nimport { arrayBufferToBase64, base64ToArrayBuffer } from \"datex-core-legacy/utils/utils.ts\";\nimport { Crypto } from \"datex-core-legacy/runtime/crypto.ts\";\nimport { Target } from \"datex-core-legacy/datex_all.ts\";\nimport { createSession, validateUnverifiedSession, validateVerifiedSession, unverifiedSessionExists } from \"../session/backend.ts\";\nimport { isSafariClient } from \"../utils/safari.ts\";\nimport {SourceMapConsumer} from \"npm:source-map@0.7.6\";\nimport { hasDependencyList } from \"../html/dependency-resolver.ts\";\n\nimport { UIX_COOKIE } from \"../session/cookies.ts\";\nimport { Endpoint } from \"datex-core-legacy/types/addressing.ts\";\nimport { getCachedResponse } from \"../routing/backend-entrypoint-proxy.ts\";\n\nconst logger = new Datex.Logger(\"UIX Server\");\n\n\nlet port = 80;\nlet customPort = false;\nlet enable_tls = false;\n\nSourceMapConsumer?.initialize?.({\n    \"lib/mappings.wasm\": \"https://unpkg.com/source-map@0.7.6/lib/mappings.wasm\"\n});\n\nconst langsByExtension = {\n    'ts': 'ts',\n    'tsx': 'ts',\n    'js': 'js',\n    'jsx': 'js',\n    'css': 'css',\n    'scss': 'css',\n    'xml': 'xml',\n    'rs': 'rs',\n    'json': 'json',\n    'html': 'html'\n}\n\nconst defaultKey = `-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCnGaK8mPqzlUcX\nuUgD0PTXbQu6MMgyryLx1VsGQV4oxQsUrllRGh1ILTe8l+X22uJiZlAL6Y9vp3k9\nWtFor35rAyXTSx9LjRUjKN3pd2xCXMARQujdSzUA3GTFtHmZ7lZwNZ65PVnYr3kh\nJCwQwJRy60pUqMfbL/34xl3KppoPK2xMkg27xbCWMk/jkoNGYd+Zp+HJs8uUkZFO\n8HO10tvdlVAEngMMAS3rrFGXHewgM+ISOs6X9KruhohK/CbZCl9M/2211XRYosQf\nZxu6oVbJCMNmhv+pMbZmqAHezFjJ2K8DMtBGPWEhtaCFhqfve/3lzExYFPhHE+B1\ng09CLVwZAgMBAAECggEARn6KKQZgvWI8m8WOnA2LPVbDm8j4rGk2VM+tlvX8wzZd\ndlwXUh+yOsDYwrdSTNIKr3h6TIw79t6wRzIJJiDjNEIfswP+L+FVCYA0HkpDYbu/\nS4jutG0F71cLLFz27/mcfbohPASl4sQkVdbswCR+e/zHXu/VYKLeghUtfFDMrZj1\nXtDuCynbIgaTb7TZ4XuJ3gWYG8+VpzSpTW99Cwy13eYQPfOL07xFzA1pt7iqsqf+\n9nC8tdSFzUfTrTt6C7XCZ64r6cViBjrSODOovaQzbg40X8bD3zXpkygdaZFytPku\nvmoD2srykRi+l/KuLjf1xlWx6BBqafMP0uebr+bAAQKBgQDZOlXgnCClkWX1qdbi\nx4ew2TUQef2ShffUU7lwPVjDuxDaUT/F+N8IbG7aguWD1rbhXtFer88j/I6M6ued\nrQOH/f5O0oNvNX3TxehzzD/2y25lz3e5lJPUy5/l4mVhSNjQzfEa8IwurIZ+0poJ\nCd1s4wH+LWGf+2rwrQQMum6l7QKBgQDE7NfotyCKUO46UMRtU2UKXe9ae8npvCJ5\naAW7OZJh0HskxkvHFNYO5sQUEYgWs2Onh7YAJG502rs7egOUXVyi40ubHFht6yxq\nizfVGrR55Uqjrs7xlKydX5vOyQFfJe0quvQOxY4cRawF/SJ9aDqteJwnq0WLT4j+\nivJiUATJXQKBgGDMkgApEpM1G45BRLSB3YF9CRxygACPGkTPmk7dx3RRI81lb1m0\n8Q4745oTwlrhj1UWf44GIfQTUyKQeu3Ub0JmeLB/NnqUB6IbCt6vIcHEHUnZDazw\n/H9SzcoO/MZBQ/yoCMzMbGtQDg7toh5s+vLOpdCyQFKeIqVlM+zIFw5xAoGAaD7M\nqRfQNQhUpDA/W3RrJ4rEe0zOfVonkcdcSVlXwUoA9l22naPNEUReBhWlygaauYPg\n98BRbLChrwGPRYoK0Pur+WeO9FkrQReDrd8eLO0Rjwap7D79Ba4oJ9ZGUJ0eKKGh\nMvSnnxXO07jF+kcj0NLpLyK+hNnMtprNZvffIM0CgYEAulnW4RinIqp/j1kXxSt7\nY1GkmN8ozem89ZKXz3zTEKvhqQfB+fMIhFzJ2i31eGe8NM6B2M8RVzeZ3JB0SXib\nMuebKARKYi4+MTkZbQ2SgFZY3K2pKybB9GQFvY96k1kWfYQc3xbQZ7gZrqQt1xkM\nT9s26OLs23b9HZE5XEfxmX8=\n-----END PRIVATE KEY-----`;\n\nconst defaultCert = `-----BEGIN CERTIFICATE-----\nMIIEeTCCAuGgAwIBAgIQeObf9HHX+G5b1bCKfBeukjANBgkqhkiG9w0BAQsFADCB\npzEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMT4wPAYDVQQLDDVqb25h\nc0BNYWNCb29rLVByby12b24tSm9uYXMuZnJpdHouYm94IChKb25hcyBTdHJlaGxl\nKTFFMEMGA1UEAww8bWtjZXJ0IGpvbmFzQE1hY0Jvb2stUHJvLXZvbi1Kb25hcy5m\ncml0ei5ib3ggKEpvbmFzIFN0cmVobGUpMB4XDTIzMDQxNjE4MjkzOFoXDTI1MDcx\nNjE4MjkzOFowaTEnMCUGA1UEChMebWtjZXJ0IGRldmVsb3BtZW50IGNlcnRpZmlj\nYXRlMT4wPAYDVQQLDDVqb25hc0BNYWNCb29rLVByby12b24tSm9uYXMuZnJpdHou\nYm94IChKb25hcyBTdHJlaGxlKTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAKcZoryY+rOVRxe5SAPQ9NdtC7owyDKvIvHVWwZBXijFCxSuWVEaHUgtN7yX\n5fba4mJmUAvpj2+neT1a0WivfmsDJdNLH0uNFSMo3el3bEJcwBFC6N1LNQDcZMW0\neZnuVnA1nrk9WdiveSEkLBDAlHLrSlSox9sv/fjGXcqmmg8rbEySDbvFsJYyT+OS\ng0Zh35mn4cmzy5SRkU7wc7XS292VUASeAwwBLeusUZcd7CAz4hI6zpf0qu6GiEr8\nJtkKX0z/bbXVdFiixB9nG7qhVskIw2aG/6kxtmaoAd7MWMnYrwMy0EY9YSG1oIWG\np+97/eXMTFgU+EcT4HWDT0ItXBkCAwEAAaNeMFwwDgYDVR0PAQH/BAQDAgWgMBMG\nA1UdJQQMMAoGCCsGAQUFBwMBMB8GA1UdIwQYMBaAFN5vUfpPJhbCA6P2BCwZZ9zM\nx+ihMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAYEAhn8o\nHk5rEC/XerIEW4l8TmB2k9xc9rhMuM+1QsJx2uy4lR0BYp5aDk4BX2dMTLAPLEJe\nm0sI7LCuKkF1pfIVf1CflBzIWi9cfgNcNijGHZ21ODQ12oEU0MdPQIgLOWMOM4Ys\no4xpEMWj9k89A3bXKU+pNlQygLKoxZfPR+R1AGLvQHEUR48alBgk812VJwuo1oZu\nw2jjh/0+sc+g7Mh7uQvmFSkPIsbNSHVj+JVS8w/oDX3xZwvwrQFsriHxwgP6qqs2\nKOV5MIfEN1mZsE0fJ1RFWjjz+d5KsvI8UY8vtfarZRAbKRFQcyIPftqjz0/wfKb4\no6MxAX6jt9mXEVk7ieXWR72rest4Um66isO+kRR9fXhPcwIJbJyvKBQhSMHah9IR\ne/oFUigvXFAk5se3eiyON38Gh1hQGeOYvNC3EFRSOljo3KCrYUeKw50ZH49r295M\nq5QoSynNW4FNauxdgU7F+4r5jdKJugaRp84UL/VJzIk93gaJhEpRSAnbDih4\n-----END CERTIFICATE-----`\n\n\n\n// command line args (--watch)\nif (globalThis.Deno) {\n    const parse = (await import(\"https://deno.land/std@0.168.0/flags/mod.ts\")).parse;\n    const flags = parse(Deno.args, {\n        string: [\"port\", \"keyfile\", \"certfile\"],\n        boolean: [\"enable-tls\"],\n    });\n    if (flags.port) {\n        port = Number(flags.port);\n        customPort = true;\n    }\n\n    enable_tls = flags['enable-tls'];\n    // cert_path = Deno.run()\n}\n\n// -------------------------------------------------------------------------------------------------------------------\n\n\ntype mime_type = `${'text'|'image'|'application'|'video'|'audio'}/${string}`;\n\nexport type requestMetadata = {\n    endpoint?: Datex.Endpoint\n}\n\ntype connectionHandler = (conn: Deno.Conn)=>void|boolean|Promise<void|boolean>;// when true returned, handle connection with default handler\ntype requestHandler = (req: Deno.RequestEvent, path:string, con:Deno.Conn, metadata:requestMetadata)=>void|boolean|string|Promise<void|boolean|string>;// when true returned, request was handled, returned string is passed on to server path handler\n\ntype server_options = {\n    cors?: boolean, // enable cors, default: false\n    default_headers?: Record<string, string>, // default headers to add to all file responses\n    transpilers?: {[path:string]: Transpiler}, // use transpiler for specific web path, if set, ts files are transpiled, and the js content is returned to the browser (+ virtual files can be added). The transpilers for the first matching path in the list is used. \n    resolve_index_html?: boolean, // resolve / path to index.html, default: false\n    request_proxies?: RequestProxy[] // request proxies are called for file requests that match their extensions which are requested directly from a browser session, not as a script import or deno import\n                                         // they can be used to provide a custom view for a file in the browser\n    directory_indices?: boolean, // returns json directory listing for directory paths, default: true\n    provide_module_dependencies?: boolean // provide module dependencies for ts files via server, add X-Module-Dependencies header if dependencies are available\n}\n\ntype directoryIndex = ({name:string, children?:directoryIndex}|string)[]\n\nexport interface RequestProxy {\n    extensions: string[]\n    handleRequest(req:Request, originalFilePath:Path, mappedFilePath:Path):Response|undefined|Promise<Response|undefined>\n}\n\n\nexport class Server {\n\n    #options!: server_options\n    #dir?: Path.File\n\n    #running = false;\n    #port = port++\n\n    get running(){return this.#running}\n    get port(){return this.#port}\n\n    setDefaultHeaders(headers: Record<string,string>) {\n        this.#options.default_headers = headers;\n    } \n\n    /**\n     * //  TODO: remove, workaround for cdn\n     * @param generate\n     */\n    generateDirectoryIndices(generate: boolean) {\n        this.#options.directory_indices = generate;\n    }\n    \n    transpilers = new Map<string, Transpiler>()\n\n    private requestHandlers = new Set<requestHandler>();\n    private connectionHandler?: connectionHandler\n\n    constructor(dir: string|URL, options?:server_options)\n    constructor(requestHandler:requestHandler, options?:server_options) \n    constructor(_:undefined, options?:server_options) \n    constructor(requestHandler_or_dir?:string|URL|requestHandler, options?:server_options) {\n        if (typeof requestHandler_or_dir == \"string\") requestHandler_or_dir = new URL(requestHandler_or_dir, getCallerDir())\n        this.config(<any>requestHandler_or_dir, options) \n    }\n\n    public config(root?: string|URL, options?:server_options):void\n    public config(requestHandler?:requestHandler, options?:server_options):void\n    public config(requestHandler_or_root?:string|URL|requestHandler, options?:server_options) {\n        // default options\n        if (!this.#options || options) {\n            if (!options) options = {};\n            if (!('resolve_index_html' in options)) options.resolve_index_html = false;\n            if (!('directory_indices' in options)) options.directory_indices = true;\n            this.#options = options;\n        }\n        \n        if (typeof requestHandler_or_root == \"string\" || requestHandler_or_root instanceof URL) this.#dir = Path.dir(requestHandler_or_root);\n        else if (typeof requestHandler_or_root == \"function\") this.requestHandlers.add(requestHandler_or_root);\n        // else throw new Error(\"Invalid constructor argument for Server, must be file path or connection handler\")\n        \n        for (const [path, transpiler] of Object.entries(this.#options.transpilers??{})) {\n            // logger.info(\"using transpiler for path \" + path );\n            this.transpilers.set(path, transpiler);\n        }\n    }\n\n    /** special request handlers */\n\n    private pathHandlers = new Map<string|RegExp, requestHandler>();\n    private pathStaticContents = new Map<string|RegExp, [type:mime_type, content:string]>()\n\n    public path(path:string|RegExp, content: string, mime_type: mime_type):void\n    public path(path:string|RegExp, handler: requestHandler):void\n    public path(path:string|RegExp, handler_or_content: string|requestHandler, mime_type?: mime_type) {\n        if (!this.path_request_handler) this.createPathRequestHandler();\n\n        if (typeof handler_or_content == \"string\") {\n            this.pathStaticContents.set(path, [mime_type ?? \"text/plain\", handler_or_content]);\n        }\n        else {\n            this.pathHandlers.set(path, <requestHandler> handler_or_content);\n        }\n    }\n\n    public resetPath(path:string|RegExp) {\n        this.pathHandlers.delete(path);\n        this.pathStaticContents.delete(path);\n    }\n\n    private path_request_handler?:requestHandler;\n\n    private createPathRequestHandler(){\n        this.path_request_handler = (req:Deno.RequestEvent, req_path:string, conn: Deno.Conn, metadata)=>{\n            // handler\n            for (const [path, handler] of this.pathHandlers) {\n\n                // full string match\n                if (typeof path == \"string\") {\n                    if (req_path == path) return handler(req, req_path, conn, metadata);\n                    else continue;\n                }\n                // regex match\n                else {\n                    if (req_path.match(path)) return handler(req, req_path, conn, metadata);\n                    else continue;\n                }\n            }  \n\n            // static\n            for (const [path, [type, content]] of this.pathStaticContents) {\n\n                // full string match\n                if (typeof path == \"string\") {\n                    if (req_path == path) return this.serveContent(req, type, content);\n                    else continue;\n                }\n                // regex match\n                else {\n                    if (req_path.match(path)) return this.serveContent(req, type, content);\n                    else continue;\n                }\n            }\n\n            return false;\n        }\n        this.requestHandlers.add(this.path_request_handler)\n    }\n\n    public addRequestHandler(requestHandler:requestHandler, prioritize = false){\n        if (prioritize) this.requestHandlers = new Set([requestHandler, ...this.requestHandlers]); // put first in line\n        else this.requestHandlers.add(requestHandler) // add to end of line\n    }\n\n    public getFormattedAddress() {\n        return `${enable_tls?\"https\":\"http\"}://localhost${this.port==80?'':':'+this.port}`;\n    }\n\n    // start listening on port\n    public async listen(port?:number) {\n        if (port != undefined) this.#port = port;   \n\n        // logger.info(\"starting web server...\");\n\n        const loaders = []\n        for (const [_path, transpiler] of this.transpilers) loaders.push(transpiler.init())\n        await Promise.all(loaders)\n\n        const server = await this.listenWithFallbackPort();\n        // const address = this.getFormattedAddress();\n        // if (this.#dir?.name) logger.info(`${this.#dir.name} available on ${address}`);\n        // else logger.info(`available on ${address}`);\n        this.#running = true;\n\n        const serve = async () => {\n            try {\n                for await (const conn of server) {\n                    let handled:boolean|void = false;\n                    if (this.connectionHandler) handled = await this.connectionHandler(conn) // custom handling\n                    // handle default\n                    if (handled===false) this.handleConnectionAsHTTP(conn) // handle as http by default\n                }\n            }\n            catch (e){\n                console.error(\"Fatal server error: \", e)\n                serve();\n            }\n        }\n\n        serve();\n    }\n\n\n    private async listenWithFallbackPort() {\n        // first try actual requested port\n        try {\n            const conn = this.tryListen(this.port)\n            this.#port = (conn.addr as Deno.NetAddr).port;\n            return conn;\n        }\n        // port not accessible\n        catch (e) {\n            // only try a different port if default port 80 is used\n            if (customPort) throw e;\n\n            const portCachePath = new Path(\"./uix-fallback-port\", cache_path);\n\n            // try cached fallback port\n            const cachedFallbackPort = portCachePath.fs_exists && await Deno.readTextFile(portCachePath.normal_pathname);\n            try {\n                if (!cachedFallbackPort) throw \"No cached fallback path\";\n\t\tif (isNaN(cachedFallbackPort)) throw \"Invalid fallback port\";\n\t\tconst port = Number(cachedFallbackPort);\n\t\tif (port < 0 || port > 65535)\n\t\t\tthrow \"Invalid fallback port\";\n                const conn = this.tryListen(port)\n                this.#port = port;\n                return conn;\n            }\n            catch {\n                // get a new fallback port (using port 0)\n                const conn = this.tryListen(0)\n                this.#port = (conn.addr as Deno.NetAddr).port;\n\n                await Deno.writeTextFile(portCachePath.normal_pathname, this.#port.toString())\n                return conn;\n            }            \n        }\n    }\n\n    private tryListen(port: number) {\n        return enable_tls ? Deno.listenTls({ port, key: defaultKey, cert: defaultCert }) : Deno.listen({ port });\n    }\n\n    public setConnectionHandler(handler:connectionHandler){\n        this.connectionHandler = handler;\n    }\n    \n    private async handleConnectionAsHTTP(conn: Deno.Conn){\n        const httpConn = Deno.serveHttp(conn);\n        try {\n            for await (const requestEvent of httpConn) {\n                this.handleRequest(requestEvent, conn).catch((e)=>{\n                    requestEvent.respondWith(new Response(\"Internal Server Error\", {status: 500}));\n                });\n            }\n        }\n        catch {}\n    }\n\n    // TODO: validate if nonce was created on server\n    private async getNonce(endpoint: Endpoint) {\n        return arrayBufferToBase64(await Crypto.sign(endpoint.binary));\n    }\n\n    private async validateEndpoint(requestEvent:Deno.RequestEvent, port: string, datexEndpointNonceCookie: string, datexEndpointValidationCookie: string, datexEndpointCookie: string) {\n        try {\n            const nonce = base64ToArrayBuffer(datexEndpointNonceCookie)\n            const validation = base64ToArrayBuffer(datexEndpointValidationCookie)\n            const endpoint = Target.get(datexEndpointCookie) as Datex.Endpoint;\n\n            const unverifiedSessionCookie = getCookie(\"uix-session-unverified\", requestEvent.request.headers, port);\n\n            // endpoint with valid keys tries to verify, but the same endpoint id is already used on another unverified session\n            if (unverifiedSessionExists(endpoint) && \n                !(unverifiedSessionCookie && validateUnverifiedSession(endpoint, unverifiedSessionCookie))) {\n                throw new Error(\"Invalid unverified session token for \" + endpoint);\n            }\n \n            if (!Datex.Supranet.connected) throw new Error(\"Cannot validate endpoint signature, not connected to supranet\");\n            if (!(await Crypto.verify(endpoint.binary, nonce, Datex.Runtime.endpoint)))\n                throw new Error(\"The nonce is not signed by the server. Can not verify session for \" + endpoint);\n            const valid = await Crypto.verify(nonce, validation, endpoint);\n            if (valid) {\n                this.setVerifiedSession(requestEvent, port, endpoint);\n                return true;\n            }\n        }\n        catch (e) {\n            logger.warn(e);\n        }\n        return false;\n    }\n\n    public async handleRequest(requestEvent:Deno.RequestEvent, conn: Deno.Conn){\n        \n        let normalized_path:string|false = this.normalizeURL(requestEvent.request);\n        let handled:boolean|void|string = false;\n        const url = new URL(requestEvent.request.url);\n\n        // error parsing url (TODO: this should not happen)\n        if (normalized_path == false) {\n            this.sendError(requestEvent, 500);\n            return;\n        }\n\n        let endpoint: Datex.Endpoint|undefined;\n\n        // has UIX-Cache-Token header, try to serve response from cache\n        const cacheToken = requestEvent.request.headers.get(\"UIX-Cache-Token\");\n        if (cacheToken) {\n            const cachedResponse = getCachedResponse(cacheToken);\n            if (cachedResponse) {\n                requestEvent.respondWith(cachedResponse);\n                return;\n            }\n        }\n        // has UIX-Cache-Token cookie\n        else {\n            const cacheTokenCookieName = \"uix-cache-token\"\n            const cacheTokenCookie = getCookie(cacheTokenCookieName, requestEvent.request.headers, url.port);\n            if (cacheTokenCookie && cacheTokenCookie.startsWith(url.pathname+\":\")) {\n                const cachedResponse = getCachedResponse(cacheTokenCookie.split(\":\")[1]);\n                const headers = new Headers(cachedResponse?.headers);\n                deleteCookie(cacheTokenCookieName, headers, url.port);\n                if (cachedResponse) {\n                    requestEvent.respondWith(\n                        new Response(cachedResponse.body, {\n                            status: cachedResponse.status,\n                            statusText: cachedResponse.statusText,\n                            headers\n                        })\n                    );\n                    return;\n                }\n            }\n        }\n\n\n        // session/endpoint handling:\n        if (\n            (this as any)._uix_init && \n            Server.isBrowserClient(requestEvent.request) && \n            (  \n                requestEvent.request.headers.get(\"Sec-Fetch-Dest\") == \"document\" ||\n                requestEvent.request.headers.get(\"UIX-Inline-Backend\") == \"true\" ||\n                !requestEvent.request.headers.has(\"Sec-Fetch-Site\")\n                /*|| requestEvent.request.headers.get(\"Sec-Fetch-Dest\") == \"iframe\"*/\n            ) && \n            requestEvent.request.headers.get(\"connection\")!=\"Upgrade\"\n        ) {\n\n            const port = url.port;\n            const datexEndpointCookie = getCookie(UIX_COOKIE.endpoint, requestEvent.request.headers, port);\n            const datexEndpointValidationCookie = getCookie(\"datex-endpoint-validation\", requestEvent.request.headers, port);\n            const datexEndpointNonceCookie = getCookie(\"datex-endpoint-nonce\", requestEvent.request.headers, port);\n\n            const uixSessionCookie = getCookie(\"uix-session\", requestEvent.request.headers, port);\n            const uixUnverifiedSessionCookie = getCookie(\"uix-session-unverified\", requestEvent.request.headers, port);\n\n            // has datex-endpoint\n            if (datexEndpointCookie) {\n\n                endpoint = Target.get(datexEndpointCookie) as Datex.Endpoint;\n\n                // has uix-session - check if still a valid session\n                if (uixSessionCookie) {\n\n                    // no valid session\n                    if (!validateVerifiedSession(endpoint, uixSessionCookie)) {\n                        logger.debug(\"invalid session for \" + endpoint + \" (\" + uixSessionCookie + \")\")\n\n                        // try to create a new session\n                        if (datexEndpointValidationCookie && datexEndpointNonceCookie) {\n                            try {\n                                const endpointValid = await this.validateEndpoint(\n                                    requestEvent,\n                                    port,\n                                    datexEndpointNonceCookie,\n                                    datexEndpointValidationCookie,\n                                    datexEndpointCookie\n                                )\n                                // no valid new session, remove session cookie\n                                if (!endpointValid) endpoint = await this.setUnverifiedSessionInit(requestEvent, port);\n                            }\n                            catch (e) {\n                                console.log(e);\n                                endpoint = await this.setUnverifiedSessionInit(requestEvent, port);\n                            }\n                        }\n\n                        // invalid cookie state, reset\n                        else {\n                            endpoint = await this.setUnverifiedSessionInit(requestEvent, port);\n                        }\n                        \n                    }\n                    else {\n                        logger.debug(\"valid session for \" + endpoint + \" (\" + uixSessionCookie + \")\")\n                    }\n                }\n                \n                // has datex-endpoint-validation and datex-endpoint-nonce\n                // -> convert to uix-session\n                else if (datexEndpointValidationCookie && datexEndpointNonceCookie) {\n                    try {\n                        const endpointValid = await this.validateEndpoint(\n                            requestEvent,\n                            port,\n                            datexEndpointNonceCookie,\n                            datexEndpointValidationCookie,\n                            datexEndpointCookie\n                        )\n                        // no valid new session, remove session cookie\n                        if (!endpointValid) endpoint = await this.setUnverifiedSessionInit(requestEvent, port);\n                    } catch (e) {\n                        // make sure that an invalid endpoint cookie state is reset (legacy backwards compatibility or coookie tampering)\n                        console.log(\"invalid endpoint cookie state\", e);\n                        endpoint = await this.setUnverifiedSessionInit(requestEvent, port);\n                    }\n                }\n                \n                // has uix-session-unverified - check if still a valid session\n                else if (uixUnverifiedSessionCookie) {\n\n                    // no valid session\n                    if (!validateUnverifiedSession(endpoint, uixUnverifiedSessionCookie)) {\n                        logger.debug(\"invalid session for \" + endpoint + \" (\" + uixUnverifiedSessionCookie + \")\")\n                        endpoint = await this.setUnverifiedSessionInit(requestEvent, port);\n                    }\n                    else {\n                        logger.debug(\"valid unverified session for \" + endpoint + \" (\" + uixUnverifiedSessionCookie + \")\")\n                    }\n                }\n\n                else {\n                    logger.warn(\"no valid session for \" + datexEndpointCookie);\n                    endpoint = await this.setUnverifiedSessionInit(requestEvent, port);\n                }\n\n            }\n            \n            // has no datex-endpoint -> init\n            else {\n                /* Add redirect loop\n                const referrer = requestEvent.request.headers.get(\"Referer\");\n                logger.info(\"referrer\", referrer);\n                if (referrer === requestEvent.request.url) {\n                    const html = `<html>\n                        <noscript>Please activate JavaScript in your browser!</noscript>\n                        Please allow cookies!\n                    `;\n                    await this.serveContent(requestEvent, \"text/html\", html, undefined, 400, undefined, false);\n                    return;\n                }*/\n                // if (requestEvent.request.method !== \"GET\") {\n                //     await requestEvent.respondWith(new Response(\"UIX session is missing\", {\n                //         status: 403\n                //     }));\n                //     return;\n                // }\n\n                endpoint = await this.setUnverifiedSessionInit(requestEvent, port);\n            }\n            \n        }\n\n        const metadata = {endpoint}\n\n        for (const handler of this.requestHandlers) {\n            try { \n                handled = await handler(requestEvent, normalized_path, conn, metadata)\n                if (handled!==false) { // request was handled\n                    if (typeof handled == \"string\") { // path redirect\n                        normalized_path = handled;\n                        handled = false;\n                    }\n                    else break;\n                } \n            } \n            catch (e) {\n                if (!(e instanceof Deno.errors.Http)) console.error(e);\n                this.sendError(requestEvent)\n            }\n        }\n\n        // handle default\n        if (handled===false) this.handleHTTPRequest(requestEvent, normalized_path).catch(()=>this.sendError(requestEvent))\n    }\n\n\n    private async setUnverifiedSessionInit(requestEvent: Deno.RequestEvent, port: string) {\n        const url = new URL(requestEvent.request.url);\n        const isSafariLocalhost = url.hostname == \"localhost\" && isSafariClient(requestEvent.request);\n        const endpoint = Datex.Endpoint.getNewEndpoint().getInstance(1);\n        const unverifiedSession = createSession(endpoint, false);\n        const headers = new Headers();\n\n        deleteCookie('datex-endpoint-validation', headers, port, isSafariLocalhost)\n        deleteCookie('uix-session', headers, port, isSafariLocalhost)\n\n        setCookieUIX('datex-endpoint-nonce', await this.getNonce(endpoint), undefined, headers, port, isSafariLocalhost)\n        setCookieUIX('uix-session-unverified', unverifiedSession, undefined, headers, port, isSafariLocalhost);\n        setCookieUIX(UIX_COOKIE.endpoint, endpoint.toString(), undefined, headers, port, isSafariLocalhost);\n\n        // also set endpoint for current request\n        (requestEvent.request as any)._endpoint = endpoint.toString();\n\n        const originalRespondWith = requestEvent.respondWith.bind(requestEvent);\n        requestEvent.respondWith = (response:Response) => {\n            for (const [key, value] of headers.entries()) response.headers.append(key, value);\n            return originalRespondWith(response)\n        }\n\n        return endpoint;\n    }\n\n    private setVerifiedSession(requestEvent: Deno.RequestEvent, port: string, endpoint: Datex.Endpoint) {\n        const url = new URL(requestEvent.request.url);\n        const isSafariLocalhost = url.hostname == \"localhost\" && isSafariClient(requestEvent.request);\n        const session = createSession(endpoint, true);\n        const headers = new Headers();\n        \n        // If we delete those cookies the backend can not verify the session on restart\n        // deleteCookie('datex-endpoint-validation', headers, port, isSafariLocalhost)\n        // deleteCookie('datex-endpoint-nonce', headers, port, isSafariLocalhost)\n        deleteCookie('uix-session-unverified', headers, port, isSafariLocalhost)\n        \n        setCookieUIX('uix-session', session, undefined, headers, port, isSafariLocalhost)\n        \n        const originalRespondWith = requestEvent.respondWith.bind(requestEvent);\n        requestEvent.respondWith = (response:Response) => {\n            for (const [key, value] of headers.entries()) response.headers.append(key, value);\n            return originalRespondWith(response)\n        }\n    }\n\n\n    /**\n     * Return pathname (relative) from request\n     * index.html is added & ts to js file conversion\n     * @param requestEvent \n     * @returns normalized path\n     */\n    private normalizeURL(request: Request){\n        const req_url = new Path(request.url);\n\n        // index.html for directory paths\n        if (this.#options.resolve_index_html && req_url.is_dir) req_url.pathname += \"index.html\";\n\n        try {\n            return decodeURIComponent(req_url.pathname);\n        }\n        catch (e) {\n            console.log(e);\n            return false;\n        }\n    }\n\n    public static isSafariClient(request:Request){\n        const ua = request.headers.get(\"user-agent\");\n        if (!ua) return true; // play it safe\n        return /^((?!chrome|android).)*safari/i.test(ua);\n    }\n\n    public static isBrowserClient(request:Request){\n        return !request.headers.get(\"user-agent\")?.startsWith(\"Deno\"); // everything that is not deno is considered a browser\n    }\n\n\n    async handleHTTPRequest(requestEvent: Deno.RequestEvent, normalizedPath?:string) {\n        try {\n            let res:any;\n            try {\n                res = await this.getResponse(requestEvent.request, normalizedPath)\n            }\n            catch (e) {\n                console.error(e);\n                throw e;\n            }\n            await requestEvent.respondWith(res)\n        } catch {\n            try {\n                await requestEvent.respondWith(this.getErrorResponse(500))\n            }\n            catch {}\n        }\n    }\n\n    getFileSuffix(url: Path, normalizedPath:string):[url: Path, normalizedPath:string, lineNumber:number|undefined, colNumber:number|undefined, contentType:\"source\"|\"transpiled\"|undefined] {\n        let lineNumber:number|undefined = undefined;\n        let colNumber:number|undefined = undefined;\n        let contentType:\"source\"|\"transpiled\"|undefined = undefined;\n\n        // \"line:col:contentType\", default contentType = transpiled\n        const suffix = /(\\:\\d+)?(\\:\\d+)?(\\:\\w+)?$/;\n        const matchSuffix = normalizedPath.match(suffix)\n        if (matchSuffix) {\n            // extract line + col number\n            [lineNumber, colNumber, contentType] = matchSuffix?.slice(1).map(x=>x?.slice(1)).map((x,i) => i==2 ? x : (x?Number(x):x)) as [number|undefined, number|undefined, \"source\"|\"transpiled\"|undefined];\n            contentType ??= \"transpiled\" // default for contentType\n            normalizedPath = normalizedPath.replace(suffix, '');\n            url = new Path(url.toString().replace(suffix, ''));\n        }\n        \n        return [url, normalizedPath, lineNumber, colNumber, contentType]\n    }\n\n    #eternalModulesCache = new Map<string, string>()\n\n    async getResponse(request: Request, normalizedPath:false|string = this.normalizeURL(request)) {\n\n        if (!this.#dir || normalizedPath===false) {\n            return this.getErrorResponse(500);\n        }\n\n        // Use the request pathname as filepath\n        let url = new Path(request.url);\n        const isBrowser = Server.isBrowserClient(request);\n        const isSafari = isSafariClient(request);\n\n        // extract row:col:contentType\n        const [newUrl, newNormalizedPath, lineNumber, colNumber, contentType] = this.getFileSuffix(url, normalizedPath);\n        url = newUrl;\n        normalizedPath = newNormalizedPath;\n\n\n        // open file in new browser tab => special file preview\n        const displayWithSyntaxHighlighting = isBrowser && (request.headers.get(\"Sec-Fetch-Dest\") == \"document\" || request.headers.get(\"Sec-Fetch-Dest\") == \"iframe\") && !!url.hasFileExtension(\"ts\", \"tsx\", \"js\", \"jsx\", \"css\", \"scss\", \"dx\")\n\n        const transpile = isBrowser && (displayWithSyntaxHighlighting ? contentType == \"transpiled\" : true)\n        let filepath = await this.findFilePath(url, normalizedPath, transpile, isSafari)\n\n        // override filepath, exposes raw source files to browser for debugging TODO: only workaround with _base_path, improve\n        if (displayWithSyntaxHighlighting && contentType == \"source\" && this._app?.stage === \"dev\" && normalizedPath.startsWith(\"/@uix/src/\")) {\n            filepath = (this._base_path as Path.File).getChildPath(normalizedPath.replace(\"/@uix/src/\", \"\"))\n        }\n        \n        // TODO: fix workaround for /@uix/src paths  \n        if (normalizedPath.startsWith(\"/@uix/src/\")) {\n            normalizedPath = normalizedPath.replace(\"/@uix/src/\", \"../\");\n        }\n        const srcDir = this.#dir.getChildPath(normalizedPath);\n\n        if (!filepath) {\n            return this.getErrorResponse(500);\n        }\n\n        // handle request by proxy?\n        for (const proxy of this.#options.request_proxies??[]) {\n            if (url.hasFileExtension(...proxy.extensions) && request.headers.get(\"sec-fetch-dest\") == \"document\" || request.headers.get(\"sec-fetch-site\") == \"none\") {\n                const response = await proxy.handleRequest(request, this.#dir.getChildPath(normalizedPath), filepath);\n                if (response) return response;\n            }\n        }\n\n        // UIX special query parameters (TODO: move)\n        // special scoped css\n        if (url.searchParams.has(\"scope\") && (url.ext === \"scss\" || url.ext === \"css\") && await filepath.fsExists()) {\n            const scope = url.searchParams.get(\"scope\");\n            // custom scope selector\n            if (scope) {\n                const scopedCSS = addCSSScopeSelector(await Deno.readTextFile(filepath.normal_pathname), scope);\n                return this.getContentResponse(\"text/css\", scopedCSS);\n            }\n            // wrap with @scope\n            else {\n                const scopedCSS = addCSSScope(await Deno.readTextFile(filepath.normal_pathname));\n                return this.getContentResponse(\"text/css\", scopedCSS);\n            }\n            \n        }\n        if (url.searchParams.has(\"useDirective\") && url.hasFileExtension(\"tsx\", \"ts\", \"js\", \"jsx\", \"mts\", \"mjs\")) {\n            const {PageProvider} = await import(\"../routing/rendering.ts\")\n            if (!await PageProvider.useDirectiveMatchesForFile(filepath, url.searchParams.get(\"useDirective\")!)) {\n                return this.getErrorResponse(406, \"Not Acceptable\");\n            }\n        }\n\n        if (!url.searchParams.has(\"original\") && url.hasFileExtension(...eternalExts) && getDirType(app.options!, srcDir) !== \"backend\") {\n            const urlString = url.toString();\n           \n            if (!this.#eternalModulesCache.has(urlString)) {\n                const specifier = url.pathname + '?original'\n                const eternalModuleSource = await getEternalModule(filepath, specifier);\n                this.#eternalModulesCache.set(urlString, eternalModuleSource)\n            } \n            return this.getContentResponse(\"text/javascript\", this.#eternalModulesCache.get(urlString));\n        }\n\n        if (this.#options.directory_indices && await filepath.fsExists() && await filepath.fsIsDir()) {\n            return this.getContentResponse(\"application/directory+json\", JSON.stringify(\n                await this.generateDirectoryIndex(srcDir), \n                null, '    ')\n            );\n        }\n\n        // is .dx/.dxb file as js module import\n        if ((filepath.ext == \"dx\" || filepath.ext == \"dxb\") && request.headers.get(\"Sec-Fetch-Dest\") == \"script\") {\n\n            // check if generated matching dx.ts file exists\n            const matchingTsFile = await this.findFilePath(url.getWithFileExtension(filepath.ext + '.ts'), normalizedPath + '.ts', isBrowser, isSafari)\n            if (await matchingTsFile?.fsExists()) {\n                filepath = matchingTsFile\n            }\n\n            // generate new script importing .dx file (TODO: make sure .dx files are not accidentally leaked from the backend if no .dx.ts file exists)\n            else {\n                // convert http to https\n                if (url.protocol == \"http:\" && url.hostname !== \"localhost\") {\n                    url.protocol = \"https:\"\n                }\n                const script = `import { datex } from \"datex-core-legacy\";\\n\\nconst exports = await datex.get(\"${url}\");\\nexport default exports;`\n                return this.getContentResponse(\"text/javascript\", script);\n            }\n            \n        }\n\n        // render file preview with syntax highlighting in browser\n        if (displayWithSyntaxHighlighting) {\n\n            if (!filepath || !await filepath?.fsExists()) return this.getErrorResponse(404, \"Not found\");\n            \n            const consumer = contentType !== \"source\" && await this.getSourceMapConsumer(filepath);\n\n            let line = lineNumber;\n            let col = colNumber;\n\n            if (consumer) {\n                // use original source as file\n                let sourcePath = filepath.getWithFileExtension(\"ts\");\n                if (!await sourcePath.fsExists()) sourcePath = filepath.getWithFileExtension(\"tsx\");\n\n                // original source was found\n                if (await sourcePath.fsExists()) {\n                    filepath = sourcePath\n                    if (line) {\n                        const pos = consumer.originalPositionFor({line, column: col??0});\n                        line = pos.line;\n                        col = pos.column;\n                    }\n                }\n                else {\n                    logger.error(\"Found source map, but no original source file for \" + filepath)\n                }\n            }\n        \n            const content = await Deno.readTextFile(filepath.normal_pathname);\n            const highlighted = await highlightText!(content.replace(/\\/\\/\\# sourceMappingURL=.*$/, \"\"), langsByExtension[filepath.ext as keyof typeof langsByExtension]);\n            const html = `<!DOCTYPE html><html>\n                <head>\n                    <title>${filepath.name}</title>\n                    <meta charset=\"UTF-8\">\n                    <meta name=\"viewport\" content=\"viewport-fit=cover, width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\"/>\n                    <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/gh/speed-highlight/core@1.2.4/dist/themes/github-dark.css\">\n                </head>\n                <body>\n                    <style>\n                        body {\n                            font-size: 1.2em;\n                            background: #282828;\n                            color: #eee;\n                        }\n                        body > div {\n                            display: flex;\n                        }\n                        body > div > div {\n                            white-space: pre;\n                            font-family: monospace;\n                        }\n                        \n                        .shj-numbers > * {\n                            position: relative;\n                        }\n\n                        ${line!==undefined ? `\n                        .shj-numbers :nth-child(${line}):before {\n                            color: white;\n                        }\n                        .shj-numbers :nth-child(${line}):after {\n                            content: 'x';\n                            user-select: none;\n                            pointer-events: none;\n                            color: transparent;\n                            position: absolute;\n                            top: 0;\n                            background: #fff3;\n                            width: 100vw;\n                            left: -12px;\n                            z-index: -100;\n                        }\n                        `: ''}\n                    </style>\n                    ${highlighted}\n                    ${line!==undefined ? `\n                    <script>\n                        document.querySelector('.shj-numbers :nth-child(${line})').scrollIntoView({behavior:'instant', block:'center'})\n                    </script>\n                    `: ''}\n                </body>\n            </html>`\n\n            return this.getContentResponse(\"text/html\", html);\n        }\n        const response = await serveFile(request, filepath!.normal_pathname);\n\n        if (this.#options.cors) {\n            response.headers.set(\"Access-Control-Allow-Origin\", \"*\");\n            response.headers.set(\"Access-Control-Allow-Headers\", \"*\");\n        }\n        if (this.#options.default_headers) {\n            for (const [name, value] of Object.entries(this.#options.default_headers))\n            response.headers.set(name, value);\n        }\n\n        if (this.#options.provide_module_dependencies) {\n            const srcPath = this.#dir.getChildPath(normalizedPath);\n            if (hasDependencyList(srcPath)) response.headers.set(\"X-Module-Dependencies\", \"true\");\n        }\n\n        return response;\n    }\n\n    async getSourceMapConsumer(jsFilepath: Path.File) {\n        // try to get source map\n        let sourceMap = null;\n        let mapFile = jsFilepath.getWithFileExtension('ts.map');\n        if (await mapFile.fsExists()) {\n            sourceMap = JSON.parse(await Deno.readTextFile(mapFile.normal_pathname));\n        }\n        else {\n            mapFile = jsFilepath.getWithFileExtension('tsx.map');\n            if (await mapFile.fsExists()) {\n                sourceMap = JSON.parse(await Deno.readTextFile(mapFile.normal_pathname));\n            }\n        }\n        if (sourceMap) return new SourceMapConsumer(sourceMap);\n    }\n\n\n    protected async findFilePath(url: Path, normalizedPath: string, transpile: boolean, isSafari: boolean) {\n        if (!this.#dir) return;\n\n        let filepath = this.#dir.getChildPath(normalizedPath);\n          \n        try {\n            // resolve ts and virtual files\n            const resolve_ts = (url.ext===\"ts\"||url.ext===\"tsx\"||url.ext===\"mts\"||url.ext===\"scss\") && url.searchParams.get(\"type\") !== \"ts\" && transpile;\n            \n            for (const [tpath, transpiler] of this.transpilers) {\n                if (normalizedPath.startsWith(tpath)) {\n                    // create new file path for this transpiler\n                    filepath = transpiler.src_dir.getChildPath(normalizedPath.replace(tpath,'/'));\n\n                    // check if transpiler has custom dist path, else use default filepath\n                    const dist_path = transpiler.getDistPath(filepath, resolve_ts);\n\n                    if (dist_path) filepath = dist_path;\n\n                    // js file requested that does not exist (this should normally not happen) - try .ts extension\n                    // TODO: try all extension (also tsx, ...)\n                    else if (!await filepath.fsExists()) {\n                        if (filepath.hasFileExtension('js', 'mjs')) {\n                            const dist_path = transpiler.getDistPath(filepath.getWithFileExtension('ts'), true);\n                            if (dist_path) filepath = dist_path;\n                        } \n                        // css file does not exists - try scss\n                        else if (filepath.hasFileExtension('css')) {\n                            const dist_path = transpiler.getDistPath(filepath.getWithFileExtension('scss'), true);\n                            if (dist_path) filepath = dist_path;\n                        }\n                    }\n                   \n                    break;\n                }\n            }\n\n        } catch (e) {\n            console.log(\"error handling HTTP Request:\",e)\n        }\n\n        return filepath;\n    }\n\n\n    protected async generateDirectoryIndex(path: Path.File) {\n        const dirs:directoryIndex = []\n        const files:directoryIndex = []\n\n        for await (const f of Deno.readDir(path.normal_pathname)) {\n            if (f.isDirectory) {\n                // TODO: fix workaround, add ignore list to options\n                if (f.name == \"wpt\" || f.name == \".git\" || f.name == \".vscode\" || f.name == \".datex-cache\") continue;\n                dirs.push({name: f.name, children: await this.generateDirectoryIndex(path.asDir().getChildPath(f.name))})\n            }\n            else {\n                files.push(f.name)\n            }\n        }\n        return [...files, ...dirs]\n    }\n\n\n    public async serveContent(requestEvent: Deno.RequestEvent, type:mime_type, content:ReadableStream | XMLHttpRequestBodyInit, cookies?:Cookie[], status = 200, headers:Record<string, string>|Headers = {}, useDefaultHeaders = true) {\n        const res = this.getContentResponse(type, content, cookies, status, headers, useDefaultHeaders)\n        try {\n            await requestEvent.respondWith(res)\n        } catch {}\n\t}\n\n\n    public getContentResponse(type:mime_type, content:ReadableStream | XMLHttpRequestBodyInit, cookies?:Cookie[], status = 200, headers:Record<string, string>|Headers = {}, useDefaultHeaders = true) {\n        const normalHeaders = headers instanceof Headers ? headers : new Headers(headers);\n        if (this.#options.cors) {\n            normalHeaders.set(\"Access-Control-Allow-Origin\", \"*\")\n            normalHeaders.set(\"Access-Control-Allow-Headers\", \"*\")\n        }\n        normalHeaders.set(\"Content-Type\", type);\n        if (useDefaultHeaders && this.#options.default_headers) {\n            for (const [name, value] of Object.entries(this.#options.default_headers))\n            normalHeaders.set(name, value);\n        }\n\n        const res = new Response(content, {headers:normalHeaders, status});\n        if (cookies) {\n            for (const cookie of cookies) setCookie!(res.headers, cookie);\n        }\n        return res;\n\t}\n\n\n    public sendError(requestEvent: Deno.RequestEvent, status = 500, text = \"Server Error\") {\n        return this.serveContent(requestEvent, 'text/plain', text, [], status, undefined, false)\n    }\n\n    public getErrorResponse(status = 500, text = \"Server Error\") {\n        return this.getContentResponse('text/plain', text, [], status, undefined, false)\n    }\n}\n"],"names":["Datex","getCallerDir","setCookie","Path","addCSSScope","addCSSScopeSelector","getEternalModule","highlightText","serveFile","cache_path","eternalExts","getDirType","app","deleteCookie","getCookie","setCookieUIX","arrayBufferToBase64","base64ToArrayBuffer","Crypto","Target","createSession","validateUnverifiedSession","validateVerifiedSession","unverifiedSessionExists","isSafariClient","SourceMapConsumer","hasDependencyList","UIX_COOKIE","getCachedResponse","logger","Logger","port","customPort","enable_tls","initialize","langsByExtension","defaultKey","defaultCert","globalThis","Deno","flags","parse","args","string","boolean","Number","Server","running","setDefaultHeaders","headers","default_headers","generateDirectoryIndices","generate","directory_indices","transpilers","Map","requestHandlers","Set","connectionHandler","constructor","requestHandler_or_dir","options","URL","config","requestHandler_or_root","path","transpiler","resolve_index_html","dir","add","Object","entries","set","pathHandlers","pathStaticContents","handler_or_content","mime_type","path_request_handler","createPathRequestHandler","resetPath","delete","req","req_path","conn","metadata","handler","match","type","content","serveContent","addRequestHandler","requestHandler","prioritize","getFormattedAddress","listen","undefined","loaders","_path","push","init","Promise","all","server","listenWithFallbackPort","serve","handled","handleConnectionAsHTTP","e","console","error","tryListen","addr","portCachePath","cachedFallbackPort","fs_exists","readTextFile","normal_pathname","isNaN","writeTextFile","toString","listenTls","key","cert","setConnectionHandler","httpConn","serveHttp","requestEvent","handleRequest","catch","respondWith","Response","status","getNonce","endpoint","sign","binary","validateEndpoint","datexEndpointNonceCookie","datexEndpointValidationCookie","datexEndpointCookie","nonce","validation","get","unverifiedSessionCookie","request","Error","Supranet","connected","verify","Runtime","setVerifiedSession","warn","normalized_path","normalizeURL","url","sendError","cacheToken","cachedResponse","cacheTokenCookieName","cacheTokenCookie","startsWith","pathname","split","Headers","body","statusText","_uix_init","isBrowserClient","has","uixSessionCookie","uixUnverifiedSessionCookie","debug","setUnverifiedSessionInit","log","errors","Http","handleHTTPRequest","isSafariLocalhost","hostname","Endpoint","getNewEndpoint","getInstance","unverifiedSession","_endpoint","originalRespondWith","bind","response","value","append","session","req_url","is_dir","decodeURIComponent","ua","test","normalizedPath","res","getResponse","getErrorResponse","getFileSuffix","lineNumber","colNumber","contentType","suffix","matchSuffix","slice","map","x","i","replace","isBrowser","isSafari","newUrl","newNormalizedPath","displayWithSyntaxHighlighting","hasFileExtension","filepath","findFilePath","_app","stage","_base_path","getChildPath","srcDir","proxy","request_proxies","extensions","searchParams","ext","fsExists","scope","scopedCSS","getContentResponse","PageProvider","useDirectiveMatchesForFile","urlString","specifier","eternalModuleSource","fsIsDir","JSON","stringify","generateDirectoryIndex","matchingTsFile","getWithFileExtension","protocol","script","consumer","getSourceMapConsumer","line","col","sourcePath","pos","originalPositionFor","column","highlighted","html","name","cors","provide_module_dependencies","jsFilepath","sourceMap","mapFile","transpile","resolve_ts","tpath","src_dir","dist_path","getDistPath","dirs","files","f","readDir","isDirectory","children","asDir","cookies","useDefaultHeaders","normalHeaders","cookie","text"],"mappings":"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","sourceRoot":"/lib/uix-0.4.39/src/server/","file":"server.ts"}