@bitblit/ratchet-aws 6.0.146-alpha → 6.0.148-alpha

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 (103) hide show
  1. package/package.json +5 -4
  2. package/src/batch/aws-batch-background-processor.spec.ts +22 -0
  3. package/src/batch/aws-batch-background-processor.ts +71 -0
  4. package/src/batch/aws-batch-ratchet.spec.ts +42 -0
  5. package/src/batch/aws-batch-ratchet.ts +70 -0
  6. package/src/build/ratchet-aws-info.ts +19 -0
  7. package/src/cache/memory-storage-provider.ts +39 -0
  8. package/src/cache/simple-cache-object-wrapper.ts +11 -0
  9. package/src/cache/simple-cache-read-options.ts +9 -0
  10. package/src/cache/simple-cache-storage-provider.ts +15 -0
  11. package/src/cache/simple-cache.spec.ts +42 -0
  12. package/src/cache/simple-cache.ts +81 -0
  13. package/src/cloudwatch/cloud-watch-log-group-ratchet.spec.ts +26 -0
  14. package/src/cloudwatch/cloud-watch-log-group-ratchet.ts +105 -0
  15. package/src/cloudwatch/cloud-watch-logs-ratchet.spec.ts +123 -0
  16. package/src/cloudwatch/cloud-watch-logs-ratchet.ts +232 -0
  17. package/src/cloudwatch/cloud-watch-metrics-ratchet.spec.ts +30 -0
  18. package/src/cloudwatch/cloud-watch-metrics-ratchet.ts +98 -0
  19. package/src/dao/example-prototype-dao-item.ts +8 -0
  20. package/src/dao/memory-prototype-dao-provider.ts +16 -0
  21. package/src/dao/prototype-dao-config.ts +8 -0
  22. package/src/dao/prototype-dao-db.ts +4 -0
  23. package/src/dao/prototype-dao-provider.ts +6 -0
  24. package/src/dao/prototype-dao.spec.ts +33 -0
  25. package/src/dao/prototype-dao.ts +110 -0
  26. package/src/dao/s3-simple-dao.ts +96 -0
  27. package/src/dao/simple-dao-item.ts +13 -0
  28. package/src/dynamodb/dynamo-ratchet-like.ts +61 -0
  29. package/src/dynamodb/dynamo-ratchet.spec.ts +206 -0
  30. package/src/dynamodb/dynamo-ratchet.ts +850 -0
  31. package/src/dynamodb/dynamo-table-ratchet.spec.ts +23 -0
  32. package/src/dynamodb/dynamo-table-ratchet.ts +189 -0
  33. package/src/dynamodb/hash-spreader.spec.ts +22 -0
  34. package/src/dynamodb/hash-spreader.ts +89 -0
  35. package/src/dynamodb/impl/dynamo-db-storage-provider.spec.ts +60 -0
  36. package/src/dynamodb/impl/dynamo-db-storage-provider.ts +140 -0
  37. package/src/dynamodb/impl/dynamo-db-sync-lock.spec.ts +41 -0
  38. package/src/dynamodb/impl/dynamo-db-sync-lock.ts +78 -0
  39. package/src/dynamodb/impl/dynamo-expiring-code-provider.ts +31 -0
  40. package/src/dynamodb/impl/dynamo-runtime-parameter-provider.spec.ts +65 -0
  41. package/src/dynamodb/impl/dynamo-runtime-parameter-provider.ts +44 -0
  42. package/src/ec2/ec2-ratchet.spec.ts +45 -0
  43. package/src/ec2/ec2-ratchet.ts +169 -0
  44. package/src/ecr/ecr-unused-image-cleaner-options.ts +9 -0
  45. package/src/ecr/ecr-unused-image-cleaner-output.ts +8 -0
  46. package/src/ecr/ecr-unused-image-cleaner-repository-output.ts +10 -0
  47. package/src/ecr/ecr-unused-image-cleaner.spec.ts +40 -0
  48. package/src/ecr/ecr-unused-image-cleaner.ts +183 -0
  49. package/src/ecr/retained-image-descriptor.ts +7 -0
  50. package/src/ecr/retained-image-reason.ts +4 -0
  51. package/src/ecr/used-image-finder.ts +6 -0
  52. package/src/ecr/used-image-finders/aws-batch-used-image-finder.ts +40 -0
  53. package/src/ecr/used-image-finders/lambda-used-image-finder.ts +51 -0
  54. package/src/environment/cascade-environment-service-provider.ts +28 -0
  55. package/src/environment/env-var-environment-service-provider.ts +36 -0
  56. package/src/environment/environment-service-config.ts +7 -0
  57. package/src/environment/environment-service-provider.ts +7 -0
  58. package/src/environment/environment-service.spec.ts +41 -0
  59. package/src/environment/environment-service.ts +89 -0
  60. package/src/environment/fixed-environment-service-provider.ts +26 -0
  61. package/src/environment/ssm-environment-service-provider.spec.ts +18 -0
  62. package/src/environment/ssm-environment-service-provider.ts +71 -0
  63. package/src/expiring-code/expiring-code-params.ts +7 -0
  64. package/src/expiring-code/expiring-code-provider.ts +6 -0
  65. package/src/expiring-code/expiring-code-ratchet.spec.ts +10 -0
  66. package/src/expiring-code/expiring-code-ratchet.ts +44 -0
  67. package/src/expiring-code/expiring-code.ts +6 -0
  68. package/src/iam/aws-credentials-ratchet.ts +25 -0
  69. package/src/lambda/lambda-event-detector.ts +55 -0
  70. package/src/lambda/lambda-event-type-guards.ts +38 -0
  71. package/src/model/cloud-watch-metrics-minute-level-dynamo-count-request.ts +18 -0
  72. package/src/model/dynamo-count-result.ts +8 -0
  73. package/src/route53/route-53-ratchet.ts +77 -0
  74. package/src/runtime-parameter/cached-stored-runtime-parameter.ts +5 -0
  75. package/src/runtime-parameter/global-variable-override-runtime-parameter-provider.spec.ts +41 -0
  76. package/src/runtime-parameter/global-variable-override-runtime-parameter-provider.ts +82 -0
  77. package/src/runtime-parameter/memory-runtime-parameter-provider.ts +42 -0
  78. package/src/runtime-parameter/runtime-parameter-provider.ts +12 -0
  79. package/src/runtime-parameter/runtime-parameter-ratchet.spec.ts +53 -0
  80. package/src/runtime-parameter/runtime-parameter-ratchet.ts +84 -0
  81. package/src/runtime-parameter/stored-runtime-parameter.ts +6 -0
  82. package/src/s3/expanded-file-children.ts +5 -0
  83. package/src/s3/impl/s3-environment-service-provider.ts +41 -0
  84. package/src/s3/impl/s3-expiring-code-provider.spec.ts +63 -0
  85. package/src/s3/impl/s3-expiring-code-provider.ts +71 -0
  86. package/src/s3/impl/s3-prototype-dao-provider.spec.ts +45 -0
  87. package/src/s3/impl/s3-prototype-dao-provider.ts +37 -0
  88. package/src/s3/impl/s3-remote-file-tracking-provider-options.ts +6 -0
  89. package/src/s3/impl/s3-remote-file-tracking-provider.spec.ts +67 -0
  90. package/src/s3/impl/s3-remote-file-tracking-provider.ts +157 -0
  91. package/src/s3/impl/s3-storage-provider.spec.ts +32 -0
  92. package/src/s3/impl/s3-storage-provider.ts +60 -0
  93. package/src/s3/s3-cache-ratchet-like.ts +64 -0
  94. package/src/s3/s3-cache-ratchet.spec.ts +150 -0
  95. package/src/s3/s3-cache-ratchet.ts +476 -0
  96. package/src/s3/s3-location-sync-ratchet.ts +207 -0
  97. package/src/s3/s3-ratchet.spec.ts +26 -0
  98. package/src/s3/s3-ratchet.ts +26 -0
  99. package/src/ses/ses-mail-sending-provider.ts +85 -0
  100. package/src/sns/sns-ratchet.spec.ts +24 -0
  101. package/src/sns/sns-ratchet.ts +52 -0
  102. package/src/sync-lock/memory-sync-lock.ts +48 -0
  103. package/src/sync-lock/sync-lock-provider.ts +5 -0
