Feat : Setup cloudflare worker for cloud endpoint
This commit is contained in:
88
cloud/src/services/storage.js
Normal file
88
cloud/src/services/storage.js
Normal file
@@ -0,0 +1,88 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user