@vibes.diy/api-svc 2.2.6 → 2.2.8
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/cf-serve.d.ts +3 -1
- package/cf-serve.js +6 -2
- package/cf-serve.js.map +1 -1
- package/create-handler.d.ts +6 -2
- package/create-handler.js +4 -1
- package/create-handler.js.map +1 -1
- package/default-llm-request.d.ts +4 -0
- package/default-llm-request.js +2 -1
- package/default-llm-request.js.map +1 -1
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/intern/ensure-app-metadata.d.ts +13 -0
- package/intern/ensure-app-metadata.js +94 -0
- package/intern/ensure-app-metadata.js.map +1 -0
- package/intern/ensure-chat-id.js +21 -2
- package/intern/ensure-chat-id.js.map +1 -1
- package/intern/pre-allocate.d.ts +1 -0
- package/intern/pre-allocate.js +1 -0
- package/intern/pre-allocate.js.map +1 -1
- package/intern/recovery.d.ts +37 -0
- package/intern/recovery.js +101 -0
- package/intern/recovery.js.map +1 -0
- package/package.json +13 -13
- package/peers/r2-to-s3api.d.ts +20 -8
- package/peers/r2-to-s3api.js +312 -23
- package/peers/r2-to-s3api.js.map +1 -1
- package/peers/s3.d.ts +9 -4
- package/peers/s3.js +17 -23
- package/peers/s3.js.map +1 -1
- package/public/app-documents.js +3 -3
- package/public/app-documents.js.map +1 -1
- package/public/ensure-app-settings.js +52 -1
- package/public/ensure-app-settings.js.map +1 -1
- package/public/ensure-app-slug-item.d.ts +5 -2
- package/public/ensure-app-slug-item.js +36 -4
- package/public/ensure-app-slug-item.js.map +1 -1
- package/public/prompt-chat-section.d.ts +41 -2
- package/public/prompt-chat-section.js +394 -60
- package/public/prompt-chat-section.js.map +1 -1
- package/svc-ws-send-provider.d.ts +1 -0
- package/svc-ws-send-provider.js +1 -0
- package/svc-ws-send-provider.js.map +1 -1
- package/types.d.ts +3 -1
- package/usage-report/r2-affected-apps.sh +60 -0
- package/usage-report/r2-validate.sh +160 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../jsr/intern/recovery.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibes.diy/api-svc",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@adviser/cement": "~0.5.34",
|
|
16
16
|
"@adviser/scopey": "~0.0.4",
|
|
17
|
-
"@cloudflare/workers-types": "~4.
|
|
17
|
+
"@cloudflare/workers-types": "~4.20260402.1",
|
|
18
18
|
"@fireproof/core-device-id": "~0.24.19",
|
|
19
19
|
"@fireproof/core-protocols-dashboard": "~0.24.19",
|
|
20
20
|
"@fireproof/core-runtime": "~0.24.19",
|
|
@@ -23,19 +23,19 @@
|
|
|
23
23
|
"@fireproof/core-types-protocols-cloud": "~0.24.19",
|
|
24
24
|
"@fireproof/core-types-protocols-dashboard": "~0.24.19",
|
|
25
25
|
"@libsql/client": "~0.17.2",
|
|
26
|
-
"@neondatabase/serverless": "~1.0
|
|
27
|
-
"@noble/hashes": "~2.0
|
|
28
|
-
"@vibes.diy/api-impl": "2.2.
|
|
29
|
-
"@vibes.diy/api-pkg": "2.2.
|
|
30
|
-
"@vibes.diy/api-sql": "2.2.
|
|
31
|
-
"@vibes.diy/api-types": "2.2.
|
|
32
|
-
"@vibes.diy/call-ai-v2": "2.2.
|
|
33
|
-
"@vibes.diy/prompts": "2.2.
|
|
34
|
-
"@vibes.diy/use-vibes-base": "2.2.
|
|
35
|
-
"@vibes.diy/vibe-db-explorer": "2.2.
|
|
26
|
+
"@neondatabase/serverless": "~1.1.0",
|
|
27
|
+
"@noble/hashes": "~2.2.0",
|
|
28
|
+
"@vibes.diy/api-impl": "2.2.8",
|
|
29
|
+
"@vibes.diy/api-pkg": "2.2.8",
|
|
30
|
+
"@vibes.diy/api-sql": "2.2.8",
|
|
31
|
+
"@vibes.diy/api-types": "2.2.8",
|
|
32
|
+
"@vibes.diy/call-ai-v2": "2.2.8",
|
|
33
|
+
"@vibes.diy/prompts": "2.2.8",
|
|
34
|
+
"@vibes.diy/use-vibes-base": "2.2.8",
|
|
35
|
+
"@vibes.diy/vibe-db-explorer": "2.2.8",
|
|
36
36
|
"acorn": "~8.16.0",
|
|
37
37
|
"arktype": "~2.2.0",
|
|
38
|
-
"call-ai": "2.2.
|
|
38
|
+
"call-ai": "2.2.8",
|
|
39
39
|
"cookie": "~1.1.1",
|
|
40
40
|
"drizzle-orm": "~0.45.2",
|
|
41
41
|
"jose": "~6.2.2",
|
package/peers/r2-to-s3api.d.ts
CHANGED
|
@@ -1,16 +1,28 @@
|
|
|
1
1
|
import { Result } from "@adviser/cement";
|
|
2
|
-
import {
|
|
3
|
-
import { SuperThis } from "@fireproof/core-types-base";
|
|
4
|
-
import { FetchResult, S3Api } from "@vibes.diy/api-types";
|
|
2
|
+
import type { R2GetOptions, R2MultipartUpload, R2Object, R2ObjectBody } from "@cloudflare/workers-types";
|
|
3
|
+
import type { SuperThis } from "@fireproof/core-types-base";
|
|
4
|
+
import type { FetchResult, S3Api, S3PutOptions, S3RenameOptions } from "@vibes.diy/api-types";
|
|
5
|
+
export interface R2BucketSubset {
|
|
6
|
+
get(key: string, options?: R2GetOptions): Promise<R2ObjectBody | null>;
|
|
7
|
+
head(key: string): Promise<R2Object | null>;
|
|
8
|
+
put(key: string, value: Uint8Array): Promise<R2Object>;
|
|
9
|
+
delete(key: string): Promise<void>;
|
|
10
|
+
createMultipartUpload(key: string): Promise<R2MultipartUpload>;
|
|
11
|
+
}
|
|
5
12
|
export declare class R2ToS3Api implements S3Api {
|
|
6
|
-
private r2;
|
|
7
|
-
private smThis;
|
|
8
|
-
|
|
13
|
+
private readonly r2;
|
|
14
|
+
private readonly smThis;
|
|
15
|
+
private readonly pendingPuts;
|
|
16
|
+
constructor(r2: R2BucketSubset, smThis: {
|
|
9
17
|
nextId: SuperThis["nextId"];
|
|
10
18
|
});
|
|
11
19
|
genId(): string;
|
|
12
20
|
private toKey;
|
|
13
21
|
get(iurl: string): Promise<FetchResult>;
|
|
14
|
-
put(iurl: string): Promise<WritableStream<Uint8Array>>;
|
|
15
|
-
|
|
22
|
+
put(iurl: string, opts?: S3PutOptions): Promise<WritableStream<Uint8Array>>;
|
|
23
|
+
awaitPut(iurl: string): Promise<void>;
|
|
24
|
+
rename(fromUrl: string, toUrl: string, opts?: S3RenameOptions): Promise<Result<void>>;
|
|
25
|
+
private copySmallObject;
|
|
26
|
+
private copyLargeObjectStreaming;
|
|
27
|
+
private abortQuiet;
|
|
16
28
|
}
|
package/peers/r2-to-s3api.js
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
|
-
import { Result, URI } from "@adviser/cement";
|
|
1
|
+
import { exception2Result, Result, URI } from "@adviser/cement";
|
|
2
|
+
const PART_SIZE = 5 * 1024 * 1024;
|
|
3
|
+
function concatChunks(chunks, total) {
|
|
4
|
+
const merged = new Uint8Array(total);
|
|
5
|
+
let off = 0;
|
|
6
|
+
for (const c of chunks) {
|
|
7
|
+
merged.set(c, off);
|
|
8
|
+
off += c.length;
|
|
9
|
+
}
|
|
10
|
+
return merged;
|
|
11
|
+
}
|
|
2
12
|
export class R2ToS3Api {
|
|
3
13
|
r2;
|
|
4
14
|
smThis;
|
|
15
|
+
pendingPuts = new Map();
|
|
5
16
|
constructor(r2, smThis) {
|
|
6
17
|
this.r2 = r2;
|
|
7
18
|
this.smThis = smThis;
|
|
@@ -10,38 +21,316 @@ export class R2ToS3Api {
|
|
|
10
21
|
return this.smThis.nextId(12).str;
|
|
11
22
|
}
|
|
12
23
|
toKey(iurl) {
|
|
13
|
-
return URI.from(iurl).pathname.replace(
|
|
24
|
+
return URI.from(iurl).pathname.replace(/^\/+/, "");
|
|
14
25
|
}
|
|
15
26
|
async get(iurl) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
27
|
+
const r = await exception2Result(() => this.r2.get(this.toKey(iurl)));
|
|
28
|
+
if (r.isErr()) {
|
|
29
|
+
const err = r.Err();
|
|
30
|
+
console.error(`R2ToS3Api.get(${iurl}) failed:`, err);
|
|
31
|
+
return { type: "fetch.err", url: iurl, error: err };
|
|
32
|
+
}
|
|
33
|
+
const obj = r.Ok();
|
|
34
|
+
if (obj === null) {
|
|
35
|
+
return { type: "fetch.notfound", url: iurl };
|
|
36
|
+
}
|
|
37
|
+
return { type: "fetch.ok", url: iurl, data: obj.body };
|
|
38
|
+
}
|
|
39
|
+
async put(iurl, opts) {
|
|
40
|
+
const key = this.toKey(iurl);
|
|
41
|
+
const r2 = this.r2;
|
|
42
|
+
const pendingPuts = this.pendingPuts;
|
|
43
|
+
const onProgress = opts?.onProgress;
|
|
44
|
+
let chunks = [];
|
|
45
|
+
let bufferedBytes = 0;
|
|
46
|
+
let multipartPromise = undefined;
|
|
47
|
+
let nextPartNumber = 1;
|
|
48
|
+
const inFlightParts = [];
|
|
49
|
+
let totalBytesUploaded = 0;
|
|
50
|
+
let resolveDone;
|
|
51
|
+
let rejectDone;
|
|
52
|
+
const donePromise = new Promise((resolve, reject) => {
|
|
53
|
+
resolveDone = resolve;
|
|
54
|
+
rejectDone = reject;
|
|
55
|
+
});
|
|
56
|
+
const settled = donePromise.then(() => {
|
|
57
|
+
pendingPuts.delete(key);
|
|
58
|
+
}, () => {
|
|
59
|
+
pendingPuts.delete(key);
|
|
60
|
+
});
|
|
61
|
+
pendingPuts.set(key, settled);
|
|
62
|
+
const ensureMultipart = () => {
|
|
63
|
+
if (multipartPromise === undefined) {
|
|
64
|
+
multipartPromise = exception2Result(() => r2.createMultipartUpload(key));
|
|
65
|
+
}
|
|
66
|
+
return multipartPromise;
|
|
67
|
+
};
|
|
68
|
+
const flushPartBackground = () => {
|
|
69
|
+
const merged = concatChunks(chunks, bufferedBytes);
|
|
70
|
+
chunks = [];
|
|
71
|
+
bufferedBytes = 0;
|
|
72
|
+
const myPartNumber = nextPartNumber++;
|
|
73
|
+
const partBytes = merged.byteLength;
|
|
74
|
+
return (async () => {
|
|
75
|
+
const mpResult = await ensureMultipart();
|
|
76
|
+
if (mpResult.isErr())
|
|
77
|
+
return Result.Err(mpResult.Err());
|
|
78
|
+
const mp = mpResult.Ok();
|
|
79
|
+
const r = await exception2Result(() => mp.uploadPart(myPartNumber, merged));
|
|
80
|
+
if (r.isOk() && onProgress) {
|
|
81
|
+
totalBytesUploaded += partBytes;
|
|
82
|
+
onProgress({ stage: "uploading-part", partNumber: myPartNumber, bytes: totalBytesUploaded });
|
|
83
|
+
}
|
|
84
|
+
return r;
|
|
85
|
+
})();
|
|
86
|
+
};
|
|
87
|
+
const finalize = async () => {
|
|
88
|
+
const partResults = await Promise.all(inFlightParts);
|
|
89
|
+
const firstErr = partResults.find((r) => r.isErr());
|
|
90
|
+
if (firstErr !== undefined) {
|
|
91
|
+
const mpResult = multipartPromise === undefined ? undefined : await multipartPromise;
|
|
92
|
+
if (mpResult !== undefined && mpResult.isOk()) {
|
|
93
|
+
const mp = mpResult.Ok();
|
|
94
|
+
const ar = await exception2Result(() => mp.abort());
|
|
95
|
+
if (ar.isErr())
|
|
96
|
+
console.error(`R2ToS3Api.put(${key}) abort after part failure also failed:`, ar.Err());
|
|
97
|
+
}
|
|
98
|
+
return Result.Err(firstErr.Err());
|
|
99
|
+
}
|
|
100
|
+
if (multipartPromise === undefined) {
|
|
101
|
+
const small = concatChunks(chunks, bufferedBytes);
|
|
102
|
+
const rPut = await exception2Result(() => r2.put(key, small).then(() => undefined));
|
|
103
|
+
if (rPut.isOk() && onProgress) {
|
|
104
|
+
onProgress({ stage: "asset-stored", bytes: small.byteLength });
|
|
105
|
+
}
|
|
106
|
+
return rPut;
|
|
107
|
+
}
|
|
108
|
+
if (chunks.length > 0) {
|
|
109
|
+
const finalR = await flushPartBackground();
|
|
110
|
+
if (finalR.isErr()) {
|
|
111
|
+
const mpResult = await multipartPromise;
|
|
112
|
+
if (mpResult.isOk()) {
|
|
113
|
+
const mp = mpResult.Ok();
|
|
114
|
+
const ar = await exception2Result(() => mp.abort());
|
|
115
|
+
if (ar.isErr())
|
|
116
|
+
console.error(`R2ToS3Api.put(${key}) abort after final-part failure also failed:`, ar.Err());
|
|
117
|
+
}
|
|
118
|
+
return Result.Err(finalR.Err());
|
|
119
|
+
}
|
|
120
|
+
partResults.push(finalR);
|
|
121
|
+
}
|
|
122
|
+
const completed = partResults.flatMap((r) => (r.isOk() ? [r.Ok()] : []));
|
|
123
|
+
const mpResult = await multipartPromise;
|
|
124
|
+
if (mpResult.isErr())
|
|
125
|
+
return Result.Err(mpResult.Err());
|
|
126
|
+
const mp = mpResult.Ok();
|
|
127
|
+
const completeR = await exception2Result(() => mp.complete(completed).then(() => undefined));
|
|
128
|
+
if (completeR.isErr()) {
|
|
129
|
+
const ar = await exception2Result(() => mp.abort());
|
|
130
|
+
if (ar.isErr())
|
|
131
|
+
console.error(`R2ToS3Api.put(${key}) abort after complete failure also failed:`, ar.Err());
|
|
132
|
+
}
|
|
133
|
+
else if (onProgress) {
|
|
134
|
+
onProgress({ stage: "asset-stored", bytes: totalBytesUploaded });
|
|
135
|
+
}
|
|
136
|
+
return completeR;
|
|
137
|
+
};
|
|
138
|
+
const finalizeInBackground = () => {
|
|
139
|
+
finalize().then((r) => {
|
|
140
|
+
if (r.isErr()) {
|
|
141
|
+
const err = r.Err();
|
|
142
|
+
console.error(`R2ToS3Api.put(${key}) finalize failed:`, err);
|
|
143
|
+
rejectDone(err);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
resolveDone();
|
|
147
|
+
}
|
|
148
|
+
}, (e) => {
|
|
149
|
+
const err = e instanceof Error ? e : new Error(String(e));
|
|
150
|
+
console.error(`R2ToS3Api.put(${key}) finalize threw:`, err);
|
|
151
|
+
rejectDone(err);
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
return new WritableStream({
|
|
155
|
+
write(chunk) {
|
|
156
|
+
chunks.push(chunk);
|
|
157
|
+
bufferedBytes += chunk.byteLength;
|
|
158
|
+
if (bufferedBytes > PART_SIZE) {
|
|
159
|
+
inFlightParts.push(flushPartBackground());
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
close() {
|
|
163
|
+
finalizeInBackground();
|
|
164
|
+
},
|
|
165
|
+
async abort(reason) {
|
|
166
|
+
const err = reason instanceof Error ? reason : new Error(String(reason));
|
|
167
|
+
if (multipartPromise !== undefined) {
|
|
168
|
+
const mpResult = await multipartPromise;
|
|
169
|
+
if (mpResult.isOk()) {
|
|
170
|
+
const mp = mpResult.Ok();
|
|
171
|
+
const ar = await exception2Result(() => mp.abort());
|
|
172
|
+
if (ar.isErr())
|
|
173
|
+
console.error(`R2ToS3Api.put(${key}) abort failed:`, ar.Err());
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
rejectDone(err);
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
async awaitPut(iurl) {
|
|
181
|
+
const pending = this.pendingPuts.get(this.toKey(iurl));
|
|
182
|
+
if (pending !== undefined) {
|
|
183
|
+
await pending;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async rename(fromUrl, toUrl, opts) {
|
|
187
|
+
const fromKey = this.toKey(fromUrl);
|
|
188
|
+
const toKey = this.toKey(toUrl);
|
|
189
|
+
const onProgress = opts?.onProgress;
|
|
190
|
+
await this.awaitPut(fromUrl);
|
|
191
|
+
const rHead = await exception2Result(() => this.r2.head(fromKey));
|
|
192
|
+
if (rHead.isErr()) {
|
|
193
|
+
const err = rHead.Err();
|
|
194
|
+
console.error(`R2ToS3Api.rename(${fromUrl}) head failed:`, err);
|
|
195
|
+
return Result.Err(err);
|
|
196
|
+
}
|
|
197
|
+
const srcMeta = rHead.Ok();
|
|
198
|
+
if (srcMeta === null) {
|
|
199
|
+
const err = new Error(`Object not found: ${fromUrl}`);
|
|
200
|
+
console.error(`R2ToS3Api.rename: ${err.message}`);
|
|
201
|
+
return Result.Err(err);
|
|
202
|
+
}
|
|
203
|
+
const sourceSize = srcMeta.size;
|
|
204
|
+
if (sourceSize <= PART_SIZE) {
|
|
205
|
+
const rCopy = await this.copySmallObject(fromKey, toKey);
|
|
206
|
+
if (rCopy.isErr())
|
|
207
|
+
return rCopy;
|
|
208
|
+
if (onProgress) {
|
|
209
|
+
onProgress({ stage: "asset-renamed", bytes: sourceSize });
|
|
20
210
|
}
|
|
21
|
-
return { type: "fetch.ok", url: iurl, data: obj.body };
|
|
22
211
|
}
|
|
23
|
-
|
|
24
|
-
|
|
212
|
+
else {
|
|
213
|
+
const rCopy = await this.copyLargeObjectStreaming(fromKey, toKey, sourceSize, onProgress);
|
|
214
|
+
if (rCopy.isErr())
|
|
215
|
+
return rCopy;
|
|
25
216
|
}
|
|
217
|
+
const rDestHead = await exception2Result(() => this.r2.head(toKey));
|
|
218
|
+
if (rDestHead.isErr()) {
|
|
219
|
+
const err = rDestHead.Err();
|
|
220
|
+
console.error(`R2ToS3Api.rename(${toUrl}) destination head failed:`, err);
|
|
221
|
+
return Result.Err(err);
|
|
222
|
+
}
|
|
223
|
+
const dest = rDestHead.Ok();
|
|
224
|
+
if (dest === null) {
|
|
225
|
+
const err = new Error(`Destination put failed: ${toUrl}`);
|
|
226
|
+
console.error(`R2ToS3Api.rename: ${err.message}`);
|
|
227
|
+
return Result.Err(err);
|
|
228
|
+
}
|
|
229
|
+
if (dest.size !== sourceSize) {
|
|
230
|
+
const err = new Error(`Destination size mismatch: from=${sourceSize} to=${dest.size}`);
|
|
231
|
+
console.error(`R2ToS3Api.rename: ${err.message}`);
|
|
232
|
+
return Result.Err(err);
|
|
233
|
+
}
|
|
234
|
+
const rDel = await exception2Result(() => this.r2.delete(fromKey));
|
|
235
|
+
if (rDel.isErr()) {
|
|
236
|
+
const err = rDel.Err();
|
|
237
|
+
console.error(`R2ToS3Api.rename(${fromUrl}) delete failed:`, err);
|
|
238
|
+
return Result.Err(err);
|
|
239
|
+
}
|
|
240
|
+
return Result.Ok(undefined);
|
|
26
241
|
}
|
|
27
|
-
async
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
242
|
+
async copySmallObject(fromKey, toKey) {
|
|
243
|
+
const rGet = await exception2Result(() => this.r2.get(fromKey));
|
|
244
|
+
if (rGet.isErr()) {
|
|
245
|
+
const err = rGet.Err();
|
|
246
|
+
console.error(`R2ToS3Api.rename get(${fromKey}) failed:`, err);
|
|
247
|
+
return Result.Err(err);
|
|
248
|
+
}
|
|
249
|
+
const src = rGet.Ok();
|
|
250
|
+
if (src === null) {
|
|
251
|
+
const err = new Error(`Object disappeared during rename: ${fromKey}`);
|
|
252
|
+
console.error(`R2ToS3Api.rename: ${err.message}`);
|
|
253
|
+
return Result.Err(err);
|
|
254
|
+
}
|
|
255
|
+
const rBytes = await exception2Result(() => src.arrayBuffer());
|
|
256
|
+
if (rBytes.isErr()) {
|
|
257
|
+
const err = rBytes.Err();
|
|
258
|
+
console.error(`R2ToS3Api.rename arrayBuffer(${fromKey}) failed:`, err);
|
|
259
|
+
return Result.Err(err);
|
|
260
|
+
}
|
|
261
|
+
const rPut = await exception2Result(() => this.r2.put(toKey, new Uint8Array(rBytes.Ok())));
|
|
262
|
+
if (rPut.isErr()) {
|
|
263
|
+
const err = rPut.Err();
|
|
264
|
+
console.error(`R2ToS3Api.rename put(${toKey}) failed:`, err);
|
|
265
|
+
return Result.Err(err);
|
|
266
|
+
}
|
|
267
|
+
return Result.Ok(undefined);
|
|
31
268
|
}
|
|
32
|
-
async
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
269
|
+
async copyLargeObjectStreaming(fromKey, toKey, sourceSize, onProgress) {
|
|
270
|
+
const rMp = await exception2Result(() => this.r2.createMultipartUpload(toKey));
|
|
271
|
+
if (rMp.isErr()) {
|
|
272
|
+
const err = rMp.Err();
|
|
273
|
+
console.error(`R2ToS3Api.rename createMultipartUpload(${toKey}) failed:`, err);
|
|
274
|
+
return Result.Err(err);
|
|
275
|
+
}
|
|
276
|
+
const mp = rMp.Ok();
|
|
277
|
+
const completedParts = [];
|
|
278
|
+
let partNumber = 1;
|
|
279
|
+
let totalCopied = 0;
|
|
280
|
+
for (let offset = 0; offset < sourceSize; offset += PART_SIZE) {
|
|
281
|
+
const length = Math.min(PART_SIZE, sourceSize - offset);
|
|
282
|
+
const rGet = await exception2Result(() => this.r2.get(fromKey, { range: { offset, length } }));
|
|
283
|
+
if (rGet.isErr()) {
|
|
284
|
+
const err = rGet.Err();
|
|
285
|
+
console.error(`R2ToS3Api.rename range-get(${fromKey}, offset=${offset}) failed:`, err);
|
|
286
|
+
await this.abortQuiet(mp, toKey);
|
|
287
|
+
return Result.Err(err);
|
|
288
|
+
}
|
|
289
|
+
const part = rGet.Ok();
|
|
290
|
+
if (part === null) {
|
|
291
|
+
const err = new Error(`Range get returned null on ${fromKey} at offset=${offset}`);
|
|
292
|
+
console.error(`R2ToS3Api.rename: ${err.message}`);
|
|
293
|
+
await this.abortQuiet(mp, toKey);
|
|
294
|
+
return Result.Err(err);
|
|
295
|
+
}
|
|
296
|
+
const rBytes = await exception2Result(() => part.arrayBuffer());
|
|
297
|
+
if (rBytes.isErr()) {
|
|
298
|
+
const err = rBytes.Err();
|
|
299
|
+
console.error(`R2ToS3Api.rename arrayBuffer(${fromKey}, offset=${offset}) failed:`, err);
|
|
300
|
+
await this.abortQuiet(mp, toKey);
|
|
301
|
+
return Result.Err(err);
|
|
302
|
+
}
|
|
303
|
+
const bytes = new Uint8Array(rBytes.Ok());
|
|
304
|
+
const rUpload = await exception2Result(() => mp.uploadPart(partNumber, bytes));
|
|
305
|
+
if (rUpload.isErr()) {
|
|
306
|
+
const err = rUpload.Err();
|
|
307
|
+
console.error(`R2ToS3Api.rename uploadPart(${toKey}, part=${partNumber}) failed:`, err);
|
|
308
|
+
await this.abortQuiet(mp, toKey);
|
|
309
|
+
return Result.Err(err);
|
|
37
310
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
311
|
+
completedParts.push(rUpload.Ok());
|
|
312
|
+
totalCopied += bytes.byteLength;
|
|
313
|
+
if (onProgress) {
|
|
314
|
+
onProgress({ stage: "rename-part", partNumber, bytes: totalCopied });
|
|
315
|
+
}
|
|
316
|
+
partNumber += 1;
|
|
317
|
+
}
|
|
318
|
+
const rComplete = await exception2Result(() => mp.complete(completedParts).then(() => undefined));
|
|
319
|
+
if (rComplete.isErr()) {
|
|
320
|
+
const err = rComplete.Err();
|
|
321
|
+
console.error(`R2ToS3Api.rename complete(${toKey}) failed:`, err);
|
|
322
|
+
await this.abortQuiet(mp, toKey);
|
|
323
|
+
return Result.Err(err);
|
|
41
324
|
}
|
|
42
|
-
|
|
43
|
-
|
|
325
|
+
if (onProgress) {
|
|
326
|
+
onProgress({ stage: "asset-renamed", bytes: totalCopied });
|
|
44
327
|
}
|
|
328
|
+
return Result.Ok(undefined);
|
|
329
|
+
}
|
|
330
|
+
async abortQuiet(mp, key) {
|
|
331
|
+
const ar = await exception2Result(() => mp.abort());
|
|
332
|
+
if (ar.isErr())
|
|
333
|
+
console.error(`R2ToS3Api.rename abort(${key}) failed:`, ar.Err());
|
|
45
334
|
}
|
|
46
335
|
}
|
|
47
336
|
//# sourceMappingURL=r2-to-s3api.js.map
|
package/peers/r2-to-s3api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r2-to-s3api.js","sourceRoot":"","sources":["../../jsr/peers/r2-to-s3api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAK9C,MAAM,OAAO,SAAS;IACZ,EAAE,CAAW;IACb,MAAM,CAAkC;IAChD,YAAY,EAAY,EAAE,MAAuC;QAC/D,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IACD,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;IACpC,CAAC;IACO,KAAK,CAAC,IAAY;QACxB,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;YAC/C,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAA6C,EAAE,CAAC;QAClG,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,CAAC;IACH,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,eAAe,EAA0B,CAAC;QAE7E,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAuC,CAAC,CAAC;QAC5E,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,KAAa;QACzC,IAAI,CAAC;YAEH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACnD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,OAAO,MAAM,CAAC,GAAG,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,IAAmC,CAAC,CAAC;YAC9E,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1C,OAAO,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,MAAM,CAAC,GAAG,CAAC,CAAU,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"r2-to-s3api.js","sourceRoot":"","sources":["../../jsr/peers/r2-to-s3api.ts"],"names":[],"mappings":"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"}
|
package/peers/s3.d.ts
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import { Option, URI, Result } from "@adviser/cement";
|
|
2
|
-
import { Cider, PeerStreamWithCommit, PeerWithCommit } from "@vibes.diy/api-pkg";
|
|
3
|
-
import { FetchResult, S3Api } from "@vibes.diy/api-types";
|
|
2
|
+
import { Cider, PeerFetch, PeerStreamWithCommit, PeerWithCommit, StoragePeer } from "@vibes.diy/api-pkg";
|
|
3
|
+
import type { FetchResult, S3Api, StorageProgressFn } from "@vibes.diy/api-types";
|
|
4
4
|
export declare class S3Peer implements PeerWithCommit {
|
|
5
5
|
readonly s3: S3Api;
|
|
6
6
|
readonly cider: Cider;
|
|
7
|
-
|
|
7
|
+
readonly onProgress?: StorageProgressFn;
|
|
8
|
+
constructor(s3: S3Api, cider: Cider, onProgress?: StorageProgressFn);
|
|
8
9
|
begin(): Promise<Result<PeerStreamWithCommit>>;
|
|
9
10
|
}
|
|
10
|
-
export declare class S3PeerFetch {
|
|
11
|
+
export declare class S3PeerFetch implements PeerFetch {
|
|
11
12
|
readonly s3: S3Api;
|
|
12
13
|
constructor(s3: S3Api);
|
|
13
14
|
fetch(url: URI): Promise<Option<FetchResult>>;
|
|
14
15
|
}
|
|
16
|
+
export interface CreateS3PeerParams {
|
|
17
|
+
s3: S3Api;
|
|
18
|
+
}
|
|
19
|
+
export declare function createS3Peer(params: CreateS3PeerParams): StoragePeer;
|
package/peers/s3.js
CHANGED
|
@@ -1,58 +1,47 @@
|
|
|
1
1
|
import { Option, Result, exception2Result } from "@adviser/cement";
|
|
2
2
|
const S3_PEER_PROTOCOL = "s3:";
|
|
3
|
+
const S3_PEER_HOST = "r2";
|
|
3
4
|
class S3PeerStream {
|
|
4
5
|
owner;
|
|
5
6
|
tmpUrl;
|
|
6
7
|
writer;
|
|
7
8
|
constructor(owner, tmpUrl, writer) {
|
|
8
|
-
console.log("S3PeerStream constructor called, tmpUrl:", tmpUrl);
|
|
9
9
|
this.owner = owner;
|
|
10
10
|
this.writer = writer;
|
|
11
11
|
this.tmpUrl = tmpUrl;
|
|
12
12
|
}
|
|
13
13
|
write(chunk) {
|
|
14
|
-
console.log("S3PeerStream write called, chunk size:", chunk.length);
|
|
15
14
|
return this.writer.write(chunk);
|
|
16
15
|
}
|
|
17
16
|
async cancel() {
|
|
18
|
-
console.log("S3PeerStream cancel called");
|
|
19
17
|
return this.writer.abort();
|
|
20
18
|
}
|
|
21
19
|
async close() {
|
|
22
|
-
|
|
23
|
-
return this.writer.close();
|
|
20
|
+
await this.writer.close();
|
|
24
21
|
}
|
|
25
22
|
async commit() {
|
|
26
|
-
console.log("S3PeerStream commit called, tmpUrl:", this.tmpUrl);
|
|
27
23
|
const { cid: assetID } = await this.owner.cider.getCID();
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
const res = await this.owner.s3.rename(this.tmpUrl, url);
|
|
31
|
-
console.log("S3PeerStream commit called, rename result:", assetID, res);
|
|
24
|
+
const url = `${S3_PEER_PROTOCOL}//${S3_PEER_HOST}/${assetID}`;
|
|
25
|
+
const res = await this.owner.s3.rename(this.tmpUrl, url, { onProgress: this.owner.onProgress });
|
|
32
26
|
if (res.isErr()) {
|
|
33
27
|
return Result.Err(res);
|
|
34
28
|
}
|
|
35
|
-
|
|
36
|
-
return Result.Ok({
|
|
37
|
-
url,
|
|
38
|
-
});
|
|
29
|
+
return Result.Ok({ url });
|
|
39
30
|
}
|
|
40
31
|
}
|
|
41
32
|
export class S3Peer {
|
|
42
33
|
s3;
|
|
43
34
|
cider;
|
|
44
|
-
|
|
45
|
-
|
|
35
|
+
onProgress;
|
|
36
|
+
constructor(s3, cider, onProgress) {
|
|
46
37
|
this.s3 = s3;
|
|
47
38
|
this.cider = cider;
|
|
39
|
+
this.onProgress = onProgress;
|
|
48
40
|
}
|
|
49
41
|
async begin() {
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
console.log("S3Peer begin called, generated tmpUrl:", tmpUrl);
|
|
53
|
-
const rWriter = await exception2Result(() => this.s3.put(tmpUrl).then((stream) => stream.getWriter()));
|
|
42
|
+
const tmpUrl = `${S3_PEER_PROTOCOL}//${S3_PEER_HOST}/temp/${this.s3.genId()}.tmp`;
|
|
43
|
+
const rWriter = await exception2Result(() => this.s3.put(tmpUrl, { onProgress: this.onProgress }).then((stream) => stream.getWriter()));
|
|
54
44
|
if (rWriter.isErr()) {
|
|
55
|
-
console.log("S3Peer begin error getting writer for tmpUrl:", tmpUrl, "error:", rWriter.Err());
|
|
56
45
|
return Result.Err(rWriter.Err());
|
|
57
46
|
}
|
|
58
47
|
return Result.Ok(new S3PeerStream(this, tmpUrl, rWriter.Ok()));
|
|
@@ -67,8 +56,13 @@ export class S3PeerFetch {
|
|
|
67
56
|
if (url.protocol !== S3_PEER_PROTOCOL) {
|
|
68
57
|
return Promise.resolve(Option.None());
|
|
69
58
|
}
|
|
70
|
-
|
|
71
|
-
return Option.Some(await this.s3.get(assetId));
|
|
59
|
+
return Option.Some(await this.s3.get(url.toString()));
|
|
72
60
|
}
|
|
73
61
|
}
|
|
62
|
+
export function createS3Peer(params) {
|
|
63
|
+
return {
|
|
64
|
+
fetch: new S3PeerFetch(params.s3),
|
|
65
|
+
factory: (cider, fopts) => new S3Peer(params.s3, cider, fopts?.onProgress),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
74
68
|
//# sourceMappingURL=s3.js.map
|
package/peers/s3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../jsr/peers/s3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAO,MAAM,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAIxE,MAAM,gBAAgB,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../jsr/peers/s3.ts"],"names":[],"mappings":"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"}
|
package/public/app-documents.js
CHANGED
|
@@ -42,7 +42,7 @@ export const putDocEvento = {
|
|
|
42
42
|
return Result.Ok(EventoResult.Continue);
|
|
43
43
|
}
|
|
44
44
|
const now = new Date().toISOString();
|
|
45
|
-
const docId = req.docId ?? vctx.sthis.
|
|
45
|
+
const docId = req.docId ?? vctx.sthis.timeOrderedNextId().str;
|
|
46
46
|
const dbName = req.dbName;
|
|
47
47
|
const t = vctx.sql.tables.appDocuments;
|
|
48
48
|
const maxSeqResult = await vctx.sql.db
|
|
@@ -81,7 +81,7 @@ export const putDocEvento = {
|
|
|
81
81
|
}
|
|
82
82
|
if (vctx.notifyDocChanged) {
|
|
83
83
|
vctx
|
|
84
|
-
.notifyDocChanged({ userSlug: req.userSlug, appSlug: req.appSlug, dbName, docId })
|
|
84
|
+
.notifyDocChanged({ userSlug: req.userSlug, appSlug: req.appSlug, dbName, docId }, clientWsSend(ctx).connId)
|
|
85
85
|
.catch((e) => console.error("DocNotify error:", e));
|
|
86
86
|
}
|
|
87
87
|
await ctx.send.send(ctx, {
|
|
@@ -231,7 +231,7 @@ export const deleteDocEvento = {
|
|
|
231
231
|
});
|
|
232
232
|
if (vctx.notifyDocChanged) {
|
|
233
233
|
vctx
|
|
234
|
-
.notifyDocChanged({ userSlug: req.userSlug, appSlug: req.appSlug, dbName, docId: req.docId })
|
|
234
|
+
.notifyDocChanged({ userSlug: req.userSlug, appSlug: req.appSlug, dbName, docId: req.docId }, clientWsSend(ctx).connId)
|
|
235
235
|
.catch((e) => console.error("DocNotify error:", e));
|
|
236
236
|
}
|
|
237
237
|
await ctx.send.send(ctx, {
|