@toa.io/extensions.storages 1.0.0-alpha.13 → 1.0.0-alpha.143

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.
Files changed (90) hide show
  1. package/package.json +13 -14
  2. package/readme.md +94 -49
  3. package/schemas/annotation.cos.yaml +1 -0
  4. package/schemas/cloudinary.cos.yaml +30 -0
  5. package/schemas/fs.cos.yaml +2 -0
  6. package/schemas/s3.cos.yaml +1 -0
  7. package/schemas/tmp.cos.yaml +0 -1
  8. package/source/Entry.ts +11 -11
  9. package/source/Factory.ts +16 -9
  10. package/source/Provider.ts +19 -19
  11. package/source/Scanner.ts +57 -24
  12. package/source/Secrets.ts +6 -0
  13. package/source/Storage.test.ts +103 -279
  14. package/source/Storage.ts +55 -204
  15. package/source/deployment.ts +48 -15
  16. package/source/errors.ts +3 -0
  17. package/source/index.ts +1 -1
  18. package/source/manifest.ts +7 -6
  19. package/source/providers/Cloudinary.ts +274 -0
  20. package/source/providers/Declaration.ts +2 -1
  21. package/source/providers/FileSystem.ts +79 -25
  22. package/source/providers/S3.ts +81 -80
  23. package/source/providers/Temporary.ts +2 -3
  24. package/source/providers/Test.ts +4 -4
  25. package/source/providers/index.test.ts +102 -76
  26. package/source/providers/index.ts +9 -4
  27. package/source/schemas.ts +1 -0
  28. package/source/test/.env.example +4 -0
  29. package/source/test/arny.jpg +0 -0
  30. package/source/test/lenna.48x48.jpeg +0 -0
  31. package/source/test/sample.avi +0 -0
  32. package/source/test/sample.svg +4 -0
  33. package/source/test/sample.wav +0 -0
  34. package/source/test/util.ts +54 -12
  35. package/transpiled/Entry.d.ts +12 -10
  36. package/transpiled/Factory.js +11 -5
  37. package/transpiled/Factory.js.map +1 -1
  38. package/transpiled/Provider.d.ts +15 -15
  39. package/transpiled/Provider.js +3 -3
  40. package/transpiled/Provider.js.map +1 -1
  41. package/transpiled/Scanner.d.ts +5 -2
  42. package/transpiled/Scanner.js +49 -22
  43. package/transpiled/Scanner.js.map +1 -1
  44. package/transpiled/Secrets.d.ts +5 -0
  45. package/transpiled/Secrets.js +3 -0
  46. package/transpiled/Secrets.js.map +1 -0
  47. package/transpiled/Storage.d.ts +10 -19
  48. package/transpiled/Storage.js +47 -153
  49. package/transpiled/Storage.js.map +1 -1
  50. package/transpiled/deployment.d.ts +1 -1
  51. package/transpiled/deployment.js +40 -15
  52. package/transpiled/deployment.js.map +1 -1
  53. package/transpiled/errors.d.ts +2 -0
  54. package/transpiled/errors.js +6 -0
  55. package/transpiled/errors.js.map +1 -0
  56. package/transpiled/index.d.ts +1 -1
  57. package/transpiled/manifest.js +5 -2
  58. package/transpiled/manifest.js.map +1 -1
  59. package/transpiled/providers/Cloudinary.d.ts +42 -0
  60. package/transpiled/providers/Cloudinary.js +189 -0
  61. package/transpiled/providers/Cloudinary.js.map +1 -0
  62. package/transpiled/providers/Declaration.d.ts +3 -2
  63. package/transpiled/providers/FileSystem.d.ts +15 -7
  64. package/transpiled/providers/FileSystem.js +64 -24
  65. package/transpiled/providers/FileSystem.js.map +1 -1
  66. package/transpiled/providers/S3.d.ts +14 -14
  67. package/transpiled/providers/S3.js +62 -60
  68. package/transpiled/providers/S3.js.map +1 -1
  69. package/transpiled/providers/Temporary.d.ts +1 -2
  70. package/transpiled/providers/Temporary.js +2 -2
  71. package/transpiled/providers/Temporary.js.map +1 -1
  72. package/transpiled/providers/Test.d.ts +3 -3
  73. package/transpiled/providers/Test.js +2 -2
  74. package/transpiled/providers/Test.js.map +1 -1
  75. package/transpiled/providers/index.d.ts +6 -2
  76. package/transpiled/providers/index.js +2 -2
  77. package/transpiled/providers/index.js.map +1 -1
  78. package/transpiled/schemas.d.ts +1 -0
  79. package/transpiled/schemas.js +2 -1
  80. package/transpiled/schemas.js.map +1 -1
  81. package/transpiled/test/util.d.ts +70 -5
  82. package/transpiled/test/util.js +43 -4
  83. package/transpiled/test/util.js.map +1 -1
  84. package/transpiled/tsconfig.tsbuildinfo +1 -1
  85. package/source/providers/FileSystem.test.ts +0 -5
  86. package/source/providers/Memory.ts +0 -41
  87. package/source/providers/S3.test.ts +0 -133
  88. package/transpiled/providers/Memory.d.ts +0 -13
  89. package/transpiled/providers/Memory.js +0 -60
  90. package/transpiled/providers/Memory.js.map +0 -1