@@ -0,0 +1,96 @@
1
+ /*
2
+ Wrap S3 with an ability to store and retrieve objects cached as json files
3
+ */
4
+
5
+ import { Logger } from '@bitblit/ratchet-common/logger/logger';
6
+ import { StringRatchet } from '@bitblit/ratchet-common/lang/string-ratchet';
7
+ import { SimpleDaoItem } from './simple-dao-item.js';
8
+ import { DeleteObjectOutput, PutObjectOutput } from '@aws-sdk/client-s3';
9
+ import { S3CacheRatchetLike } from '../s3/s3-cache-ratchet-like.js';
10
+
11
+ export class S3SimpleDao<T extends SimpleDaoItem> {
12
+ constructor(
13
+ private cache: S3CacheRatchetLike,
14
+ private prefix?: string,
15
+ ) {
16
+ if (!cache) {
17
+ throw new Error('cache object may not be null');
18
+ }
19
+ if (!cache.getDefaultBucket()) {
20
+ throw new Error('Supplied cache must have default bucket set');
21
+ }
22
+ }
23
+
24
+ public buildPathPrefix(path: string): string {
25
+ let rval: string = '';
26
+ if (this.prefix) {
27
+ rval += this.prefix;
28
+ }
29
+ if (path) {
30
+ rval += path;
31
+ }
32
+ return rval;
33
+ }
34
+
35
+ public buildFullPath(id: string, path?: string): string {
36
+ let rval: string = this.buildPathPrefix(path);
37
+ if (rval.length > 0) {
38
+ rval += '/';
39
+ }
40
+ rval += id + '.json';
41
+ return rval;
42
+ }
43
+
44
+ public async exists(id: string, path?: string): Promise<boolean> {
45
+ const fullPath: string = this.buildFullPath(id, path);
46
+ Logger.debug('Check file existence : %s', fullPath);
47
+ return this.cache.fileExists(fullPath);
48
+ }
49
+
50
+ public async fetch(id: string, path?: string): Promise<T> {
51
+ const fullPath: string = this.buildFullPath(id, path);
52
+ Logger.debug('Fetching : %s', fullPath);
53
+ const rval: T = (await this.cache.fetchCacheFileAsObject(fullPath)) as T;
54
+ // Force-set id and path
55
+ rval.id = id;
56
+ rval.path = path;
57
+ return rval;
58
+ }
59
+
60
+ public async store(item: T, path?: string): Promise<T> {
61
+ item.id = item.id || StringRatchet.createType4Guid();
62
+ item.lastModifiedEpochMS = new Date().getTime();
63
+
64
+ const fullPath: string = this.buildFullPath(item.id, path);
65
+ Logger.debug('Storing : %s', fullPath);
66
+
67
+ const _stored: PutObjectOutput = await this.cache.writeObjectToCacheFile(fullPath, item);
68
+ const read: T = await this.fetch(item.id, path);
69
+ return read;
70
+ }
71
+
72
+ public async listItems(path?: string): Promise<string[]> {
73
+ const fullPath: string = this.buildPathPrefix(path);
74
+ Logger.debug('Listing : %s', fullPath);
75
+
76
+ const rval: string[] = await this.cache.directChildrenOfPrefix(fullPath);
77
+ return rval;
78
+ }
79
+
80
+ public async fetchItemsInPath(path?: string): Promise<T[]> {
81
+ const fullPath: string = this.buildPathPrefix(path);
82
+ Logger.debug('Full fetch of : %s', fullPath);
83
+ const items: string[] = await this.listItems(path);
84
+ const promises: Promise<T>[] = items.map((s) => this.fetch(s, path));
85
+ const rval: T[] = await Promise.all(promises);
86
+ return rval;
87
+ }
88
+
89
+ public async delete(id: string, path?: string): Promise<boolean> {
90
+ const fullPath: string = this.buildFullPath(id, path);
91
+ Logger.debug('Deleting : %s', fullPath);
92
+
93
+ const del: DeleteObjectOutput = await this.cache.removeCacheFile(fullPath);
94
+ return del != null;
95
+ }
96
+ }
@@ -0,0 +1,13 @@
1
+ /*
2
+ Objects implementing this interface can producer objects that are then cached in S3 (or elsewhere I suppose)
3
+ These objects are consumed by SimpleCache
4
+
5
+ T is the type of object cached
6
+ R is the type of object passed to the create process. Could just be a string or something
7
+ */
8
+
9
+ export interface SimpleDaoItem {
10
+ id: string;
11
+ path: string;
12
+ lastModifiedEpochMS: number;
13
+ }
@@ -0,0 +1,61 @@
1
+ import { DynamoCountResult } from '../model/dynamo-count-result.js';
2
+ import { DeleteCommandOutput, DynamoDBDocumentClient, PutCommandOutput, QueryCommandInput, ScanCommandInput } from '@aws-sdk/lib-dynamodb';
3
+
4
+ export interface DynamoRatchetLike {
5
+ getDDB(): DynamoDBDocumentClient;
6
+ tableIsEmpty(tableName: string): Promise<boolean>;
7
+ // This basically wraps up scans and queries with a function that will auto-retry them if a
8
+ // Throughput exception is encountered (up to a limit) but lets other errors get thrown.
9
+ // Drop-in replacement to make sure that things do not fail just because of throughput issues
10
+ throughputSafeScanOrQuery<T, R>(proc: (T) => Promise<R>, input: T, maxTries?: number, inCurrentTry?: number): Promise<R>;
11
+ fullyExecuteQueryCount(qry: QueryCommandInput, delayMS?: number): Promise<DynamoCountResult>;
12
+ fullyExecuteQuery<T>(qry: QueryCommandInput, delayMS?: number, softLimit?: number): Promise<T[]>;
13
+ fullyExecuteProcessOverQuery<T>(
14
+ qry: QueryCommandInput,
15
+ proc: (val: T) => Promise<void>,
16
+ delayMS?: number,
17
+ softLimit?: number,
18
+ ): Promise<number>;
19
+
20
+ fullyExecuteScanCount(scan: ScanCommandInput, delayMS?: number): Promise<DynamoCountResult>;
21
+ fullyExecuteScan<T>(scan: ScanCommandInput, delayMS?: number, softLimit?: number): Promise<T[]>;
22
+ fullyExecuteProcessOverScan<T>(
23
+ scan: ScanCommandInput,
24
+ proc: (val: T) => Promise<void>,
25
+ delayMS?: number,
26
+ softLimit?: number,
27
+ ): Promise<number>;
28
+
29
+ writeAllInBatches<T>(tableName: string, elements: T[], batchSize: number): Promise<number>;
30
+ fetchFullObjectsMatchingKeysOnlyIndexQuery<T>(qry: QueryCommandInput, keyNames: string[], batchSize?: number): Promise<T[]>;
31
+ fetchAllInBatches<T>(tableName: string, inKeys: any[], batchSize: number): Promise<T[]>;
32
+ deleteAllInBatches(tableName: string, keys: any[], batchSize: number): Promise<number>;
33
+
34
+ simplePut(tableName: string, value: any, autoRetryCount?: number): Promise<PutCommandOutput>;
35
+ simplePutOnlyIfFieldIsNullOrUndefined(tableName: string, value: any, fieldName: string): Promise<boolean>;
36
+
37
+ // This works like simplePut, but if a collision is detected it adjusts the object and tries writing again
38
+ // The adjustment function MUST change one of the keys - otherwise this just runs forever (or until it hits "maxAdjusts")
39
+ simplePutWithCollisionAvoidance<T>(
40
+ tableName: string,
41
+ value: T,
42
+ keyNames: string[],
43
+ adjustFunction: (val: T) => T,
44
+ maxAdjusts?: number,
45
+ autoRetryCount?: number,
46
+ ): Promise<T>;
47
+
48
+ simpleGet<T>(tableName: string, keys: any, autoRetryCount?: number): Promise<T>;
49
+
50
+ simpleGetWithCounterDecrement<T>(
51
+ tableName: string,
52
+ keys: any,
53
+ counterAttributeName: string,
54
+ deleteOnZero: boolean,
55
+ autoRetryCount?: number,
56
+ ): Promise<T>;
57
+
58
+ simpleDelete(tableName: string, keys: any): Promise<DeleteCommandOutput>;
59
+
60
+ atomicCounter(tableName: string, keys: any, counterFieldName: string, increment?: number): Promise<number>;
61
+ }
@@ -0,0 +1,206 @@
1
+ import { DynamoRatchet } from './dynamo-ratchet.js';
2
+ import { DynamoDBDocumentClient, PutCommandOutput, QueryCommandInput, ScanCommandInput } from '@aws-sdk/lib-dynamodb';
3
+ import { beforeEach, describe, expect, test } from 'vitest';
4
+
5
+ import { mockClient } from 'aws-sdk-client-mock';
6
+ import { Logger } from '@bitblit/ratchet-common/logger/logger';
7
+ import { LoggerLevelName } from '@bitblit/ratchet-common/logger/logger-level-name';
8
+
9
+ let mockDynamo;
10
+
11
+ describe('#dynamoRatchet', function () {
12
+ mockDynamo = mockClient(DynamoDBDocumentClient);
13
+
14
+ beforeEach(() => {
15
+ mockDynamo.reset();
16
+ });
17
+
18
+ test.skip('should handle ProvisionedThroughputExceeded exceptions', async () => {
19
+ const dr: DynamoRatchet = new DynamoRatchet(mockDynamo);
20
+ let row: number = 0;
21
+ const scan: ScanCommandInput = {
22
+ TableName: 'cache-device-data',
23
+ ProjectionExpression: 'compositeKey',
24
+ };
25
+
26
+ Logger.info('Starting scan');
27
+ const cnt: number = await dr.fullyExecuteProcessOverScan<any>(scan, async (ob) => {
28
+ if (row % 100 === 0) {
29
+ Logger.info('Row : %d : %j', row, ob);
30
+ }
31
+ row++;
32
+ });
33
+
34
+ Logger.info('Count was : %d', cnt);
35
+ }, 300_000_000);
36
+
37
+ test.skip('should only write if a field is null', async () => {
38
+ const dr: DynamoRatchet = new DynamoRatchet(mockDynamo);
39
+ const tableName: string = 'some-table';
40
+
41
+ const test1: any = { lockingKey: 'aaa', xx: null };
42
+ await dr.simplePut(tableName, test1);
43
+
44
+ const test2: any = { lockingKey: 'aaa', xx: 5 };
45
+ const val1: boolean = await dr.simplePutOnlyIfFieldIsNullOrUndefined(tableName, test2, 'xx');
46
+
47
+ expect(val1).toBeTruthy();
48
+
49
+ const test3: any = { lockingKey: 'aaa', xx: 7 };
50
+ const val2: boolean = await dr.simplePutOnlyIfFieldIsNullOrUndefined(tableName, test3, 'xx');
51
+
52
+ expect(val2).toBeFalsy();
53
+ });
54
+
55
+ test.skip('should fetch items from a key-only index query', async () => {
56
+ const dr: DynamoRatchet = new DynamoRatchet(mockDynamo);
57
+ const tableName: string = 'some-table';
58
+ const limit: number = 200;
59
+
60
+ const qry: QueryCommandInput = {
61
+ TableName: tableName,
62
+ IndexName: 'purchaseId-notBeforeEpochMS-index',
63
+ KeyConditionExpression: 'purchaseId = :purchaseId',
64
+ Limit: limit,
65
+ ExpressionAttributeValues: {
66
+ ':purchaseId': 'some-purchase',
67
+ },
68
+ };
69
+
70
+ const res: any[] = await dr.fetchFullObjectsMatchingKeysOnlyIndexQuery(qry, ['key1', 'key2']);
71
+
72
+ Logger.info('Got : %s', res);
73
+ expect(res).toBeTruthy();
74
+ });
75
+
76
+ test.skip('should increment the counter and return the new value', async () => {
77
+ const dr: DynamoRatchet = new DynamoRatchet(mockDynamo);
78
+ const tableName: string = 'xxx';
79
+ const res: number = await dr.atomicCounter(tableName, { groupId: 'global', unitId: 'sequence' }, 'lastValue', 1);
80
+ Logger.info('Got : %s', res);
81
+ expect(res).toBeTruthy();
82
+ });
83
+
84
+ test.skip('should stop after the soft limit', async () => {
85
+ const dr: DynamoRatchet = new DynamoRatchet(mockDynamo);
86
+
87
+ const now: number = new Date().getTime();
88
+ const _nowSec: number = Math.floor(now / 1000);
89
+ const curHash: string = 'someHash';
90
+
91
+ const qry: QueryCommandInput = {
92
+ TableName: 'some-table',
93
+ KeyConditionExpression: 'hashVal = :hashVal',
94
+ ExpressionAttributeValues: {
95
+ ':hashVal': curHash,
96
+ },
97
+ };
98
+
99
+ const res: any[] = await dr.fullyExecuteQuery<any>(qry, null, 150);
100
+
101
+ Logger.info('Got : %s', res);
102
+ expect(res).toBeTruthy();
103
+ }, 300_000);
104
+
105
+ test.skip('should run an insert / read test for slowdown', async () => {
106
+ const dr: DynamoRatchet = new DynamoRatchet(mockDynamo);
107
+
108
+ Logger.setLevel(LoggerLevelName.debug);
109
+ const now: number = new Date().getTime();
110
+ const _nowSec: number = Math.floor(now / 1000);
111
+
112
+ const nums: any[] = [];
113
+ for (let i = 0; i < 300; i++) {
114
+ const toWrite: any = {
115
+ id: 'CW_DDB_TEST',
116
+ data: 'SOME DATA',
117
+ numData: i,
118
+ };
119
+ nums.push(toWrite);
120
+ }
121
+ Logger.info('About to start');
122
+ const writeProms: Promise<any>[] = nums.map((n) => dr.simplePut('some-table', n));
123
+ const writeOut: any[] = await Promise.all(writeProms);
124
+ Logger.info('Write : %j', writeOut);
125
+
126
+ const readProms: Promise<any>[] = [];
127
+ Logger.info('Start : %d', new Date().getTime());
128
+ for (let i = 0; i < 10000; i++) {
129
+ readProms.push(dr.simpleGet('some-table', { id: 'CW_DDB_TEST' }));
130
+ }
131
+ Logger.info('Mid : %d', new Date().getTime());
132
+ const readOut: any[] = await Promise.all(readProms);
133
+ Logger.info('Read : %d : %j', new Date().getTime(), readOut);
134
+ });
135
+
136
+ test.skip('should run a collision test', async () => {
137
+ const dr: DynamoRatchet = new DynamoRatchet(mockDynamo);
138
+
139
+ Logger.setLevel(LoggerLevelName.debug);
140
+
141
+ const val: any = {
142
+ k1: 'abc',
143
+ k2: 1,
144
+ };
145
+
146
+ for (let i = 0; i < 5; i++) {
147
+ const rval: PutCommandOutput = await dr.simplePutWithCollisionAvoidance(
148
+ 'cwtest',
149
+ val,
150
+ ['k1', 'k2'],
151
+ (v) => {
152
+ v.k2++;
153
+ return v;
154
+ },
155
+ null,
156
+ 3,
157
+ );
158
+ Logger.info('output was : %j', rval);
159
+ }
160
+ });
161
+
162
+ test.skip('should do a simple get with counter decrement', async () => {
163
+ const dr: DynamoRatchet = new DynamoRatchet(mockDynamo);
164
+
165
+ Logger.setLevel(LoggerLevelName.debug);
166
+
167
+ const v: any = await dr.simpleGetWithCounterDecrement<any>('cwtest', { k1: 'abc', k2: 11 }, 'counter', true);
168
+ Logger.info('Got : %j', v);
169
+ });
170
+
171
+ test.skip('should do a full query', async () => {
172
+ const dr: DynamoRatchet = new DynamoRatchet(mockDynamo);
173
+
174
+ Logger.setLevel(LoggerLevelName.debug);
175
+
176
+ const input: QueryCommandInput = {
177
+ TableName: 'some-table',
178
+ KeyConditionExpression: 'groupId = :g',
179
+ ExpressionAttributeValues: {
180
+ ':g': 'NeonBatch',
181
+ },
182
+ };
183
+
184
+ const res: any[] = await dr.fullyExecuteQuery<any>(input);
185
+ Logger.info('Got : %j', res);
186
+ });
187
+
188
+ test.skip('should do a process over full query', async () => {
189
+ const dr: DynamoRatchet = new DynamoRatchet(mockDynamo);
190
+
191
+ Logger.setLevel(LoggerLevelName.debug);
192
+
193
+ const input: QueryCommandInput = {
194
+ TableName: 'some-table',
195
+ KeyConditionExpression: 'groupId = :g',
196
+ ExpressionAttributeValues: {
197
+ ':g': 'NeonBatch',
198
+ },
199
+ };
200
+
201
+ const res: number = await dr.fullyExecuteProcessOverQuery(input, async (v) => {
202
+ Logger.info('Proc %j', v);
203
+ });
204
+ Logger.info('Got : %j', res);
205
+ });
206
+ });