{"version":3,"sources":["context.ts"],"sourcesContent":["import { StorageMap } from \"datex-core-legacy/types/storage_map.ts\";\nimport { Datex, f } from \"datex-core-legacy\";\nimport { BROADCAST, Endpoint } from \"datex-core-legacy/types/addressing.ts\";\nimport { client_type } from \"datex-core-legacy/utils/constants.ts\";\nimport { UIX_COOKIE, deleteCookie, getCookie } from \"../session/cookies.ts\";\nimport { getSharedDataPointer } from \"../session/shared-data.ts\";\nimport type { datex_meta } from \"datex-core-legacy/utils/global_types.ts\";\n\n// TODO: remove params, use ctx.searchParams instead\nexport type RequestData = {address:string|null}\n\n\n// persistent data\nconst privateData = await Datex.Storage.loadOrCreate(\"UIX.privateData\", () => new StorageMap<Endpoint, Record<string, unknown>>())\nconst emptyMatch = Object.freeze({});\n\n\n/**\n * Context passed to callback functions in entrypoints, e,g.:\n * ```ts\n * // entrypoint.ts\n * export default (ctx: Context) => {\n *    console.log(\"url: \" + ctx.request.url)\n * } satisfies Entrypoint\n * ```\n * The match/urlMatch property contains the values for a preceding url pattern:\n * ```ts\n * // entrypoint.ts\n * export default {\n *    '/:id/:name': (ctx: Context) => ctx.urlMatch.get('name')\n * } satisfies Entrypoint\n * ```\n */\n\n// @ts-ignore\nSymbol.dispose ??= Symbol.for(\"Symbol.dispose\")\n\n\n// @template(\"uix:Context\")\nexport class Context\n\t<\n\t\tCustomSharedData extends Record<string, unknown>|SharedData = SharedData,\n\t\tCustomPrivateData extends Record<any, unknown>|PrivateData = PrivateData\n\t> \n{\n\n\tstatic #sessionFlags = new WeakMap<Endpoint, Map<string, any>>()\n\n\trequest: Request\n\trequestData: RequestData = {\n\t\taddress: null\n\t}\n\n\tpath!: string\n\tparams: Record<string,string> = emptyMatch;\n\turlPattern?: URLPatternResult\n\tsearchParams!: URLSearchParams\n\n\tlanguage = \"en\";\n\tendpoint: Datex.Endpoint = client_type == \"browser\" ? Datex.Runtime.endpoint : BROADCAST\n\tendpointIsTrusted = false\n\t\n\tget responseHeaders() {\n\t\tif (!this._responseHeaders) this._responseHeaders = new Headers();\n\t\treturn this._responseHeaders\n\t}\n\n\tprivate _responseHeaders?: Headers\n\n\t#disposeCallbacks = new Set<()=>void>()\n\n\tasync getPostParams() {\n\t\tif (this.request!.method !== \"POST\") throw new Error(\"Not a POST request\");\n\t\treturn new URLSearchParams(await this.request!.text()!);\n\t}\n\n\t/**\n\t * Returns a shared data record, containing arbitrary key-value pairs.\n\t * This data is separated for each endpoint session and is accessible from the client and the backend \n\t */\n\tasync getSharedData(): Promise<CustomSharedData> {\n\t\tif (client_type === \"browser\") {\n\t\t\tconst { getSharedData } = await import(\"../session/frontend.ts\");\n\t\t\treturn getSharedData() as Promise<CustomSharedData>;\n\t\t}\n\t\telse {\n\t\t\tconst { isSafariClient } = await import(\"../utils/safari.ts\" /*lazy*/);\n\n\t\t\tif (!this.request) throw new Error(\"Cannot get shared data from UIX Context with request object\");\n\t\t\tconst url = new URL(this.request.url);\n\t\t\tconst isSafariLocalhost = url.hostname == \"localhost\" && isSafariClient(this.request);\n\t\t\tconst {sharedData} = await getSharedDataPointer(this.request.headers, this.responseHeaders, url.port, isSafariLocalhost);\n\t\t\tif (sharedData[Symbol.dispose]) this.#disposeCallbacks.add(sharedData[Symbol.dispose]!)\n\t\t\treturn sharedData as CustomSharedData;\n\t\t}\n\t}\n\n\t/**\n\t * Returns a private data record, containing arbitrary key-value pairs.\n\t * This data is separated for each endpoint session and is only accessible from the backend \n\t */\n\tasync getPrivateData(): Promise<CustomPrivateData> {\n\t\t// TODO: don't use main endpoint, only as workaround for now because of unpredicatable endpoint instance switching\n\t\tconst endpoint = this.endpoint.main;\n\t\tthis.validateEndpointForPrivateData(endpoint);\n\t\tif (!await privateData.has(endpoint)) {\n\t\t\tawait privateData.set(endpoint, {})\n\t\t};\n\t\treturn (await privateData.get(endpoint))! as CustomPrivateData;\n\t}\n\n\t/**\n\t * Returns a private data record, containing arbitrary key-value pairs.\n\t * If no data record exists for the endpoint session, null is returned.\n\t * Use getPrivateData() to automatically create a new data record if none exists.\n\t */\n\tasync getPrivateDataWeak() {\n\t\tconst endpoint = this.endpoint.main;\n\t\tthis.validateEndpointForPrivateData(endpoint);\n\t\treturn ((await privateData.get(endpoint)) ?? null) as CustomPrivateData|null;\n\t}\n\n\t/**\n\t * Clears the private data for the endpoint session\n\t */\n\tasync clearPrivateData() {\n\t\t// TODO: don't use main endpoint, only as workaround for now because of unpredicatable endpoint instance switching\n\t\tconst endpoint = this.endpoint.main;\n\t\tthis.validateEndpointForPrivateData(endpoint);\n\t\tawait privateData.delete(endpoint);\n\t}\n\n\t/**\n\t * Throws an error if private endpoint data cannot be accessed\n\t * @param endpoint \n\t */\n\tprivate validateEndpointForPrivateData(endpoint: Datex.Endpoint) {\n\t\tif (client_type == \"browser\") throw new Error(\"Private data is only accessible from the backend\");\n\t\tif (endpoint == BROADCAST) throw new Error(\"Cannot get private data for UIX context, no session found\");\n\t}\n\n\t/**\n\t * Enables edit mode for the current session.\n\t * Allows the user to edit editableTemplate content directly on the website.\n\t */\n\tenableEditMode() {\n\t\tthis.setSessionFlag(\"editMode\");\n\t}\n\t/**\n\t * Disables edit mode for the current session.\n\t */\n\tdisableEditMode() {\n\t\tthis.removeSessionFlag(\"editMode\");\n\t}\n\n\t/**\n\t * Returns the value of a session flag if it is set.\n\t * @param key session flag key\n\t */\n\tgetSessionFlag(key: string) {\n\t\tif (!this.endpoint) throw new Error(\"Cannot set session flag without endpoint\");\n\t\treturn Context.#sessionFlags.get(this.endpoint)?.get(key);\n\t}\n\n\t/**\n\t * Sets a session flag for the current session.\n\t * Important: Don't set the flag to false, use removeSessionFlag instead.\n\t * @param key session flag key\n\t * @param value optional session flag value, defaults: true\n\t */\n\tsetSessionFlag(key: string, value: any = true) {\n\t\tif (!this.endpoint) throw new Error(\"Cannot set session flag without endpoint\");\n\t\tif (!Context.#sessionFlags.has(this.endpoint)) Context.#sessionFlags.set(this.endpoint, new Map());\n\t\tContext.#sessionFlags.get(this.endpoint)!.set(key, value);\n\t}\n\n\t/**\n\t * Removes a session flag for the current session.\n\t * @param key session flag key\n\t */\n\tremoveSessionFlag(key: string) {\n\t\tif (!this.endpoint) throw new Error(\"Cannot delete session flag without endpoint\");\n\t\tContext.#sessionFlags.get(this.endpoint)?.delete(key);\n\t}\n\n\t[Symbol.dispose]() {\n\t\tconsole.log(\"disposing context\", this.#disposeCallbacks);\n\t\tfor (const dispose of this.#disposeCallbacks) dispose();\n\t}\n\n\n\t/**\n\t * Gets the context-bound private data for an endpoint.\n\t * \n\t * Example:\n\t * ```ts\n\t * const endpoint = f('@example')\n\t * const privateData = Context.getPrivateData(endpoint);\n\t * ```\n\t */\n\tstatic async getPrivateData(endpoint: Datex.Endpoint): Promise<PrivateData>\n\t/**\n\t * Gets the context-bound private data. This can be used inside normal functions\n\t * that are called from remote endpoints but do not have access to the UIX context object.\n\t * \n\t * If the calling endpoint cannot be verified, an error is thrown.\n\t * \n\t * Example:\n\t * ```ts\n\t * // backend/functions.ts\n\t * export function doBackendStuff() {\n\t *    const privateData = Context.getPrivateData(datex.meta);\n\t * \t  // ..\n\t * }\n\t * ```\n\t */\n\tstatic async getPrivateData(meta: datex_meta): Promise<PrivateData>\n\tstatic async getPrivateData(endpoint_or_meta: Datex.Endpoint|datex_meta) {\n\t\tlet endpoint = this.getEndpoint(endpoint_or_meta);\n\n\t\t// TODO: don't use main endpoint, only as workaround for now because of unpredicatable endpoint instance switching\n\t\tendpoint = endpoint.main;\n\n\t\tif (!await privateData.has(endpoint)) await privateData.set(endpoint, {});\n\t\treturn (await privateData.get(endpoint))! as PrivateData;\n\t}\n\n\t/**\n\t * Gets the context-bound private data for an endpoint.\n\t * If no data record exists for the endpoint, null is returned.\n\t */\n\tstatic async getPrivateDataWeak(endpoint: Datex.Endpoint): Promise<PrivateData|null>\n\t/**\n\t * Gets the context-bound private data. This can be used inside normal functions\n\t * that are called from remote endpoints but do not have access to the UIX context object.\n\t */\n\tstatic async getPrivateDataWeak(meta: datex_meta): Promise<PrivateData|null>\n\tstatic async getPrivateDataWeak(endpoint_or_meta: Datex.Endpoint|datex_meta) {\n\t\tlet endpoint = this.getEndpoint(endpoint_or_meta);\n\t\t// TODO: don't use main endpoint, only as workaround for now because of unpredicatable endpoint instance switching\n\t\tendpoint = endpoint.main;\n\n\t\treturn ((await privateData.get(endpoint)) ?? null) as PrivateData|null;\n\t}\n\n\t/**\n\t * Clears the private data for an endpoint.\n\t * \n\t * Example:\n\t * ```ts\n\t * const endpoint = f('@example')\n\t * Context.clearPrivateData(endpoint);\n\t * ```\n\t */\n\tstatic async clearPrivateData(endpoint: Datex.Endpoint): Promise<void>\n\t/**\n\t * Clears the private data for the verified caller endpoint.\n\t * \n\t * Example:\n\t * ```ts\n\t * // backend/functions.ts\n\t * export function doBackendStuff() {\n\t *    Context.clearPrivateData(datex.meta);\n\t * \t  // ..\n\t * }\n\t * ```\n\t */\n\tstatic async clearPrivateData(meta: datex_meta): Promise<void>\n\tstatic async clearPrivateData(endpoint_or_meta: Datex.Endpoint|datex_meta) {\n\t\tlet endpoint = this.getEndpoint(endpoint_or_meta);\n\n\t\t// TODO: don't use main endpoint, only as workaround for now because of unpredicatable endpoint instance switching\n\t\tendpoint = endpoint.main;\n\t\tawait privateData.delete(endpoint);\n\t}\n\n\n\tprivate static getEndpoint(endpoint_or_meta: Datex.Endpoint|datex_meta) {\n\t\tif (endpoint_or_meta instanceof Datex.Endpoint) return endpoint_or_meta;\n\t\telse {\n\t\t\tif (!endpoint_or_meta.signed || endpoint_or_meta.local) throw new Error(\"Cannot get private data for unverified endpoint\");\n\t\t\telse return endpoint_or_meta.sender;\n\t\t}\n\t}\n\n\n}\n\nexport class ContextBuilder {\n\n\t#ctx = new Context()\n\n\tpublic static getRequestLanguage(req:Request) {\n\t\tconst port = new URL(req.url).port;\n\t\tconst lang = getCookie(UIX_COOKIE.language, req.headers, port) ?? req.headers.get(\"accept-language\")?.split(\",\")[0]?.split(\";\")[0]?.split(\"-\")[0];\n\t\tif (!lang || lang?.includes(\"*\") || lang?.length !== 2) return \"en\";\n\t\telse return lang;\n\t}\n\n\tsetRequestData(request:Request, path:string, conn?:Deno.Conn) {\n\t\tthis.#ctx.request = request\n\t\tthis.#ctx.requestData.address = request.headers?.get(\"x-real-ip\") ??\n\t\t\t\t\trequest.headers?.get(\"x-forwarded-for\") ?? \n\t\t\t\t\t(conn?.remoteAddr as Deno.NetAddr)?.hostname\n\t\t\n\t\tthis.#ctx.path = path;\n\n\t\tconst ctx = this.#ctx;\n\n\t\tObject.defineProperty(this.#ctx, \"searchParams\", {\n\t\t\tget() {\n\t\t\t\treturn new URL(ctx.request!.url).searchParams\n\t\t\t},\n\t\t})\n\t\n\t\tthis.#ctx.language = ContextBuilder.getRequestLanguage(request);\n\t\tthis.#ctx.endpoint = this.getEndpoint(request) ?? BROADCAST;\n\t\tthis.#ctx.endpointIsTrusted = this.getEndpointIsTrusted(request)\n\n\t\treturn this;\n\t}\n\n\tgetEndpoint(request: Request) {\n\t\treturn getHTTPRequestEndpoint(request, this.#ctx.responseHeaders)\n\t}\n\n\tgetEndpointIsTrusted(request: Request) {\n\t\treturn !!getCookie(\"uix-session\", request.headers, new URL(request.url).port)\n\t}\n\n\tbuild() {\n\t\treturn this.#ctx;\n\t}\n\n}\n\n/**\n * Returns the (validated) endpoint from which a HTTP request was sent\n * @param request \n * @param responseHeaders optional response headers that are modified if cookies are deleted in case of invalid cookie data\n * @returns \n */\nexport function getHTTPRequestEndpoint(request: Request, responseHeaders?: Headers) {\n\tif (!request) return null;\n\tconst port = new URL(request.url).port;\n\tconst endpointCookie = (request as any)._endpoint ?? getCookie(UIX_COOKIE.endpoint, request.headers, port);\n\tif (!endpointCookie) return null;\n\telse {\n\t\ttry {\n\t\t\treturn f(endpointCookie as any);\n\t\t}\n\t\t// invalid cookie content, reset\n\t\tcatch {\n\t\t\tif (responseHeaders) deleteCookie(UIX_COOKIE.endpoint, responseHeaders, port)\n\t\t\treturn null;\n\t\t}\n\t}\n\t// TODO signature validation\n}\n\nexport type ContextGenerator = () => Context"],"names":["StorageMap","Datex","f","BROADCAST","client_type","UIX_COOKIE","deleteCookie","getCookie","getSharedDataPointer","privateData","Storage","loadOrCreate","emptyMatch","Object","freeze","Symbol","dispose","for","Context","WeakMap","request","requestData","address","path","params","urlPattern","searchParams","language","endpoint","Runtime","endpointIsTrusted","responseHeaders","_responseHeaders","Headers","Set","getPostParams","method","Error","URLSearchParams","text","getSharedData","isSafariClient","url","URL","isSafariLocalhost","hostname","sharedData","headers","port","add","getPrivateData","main","validateEndpointForPrivateData","has","set","get","getPrivateDataWeak","clearPrivateData","delete","enableEditMode","setSessionFlag","disableEditMode","removeSessionFlag","getSessionFlag","key","value","Map","console","log","endpoint_or_meta","getEndpoint","Endpoint","signed","local","sender","ContextBuilder","getRequestLanguage","req","lang","split","includes","length","setRequestData","conn","remoteAddr","ctx","defineProperty","getEndpointIsTrusted","getHTTPRequestEndpoint","build","endpointCookie","_endpoint"],"mappings":"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","sourceRoot":"/lib/uix-0.4.39/src/routing/","file":"context.ts"}