Files
9router/cloud/src/services/storage.js

88 lines
2.5 KiB
JavaScript

import * as log from "../utils/logger.js";
// Request-scoped cache for getMachineData (avoids multiple D1 queries per request)
const requestCache = new Map();
const CACHE_TTL_MS = 5000;
/**
* Get machine data from D1 (with request-scope caching)
* @param {string} machineId
* @param {Object} env
* @returns {Promise<Object|null>}
*/
export async function getMachineData(machineId, env) {
const cached = requestCache.get(machineId);
if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {
return cached.data;
}
const row = await env.DB.prepare("SELECT data FROM machines WHERE machineId = ?")
.bind(machineId)
.first();
if (!row) {
log.debug("STORAGE", `Not found: ${machineId}`);
return null;
}
const data = JSON.parse(row.data);
requestCache.set(machineId, { data, timestamp: Date.now() });
log.debug("STORAGE", `Retrieved: ${machineId}`);
return data;
}
/**
* Save machine data to D1
* @param {string} machineId
* @param {Object} data
* @param {Object} env
*/
export async function saveMachineData(machineId, data, env) {
const now = new Date().toISOString();
data.updatedAt = now;
// Upsert to D1
await env.DB.prepare(`
INSERT INTO machines (machineId, data, updatedAt)
VALUES (?, ?, ?)
ON CONFLICT(machineId) DO UPDATE SET data = ?, updatedAt = ?
`)
.bind(machineId, JSON.stringify(data), now, JSON.stringify(data), now)
.run();
// Update cache after save
requestCache.set(machineId, { data, timestamp: Date.now() });
log.debug("STORAGE", `Saved: ${machineId}`);
}
/**
* Delete machine data from D1
* @param {string} machineId
* @param {Object} env
*/
export async function deleteMachineData(machineId, env) {
await env.DB.prepare("DELETE FROM machines WHERE machineId = ?")
.bind(machineId)
.run();
// Clear cache after delete
requestCache.delete(machineId);
log.debug("STORAGE", `Deleted: ${machineId}`);
}
/**
* Update specific fields in machine data (for token refresh, rate limit, etc.)
* @param {string} machineId
* @param {string} connectionId
* @param {Object} updates
* @param {Object} env
*/
export async function updateMachineProvider(machineId, connectionId, updates, env) {
const data = await getMachineData(machineId, env);
if (!data?.providers?.[connectionId]) return;
Object.assign(data.providers[connectionId], updates);
data.providers[connectionId].updatedAt = new Date().toISOString();
await saveMachineData(machineId, data, env);
}