miniflare
Version:
Fun, full-featured, fully-local simulator for Cloudflare Workers
68 lines (66 loc) • 2.78 kB
JavaScript
// src/plugins/core/constants.ts
var CORE_PLUGIN_NAME = "core", SERVICE_ENTRY = `${CORE_PLUGIN_NAME}:entry`, SERVICE_LOCAL_EXPLORER = `${CORE_PLUGIN_NAME}:local-explorer`, LOCAL_EXPLORER_DISK = `${CORE_PLUGIN_NAME}:local-explorer-disk`, SERVICE_USER_PREFIX = `${CORE_PLUGIN_NAME}:user`, SERVICE_BUILTIN_PREFIX = `${CORE_PLUGIN_NAME}:builtin`, SERVICE_CUSTOM_FETCH_PREFIX = `${CORE_PLUGIN_NAME}:custom-fetch`, SERVICE_CUSTOM_NODE_PREFIX = `${CORE_PLUGIN_NAME}:custom-node`;
var INTROSPECT_SQLITE_METHOD = "__miniflare_introspectSqlite", GET_DO_NAME_METHOD = "__miniflare_getDOName";
// src/workers/core/do-wrapper.worker.ts
function createDurableObjectWrapper(UserClass) {
class Wrapper extends UserClass {
constructor(ctx, env) {
super(ctx, env), ctx.id.name !== void 0 && ctx.blockConcurrencyWhile(async () => {
let sql = ctx.storage.sql;
sql && (sql.exec(
"CREATE TABLE IF NOT EXISTS __miniflare_do_name (id INTEGER PRIMARY KEY, name TEXT)"
), sql.exec(
"INSERT OR REPLACE INTO __miniflare_do_name (id, name) VALUES (1, ?)",
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guarded by outer if
ctx.id.name
));
});
}
/**
* Returns the DO instance name from ctx.id.name if available:
*/
[GET_DO_NAME_METHOD]() {
if (this.ctx.id.name !== void 0)
return this.ctx.id.name;
let sql = this.ctx.storage.sql;
if (sql)
try {
let row = sql.exec("SELECT name FROM __miniflare_do_name WHERE id = 1").one();
if (typeof row?.name == "string")
return row.name;
} catch {
}
}
/**
* Execute SQL queries against the DO's SQLite storage.
* If multiple queries are provided, they run in a transaction.
*/
[INTROSPECT_SQLITE_METHOD](queries) {
let sql = this.ctx.storage.sql;
if (!sql)
throw new Error(
"This Durable Object does not have SQLite storage enabled"
);
let executeQuery = (query) => {
let cursor = sql.exec(query.sql, ...query.params ?? []);
return {
columns: cursor.columnNames,
rows: Array.from(cursor.raw()),
meta: {
rows_read: cursor.rowsRead,
rows_written: cursor.rowsWritten
}
};
}, results = [];
return queries.length > 1 ? this.ctx.storage.transactionSync(() => {
for (let query of queries)
results.push(executeQuery(query));
}) : results.push(executeQuery(queries[0])), results;
}
}
return Object.defineProperty(Wrapper, "name", { value: UserClass.name }), Wrapper;
}
export {
createDurableObjectWrapper
};
//# sourceMappingURL=do-wrapper.worker.js.map