openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
54 lines (53 loc) • 1.99 kB
JavaScript
import { i as generateSecureToken } from "./secure-random-B2AO8OrW.mjs";
import { n as executeDevicePairingMutation } from "./device-pairing-worker-BX2CH8m1.mjs";
import { n as decodePairingSetupCode, r as encodePairingSetupCode } from "./setup-code-CJv9aVM5.mjs";
import { t as isDevicePairingJoinCode } from "./join-code-B_OfdZ-j.mjs";
//#region src/infra/device-pairing-join-code.ts
/** Register one setup payload under a random 128-bit shortcode. */
async function registerDevicePairingJoinCode(params) {
const createdAtMs = Date.now();
const expiresAtMs = params.expiresAtMs;
const assertCallerCurrent = params.assertCurrent;
const assertCurrent = () => {
assertCallerCurrent?.();
if (!Number.isSafeInteger(expiresAtMs) || expiresAtMs <= Date.now()) throw new Error("Device pairing join code requires a future expiry.");
};
assertCurrent();
const payloadJson = JSON.stringify(decodePairingSetupCode(encodePairingSetupCode(params.payload)));
const shortcode = generateSecureToken(16);
await executeDevicePairingMutation({
type: "devicePairing.registerJoinCode",
input: {
shortcode,
payloadJson,
createdAtMs,
expiresAtMs
}
}, {
context: params.context,
assertCurrent
});
assertCurrent();
return shortcode;
}
/** Atomically burn one live shortcode and return its validated setup payload. */
async function redeemDevicePairingJoinCode(params) {
const shortcode = params.shortcode.trim();
if (!isDevicePairingJoinCode(shortcode)) return null;
const row = await executeDevicePairingMutation({
type: "devicePairing.redeemJoinCode",
input: { shortcode }
}, {
context: params.context,
assertCurrent: params.assertCurrent
});
const nowMs = Date.now();
if (!row || row.expires_at_ms <= nowMs) return null;
try {
return decodePairingSetupCode(Buffer.from(row.payload_json, "utf8").toString("base64url"), { nowMs });
} catch {
return null;
}
}
//#endregion
export { registerDevicePairingJoinCode as n, redeemDevicePairingJoinCode as t };