@@ -1,11 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Storage = void 0;
4
- const node_stream_1 = require("node:stream");
5
4
  const node_path_1 = require("node:path");
6
- const msgpackr_1 = require("msgpackr");
7
- const generic_1 = require("@toa.io/generic");
8
- const error_value_1 = require("error-value");
5
+ const node_crypto_1 = require("node:crypto");
9
6
  const Scanner_1 = require("./Scanner");
10
7
  class Storage {
11
8
  provider;
@@ -14,163 +11,60 @@ class Storage {
14
11
  }
15
12
  async put(path, stream, options) {
16
13
  const scanner = new Scanner_1.Scanner(options);
17
- const pipe = stream.pipe(scanner);
18
- const tempname = await this.transit(pipe);
19
- if (scanner.error !== null)
20
- return scanner.error;
21
- const id = scanner.digest();
22
- await this.persist(tempname, id);
23
- return await this.create(path, id, scanner.size, scanner.type, options?.meta);
14
+ const pipe = stream.pipe(scanner).on('error', () => undefined);
15
+ const id = options?.id ?? (0, node_crypto_1.randomUUID)().replace(/-/g, '');
16
+ const location = this.locate(path, id);
17
+ /**
18
+ * Provider can return or throw an error.
19
+ * If thrown error is TYPE_MISMATCH from the Scanner, it should be returned.
20
+ */
21
+ const error = await this.provider.put(location, pipe).catch((error) => {
22
+ if (error === scanner.error)
23
+ return error;
24
+ else
25
+ throw error;
26
+ });
27
+ if (error instanceof Error)
28
+ return error;
29
+ const metadata = {
30
+ id,
31
+ size: scanner.size,
32
+ type: scanner.type,
33
+ checksum: scanner.digest(),
34
+ created: new Date().toISOString(),
35
+ attributes: options?.attributes ?? {}
36
+ };
37
+ if (options?.origin !== undefined)
38
+ metadata.attributes.origin = options.origin;
39
+ await this.provider.commit(location, metadata);
40
+ return metadata;
24
41
  }
25
42
  async get(path) {
26
- const metapath = node_path_1.posix.join(ENTRIES, path, META);
27
- const result = await this.provider.get(metapath);
28
- if (result === null)
29
- return ERR_NOT_FOUND;
30
- else
31
- return (0, msgpackr_1.decode)(await (0, generic_1.buffer)(result));
32
- }
33
- async fetch(path) {
34
- const { rel, id, variant } = this.parse(path);
35
- if (variant === null && rel !== '') {
36
- const entry = await this.get(path);
37
- if (entry instanceof Error)
38
- return entry;
39
- }
40
- const blob = variant === null
41
- ? node_path_1.posix.join(BLOBs, id)
42
- : node_path_1.posix.join(ENTRIES, rel, id, variant);
43
- const stream = await this.provider.get(blob);
44
- if (stream === null)
45
- return ERR_NOT_FOUND;
46
- else
47
- return stream;
48
- }
49
- async delete(path) {
50
- const entry = await this.get(path);
51
- if (entry instanceof Error)
52
- return entry;
53
- await this.conceal(path);
54
- await this.provider.delete(node_path_1.posix.join(ENTRIES, path));
55
- }
56
- async list(path) {
57
- const listfile = node_path_1.posix.join(ENTRIES, path, LIST);
58
- const stream = await this.provider.get(listfile);
59
- return stream === null ? [] : (0, msgpackr_1.decode)(await (0, generic_1.buffer)(stream));
60
- }
61
- async permute(path, ids) {
62
- const unique = new Set(ids);
63
- const dir = node_path_1.posix.join(ENTRIES, path);
64
- const list = await this.list(path);
65
- if (list.length !== ids.length || unique.size !== ids.length)
66
- return ERR_PERMUTATION_MISMATCH;
67
- for (const id of ids)
68
- if (!list.includes(id))
69
- return ERR_PERMUTATION_MISMATCH;
70
- await this.provider.put(dir, LIST, node_stream_1.Readable.from((0, msgpackr_1.encode)(ids)));
71
- }
72
- async conceal(path) {
73
- const { id, rel } = this.parse(path);
74
- const dir = node_path_1.posix.join(ENTRIES, rel);
75
- const list = await this.list(rel);
76
- const index = list.indexOf(id);
77
- if (index === -1)
78
- return ERR_NOT_FOUND;
79
- list.splice(index, 1);
80
- await this.provider.put(dir, LIST, node_stream_1.Readable.from((0, msgpackr_1.encode)(list)));
81
- }
82
- async reveal(path) {
83
- const { id, rel } = this.parse(path);
84
- return await this.enroll(rel, id);
85
- }
86
- async diversify(path, name, stream) {
87
- const scanner = new Scanner_1.Scanner();
88
- const pipe = stream.pipe(scanner);
89
- await this.provider.put(node_path_1.posix.join(ENTRIES, path), name, pipe);
90
- if (scanner.error !== null)
91
- return scanner.error;
92
- const { size, type } = scanner;
93
- const entry = await this.get(path);
94
- if (entry instanceof Error)
95
- return entry;
96
- entry.variants = entry.variants.filter((variant) => variant.name !== name);
97
- entry.variants.push({ name, size, type });
98
- await this.save(path, entry);
99
- }
100
- async annotate(path, key, value) {
101
- const entry = await this.get(path);
102
- if (entry instanceof Error)
103
- return entry;
104
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
105
- if (value === undefined)
106
- delete entry.meta[key];
107
- else
108
- entry.meta[key] = value;
109
- await this.save(path, entry);
110
- }
111
- async transit(stream) {
112
- const tempname = (0, generic_1.newid)();
113
- await this.provider.put(TEMP, tempname, stream);
114
- return tempname;
115
- }
116
- async persist(tempname, id) {
117
- const temp = node_path_1.posix.join(TEMP, tempname);
118
- const blob = node_path_1.posix.join(BLOBs, id);
119
- await this.provider.move(temp, blob);
120
- }
121
- // eslint-disable-next-line max-params
122
- async create(path, id, size, type, meta = {}) {
123
- const entry = {
43
+ const location = this.locate(path);
44
+ return await this.provider.get(location);
45
+ }
46
+ async head(path) {
47
+ const id = (0, node_path_1.basename)(path);
48
+ const location = this.locate(path);
49
+ const metadata = await this.provider.head(location);
50
+ if (metadata instanceof Error)
51
+ return metadata;
52
+ return {
124
53
  id,
125
- size,
126
- type,
127
- created: Date.now(),
128
- variants: [],
129
- meta
54
+ ...metadata
130
55
  };
131
- const metafile = node_path_1.posix.join(path, entry.id);
132
- const existing = await this.get(metafile);
133
- if (existing instanceof Error)
134
- await this.save(metafile, entry);
135
- await this.enroll(path, id, true);
136
- return entry;
137
56
  }
138
- async save(rel, entry) {
139
- const buffer = (0, msgpackr_1.encode)(entry);
140
- const stream = node_stream_1.Readable.from(buffer);
141
- await this.provider.put(node_path_1.posix.join(ENTRIES, rel), META, stream);
57
+ async delete(path) {
58
+ const location = this.locate(path);
59
+ return this.provider.delete(location);
142
60
  }
143
- async enroll(path, id, addition = false) {
144
- const dir = node_path_1.posix.join(ENTRIES, path);
145
- const list = await this.list(path);
146
- const index = list.indexOf(id);
147
- if (index !== -1)
148
- if (addition)
149
- list.splice(index, 1);
150
- else
151
- return;
152
- else if (!addition) {
153
- const entry = await this.get(node_path_1.posix.join(path, id));
154
- if (entry instanceof Error)
155
- return entry;
156
- }
157
- list.push(id);
158
- await this.provider.put(dir, LIST, node_stream_1.Readable.from((0, msgpackr_1.encode)(list)));
61
+ path() {
62
+ return this.provider.root ?? null;
159
63
  }
160
- parse(path) {
161
- const [last, ...segments] = path.split('/').reverse();
162
- const [id, ...rest] = last.split('.');
163
- const variant = rest.length > 0 ? rest.join('.') : null;
164
- const rel = segments.reverse().join('/');
165
- return { rel, id, variant };
64
+ locate(...rel) {
65
+ return (0, node_path_1.join)(ENTRIES, ...rel);
166
66
  }
167
67
  }
168
68
  exports.Storage = Storage;
169
- const ERR_NOT_FOUND = (0, error_value_1.Err)('NOT_FOUND');
170
- const ERR_PERMUTATION_MISMATCH = (0, error_value_1.Err)('PERMUTATION_MISMATCH');
171
- const TEMP = '/temp';
172
- const BLOBs = '/blobs';
173
- const ENTRIES = '/entries';
174
- const LIST = '.list';
175
- const META = '.meta';
69
+ const ENTRIES = '/';
176
70
  //# sourceMappingURL=Storage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Storage.js","sourceRoot":"","sources":["../source/Storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Storage.js","sourceRoot":"","sources":["../source/Storage.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Dependency } from '@toa.io/operations';
2
2
  import type { context } from '@toa.io/norm';
3
- export declare const SERIALIZATION_PREFIX = "TOA_STORAGES";
3
+ export declare const ENV_PREFIX = "TOA_STORAGES";
4
4
  export declare function deployment(instances: Instance[], annotation: unknown): Dependency;
5
5
  export type Instance = context.Dependency<string[]>;
@@ -23,20 +23,22 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.deployment = exports.SERIALIZATION_PREFIX = void 0;
26
+ exports.deployment = exports.ENV_PREFIX = void 0;
27
27
  const assert = __importStar(require("node:assert"));
28
28
  const generic_1 = require("@toa.io/generic");
29
29
  const providers_1 = require("./providers");
30
30
  const Annotation_1 = require("./Annotation");
31
- exports.SERIALIZATION_PREFIX = 'TOA_STORAGES';
31
+ exports.ENV_PREFIX = 'TOA_STORAGES';
32
32
  function deployment(instances, annotation) {
33
33
  validate(instances, annotation);
34
34
  const value = (0, generic_1.encode)(annotation);
35
- const pointer = { name: exports.SERIALIZATION_PREFIX, value };
35
+ const pointer = { name: exports.ENV_PREFIX, value };
36
36
  const secrets = getSecrets(annotation);
37
- return {
38
- variables: { global: [pointer, ...secrets] }
39
- };
37
+ const mounts = getMounts(instances, annotation);
38
+ const dependency = { variables: { global: [pointer, ...secrets] } };
39
+ if (mounts !== null)
40
+ dependency.mounts = mounts;
41
+ return dependency;
40
42
  }
41
43
  exports.deployment = deployment;
42
44
  function validate(instances, annotation) {
@@ -53,16 +55,39 @@ function getSecrets(annotation) {
53
55
  const secrets = [];
54
56
  for (const [name, declaration] of Object.entries(annotation)) {
55
57
  const Provider = providers_1.providers[declaration.provider];
56
- for (const secret of Provider.SECRETS)
57
- secrets.push({
58
- name: `${exports.SERIALIZATION_PREFIX}_${name}_${secret.name}`.toUpperCase(),
59
- secret: {
60
- name: `toa-storages-${name}`,
61
- key: secret.name,
62
- optional: secret.optional
63
- }
64
- });
58
+ if (Provider.SECRETS !== undefined)
59
+ // eslint-disable-next-line max-depth
60
+ for (const secret of Provider.SECRETS)
61
+ secrets.push({
62
+ name: `${exports.ENV_PREFIX}_${name}_${secret.name}`.toUpperCase(),
63
+ secret: {
64
+ name: `toa-storages-${name}`,
65
+ key: secret.name,
66
+ optional: secret.optional
67
+ }
68
+ });
65
69
  }
66
70
  return secrets;
67
71
  }
72
+ function getMounts(instances, annotation) {
73
+ let mounts = null;
74
+ for (const { locator, manifest } of instances)
75
+ for (const name of manifest) {
76
+ const declaration = annotation[name];
77
+ // eslint-disable-next-line max-depth
78
+ if (declaration.provider !== 'fs')
79
+ continue;
80
+ // eslint-disable-next-line max-depth
81
+ if (declaration.claim !== undefined) {
82
+ mounts ??= {};
83
+ mounts[locator.label] ??= [];
84
+ mounts[locator.label].push({
85
+ name,
86
+ path: declaration.path,
87
+ claim: declaration.claim
88
+ });
89
+ }
90
+ }
91
+ return mounts;
92
+ }
68
93
  //# sourceMappingURL=deployment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deployment.js","sourceRoot":"","sources":["../source/deployment.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAAqC;AACrC,6CAAwC;AACxC,2CAAuC;AACvC,6CAAiD;AAKpC,QAAA,oBAAoB,GAAG,cAAc,CAAA;AAElD,SAAgB,UAAU,CAAE,SAAqB,EAAE,UAAmB;IACpE,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;IAE/B,MAAM,KAAK,GAAG,IAAA,gBAAM,EAAC,UAAU,CAAC,CAAA;IAChC,MAAM,OAAO,GAAa,EAAE,IAAI,EAAE,4BAAoB,EAAE,KAAK,EAAE,CAAA;IAC/D,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;IAEtC,OAAO;QACL,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE;KAC7C,CAAA;AACH,CAAC;AAVD,gCAUC;AAED,SAAS,QAAQ,CAAE,SAAqB,EAAE,UAAmB;IAC3D,IAAA,+BAAkB,EAAC,UAAU,CAAC,CAAA;IAE9B,KAAK,MAAM,QAAQ,IAAI,SAAS;QAC9B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,QAAQ,CAAE,QAAkB,EAAE,UAAsB;IAC3D,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ;QAClC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,UAAU,EAC1B,YAAY,IAAI,uBAAuB;YACvC,gBAAgB,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAA;AACvD,CAAC;AAED,SAAS,UAAU,CAAE,UAAsB;IACzC,MAAM,OAAO,GAAe,EAAE,CAAA;IAE9B,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,qBAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QAEhD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO;YACnC,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,GAAG,4BAAoB,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpE,MAAM,EAAE;oBACN,IAAI,EAAE,gBAAgB,IAAI,EAAE;oBAC5B,GAAG,EAAE,MAAM,CAAC,IAAI;oBAChB,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBAC1B;aACF,CAAC,CAAA;IACN,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
1
+ {"version":3,"file":"deployment.js","sourceRoot":"","sources":["../source/deployment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Err } from 'error-value';
2
+ export declare const ERR_NOT_FOUND: Err;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ERR_NOT_FOUND = void 0;
4
+ const error_value_1 = require("error-value");
5
+ exports.ERR_NOT_FOUND = new error_value_1.Err('NOT_FOUND');
6
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../source/errors.ts"],"names":[],"mappings":";;;AAAA,6CAAiC;AAEpB,QAAA,aAAa,GAAG,IAAI,iBAAG,CAAC,WAAW,CAAC,CAAA"}
@@ -1,4 +1,4 @@
1
1
  export { Factory } from './Factory';
2
2
  export { deployment } from './deployment';
3
3
  export { manifest } from './manifest';
4
- export type { Entry } from './Entry';
4
+ export type { Entry, Stream } from './Entry';
@@ -1,9 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.manifest = void 0;
4
- const matchacho_1 = require("matchacho");
5
4
  function manifest(manifest) {
6
- return (0, matchacho_1.match)(manifest, String, (name) => [name], Array, manifest, null, []);
5
+ if (manifest === null)
6
+ return [];
7
+ if (typeof manifest === 'string')
8
+ return [manifest];
9
+ return manifest;
7
10
  }
8
11
  exports.manifest = manifest;
9
12
  //# sourceMappingURL=manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../source/manifest.ts"],"names":[],"mappings":";;;AAAA,yCAAiC;AAEjC,SAAgB,QAAQ,CAAE,QAAkC;IAC1D,OAAO,IAAA,iBAAK,EAAC,QAAQ,EACnB,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAChC,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,EAAE,CAAC,CAAA;AACb,CAAC;AALD,4BAKC"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../source/manifest.ts"],"names":[],"mappings":";;;AAAA,SAAgB,QAAQ,CAAE,QAAkC;IAC1D,IAAI,QAAQ,KAAK,IAAI;QACnB,OAAO,EAAE,CAAA;IAEX,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAC9B,OAAO,CAAC,QAAQ,CAAC,CAAA;IAEnB,OAAO,QAAQ,CAAA;AACjB,CAAC;AARD,4BAQC"}
@@ -0,0 +1,42 @@
1
+ /// <reference types="node" />
2
+ import { Readable } from 'node:stream';
3
+ import { Provider } from '../Provider';
4
+ import type { Maybe } from '@toa.io/types';
5
+ import type { Metadata, Stream } from '../Entry';
6
+ import type { Secret, Secrets } from '../Secrets';
7
+ export type CloudinarySecrets = Secrets<'API_KEY' | 'API_SECRET'>;
8
+ export declare class Cloudinary extends Provider<CloudinaryOptions> {
9
+ static readonly SECRETS: readonly Secret[];
10
+ private readonly type;
11
+ private readonly transformations;
12
+ private readonly config;
13
+ private readonly prefix;
14
+ constructor(options: CloudinaryOptions, secrets?: CloudinarySecrets);
15
+ get(path: string): Promise<Maybe<Stream>>;
16
+ head(path: string): Promise<Maybe<Metadata>>;
17
+ put(path: string, stream: Readable): Promise<void>;
18
+ commit(): Promise<void>;
19
+ delete(path: string): Promise<void>;
20
+ move(from: string, to: string): Promise<void | Error>;
21
+ private fetch;
22
+ private url;
23
+ private toTransformation;
24
+ private metadata;
25
+ private cloudinary;
26
+ }
27
+ export interface CloudinaryOptions {
28
+ environment: string;
29
+ type: StorageType;
30
+ prefix?: string;
31
+ transformations?: TransformationDeclaration[];
32
+ }
33
+ type TransformationDeclaration = Omit<Transformation, 'extension'> & {
34
+ extension: string;
35
+ };
36
+ interface Transformation {
37
+ extension: RegExp;
38
+ transformation: object;
39
+ optional?: boolean;
40
+ }
41
+ type StorageType = 'image' | 'video';
42
+ export {};
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Cloudinary = void 0;
4
+ const node_path_1 = require("node:path");
5
+ const node_stream_1 = require("node:stream");
6
+ const cloudinary_1 = require("cloudinary");
7
+ const openspan_1 = require("openspan");
8
+ const Provider_1 = require("../Provider");
9
+ const errors_1 = require("../errors");
10
+ class Cloudinary extends Provider_1.Provider {
11
+ static SECRETS = [
12
+ { name: 'API_KEY' },
13
+ { name: 'API_SECRET' }
14
+ ];
15
+ type;
16
+ transformations = [];
17
+ config;
18
+ prefix;
19
+ constructor(options, secrets) {
20
+ super(options, secrets);
21
+ this.type = options.type;
22
+ if (options.transformations !== undefined)
23
+ this.transformations = options.transformations.map((transformation) => {
24
+ const { extension, ...rest } = transformation;
25
+ let expression = extension;
26
+ if (!extension.startsWith('^'))
27
+ expression = '^' + extension;
28
+ if (!extension.endsWith('$'))
29
+ expression = extension + '$';
30
+ return {
31
+ extension: new RegExp(expression),
32
+ ...rest
33
+ };
34
+ });
35
+ this.config = {
36
+ cloud_name: options.environment,
37
+ api_key: secrets.API_KEY,
38
+ api_secret: secrets.API_SECRET
39
+ };
40
+ this.prefix = options.prefix ?? '/';
41
+ }
42
+ async get(path) {
43
+ const response = await this.fetch(path);
44
+ if (response instanceof Error)
45
+ return errors_1.ERR_NOT_FOUND;
46
+ const metadata = this.metadata(response);
47
+ return {
48
+ stream: node_stream_1.Readable.fromWeb(response.body),
49
+ ...metadata
50
+ };
51
+ }
52
+ async head(path) {
53
+ const response = await this.fetch(path, 'HEAD');
54
+ if (response instanceof Error)
55
+ return errors_1.ERR_NOT_FOUND;
56
+ return this.metadata(response);
57
+ }
58
+ async put(path, stream) {
59
+ const id = (0, node_path_1.basename)(path);
60
+ const folder = (0, node_path_1.join)(this.prefix, (0, node_path_1.dirname)(path));
61
+ openspan_1.console.debug('Uploading to Cloudinary', { path });
62
+ await new Promise((resolve, reject) => {
63
+ stream.pipe(this.cloudinary().uploader.upload_stream({
64
+ public_id: id,
65
+ folder,
66
+ resource_type: 'auto',
67
+ overwrite: true,
68
+ invalidate: true
69
+ }, (error, result) => {
70
+ if (error !== undefined)
71
+ reject(error);
72
+ else
73
+ resolve(result);
74
+ }));
75
+ stream.on('error', reject);
76
+ });
77
+ }
78
+ async commit() {
79
+ // metadata is read-only
80
+ }
81
+ async delete(path) {
82
+ const id = (0, node_path_1.join)(this.prefix, path);
83
+ openspan_1.console.debug('Deleting from Cloudinary', { path: id });
84
+ await this.cloudinary().uploader.destroy(id, { resource_type: this.type, invalidate: true });
85
+ }
86
+ async move(from, to) {
87
+ const source = (0, node_path_1.join)(this.prefix, from);
88
+ const target = (0, node_path_1.join)(this.prefix, to);
89
+ try {
90
+ await this.cloudinary().uploader.rename(source, target, { resource_type: this.type, overwrite: true });
91
+ }
92
+ catch (error) {
93
+ if (error.http_code === 404)
94
+ return errors_1.ERR_NOT_FOUND;
95
+ else
96
+ throw error;
97
+ }
98
+ }
99
+ async fetch(path, method = 'GET') {
100
+ const url = this.url(path);
101
+ if (url === null)
102
+ return errors_1.ERR_NOT_FOUND;
103
+ openspan_1.console.debug('Fetching from Cloudinary', {
104
+ method,
105
+ path,
106
+ url
107
+ });
108
+ const response = await fetch(url, { method }).catch((e) => e);
109
+ if (response instanceof Error || response.ok === false) {
110
+ openspan_1.console.debug('Failed to fetch from Cloudinary', {
111
+ url,
112
+ message: response.message
113
+ });
114
+ return errors_1.ERR_NOT_FOUND;
115
+ }
116
+ return response;
117
+ }
118
+ url(path) {
119
+ const [base, transformation] = this.toTransformation(path);
120
+ if (base === null)
121
+ return null;
122
+ const id = (0, node_path_1.join)(this.prefix, base);
123
+ return this.cloudinary().url(id, {
124
+ resource_type: this.type,
125
+ transformation,
126
+ version: 2
127
+ });
128
+ }
129
+ toTransformation(path) {
130
+ if (this.transformations.length === 0)
131
+ return [path, undefined];
132
+ const [base, ...extensions] = path.split('.');
133
+ const transformations = [];
134
+ let t = 0;
135
+ for (const extension of extensions) {
136
+ let found = false;
137
+ for (t; t < this.transformations.length && !found; t++) {
138
+ const { extension: regex, transformation: options, optional } = this.transformations[t];
139
+ const match = regex.exec(extension);
140
+ // eslint-disable-next-line max-depth
141
+ if (match === null)
142
+ if (optional === true)
143
+ continue;
144
+ else
145
+ return [null, undefined];
146
+ const transformation = Object.fromEntries(Object.entries(options).map(([key, value]) => {
147
+ if (typeof value !== 'string')
148
+ return [key, value];
149
+ if (value.startsWith('<') && value.endsWith('>'))
150
+ value = match.groups[value.slice(1, -1)];
151
+ if (key === 'zoom' && value !== undefined)
152
+ value = Number.parseInt(value) / 100;
153
+ if (key === 'fetch_format' && value === 'jpeg')
154
+ value = 'jpg';
155
+ return [key, value];
156
+ }));
157
+ transformations.push(transformation);
158
+ found = true;
159
+ }
160
+ if (!found)
161
+ return [null, undefined];
162
+ }
163
+ for (t; t < this.transformations.length; t++)
164
+ if (this.transformations[t].optional !== true)
165
+ return [null, undefined];
166
+ return [base, transformations];
167
+ }
168
+ metadata(response) {
169
+ const size = response.headers.get('content-length') === null
170
+ ? 0
171
+ : Number.parseInt(response.headers.get('content-length'));
172
+ const created = response.headers.get('date') ?? new Date().toISOString();
173
+ const etag = response.headers.get('etag');
174
+ const checksum = etag === null ? (0, node_path_1.basename)(response.url) : etag.slice(1, -1);
175
+ return {
176
+ type: response.headers.get('content-type'),
177
+ size,
178
+ checksum,
179
+ created,
180
+ attributes: {}
181
+ };
182
+ }
183
+ cloudinary() {
184
+ cloudinary_1.v2.config(this.config);
185
+ return cloudinary_1.v2;
186
+ }
187
+ }
188
+ exports.Cloudinary = Cloudinary;
189
+ //# sourceMappingURL=Cloudinary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cloudinary.js","sourceRoot":"","sources":["../../source/providers/Cloudinary.ts"],"names":[],"mappings":"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"}