UNPKG

@open-condo/miniapp-utils

Version:

A set of helper functions / components / hooks used to build new condo apps fast

174 lines (169 loc) 6.47 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/helpers/sender.ts var sender_exports = {}; __export(sender_exports, { FINGERPRINT_ID_COOKIE_NAME: () => FINGERPRINT_ID_COOKIE_NAME, FINGERPRINT_ID_LENGTH: () => FINGERPRINT_ID_LENGTH, generateFingerprint: () => generateFingerprint, getClientSideFingerprint: () => getClientSideFingerprint, getClientSideSenderInfo: () => getClientSideSenderInfo }); module.exports = __toCommonJS(sender_exports); var import_cookies_next2 = require("cookies-next"); // src/helpers/embeddingContext.tsx var import_cookies_next = require("cookies-next"); var import_react = __toESM(require("react")); var import_zod = require("zod"); // src/helpers/uuid.ts var import_crypto = require("crypto"); function generateUUIDv4() { let randomValues; if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") { return crypto.randomUUID(); } else if (typeof window !== "undefined" && window.crypto && window.crypto.getRandomValues) { randomValues = new Uint8Array(16); window.crypto.getRandomValues(randomValues); } else { randomValues = (0, import_crypto.randomBytes)(16); } randomValues[6] = randomValues[6] & 15 | 64; randomValues[8] = randomValues[8] & 63 | 128; return [...randomValues].map((value, index) => { const hex = value.toString(16).padStart(2, "0"); if (index === 4 || index === 6 || index === 8 || index === 10) { return `-${hex}`; } return hex; }).join(""); } // src/helpers/embeddingContext.tsx var EMBEDDING_CONTEXT_COOKIE_NAME = "embeddingContext"; var EMBEDDING_CONTEXT_QUERY_PARAM = "embeddingContext"; var EMBEDDING_CONTEXT_SCHEMA = import_zod.z.strictObject({ dv: import_zod.z.literal(1), app: import_zod.z.strictObject({ id: import_zod.z.string(), version: import_zod.z.string().optional(), build: import_zod.z.string().optional() }), platform: import_zod.z.enum(["iOS", "Android", "web"]), os: import_zod.z.strictObject({ name: import_zod.z.string(), version: import_zod.z.string().optional() }).optional(), device: import_zod.z.strictObject({ id: import_zod.z.string() }) }); var EMBEDDING_CONTEXT_WITH_SOURCE_SCHEMA = import_zod.z.strictObject({ ctx: EMBEDDING_CONTEXT_SCHEMA, source: import_zod.z.enum(["query", "cookie"]) }); var IS_PRIMARY_ALIVE_MESSAGE_SCHEMA = import_zod.z.object({ type: import_zod.z.literal("EmbeddingContextPrimaryPolling"), data: import_zod.z.strictObject({ requestId: import_zod.z.string() }) }); var IS_PRIMARY_ALIVE_RESPONSE_SCHEMA = import_zod.z.object({ type: import_zod.z.literal("EmbeddingContextPrimaryPollingResult"), data: import_zod.z.strictObject({ requestId: import_zod.z.string(), isPrimary: import_zod.z.boolean() }) }); var ReactEmbeddingContext = (0, import_react.createContext)(null); function b64toContext(b64) { try { const bytes = Uint8Array.from(atob(b64), (c) => c.charCodeAt(0)); const decodedUTFString = new TextDecoder().decode(bytes); const parsedCtx = JSON.parse(decodedUTFString); return EMBEDDING_CONTEXT_SCHEMA.parse(parsedCtx); } catch { return null; } } function getEmbeddingContext(req, res) { try { const queryParamValue = req ? new URL(req.url ?? "/", "https://_").searchParams.get(EMBEDDING_CONTEXT_QUERY_PARAM) : new URLSearchParams(window.location.search).get(EMBEDDING_CONTEXT_QUERY_PARAM); if (queryParamValue) { const ctx = b64toContext(decodeURIComponent(queryParamValue)); if (ctx) return { ctx, source: "query" }; } } catch { } const cookieValue = (0, import_cookies_next.getCookie)(EMBEDDING_CONTEXT_COOKIE_NAME, { req, res }); if (cookieValue) { const ctx = b64toContext(cookieValue); if (ctx) return { ctx, source: "cookie" }; } return null; } // src/helpers/sender.ts var FINGERPRINT_ID_COOKIE_NAME = "fingerprint"; var FINGERPRINT_ID_LENGTH = 32; var VERY_LONG_MAX_AGE_IN_SECONDS = Math.pow(2, 31) - 1; function makeId(length) { const croppedLength = Math.min(length, 32); return generateUUIDv4().replaceAll("-", "").substring(0, croppedLength); } function generateFingerprint() { return makeId(FINGERPRINT_ID_LENGTH); } function getClientSideFingerprint() { const embeddingContext = getEmbeddingContext(); if (embeddingContext) { return embeddingContext.ctx.device.id; } let fingerprint = (0, import_cookies_next2.getCookie)(FINGERPRINT_ID_COOKIE_NAME); if (!fingerprint) { fingerprint = generateFingerprint(); } (0, import_cookies_next2.setCookie)(FINGERPRINT_ID_COOKIE_NAME, fingerprint, { maxAge: VERY_LONG_MAX_AGE_IN_SECONDS // no "maxAge" or "expires" means that cookie clears when session ends (f.e. when browser closes) }); return fingerprint; } function getClientSideSenderInfo() { return { dv: 1, fingerprint: getClientSideFingerprint() }; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { FINGERPRINT_ID_COOKIE_NAME, FINGERPRINT_ID_LENGTH, generateFingerprint, getClientSideFingerprint, getClientSideSenderInfo }); //# sourceMappingURL=sender.js.map