@peerbit/please-lib 0.0.5 → 0.0.7
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/lib/esm/index.d.ts +61 -12
- package/lib/esm/index.js +224 -51
- package/lib/esm/index.js.map +1 -1
- package/package.json +7 -6
- package/src/index.ts +327 -63
package/lib/esm/index.d.ts
CHANGED
|
@@ -1,71 +1,120 @@
|
|
|
1
1
|
import { Program } from "@peerbit/program";
|
|
2
2
|
import { Documents, Role } from "@peerbit/document";
|
|
3
|
+
import { SyncFilter } from "@peerbit/shared-log";
|
|
4
|
+
import { PublicSignKey } from "@peerbit/crypto";
|
|
3
5
|
import { ProgramClient } from "@peerbit/program";
|
|
4
|
-
|
|
6
|
+
import { TrustedNetwork } from "@peerbit/trusted-network";
|
|
7
|
+
export declare abstract class AbstractFile {
|
|
5
8
|
abstract id: string;
|
|
6
9
|
abstract name: string;
|
|
7
|
-
abstract
|
|
10
|
+
abstract size: number;
|
|
11
|
+
abstract parentId?: string;
|
|
12
|
+
abstract getFile<OutputType extends "chunks" | "joined" = "joined", Output = OutputType extends "chunks" ? Uint8Array[] : Uint8Array>(files: Files, properties?: {
|
|
13
|
+
as: OutputType;
|
|
14
|
+
timeout?: number;
|
|
15
|
+
progress?: (progress: number) => any;
|
|
16
|
+
}): Promise<Output>;
|
|
17
|
+
abstract delete(files: Files): Promise<void>;
|
|
8
18
|
}
|
|
9
19
|
export declare class TinyFile extends AbstractFile {
|
|
10
20
|
id: string;
|
|
11
21
|
name: string;
|
|
12
22
|
file: Uint8Array;
|
|
23
|
+
parentId?: string;
|
|
24
|
+
get size(): number;
|
|
13
25
|
constructor(properties: {
|
|
14
26
|
name: string;
|
|
15
27
|
file: Uint8Array;
|
|
28
|
+
parentId?: string;
|
|
16
29
|
});
|
|
17
|
-
getFile(_files: Files
|
|
30
|
+
getFile<OutputType extends "chunks" | "joined" = "joined", Output = OutputType extends "chunks" ? Uint8Array[] : Uint8Array>(_files: Files, properties?: {
|
|
31
|
+
as: OutputType;
|
|
32
|
+
progress?: (progress: number) => any;
|
|
33
|
+
}): Promise<Output>;
|
|
34
|
+
delete(): Promise<void>;
|
|
18
35
|
}
|
|
19
36
|
export declare class SmallFile extends AbstractFile {
|
|
20
37
|
id: string;
|
|
21
38
|
name: string;
|
|
22
39
|
cid: string;
|
|
40
|
+
size: number;
|
|
41
|
+
parentId?: string;
|
|
23
42
|
constructor(properties: {
|
|
24
43
|
name: string;
|
|
25
44
|
cid: string;
|
|
45
|
+
size: number;
|
|
46
|
+
parentId?: string;
|
|
26
47
|
});
|
|
27
|
-
static create(node: ProgramClient, name: string, file: Uint8Array): Promise<SmallFile>;
|
|
28
|
-
getFile(files: Files
|
|
48
|
+
static create(node: ProgramClient, name: string, file: Uint8Array, parentId?: string): Promise<SmallFile>;
|
|
49
|
+
getFile<OutputType extends "chunks" | "joined" = "joined", Output = OutputType extends "chunks" ? Uint8Array[] : Uint8Array>(files: Files, properties?: {
|
|
50
|
+
as: OutputType;
|
|
51
|
+
timeout?: number;
|
|
52
|
+
progress?: (progress: number) => any;
|
|
53
|
+
}): Promise<Output>;
|
|
54
|
+
delete(files: Files): Promise<void>;
|
|
29
55
|
}
|
|
30
56
|
export declare class LargeFile extends AbstractFile {
|
|
31
57
|
id: string;
|
|
32
58
|
name: string;
|
|
33
59
|
fileIds: string[];
|
|
60
|
+
size: number;
|
|
34
61
|
constructor(properties: {
|
|
35
62
|
id: string;
|
|
36
63
|
name: string;
|
|
37
64
|
fileIds: string[];
|
|
65
|
+
size: number;
|
|
38
66
|
});
|
|
39
67
|
static create(name: string, file: Uint8Array, files: Files): Promise<LargeFile>;
|
|
40
|
-
|
|
68
|
+
get parentId(): undefined;
|
|
69
|
+
fetchChunks(files: Files): Promise<AbstractFile[]>;
|
|
70
|
+
delete(files: Files): Promise<void>;
|
|
71
|
+
getFile<OutputType extends "chunks" | "joined" = "joined", Output = OutputType extends "chunks" ? Uint8Array[] : Uint8Array>(files: Files, properties?: {
|
|
72
|
+
as: OutputType;
|
|
73
|
+
timeout?: number;
|
|
74
|
+
progress?: (progress: number) => any;
|
|
75
|
+
}): Promise<Output>;
|
|
41
76
|
}
|
|
42
77
|
type Args = {
|
|
43
78
|
role: Role;
|
|
79
|
+
sync?: SyncFilter | undefined;
|
|
44
80
|
};
|
|
45
81
|
export declare class Files extends Program<Args> {
|
|
46
82
|
id: Uint8Array;
|
|
83
|
+
name: string;
|
|
84
|
+
trustGraph?: TrustedNetwork;
|
|
47
85
|
files: Documents<AbstractFile>;
|
|
48
|
-
constructor(
|
|
49
|
-
|
|
86
|
+
constructor(properties?: {
|
|
87
|
+
id?: Uint8Array;
|
|
88
|
+
name?: string;
|
|
89
|
+
rootKey?: PublicSignKey;
|
|
90
|
+
});
|
|
91
|
+
add(name: string, file: Uint8Array, parentId?: string): Promise<string>;
|
|
92
|
+
removeById(id: string): Promise<void>;
|
|
93
|
+
removeByName(name: string): Promise<void>;
|
|
94
|
+
list(): Promise<AbstractFile[]>;
|
|
50
95
|
/**
|
|
51
96
|
* Get by name
|
|
52
97
|
* @param id
|
|
53
98
|
* @returns
|
|
54
99
|
*/
|
|
55
|
-
getById(id: string
|
|
100
|
+
getById<OutputType extends "chunks" | "joined" = "joined", Output = OutputType extends "chunks" ? Uint8Array[] : Uint8Array>(id: string, properties?: {
|
|
101
|
+
as: OutputType;
|
|
102
|
+
}): Promise<{
|
|
56
103
|
id: string;
|
|
57
104
|
name: string;
|
|
58
|
-
bytes:
|
|
105
|
+
bytes: Output;
|
|
59
106
|
} | undefined>;
|
|
60
107
|
/**
|
|
61
108
|
* Get by name
|
|
62
109
|
* @param name
|
|
63
110
|
* @returns
|
|
64
111
|
*/
|
|
65
|
-
getByName(name: string
|
|
112
|
+
getByName<OutputType extends "chunks" | "joined" = "joined", Output = OutputType extends "chunks" ? Uint8Array[] : Uint8Array>(name: string, properties?: {
|
|
113
|
+
as: OutputType;
|
|
114
|
+
}): Promise<{
|
|
66
115
|
id: string;
|
|
67
116
|
name: string;
|
|
68
|
-
bytes:
|
|
117
|
+
bytes: Output;
|
|
69
118
|
} | undefined>;
|
|
70
119
|
open(args?: Args): Promise<void>;
|
|
71
120
|
}
|
package/lib/esm/index.js
CHANGED
|
@@ -8,29 +8,41 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
9
|
};
|
|
10
10
|
var SmallFile_1, LargeFile_1;
|
|
11
|
-
import { field, variant, vec } from "@dao-xyz/borsh";
|
|
11
|
+
import { field, variant, vec, option } from "@dao-xyz/borsh";
|
|
12
12
|
import { Program } from "@peerbit/program";
|
|
13
|
-
import { Documents, SearchRequest, StringMatch } from "@peerbit/document";
|
|
13
|
+
import { Documents, SearchRequest, StringMatch, StringMatchMethod, Or, } from "@peerbit/document";
|
|
14
14
|
import { sha256Base64Sync, randomBytes } from "@peerbit/crypto";
|
|
15
15
|
import { concat } from "uint8arrays";
|
|
16
|
-
|
|
16
|
+
import { sha256Sync } from "@peerbit/crypto";
|
|
17
|
+
import { TrustedNetwork } from "@peerbit/trusted-network";
|
|
18
|
+
import PQueue from "p-queue";
|
|
19
|
+
export class AbstractFile {
|
|
17
20
|
}
|
|
18
21
|
const TINY_FILE_SIZE_LIMIT = 1e3;
|
|
19
|
-
|
|
22
|
+
let TinyFile = class TinyFile extends AbstractFile {
|
|
20
23
|
id;
|
|
21
24
|
name;
|
|
22
25
|
file; // 10 mb imit
|
|
26
|
+
parentId;
|
|
27
|
+
get size() {
|
|
28
|
+
return this.file.byteLength;
|
|
29
|
+
}
|
|
23
30
|
constructor(properties) {
|
|
24
31
|
super();
|
|
25
32
|
this.id = sha256Base64Sync(properties.file);
|
|
26
33
|
this.name = properties.name;
|
|
27
34
|
this.file = properties.file;
|
|
35
|
+
this.parentId = properties.parentId;
|
|
28
36
|
}
|
|
29
|
-
async getFile(_files) {
|
|
37
|
+
async getFile(_files, properties) {
|
|
30
38
|
if (sha256Base64Sync(this.file) !== this.id) {
|
|
31
39
|
throw new Error("Hash does not match the file content");
|
|
32
40
|
}
|
|
33
|
-
|
|
41
|
+
properties?.progress?.(1);
|
|
42
|
+
return Promise.resolve(properties?.as == "chunks" ? [this.file] : this.file);
|
|
43
|
+
}
|
|
44
|
+
async delete() {
|
|
45
|
+
// Do nothing, since no releated files where created
|
|
34
46
|
}
|
|
35
47
|
};
|
|
36
48
|
__decorate([
|
|
@@ -45,32 +57,50 @@ __decorate([
|
|
|
45
57
|
field({ type: Uint8Array }),
|
|
46
58
|
__metadata("design:type", Uint8Array)
|
|
47
59
|
], TinyFile.prototype, "file", void 0);
|
|
60
|
+
__decorate([
|
|
61
|
+
field({ type: option("string") }),
|
|
62
|
+
__metadata("design:type", String)
|
|
63
|
+
], TinyFile.prototype, "parentId", void 0);
|
|
48
64
|
TinyFile = __decorate([
|
|
49
65
|
variant(0) // for versioning purposes
|
|
50
66
|
,
|
|
51
67
|
__metadata("design:paramtypes", [Object])
|
|
52
68
|
], TinyFile);
|
|
69
|
+
export { TinyFile };
|
|
53
70
|
const SMALL_FILE_SIZE_LIMIT = 1e6 * 9;
|
|
54
|
-
|
|
71
|
+
// TODO Do we really need this if we have TinyFile and LargeFile?
|
|
72
|
+
let SmallFile = SmallFile_1 = class SmallFile extends AbstractFile {
|
|
55
73
|
id; // cid
|
|
56
74
|
name;
|
|
57
75
|
cid; // store file separately in a block store, like IPFS
|
|
76
|
+
size;
|
|
77
|
+
parentId;
|
|
58
78
|
constructor(properties) {
|
|
59
79
|
super();
|
|
60
80
|
this.id = properties.cid;
|
|
61
81
|
this.name = properties.name;
|
|
62
82
|
this.cid = properties.cid;
|
|
83
|
+
this.size = properties.size;
|
|
84
|
+
this.parentId = properties.parentId;
|
|
63
85
|
}
|
|
64
|
-
static async create(node, name, file) {
|
|
86
|
+
static async create(node, name, file, parentId) {
|
|
65
87
|
if (file.length > SMALL_FILE_SIZE_LIMIT) {
|
|
66
88
|
throw new Error("To large file for SmallFile");
|
|
67
89
|
}
|
|
68
90
|
const cid = await node.services.blocks.put(file);
|
|
69
|
-
return new SmallFile_1({ name, cid });
|
|
91
|
+
return new SmallFile_1({ name, cid, size: file.byteLength, parentId });
|
|
70
92
|
}
|
|
71
|
-
async getFile(files) {
|
|
93
|
+
async getFile(files, properties) {
|
|
94
|
+
properties?.progress?.(0);
|
|
72
95
|
// Load the file from the block store
|
|
73
|
-
|
|
96
|
+
const block = await files.node.services.blocks.get(this.id, {
|
|
97
|
+
timeout: properties?.timeout,
|
|
98
|
+
});
|
|
99
|
+
properties?.progress?.(1);
|
|
100
|
+
return (properties?.as == "chunks" ? [block] : block);
|
|
101
|
+
}
|
|
102
|
+
async delete(files) {
|
|
103
|
+
return await files.node.services.blocks.rm(this.id);
|
|
74
104
|
}
|
|
75
105
|
};
|
|
76
106
|
__decorate([
|
|
@@ -85,58 +115,113 @@ __decorate([
|
|
|
85
115
|
field({ type: "string" }),
|
|
86
116
|
__metadata("design:type", String)
|
|
87
117
|
], SmallFile.prototype, "cid", void 0);
|
|
118
|
+
__decorate([
|
|
119
|
+
field({ type: "u32" }),
|
|
120
|
+
__metadata("design:type", Number)
|
|
121
|
+
], SmallFile.prototype, "size", void 0);
|
|
122
|
+
__decorate([
|
|
123
|
+
field({ type: option("string") }),
|
|
124
|
+
__metadata("design:type", String)
|
|
125
|
+
], SmallFile.prototype, "parentId", void 0);
|
|
88
126
|
SmallFile = SmallFile_1 = __decorate([
|
|
89
127
|
variant(1) // for versioning purposes
|
|
90
128
|
,
|
|
91
129
|
__metadata("design:paramtypes", [Object])
|
|
92
130
|
], SmallFile);
|
|
93
|
-
export
|
|
131
|
+
export { SmallFile };
|
|
132
|
+
let LargeFile = LargeFile_1 = class LargeFile extends AbstractFile {
|
|
94
133
|
id; // hash
|
|
95
134
|
name;
|
|
96
135
|
fileIds;
|
|
136
|
+
size;
|
|
97
137
|
constructor(properties) {
|
|
98
138
|
super();
|
|
99
139
|
this.id = properties.id;
|
|
100
140
|
this.name = properties.name;
|
|
101
141
|
this.fileIds = properties.fileIds;
|
|
142
|
+
this.size = properties.size;
|
|
102
143
|
}
|
|
103
144
|
static async create(name, file, files) {
|
|
104
145
|
const segmetSize = SMALL_FILE_SIZE_LIMIT / 10; // 10% of the small size limit
|
|
105
146
|
const fileIds = [];
|
|
106
147
|
const id = sha256Base64Sync(file);
|
|
148
|
+
const fileSize = file.byteLength;
|
|
107
149
|
for (let i = 0; i < Math.ceil(file.byteLength / segmetSize); i++) {
|
|
108
|
-
fileIds.push(await files.
|
|
150
|
+
fileIds.push(await files.add(name + "/" + i, file.subarray(i * segmetSize, Math.min((i + 1) * segmetSize, file.byteLength)), id));
|
|
109
151
|
}
|
|
110
|
-
return new LargeFile_1({ id, name, fileIds });
|
|
152
|
+
return new LargeFile_1({ id, name, fileIds, size: fileSize });
|
|
111
153
|
}
|
|
112
|
-
|
|
113
|
-
//
|
|
154
|
+
get parentId() {
|
|
155
|
+
// Large file can never have a parent
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
async fetchChunks(files) {
|
|
114
159
|
const expectedIds = new Set(this.fileIds);
|
|
115
|
-
const
|
|
116
|
-
const results = await files.files.index.search(new SearchRequest({
|
|
160
|
+
const allFiles = await files.files.index.search(new SearchRequest({
|
|
117
161
|
query: [
|
|
118
|
-
new StringMatch({
|
|
119
|
-
key: "name",
|
|
120
|
-
value: this.id + "/" + this.name,
|
|
121
|
-
}),
|
|
162
|
+
new Or([...expectedIds].map((x) => new StringMatch({ key: "id", value: x }))),
|
|
122
163
|
],
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
|
|
164
|
+
}));
|
|
165
|
+
return allFiles;
|
|
166
|
+
}
|
|
167
|
+
async delete(files) {
|
|
168
|
+
await Promise.all((await this.fetchChunks(files)).map((x) => x.delete(files)));
|
|
169
|
+
}
|
|
170
|
+
async getFile(files, properties) {
|
|
171
|
+
// Get all sub files (SmallFiles) and concatinate them in the right order (the order of this.fileIds)
|
|
172
|
+
properties?.progress?.(0);
|
|
173
|
+
console.log("LISTS CHUNKS!");
|
|
174
|
+
const allChunks = await this.fetchChunks(files);
|
|
175
|
+
console.log("RECEIVED CHUNKS: " + allChunks.length);
|
|
176
|
+
console.log("FETCH CHUNKS");
|
|
177
|
+
const fetchQueue = new PQueue({ concurrency: 10 });
|
|
178
|
+
let fetchError = undefined;
|
|
179
|
+
fetchQueue.on("error", (err) => {
|
|
180
|
+
fetchError = err;
|
|
126
181
|
});
|
|
127
|
-
|
|
128
|
-
|
|
182
|
+
const chunks = new Map();
|
|
183
|
+
const expectedIds = new Set(this.fileIds);
|
|
184
|
+
if (allChunks.length > 0) {
|
|
185
|
+
let c = 0;
|
|
186
|
+
for (const r of allChunks) {
|
|
129
187
|
if (chunks.has(r.id)) {
|
|
130
188
|
// chunk already added;
|
|
131
189
|
}
|
|
132
190
|
if (!expectedIds.has(r.id)) {
|
|
133
191
|
// chunk is not part of this file
|
|
134
192
|
}
|
|
135
|
-
|
|
193
|
+
fetchQueue
|
|
194
|
+
.add(async () => {
|
|
195
|
+
let lastError = undefined;
|
|
196
|
+
for (let i = 0; i < 3; i++) {
|
|
197
|
+
try {
|
|
198
|
+
const chunk = await r.getFile(files, {
|
|
199
|
+
as: "joined",
|
|
200
|
+
timeout: properties?.timeout,
|
|
201
|
+
});
|
|
202
|
+
if (!chunk) {
|
|
203
|
+
throw new Error("Failed to fetch chunk");
|
|
204
|
+
}
|
|
205
|
+
chunks.set(r.id, chunk);
|
|
206
|
+
c++;
|
|
207
|
+
properties?.progress?.(c / allChunks.length);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
// try 3 times
|
|
212
|
+
lastError = error;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
throw lastError;
|
|
216
|
+
})
|
|
217
|
+
.catch(() => {
|
|
218
|
+
fetchQueue.clear(); // Dont do anything more since we failed to fetch one block
|
|
219
|
+
});
|
|
136
220
|
}
|
|
137
221
|
}
|
|
138
|
-
|
|
139
|
-
|
|
222
|
+
await fetchQueue.onIdle();
|
|
223
|
+
if (fetchError || chunks.size !== expectedIds.size) {
|
|
224
|
+
throw new Error(`Failed to resolve file. Recieved ${chunks.size}/${expectedIds.size} chunks`);
|
|
140
225
|
}
|
|
141
226
|
const chunkContentResolved = await Promise.all(this.fileIds.map(async (x) => {
|
|
142
227
|
const chunkValue = await chunks.get(x);
|
|
@@ -145,7 +230,10 @@ export let LargeFile = LargeFile_1 = class LargeFile extends AbstractFile {
|
|
|
145
230
|
}
|
|
146
231
|
return chunkValue;
|
|
147
232
|
}));
|
|
148
|
-
|
|
233
|
+
console.log("FETCH DONE");
|
|
234
|
+
return (properties?.as == "chunks"
|
|
235
|
+
? chunkContentResolved
|
|
236
|
+
: concat(chunkContentResolved));
|
|
149
237
|
}
|
|
150
238
|
};
|
|
151
239
|
__decorate([
|
|
@@ -160,40 +248,88 @@ __decorate([
|
|
|
160
248
|
field({ type: vec("string") }),
|
|
161
249
|
__metadata("design:type", Array)
|
|
162
250
|
], LargeFile.prototype, "fileIds", void 0);
|
|
251
|
+
__decorate([
|
|
252
|
+
field({ type: "u32" }),
|
|
253
|
+
__metadata("design:type", Number)
|
|
254
|
+
], LargeFile.prototype, "size", void 0);
|
|
163
255
|
LargeFile = LargeFile_1 = __decorate([
|
|
164
256
|
variant(2) // for versioning purposes
|
|
165
257
|
,
|
|
166
258
|
__metadata("design:paramtypes", [Object])
|
|
167
259
|
], LargeFile);
|
|
168
|
-
export
|
|
260
|
+
export { LargeFile };
|
|
261
|
+
let Files = class Files extends Program {
|
|
169
262
|
id;
|
|
263
|
+
name;
|
|
264
|
+
trustGraph;
|
|
170
265
|
files;
|
|
171
|
-
constructor(
|
|
266
|
+
constructor(properties = {}) {
|
|
172
267
|
super();
|
|
173
|
-
this.id = id;
|
|
174
|
-
this.
|
|
268
|
+
this.id = properties.id || randomBytes(32);
|
|
269
|
+
this.name = properties.name || "";
|
|
270
|
+
this.trustGraph = properties.rootKey
|
|
271
|
+
? new TrustedNetwork({ id: this.id, rootTrust: properties.rootKey })
|
|
272
|
+
: undefined;
|
|
273
|
+
this.files = new Documents({
|
|
274
|
+
id: sha256Sync(concat([
|
|
275
|
+
this.id,
|
|
276
|
+
new TextEncoder().encode(this.name),
|
|
277
|
+
properties.rootKey?.bytes || new Uint8Array(0),
|
|
278
|
+
])),
|
|
279
|
+
});
|
|
175
280
|
}
|
|
176
|
-
async
|
|
281
|
+
async add(name, file, parentId) {
|
|
177
282
|
let toPut;
|
|
178
283
|
if (file.byteLength <= TINY_FILE_SIZE_LIMIT) {
|
|
179
|
-
toPut = new TinyFile({ name, file });
|
|
284
|
+
toPut = new TinyFile({ name, file, parentId });
|
|
180
285
|
}
|
|
181
286
|
else if (file.byteLength > TINY_FILE_SIZE_LIMIT &&
|
|
182
287
|
file.byteLength <= SMALL_FILE_SIZE_LIMIT) {
|
|
183
|
-
toPut = await SmallFile.create(this.node, name, file);
|
|
288
|
+
toPut = await SmallFile.create(this.node, name, file, parentId);
|
|
184
289
|
}
|
|
185
290
|
else {
|
|
291
|
+
if (parentId) {
|
|
292
|
+
throw new Error("Unexpected that a LargeFile to have a parent");
|
|
293
|
+
}
|
|
186
294
|
toPut = await LargeFile.create(name, file, this);
|
|
187
295
|
}
|
|
188
296
|
await this.files.put(toPut);
|
|
189
297
|
return toPut.id;
|
|
190
298
|
}
|
|
299
|
+
async removeById(id) {
|
|
300
|
+
const file = await this.files.index.get(id);
|
|
301
|
+
if (file) {
|
|
302
|
+
await file.delete(this);
|
|
303
|
+
await this.files.del(file.id);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async removeByName(name) {
|
|
307
|
+
const files = await this.files.index.search(new SearchRequest({
|
|
308
|
+
query: new StringMatch({
|
|
309
|
+
key: ["name"],
|
|
310
|
+
value: name,
|
|
311
|
+
caseInsensitive: false,
|
|
312
|
+
method: StringMatchMethod.exact,
|
|
313
|
+
}),
|
|
314
|
+
}));
|
|
315
|
+
for (const file of files) {
|
|
316
|
+
await file.delete(this);
|
|
317
|
+
await this.files.del(file.id);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
async list() {
|
|
321
|
+
const files = await this.files.index.search(new SearchRequest(), {
|
|
322
|
+
local: true,
|
|
323
|
+
remote: true,
|
|
324
|
+
});
|
|
325
|
+
return files;
|
|
326
|
+
}
|
|
191
327
|
/**
|
|
192
328
|
* Get by name
|
|
193
329
|
* @param id
|
|
194
330
|
* @returns
|
|
195
331
|
*/
|
|
196
|
-
async getById(id) {
|
|
332
|
+
async getById(id, properties) {
|
|
197
333
|
const results = await this.files.index.search(new SearchRequest({
|
|
198
334
|
query: [new StringMatch({ key: "id", value: id })],
|
|
199
335
|
}), {
|
|
@@ -203,9 +339,13 @@ export let Files = class Files extends Program {
|
|
|
203
339
|
},
|
|
204
340
|
});
|
|
205
341
|
for (const result of results) {
|
|
206
|
-
const file = await result.getFile(this);
|
|
342
|
+
const file = await result.getFile(this, properties);
|
|
207
343
|
if (file) {
|
|
208
|
-
return {
|
|
344
|
+
return {
|
|
345
|
+
id: result.id,
|
|
346
|
+
name: result.name,
|
|
347
|
+
bytes: file,
|
|
348
|
+
};
|
|
209
349
|
}
|
|
210
350
|
}
|
|
211
351
|
}
|
|
@@ -214,7 +354,7 @@ export let Files = class Files extends Program {
|
|
|
214
354
|
* @param name
|
|
215
355
|
* @returns
|
|
216
356
|
*/
|
|
217
|
-
async getByName(name) {
|
|
357
|
+
async getByName(name, properties) {
|
|
218
358
|
const results = await this.files.index.search(new SearchRequest({
|
|
219
359
|
query: [new StringMatch({ key: "name", value: name })],
|
|
220
360
|
}), {
|
|
@@ -224,24 +364,48 @@ export let Files = class Files extends Program {
|
|
|
224
364
|
},
|
|
225
365
|
});
|
|
226
366
|
for (const result of results) {
|
|
227
|
-
const file = await result.getFile(this);
|
|
367
|
+
const file = await result.getFile(this, properties);
|
|
228
368
|
if (file) {
|
|
229
|
-
return {
|
|
369
|
+
return {
|
|
370
|
+
id: result.id,
|
|
371
|
+
name: result.name,
|
|
372
|
+
bytes: file,
|
|
373
|
+
};
|
|
230
374
|
}
|
|
231
375
|
}
|
|
232
376
|
}
|
|
233
377
|
// Setup lifecycle, will be invoked on 'open'
|
|
234
378
|
async open(args) {
|
|
379
|
+
await this.trustGraph?.open({
|
|
380
|
+
role: args?.role,
|
|
381
|
+
});
|
|
235
382
|
await this.files.open({
|
|
236
383
|
type: AbstractFile,
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
384
|
+
// TODO add ACL
|
|
385
|
+
role: args?.role,
|
|
386
|
+
sync: args?.sync,
|
|
387
|
+
replicas: { min: 3 },
|
|
388
|
+
canPerform: async (operation, context) => {
|
|
389
|
+
if (!this.trustGraph) {
|
|
390
|
+
return true;
|
|
391
|
+
}
|
|
392
|
+
for (const key of await context.entry.getPublicKeys()) {
|
|
393
|
+
if (await this.trustGraph.isTrusted(key)) {
|
|
394
|
+
return true;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
return false;
|
|
240
398
|
},
|
|
241
|
-
|
|
242
|
-
|
|
399
|
+
index: {
|
|
400
|
+
fields: (doc) => {
|
|
401
|
+
return {
|
|
402
|
+
id: doc.id,
|
|
403
|
+
name: doc.name,
|
|
404
|
+
size: doc.size,
|
|
405
|
+
parentId: doc.parentId,
|
|
406
|
+
};
|
|
407
|
+
},
|
|
243
408
|
},
|
|
244
|
-
role: args?.role,
|
|
245
409
|
});
|
|
246
410
|
}
|
|
247
411
|
};
|
|
@@ -249,12 +413,21 @@ __decorate([
|
|
|
249
413
|
field({ type: Uint8Array }),
|
|
250
414
|
__metadata("design:type", Uint8Array)
|
|
251
415
|
], Files.prototype, "id", void 0);
|
|
416
|
+
__decorate([
|
|
417
|
+
field({ type: "string" }),
|
|
418
|
+
__metadata("design:type", String)
|
|
419
|
+
], Files.prototype, "name", void 0);
|
|
420
|
+
__decorate([
|
|
421
|
+
field({ type: option(TrustedNetwork) }),
|
|
422
|
+
__metadata("design:type", TrustedNetwork)
|
|
423
|
+
], Files.prototype, "trustGraph", void 0);
|
|
252
424
|
__decorate([
|
|
253
425
|
field({ type: Documents }),
|
|
254
426
|
__metadata("design:type", Documents)
|
|
255
427
|
], Files.prototype, "files", void 0);
|
|
256
428
|
Files = __decorate([
|
|
257
429
|
variant("files"),
|
|
258
|
-
__metadata("design:paramtypes", [
|
|
430
|
+
__metadata("design:paramtypes", [Object])
|
|
259
431
|
], Files);
|
|
432
|
+
export { Files };
|
|
260
433
|
//# sourceMappingURL=index.js.map
|
package/lib/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peerbit/please-lib",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"author": "dao.xyz",
|
|
5
5
|
"repository": "https://github.com/@dao-xyz/peerbit-examples",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"LICENSE"
|
|
24
24
|
],
|
|
25
25
|
"engines": {
|
|
26
|
-
"node": ">=16.
|
|
26
|
+
"node": ">=16.15.1"
|
|
27
27
|
},
|
|
28
28
|
"scripts": {
|
|
29
29
|
"clean": "shx rm -rf lib/*",
|
|
@@ -34,13 +34,14 @@
|
|
|
34
34
|
"test:integration": "node ../../../node_modules/.bin/jest test -c ../../../jest.config.integration.ts --runInBand --forceExit"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@peerbit/test-utils": "^1
|
|
37
|
+
"@peerbit/test-utils": "^1",
|
|
38
38
|
"typescript": "^5.1.3"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@peerbit/document": "^
|
|
42
|
-
"peerbit": "^
|
|
41
|
+
"@peerbit/document": "^3",
|
|
42
|
+
"@peerbit/trusted-network": "^2",
|
|
43
|
+
"peerbit": "^2",
|
|
43
44
|
"uuid": "^9.0.0"
|
|
44
45
|
},
|
|
45
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "00c275554aa08e6a70bceaee3e3377936ca0e8d9"
|
|
46
47
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,14 +1,38 @@
|
|
|
1
|
-
import { field, variant, vec } from "@dao-xyz/borsh";
|
|
1
|
+
import { field, variant, vec, option } from "@dao-xyz/borsh";
|
|
2
2
|
import { Program } from "@peerbit/program";
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
Documents,
|
|
5
|
+
SearchRequest,
|
|
6
|
+
StringMatch,
|
|
7
|
+
Role,
|
|
8
|
+
StringMatchMethod,
|
|
9
|
+
Or,
|
|
10
|
+
} from "@peerbit/document";
|
|
11
|
+
import { SyncFilter } from "@peerbit/shared-log";
|
|
12
|
+
import { PublicSignKey, sha256Base64Sync, randomBytes } from "@peerbit/crypto";
|
|
5
13
|
import { ProgramClient } from "@peerbit/program";
|
|
6
14
|
import { concat } from "uint8arrays";
|
|
15
|
+
import { sha256Sync } from "@peerbit/crypto";
|
|
16
|
+
import { TrustedNetwork } from "@peerbit/trusted-network";
|
|
17
|
+
import PQueue from "p-queue";
|
|
7
18
|
|
|
8
|
-
abstract class AbstractFile {
|
|
19
|
+
export abstract class AbstractFile {
|
|
9
20
|
abstract id: string;
|
|
10
21
|
abstract name: string;
|
|
11
|
-
abstract
|
|
22
|
+
abstract size: number;
|
|
23
|
+
abstract parentId?: string;
|
|
24
|
+
abstract getFile<
|
|
25
|
+
OutputType extends "chunks" | "joined" = "joined",
|
|
26
|
+
Output = OutputType extends "chunks" ? Uint8Array[] : Uint8Array
|
|
27
|
+
>(
|
|
28
|
+
files: Files,
|
|
29
|
+
properties?: {
|
|
30
|
+
as: OutputType;
|
|
31
|
+
timeout?: number;
|
|
32
|
+
progress?: (progress: number) => any;
|
|
33
|
+
}
|
|
34
|
+
): Promise<Output>;
|
|
35
|
+
abstract delete(files: Files): Promise<void>;
|
|
12
36
|
}
|
|
13
37
|
|
|
14
38
|
const TINY_FILE_SIZE_LIMIT = 1e3;
|
|
@@ -24,23 +48,49 @@ export class TinyFile extends AbstractFile {
|
|
|
24
48
|
@field({ type: Uint8Array })
|
|
25
49
|
file: Uint8Array; // 10 mb imit
|
|
26
50
|
|
|
27
|
-
|
|
51
|
+
@field({ type: option("string") })
|
|
52
|
+
parentId?: string;
|
|
53
|
+
|
|
54
|
+
get size() {
|
|
55
|
+
return this.file.byteLength;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
constructor(properties: {
|
|
59
|
+
name: string;
|
|
60
|
+
file: Uint8Array;
|
|
61
|
+
parentId?: string;
|
|
62
|
+
}) {
|
|
28
63
|
super();
|
|
29
64
|
this.id = sha256Base64Sync(properties.file);
|
|
30
65
|
this.name = properties.name;
|
|
31
66
|
this.file = properties.file;
|
|
67
|
+
this.parentId = properties.parentId;
|
|
32
68
|
}
|
|
33
69
|
|
|
34
|
-
async getFile
|
|
70
|
+
async getFile<
|
|
71
|
+
OutputType extends "chunks" | "joined" = "joined",
|
|
72
|
+
Output = OutputType extends "chunks" ? Uint8Array[] : Uint8Array
|
|
73
|
+
>(
|
|
74
|
+
_files: Files,
|
|
75
|
+
properties?: { as: OutputType; progress?: (progress: number) => any }
|
|
76
|
+
): Promise<Output> {
|
|
35
77
|
if (sha256Base64Sync(this.file) !== this.id) {
|
|
36
78
|
throw new Error("Hash does not match the file content");
|
|
37
79
|
}
|
|
38
|
-
|
|
80
|
+
properties?.progress?.(1);
|
|
81
|
+
return Promise.resolve(
|
|
82
|
+
properties?.as == "chunks" ? [this.file] : this.file
|
|
83
|
+
) as Output;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async delete(): Promise<void> {
|
|
87
|
+
// Do nothing, since no releated files where created
|
|
39
88
|
}
|
|
40
89
|
}
|
|
41
90
|
|
|
42
91
|
const SMALL_FILE_SIZE_LIMIT = 1e6 * 9;
|
|
43
92
|
|
|
93
|
+
// TODO Do we really need this if we have TinyFile and LargeFile?
|
|
44
94
|
@variant(1) // for versioning purposes
|
|
45
95
|
export class SmallFile extends AbstractFile {
|
|
46
96
|
@field({ type: "string" })
|
|
@@ -52,24 +102,62 @@ export class SmallFile extends AbstractFile {
|
|
|
52
102
|
@field({ type: "string" })
|
|
53
103
|
cid: string; // store file separately in a block store, like IPFS
|
|
54
104
|
|
|
55
|
-
|
|
105
|
+
@field({ type: "u32" })
|
|
106
|
+
size: number;
|
|
107
|
+
|
|
108
|
+
@field({ type: option("string") })
|
|
109
|
+
parentId?: string;
|
|
110
|
+
|
|
111
|
+
constructor(properties: {
|
|
112
|
+
name: string;
|
|
113
|
+
cid: string;
|
|
114
|
+
size: number;
|
|
115
|
+
parentId?: string;
|
|
116
|
+
}) {
|
|
56
117
|
super();
|
|
57
118
|
this.id = properties.cid;
|
|
58
119
|
this.name = properties.name;
|
|
59
120
|
this.cid = properties.cid;
|
|
121
|
+
this.size = properties.size;
|
|
122
|
+
this.parentId = properties.parentId;
|
|
60
123
|
}
|
|
61
124
|
|
|
62
|
-
static async create(
|
|
125
|
+
static async create(
|
|
126
|
+
node: ProgramClient,
|
|
127
|
+
name: string,
|
|
128
|
+
file: Uint8Array,
|
|
129
|
+
parentId?: string
|
|
130
|
+
) {
|
|
63
131
|
if (file.length > SMALL_FILE_SIZE_LIMIT) {
|
|
64
132
|
throw new Error("To large file for SmallFile");
|
|
65
133
|
}
|
|
66
134
|
const cid = await node.services.blocks.put(file);
|
|
67
|
-
return new SmallFile({ name, cid });
|
|
135
|
+
return new SmallFile({ name, cid, size: file.byteLength, parentId });
|
|
68
136
|
}
|
|
69
137
|
|
|
70
|
-
async getFile
|
|
138
|
+
async getFile<
|
|
139
|
+
OutputType extends "chunks" | "joined" = "joined",
|
|
140
|
+
Output = OutputType extends "chunks" ? Uint8Array[] : Uint8Array
|
|
141
|
+
>(
|
|
142
|
+
files: Files,
|
|
143
|
+
properties?: {
|
|
144
|
+
as: OutputType;
|
|
145
|
+
timeout?: number;
|
|
146
|
+
progress?: (progress: number) => any;
|
|
147
|
+
}
|
|
148
|
+
): Promise<Output> {
|
|
149
|
+
properties?.progress?.(0);
|
|
150
|
+
|
|
71
151
|
// Load the file from the block store
|
|
72
|
-
|
|
152
|
+
const block = await files.node.services.blocks.get(this.id, {
|
|
153
|
+
timeout: properties?.timeout,
|
|
154
|
+
});
|
|
155
|
+
properties?.progress?.(1);
|
|
156
|
+
return (properties?.as == "chunks" ? [block] : block) as Output;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async delete(files: Files): Promise<void> {
|
|
160
|
+
return await files.node.services.blocks.rm(this.id);
|
|
73
161
|
}
|
|
74
162
|
}
|
|
75
163
|
|
|
@@ -84,68 +172,143 @@ export class LargeFile extends AbstractFile {
|
|
|
84
172
|
@field({ type: vec("string") })
|
|
85
173
|
fileIds: string[];
|
|
86
174
|
|
|
87
|
-
|
|
175
|
+
@field({ type: "u32" })
|
|
176
|
+
size: number;
|
|
177
|
+
|
|
178
|
+
constructor(properties: {
|
|
179
|
+
id: string;
|
|
180
|
+
name: string;
|
|
181
|
+
fileIds: string[];
|
|
182
|
+
size: number;
|
|
183
|
+
}) {
|
|
88
184
|
super();
|
|
89
185
|
this.id = properties.id;
|
|
90
186
|
this.name = properties.name;
|
|
91
187
|
this.fileIds = properties.fileIds;
|
|
188
|
+
this.size = properties.size;
|
|
92
189
|
}
|
|
93
190
|
|
|
94
191
|
static async create(name: string, file: Uint8Array, files: Files) {
|
|
95
192
|
const segmetSize = SMALL_FILE_SIZE_LIMIT / 10; // 10% of the small size limit
|
|
96
193
|
const fileIds: string[] = [];
|
|
97
194
|
const id = sha256Base64Sync(file);
|
|
195
|
+
const fileSize = file.byteLength;
|
|
98
196
|
for (let i = 0; i < Math.ceil(file.byteLength / segmetSize); i++) {
|
|
99
197
|
fileIds.push(
|
|
100
|
-
await files.
|
|
101
|
-
|
|
198
|
+
await files.add(
|
|
199
|
+
name + "/" + i,
|
|
102
200
|
file.subarray(
|
|
103
201
|
i * segmetSize,
|
|
104
|
-
Math.min((i + 1) * segmetSize, file.
|
|
105
|
-
)
|
|
202
|
+
Math.min((i + 1) * segmetSize, file.byteLength)
|
|
203
|
+
),
|
|
204
|
+
id
|
|
106
205
|
)
|
|
107
206
|
);
|
|
108
207
|
}
|
|
109
208
|
|
|
110
|
-
return new LargeFile({ id, name, fileIds });
|
|
209
|
+
return new LargeFile({ id, name, fileIds, size: fileSize });
|
|
111
210
|
}
|
|
112
211
|
|
|
113
|
-
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
212
|
+
get parentId() {
|
|
213
|
+
// Large file can never have a parent
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
117
216
|
|
|
118
|
-
|
|
217
|
+
async fetchChunks(files: Files) {
|
|
218
|
+
const expectedIds = new Set(this.fileIds);
|
|
219
|
+
const allFiles = await files.files.index.search(
|
|
119
220
|
new SearchRequest({
|
|
120
221
|
query: [
|
|
121
|
-
new
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
222
|
+
new Or(
|
|
223
|
+
[...expectedIds].map(
|
|
224
|
+
(x) => new StringMatch({ key: "id", value: x })
|
|
225
|
+
)
|
|
226
|
+
),
|
|
125
227
|
],
|
|
126
|
-
})
|
|
127
|
-
{
|
|
128
|
-
local: true,
|
|
129
|
-
remote: true,
|
|
130
|
-
}
|
|
228
|
+
})
|
|
131
229
|
);
|
|
230
|
+
return allFiles;
|
|
231
|
+
}
|
|
232
|
+
async delete(files: Files) {
|
|
233
|
+
await Promise.all(
|
|
234
|
+
(await this.fetchChunks(files)).map((x) => x.delete(files))
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
async getFile<
|
|
239
|
+
OutputType extends "chunks" | "joined" = "joined",
|
|
240
|
+
Output = OutputType extends "chunks" ? Uint8Array[] : Uint8Array
|
|
241
|
+
>(
|
|
242
|
+
files: Files,
|
|
243
|
+
properties?: {
|
|
244
|
+
as: OutputType;
|
|
245
|
+
timeout?: number;
|
|
246
|
+
progress?: (progress: number) => any;
|
|
247
|
+
}
|
|
248
|
+
): Promise<Output> {
|
|
249
|
+
// Get all sub files (SmallFiles) and concatinate them in the right order (the order of this.fileIds)
|
|
250
|
+
|
|
251
|
+
properties?.progress?.(0);
|
|
252
|
+
|
|
253
|
+
console.log("LISTS CHUNKS!");
|
|
254
|
+
const allChunks = await this.fetchChunks(files);
|
|
255
|
+
console.log("RECEIVED CHUNKS: " + allChunks.length);
|
|
256
|
+
console.log("FETCH CHUNKS");
|
|
132
257
|
|
|
133
|
-
|
|
134
|
-
|
|
258
|
+
const fetchQueue = new PQueue({ concurrency: 10 });
|
|
259
|
+
let fetchError: Error | undefined = undefined;
|
|
260
|
+
fetchQueue.on("error", (err) => {
|
|
261
|
+
fetchError = err;
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
const chunks: Map<string, Uint8Array | undefined> = new Map();
|
|
265
|
+
const expectedIds = new Set(this.fileIds);
|
|
266
|
+
if (allChunks.length > 0) {
|
|
267
|
+
let c = 0;
|
|
268
|
+
for (const r of allChunks) {
|
|
135
269
|
if (chunks.has(r.id)) {
|
|
136
270
|
// chunk already added;
|
|
137
271
|
}
|
|
138
272
|
if (!expectedIds.has(r.id)) {
|
|
139
273
|
// chunk is not part of this file
|
|
140
274
|
}
|
|
141
|
-
|
|
142
|
-
|
|
275
|
+
fetchQueue
|
|
276
|
+
.add(async () => {
|
|
277
|
+
let lastError: Error | undefined = undefined;
|
|
278
|
+
for (let i = 0; i < 3; i++) {
|
|
279
|
+
try {
|
|
280
|
+
const chunk = await r.getFile(files, {
|
|
281
|
+
as: "joined",
|
|
282
|
+
timeout: properties?.timeout,
|
|
283
|
+
});
|
|
284
|
+
if (!chunk) {
|
|
285
|
+
throw new Error("Failed to fetch chunk");
|
|
286
|
+
}
|
|
287
|
+
chunks.set(r.id, chunk);
|
|
288
|
+
c++;
|
|
289
|
+
properties?.progress?.(c / allChunks.length);
|
|
290
|
+
return;
|
|
291
|
+
} catch (error: any) {
|
|
292
|
+
// try 3 times
|
|
293
|
+
|
|
294
|
+
lastError = error;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
throw lastError;
|
|
298
|
+
})
|
|
299
|
+
.catch(() => {
|
|
300
|
+
fetchQueue.clear(); // Dont do anything more since we failed to fetch one block
|
|
301
|
+
});
|
|
143
302
|
}
|
|
144
303
|
}
|
|
304
|
+
await fetchQueue.onIdle();
|
|
145
305
|
|
|
146
|
-
if (chunks.size !== expectedIds.size) {
|
|
147
|
-
throw new Error(
|
|
306
|
+
if (fetchError || chunks.size !== expectedIds.size) {
|
|
307
|
+
throw new Error(
|
|
308
|
+
`Failed to resolve file. Recieved ${chunks.size}/${expectedIds.size} chunks`
|
|
309
|
+
);
|
|
148
310
|
}
|
|
311
|
+
|
|
149
312
|
const chunkContentResolved: Uint8Array[] = await Promise.all(
|
|
150
313
|
this.fileIds.map(async (x) => {
|
|
151
314
|
const chunkValue = await chunks.get(x);
|
|
@@ -155,50 +318,118 @@ export class LargeFile extends AbstractFile {
|
|
|
155
318
|
return chunkValue;
|
|
156
319
|
})
|
|
157
320
|
);
|
|
158
|
-
|
|
321
|
+
console.log("FETCH DONE");
|
|
322
|
+
return (
|
|
323
|
+
properties?.as == "chunks"
|
|
324
|
+
? chunkContentResolved
|
|
325
|
+
: concat(chunkContentResolved)
|
|
326
|
+
) as Output;
|
|
159
327
|
}
|
|
160
328
|
}
|
|
161
329
|
|
|
162
|
-
type Args = { role: Role };
|
|
330
|
+
type Args = { role: Role; sync?: SyncFilter | undefined };
|
|
163
331
|
|
|
164
332
|
@variant("files")
|
|
165
333
|
export class Files extends Program<Args> {
|
|
166
334
|
@field({ type: Uint8Array })
|
|
167
335
|
id: Uint8Array;
|
|
168
336
|
|
|
337
|
+
@field({ type: "string" })
|
|
338
|
+
name: string;
|
|
339
|
+
|
|
340
|
+
@field({ type: option(TrustedNetwork) })
|
|
341
|
+
trustGraph?: TrustedNetwork;
|
|
342
|
+
|
|
169
343
|
@field({ type: Documents })
|
|
170
344
|
files: Documents<AbstractFile>;
|
|
171
345
|
|
|
172
|
-
constructor(
|
|
346
|
+
constructor(
|
|
347
|
+
properties: {
|
|
348
|
+
id?: Uint8Array;
|
|
349
|
+
name?: string;
|
|
350
|
+
rootKey?: PublicSignKey;
|
|
351
|
+
} = {}
|
|
352
|
+
) {
|
|
173
353
|
super();
|
|
174
|
-
this.id = id;
|
|
175
|
-
this.
|
|
354
|
+
this.id = properties.id || randomBytes(32);
|
|
355
|
+
this.name = properties.name || "";
|
|
356
|
+
this.trustGraph = properties.rootKey
|
|
357
|
+
? new TrustedNetwork({ id: this.id, rootTrust: properties.rootKey })
|
|
358
|
+
: undefined;
|
|
359
|
+
this.files = new Documents({
|
|
360
|
+
id: sha256Sync(
|
|
361
|
+
concat([
|
|
362
|
+
this.id,
|
|
363
|
+
new TextEncoder().encode(this.name),
|
|
364
|
+
properties.rootKey?.bytes || new Uint8Array(0),
|
|
365
|
+
])
|
|
366
|
+
),
|
|
367
|
+
});
|
|
176
368
|
}
|
|
177
369
|
|
|
178
|
-
async
|
|
370
|
+
async add(name: string, file: Uint8Array, parentId?: string) {
|
|
179
371
|
let toPut: AbstractFile;
|
|
180
372
|
if (file.byteLength <= TINY_FILE_SIZE_LIMIT) {
|
|
181
|
-
toPut = new TinyFile({ name, file });
|
|
373
|
+
toPut = new TinyFile({ name, file, parentId });
|
|
182
374
|
} else if (
|
|
183
375
|
file.byteLength > TINY_FILE_SIZE_LIMIT &&
|
|
184
376
|
file.byteLength <= SMALL_FILE_SIZE_LIMIT
|
|
185
377
|
) {
|
|
186
|
-
toPut = await SmallFile.create(this.node, name, file);
|
|
378
|
+
toPut = await SmallFile.create(this.node, name, file, parentId);
|
|
187
379
|
} else {
|
|
380
|
+
if (parentId) {
|
|
381
|
+
throw new Error("Unexpected that a LargeFile to have a parent");
|
|
382
|
+
}
|
|
188
383
|
toPut = await LargeFile.create(name, file, this);
|
|
189
384
|
}
|
|
190
385
|
await this.files.put(toPut);
|
|
191
386
|
return toPut.id;
|
|
192
387
|
}
|
|
193
388
|
|
|
389
|
+
async removeById(id: string) {
|
|
390
|
+
const file = await this.files.index.get(id);
|
|
391
|
+
if (file) {
|
|
392
|
+
await file.delete(this);
|
|
393
|
+
await this.files.del(file.id);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
async removeByName(name: string) {
|
|
398
|
+
const files = await this.files.index.search(
|
|
399
|
+
new SearchRequest({
|
|
400
|
+
query: new StringMatch({
|
|
401
|
+
key: ["name"],
|
|
402
|
+
value: name,
|
|
403
|
+
caseInsensitive: false,
|
|
404
|
+
method: StringMatchMethod.exact,
|
|
405
|
+
}),
|
|
406
|
+
})
|
|
407
|
+
);
|
|
408
|
+
for (const file of files) {
|
|
409
|
+
await file.delete(this);
|
|
410
|
+
await this.files.del(file.id);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
async list() {
|
|
415
|
+
const files = await this.files.index.search(new SearchRequest(), {
|
|
416
|
+
local: true,
|
|
417
|
+
remote: true,
|
|
418
|
+
});
|
|
419
|
+
return files;
|
|
420
|
+
}
|
|
194
421
|
/**
|
|
195
422
|
* Get by name
|
|
196
423
|
* @param id
|
|
197
424
|
* @returns
|
|
198
425
|
*/
|
|
199
|
-
async getById
|
|
200
|
-
|
|
201
|
-
|
|
426
|
+
async getById<
|
|
427
|
+
OutputType extends "chunks" | "joined" = "joined",
|
|
428
|
+
Output = OutputType extends "chunks" ? Uint8Array[] : Uint8Array
|
|
429
|
+
>(
|
|
430
|
+
id: string,
|
|
431
|
+
properties?: { as: OutputType }
|
|
432
|
+
): Promise<{ id: string; name: string; bytes: Output } | undefined> {
|
|
202
433
|
const results = await this.files.index.search(
|
|
203
434
|
new SearchRequest({
|
|
204
435
|
query: [new StringMatch({ key: "id", value: id })],
|
|
@@ -212,9 +443,13 @@ export class Files extends Program<Args> {
|
|
|
212
443
|
);
|
|
213
444
|
|
|
214
445
|
for (const result of results) {
|
|
215
|
-
const file = await result.getFile(this);
|
|
446
|
+
const file = await result.getFile(this, properties);
|
|
216
447
|
if (file) {
|
|
217
|
-
return {
|
|
448
|
+
return {
|
|
449
|
+
id: result.id,
|
|
450
|
+
name: result.name,
|
|
451
|
+
bytes: file as Output,
|
|
452
|
+
};
|
|
218
453
|
}
|
|
219
454
|
}
|
|
220
455
|
}
|
|
@@ -224,9 +459,13 @@ export class Files extends Program<Args> {
|
|
|
224
459
|
* @param name
|
|
225
460
|
* @returns
|
|
226
461
|
*/
|
|
227
|
-
async getByName
|
|
228
|
-
|
|
229
|
-
|
|
462
|
+
async getByName<
|
|
463
|
+
OutputType extends "chunks" | "joined" = "joined",
|
|
464
|
+
Output = OutputType extends "chunks" ? Uint8Array[] : Uint8Array
|
|
465
|
+
>(
|
|
466
|
+
name: string,
|
|
467
|
+
properties?: { as: OutputType }
|
|
468
|
+
): Promise<{ id: string; name: string; bytes: Output } | undefined> {
|
|
230
469
|
const results = await this.files.index.search(
|
|
231
470
|
new SearchRequest({
|
|
232
471
|
query: [new StringMatch({ key: "name", value: name })],
|
|
@@ -240,25 +479,50 @@ export class Files extends Program<Args> {
|
|
|
240
479
|
);
|
|
241
480
|
|
|
242
481
|
for (const result of results) {
|
|
243
|
-
const file = await result.getFile(this);
|
|
482
|
+
const file = await result.getFile(this, properties);
|
|
244
483
|
if (file) {
|
|
245
|
-
return {
|
|
484
|
+
return {
|
|
485
|
+
id: result.id,
|
|
486
|
+
name: result.name,
|
|
487
|
+
bytes: file as Output,
|
|
488
|
+
};
|
|
246
489
|
}
|
|
247
490
|
}
|
|
248
491
|
}
|
|
249
492
|
|
|
250
493
|
// Setup lifecycle, will be invoked on 'open'
|
|
251
494
|
async open(args?: Args): Promise<void> {
|
|
495
|
+
await this.trustGraph?.open({
|
|
496
|
+
role: args?.role,
|
|
497
|
+
});
|
|
498
|
+
|
|
252
499
|
await this.files.open({
|
|
253
500
|
type: AbstractFile,
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
501
|
+
// TODO add ACL
|
|
502
|
+
role: args?.role,
|
|
503
|
+
sync: args?.sync,
|
|
504
|
+
replicas: { min: 3 },
|
|
505
|
+
canPerform: async (operation, context) => {
|
|
506
|
+
if (!this.trustGraph) {
|
|
507
|
+
return true;
|
|
508
|
+
}
|
|
509
|
+
for (const key of await context.entry.getPublicKeys()) {
|
|
510
|
+
if (await this.trustGraph.isTrusted(key)) {
|
|
511
|
+
return true;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
return false;
|
|
257
515
|
},
|
|
258
|
-
|
|
259
|
-
|
|
516
|
+
index: {
|
|
517
|
+
fields: (doc) => {
|
|
518
|
+
return {
|
|
519
|
+
id: doc.id,
|
|
520
|
+
name: doc.name,
|
|
521
|
+
size: doc.size,
|
|
522
|
+
parentId: doc.parentId,
|
|
523
|
+
};
|
|
524
|
+
},
|
|
260
525
|
},
|
|
261
|
-
role: args?.role,
|
|
262
526
|
});
|
|
263
527
|
}
|
|
264
528
|
}
|