- Admin dashboard (/admin/consent-logs) with password auth - Consent API (/api/consent) with SQLite + IP hashing - Privacy Policy (Thai) - PDPA Section 36 compliant - Terms & Conditions (Thai) - 9 standard clauses - .env.example template with Umami placeholder All pages preserve current design system.
86 lines
2.0 KiB
JavaScript
86 lines
2.0 KiB
JavaScript
import { impossible } from "../util.js";
|
|
export function Stmt(w, msg) {
|
|
if (msg.sql !== undefined) {
|
|
w.string(1, msg.sql);
|
|
}
|
|
if (msg.sqlId !== undefined) {
|
|
w.int32(2, msg.sqlId);
|
|
}
|
|
for (const arg of msg.args) {
|
|
w.message(3, arg, Value);
|
|
}
|
|
for (const arg of msg.namedArgs) {
|
|
w.message(4, arg, NamedArg);
|
|
}
|
|
w.bool(5, msg.wantRows);
|
|
}
|
|
function NamedArg(w, msg) {
|
|
w.string(1, msg.name);
|
|
w.message(2, msg.value, Value);
|
|
}
|
|
export function Batch(w, msg) {
|
|
for (const step of msg.steps) {
|
|
w.message(1, step, BatchStep);
|
|
}
|
|
}
|
|
function BatchStep(w, msg) {
|
|
if (msg.condition !== undefined) {
|
|
w.message(1, msg.condition, BatchCond);
|
|
}
|
|
w.message(2, msg.stmt, Stmt);
|
|
}
|
|
function BatchCond(w, msg) {
|
|
if (msg.type === "ok") {
|
|
w.uint32(1, msg.step);
|
|
}
|
|
else if (msg.type === "error") {
|
|
w.uint32(2, msg.step);
|
|
}
|
|
else if (msg.type === "not") {
|
|
w.message(3, msg.cond, BatchCond);
|
|
}
|
|
else if (msg.type === "and") {
|
|
w.message(4, msg.conds, BatchCondList);
|
|
}
|
|
else if (msg.type === "or") {
|
|
w.message(5, msg.conds, BatchCondList);
|
|
}
|
|
else if (msg.type === "is_autocommit") {
|
|
w.message(6, undefined, Empty);
|
|
}
|
|
else {
|
|
throw impossible(msg, "Impossible type of BatchCond");
|
|
}
|
|
}
|
|
function BatchCondList(w, msg) {
|
|
for (const cond of msg) {
|
|
w.message(1, cond, BatchCond);
|
|
}
|
|
}
|
|
function Value(w, msg) {
|
|
if (msg === null) {
|
|
w.message(1, undefined, Empty);
|
|
}
|
|
else if (typeof msg === "bigint") {
|
|
w.sint64(2, msg);
|
|
}
|
|
else if (typeof msg === "number") {
|
|
w.double(3, msg);
|
|
}
|
|
else if (typeof msg === "string") {
|
|
w.string(4, msg);
|
|
}
|
|
else if (msg instanceof Uint8Array) {
|
|
w.bytes(5, msg);
|
|
}
|
|
else if (msg === undefined) {
|
|
// do nothing
|
|
}
|
|
else {
|
|
throw impossible(msg, "Impossible type of Value");
|
|
}
|
|
}
|
|
function Empty(_w, _msg) {
|
|
// do nothing
|
|
}
|