@rsdk/nats.object-storage 5.4.0-next.10

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 (50) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/constants.d.ts +1 -0
  3. package/dist/constants.js +5 -0
  4. package/dist/constants.js.map +1 -0
  5. package/dist/index.d.ts +8 -0
  6. package/dist/index.js +31 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/inject-object-storage-service.decorator.d.ts +2 -0
  9. package/dist/inject-object-storage-service.decorator.js +19 -0
  10. package/dist/inject-object-storage-service.decorator.js.map +1 -0
  11. package/dist/nats-object-storage-module.generator.d.ts +5 -0
  12. package/dist/nats-object-storage-module.generator.js +30 -0
  13. package/dist/nats-object-storage-module.generator.js.map +1 -0
  14. package/dist/nats-object-storage.module.d.ts +9 -0
  15. package/dist/nats-object-storage.module.js +63 -0
  16. package/dist/nats-object-storage.module.js.map +1 -0
  17. package/dist/nats-object-storage.service.d.ts +40 -0
  18. package/dist/nats-object-storage.service.js +121 -0
  19. package/dist/nats-object-storage.service.js.map +1 -0
  20. package/dist/object-storage.d.ts +27 -0
  21. package/dist/object-storage.js +43 -0
  22. package/dist/object-storage.js.map +1 -0
  23. package/dist/patch.d.ts +1 -0
  24. package/dist/patch.js +239 -0
  25. package/dist/patch.js.map +1 -0
  26. package/dist/tokens.fn.d.ts +2 -0
  27. package/dist/tokens.fn.js +8 -0
  28. package/dist/tokens.fn.js.map +1 -0
  29. package/dist/watch-object-storage.decorator.d.ts +23 -0
  30. package/dist/watch-object-storage.decorator.js +19 -0
  31. package/dist/watch-object-storage.decorator.js.map +1 -0
  32. package/dist/watch-object-storage.service.d.ts +45 -0
  33. package/dist/watch-object-storage.service.js +112 -0
  34. package/dist/watch-object-storage.service.js.map +1 -0
  35. package/jest.config.js +1 -0
  36. package/jest.config.unit.js +1 -0
  37. package/package.json +42 -0
  38. package/src/constants.ts +1 -0
  39. package/src/index.ts +12 -0
  40. package/src/inject-object-storage-service.decorator.ts +45 -0
  41. package/src/nats-object-storage-module.generator.ts +52 -0
  42. package/src/nats-object-storage.module.ts +58 -0
  43. package/src/nats-object-storage.service.ts +141 -0
  44. package/src/object-storage.ts +53 -0
  45. package/src/patch.ts +292 -0
  46. package/src/tokens.fn.ts +10 -0
  47. package/src/watch-object-storage.decorator.ts +30 -0
  48. package/src/watch-object-storage.service.ts +129 -0
  49. package/tsconfig.build.json +12 -0
  50. package/tsconfig.json +7 -0
