UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

57 lines (56 loc) 2.94 kB
import { a as getNodeSqliteKysely, i as executeSqliteQueryTakeFirstSync, r as executeSqliteQuerySync } from "./kysely-sync-COmh4HWh.js"; import { E as ensureDevicePairingJoinCodeSchema, s as runOpenClawStateWriteTransaction } from "./openclaw-state-db-BRTnL-D8.js"; import { i as generateSecureToken } from "./secure-random-Ds4AFLgz.js"; import { n as encodePairingSetupCode, t as decodePairingSetupCode } from "./setup-code-Dv85EyDz.js"; import { t as isDevicePairingJoinCode } from "./join-code-B_OfdZ-j.js"; //#region src/infra/device-pairing-join-code.ts const initializedDatabases = /* @__PURE__ */ new WeakSet(); function ensureJoinCodeSchema(database) { if (initializedDatabases.has(database)) return; ensureDevicePairingJoinCodeSchema(database); initializedDatabases.add(database); } function validatePairingSetupPayload(payload) { return decodePairingSetupCode(encodePairingSetupCode(payload)); } /** Register one setup payload under a random 128-bit shortcode. */ function registerDevicePairingJoinCode(params) { const createdAtMs = Date.now(); if (!Number.isSafeInteger(params.expiresAtMs) || params.expiresAtMs <= createdAtMs) throw new Error("Device pairing join code requires a future expiry."); const payloadJson = JSON.stringify(validatePairingSetupPayload(params.payload)); const shortcode = generateSecureToken(16); runOpenClawStateWriteTransaction(({ db }) => { ensureJoinCodeSchema(db); const kysely = getNodeSqliteKysely(db); executeSqliteQuerySync(db, kysely.deleteFrom("device_pairing_join_codes").where("expires_at_ms", "<=", createdAtMs)); executeSqliteQuerySync(db, kysely.insertInto("device_pairing_join_codes").values({ shortcode, payload_json: payloadJson, created_at_ms: createdAtMs, expires_at_ms: params.expiresAtMs })); }, params.database); return shortcode; } /** Atomically burn one live shortcode and return its validated setup payload. */ function redeemDevicePairingJoinCode(params) { const shortcode = params.shortcode.trim(); if (!isDevicePairingJoinCode(shortcode)) return null; const nowMs = Date.now(); const payloadJson = runOpenClawStateWriteTransaction(({ db }) => { ensureJoinCodeSchema(db); const kysely = getNodeSqliteKysely(db); executeSqliteQuerySync(db, kysely.deleteFrom("device_pairing_join_codes").where("expires_at_ms", "<=", nowMs)); const row = executeSqliteQueryTakeFirstSync(db, kysely.selectFrom("device_pairing_join_codes").select("payload_json").where("shortcode", "=", shortcode)); executeSqliteQuerySync(db, kysely.deleteFrom("device_pairing_join_codes").where("shortcode", "=", shortcode)); return row?.payload_json; }, params.database); if (typeof payloadJson !== "string") return null; try { return decodePairingSetupCode(Buffer.from(payloadJson, "utf8").toString("base64url"), { nowMs }); } catch { return null; } } //#endregion export { registerDevicePairingJoinCode as n, redeemDevicePairingJoinCode as t };