@lossless.org/client 0.1.0
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/.smartconfig.json +37 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.losslessorgclient.d.ts +32 -0
- package/dist_ts/classes.losslessorgclient.js +103 -0
- package/dist_ts/core/classes.error.d.ts +16 -0
- package/dist_ts/core/classes.error.js +29 -0
- package/dist_ts/core/classes.operation.d.ts +17 -0
- package/dist_ts/core/classes.operation.js +70 -0
- package/dist_ts/core/interfaces.d.ts +18 -0
- package/dist_ts/core/interfaces.js +2 -0
- package/dist_ts/index.d.ts +4 -0
- package/dist_ts/index.js +3 -0
- package/dist_ts/nosqldb/classes.atomicdelete.d.ts +26 -0
- package/dist_ts/nosqldb/classes.atomicdelete.js +44 -0
- package/dist_ts/nosqldb/classes.atomicfindoneandupdate.d.ts +27 -0
- package/dist_ts/nosqldb/classes.atomicfindoneandupdate.js +86 -0
- package/dist_ts/nosqldb/classes.atomicupdate.d.ts +26 -0
- package/dist_ts/nosqldb/classes.atomicupdate.js +55 -0
- package/dist_ts/nosqldb/classes.bootstraprecord.d.ts +14 -0
- package/dist_ts/nosqldb/classes.bootstraprecord.js +80 -0
- package/dist_ts/nosqldb/classes.bsonassertion.d.ts +2 -0
- package/dist_ts/nosqldb/classes.bsonassertion.js +29 -0
- package/dist_ts/nosqldb/classes.bsonobjectid.d.ts +2 -0
- package/dist_ts/nosqldb/classes.bsonobjectid.js +50 -0
- package/dist_ts/nosqldb/classes.bsonsnapshot.d.ts +3 -0
- package/dist_ts/nosqldb/classes.bsonsnapshot.js +126 -0
- package/dist_ts/nosqldb/classes.cached-document.d.ts +27 -0
- package/dist_ts/nosqldb/classes.cached-document.js +112 -0
- package/dist_ts/nosqldb/classes.collection.d.ts +302 -0
- package/dist_ts/nosqldb/classes.collection.js +1568 -0
- package/dist_ts/nosqldb/classes.collectionfactory.d.ts +30 -0
- package/dist_ts/nosqldb/classes.collectionfactory.js +65 -0
- package/dist_ts/nosqldb/classes.collectionlifecycle.d.ts +4 -0
- package/dist_ts/nosqldb/classes.collectionlifecycle.js +15 -0
- package/dist_ts/nosqldb/classes.collectionpreparation.d.ts +34 -0
- package/dist_ts/nosqldb/classes.collectionpreparation.js +134 -0
- package/dist_ts/nosqldb/classes.collectiontopology.d.ts +47 -0
- package/dist_ts/nosqldb/classes.collectiontopology.js +388 -0
- package/dist_ts/nosqldb/classes.connection.d.ts +18 -0
- package/dist_ts/nosqldb/classes.connection.js +23 -0
- package/dist_ts/nosqldb/classes.convenience.d.ts +1 -0
- package/dist_ts/nosqldb/classes.convenience.js +5 -0
- package/dist_ts/nosqldb/classes.cursor.d.ts +15 -0
- package/dist_ts/nosqldb/classes.cursor.js +82 -0
- package/dist_ts/nosqldb/classes.cursoroperation.d.ts +7 -0
- package/dist_ts/nosqldb/classes.cursoroperation.js +36 -0
- package/dist_ts/nosqldb/classes.db.d.ts +98 -0
- package/dist_ts/nosqldb/classes.db.js +434 -0
- package/dist_ts/nosqldb/classes.distributedcoordinator.d.ts +52 -0
- package/dist_ts/nosqldb/classes.distributedcoordinator.js +314 -0
- package/dist_ts/nosqldb/classes.doc.d.ts +722 -0
- package/dist_ts/nosqldb/classes.doc.js +2976 -0
- package/dist_ts/nosqldb/classes.easystore.d.ts +42 -0
- package/dist_ts/nosqldb/classes.easystore.js +199 -0
- package/dist_ts/nosqldb/classes.exactpersistence.d.ts +141 -0
- package/dist_ts/nosqldb/classes.exactpersistence.js +1110 -0
- package/dist_ts/nosqldb/classes.lucene.adapter.d.ts +173 -0
- package/dist_ts/nosqldb/classes.lucene.adapter.js +623 -0
- package/dist_ts/nosqldb/classes.mongoadministration.d.ts +73 -0
- package/dist_ts/nosqldb/classes.mongoadministration.js +497 -0
- package/dist_ts/nosqldb/classes.namespaceinspection.d.ts +42 -0
- package/dist_ts/nosqldb/classes.namespaceinspection.js +138 -0
- package/dist_ts/nosqldb/classes.operationbudget.d.ts +22 -0
- package/dist_ts/nosqldb/classes.operationbudget.js +65 -0
- package/dist_ts/nosqldb/classes.ordinarypersistence.d.ts +18 -0
- package/dist_ts/nosqldb/classes.ordinarypersistence.js +71 -0
- package/dist_ts/nosqldb/classes.persistence.d.ts +14 -0
- package/dist_ts/nosqldb/classes.persistence.js +34 -0
- package/dist_ts/nosqldb/classes.session.d.ts +28 -0
- package/dist_ts/nosqldb/classes.session.js +246 -0
- package/dist_ts/nosqldb/classes.storedinspection.d.ts +44 -0
- package/dist_ts/nosqldb/classes.storedinspection.js +100 -0
- package/dist_ts/nosqldb/classes.testdatabase.d.ts +56 -0
- package/dist_ts/nosqldb/classes.testdatabase.js +250 -0
- package/dist_ts/nosqldb/classes.watcher.d.ts +37 -0
- package/dist_ts/nosqldb/classes.watcher.js +98 -0
- package/dist_ts/nosqldb/index.d.ts +27 -0
- package/dist_ts/nosqldb/index.js +18 -0
- package/dist_ts/nosqldb/logging.d.ts +2 -0
- package/dist_ts/nosqldb/logging.js +3 -0
- package/dist_ts/nosqldb/plugins.d.ts +17 -0
- package/dist_ts/nosqldb/plugins.js +20 -0
- package/dist_ts/nosqldb/shim.d.ts +1 -0
- package/dist_ts/nosqldb/shim.js +8 -0
- package/dist_ts/nosqldb/testsupport.d.ts +3 -0
- package/dist_ts/nosqldb/testsupport.js +3 -0
- package/dist_ts/objectstorage/classes.bucket.d.ts +227 -0
- package/dist_ts/objectstorage/classes.bucket.js +939 -0
- package/dist_ts/objectstorage/classes.connection.d.ts +21 -0
- package/dist_ts/objectstorage/classes.connection.js +27 -0
- package/dist_ts/objectstorage/classes.directory.d.ts +124 -0
- package/dist_ts/objectstorage/classes.directory.js +335 -0
- package/dist_ts/objectstorage/classes.exactpathpurgeerror.d.ts +5 -0
- package/dist_ts/objectstorage/classes.exactpathpurgeerror.js +18 -0
- package/dist_ts/objectstorage/classes.exactuploaderror.d.ts +5 -0
- package/dist_ts/objectstorage/classes.exactuploaderror.js +19 -0
- package/dist_ts/objectstorage/classes.file.d.ts +91 -0
- package/dist_ts/objectstorage/classes.file.js +255 -0
- package/dist_ts/objectstorage/classes.listcursor.d.ts +41 -0
- package/dist_ts/objectstorage/classes.listcursor.js +67 -0
- package/dist_ts/objectstorage/classes.metadata.d.ts +57 -0
- package/dist_ts/objectstorage/classes.metadata.js +113 -0
- package/dist_ts/objectstorage/classes.smartbucket.d.ts +57 -0
- package/dist_ts/objectstorage/classes.smartbucket.js +357 -0
- package/dist_ts/objectstorage/classes.trash.d.ts +11 -0
- package/dist_ts/objectstorage/classes.trash.js +22 -0
- package/dist_ts/objectstorage/classes.watcher.d.ts +79 -0
- package/dist_ts/objectstorage/classes.watcher.js +249 -0
- package/dist_ts/objectstorage/helpers.d.ts +25 -0
- package/dist_ts/objectstorage/helpers.js +215 -0
- package/dist_ts/objectstorage/index.d.ts +13 -0
- package/dist_ts/objectstorage/index.js +13 -0
- package/dist_ts/objectstorage/interfaces.d.ts +276 -0
- package/dist_ts/objectstorage/interfaces.js +2 -0
- package/dist_ts/objectstorage/internal.exactpathpurge.operations.d.ts +11 -0
- package/dist_ts/objectstorage/internal.exactpathpurge.operations.js +1069 -0
- package/dist_ts/objectstorage/internal.exactupload.capability.d.ts +40 -0
- package/dist_ts/objectstorage/internal.exactupload.capability.js +382 -0
- package/dist_ts/objectstorage/internal.exactupload.operations.d.ts +11 -0
- package/dist_ts/objectstorage/internal.exactupload.operations.js +1104 -0
- package/dist_ts/objectstorage/internal.multipart.planner.d.ts +8 -0
- package/dist_ts/objectstorage/internal.multipart.planner.js +63 -0
- package/dist_ts/objectstorage/internal.multipart.stream.d.ts +17 -0
- package/dist_ts/objectstorage/internal.multipart.stream.js +440 -0
- package/dist_ts/objectstorage/internal.multipart.types.d.ts +82 -0
- package/dist_ts/objectstorage/internal.multipart.types.js +2 -0
- package/dist_ts/objectstorage/plugins.d.ts +17 -0
- package/dist_ts/objectstorage/plugins.js +23 -0
- package/dist_ts/plugins.d.ts +4 -0
- package/dist_ts/plugins.js +5 -0
- package/dist_ts/sqldb/classes.clickhouseconnection.d.ts +39 -0
- package/dist_ts/sqldb/classes.clickhouseconnection.js +225 -0
- package/dist_ts/sqldb/classes.sqlconnection.d.ts +50 -0
- package/dist_ts/sqldb/classes.sqlconnection.js +376 -0
- package/dist_ts/sqldb/classes.sqltable.d.ts +29 -0
- package/dist_ts/sqldb/classes.sqltable.js +70 -0
- package/dist_ts/sqldb/clickhouse/classes.metricwriter.d.ts +27 -0
- package/dist_ts/sqldb/clickhouse/classes.metricwriter.js +89 -0
- package/dist_ts/sqldb/clickhouse/index.d.ts +9 -0
- package/dist_ts/sqldb/clickhouse/index.js +13 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.clickhousetable.d.ts +88 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.clickhousetable.js +304 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.httpclient.d.ts +28 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.httpclient.js +46 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.querybuilder.d.ts +43 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.querybuilder.js +155 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.resultset.d.ts +13 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.resultset.js +36 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.smartclickhouse.d.ts +49 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.smartclickhouse.js +106 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.timedatatable.d.ts +51 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.classes.timedatatable.js +96 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.plugins.d.ts +5 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.plugins.js +6 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.types.d.ts +53 -0
- package/dist_ts/sqldb/clickhouse/smartclickhouse.types.js +41 -0
- package/dist_ts/sqldb/index.d.ts +6 -0
- package/dist_ts/sqldb/index.js +6 -0
- package/dist_ts/sqldb/interfaces.d.ts +53 -0
- package/dist_ts/sqldb/interfaces.js +19 -0
- package/dist_ts/sqldb/internal.sqlpool.d.ts +51 -0
- package/dist_ts/sqldb/internal.sqlpool.js +214 -0
- package/dist_ts/sqldb/plugins.clickhouse.d.ts +4 -0
- package/dist_ts/sqldb/plugins.clickhouse.js +5 -0
- package/dist_ts/sqldb/plugins.mariadb.d.ts +4 -0
- package/dist_ts/sqldb/plugins.mariadb.js +5 -0
- package/docs/source/smartbucket/license.md +19 -0
- package/docs/source/smartclickhouse/license.md +19 -0
- package/license.md +21 -0
- package/package.json +101 -0
- package/readme.md +157 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.losslessorgclient.ts +104 -0
- package/ts/core/classes.error.ts +31 -0
- package/ts/core/classes.operation.ts +60 -0
- package/ts/core/interfaces.ts +24 -0
- package/ts/index.ts +4 -0
- package/ts/nosqldb/classes.atomicdelete.ts +81 -0
- package/ts/nosqldb/classes.atomicfindoneandupdate.ts +152 -0
- package/ts/nosqldb/classes.atomicupdate.ts +99 -0
- package/ts/nosqldb/classes.bootstraprecord.ts +107 -0
- package/ts/nosqldb/classes.bsonassertion.ts +25 -0
- package/ts/nosqldb/classes.bsonobjectid.ts +45 -0
- package/ts/nosqldb/classes.bsonsnapshot.ts +105 -0
- package/ts/nosqldb/classes.cached-document.ts +67 -0
- package/ts/nosqldb/classes.collection.ts +2399 -0
- package/ts/nosqldb/classes.collectionfactory.ts +87 -0
- package/ts/nosqldb/classes.collectionlifecycle.ts +24 -0
- package/ts/nosqldb/classes.collectionpreparation.ts +164 -0
- package/ts/nosqldb/classes.collectiontopology.ts +645 -0
- package/ts/nosqldb/classes.connection.ts +31 -0
- package/ts/nosqldb/classes.convenience.ts +5 -0
- package/ts/nosqldb/classes.cursor.ts +88 -0
- package/ts/nosqldb/classes.cursoroperation.ts +38 -0
- package/ts/nosqldb/classes.db.ts +637 -0
- package/ts/nosqldb/classes.distributedcoordinator.ts +305 -0
- package/ts/nosqldb/classes.doc.ts +4928 -0
- package/ts/nosqldb/classes.easystore.ts +154 -0
- package/ts/nosqldb/classes.exactpersistence.ts +1974 -0
- package/ts/nosqldb/classes.lucene.adapter.ts +780 -0
- package/ts/nosqldb/classes.mongoadministration.ts +867 -0
- package/ts/nosqldb/classes.namespaceinspection.ts +199 -0
- package/ts/nosqldb/classes.operationbudget.ts +75 -0
- package/ts/nosqldb/classes.ordinarypersistence.ts +84 -0
- package/ts/nosqldb/classes.persistence.ts +62 -0
- package/ts/nosqldb/classes.session.ts +389 -0
- package/ts/nosqldb/classes.storedinspection.ts +151 -0
- package/ts/nosqldb/classes.testdatabase.ts +272 -0
- package/ts/nosqldb/classes.watcher.ts +96 -0
- package/ts/nosqldb/index.ts +51 -0
- package/ts/nosqldb/logging.ts +3 -0
- package/ts/nosqldb/plugins.ts +37 -0
- package/ts/nosqldb/shim.ts +6 -0
- package/ts/nosqldb/testsupport.ts +13 -0
- package/ts/objectstorage/classes.bucket.ts +1114 -0
- package/ts/objectstorage/classes.connection.ts +36 -0
- package/ts/objectstorage/classes.directory.ts +425 -0
- package/ts/objectstorage/classes.exactpathpurgeerror.ts +24 -0
- package/ts/objectstorage/classes.exactuploaderror.ts +25 -0
- package/ts/objectstorage/classes.file.ts +303 -0
- package/ts/objectstorage/classes.listcursor.ts +89 -0
- package/ts/objectstorage/classes.metadata.ts +134 -0
- package/ts/objectstorage/classes.smartbucket.ts +445 -0
- package/ts/objectstorage/classes.trash.ts +30 -0
- package/ts/objectstorage/classes.watcher.ts +289 -0
- package/ts/objectstorage/helpers.ts +254 -0
- package/ts/objectstorage/index.ts +13 -0
- package/ts/objectstorage/interfaces.ts +389 -0
- package/ts/objectstorage/internal.exactpathpurge.operations.ts +1936 -0
- package/ts/objectstorage/internal.exactupload.capability.ts +580 -0
- package/ts/objectstorage/internal.exactupload.operations.ts +1715 -0
- package/ts/objectstorage/internal.multipart.planner.ts +90 -0
- package/ts/objectstorage/internal.multipart.stream.ts +606 -0
- package/ts/objectstorage/internal.multipart.types.ts +106 -0
- package/ts/objectstorage/plugins.ts +35 -0
- package/ts/plugins.ts +4 -0
- package/ts/sqldb/classes.clickhouseconnection.ts +189 -0
- package/ts/sqldb/classes.sqlconnection.ts +350 -0
- package/ts/sqldb/classes.sqltable.ts +70 -0
- package/ts/sqldb/clickhouse/classes.metricwriter.ts +72 -0
- package/ts/sqldb/clickhouse/index.ts +16 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.clickhousetable.ts +372 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.httpclient.ts +52 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.querybuilder.ts +120 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.resultset.ts +44 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.smartclickhouse.ts +123 -0
- package/ts/sqldb/clickhouse/smartclickhouse.classes.timedatatable.ts +114 -0
- package/ts/sqldb/clickhouse/smartclickhouse.plugins.ts +5 -0
- package/ts/sqldb/clickhouse/smartclickhouse.types.ts +134 -0
- package/ts/sqldb/index.ts +6 -0
- package/ts/sqldb/interfaces.ts +61 -0
- package/ts/sqldb/internal.sqlpool.ts +179 -0
- package/ts/sqldb/plugins.clickhouse.ts +4 -0
- package/ts/sqldb/plugins.mariadb.ts +4 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import * as helpers from './helpers.js';
|
|
3
|
+
import * as interfaces from './interfaces.js';
|
|
4
|
+
import { Directory } from './classes.directory.js';
|
|
5
|
+
import { MetaData } from './classes.metadata.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* represents a file in a directory
|
|
9
|
+
*/
|
|
10
|
+
export class File {
|
|
11
|
+
// STATIC
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* creates a file in draft mode
|
|
15
|
+
* you need to call .save() to store it in object storage
|
|
16
|
+
* @param optionsArg
|
|
17
|
+
*/
|
|
18
|
+
public static async create(optionsArg: {
|
|
19
|
+
directory: Directory;
|
|
20
|
+
name: string;
|
|
21
|
+
contents: Buffer | string | plugins.stream.Readable;
|
|
22
|
+
/**
|
|
23
|
+
* if contents are of type string, you can specify the encoding here
|
|
24
|
+
*/
|
|
25
|
+
encoding?: 'utf8' | 'binary';
|
|
26
|
+
}): Promise<File> {
|
|
27
|
+
const contents =
|
|
28
|
+
typeof optionsArg.contents === 'string'
|
|
29
|
+
? Buffer.from(optionsArg.contents, optionsArg.encoding)
|
|
30
|
+
: optionsArg.contents;
|
|
31
|
+
const file = new File({
|
|
32
|
+
directoryRefArg: optionsArg.directory,
|
|
33
|
+
fileName: optionsArg.name,
|
|
34
|
+
});
|
|
35
|
+
if (contents instanceof plugins.stream.Readable) {
|
|
36
|
+
await optionsArg.directory.fastPutStream({
|
|
37
|
+
path: optionsArg.name,
|
|
38
|
+
stream: contents,
|
|
39
|
+
});
|
|
40
|
+
} else {
|
|
41
|
+
await optionsArg.directory.fastPut({
|
|
42
|
+
path: optionsArg.name,
|
|
43
|
+
contents: contents,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return file;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// INSTANCE
|
|
50
|
+
public parentDirectoryRef: Directory;
|
|
51
|
+
public name: string;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* get the full path to the file
|
|
55
|
+
* @returns the full path to the file
|
|
56
|
+
*/
|
|
57
|
+
public getBasePath(): string {
|
|
58
|
+
return plugins.path.join(this.parentDirectoryRef.getBasePath(), this.name);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
constructor(optionsArg: { directoryRefArg: Directory; fileName: string }) {
|
|
62
|
+
this.parentDirectoryRef = optionsArg.directoryRefArg;
|
|
63
|
+
this.name = optionsArg.fileName;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public async getContentsAsString(): Promise<string> {
|
|
67
|
+
const fileBuffer = await this.getContents();
|
|
68
|
+
return fileBuffer.toString();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public async getContents(): Promise<Buffer> {
|
|
72
|
+
const resultBuffer = await this.parentDirectoryRef.bucketRef.fastGet({
|
|
73
|
+
path: this.getBasePath(),
|
|
74
|
+
});
|
|
75
|
+
return resultBuffer;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public async getReadStream(typeArg: 'webstream'): Promise<ReadableStream>;
|
|
79
|
+
public async getReadStream(typeArg: 'nodestream'): Promise<plugins.stream.Readable>;
|
|
80
|
+
public async getReadStream(
|
|
81
|
+
typeArg: 'nodestream' | 'webstream'
|
|
82
|
+
): Promise<ReadableStream | plugins.stream.Readable> {
|
|
83
|
+
const readStream = this.parentDirectoryRef.bucketRef.fastGetStream(
|
|
84
|
+
{
|
|
85
|
+
path: this.getBasePath(),
|
|
86
|
+
},
|
|
87
|
+
typeArg as any
|
|
88
|
+
);
|
|
89
|
+
return readStream;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* deletes this file
|
|
94
|
+
*/
|
|
95
|
+
public async delete(optionsArg?: { mode: 'trash' | 'permanent' }) {
|
|
96
|
+
optionsArg = {
|
|
97
|
+
...{
|
|
98
|
+
mode: 'permanent',
|
|
99
|
+
},
|
|
100
|
+
...optionsArg,
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
if (optionsArg.mode === 'permanent') {
|
|
104
|
+
await this.parentDirectoryRef.bucketRef.fastRemove({
|
|
105
|
+
path: this.getBasePath(),
|
|
106
|
+
});
|
|
107
|
+
if (!this.name.endsWith('.metadata')) {
|
|
108
|
+
if (await this.hasMetaData()) {
|
|
109
|
+
const metadata = await this.getMetaData();
|
|
110
|
+
await metadata.metadataFile.delete(optionsArg);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
} else if (optionsArg.mode === 'trash') {
|
|
114
|
+
const metadata = await this.getMetaData();
|
|
115
|
+
await metadata.storeCustomMetaData({
|
|
116
|
+
key: 'recycle',
|
|
117
|
+
value: {
|
|
118
|
+
deletedAt: Date.now(),
|
|
119
|
+
originalPath: this.getBasePath(),
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
const trash = await this.parentDirectoryRef.bucketRef.getTrash();
|
|
123
|
+
const trashDir = await trash.getTrashDir();
|
|
124
|
+
await this.move({
|
|
125
|
+
directory: trashDir,
|
|
126
|
+
path: await trash.getTrashKeyByOriginalBasePath(this.getBasePath()),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
await this.parentDirectoryRef.listFiles();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* restores
|
|
135
|
+
*/
|
|
136
|
+
public async restore(optionsArg: {
|
|
137
|
+
useOriginalPath?: boolean;
|
|
138
|
+
toPath?: string;
|
|
139
|
+
overwrite?: boolean;
|
|
140
|
+
} = {}) {
|
|
141
|
+
optionsArg = {
|
|
142
|
+
useOriginalPath: (() => {
|
|
143
|
+
return optionsArg.toPath ? false : true;
|
|
144
|
+
})(),
|
|
145
|
+
overwrite: false,
|
|
146
|
+
...optionsArg,
|
|
147
|
+
};
|
|
148
|
+
const metadata = await this.getMetaData();
|
|
149
|
+
const moveToPath = optionsArg.toPath || (await metadata.getCustomMetaData({
|
|
150
|
+
key: 'recycle'
|
|
151
|
+
})).originalPath;
|
|
152
|
+
await metadata.deleteCustomMetaData({
|
|
153
|
+
key: 'recycle'
|
|
154
|
+
})
|
|
155
|
+
await this.move({
|
|
156
|
+
path: moveToPath,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* allows locking the file
|
|
162
|
+
* @param optionsArg
|
|
163
|
+
*/
|
|
164
|
+
public async lock(optionsArg?: { timeoutMillis?: number }) {
|
|
165
|
+
const metadata = await this.getMetaData();
|
|
166
|
+
await metadata.setLock({
|
|
167
|
+
lock: 'locked',
|
|
168
|
+
expires: Date.now() + (optionsArg?.timeoutMillis || 1000),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* actively unlocks a file
|
|
174
|
+
*
|
|
175
|
+
*/
|
|
176
|
+
public async unlock(optionsArg?: {
|
|
177
|
+
/**
|
|
178
|
+
* unlock the file even if not locked from this instance
|
|
179
|
+
*/
|
|
180
|
+
force?: boolean;
|
|
181
|
+
}) {
|
|
182
|
+
const metadata = await this.getMetaData();
|
|
183
|
+
await metadata.removeLock({
|
|
184
|
+
force: optionsArg?.force || false,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
public async updateWithContents(optionsArg: {
|
|
189
|
+
contents: Buffer | string | plugins.stream.Readable | ReadableStream;
|
|
190
|
+
encoding?: 'utf8' | 'binary';
|
|
191
|
+
}) {
|
|
192
|
+
if (
|
|
193
|
+
optionsArg.contents instanceof plugins.stream.Readable ||
|
|
194
|
+
optionsArg.contents instanceof ReadableStream
|
|
195
|
+
) {
|
|
196
|
+
await this.parentDirectoryRef.bucketRef.fastPutStream({
|
|
197
|
+
path: this.getBasePath(),
|
|
198
|
+
readableStream: optionsArg.contents,
|
|
199
|
+
overwrite: true,
|
|
200
|
+
});
|
|
201
|
+
} else if (Buffer.isBuffer(optionsArg.contents)) {
|
|
202
|
+
await this.parentDirectoryRef.bucketRef.fastPut({
|
|
203
|
+
path: this.getBasePath(),
|
|
204
|
+
contents: optionsArg.contents,
|
|
205
|
+
overwrite: true,
|
|
206
|
+
});
|
|
207
|
+
} else if (typeof optionsArg.contents === 'string') {
|
|
208
|
+
await this.parentDirectoryRef.bucketRef.fastPut({
|
|
209
|
+
path: this.getBasePath(),
|
|
210
|
+
contents: Buffer.from(optionsArg.contents, optionsArg.encoding),
|
|
211
|
+
overwrite: true,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* moves the file to another directory
|
|
218
|
+
*/
|
|
219
|
+
public async move(pathDescriptorArg: interfaces.IPathDecriptor) {
|
|
220
|
+
let moveToPath: string = '';
|
|
221
|
+
const isDirectory = await this.parentDirectoryRef.bucketRef.isDirectory(pathDescriptorArg);
|
|
222
|
+
if (isDirectory) {
|
|
223
|
+
moveToPath = await helpers.reducePathDescriptorToPath({
|
|
224
|
+
...pathDescriptorArg,
|
|
225
|
+
path: plugins.path.join(pathDescriptorArg.path!, this.name),
|
|
226
|
+
});
|
|
227
|
+
} else {
|
|
228
|
+
moveToPath = await helpers.reducePathDescriptorToPath(pathDescriptorArg);
|
|
229
|
+
}
|
|
230
|
+
// lets move the file
|
|
231
|
+
await this.parentDirectoryRef.bucketRef.fastMove({
|
|
232
|
+
sourcePath: this.getBasePath(),
|
|
233
|
+
destinationPath: moveToPath,
|
|
234
|
+
overwrite: true,
|
|
235
|
+
});
|
|
236
|
+
// lets move the metadatafile
|
|
237
|
+
if (!this.name.endsWith('.metadata')) {
|
|
238
|
+
const metadata = await this.getMetaData();
|
|
239
|
+
await this.parentDirectoryRef.bucketRef.fastMove({
|
|
240
|
+
sourcePath: metadata.metadataFile.getBasePath(),
|
|
241
|
+
destinationPath: moveToPath + '.metadata',
|
|
242
|
+
overwrite: true,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// lets update references of this
|
|
247
|
+
const baseDirectory = await this.parentDirectoryRef.bucketRef.getBaseDirectory();
|
|
248
|
+
this.parentDirectoryRef = await baseDirectory.getSubDirectoryByName(
|
|
249
|
+
await helpers.reducePathDescriptorToPath(pathDescriptorArg),
|
|
250
|
+
{
|
|
251
|
+
couldBeFilePath: true,
|
|
252
|
+
}
|
|
253
|
+
);
|
|
254
|
+
this.name = pathDescriptorArg.path!;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
public async hasMetaData(): Promise<boolean> {
|
|
258
|
+
if (!this.name.endsWith('.metadata')) {
|
|
259
|
+
const hasMetadataBool = MetaData.hasMetaData({
|
|
260
|
+
file: this,
|
|
261
|
+
});
|
|
262
|
+
return hasMetadataBool;
|
|
263
|
+
} else {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* allows updating the metadata of a file
|
|
270
|
+
* @param updatedMetadata
|
|
271
|
+
*/
|
|
272
|
+
public async getMetaData() {
|
|
273
|
+
if (this.name.endsWith('.metadata')) {
|
|
274
|
+
throw new Error('metadata files cannot have metadata');
|
|
275
|
+
}
|
|
276
|
+
const metadata = await MetaData.createForFile({
|
|
277
|
+
file: this,
|
|
278
|
+
});
|
|
279
|
+
return metadata;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* gets the contents as json
|
|
284
|
+
*/
|
|
285
|
+
public async getJsonData() {
|
|
286
|
+
const json = await this.getContentsAsString();
|
|
287
|
+
const parsed = await JSON.parse(json);
|
|
288
|
+
return parsed;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
public async writeJsonData(dataArg: any) {
|
|
292
|
+
await this.updateWithContents({
|
|
293
|
+
contents: JSON.stringify(dataArg),
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
public async getMagicBytes(optionsArg: { length: number }): Promise<Buffer> {
|
|
298
|
+
return this.parentDirectoryRef.bucketRef.getMagicBytes({
|
|
299
|
+
path: this.getBasePath(),
|
|
300
|
+
length: optionsArg.length,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// classes.listcursor.ts
|
|
2
|
+
|
|
3
|
+
import * as plugins from './plugins.js';
|
|
4
|
+
import type { Bucket } from './classes.bucket.js';
|
|
5
|
+
|
|
6
|
+
export interface IListCursorOptions {
|
|
7
|
+
pageSize?: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface IListCursorResult {
|
|
11
|
+
keys: string[];
|
|
12
|
+
done: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* ListCursor provides explicit pagination control for listing objects in a bucket.
|
|
17
|
+
* Useful for UI pagination, resumable operations, and manual batch processing.
|
|
18
|
+
*/
|
|
19
|
+
export class ListCursor {
|
|
20
|
+
private continuationToken?: string;
|
|
21
|
+
private exhausted = false;
|
|
22
|
+
private pageSize: number;
|
|
23
|
+
|
|
24
|
+
constructor(
|
|
25
|
+
private bucket: Bucket,
|
|
26
|
+
private prefix: string,
|
|
27
|
+
options: IListCursorOptions = {}
|
|
28
|
+
) {
|
|
29
|
+
this.pageSize = options.pageSize || 1000;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Fetch the next page of object keys
|
|
34
|
+
* @returns Object with keys array and done flag
|
|
35
|
+
*/
|
|
36
|
+
public async next(): Promise<IListCursorResult> {
|
|
37
|
+
if (this.exhausted) {
|
|
38
|
+
return { keys: [], done: true };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const command = new plugins.s3.ListObjectsV2Command({
|
|
42
|
+
Bucket: this.bucket.name,
|
|
43
|
+
Prefix: this.prefix,
|
|
44
|
+
MaxKeys: this.pageSize,
|
|
45
|
+
ContinuationToken: this.continuationToken,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const response = await this.bucket.smartbucketRef.storageClient.send(command);
|
|
49
|
+
|
|
50
|
+
const keys = (response.Contents || [])
|
|
51
|
+
.map((obj) => obj.Key)
|
|
52
|
+
.filter((key): key is string => !!key);
|
|
53
|
+
|
|
54
|
+
this.continuationToken = response.NextContinuationToken;
|
|
55
|
+
this.exhausted = !this.continuationToken;
|
|
56
|
+
|
|
57
|
+
return { keys, done: this.exhausted };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Check if there are more pages to fetch
|
|
62
|
+
*/
|
|
63
|
+
public hasMore(): boolean {
|
|
64
|
+
return !this.exhausted;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Reset the cursor to start from the beginning
|
|
69
|
+
*/
|
|
70
|
+
public reset(): void {
|
|
71
|
+
this.continuationToken = undefined;
|
|
72
|
+
this.exhausted = false;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Get the current continuation token (for saving/restoring state)
|
|
77
|
+
*/
|
|
78
|
+
public getToken(): string | undefined {
|
|
79
|
+
return this.continuationToken;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Set the continuation token (for resuming from a saved state)
|
|
84
|
+
*/
|
|
85
|
+
public setToken(token: string | undefined): void {
|
|
86
|
+
this.continuationToken = token;
|
|
87
|
+
this.exhausted = !token;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
|
|
3
|
+
import { File } from './classes.file.js';
|
|
4
|
+
|
|
5
|
+
export class MetaData {
|
|
6
|
+
public static async hasMetaData(optionsArg: { file: File }) {
|
|
7
|
+
// try finding the existing metadata file; return false if it doesn't exist
|
|
8
|
+
try {
|
|
9
|
+
const existingFile = await optionsArg.file.parentDirectoryRef.getFile({
|
|
10
|
+
path: optionsArg.file.name + '.metadata',
|
|
11
|
+
});
|
|
12
|
+
return !!existingFile;
|
|
13
|
+
} catch (error: any) {
|
|
14
|
+
const message = error?.message || '';
|
|
15
|
+
const isNotFound =
|
|
16
|
+
message.includes('File not found') ||
|
|
17
|
+
error?.name === 'NotFound' ||
|
|
18
|
+
error?.$metadata?.httpStatusCode === 404;
|
|
19
|
+
if (isNotFound) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// static
|
|
27
|
+
public static async createForFile(optionsArg: { file: File }) {
|
|
28
|
+
const metaData = new MetaData();
|
|
29
|
+
metaData.fileRef = optionsArg.file;
|
|
30
|
+
|
|
31
|
+
// lets find the existing metadata file
|
|
32
|
+
metaData.metadataFile = await metaData.fileRef.parentDirectoryRef.getFile({
|
|
33
|
+
path: metaData.fileRef.name + '.metadata',
|
|
34
|
+
createWithContents: '{}',
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
return metaData;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// instance
|
|
41
|
+
/**
|
|
42
|
+
* the file that contains the metadata
|
|
43
|
+
*/
|
|
44
|
+
metadataFile!: File;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* the file that the metadata is for
|
|
48
|
+
*/
|
|
49
|
+
fileRef!: File;
|
|
50
|
+
|
|
51
|
+
public async getFileType(optionsArg?: {
|
|
52
|
+
useFileExtension?: boolean;
|
|
53
|
+
useMagicBytes?: boolean;
|
|
54
|
+
}): Promise<plugins.smartmime.IFileTypeResult | undefined> {
|
|
55
|
+
if ((optionsArg && optionsArg.useFileExtension) || !optionsArg) {
|
|
56
|
+
const fileType = await plugins.smartmime.detectMimeType({
|
|
57
|
+
path: this.fileRef.name,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
return fileType;
|
|
61
|
+
}
|
|
62
|
+
if (optionsArg && optionsArg.useMagicBytes) {
|
|
63
|
+
const fileType = await plugins.smartmime.detectMimeType({
|
|
64
|
+
buffer: await this.fileRef.getMagicBytes({
|
|
65
|
+
length: 100,
|
|
66
|
+
})
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
return fileType;
|
|
70
|
+
}
|
|
71
|
+
throw new Error('optionsArg.useFileExtension and optionsArg.useMagicBytes cannot both be false');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* gets the size of the fileRef
|
|
76
|
+
*/
|
|
77
|
+
public async getSizeInBytes(): Promise<number> {
|
|
78
|
+
const stat = await this.fileRef.parentDirectoryRef.bucketRef.fastStat({
|
|
79
|
+
path: this.fileRef.getBasePath(),
|
|
80
|
+
});
|
|
81
|
+
return stat.ContentLength!;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private prefixCustomMetaData = 'custom_';
|
|
85
|
+
|
|
86
|
+
public async storeCustomMetaData<T = any>(optionsArg: { key: string; value: T }) {
|
|
87
|
+
const data = await this.metadataFile.getJsonData();
|
|
88
|
+
data[this.prefixCustomMetaData + optionsArg.key] = optionsArg.value;
|
|
89
|
+
await this.metadataFile.writeJsonData(data);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public async getCustomMetaData<T = any>(optionsArg: { key: string }): Promise<T> {
|
|
93
|
+
const data = await this.metadataFile.getJsonData();
|
|
94
|
+
return data[this.prefixCustomMetaData + optionsArg.key];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public async deleteCustomMetaData(optionsArg: { key: string }) {
|
|
98
|
+
const data = await this.metadataFile.getJsonData();
|
|
99
|
+
delete data[this.prefixCustomMetaData + optionsArg.key];
|
|
100
|
+
await this.metadataFile.writeJsonData(data);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* set a lock on the ref file
|
|
105
|
+
* @param optionsArg
|
|
106
|
+
*/
|
|
107
|
+
public async setLock(optionsArg: { lock: string; expires: number }) {
|
|
108
|
+
const data = await this.metadataFile.getJsonData();
|
|
109
|
+
data.lock = optionsArg.lock;
|
|
110
|
+
data.lockExpires = optionsArg.expires;
|
|
111
|
+
await this.metadataFile.writeJsonData(data);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* remove the lock on the ref file
|
|
116
|
+
* @param optionsArg
|
|
117
|
+
*/
|
|
118
|
+
public async removeLock(optionsArg: { force: boolean }) {
|
|
119
|
+
const data = await this.metadataFile.getJsonData();
|
|
120
|
+
delete data.lock;
|
|
121
|
+
delete data.lockExpires;
|
|
122
|
+
await this.metadataFile.writeJsonData(data);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
public async checkLocked(): Promise<boolean> {
|
|
126
|
+
const data = await this.metadataFile.getJsonData();
|
|
127
|
+
return data.lock && data.lockExpires > Date.now();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
public async getLockInfo(): Promise<{ lock: string; expires: number }> {
|
|
131
|
+
const data = await this.metadataFile.getJsonData();
|
|
132
|
+
return { lock: data.lock, expires: data.lockExpires };
|
|
133
|
+
}
|
|
134
|
+
}
|