checkpoint
This commit is contained in:
parent
fbc3c864eb
commit
acc85512c5
File diff suppressed because one or more lines are too long
|
|
@ -119,8 +119,6 @@ export const SyncActions = {
|
||||||
| { type: "startup-check" }
|
| { type: "startup-check" }
|
||||||
| { type: "startup-run" }
|
| { type: "startup-run" }
|
||||||
| { type: "startup-stop" }
|
| { type: "startup-stop" }
|
||||||
// | { type: "push-typings"; body: Uint8Array; hash: number }
|
|
||||||
| { type: "check-typings"; hash: number }
|
|
||||||
))
|
))
|
||||||
| { type: "flush-page-cache"; page_id: string }
|
| { type: "flush-page-cache"; page_id: string }
|
||||||
) =>
|
) =>
|
||||||
|
|
@ -137,10 +135,6 @@ export const SyncActions = {
|
||||||
| {
|
| {
|
||||||
type: "startup-stop";
|
type: "startup-stop";
|
||||||
status: "running" | "stopped";
|
status: "running" | "stopped";
|
||||||
}
|
|
||||||
| {
|
|
||||||
type: "check-typings";
|
|
||||||
hash: boolean;
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,10 @@
|
||||||
import { Subprocess, spawn } from "bun";
|
import { Subprocess, spawn } from "bun";
|
||||||
import { waitUntil } from "web-utils";
|
import { waitUntil } from "web-utils";
|
||||||
import { SAction } from "../actions";
|
import { SAction } from "../actions";
|
||||||
|
import { code } from "../code/code";
|
||||||
import { docs } from "../entity/docs";
|
import { docs } from "../entity/docs";
|
||||||
import { snapshot } from "../entity/snapshot";
|
import { snapshot } from "../entity/snapshot";
|
||||||
import { SyncConnection } from "../type";
|
import { SyncConnection } from "../type";
|
||||||
import { dirAsync } from "fs-jetpack";
|
|
||||||
import path from "path";
|
|
||||||
import { gunzipAsync } from "../entity/zlib";
|
|
||||||
import { prismaExtendType } from "../../../../web/src/utils/script/prisma-extend";
|
|
||||||
import { code } from "../code/code";
|
|
||||||
|
|
||||||
const decoder = new TextDecoder();
|
const decoder = new TextDecoder();
|
||||||
const code_startup = {
|
const code_startup = {
|
||||||
|
|
@ -73,53 +69,5 @@ export const code_action: SAction["code"]["action"] = async function (
|
||||||
delete docs.page[page_id];
|
delete docs.page[page_id];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "check-typings": {
|
|
||||||
const dir = code.path(arg.site_id, "site", "src", "typings");
|
|
||||||
try {
|
|
||||||
if (
|
|
||||||
(await Bun.file(path.join(dir, "hash")).text()) ===
|
|
||||||
arg.hash.toString()
|
|
||||||
) {
|
|
||||||
return { type: "check-typings", hash: true };
|
|
||||||
}
|
|
||||||
} catch (e) {}
|
|
||||||
return { type: "check-typings", hash: false };
|
|
||||||
}
|
|
||||||
// case "push-typings": {
|
|
||||||
// const dir = code.path(arg.site_id, "site", "src", "typings");
|
|
||||||
// await dirAsync(dir);
|
|
||||||
// await dirAsync(path.join(dir, "runtime"));
|
|
||||||
// Bun.write(Bun.file(path.join(dir, "hash")), arg.hash.toString());
|
|
||||||
// const res = JSON.parse(decoder.decode(await gunzipAsync(arg.body)));
|
|
||||||
// await Bun.write(Bun.file(path.join(dir, "api.d.ts")), res.api);
|
|
||||||
// await Bun.write(
|
|
||||||
// Bun.file(path.join(dir, "prisma.d.ts")),
|
|
||||||
// res.prisma["prisma.d.ts"]
|
|
||||||
// );
|
|
||||||
// await Bun.write(
|
|
||||||
// Bun.file(path.join(dir, "runtime/index.d.ts")),
|
|
||||||
// res.prisma["runtime/index.d.ts"]
|
|
||||||
// );
|
|
||||||
// await Bun.write(
|
|
||||||
// Bun.file(path.join(dir, "runtime/library.d.ts")),
|
|
||||||
// res.prisma["runtime/library.d.ts"]
|
|
||||||
// );
|
|
||||||
// await Bun.write(
|
|
||||||
// Bun.file(path.join(dir, "global.d.ts")),
|
|
||||||
// codeGlobalTypings.replace(
|
|
||||||
// `declare global {`,
|
|
||||||
// `declare global {
|
|
||||||
// const db: prisma.PrismaClient & ${prismaExtendType};
|
|
||||||
// `
|
|
||||||
// )
|
|
||||||
// );
|
|
||||||
|
|
||||||
// Bun.spawn({
|
|
||||||
// cmd: ["chmod", "-R", "777", "."],
|
|
||||||
// cwd: code.path(arg.site_id, "site", "src"),
|
|
||||||
// });
|
|
||||||
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
import type * as SRVAPI from "gen/srv/api/srv";
|
import type * as SRVAPI from "gen/srv/api/srv";
|
||||||
import { Server, WebSocketHandler } from "bun";
|
import { Server, WebSocketHandler } from "bun";
|
||||||
import prisma from "./prisma";
|
import prisma from "./prisma";
|
||||||
|
import { PrismaExtend } from "./prisma.ext";
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
type Api = typeof SRVAPI;
|
type Api = typeof SRVAPI;
|
||||||
|
|
@ -9,48 +10,7 @@ declare global {
|
||||||
const api: { [k in ApiName]: Awaited<Api[k]["handler"]>["_"]["api"] } & {
|
const api: { [k in ApiName]: Awaited<Api[k]["handler"]>["_"]["api"] } & {
|
||||||
_raw: any;
|
_raw: any;
|
||||||
};
|
};
|
||||||
const db: prisma.PrismaClient & {
|
const db: prisma.PrismaClient & PrismaExtend;
|
||||||
_batch: {
|
|
||||||
update: (
|
|
||||||
batch: {
|
|
||||||
table: string;
|
|
||||||
data: any;
|
|
||||||
where: any;
|
|
||||||
}[]
|
|
||||||
) => Promise<void>;
|
|
||||||
};
|
|
||||||
_schema: {
|
|
||||||
tables: () => Promise<string[]>;
|
|
||||||
columns: (table: string) => Promise<
|
|
||||||
Record<
|
|
||||||
string,
|
|
||||||
{
|
|
||||||
is_pk: boolean;
|
|
||||||
type: string;
|
|
||||||
optional: boolean;
|
|
||||||
db_type: string;
|
|
||||||
default?: any;
|
|
||||||
}
|
|
||||||
>
|
|
||||||
>;
|
|
||||||
rels: (table: string) => Promise<
|
|
||||||
Record<
|
|
||||||
string,
|
|
||||||
{
|
|
||||||
type: "has-many" | "has-one";
|
|
||||||
to: {
|
|
||||||
table: string;
|
|
||||||
fields: string[];
|
|
||||||
};
|
|
||||||
from: {
|
|
||||||
table: string;
|
|
||||||
fields: string[];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
>
|
|
||||||
>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
type PrasiServer = {
|
type PrasiServer = {
|
||||||
ws?: WebSocketHandler<{ url: string }>;
|
ws?: WebSocketHandler<{ url: string }>;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
import { Prisma, PrismaClient } from "./prisma";
|
||||||
|
|
||||||
|
export type PrismaExtend = {
|
||||||
|
_batch: {
|
||||||
|
update: <T extends Prisma.ModelName>(
|
||||||
|
batch: {
|
||||||
|
table: T;
|
||||||
|
data: Exclude<
|
||||||
|
Parameters<PrismaClient["location"]["update"]>[0],
|
||||||
|
undefined
|
||||||
|
>["data"];
|
||||||
|
where: Exclude<
|
||||||
|
Parameters<PrismaClient["location"]["findMany"]>[0],
|
||||||
|
undefined
|
||||||
|
>["where"];
|
||||||
|
}[]
|
||||||
|
) => Promise<void>;
|
||||||
|
upsert: <T extends Prisma.ModelName>(arg: {
|
||||||
|
table: T;
|
||||||
|
where: Exclude<
|
||||||
|
Parameters<PrismaClient["location"]["findMany"]>[0],
|
||||||
|
undefined
|
||||||
|
>["where"];
|
||||||
|
data: Exclude<
|
||||||
|
Parameters<PrismaClient["location"]["create"]>[0],
|
||||||
|
undefined
|
||||||
|
>["data"][];
|
||||||
|
}) => Promise<void>;
|
||||||
|
};
|
||||||
|
_schema: {
|
||||||
|
tables: () => Promise<Prisma.ModelName[]>;
|
||||||
|
columns: (table: Prisma.ModelName) => Promise<
|
||||||
|
Record<
|
||||||
|
string,
|
||||||
|
{
|
||||||
|
is_pk: boolean;
|
||||||
|
type: string;
|
||||||
|
optional: boolean;
|
||||||
|
db_type: string;
|
||||||
|
default?: any;
|
||||||
|
}
|
||||||
|
>
|
||||||
|
>;
|
||||||
|
rels: (table: Prisma.ModelName) => Promise<
|
||||||
|
Record<
|
||||||
|
string,
|
||||||
|
{
|
||||||
|
type: "has-many" | "has-one";
|
||||||
|
to: {
|
||||||
|
table: Prisma.ModelName;
|
||||||
|
fields: string[];
|
||||||
|
};
|
||||||
|
from: {
|
||||||
|
table: Prisma.ModelName;
|
||||||
|
fields: string[];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
>
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
import { $ } from "bun";
|
import { $ } from "bun";
|
||||||
import { dir } from "dir";
|
import { dir } from "dir";
|
||||||
import { exists, dirAsync } from "fs-jetpack";
|
import { exists, dirAsync } from "fs-jetpack";
|
||||||
|
import { removeAsync } from "fs-jetpack";
|
||||||
|
import { g } from "utils/global";
|
||||||
|
|
||||||
export const ensureLib = async (src_dir: string, id_site: string) => {
|
export const ensureLib = async (src_dir: string, id_site: string) => {
|
||||||
if (!exists(dir.data(src_dir))) {
|
if (!exists(dir.data(src_dir))) {
|
||||||
|
|
@ -8,8 +10,38 @@ export const ensureLib = async (src_dir: string, id_site: string) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!exists(dir.data(`${src_dir}/lib`))) {
|
if (!exists(dir.data(`${src_dir}/lib`))) {
|
||||||
console.log(`${src_dir}/lib not found.`);
|
|
||||||
const _ = $.cwd(dir.data(src_dir));
|
const _ = $.cwd(dir.data(src_dir));
|
||||||
await _`git clone https://github.com/avolut/prasi-lib lib`;
|
await _`git clone https://github.com/avolut/prasi-lib lib`;
|
||||||
}
|
}
|
||||||
|
if (true || !exists(dir.data(`${src_dir}/typings`))) {
|
||||||
|
try {
|
||||||
|
const site = await _db.site.findFirst({
|
||||||
|
where: { id: id_site },
|
||||||
|
select: {
|
||||||
|
config: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (site) {
|
||||||
|
const config = site.config as any;
|
||||||
|
if (config.api_url) {
|
||||||
|
new URL(config.api_url);
|
||||||
|
const url = `${config.api_url}/_prasi/load.js?dev=1`;
|
||||||
|
|
||||||
|
const res = await fetch(url);
|
||||||
|
const apires = await res.text();
|
||||||
|
|
||||||
|
const fn = new Function("window", "location", apires);
|
||||||
|
const w = {} as any;
|
||||||
|
fn(w, { href: "http://127.0.0.1" });
|
||||||
|
|
||||||
|
const { prismaTypes } = w.prasiApi["http://127.0.0.1/"];
|
||||||
|
for (const [k, v] of Object.entries(prismaTypes)) {
|
||||||
|
await Bun.write(dir.data(`${src_dir}/typings/${k}`), v as any);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -144,6 +144,11 @@ declare global {
|
||||||
where: any
|
where: any
|
||||||
}[]
|
}[]
|
||||||
) => Promise<void>;
|
) => Promise<void>;
|
||||||
|
upsert: (arg: {
|
||||||
|
table: string;
|
||||||
|
where: any;
|
||||||
|
data: any[];
|
||||||
|
}) => Promise<void>;
|
||||||
};
|
};
|
||||||
_schema: {
|
_schema: {
|
||||||
tables: () => Promise<string[]>;
|
tables: () => Promise<string[]>;
|
||||||
|
|
@ -318,4 +323,4 @@ ${e}`,c.pop(),`[${t}]`}let I=Object.keys(s),h=I.length;if(0===h)return"{}";if(g<
|
||||||
${d}`,p="",f="",u=Math.min(h,l);a(s)&&(p+=B(s,E,l),I=I.slice(s.length),u-=s.length,f=E),r&&(I=n(I)),c.push(s);for(let e=0;e<u;e++){let t=I[e],i=A(t,s[t],c,C,d);void 0!==i&&(p+=`${f}${o(t)}: ${i}`,f=E)}return h>l&&(p+=`${f}"...": "${Q(h-l)} not stringified"`,f=E),""!==f&&(p=`
|
${d}`,p="",f="",u=Math.min(h,l);a(s)&&(p+=B(s,E,l),I=I.slice(s.length),u-=s.length,f=E),r&&(I=n(I)),c.push(s);for(let e=0;e<u;e++){let t=I[e],i=A(t,s[t],c,C,d);void 0!==i&&(p+=`${f}${o(t)}: ${i}`,f=E)}return h>l&&(p+=`${f}"...": "${Q(h-l)} not stringified"`,f=E),""!==f&&(p=`
|
||||||
${d}${p}
|
${d}${p}
|
||||||
${e}`),c.pop(),`{${p}}`}case"number":return isFinite(s)?String(s):e?e(s):"null";case"boolean":return!0===s?"true":"false";case"undefined":return;case"bigint":if(I)return String(s);default:return e?e(s):void 0}}("",A,[],c,"")}return function A(i,s,c){switch(typeof s){case"string":return o(s);case"object":{if(null===s)return"null";if("function"==typeof s.toJSON){if("object"!=typeof(s=s.toJSON(i)))return A(i,s,c);if(null===s)return"null"}if(-1!==c.indexOf(s))return t;let e="";if(Array.isArray(s)){if(0===s.length)return"[]";if(g<c.length+1)return'"[Array]"';c.push(s);let t=Math.min(s.length,l),i=0;for(;i<t-1;i++){let t=A(String(i),s[i],c);e+=(void 0!==t?t:"null")+","}let I=A(String(i),s[i],c);if(e+=void 0!==I?I:"null",s.length-1>l){let A=s.length-l-1;e+=`,"... ${Q(A)} not stringified"`}return c.pop(),`[${e}]`}let I=Object.keys(s),C=I.length;if(0===C)return"{}";if(g<c.length+1)return'"[Object]"';let d="",h=Math.min(C,l);a(s)&&(e+=B(s,",",l),I=I.slice(s.length),h-=s.length,d=","),r&&(I=n(I)),c.push(s);for(let t=0;t<h;t++){let i=I[t],r=A(i,s[i],c);void 0!==r&&(e+=`${d}${o(i)}:${r}`,d=",")}return C>l&&(e+=`${d}"...":"${Q(C-l)} not stringified"`),c.pop(),`{${e}}`}case"number":return isFinite(s)?String(s):e?e(s):"null";case"boolean":return!0===s?"true":"false";case"undefined":return;case"bigint":if(I)return String(s);default:return e?e(s):void 0}}("",A,[])}}},{}],"6Bu6A":[function(A,e,t){var i=A("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(t),i.export(t,"SyncActionDefinition",()=>I),i.export(t,"SyncActionPaths",()=>r);let I={site:{list:"0",group:"1",load:"2",update:"3"},comp:{new:"4",list:"5",group:"6",load:"7"},page:{list:"8",load:"9",cache:"10"},yjs:{um:"11",sv_local:"12",diff_local:"13",sv_remote:"14"},client:{info:"15"},code:{load:"16",edit:"17",action:"18"}},r={0:"site.list",1:"site.group",2:"site.load",3:"site.update",4:"comp.new",5:"comp.list",6:"comp.group",7:"comp.load",8:"page.list",9:"page.load",10:"page.cache",11:"yjs.um",12:"yjs.sv_local",13:"yjs.diff_local",14:"yjs.sv_remote",15:"client.info",16:"code.load",17:"code.edit",18:"code.action"}},{"@parcel/transformer-js/src/esmodule-helpers.js":"4uUBn"}],eZNf9:[function(A,e,t){var i,I,r=A("@parcel/transformer-js/src/esmodule-helpers.js");r.defineInteropFlag(t),r.export(t,"SyncType",()=>I),(i=I||(I={}))[i.ClientID=0]="ClientID",i[i.UserID=1]="UserID",i[i.Event=2]="Event",i[i.Action=3]="Action",i[i.ActionResult=4]="ActionResult"},{"@parcel/transformer-js/src/esmodule-helpers.js":"4uUBn"}],bZFhN:[function(A,e,t){var i=A("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(t),i.export(t,"initIDB",()=>r);var I=A("idb-keyval");let r=A=>(0,I.createStore)(`prasi-user-${A}`,"default")},{"idb-keyval":"8Atof","@parcel/transformer-js/src/esmodule-helpers.js":"4uUBn"}]},[],0,"parcelRequire2d1f");
|
${e}`),c.pop(),`{${p}}`}case"number":return isFinite(s)?String(s):e?e(s):"null";case"boolean":return!0===s?"true":"false";case"undefined":return;case"bigint":if(I)return String(s);default:return e?e(s):void 0}}("",A,[],c,"")}return function A(i,s,c){switch(typeof s){case"string":return o(s);case"object":{if(null===s)return"null";if("function"==typeof s.toJSON){if("object"!=typeof(s=s.toJSON(i)))return A(i,s,c);if(null===s)return"null"}if(-1!==c.indexOf(s))return t;let e="";if(Array.isArray(s)){if(0===s.length)return"[]";if(g<c.length+1)return'"[Array]"';c.push(s);let t=Math.min(s.length,l),i=0;for(;i<t-1;i++){let t=A(String(i),s[i],c);e+=(void 0!==t?t:"null")+","}let I=A(String(i),s[i],c);if(e+=void 0!==I?I:"null",s.length-1>l){let A=s.length-l-1;e+=`,"... ${Q(A)} not stringified"`}return c.pop(),`[${e}]`}let I=Object.keys(s),C=I.length;if(0===C)return"{}";if(g<c.length+1)return'"[Object]"';let d="",h=Math.min(C,l);a(s)&&(e+=B(s,",",l),I=I.slice(s.length),h-=s.length,d=","),r&&(I=n(I)),c.push(s);for(let t=0;t<h;t++){let i=I[t],r=A(i,s[i],c);void 0!==r&&(e+=`${d}${o(i)}:${r}`,d=",")}return C>l&&(e+=`${d}"...":"${Q(C-l)} not stringified"`),c.pop(),`{${e}}`}case"number":return isFinite(s)?String(s):e?e(s):"null";case"boolean":return!0===s?"true":"false";case"undefined":return;case"bigint":if(I)return String(s);default:return e?e(s):void 0}}("",A,[])}}},{}],"6Bu6A":[function(A,e,t){var i=A("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(t),i.export(t,"SyncActionDefinition",()=>I),i.export(t,"SyncActionPaths",()=>r);let I={site:{list:"0",group:"1",load:"2",update:"3"},comp:{new:"4",list:"5",group:"6",load:"7"},page:{list:"8",load:"9",cache:"10"},yjs:{um:"11",sv_local:"12",diff_local:"13",sv_remote:"14"},client:{info:"15"},code:{load:"16",edit:"17",action:"18"}},r={0:"site.list",1:"site.group",2:"site.load",3:"site.update",4:"comp.new",5:"comp.list",6:"comp.group",7:"comp.load",8:"page.list",9:"page.load",10:"page.cache",11:"yjs.um",12:"yjs.sv_local",13:"yjs.diff_local",14:"yjs.sv_remote",15:"client.info",16:"code.load",17:"code.edit",18:"code.action"}},{"@parcel/transformer-js/src/esmodule-helpers.js":"4uUBn"}],eZNf9:[function(A,e,t){var i,I,r=A("@parcel/transformer-js/src/esmodule-helpers.js");r.defineInteropFlag(t),r.export(t,"SyncType",()=>I),(i=I||(I={}))[i.ClientID=0]="ClientID",i[i.UserID=1]="UserID",i[i.Event=2]="Event",i[i.Action=3]="Action",i[i.ActionResult=4]="ActionResult"},{"@parcel/transformer-js/src/esmodule-helpers.js":"4uUBn"}],bZFhN:[function(A,e,t){var i=A("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(t),i.export(t,"initIDB",()=>r);var I=A("idb-keyval");let r=A=>(0,I.createStore)(`prasi-user-${A}`,"default")},{"idb-keyval":"8Atof","@parcel/transformer-js/src/esmodule-helpers.js":"4uUBn"}]},[],0,"parcelRequire2d1f");
|
||||||
//# sourceMappingURL=ed.55787c67.js.map
|
//# sourceMappingURL=ed.22759bde.js.map
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,119 +0,0 @@
|
||||||
import hash_sum from "hash-sum";
|
|
||||||
import { fetchViaProxy } from "../proxy";
|
|
||||||
import pako from "pako";
|
|
||||||
|
|
||||||
export const dbClient = (name: string, dburl: string) => {
|
|
||||||
return new Proxy(
|
|
||||||
{},
|
|
||||||
{
|
|
||||||
get(_, table: string) {
|
|
||||||
if (table === "_tables") {
|
|
||||||
return () => {
|
|
||||||
return fetchSendDb(
|
|
||||||
name,
|
|
||||||
{
|
|
||||||
name,
|
|
||||||
action: "definition",
|
|
||||||
table: "*",
|
|
||||||
},
|
|
||||||
dburl
|
|
||||||
);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (table === "_definition") {
|
|
||||||
return (table: string) => {
|
|
||||||
return fetchSendDb(
|
|
||||||
name,
|
|
||||||
{
|
|
||||||
name,
|
|
||||||
action: "definition",
|
|
||||||
table,
|
|
||||||
},
|
|
||||||
dburl
|
|
||||||
);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (table.startsWith("$")) {
|
|
||||||
return (...params: any[]) => {
|
|
||||||
const bytes = pako.gzip(JSON.stringify(params));
|
|
||||||
|
|
||||||
return fetchSendDb(
|
|
||||||
name,
|
|
||||||
{
|
|
||||||
name,
|
|
||||||
action: "query",
|
|
||||||
table,
|
|
||||||
params: btoa(
|
|
||||||
bytes.reduce(
|
|
||||||
(acc, current) => acc + String.fromCharCode(current),
|
|
||||||
""
|
|
||||||
)
|
|
||||||
),
|
|
||||||
},
|
|
||||||
dburl
|
|
||||||
);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Proxy(
|
|
||||||
{},
|
|
||||||
{
|
|
||||||
get(_, action: string) {
|
|
||||||
return (...params: any[]) => {
|
|
||||||
if (table === "query") {
|
|
||||||
table = action;
|
|
||||||
action = "query";
|
|
||||||
}
|
|
||||||
return fetchSendDb(
|
|
||||||
name,
|
|
||||||
{
|
|
||||||
name,
|
|
||||||
action,
|
|
||||||
table,
|
|
||||||
params,
|
|
||||||
},
|
|
||||||
dburl
|
|
||||||
);
|
|
||||||
};
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const cachedQueryResult: Record<
|
|
||||||
string,
|
|
||||||
{ timestamp: number; result: any; promise: Promise<any> }
|
|
||||||
> = {};
|
|
||||||
|
|
||||||
export const fetchSendDb = async (name: string, params: any, dburl: string) => {
|
|
||||||
const base = new URL(dburl);
|
|
||||||
base.pathname = `/_dbs/${name}`;
|
|
||||||
if (params.table) {
|
|
||||||
base.pathname += `/${params.table}`;
|
|
||||||
}
|
|
||||||
const url = base.toString();
|
|
||||||
|
|
||||||
const hsum = hash_sum(params);
|
|
||||||
const cached = cachedQueryResult[hsum];
|
|
||||||
|
|
||||||
if (!cached || (cached && Date.now() - cached.timestamp > 1000)) {
|
|
||||||
cachedQueryResult[hsum] = {
|
|
||||||
timestamp: Date.now(),
|
|
||||||
promise: fetchViaProxy(url, params, {
|
|
||||||
"content-type": "application/json",
|
|
||||||
}),
|
|
||||||
result: null,
|
|
||||||
};
|
|
||||||
|
|
||||||
const result = await cachedQueryResult[hsum].promise;
|
|
||||||
cachedQueryResult[hsum].result = result;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return await cached.promise;
|
|
||||||
};
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import hash_sum from "hash-sum";
|
import hash_sum from "hash-sum";
|
||||||
import { fetchViaProxy } from "../proxy";
|
|
||||||
import pako from "pako";
|
import pako from "pako";
|
||||||
|
import { fetchViaProxy } from "../proxy";
|
||||||
|
|
||||||
export const dbProxy = (dburl: string) => {
|
export const dbProxy = (dburl: string) => {
|
||||||
const name = "";
|
const name = "";
|
||||||
|
|
@ -10,7 +10,6 @@ export const dbProxy = (dburl: string) => {
|
||||||
get(_, table: string) {
|
get(_, table: string) {
|
||||||
if (table === "_batch") {
|
if (table === "_batch") {
|
||||||
return {
|
return {
|
||||||
// pancingan ini table batch
|
|
||||||
update: async (batch: any) => {
|
update: async (batch: any) => {
|
||||||
return fetchSendDb(
|
return fetchSendDb(
|
||||||
{
|
{
|
||||||
|
|
@ -22,6 +21,17 @@ export const dbProxy = (dburl: string) => {
|
||||||
dburl
|
dburl
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
upsert: async (arg: any) => {
|
||||||
|
return fetchSendDb(
|
||||||
|
{
|
||||||
|
name,
|
||||||
|
action: "batch_upsert",
|
||||||
|
table: "",
|
||||||
|
params: { arg },
|
||||||
|
},
|
||||||
|
dburl
|
||||||
|
);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (table === "_schema") {
|
if (table === "_schema") {
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,11 @@ export const prismaExtendType = `\
|
||||||
where: any
|
where: any
|
||||||
}[]
|
}[]
|
||||||
) => Promise<void>;
|
) => Promise<void>;
|
||||||
|
upsert: (arg: {
|
||||||
|
table: string;
|
||||||
|
where: any;
|
||||||
|
data: any[];
|
||||||
|
}) => Promise<void>;
|
||||||
};
|
};
|
||||||
_schema: {
|
_schema: {
|
||||||
tables: () => Promise<string[]>;
|
tables: () => Promise<string[]>;
|
||||||
|
|
@ -36,8 +41,3 @@ export const prismaExtendType = `\
|
||||||
}>>;
|
}>>;
|
||||||
}
|
}
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
const rel_types = `\
|
|
||||||
{
|
|
||||||
|
|
||||||
}`;
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue