@webda/fs 4.0.0-beta.3

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.
@@ -0,0 +1,138 @@
1
+ import * as fs from "fs";
2
+ import { join } from "path";
3
+ import { randomUUID } from "crypto";
4
+ import { Queue, QueueParameters } from "@webda/core";
5
+ import { JSONUtils } from "@webda/utils";
6
+ /** Configuration parameters for the filesystem-backed FIFO queue. */
7
+ export class FileQueueParameters extends QueueParameters {
8
+ /**
9
+ * Number of seconds before dropping message
10
+ *
11
+ * @default 30
12
+ */
13
+ expire;
14
+ /**
15
+ * Where to store the queue
16
+ */
17
+ folder;
18
+ /** Set default expiration to 30 seconds and convert to milliseconds. */
19
+ default() {
20
+ this.expire = this.expire ?? 30;
21
+ this.expire *= 1000;
22
+ }
23
+ }
24
+ /**
25
+ * FIFO Queue on filesystem
26
+ * @category CoreServices
27
+ * @WebdaModda
28
+ */
29
+ export class FileQueue extends Queue {
30
+ /**
31
+ * @override
32
+ */
33
+ loadParameters(params) {
34
+ return new FileQueueParameters().load(params);
35
+ }
36
+ /**
37
+ * Create the storage folder if does not exist
38
+ */
39
+ computeParameters() {
40
+ super.computeParameters();
41
+ this.parameters.default?.();
42
+ if (!fs.existsSync(this.parameters.folder)) {
43
+ fs.mkdirSync(this.parameters.folder);
44
+ }
45
+ }
46
+ /**
47
+ * @override
48
+ */
49
+ async size() {
50
+ return fs.readdirSync(this.parameters.folder).filter(f => f.endsWith(".json")).length;
51
+ }
52
+ /**
53
+ * Return file
54
+ *
55
+ * @param uid - the message unique identifier
56
+ * @returns the file path
57
+ */
58
+ getFile(uid) {
59
+ return join(this.parameters.folder, `${uid}.json`);
60
+ }
61
+ /**
62
+ * @override
63
+ */
64
+ async sendMessage(params) {
65
+ let uid = randomUUID();
66
+ let file = this.getFile(uid);
67
+ while (fs.existsSync(file)) {
68
+ uid = randomUUID();
69
+ file = this.getFile(uid);
70
+ }
71
+ JSONUtils.saveFile(params, file);
72
+ }
73
+ /**
74
+ * @override
75
+ */
76
+ async receiveMessage(proto) {
77
+ const files = fs
78
+ .readdirSync(this.parameters.folder)
79
+ .filter(f => f.endsWith(".json"))
80
+ .map(f => {
81
+ const lockFile = join(this.parameters.folder, f + ".lock");
82
+ const res = {
83
+ ...fs.lstatSync(join(this.parameters.folder, f)),
84
+ path: join(this.parameters.folder, f),
85
+ hasLock: fs.existsSync(lockFile),
86
+ uid: f.substring(0, f.length - 5)
87
+ };
88
+ if (res.hasLock) {
89
+ const lock = fs.lstatSync(lockFile);
90
+ if (lock.birthtimeMs < Date.now() - this.parameters.expire) {
91
+ res.hasLock = false;
92
+ fs.unlinkSync(lockFile);
93
+ }
94
+ }
95
+ return res;
96
+ })
97
+ .filter(f => !f.hasLock)
98
+ .sort((a, b) => {
99
+ if (a.birthtimeMs > b.birthtimeMs) {
100
+ return 1;
101
+ }
102
+ return -1;
103
+ });
104
+ if (files.length) {
105
+ const el = files.shift();
106
+ fs.writeFileSync(el.path + ".lock", "");
107
+ return [
108
+ {
109
+ ReceiptHandle: el.uid,
110
+ Message: this.unserialize(fs.readFileSync(el.path).toString(), proto)
111
+ }
112
+ ];
113
+ }
114
+ else {
115
+ await new Promise(resolve => setTimeout(resolve, 10000));
116
+ }
117
+ return [];
118
+ }
119
+ /**
120
+ * @override
121
+ */
122
+ async deleteMessage(receipt) {
123
+ const file = this.getFile(receipt);
124
+ if (fs.existsSync(file)) {
125
+ fs.unlinkSync(file);
126
+ if (fs.existsSync(file + ".lock")) {
127
+ fs.unlinkSync(file + ".lock");
128
+ }
129
+ }
130
+ }
131
+ /**
132
+ * @inheritdoc
133
+ */
134
+ async __clean() {
135
+ (await import("fs-extra")).emptyDirSync(this.parameters.folder);
136
+ }
137
+ }
138
+ //# sourceMappingURL=filequeue.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filequeue.service.js","sourceRoot":"","sources":["../src/filequeue.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ import { Store, StoreFindResult, StoreParameters, ModelClass, Repository } from "@webda/core";
2
+ import * as WebdaQL from "@webda/ql";
3
+ /** Configuration parameters for the JSON-file-backed store. */
4
+ export declare class FileStoreParameters extends StoreParameters {
5
+ /**
6
+ * Local path where to store all `json` files
7
+ */
8
+ folder: string;
9
+ /**
10
+ * Parameter sent to JSON.stringify when storing the json
11
+ */
12
+ beautify?: string | number;
13
+ }
14
+ /**
15
+ * Simple file storage of object
16
+ *
17
+ * Storage structure
18
+ * /folder/{uuid}
19
+ *
20
+ * Parameters:
21
+ * folder: to store to
22
+ *
23
+ * @category CoreServices
24
+ * @WebdaModda
25
+ */
26
+ export declare class FileStore<K extends FileStoreParameters = FileStoreParameters> extends Store<K> {
27
+ static EXTENSION: string;
28
+ /**
29
+ * Load the parameters for a service
30
+ *
31
+ * @param params - raw parameter values
32
+ * @returns the loaded parameters
33
+ */
34
+ loadParameters(params: any): K;
35
+ /**
36
+ * Create the storage folder if does not exist
37
+ */
38
+ computeParameters(): void;
39
+ /**
40
+ * Get the file path of an object
41
+ *
42
+ * @param uid - the object unique identifier
43
+ * @returns the file path
44
+ */
45
+ file(uid: any): string;
46
+ /**
47
+ * @override
48
+ */
49
+ _exists(uid: any): Promise<boolean>;
50
+ /**
51
+ * @override
52
+ */
53
+ find(query: WebdaQL.Query): Promise<StoreFindResult<any>>;
54
+ /**
55
+ * @override
56
+ */
57
+ _create(uuid: string, object: any): Promise<any>;
58
+ /**
59
+ * Store in file the object
60
+ *
61
+ * @param uuid - the object unique identifier
62
+ * @param object - the object to persist
63
+ * @returns the persisted object
64
+ */
65
+ protected persist(uuid: string, object: any): Promise<any>;
66
+ /**
67
+ * Verify optimistic locking update condition
68
+ *
69
+ * @param uuid - the object unique identifier
70
+ * @param stored - the currently stored object
71
+ * @param writeConditionField - field to check for condition
72
+ * @param writeCondition - expected value of the field
73
+ */
74
+ protected checkUpdateCondition(uuid: string, stored: any, writeConditionField?: string, writeCondition?: any): void;
75
+ /**
76
+ * Verify collection item update condition
77
+ *
78
+ * @param stored - the currently stored object
79
+ * @param prop - the collection property name
80
+ * @param itemWriteConditionField - field to check on the item
81
+ * @param itemWriteCondition - expected value of the field
82
+ * @param index - index of the item in the collection
83
+ */
84
+ protected checkCollectionUpdateCondition(stored: any, prop: string, itemWriteConditionField: string, itemWriteCondition: any, index: number): void;
85
+ /**
86
+ * @override
87
+ */
88
+ _upsertItemToCollection(uid: string, prop: string, item: any, index: number, itemWriteCondition: any, itemWriteConditionField: string, updateDate: Date): Promise<any>;
89
+ /**
90
+ * @override
91
+ */
92
+ _removeAttribute(uuid: string, attribute: string, writeCondition?: any, writeConditionField?: string): Promise<void>;
93
+ /**
94
+ * @override
95
+ */
96
+ _deleteItemFromCollection(uid: string, prop: string, index: number, itemWriteCondition: any, itemWriteConditionField: string, updateDate: Date): Promise<any>;
97
+ /**
98
+ * @override
99
+ */
100
+ _delete(uid: string): Promise<void>;
101
+ /**
102
+ * @override
103
+ */
104
+ _patch(object: any, uid: string, writeCondition?: any, writeConditionField?: string): Promise<any>;
105
+ /**
106
+ * @override
107
+ */
108
+ _update(object: any, uid: string, writeCondition?: any, writeConditionField?: string): Promise<any>;
109
+ /**
110
+ * @override
111
+ */
112
+ getAll(uids?: string[]): Promise<any>;
113
+ /**
114
+ * @override
115
+ */
116
+ _get(uid: string, raiseIfNotFound?: boolean): Promise<any>;
117
+ /**
118
+ * @override
119
+ */
120
+ _incrementAttributes(uid: string, params: {
121
+ property: string;
122
+ value: number;
123
+ }[], updateDate: Date): Promise<any>;
124
+ /**
125
+ * @override
126
+ */
127
+ getRepository<T extends ModelClass>(model: T): Repository<T>;
128
+ /**
129
+ * @override
130
+ */
131
+ __clean(): Promise<void>;
132
+ }
133
+ //# sourceMappingURL=filestore.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filestore.service.d.ts","sourceRoot":"","sources":["../src/filestore.service.ts"],"names":[],"mappings":"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"}