package/dist/patch.js ADDED
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const nats_1 = require("nats");
4
+ const objectstore_1 = require("nats/lib/jetstream/objectstore");
5
+ const codec_1 = require("nats/lib/nats-base-client/codec");
6
+ const queued_iterator_1 = require("nats/lib/nats-base-client/queued_iterator");
7
+ const sha256_1 = require("nats/lib/nats-base-client/sha256");
8
+ function emptyReadableStream() {
9
+ return new ReadableStream({
10
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
11
+ pull(c) {
12
+ c.enqueue(new Uint8Array(0));
13
+ c.close();
14
+ },
15
+ });
16
+ }
17
+ class ObjectInfoImpl {
18
+ info;
19
+ hdrs;
20
+ constructor(oi) {
21
+ this.info = oi;
22
+ }
23
+ get name() {
24
+ return this.info.name;
25
+ }
26
+ get description() {
27
+ return this.info.description ?? '';
28
+ }
29
+ get headers() {
30
+ if (!this.hdrs) {
31
+ this.hdrs = nats_1.MsgHdrsImpl.fromRecord(this.info.headers || {});
32
+ }
33
+ return this.hdrs;
34
+ }
35
+ get options() {
36
+ return this.info.options;
37
+ }
38
+ get bucket() {
39
+ return this.info.bucket;
40
+ }
41
+ get chunks() {
42
+ return this.info.chunks;
43
+ }
44
+ get deleted() {
45
+ return this.info.deleted ?? false;
46
+ }
47
+ get digest() {
48
+ return this.info.digest;
49
+ }
50
+ get mtime() {
51
+ return this.info.mtime;
52
+ }
53
+ get nuid() {
54
+ return this.info.nuid;
55
+ }
56
+ get size() {
57
+ return this.info.size;
58
+ }
59
+ get revision() {
60
+ return this.info.revision;
61
+ }
62
+ get metadata() {
63
+ return this.info.metadata || {};
64
+ }
65
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
66
+ isLink() {
67
+ return (this.info.options?.link !== undefined && this.info.options?.link !== null);
68
+ }
69
+ }
70
+ objectstore_1.ObjectStoreImpl.prototype.get = async function get(name) {
71
+ const info = await this.rawInfo(name);
72
+ if (info === null) {
73
+ return null;
74
+ }
75
+ if (info.deleted) {
76
+ return null;
77
+ }
78
+ if (info.options && info.options.link) {
79
+ const ln = info.options.link.name || ' ';
80
+ if (ln === '') {
81
+ throw new Error('link is a bucket');
82
+ }
83
+ const os = info.options.link.bucket === this.name
84
+ ? this
85
+ : await objectstore_1.ObjectStoreImpl.create(this.js, info.options.link.bucket);
86
+ return os.get(ln);
87
+ }
88
+ const d = (0, nats_1.deferred)();
89
+ const r = {
90
+ info: new ObjectInfoImpl(info),
91
+ error: d,
92
+ };
93
+ if (info.size === 0) {
94
+ r.data = emptyReadableStream();
95
+ d.resolve(null);
96
+ return r;
97
+ }
98
+ let controller;
99
+ const oc = (0, nats_1.consumerOpts)();
100
+ oc.orderedConsumer();
101
+ const sha = new sha256_1.SHA256();
102
+ const subj = `$O.${this.name}.C.${info.nuid}`;
103
+ let sub;
104
+ try {
105
+ // eslint-disable-next-line deprecation/deprecation
106
+ sub = await this.js.subscribe(subj, oc);
107
+ }
108
+ catch (error) {
109
+ if (error.message !== 'no stream matches subject') {
110
+ throw error;
111
+ }
112
+ const oc = (0, nats_1.consumerOpts)({
113
+ ack_policy: nats_1.AckPolicy.None,
114
+ });
115
+ oc.orderedConsumer();
116
+ oc.bindStream('OBJ_' + this.name);
117
+ // HACK: for mirrored ObjectStore
118
+ // eslint-disable-next-line deprecation/deprecation
119
+ sub = await this.js.subscribe(subj, oc);
120
+ }
121
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
122
+ (async () => {
123
+ for await (const jm of sub) {
124
+ if (jm.data.length > 0) {
125
+ sha.update(jm.data);
126
+ controller.enqueue(jm.data);
127
+ }
128
+ if (jm.info.pending === 0) {
129
+ const hash = sha.digest('base64');
130
+ // go pads the hash - which should be multiple of 3 - otherwise pads with '='
131
+ const pad = hash.length % 3;
132
+ const padding = pad > 0 ? '='.repeat(pad) : '';
133
+ const digest = `${objectstore_1.digestType}${hash}${padding}`;
134
+ if (digest === info.digest) {
135
+ controller.close();
136
+ }
137
+ else {
138
+ controller.error(new Error(`received a corrupt object, digests do not match received: ${info.digest} calculated ${digest}`));
139
+ }
140
+ sub.unsubscribe();
141
+ }
142
+ }
143
+ })()
144
+ .then(() => {
145
+ d.resolve();
146
+ })
147
+ .catch((error) => {
148
+ controller.error(error);
149
+ d.reject(error);
150
+ });
151
+ r.data = new ReadableStream({
152
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
153
+ start(c) {
154
+ controller = c;
155
+ },
156
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
157
+ cancel() {
158
+ sub.unsubscribe();
159
+ },
160
+ });
161
+ return r;
162
+ };
163
+ objectstore_1.ObjectStoreImpl.prototype.watch = async function watch(opts = {}) {
164
+ opts.includeHistory = opts.includeHistory ?? false;
165
+ opts.ignoreDeletes = opts.ignoreDeletes ?? false;
166
+ let initialized = false;
167
+ const qi = new queued_iterator_1.QueuedIteratorImpl();
168
+ const subj = this._metaSubjectAll();
169
+ try {
170
+ await this.jsm.streams.getMessage(this.stream, { last_by_subj: subj });
171
+ }
172
+ catch (error) {
173
+ if (error.code === '404') {
174
+ qi.push(null);
175
+ initialized = true;
176
+ }
177
+ else {
178
+ qi.stop(error);
179
+ }
180
+ }
181
+ const jc = (0, codec_1.JSONCodec)();
182
+ const copts = (0, nats_1.consumerOpts)();
183
+ copts.orderedConsumer();
184
+ if (opts.includeHistory) {
185
+ copts.deliverLastPerSubject();
186
+ }
187
+ else {
188
+ // FIXME: Go's implementation doesn't seem correct - if history is not desired
189
+ // the watch should only be giving notifications on new entries
190
+ initialized = true;
191
+ copts.deliverNew();
192
+ }
193
+ copts.callback((err, jm) => {
194
+ if (err) {
195
+ qi.stop(err);
196
+ return;
197
+ }
198
+ if (jm !== null) {
199
+ const oi = jc.decode(jm.data);
200
+ if (oi.deleted && opts.ignoreDeletes === true) {
201
+ // do nothing
202
+ }
203
+ else {
204
+ qi.push(oi);
205
+ }
206
+ if (jm.info?.pending === 0 && !initialized) {
207
+ initialized = true;
208
+ qi.push(null);
209
+ }
210
+ }
211
+ });
212
+ let sub;
213
+ try {
214
+ // eslint-disable-next-line deprecation/deprecation
215
+ sub = await this.js.subscribe(subj, copts);
216
+ }
217
+ catch (error) {
218
+ if (error.message !== 'no stream matches subject') {
219
+ throw error;
220
+ }
221
+ copts.bindStream('OBJ_' + this.name);
222
+ // HACK: for mirrored ObjectStore
223
+ // eslint-disable-next-line deprecation/deprecation
224
+ sub = await this.js.subscribe(subj, copts);
225
+ }
226
+ qi._data = sub;
227
+ qi.iterClosed.then(() => {
228
+ sub.unsubscribe();
229
+ });
230
+ sub.closed
231
+ .then(() => {
232
+ qi.stop();
233
+ })
234
+ .catch((error) => {
235
+ qi.stop(error);
236
+ });
237
+ return qi;
238
+ };
239
+ //# sourceMappingURL=patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../src/patch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const createObjectStorageServiceToken: (connectionName?: string) => string;
2
+ export declare const createObjectStorageToken: (bucketName: string, connectionName?: string) => string;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createObjectStorageToken = exports.createObjectStorageServiceToken = void 0;
4
+ const createObjectStorageServiceToken = (connectionName) => `NATS_OBJECT_STORAGE_SERVICE${connectionName ? `_${connectionName}` : ''}`;
5
+ exports.createObjectStorageServiceToken = createObjectStorageServiceToken;
6
+ const createObjectStorageToken = (bucketName, connectionName) => `NATS_OBJECT_STORAGE_${bucketName}${connectionName ? `_${connectionName}` : ''}`;
7
+ exports.createObjectStorageToken = createObjectStorageToken;
8
+ //# sourceMappingURL=tokens.fn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.fn.js","sourceRoot":"","sources":["../src/tokens.fn.ts"],"names":[],"mappings":";;;AAAO,MAAM,+BAA+B,GAAG,CAC7C,cAAuB,EACf,EAAE,CACV,8BAA8B,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAHhE,QAAA,+BAA+B,mCAGiC;AAEtE,MAAM,wBAAwB,GAAG,CACtC,UAAkB,EAClB,cAAuB,EACf,EAAE,CACV,uBAAuB,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAJtE,QAAA,wBAAwB,4BAI8C"}
@@ -0,0 +1,23 @@
1
+ import type { ObjectInfo } from 'nats';
2
+ export type WatchConfig = {
3
+ bucket: string;
4
+ ignoreDeletes?: boolean;
5
+ includeHistory?: boolean;
6
+ connectionName?: string;
7
+ };
8
+ export interface ObjectStorageWatcher {
9
+ onDelete(entry: ObjectInfo | null): Promise<void>;
10
+ onPut(entry: ObjectInfo | null): Promise<void>;
11
+ }
12
+ /**
13
+ * Key used to mark class as a watcher for object storage.
14
+ */
15
+ export declare const WATCH_NATS_OBJECT_STORAGE_KEY = "WATCH_NATS_OBJECT_STORAGE";
16
+ /**
17
+ * Decorator used to mark class as a watcher for object storage.
18
+ * Needs to be used in conjunction with the `ObjectStorageWatcher` interface.
19
+ *
20
+ * @param {WatchConfig} config - The configuration for watching object storage.
21
+ * @returns {void}
22
+ */
23
+ export declare const WatchObjectStorage: import("@nestjs/core").ReflectableDecorator<WatchConfig, WatchConfig>;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WatchObjectStorage = exports.WATCH_NATS_OBJECT_STORAGE_KEY = void 0;
4
+ const core_1 = require("@nestjs/core");
5
+ /**
6
+ * Key used to mark class as a watcher for object storage.
7
+ */
8
+ exports.WATCH_NATS_OBJECT_STORAGE_KEY = 'WATCH_NATS_OBJECT_STORAGE';
9
+ /**
10
+ * Decorator used to mark class as a watcher for object storage.
11
+ * Needs to be used in conjunction with the `ObjectStorageWatcher` interface.
12
+ *
13
+ * @param {WatchConfig} config - The configuration for watching object storage.
14
+ * @returns {void}
15
+ */
16
+ exports.WatchObjectStorage = core_1.Reflector.createDecorator({
17
+ key: exports.WATCH_NATS_OBJECT_STORAGE_KEY,
18
+ });
19
+ //# sourceMappingURL=watch-object-storage.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-object-storage.decorator.js","sourceRoot":"","sources":["../src/watch-object-storage.decorator.ts"],"names":[],"mappings":";;;AAAA,uCAAyC;AAezC;;GAEG;AACU,QAAA,6BAA6B,GAAG,2BAA2B,CAAC;AAEzE;;;;;;GAMG;AACU,QAAA,kBAAkB,GAAG,gBAAS,CAAC,eAAe,CAAc;IACvE,GAAG,EAAE,qCAA6B;CACnC,CAAC,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { DiscoveryService } from '@nestjs/core';
2
+ import { ILogger } from '@rsdk/logging';
3
+ import type { ObjectInfo, ObjectStore } from 'nats';
4
+ import { NatsObjectStorageService } from './nats-object-storage.service';
5
+ export declare class WatchObjectStorageService {
6
+ private readonly logger;
7
+ private readonly discovery;
8
+ private readonly client;
9
+ private readonly connectionName?;
10
+ constructor(logger: ILogger, discovery: DiscoveryService, client: NatsObjectStorageService, connectionName?: string | undefined);
11
+ /**
12
+ * Runs the watches for the object storage service.
13
+ * Waits for buckets to exist and starts the watch operation for each bucket.
14
+ */
15
+ runWatches(): Promise<void>;
16
+ /**
17
+ * Stops all watches.
18
+ *
19
+ * @note This method is not implemented yet.
20
+ */
21
+ stopWatches(): Promise<void>;
22
+ /**
23
+ * Register watcher callback for object storage
24
+ */
25
+ watch(storage: ObjectStore, callback: (entry: ObjectInfo | null) => Promise<void>, opts?: {
26
+ ignoreDeletes?: boolean;
27
+ includeHistory?: boolean;
28
+ }): Promise<void>;
29
+ /**
30
+ * Runs the watch operation for the given metadata and watcher.
31
+ *
32
+ * @param config - The watch configuration.
33
+ * @param watcher - The ObjectStorageWatcher instance.
34
+ * @returns A Promise that resolves when the watch operation is complete.
35
+ */
36
+ private runWatch;
37
+ /**
38
+ * Discovers and returns an array of ObjectStorageWatcher instances
39
+ * along with their corresponding metadata.
40
+ *
41
+ * @returns An array of objects containing the ObjectStorageWatcher
42
+ * instance and its metadata.
43
+ */
44
+ private discoverWatchers;
45
+ }
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.WatchObjectStorageService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const core_1 = require("@nestjs/core");
18
+ const core_2 = require("@rsdk/core");
19
+ const nats_object_storage_service_1 = require("./nats-object-storage.service");
20
+ const watch_object_storage_decorator_1 = require("./watch-object-storage.decorator");
21
+ let WatchObjectStorageService = class WatchObjectStorageService {
22
+ logger;
23
+ discovery;
24
+ client;
25
+ connectionName;
26
+ constructor(logger, discovery, client, connectionName) {
27
+ this.logger = logger;
28
+ this.discovery = discovery;
29
+ this.client = client;
30
+ this.connectionName = connectionName;
31
+ }
32
+ /**
33
+ * Runs the watches for the object storage service.
34
+ * Waits for buckets to exist and starts the watch operation for each bucket.
35
+ */
36
+ async runWatches() {
37
+ const watchers = await this.discoverWatchers();
38
+ await Promise.all(watchers.map(async ({ instance, metadata }) => {
39
+ await this.client.waitForBucketExists(metadata.bucket, 5000);
40
+ await this.runWatch(metadata, instance);
41
+ this.logger.info('Nats object storage watcher started', { metadata });
42
+ }));
43
+ }
44
+ /**
45
+ * Stops all watches.
46
+ *
47
+ * @note This method is not implemented yet.
48
+ */
49
+ async stopWatches() {
50
+ // TODO: Implement
51
+ }
52
+ /**
53
+ * Register watcher callback for object storage
54
+ */
55
+ async watch(storage, callback, opts) {
56
+ for await (const entry of await storage.watch(opts)) {
57
+ callback(entry).catch((error) => {
58
+ this.logger.error('Error processing object storage entry', {
59
+ entry: entry,
60
+ err: error,
61
+ });
62
+ });
63
+ }
64
+ }
65
+ /**
66
+ * Runs the watch operation for the given metadata and watcher.
67
+ *
68
+ * @param config - The watch configuration.
69
+ * @param watcher - The ObjectStorageWatcher instance.
70
+ * @returns A Promise that resolves when the watch operation is complete.
71
+ */
72
+ async runWatch({ bucket, ...options }, watcher) {
73
+ const storage = await this.client.bind({ bucketName: bucket });
74
+ this.watch(storage.getRawStorage(), async (event) => {
75
+ if (!event)
76
+ return;
77
+ await (event.deleted ? watcher.onDelete(event) : watcher.onPut(event));
78
+ }, options);
79
+ }
80
+ /**
81
+ * Discovers and returns an array of ObjectStorageWatcher instances
82
+ * along with their corresponding metadata.
83
+ *
84
+ * @returns An array of objects containing the ObjectStorageWatcher
85
+ * instance and its metadata.
86
+ */
87
+ discoverWatchers() {
88
+ return this.discovery.getProviders().reduce((acc, watcher) => {
89
+ /**
90
+ * NOTE: This is a fix for TypeError in call .getMetadataByDecorator() above
91
+ * because some tokens are not instances of classes and have no constructor.
92
+ * */
93
+ const clsRef = watcher.instance?.constructor ?? watcher.metatype;
94
+ if (!clsRef) {
95
+ return acc;
96
+ }
97
+ const metadata = this.discovery.getMetadataByDecorator(watch_object_storage_decorator_1.WatchObjectStorage, watcher);
98
+ if (metadata && metadata.connectionName === this.connectionName) {
99
+ acc.push({ instance: watcher.instance, metadata });
100
+ }
101
+ return acc;
102
+ }, []);
103
+ }
104
+ };
105
+ exports.WatchObjectStorageService = WatchObjectStorageService;
106
+ exports.WatchObjectStorageService = WatchObjectStorageService = __decorate([
107
+ __param(0, (0, core_2.InjectLogger)(WatchObjectStorageService)),
108
+ __param(3, (0, common_1.Inject)('CONNECTION_NAME')),
109
+ __metadata("design:paramtypes", [Object, core_1.DiscoveryService,
110
+ nats_object_storage_service_1.NatsObjectStorageService, String])
111
+ ], WatchObjectStorageService);
112
+ //# sourceMappingURL=watch-object-storage.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-object-storage.service.js","sourceRoot":"","sources":["../src/watch-object-storage.service.ts"],"names":[],"mappings":"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"}
package/jest.config.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('@rsdk/jest/jest.config');
@@ -0,0 +1 @@
1
+ module.exports = require('@rsdk/jest/jest.config.unit');
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@rsdk/nats.object-storage",
3
+ "version": "5.4.0-next.10",
4
+ "description": "Nats NestJS object storage",
5
+ "main": "dist/index.js",
6
+ "license": "Apache License 2.0",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "repository": {
11
+ "url": "https://github.com/R-Vision/rsdk"
12
+ },
13
+ "dependencies": {
14
+ "@nestjs-plugins/nestjs-nats-jetstream-transport": "^2.2.6",
15
+ "lodash": "^4.17.21",
16
+ "nats": "^2.28.0",
17
+ "typescript": "5.5.4"
18
+ },
19
+ "peerDependencies": {
20
+ "@grpc/grpc-js": "^1.10.11",
21
+ "@nestjs/common": "^10.0.0",
22
+ "@nestjs/config": "^3.2.3",
23
+ "@nestjs/core": "^10.0.0",
24
+ "@nestjs/microservices": "^10.0.0",
25
+ "@opentelemetry/api": "1.9.0",
26
+ "@rsdk/actx": "*",
27
+ "@rsdk/autodoc.protocol": "*",
28
+ "@rsdk/common": "*",
29
+ "@rsdk/common.nestjs": "*",
30
+ "@rsdk/common.node": "*",
31
+ "@rsdk/core": "*",
32
+ "@rsdk/decorators": "*",
33
+ "@rsdk/logging": "*",
34
+ "@rsdk/metadata": "*",
35
+ "@rsdk/nats.common": "*",
36
+ "@rsdk/nest-tools": "*",
37
+ "reflect-metadata": "^0.1.12 || ^0.2.0",
38
+ "rxjs": "^7.8.1"
39
+ },
40
+ "nx": {},
41
+ "gitHead": "e069174778f5d22396099fddfe3b10c4f30b467d"
42
+ }
@@ -0,0 +1 @@
1
+ export const NATS_OBJECT_STORAGES_RSDK_METADATA_SCOPE = 'nats-object-storages';
package/src/index.ts ADDED
@@ -0,0 +1,12 @@
1
+ import './patch';
2
+
3
+ export { NatsObjectStorageService } from './nats-object-storage.service';
4
+ export {
5
+ WatchObjectStorage,
6
+ type ObjectStorageWatcher,
7
+ } from './watch-object-storage.decorator';
8
+ export { NatsObjectStorageModule } from './nats-object-storage.module';
9
+ export { ObjectStorage } from './object-storage';
10
+ export * from './inject-object-storage-service.decorator';
11
+ export * from './tokens.fn';
12
+ export { NatsObjectStorageModuleGenerator } from './nats-object-storage-module.generator';
@@ -0,0 +1,45 @@
1
+ import { Inject } from '@nestjs/common';
2
+ import {
3
+ PLATFORM_RAW_GLOBAL_METADATA_SCOPE,
4
+ RsdkMetadata,
5
+ } from '@rsdk/metadata';
6
+
7
+ import { NatsObjectStorageModuleGenerator } from './nats-object-storage-module.generator';
8
+ import {
9
+ createObjectStorageServiceToken,
10
+ createObjectStorageToken,
11
+ } from './tokens.fn';
12
+
13
+ export const InjectObjectStorageService = (
14
+ connectionName?: string,
15
+ ): ParameterDecorator =>
16
+ Inject(createObjectStorageServiceToken(connectionName));
17
+
18
+ export const InjectNatsObjectStorage = (
19
+ bucketName: string,
20
+ connectionName?: string,
21
+ ): ParameterDecorator => {
22
+ return (target, propertyKey, parameterIndex) => {
23
+ Inject(createObjectStorageToken(bucketName, connectionName))(
24
+ target,
25
+ propertyKey,
26
+ parameterIndex,
27
+ );
28
+
29
+ const key = `nats-kv:${bucketName}${connectionName ? `:${connectionName}` : ''}`;
30
+ const moduleDefinition =
31
+ NatsObjectStorageModuleGenerator.createClientModuleDefinition(
32
+ target,
33
+ bucketName,
34
+ connectionName,
35
+ );
36
+
37
+ RsdkMetadata.setWithScope(
38
+ target,
39
+ PLATFORM_RAW_GLOBAL_METADATA_SCOPE,
40
+ key,
41
+ moduleDefinition,
42
+ true,
43
+ );
44
+ };
45
+ };
@@ -0,0 +1,52 @@
1
+ import type { DynamicModule, FactoryProvider } from '@nestjs/common';
2
+ import { RsdkMetadata } from '@rsdk/metadata';
3
+
4
+ import { NATS_OBJECT_STORAGES_RSDK_METADATA_SCOPE } from './constants';
5
+ import { NatsObjectStorageModule } from './nats-object-storage.module';
6
+ import type { NatsObjectStorageService } from './nats-object-storage.service';
7
+ import type { ObjectStorage } from './object-storage';
8
+ import {
9
+ createObjectStorageServiceToken,
10
+ createObjectStorageToken,
11
+ } from './tokens.fn';
12
+
13
+ export class NatsObjectStorageModuleGenerator {
14
+ static createClientModuleDefinition(
15
+ target: object,
16
+ bucketName: string,
17
+ connectionName?: string,
18
+ ): DynamicModule {
19
+ const provider = NatsObjectStorageModuleGenerator.createClientProvider(
20
+ bucketName,
21
+ connectionName,
22
+ );
23
+
24
+ const moduleDefinition: DynamicModule = {
25
+ global: true,
26
+ imports: [NatsObjectStorageModule.forFeature(connectionName)],
27
+ module: NatsObjectStorageModuleGenerator,
28
+ providers: [provider],
29
+ exports: [provider],
30
+ };
31
+
32
+ RsdkMetadata.add(
33
+ target,
34
+ { bucketName, connectionName },
35
+ NATS_OBJECT_STORAGES_RSDK_METADATA_SCOPE,
36
+ );
37
+
38
+ return moduleDefinition;
39
+ }
40
+
41
+ static createClientProvider(
42
+ bucketName: string,
43
+ connectionName?: string,
44
+ ): FactoryProvider {
45
+ return {
46
+ provide: createObjectStorageToken(bucketName, connectionName),
47
+ inject: [createObjectStorageServiceToken(connectionName)],
48
+ useFactory: (service: NatsObjectStorageService): Promise<ObjectStorage> =>
49
+ service.bind({ bucketName }),
50
+ };
51
+ }
52
+ }