@fireproof/core 0.18.0 → 0.19.0-dev-publish
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +29 -15
- package/chunk-5X6APJDY.js +39 -0
- package/chunk-5X6APJDY.js.map +1 -0
- package/chunk-EVSZA26U.js +208 -0
- package/chunk-EVSZA26U.js.map +1 -0
- package/chunk-H3A2HMMM.js +164 -0
- package/chunk-H3A2HMMM.js.map +1 -0
- package/chunk-UCMXU3DH.js +268 -0
- package/chunk-UCMXU3DH.js.map +1 -0
- package/chunk-VZGT7ZYP.js +22 -0
- package/chunk-VZGT7ZYP.js.map +1 -0
- package/index.cjs +4676 -0
- package/index.cjs.map +1 -0
- package/index.d.cts +992 -0
- package/index.d.ts +992 -0
- package/index.js +2937 -0
- package/index.js.map +1 -0
- package/metafile-cjs.json +1 -0
- package/metafile-esm.json +1 -0
- package/node-sys-container-E7LADX2Z.js +29 -0
- package/node-sys-container-E7LADX2Z.js.map +1 -0
- package/package.json +23 -109
- package/sqlite-data-store-RIH56645.js +120 -0
- package/sqlite-data-store-RIH56645.js.map +1 -0
- package/sqlite-meta-store-6347MWOR.js +137 -0
- package/sqlite-meta-store-6347MWOR.js.map +1 -0
- package/sqlite-wal-store-G5YGK77N.js +123 -0
- package/sqlite-wal-store-G5YGK77N.js.map +1 -0
- package/store-file-D472VFCS.js +193 -0
- package/store-file-D472VFCS.js.map +1 -0
- package/store-indexdb-FRX5PTKR.js +20 -0
- package/store-indexdb-FRX5PTKR.js.map +1 -0
- package/store-sql-MDSU23Y7.js +344 -0
- package/store-sql-MDSU23Y7.js.map +1 -0
- package/dist/browser/fireproof.cjs +0 -1172
- package/dist/browser/fireproof.cjs.map +0 -1
- package/dist/browser/fireproof.d.cts +0 -268
- package/dist/browser/fireproof.d.ts +0 -268
- package/dist/browser/fireproof.global.js +0 -24178
- package/dist/browser/fireproof.global.js.map +0 -1
- package/dist/browser/fireproof.js +0 -1147
- package/dist/browser/fireproof.js.map +0 -1
- package/dist/browser/metafile-cjs.json +0 -1
- package/dist/browser/metafile-esm.json +0 -1
- package/dist/browser/metafile-iife.json +0 -1
- package/dist/memory/fireproof.cjs +0 -1172
- package/dist/memory/fireproof.cjs.map +0 -1
- package/dist/memory/fireproof.d.cts +0 -268
- package/dist/memory/fireproof.d.ts +0 -268
- package/dist/memory/fireproof.global.js +0 -24178
- package/dist/memory/fireproof.global.js.map +0 -1
- package/dist/memory/fireproof.js +0 -1147
- package/dist/memory/fireproof.js.map +0 -1
- package/dist/memory/metafile-cjs.json +0 -1
- package/dist/memory/metafile-esm.json +0 -1
- package/dist/memory/metafile-iife.json +0 -1
- package/dist/node/fireproof.cjs +0 -1172
- package/dist/node/fireproof.cjs.map +0 -1
- package/dist/node/fireproof.d.cts +0 -268
- package/dist/node/fireproof.d.ts +0 -268
- package/dist/node/fireproof.global.js +0 -38540
- package/dist/node/fireproof.global.js.map +0 -1
- package/dist/node/fireproof.js +0 -1138
- package/dist/node/fireproof.js.map +0 -1
- package/dist/node/metafile-cjs.json +0 -1
- package/dist/node/metafile-esm.json +0 -1
- package/dist/node/metafile-iife.json +0 -1
@@ -0,0 +1,268 @@
|
|
1
|
+
import {
|
2
|
+
SysContainer,
|
3
|
+
__export,
|
4
|
+
join
|
5
|
+
} from "./chunk-H3A2HMMM.js";
|
6
|
+
|
7
|
+
// src/utils.ts
|
8
|
+
import { LoggerImpl, IsLogger, Result, ResolveOnce } from "@adviser/cement";
|
9
|
+
|
10
|
+
// src/runtime/index.ts
|
11
|
+
var runtime_exports = {};
|
12
|
+
__export(runtime_exports, {
|
13
|
+
FILESTORE_VERSION: () => FILESTORE_VERSION,
|
14
|
+
INDEXDB_VERSION: () => INDEXDB_VERSION,
|
15
|
+
SQLITE_VERSION: () => SQLITE_VERSION,
|
16
|
+
SysContainer: () => SysContainer,
|
17
|
+
dataDir: () => dataDir,
|
18
|
+
ensureIndexName: () => ensureIndexName,
|
19
|
+
getFileName: () => getFileName,
|
20
|
+
getPath: () => getPath,
|
21
|
+
join: () => join,
|
22
|
+
sql: () => store_sql_exports
|
23
|
+
});
|
24
|
+
|
25
|
+
// src/runtime/data-dir.ts
|
26
|
+
import { isDeno, isNode } from "std-env";
|
27
|
+
function dataDir(name, base) {
|
28
|
+
if (!base) {
|
29
|
+
if (isNode || isDeno) {
|
30
|
+
base = SysContainer.env.get("FP_STORAGE_URL") || `file://${SysContainer.join(SysContainer.homedir(), ".fireproof")}`;
|
31
|
+
} else {
|
32
|
+
base = `indexdb://fp`;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
let url;
|
36
|
+
if (typeof base === "string") {
|
37
|
+
try {
|
38
|
+
url = new URL(base.toString());
|
39
|
+
} catch (e) {
|
40
|
+
try {
|
41
|
+
base = `file://${base}`;
|
42
|
+
url = new URL(base);
|
43
|
+
} catch (e2) {
|
44
|
+
throw new Error(`invalid base url: ${base}`);
|
45
|
+
}
|
46
|
+
}
|
47
|
+
} else {
|
48
|
+
url = base;
|
49
|
+
}
|
50
|
+
url.searchParams.set("name", name || "");
|
51
|
+
return url.toString();
|
52
|
+
}
|
53
|
+
|
54
|
+
// src/runtime/store-sql/index.ts
|
55
|
+
var store_sql_exports = {};
|
56
|
+
__export(store_sql_exports, {
|
57
|
+
DefaultSQLTableNames: () => DefaultSQLTableNames,
|
58
|
+
ensureSQLOpts: () => ensureSQLOpts
|
59
|
+
});
|
60
|
+
|
61
|
+
// src/runtime/store-sql/types.ts
|
62
|
+
var DefaultSQLTableNames = {
|
63
|
+
data: "Datas",
|
64
|
+
meta: "Metas",
|
65
|
+
wal: "Wals"
|
66
|
+
};
|
67
|
+
|
68
|
+
// src/runtime/store-sql/ensurer.ts
|
69
|
+
function sqlTableName(...names) {
|
70
|
+
return names.map((name) => name.replace(/^[^a-zA-Z0-9]+/, "").replace(/[^a-zA-Z0-9]+/g, "_")).filter((i) => i.length).join("_");
|
71
|
+
}
|
72
|
+
function ensureTableNames(url, opts) {
|
73
|
+
let isIndex = "";
|
74
|
+
if (url.searchParams.has("index")) {
|
75
|
+
isIndex = url.searchParams.get("index") || ".idx";
|
76
|
+
}
|
77
|
+
const ret = opts?.tableNames || DefaultSQLTableNames;
|
78
|
+
if (isIndex.length) {
|
79
|
+
return {
|
80
|
+
data: sqlTableName(isIndex, ret.data),
|
81
|
+
meta: sqlTableName(isIndex, ret.meta),
|
82
|
+
wal: sqlTableName(isIndex, ret.wal)
|
83
|
+
};
|
84
|
+
}
|
85
|
+
return {
|
86
|
+
data: sqlTableName(ret.data),
|
87
|
+
meta: sqlTableName(ret.meta),
|
88
|
+
wal: sqlTableName(ret.wal)
|
89
|
+
};
|
90
|
+
}
|
91
|
+
var textEncoder = new TextEncoder();
|
92
|
+
function ensureTextEncoder(opts) {
|
93
|
+
return opts?.textEncoder || textEncoder;
|
94
|
+
}
|
95
|
+
var textDecoder = new TextDecoder();
|
96
|
+
function ensureTextDecoder(opts) {
|
97
|
+
return opts?.textDecoder || textDecoder;
|
98
|
+
}
|
99
|
+
function url2sqlFlavor(url, logger) {
|
100
|
+
const flavor = url.protocol.replace(/:.*$/, "");
|
101
|
+
switch (flavor) {
|
102
|
+
case "sqlite":
|
103
|
+
case "mysql":
|
104
|
+
case "postgres":
|
105
|
+
return flavor;
|
106
|
+
default:
|
107
|
+
throw logger.Error().Str("flavor", flavor).Msg("unsupported protocol").AsError();
|
108
|
+
}
|
109
|
+
}
|
110
|
+
function ensureSQLOpts(url, opts, componentName, ctx) {
|
111
|
+
const logger = ensureLogger(opts, componentName, ctx);
|
112
|
+
return {
|
113
|
+
url,
|
114
|
+
sqlFlavor: url2sqlFlavor(url, logger),
|
115
|
+
tableNames: ensureTableNames(url, opts),
|
116
|
+
logger,
|
117
|
+
textEncoder: ensureTextEncoder(opts),
|
118
|
+
textDecoder: ensureTextDecoder(opts)
|
119
|
+
};
|
120
|
+
}
|
121
|
+
|
122
|
+
// src/runtime/store-file-version.ts
|
123
|
+
var FILESTORE_VERSION = "v0.19-file";
|
124
|
+
|
125
|
+
// src/runtime/store-indexdb-version.ts
|
126
|
+
var INDEXDB_VERSION = "v0.19-indexdb";
|
127
|
+
|
128
|
+
// src/runtime/store-sql/v0.19-sqlite/version.ts
|
129
|
+
var SQLITE_VERSION = "v0.19-sqlite";
|
130
|
+
|
131
|
+
// src/utils.ts
|
132
|
+
import { uuidv7 } from "uuidv7";
|
133
|
+
var globalLogger = new LoggerImpl();
|
134
|
+
var registerFP_DEBUG = new ResolveOnce();
|
135
|
+
function ensureLogger(optsOrLogger, componentName, ctx) {
|
136
|
+
let logger = globalLogger;
|
137
|
+
if (IsLogger(optsOrLogger)) {
|
138
|
+
logger = optsOrLogger;
|
139
|
+
} else if (optsOrLogger && IsLogger(optsOrLogger.logger)) {
|
140
|
+
logger = optsOrLogger.logger;
|
141
|
+
}
|
142
|
+
const cLogger = logger.With().Module(componentName);
|
143
|
+
const debug = [];
|
144
|
+
if (ctx) {
|
145
|
+
if ("debug" in ctx) {
|
146
|
+
if (typeof ctx.debug === "string" && ctx.debug.length > 0) {
|
147
|
+
debug.push(ctx.debug);
|
148
|
+
} else {
|
149
|
+
debug.push(componentName);
|
150
|
+
}
|
151
|
+
delete ctx.debug;
|
152
|
+
}
|
153
|
+
if ("this" in ctx) {
|
154
|
+
cLogger.Str("this", uuidv7());
|
155
|
+
delete ctx.this;
|
156
|
+
}
|
157
|
+
for (const [key, value] of Object.entries(ctx)) {
|
158
|
+
switch (typeof value) {
|
159
|
+
case "string":
|
160
|
+
cLogger.Str(key, value);
|
161
|
+
break;
|
162
|
+
case "number":
|
163
|
+
cLogger.Uint64(key, value);
|
164
|
+
break;
|
165
|
+
default:
|
166
|
+
if (value instanceof Date) {
|
167
|
+
cLogger.Str(key, value.toISOString());
|
168
|
+
} else if (value instanceof URL) {
|
169
|
+
cLogger.Str(key, value.toString());
|
170
|
+
} else if (typeof value === "function") {
|
171
|
+
cLogger.Ref(key, value);
|
172
|
+
} else {
|
173
|
+
cLogger.Any(key, value);
|
174
|
+
}
|
175
|
+
break;
|
176
|
+
}
|
177
|
+
}
|
178
|
+
}
|
179
|
+
registerFP_DEBUG.once(async () => {
|
180
|
+
SysContainer.env.onSet((key, value) => {
|
181
|
+
if (value) {
|
182
|
+
logger.SetDebug(value);
|
183
|
+
}
|
184
|
+
}, "FP_DEBUG");
|
185
|
+
}).finally(() => {
|
186
|
+
});
|
187
|
+
if (debug.length > 0) {
|
188
|
+
logger.SetDebug(debug);
|
189
|
+
}
|
190
|
+
const out = cLogger.Logger();
|
191
|
+
return out;
|
192
|
+
}
|
193
|
+
function getStore(url, logger, joiner) {
|
194
|
+
let result = url.searchParams.get("store");
|
195
|
+
if (!result) throw logger.Error().Str("url", url.toString()).Msg(`store not found`).AsError();
|
196
|
+
if (url.searchParams.has("index")) {
|
197
|
+
result = joiner(url.searchParams.get("index") || "idx", result);
|
198
|
+
}
|
199
|
+
return result;
|
200
|
+
}
|
201
|
+
function getKey(url, logger) {
|
202
|
+
const result = url.searchParams.get("key");
|
203
|
+
if (!result) throw logger.Error().Str("url", url.toString()).Msg(`key not found`).AsError();
|
204
|
+
return result;
|
205
|
+
}
|
206
|
+
function getName(url, logger) {
|
207
|
+
let result = url.searchParams.get("name");
|
208
|
+
if (!result) {
|
209
|
+
result = SysContainer.dirname(url.pathname);
|
210
|
+
if (result.length === 0) {
|
211
|
+
throw logger.Error().Str("url", url.toString()).Msg(`name not found`).AsError();
|
212
|
+
}
|
213
|
+
}
|
214
|
+
return result;
|
215
|
+
}
|
216
|
+
function exception2Result(fn) {
|
217
|
+
return fn().then((value) => Result.Ok(value)).catch((e) => Result.Err(e));
|
218
|
+
}
|
219
|
+
async function exceptionWrapper(fn) {
|
220
|
+
return fn().catch((e) => Result.Err(e));
|
221
|
+
}
|
222
|
+
|
223
|
+
// src/runtime/store-file-utils.ts
|
224
|
+
async function getPath(url, logger) {
|
225
|
+
const basePath = url.toString().replace(new RegExp(`^${url.protocol}//`), "").replace(/\?.*$/, "");
|
226
|
+
const name = url.searchParams.get("name");
|
227
|
+
if (name) {
|
228
|
+
const version = url.searchParams.get("version");
|
229
|
+
if (!version) throw logger.Error().Str("url", url.toString()).Msg(`version not found`).AsError();
|
230
|
+
return SysContainer.join(basePath, version, name);
|
231
|
+
}
|
232
|
+
return SysContainer.join(basePath);
|
233
|
+
}
|
234
|
+
function getFileName(url, key, logger) {
|
235
|
+
switch (getStore(url, logger, (...a) => a.join("/"))) {
|
236
|
+
case "data":
|
237
|
+
return key + ".car";
|
238
|
+
case "meta":
|
239
|
+
return key + ".json";
|
240
|
+
default:
|
241
|
+
throw logger.Error().Str("url", url.toString()).Msg(`unsupported store type`).AsError();
|
242
|
+
}
|
243
|
+
}
|
244
|
+
function ensureIndexName(url, name) {
|
245
|
+
if (url.searchParams.has("index")) {
|
246
|
+
name = (url.searchParams.get("index")?.replace(/[^a-zA-Z0-9]/g, "") || "idx") + "-" + name;
|
247
|
+
}
|
248
|
+
return name;
|
249
|
+
}
|
250
|
+
|
251
|
+
export {
|
252
|
+
dataDir,
|
253
|
+
getPath,
|
254
|
+
getFileName,
|
255
|
+
ensureIndexName,
|
256
|
+
ensureSQLOpts,
|
257
|
+
FILESTORE_VERSION,
|
258
|
+
INDEXDB_VERSION,
|
259
|
+
SQLITE_VERSION,
|
260
|
+
runtime_exports,
|
261
|
+
ensureLogger,
|
262
|
+
getStore,
|
263
|
+
getKey,
|
264
|
+
getName,
|
265
|
+
exception2Result,
|
266
|
+
exceptionWrapper
|
267
|
+
};
|
268
|
+
//# sourceMappingURL=chunk-UCMXU3DH.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/utils.ts","../../src/runtime/index.ts","../../src/runtime/data-dir.ts","../../src/runtime/store-sql/index.ts","../../src/runtime/store-sql/types.ts","../../src/runtime/store-sql/ensurer.ts","../../src/runtime/store-file-version.ts","../../src/runtime/store-indexdb-version.ts","../../src/runtime/store-sql/v0.19-sqlite/version.ts","../../src/runtime/store-file-utils.ts"],"sourcesContent":["import { Logger, LoggerImpl, IsLogger, Result, ResolveOnce } from \"@adviser/cement\";\nimport { SysContainer } from \"./runtime\";\nimport { uuidv7 } from \"uuidv7\";\n\nexport type { Logger };\n\nconst globalLogger: Logger = new LoggerImpl();\n\nexport interface LoggerOpts {\n readonly logger?: Logger;\n}\n\nconst registerFP_DEBUG = new ResolveOnce();\n\nexport function ensureLogger(\n optsOrLogger: Partial<LoggerOpts> | Logger,\n componentName: string,\n ctx?: Record<string, unknown>,\n): Logger {\n // if (!opts?.logger) {\n // throw new Error(\"logger is required\");\n // }\n let logger = globalLogger;\n if (IsLogger(optsOrLogger)) {\n logger = optsOrLogger;\n } else if (optsOrLogger && IsLogger(optsOrLogger.logger)) {\n logger = optsOrLogger.logger;\n }\n const cLogger = logger.With().Module(componentName); //.Str(\"this\", uuidv7());\n const debug: string[] = [];\n if (ctx) {\n if (\"debug\" in ctx) {\n if (typeof ctx.debug === \"string\" && ctx.debug.length > 0) {\n debug.push(ctx.debug);\n } else {\n debug.push(componentName);\n }\n delete ctx.debug;\n }\n if (\"this\" in ctx) {\n cLogger.Str(\"this\", uuidv7());\n delete ctx.this;\n }\n for (const [key, value] of Object.entries(ctx)) {\n switch (typeof value) {\n case \"string\":\n cLogger.Str(key, value);\n break;\n case \"number\":\n cLogger.Uint64(key, value);\n break;\n default:\n if (value instanceof Date) {\n cLogger.Str(key, value.toISOString());\n } else if (value instanceof URL) {\n cLogger.Str(key, value.toString());\n } else if (typeof value === \"function\") {\n cLogger.Ref(key, value);\n } else {\n cLogger.Any(key, value);\n }\n break;\n }\n }\n }\n registerFP_DEBUG\n .once(async () => {\n // console.log(\"registerFP_DEBUG\", SysContainer.env)\n SysContainer.env.onSet((key, value) => {\n // console.log(\"FP_DEBUG\", key, value, debug)\n if (value) {\n logger.SetDebug(value);\n }\n }, \"FP_DEBUG\");\n })\n .finally(() => {\n /* do nothing */\n });\n\n if (debug.length > 0) {\n logger.SetDebug(debug);\n }\n const out = cLogger.Logger();\n // out.Debug().Msg(\"logger ready\");\n return out;\n}\n\nexport type Joiner = (...toJoin: string[]) => string;\n\nexport function getStore(url: URL, logger: Logger, joiner: Joiner): string {\n let result = url.searchParams.get(\"store\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`store not found`).AsError();\n if (url.searchParams.has(\"index\")) {\n result = joiner(url.searchParams.get(\"index\") || \"idx\", result);\n }\n return result;\n}\n\nexport function getKey(url: URL, logger: Logger): string {\n const result = url.searchParams.get(\"key\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`key not found`).AsError();\n return result;\n}\n\nexport function getName(url: URL, logger: Logger): string {\n let result = url.searchParams.get(\"name\");\n if (!result) {\n result = SysContainer.dirname(url.pathname);\n if (result.length === 0) {\n throw logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n }\n }\n return result;\n}\n\nexport function exception2Result<T = void>(fn: () => Promise<T>): Promise<Result<T>> {\n return fn()\n .then((value) => Result.Ok(value))\n .catch((e) => Result.Err(e));\n}\n\nexport async function exceptionWrapper<T, E extends Error>(fn: () => Promise<Result<T, E>>): Promise<Result<T, E>> {\n return fn().catch((e) => Result.Err(e));\n}\n","export * from \"./sys-container.js\";\nexport * from \"./data-dir.js\";\nexport * from \"./store-file-utils.js\";\n\nexport * as sql from \"./store-sql/index.js\";\n\nexport { FILESTORE_VERSION } from \"./store-file-version.js\";\nexport { INDEXDB_VERSION } from \"./store-indexdb-version.js\";\nexport { SQLITE_VERSION } from \"./store-sql/v0.19-sqlite/version.js\";\n","import { SysContainer } from \"./sys-container.js\";\nimport { isDeno, isNode } from \"std-env\";\n\nexport function dataDir(name?: string, base?: string | URL): string {\n if (!base) {\n if (isNode || isDeno) {\n base = SysContainer.env.get(\"FP_STORAGE_URL\") || `file://${SysContainer.join(SysContainer.homedir(), \".fireproof\")}`;\n } else {\n base = `indexdb://fp`;\n }\n }\n let url: URL;\n if (typeof base === \"string\") {\n try {\n url = new URL(base.toString());\n } catch (e) {\n try {\n base = `file://${base}`;\n url = new URL(base);\n } catch (e) {\n throw new Error(`invalid base url: ${base}`);\n }\n }\n } else {\n url = base;\n }\n url.searchParams.set(\"name\", name || \"\");\n return url.toString();\n}\n","// export * from \"./sqlite-adapter-better-sqlite3.js\";\nexport * from \"./types.js\";\nexport * from \"./ensurer.js\";\n","import { Logger, Result } from \"@adviser/cement\";\nimport type { RunResult } from \"better-sqlite3\";\n\nexport interface DBConnection {\n connect(): Promise<void>;\n readonly opts: SQLOpts;\n}\n\nexport interface SQLStore<IType, KType, OType = IType[]> {\n readonly dbConn: DBConnection;\n start(url: URL): Promise<void>;\n insert(url: URL, ose: IType): Promise<RunResult>;\n select(url: URL, car: KType): Promise<OType>;\n delete(url: URL, car: KType): Promise<RunResult>;\n close(url: URL): Promise<Result<void>>;\n destroy(url: URL): Promise<Result<void>>;\n}\n\nexport interface SQLTableNames {\n readonly data: string;\n readonly meta: string;\n readonly wal: string;\n}\n\nexport const DefaultSQLTableNames: SQLTableNames = {\n data: \"Datas\",\n meta: \"Metas\",\n wal: \"Wals\",\n};\n\nexport interface SQLOpts {\n readonly url: URL;\n readonly sqlFlavor: \"sqlite\" | \"mysql\" | \"postgres\";\n readonly tableNames: SQLTableNames;\n readonly logger: Logger;\n readonly textEncoder: TextEncoder;\n readonly textDecoder: TextDecoder;\n}\n\nexport interface WalKey {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface WalRecord extends WalKey {\n readonly state: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type WalSQLStore = SQLStore<WalRecord, WalKey>;\n\nexport interface MetaType {\n readonly name: string;\n readonly branch: string;\n readonly meta: Uint8Array;\n}\n\nexport interface MetaRecordKey {\n readonly name: string;\n readonly branch: string;\n}\n\nexport interface MetaRecord extends MetaRecordKey {\n readonly meta: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type MetaSQLStore = SQLStore<MetaRecord, MetaRecordKey>;\n\nexport interface DataRecord {\n readonly name: string;\n readonly car: string;\n readonly data: Uint8Array;\n readonly updated_at: Date;\n}\n\nexport type DataSQLStore = SQLStore<DataRecord, string>;\n","import { ensureLogger, type Logger } from \"../../utils\";\nimport { SQLOpts, SQLTableNames, DefaultSQLTableNames } from \"./types\";\n\nfunction sqlTableName(...names: string[]): string {\n return names\n .map((name) => name.replace(/^[^a-zA-Z0-9]+/, \"\").replace(/[^a-zA-Z0-9]+/g, \"_\"))\n .filter((i) => i.length)\n .join(\"_\");\n}\n\nfunction ensureTableNames(url: URL, opts?: Partial<SQLOpts>): SQLTableNames {\n let isIndex = \"\";\n if (url.searchParams.has(\"index\")) {\n isIndex = url.searchParams.get(\"index\") || \".idx\";\n }\n const ret = opts?.tableNames || DefaultSQLTableNames;\n // console.log(\"isIndex->\", opts?.url, isIndex, sqlTableName(isIndex, ret.data));\n if (isIndex.length) {\n return {\n data: sqlTableName(isIndex, ret.data),\n meta: sqlTableName(isIndex, ret.meta),\n wal: sqlTableName(isIndex, ret.wal),\n };\n }\n return {\n data: sqlTableName(ret.data),\n meta: sqlTableName(ret.meta),\n wal: sqlTableName(ret.wal),\n };\n}\n\nconst textEncoder = new TextEncoder();\nfunction ensureTextEncoder(opts?: Partial<SQLOpts>): TextEncoder {\n return opts?.textEncoder || textEncoder;\n}\n\nconst textDecoder = new TextDecoder();\nfunction ensureTextDecoder(opts?: Partial<SQLOpts>): TextDecoder {\n return opts?.textDecoder || textDecoder;\n}\n\nfunction url2sqlFlavor(url: URL, logger: Logger): \"sqlite\" | \"mysql\" | \"postgres\" {\n const flavor = url.protocol.replace(/:.*$/, \"\");\n switch (flavor) {\n case \"sqlite\":\n case \"mysql\":\n case \"postgres\":\n return flavor;\n default:\n throw logger.Error().Str(\"flavor\", flavor).Msg(\"unsupported protocol\").AsError();\n }\n}\n\nexport function ensureSQLOpts(url: URL, opts: Partial<SQLOpts>, componentName: string, ctx?: Record<string, unknown>): SQLOpts {\n const logger = ensureLogger(opts, componentName, ctx);\n return {\n url,\n sqlFlavor: url2sqlFlavor(url, logger),\n tableNames: ensureTableNames(url, opts),\n logger,\n textEncoder: ensureTextEncoder(opts),\n textDecoder: ensureTextDecoder(opts),\n };\n}\n","export const FILESTORE_VERSION = \"v0.19-file\";\n","export const INDEXDB_VERSION = \"v0.19-indexdb\";\n","export const SQLITE_VERSION = \"v0.19-sqlite\";\n","import { Logger, getStore } from \"../utils.js\";\nimport { SysContainer } from \"./sys-container.js\";\n\nexport async function getPath(url: URL, logger: Logger): Promise<string> {\n const basePath = url\n .toString()\n .replace(new RegExp(`^${url.protocol}//`), \"\")\n .replace(/\\?.*$/, \"\");\n const name = url.searchParams.get(\"name\");\n if (name) {\n const version = url.searchParams.get(\"version\");\n if (!version) throw logger.Error().Str(\"url\", url.toString()).Msg(`version not found`).AsError();\n return SysContainer.join(basePath, version, name);\n }\n return SysContainer.join(basePath);\n}\n\nexport function getFileName(url: URL, key: string, logger: Logger): string {\n switch (getStore(url, logger, (...a: string[]) => a.join(\"/\"))) {\n case \"data\":\n return key + \".car\";\n case \"meta\":\n return key + \".json\";\n default:\n throw logger.Error().Str(\"url\", url.toString()).Msg(`unsupported store type`).AsError();\n }\n}\n\nexport function ensureIndexName(url: URL, name: string): string {\n if (url.searchParams.has(\"index\")) {\n name = (url.searchParams.get(\"index\")?.replace(/[^a-zA-Z0-9]/g, \"\") || \"idx\") + \"-\" + name;\n }\n return name;\n}\n"],"mappings":"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","names":["e"]}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
// src/blockstore/gateway.ts
|
2
|
+
import { Result } from "@adviser/cement";
|
3
|
+
var NotFoundError = class extends Error {
|
4
|
+
constructor() {
|
5
|
+
super(...arguments);
|
6
|
+
this.code = "ENOENT";
|
7
|
+
}
|
8
|
+
};
|
9
|
+
function isNotFoundError(e) {
|
10
|
+
if (Result.Is(e)) {
|
11
|
+
if (e.isOk()) return false;
|
12
|
+
e = e.Err();
|
13
|
+
}
|
14
|
+
if (e.code === "ENOENT") return true;
|
15
|
+
return false;
|
16
|
+
}
|
17
|
+
|
18
|
+
export {
|
19
|
+
NotFoundError,
|
20
|
+
isNotFoundError
|
21
|
+
};
|
22
|
+
//# sourceMappingURL=chunk-VZGT7ZYP.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../src/blockstore/gateway.ts"],"sourcesContent":["import { Result } from \"@adviser/cement\";\n\nexport interface GatewayOpts {\n readonly gateway: Gateway;\n}\n\nexport class NotFoundError extends Error {\n readonly code = \"ENOENT\";\n}\n\nexport function isNotFoundError(e: Error | Result<unknown> | unknown): e is NotFoundError {\n if (Result.Is(e)) {\n if (e.isOk()) return false;\n e = e.Err();\n }\n if ((e as NotFoundError).code === \"ENOENT\") return true;\n return false;\n}\n\nexport type GetResult = Result<Uint8Array, NotFoundError | Error>;\nexport type VoidResult = Result<void>;\n\nexport interface Gateway {\n // all the methods never throw!\n // an error is reported as a Result\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n // start updates URL --> hate this side effect\n start(baseUrl: URL): Promise<VoidResult>;\n close(baseUrl: URL): Promise<VoidResult>;\n destroy(baseUrl: URL): Promise<VoidResult>;\n put(url: URL, body: Uint8Array): Promise<VoidResult>;\n // get could return a NotFoundError if the key is not found\n get(url: URL): Promise<GetResult>;\n delete(url: URL): Promise<VoidResult>;\n}\n"],"mappings":";AAAA,SAAS,cAAc;AAMhB,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAAlC;AAAA;AACL,SAAS,OAAO;AAAA;AAClB;AAEO,SAAS,gBAAgB,GAA0D;AACxF,MAAI,OAAO,GAAG,CAAC,GAAG;AAChB,QAAI,EAAE,KAAK,EAAG,QAAO;AACrB,QAAI,EAAE,IAAI;AAAA,EACZ;AACA,MAAK,EAAoB,SAAS,SAAU,QAAO;AACnD,SAAO;AACT;","names":[]}
|