@fireproof/core-gateways-base 0.0.0-smoke-1b31059-1752074105
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +232 -0
- package/def-serde-gateway.d.ts +15 -0
- package/def-serde-gateway.js +93 -0
- package/def-serde-gateway.js.map +1 -0
- package/def-serde-gateway.ts +138 -0
- package/fp-envelope-serialize.d.ts +8 -0
- package/fp-envelope-serialize.js +141 -0
- package/fp-envelope-serialize.js.map +1 -0
- package/fp-envelope-serialize.ts +208 -0
- package/index.d.ts +7 -0
- package/index.js +8 -0
- package/index.js.map +1 -0
- package/index.ts +7 -0
- package/indexeddb-version.d.ts +1 -0
- package/indexeddb-version.js +2 -0
- package/indexeddb-version.js.map +1 -0
- package/indexeddb-version.ts +1 -0
- package/interceptor-gateway.d.ts +27 -0
- package/interceptor-gateway.js +139 -0
- package/interceptor-gateway.js.map +1 -0
- package/interceptor-gateway.ts +174 -0
- package/meta-key-hack.d.ts +33 -0
- package/meta-key-hack.js +203 -0
- package/meta-key-hack.js.map +1 -0
- package/meta-key-hack.ts +260 -0
- package/package.json +45 -0
- package/tsconfig.json +18 -0
- package/uri-interceptor.d.ts +17 -0
- package/uri-interceptor.js +51 -0
- package/uri-interceptor.js.map +1 -0
- package/uri-interceptor.ts +75 -0
- package/utils.d.ts +4 -0
- package/utils.js +27 -0
- package/utils.js.map +1 -0
- package/utils.ts +42 -0
package/meta-key-hack.js
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { exception2Result, Result } from "@adviser/cement";
|
|
2
|
+
import { PARAM } from "@fireproof/core-types-base";
|
|
3
|
+
import { DefSerdeGateway } from "./def-serde-gateway.js";
|
|
4
|
+
function fromV1toV2SerializedMetaKey(v1s, keys = []) {
|
|
5
|
+
const res = v1s.reduce((acc, v1) => {
|
|
6
|
+
const keys = [];
|
|
7
|
+
if (v1.key) {
|
|
8
|
+
if (typeof v1.key === "string") {
|
|
9
|
+
acc.keys.add(v1.key);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
keys.push(...v1.key);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
if (v1.keys) {
|
|
16
|
+
keys.push(...v1.keys);
|
|
17
|
+
}
|
|
18
|
+
for (const key of keys) {
|
|
19
|
+
acc.keys.add(key);
|
|
20
|
+
}
|
|
21
|
+
if (typeof v1.cid === "string" && (!v1.data || typeof v1.data === "string") && (!v1.parents || Array.isArray(v1.parents))) {
|
|
22
|
+
acc.metas.set(v1.cid, {
|
|
23
|
+
data: v1.data ?? "",
|
|
24
|
+
parents: v1.parents ?? [],
|
|
25
|
+
cid: v1.cid,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return acc;
|
|
29
|
+
}, {
|
|
30
|
+
metas: new Map(),
|
|
31
|
+
keys: new Set(keys),
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
metas: Array.from(res.metas.values()),
|
|
35
|
+
keys: Array.from(res.keys),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function isV2SerializedMetaKey(or) {
|
|
39
|
+
const my = or;
|
|
40
|
+
return my !== null && (!my.keys || Array.isArray(my.keys)) && (!my.metas || Array.isArray(my.metas));
|
|
41
|
+
}
|
|
42
|
+
function toV2SerializedMetaKey(or) {
|
|
43
|
+
if (Array.isArray(or)) {
|
|
44
|
+
return fromV1toV2SerializedMetaKey(or);
|
|
45
|
+
}
|
|
46
|
+
if (isV2SerializedMetaKey(or)) {
|
|
47
|
+
return fromV1toV2SerializedMetaKey(or.metas ?? [], or.keys ?? []);
|
|
48
|
+
}
|
|
49
|
+
throw new Error("not a valid serialized meta key");
|
|
50
|
+
}
|
|
51
|
+
export async function V2SerializedMetaKeyExtractKey(ctx, v2) {
|
|
52
|
+
const kb = await ctx.loader.keyBag();
|
|
53
|
+
if (!kb) {
|
|
54
|
+
return Promise.resolve(Result.Err(new Error("missing keybag")));
|
|
55
|
+
}
|
|
56
|
+
const dataUrl = await ctx.loader.attachedStores.local().active.car.url();
|
|
57
|
+
const keyName = dataUrl.getParam(PARAM.STORE_KEY);
|
|
58
|
+
if (!keyName) {
|
|
59
|
+
ctx.loader.sthis.logger.Warn().Url(dataUrl).Msg("missing store key");
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const rKey = await kb.getNamedKey(keyName);
|
|
63
|
+
if (rKey.isErr()) {
|
|
64
|
+
ctx.loader.sthis.logger.Warn().Str("keyName", keyName).Msg("did not found a extractable key");
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
for (const keyStr of v2.keys) {
|
|
68
|
+
const res = await rKey.Ok().upsert(keyStr, false);
|
|
69
|
+
if (res.isErr()) {
|
|
70
|
+
ctx.loader.sthis.logger.Warn().Str("keyStr", keyStr).Msg("failed to upsert key");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return Promise.resolve(Result.Ok(v2.metas));
|
|
76
|
+
}
|
|
77
|
+
export async function decodeAsToSerializedMeta(ctx, raw) {
|
|
78
|
+
const rJsObj = exception2Result(() => JSON.parse(ctx.loader.sthis.txt.decode(raw)));
|
|
79
|
+
if (rJsObj.isErr()) {
|
|
80
|
+
return Result.Err(rJsObj);
|
|
81
|
+
}
|
|
82
|
+
const v2 = toV2SerializedMetaKey(rJsObj.unwrap());
|
|
83
|
+
const metas = await V2SerializedMetaKeyExtractKey(ctx, v2);
|
|
84
|
+
if (metas.isErr()) {
|
|
85
|
+
return Result.Err(metas);
|
|
86
|
+
}
|
|
87
|
+
return Result.Ok({
|
|
88
|
+
metas: metas.Ok(),
|
|
89
|
+
keys: v2.keys,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
export function addKeyToDbMetaDecoder(ctx) {
|
|
93
|
+
const lastDecodedMetas = ctx.lastDecodedMetas ?? [];
|
|
94
|
+
return {
|
|
95
|
+
...ctx,
|
|
96
|
+
lastDecodedMetas,
|
|
97
|
+
decoder: {
|
|
98
|
+
meta: async (sthis, raw) => {
|
|
99
|
+
const r = await decodeAsToSerializedMeta(ctx, raw);
|
|
100
|
+
if (r.isErr()) {
|
|
101
|
+
return Promise.resolve(Result.Err(r));
|
|
102
|
+
}
|
|
103
|
+
if (lastDecodedMetas.length > 2) {
|
|
104
|
+
lastDecodedMetas.shift();
|
|
105
|
+
}
|
|
106
|
+
lastDecodedMetas.push(r.Ok());
|
|
107
|
+
return Promise.resolve(Result.Ok(r.Ok().metas));
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async function wrapEncode(ctx, payload, fn) {
|
|
113
|
+
const carStore = ctx.loader.attachedStores.local().active.car;
|
|
114
|
+
const kb = await ctx.loader.keyBag();
|
|
115
|
+
if (!kb) {
|
|
116
|
+
return Promise.resolve(Result.Err(new Error("missing keybag")));
|
|
117
|
+
}
|
|
118
|
+
const keyName = carStore.url().getParam(PARAM.STORE_KEY) ?? "";
|
|
119
|
+
const rKex = await kb.getNamedKey(keyName);
|
|
120
|
+
if (rKex.isErr()) {
|
|
121
|
+
return Promise.resolve(Result.Err(rKex.Err()));
|
|
122
|
+
}
|
|
123
|
+
const keyMaterials = await rKex
|
|
124
|
+
.Ok()
|
|
125
|
+
.asKeysItem()
|
|
126
|
+
.then((i) => Object.values(i.keys).map((i) => i.key));
|
|
127
|
+
return Promise.resolve(Result.Ok(fn(payload, keyMaterials)));
|
|
128
|
+
}
|
|
129
|
+
export function encodeAsV1SerializedMetaKey(ctx, payload) {
|
|
130
|
+
return wrapEncode(ctx, payload, (payload, keyM) => payload.map((p) => ({ ...p, key: keyM })));
|
|
131
|
+
}
|
|
132
|
+
export function encodeAsV2SerializedMetaKey(ctx, payload) {
|
|
133
|
+
return wrapEncode(ctx, payload, (payload, keyM) => ({
|
|
134
|
+
metas: payload,
|
|
135
|
+
keys: keyM,
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
export function addKeyToDbMetaEncoder(ctx, version) {
|
|
139
|
+
return {
|
|
140
|
+
...ctx,
|
|
141
|
+
encoder: {
|
|
142
|
+
meta: async (sthis, payload) => {
|
|
143
|
+
let obj;
|
|
144
|
+
switch (version) {
|
|
145
|
+
case "v1":
|
|
146
|
+
obj = await encodeAsV1SerializedMetaKey(ctx, payload);
|
|
147
|
+
break;
|
|
148
|
+
case "v2":
|
|
149
|
+
obj = await encodeAsV2SerializedMetaKey(ctx, payload);
|
|
150
|
+
break;
|
|
151
|
+
default:
|
|
152
|
+
return Promise.resolve(Result.Err(`unknown version:[${version}]`));
|
|
153
|
+
}
|
|
154
|
+
if (obj.isErr()) {
|
|
155
|
+
return Promise.resolve(Result.Err(obj));
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
return Promise.resolve(Result.Ok(sthis.txt.encode(JSON.stringify(obj.Ok()))));
|
|
159
|
+
}
|
|
160
|
+
catch (e) {
|
|
161
|
+
return Promise.resolve(Result.Err(e));
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
export class AddKeyToDbMetaGateway {
|
|
168
|
+
sdGw;
|
|
169
|
+
version;
|
|
170
|
+
constructor(gw, version) {
|
|
171
|
+
this.sdGw = new DefSerdeGateway(gw);
|
|
172
|
+
this.version = version;
|
|
173
|
+
}
|
|
174
|
+
buildUrl(ctx, baseUrl, key) {
|
|
175
|
+
return this.sdGw.buildUrl(ctx, baseUrl, key);
|
|
176
|
+
}
|
|
177
|
+
start(ctx, baseUrl) {
|
|
178
|
+
return this.sdGw.start(ctx, baseUrl);
|
|
179
|
+
}
|
|
180
|
+
close(ctx, baseUrl) {
|
|
181
|
+
return this.sdGw.close(ctx, baseUrl);
|
|
182
|
+
}
|
|
183
|
+
async put(ctx, url, body) {
|
|
184
|
+
return this.sdGw.put(addKeyToDbMetaEncoder(ctx, this.version), url, body);
|
|
185
|
+
}
|
|
186
|
+
async get(ctx, url) {
|
|
187
|
+
return this.sdGw.get(addKeyToDbMetaDecoder({ ...ctx, lastDecodedMetas: this.lastDecodedMetas }), url);
|
|
188
|
+
}
|
|
189
|
+
lastDecodedMetas = [];
|
|
190
|
+
delete(ctx, url, loader) {
|
|
191
|
+
return this.sdGw.delete(ctx, url);
|
|
192
|
+
}
|
|
193
|
+
subscribe(ctx, url, callback) {
|
|
194
|
+
return this.sdGw.subscribe(addKeyToDbMetaDecoder({ ...ctx, lastDecodedMetas: this.lastDecodedMetas }), url, callback);
|
|
195
|
+
}
|
|
196
|
+
getPlain(ctx, url, key) {
|
|
197
|
+
return this.sdGw.getPlain(ctx, url, key);
|
|
198
|
+
}
|
|
199
|
+
destroy(ctx, baseUrl) {
|
|
200
|
+
return this.sdGw.destroy(ctx, baseUrl);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=meta-key-hack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-key-hack.js","sourceRoot":"","sources":["meta-key-hack.ts"],"names":[],"mappings":"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"}
|
package/meta-key-hack.ts
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { exception2Result, Result, URI } from "@adviser/cement";
|
|
2
|
+
import {
|
|
3
|
+
FPEnvelopeMeta,
|
|
4
|
+
SerializedMeta,
|
|
5
|
+
V2SerializedMetaKey,
|
|
6
|
+
Gateway,
|
|
7
|
+
Loadable,
|
|
8
|
+
FPEnvelope,
|
|
9
|
+
SerdeGateway,
|
|
10
|
+
SerdeGatewayCtx,
|
|
11
|
+
} from "@fireproof/core-types-blockstore";
|
|
12
|
+
|
|
13
|
+
import { PARAM, SuperThis, NotFoundError } from "@fireproof/core-types-base";
|
|
14
|
+
import { DefSerdeGateway } from "./def-serde-gateway.js";
|
|
15
|
+
|
|
16
|
+
type V1SerializedMetaKey = SerializedMeta & {
|
|
17
|
+
// old version
|
|
18
|
+
readonly key?: string | string[];
|
|
19
|
+
// new version
|
|
20
|
+
readonly keys?: string[];
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// type SerializedMetaWithKey = V1SerializedMetaKey[] | V2SerializedMetaKey;
|
|
24
|
+
|
|
25
|
+
function fromV1toV2SerializedMetaKey(v1s: unknown[], keys: string[] = []): V2SerializedMetaKey {
|
|
26
|
+
const res = (v1s as Partial<V1SerializedMetaKey>[]).reduce(
|
|
27
|
+
(acc, v1) => {
|
|
28
|
+
const keys: string[] = [];
|
|
29
|
+
if (v1.key) {
|
|
30
|
+
if (typeof v1.key === "string") {
|
|
31
|
+
acc.keys.add(v1.key);
|
|
32
|
+
} else {
|
|
33
|
+
keys.push(...v1.key);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (v1.keys) {
|
|
37
|
+
keys.push(...v1.keys);
|
|
38
|
+
}
|
|
39
|
+
for (const key of keys) {
|
|
40
|
+
acc.keys.add(key);
|
|
41
|
+
}
|
|
42
|
+
if (typeof v1.cid === "string" && (!v1.data || typeof v1.data === "string") && (!v1.parents || Array.isArray(v1.parents))) {
|
|
43
|
+
acc.metas.set(v1.cid, {
|
|
44
|
+
data: v1.data ?? "",
|
|
45
|
+
parents: v1.parents ?? [],
|
|
46
|
+
cid: v1.cid,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return acc;
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
metas: new Map<string, SerializedMeta>(),
|
|
53
|
+
keys: new Set<string>(keys),
|
|
54
|
+
},
|
|
55
|
+
);
|
|
56
|
+
return {
|
|
57
|
+
metas: Array.from(res.metas.values()),
|
|
58
|
+
keys: Array.from(res.keys),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function isV2SerializedMetaKey(or: NonNullable<unknown>): or is Partial<V2SerializedMetaKey> {
|
|
63
|
+
const my = or as Partial<V2SerializedMetaKey>;
|
|
64
|
+
return my !== null && (!my.keys || Array.isArray(my.keys)) && (!my.metas || Array.isArray(my.metas));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function toV2SerializedMetaKey(or: NonNullable<unknown>): V2SerializedMetaKey {
|
|
68
|
+
if (Array.isArray(or)) {
|
|
69
|
+
return fromV1toV2SerializedMetaKey(or);
|
|
70
|
+
}
|
|
71
|
+
if (isV2SerializedMetaKey(or)) {
|
|
72
|
+
return fromV1toV2SerializedMetaKey(or.metas ?? [], or.keys ?? []);
|
|
73
|
+
}
|
|
74
|
+
throw new Error("not a valid serialized meta key");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export async function V2SerializedMetaKeyExtractKey(
|
|
78
|
+
ctx: SerdeGatewayCtx,
|
|
79
|
+
v2: V2SerializedMetaKey,
|
|
80
|
+
): Promise<Result<SerializedMeta[]>> {
|
|
81
|
+
const kb = await ctx.loader.keyBag();
|
|
82
|
+
if (!kb) {
|
|
83
|
+
return Promise.resolve(Result.Err(new Error("missing keybag")));
|
|
84
|
+
}
|
|
85
|
+
const dataUrl = await ctx.loader.attachedStores.local().active.car.url();
|
|
86
|
+
const keyName = dataUrl.getParam(PARAM.STORE_KEY);
|
|
87
|
+
if (!keyName) {
|
|
88
|
+
ctx.loader.sthis.logger.Warn().Url(dataUrl).Msg("missing store key");
|
|
89
|
+
} else {
|
|
90
|
+
const rKey = await kb.getNamedKey(keyName);
|
|
91
|
+
if (rKey.isErr()) {
|
|
92
|
+
ctx.loader.sthis.logger.Warn().Str("keyName", keyName).Msg("did not found a extractable key");
|
|
93
|
+
} else {
|
|
94
|
+
for (const keyStr of v2.keys) {
|
|
95
|
+
// side effect: in the keybag
|
|
96
|
+
// this is the key gossip protocol
|
|
97
|
+
// it basically collects all the keys that are used distributed metas
|
|
98
|
+
const res = await rKey.Ok().upsert(keyStr, false);
|
|
99
|
+
if (res.isErr()) {
|
|
100
|
+
ctx.loader.sthis.logger.Warn().Str("keyStr", keyStr).Msg("failed to upsert key");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return Promise.resolve(Result.Ok(v2.metas));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export async function decodeAsToSerializedMeta(ctx: SerdeGatewayCtx, raw: Uint8Array): Promise<Result<V2SerializedMetaKey>> {
|
|
109
|
+
const rJsObj = exception2Result(() => JSON.parse(ctx.loader.sthis.txt.decode(raw))) as Result<NonNullable<unknown>>;
|
|
110
|
+
if (rJsObj.isErr()) {
|
|
111
|
+
return Result.Err(rJsObj);
|
|
112
|
+
}
|
|
113
|
+
const v2 = toV2SerializedMetaKey(rJsObj.unwrap());
|
|
114
|
+
const metas = await V2SerializedMetaKeyExtractKey(ctx, v2);
|
|
115
|
+
if (metas.isErr()) {
|
|
116
|
+
return Result.Err(metas);
|
|
117
|
+
}
|
|
118
|
+
return Result.Ok({
|
|
119
|
+
metas: metas.Ok(),
|
|
120
|
+
keys: v2.keys,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function addKeyToDbMetaDecoder(
|
|
125
|
+
ctx: SerdeGatewayCtx & { readonly lastDecodedMetas?: V2SerializedMetaKey[] },
|
|
126
|
+
): SerdeGatewayCtx & { lastDecodedMetas: V2SerializedMetaKey[] } {
|
|
127
|
+
const lastDecodedMetas: V2SerializedMetaKey[] = ctx.lastDecodedMetas ?? [];
|
|
128
|
+
return {
|
|
129
|
+
...ctx,
|
|
130
|
+
lastDecodedMetas,
|
|
131
|
+
decoder: {
|
|
132
|
+
meta: async (sthis: SuperThis, raw: Uint8Array): Promise<Result<SerializedMeta[]>> => {
|
|
133
|
+
const r = await decodeAsToSerializedMeta(ctx, raw);
|
|
134
|
+
if (r.isErr()) {
|
|
135
|
+
return Promise.resolve(Result.Err(r));
|
|
136
|
+
}
|
|
137
|
+
// we only want to keep the last 2 metas
|
|
138
|
+
if (lastDecodedMetas.length > 2) {
|
|
139
|
+
lastDecodedMetas.shift();
|
|
140
|
+
}
|
|
141
|
+
lastDecodedMetas.push(r.Ok());
|
|
142
|
+
return Promise.resolve(Result.Ok(r.Ok().metas));
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function wrapEncode<T extends V1SerializedMetaKey[] | V2SerializedMetaKey>(
|
|
149
|
+
ctx: SerdeGatewayCtx,
|
|
150
|
+
payload: SerializedMeta[],
|
|
151
|
+
fn: (payload: SerializedMeta[], keyM: string[]) => T,
|
|
152
|
+
): Promise<Result<T>> {
|
|
153
|
+
const carStore = ctx.loader.attachedStores.local().active.car;
|
|
154
|
+
const kb = await ctx.loader.keyBag();
|
|
155
|
+
if (!kb) {
|
|
156
|
+
return Promise.resolve(Result.Err(new Error("missing keybag")));
|
|
157
|
+
}
|
|
158
|
+
const keyName = carStore.url().getParam(PARAM.STORE_KEY) ?? "";
|
|
159
|
+
const rKex = await kb.getNamedKey(keyName);
|
|
160
|
+
if (rKex.isErr()) {
|
|
161
|
+
return Promise.resolve(Result.Err(rKex.Err()));
|
|
162
|
+
}
|
|
163
|
+
/* security: we don't want to log the key */
|
|
164
|
+
const keyMaterials = await rKex
|
|
165
|
+
.Ok()
|
|
166
|
+
.asKeysItem()
|
|
167
|
+
.then((i) => Object.values(i.keys).map((i) => i.key));
|
|
168
|
+
|
|
169
|
+
return Promise.resolve(Result.Ok(fn(payload, keyMaterials)));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export function encodeAsV1SerializedMetaKey(
|
|
173
|
+
ctx: SerdeGatewayCtx,
|
|
174
|
+
payload: SerializedMeta[],
|
|
175
|
+
): Promise<Result<V1SerializedMetaKey[]>> {
|
|
176
|
+
return wrapEncode(ctx, payload, (payload, keyM) => payload.map((p) => ({ ...p, key: keyM }) satisfies V1SerializedMetaKey));
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export function encodeAsV2SerializedMetaKey(ctx: SerdeGatewayCtx, payload: SerializedMeta[]): Promise<Result<V2SerializedMetaKey>> {
|
|
180
|
+
return wrapEncode(
|
|
181
|
+
ctx,
|
|
182
|
+
payload,
|
|
183
|
+
(payload, keyM) =>
|
|
184
|
+
({
|
|
185
|
+
metas: payload,
|
|
186
|
+
keys: keyM,
|
|
187
|
+
}) satisfies V2SerializedMetaKey,
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function addKeyToDbMetaEncoder(ctx: SerdeGatewayCtx, version: "v1" | "v2"): SerdeGatewayCtx {
|
|
192
|
+
return {
|
|
193
|
+
...ctx,
|
|
194
|
+
encoder: {
|
|
195
|
+
meta: async (sthis: SuperThis, payload: SerializedMeta[]): Promise<Result<Uint8Array>> => {
|
|
196
|
+
let obj: Result<V1SerializedMetaKey[] | V2SerializedMetaKey>;
|
|
197
|
+
switch (version) {
|
|
198
|
+
case "v1":
|
|
199
|
+
obj = await encodeAsV1SerializedMetaKey(ctx, payload);
|
|
200
|
+
break;
|
|
201
|
+
case "v2":
|
|
202
|
+
obj = await encodeAsV2SerializedMetaKey(ctx, payload);
|
|
203
|
+
break;
|
|
204
|
+
default:
|
|
205
|
+
return Promise.resolve(Result.Err(`unknown version:[${version}]`));
|
|
206
|
+
}
|
|
207
|
+
if (obj.isErr()) {
|
|
208
|
+
return Promise.resolve(Result.Err(obj));
|
|
209
|
+
}
|
|
210
|
+
try {
|
|
211
|
+
return Promise.resolve(Result.Ok(sthis.txt.encode(JSON.stringify(obj.Ok()))));
|
|
212
|
+
} catch (e) {
|
|
213
|
+
return Promise.resolve(Result.Err(e as Error));
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export class AddKeyToDbMetaGateway implements SerdeGateway {
|
|
221
|
+
private readonly sdGw: DefSerdeGateway;
|
|
222
|
+
readonly version: "v1" | "v2";
|
|
223
|
+
constructor(gw: Gateway, version: "v1" | "v2") {
|
|
224
|
+
this.sdGw = new DefSerdeGateway(gw);
|
|
225
|
+
this.version = version;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
buildUrl(ctx: SerdeGatewayCtx, baseUrl: URI, key: string): Promise<Result<URI>> {
|
|
229
|
+
return this.sdGw.buildUrl(ctx, baseUrl, key);
|
|
230
|
+
}
|
|
231
|
+
start(ctx: SerdeGatewayCtx, baseUrl: URI): Promise<Result<URI>> {
|
|
232
|
+
return this.sdGw.start(ctx, baseUrl);
|
|
233
|
+
}
|
|
234
|
+
close(ctx: SerdeGatewayCtx, baseUrl: URI): Promise<Result<void, Error>> {
|
|
235
|
+
return this.sdGw.close(ctx, baseUrl);
|
|
236
|
+
}
|
|
237
|
+
async put<T>(ctx: SerdeGatewayCtx, url: URI, body: FPEnvelope<T>): Promise<Result<void, Error>> {
|
|
238
|
+
return this.sdGw.put(addKeyToDbMetaEncoder(ctx, this.version), url, body);
|
|
239
|
+
}
|
|
240
|
+
async get<S>(ctx: SerdeGatewayCtx, url: URI): Promise<Result<FPEnvelope<S>, Error | NotFoundError>> {
|
|
241
|
+
return this.sdGw.get(addKeyToDbMetaDecoder({ ...ctx, lastDecodedMetas: this.lastDecodedMetas }), url);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// only for tests
|
|
245
|
+
readonly lastDecodedMetas: V2SerializedMetaKey[] = [];
|
|
246
|
+
|
|
247
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
248
|
+
delete(ctx: SerdeGatewayCtx, url: URI, loader?: Loadable): Promise<Result<void, Error>> {
|
|
249
|
+
return this.sdGw.delete(ctx, url);
|
|
250
|
+
}
|
|
251
|
+
subscribe(ctx: SerdeGatewayCtx, url: URI, callback: (meta: FPEnvelopeMeta) => Promise<void>): Promise<Result<() => void, Error>> {
|
|
252
|
+
return this.sdGw.subscribe(addKeyToDbMetaDecoder({ ...ctx, lastDecodedMetas: this.lastDecodedMetas }), url, callback);
|
|
253
|
+
}
|
|
254
|
+
getPlain(ctx: SerdeGatewayCtx, url: URI, key: string): Promise<Result<Uint8Array>> {
|
|
255
|
+
return this.sdGw.getPlain(ctx, url, key);
|
|
256
|
+
}
|
|
257
|
+
destroy(ctx: SerdeGatewayCtx, baseUrl: URI): Promise<Result<void, Error>> {
|
|
258
|
+
return this.sdGw.destroy(ctx, baseUrl);
|
|
259
|
+
}
|
|
260
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fireproof/core-gateways-base",
|
|
3
|
+
"version": "0.0.0-smoke-1b31059-1752074105",
|
|
4
|
+
"description": "Live ledger for the web.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./index.js",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"ledger",
|
|
9
|
+
"JSON",
|
|
10
|
+
"document",
|
|
11
|
+
"IPLD",
|
|
12
|
+
"CID",
|
|
13
|
+
"IPFS"
|
|
14
|
+
],
|
|
15
|
+
"contributors": [
|
|
16
|
+
"J Chris Anderson",
|
|
17
|
+
"Alan Shaw",
|
|
18
|
+
"Travis Vachon",
|
|
19
|
+
"Mikeal Rogers",
|
|
20
|
+
"Meno Abels"
|
|
21
|
+
],
|
|
22
|
+
"author": "J Chris Anderson",
|
|
23
|
+
"license": "Apache-2.0 OR MIT",
|
|
24
|
+
"homepage": "https://use-fireproof.com",
|
|
25
|
+
"gptdoc": "import { fireproof } from 'use-fireproof'; const db = fireproof('app-db-name'); const ok = await db.put({ anyField: ['any','json'] }); const doc = await db.get(ok.id); await db.del(doc._id); db.subscribe(myRedrawFn); const result = await db.query('anyField', {range : ['a', 'z']}); result.rows.map(({ key }) => key);",
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "git+https://github.com/fireproof-storage/fireproof.git"
|
|
29
|
+
},
|
|
30
|
+
"bugs": {
|
|
31
|
+
"url": "https://github.com/fireproof-storage/fireproof/issues"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@adviser/cement": "^0.4.20",
|
|
35
|
+
"@fireproof/core-runtime": "0.0.0-smoke-1b31059-1752074105",
|
|
36
|
+
"@fireproof/core-types-base": "0.0.0-smoke-1b31059-1752074105",
|
|
37
|
+
"@fireproof/core-types-blockstore": "0.0.0-smoke-1b31059-1752074105",
|
|
38
|
+
"@ipld/dag-json": "^10.2.5",
|
|
39
|
+
"@web3-storage/pail": "^0.6.2",
|
|
40
|
+
"@fireproof/vendor": "^3.0.0"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc"
|
|
44
|
+
}
|
|
45
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": [
|
|
3
|
+
"/home/runner/work/fireproof/fireproof/tsconfig.dist.json"
|
|
4
|
+
],
|
|
5
|
+
"compilerOptions": {
|
|
6
|
+
"noEmit": false,
|
|
7
|
+
"outDir": "./"
|
|
8
|
+
},
|
|
9
|
+
"include": [
|
|
10
|
+
"**/*"
|
|
11
|
+
],
|
|
12
|
+
"exclude": [
|
|
13
|
+
"node_modules",
|
|
14
|
+
"dist",
|
|
15
|
+
".git",
|
|
16
|
+
".vscode"
|
|
17
|
+
]
|
|
18
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { URI, Promisable, Result } from "@adviser/cement";
|
|
2
|
+
import { PassThroughGateway } from "./interceptor-gateway.js";
|
|
3
|
+
import { FPEnvelope, FPEnvelopeMeta, SerdeGatewayBuildUrlReturn, SerdeGatewayCloseReturn, SerdeGatewayCtx, SerdeGatewayDeleteReturn, SerdeGatewayDestroyReturn, SerdeGatewayGetReturn, SerdeGatewayPutReturn, SerdeGatewayStartReturn, SerdeGatewaySubscribeReturn } from "@fireproof/core-types-blockstore";
|
|
4
|
+
export type URIMapper = (uri: URI) => Promisable<URI>;
|
|
5
|
+
export declare class URIInterceptor extends PassThroughGateway {
|
|
6
|
+
#private;
|
|
7
|
+
static withMapper(mapper: URIMapper): URIInterceptor;
|
|
8
|
+
addMapper(mapper: URIMapper): URIInterceptor;
|
|
9
|
+
buildUrl(ctx: SerdeGatewayCtx, url: URI, key: string): Promise<Result<SerdeGatewayBuildUrlReturn>>;
|
|
10
|
+
start(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayStartReturn>>;
|
|
11
|
+
close(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayCloseReturn>>;
|
|
12
|
+
delete(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayDeleteReturn>>;
|
|
13
|
+
destroy(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayDestroyReturn>>;
|
|
14
|
+
put<T>(ctx: SerdeGatewayCtx, url: URI, body: FPEnvelope<T>): Promise<Result<SerdeGatewayPutReturn<T>>>;
|
|
15
|
+
get<S>(ctx: SerdeGatewayCtx, url: URI): Promise<Result<SerdeGatewayGetReturn<S>>>;
|
|
16
|
+
subscribe(ctx: SerdeGatewayCtx, url: URI, callback: (meta: FPEnvelopeMeta) => Promise<void>): Promise<Result<SerdeGatewaySubscribeReturn>>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { PassThroughGateway } from "./interceptor-gateway.js";
|
|
2
|
+
export class URIInterceptor extends PassThroughGateway {
|
|
3
|
+
static withMapper(mapper) {
|
|
4
|
+
return new URIInterceptor().addMapper(mapper);
|
|
5
|
+
}
|
|
6
|
+
#uriMapper = new Set();
|
|
7
|
+
addMapper(mapper) {
|
|
8
|
+
this.#uriMapper.add(mapper);
|
|
9
|
+
return this;
|
|
10
|
+
}
|
|
11
|
+
async #map(uri) {
|
|
12
|
+
let ret = uri;
|
|
13
|
+
for (const mapper of this.#uriMapper) {
|
|
14
|
+
ret = await mapper(ret);
|
|
15
|
+
}
|
|
16
|
+
return ret;
|
|
17
|
+
}
|
|
18
|
+
async buildUrl(ctx, url, key) {
|
|
19
|
+
const ret = await super.buildUrl(ctx, await this.#map(url), key);
|
|
20
|
+
return ret;
|
|
21
|
+
}
|
|
22
|
+
async start(ctx, url) {
|
|
23
|
+
const ret = await super.start(ctx, await this.#map(url));
|
|
24
|
+
return ret;
|
|
25
|
+
}
|
|
26
|
+
async close(ctx, url) {
|
|
27
|
+
const ret = await super.close(ctx, await this.#map(url));
|
|
28
|
+
return ret;
|
|
29
|
+
}
|
|
30
|
+
async delete(ctx, url) {
|
|
31
|
+
const ret = await super.delete(ctx, await this.#map(url));
|
|
32
|
+
return ret;
|
|
33
|
+
}
|
|
34
|
+
async destroy(ctx, url) {
|
|
35
|
+
const ret = await super.destroy(ctx, await this.#map(url));
|
|
36
|
+
return ret;
|
|
37
|
+
}
|
|
38
|
+
async put(ctx, url, body) {
|
|
39
|
+
const ret = await super.put(ctx, await this.#map(url), body);
|
|
40
|
+
return ret;
|
|
41
|
+
}
|
|
42
|
+
async get(ctx, url) {
|
|
43
|
+
const ret = await super.get(ctx, await this.#map(url));
|
|
44
|
+
return ret;
|
|
45
|
+
}
|
|
46
|
+
async subscribe(ctx, url, callback) {
|
|
47
|
+
const ret = await super.subscribe(ctx, await this.#map(url), callback);
|
|
48
|
+
return ret;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=uri-interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uri-interceptor.js","sourceRoot":"","sources":["uri-interceptor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAiB9D,MAAM,OAAO,cAAe,SAAQ,kBAAkB;IACpD,MAAM,CAAC,UAAU,CAAC,MAAiB;QACjC,OAAO,IAAI,cAAc,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAEQ,UAAU,GAAG,IAAI,GAAG,EAAa,CAAC;IAE3C,SAAS,CAAC,MAAiB;QACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAQ;QACjB,IAAI,GAAG,GAAG,GAAG,CAAC;QACd,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAoB,EAAE,GAAQ,EAAE,GAAW;QACxD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACjE,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,GAAoB,EAAE,GAAQ;QACxC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,GAAoB,EAAE,GAAQ;QACxC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,GAAoB,EAAE,GAAQ;QACzC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,GAAoB,EAAE,GAAQ;QAC1C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,CAAC,GAAG,CAAI,GAAoB,EAAE,GAAQ,EAAE,IAAmB;QAC9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAI,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAChE,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,CAAC,GAAG,CAAI,GAAoB,EAAE,GAAQ;QACzC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAI,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,CAAC,SAAS,CACb,GAAoB,EACpB,GAAQ,EACR,QAAiD;QAEjD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QACvE,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|