@bitblit/ratchet-aws 4.0.115-alpha → 4.0.116-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 (119) hide show
  1. package/lib/cloudwatch/cloud-watch-log-group-ratchet.d.ts +1 -0
  2. package/lib/cloudwatch/cloud-watch-logs-ratchet.d.ts +1 -0
  3. package/lib/cloudwatch/cloud-watch-metrics-ratchet.d.ts +1 -0
  4. package/lib/daemon/daemon-like.d.ts +1 -1
  5. package/lib/daemon/daemon-util.d.ts +2 -2
  6. package/lib/daemon/daemon.d.ts +1 -1
  7. package/lib/dynamodb/dynamo-ratchet.d.ts +1 -0
  8. package/lib/ec2/ec2-ratchet.d.ts +4 -2
  9. package/lib/index.d.ts +78 -1
  10. package/lib/index.mjs +10 -0
  11. package/lib/index.mjs.map +1 -0
  12. package/lib/route53/route-53-ratchet.d.ts +1 -0
  13. package/lib/s3/s3-cache-ratchet.d.ts +3 -2
  14. package/lib/s3/s3-cache-to-local-disk-ratchet.d.ts +1 -1
  15. package/lib/ses/mailer.d.ts +1 -0
  16. package/lib/sns/sns-ratchet.d.ts +1 -0
  17. package/package.json +25 -84
  18. package/lib/batch/aws-batch-background-processor.js +0 -45
  19. package/lib/batch/aws-batch-background-processor.spec.js +0 -15
  20. package/lib/batch/aws-batch-ratchet.js +0 -55
  21. package/lib/batch/aws-batch-ratchet.spec.js +0 -33
  22. package/lib/build/ratchet-aws-info.js +0 -14
  23. package/lib/cache/dynamo-db-storage-provider.js +0 -109
  24. package/lib/cache/s3-storage-provider.js +0 -43
  25. package/lib/cache/simple-cache-object-wrapper.js +0 -1
  26. package/lib/cache/simple-cache-read-options.js +0 -1
  27. package/lib/cache/simple-cache-storage-provider.js +0 -1
  28. package/lib/cache/simple-cache.js +0 -64
  29. package/lib/cache/simple-cache.spec.js +0 -67
  30. package/lib/cloudwatch/cloud-watch-log-group-ratchet.js +0 -71
  31. package/lib/cloudwatch/cloud-watch-log-group-ratchet.spec.js +0 -19
  32. package/lib/cloudwatch/cloud-watch-logs-ratchet.js +0 -170
  33. package/lib/cloudwatch/cloud-watch-logs-ratchet.spec.js +0 -84
  34. package/lib/cloudwatch/cloud-watch-metrics-ratchet.js +0 -54
  35. package/lib/cloudwatch/cloud-watch-metrics-ratchet.spec.js +0 -23
  36. package/lib/daemon/daemon-like.js +0 -1
  37. package/lib/daemon/daemon-process-create-options.js +0 -1
  38. package/lib/daemon/daemon-process-state-public-token.js +0 -1
  39. package/lib/daemon/daemon-process-state.js +0 -1
  40. package/lib/daemon/daemon-util.js +0 -148
  41. package/lib/daemon/daemon-util.spec.js +0 -79
  42. package/lib/daemon/daemon.js +0 -128
  43. package/lib/dao/prototype-dao-config.js +0 -1
  44. package/lib/dao/prototype-dao-db.js +0 -1
  45. package/lib/dao/prototype-dao-provider.js +0 -1
  46. package/lib/dao/prototype-dao.js +0 -88
  47. package/lib/dao/prototype-dao.spec.js +0 -26
  48. package/lib/dao/s3-prototype-dao-provider.js +0 -26
  49. package/lib/dao/s3-simple-dao.js +0 -76
  50. package/lib/dao/simple-dao-item.js +0 -1
  51. package/lib/dynamodb/dynamo-ratchet-like.js +0 -1
  52. package/lib/dynamodb/dynamo-ratchet.js +0 -666
  53. package/lib/dynamodb/dynamo-ratchet.spec.js +0 -156
  54. package/lib/dynamodb/dynamo-table-ratchet.js +0 -88
  55. package/lib/dynamodb/hash-spreader.js +0 -65
  56. package/lib/dynamodb/hash-spreader.spec.js +0 -17
  57. package/lib/ec2/ec2-ratchet.js +0 -107
  58. package/lib/ec2/ec2-ratchet.spec.js +0 -31
  59. package/lib/environment/cascade-environment-service-provider.js +0 -24
  60. package/lib/environment/env-var-environment-service-provider.js +0 -30
  61. package/lib/environment/environment-service-config.js +0 -1
  62. package/lib/environment/environment-service-provider.js +0 -1
  63. package/lib/environment/environment-service.js +0 -50
  64. package/lib/environment/environment-service.spec.js +0 -22
  65. package/lib/environment/fixed-environment-service-provider.js +0 -21
  66. package/lib/environment/s3-environment-service-provider.js +0 -27
  67. package/lib/environment/ssm-environment-service-provider.js +0 -59
  68. package/lib/expiring-code/dynamo-expiring-code-provider.js +0 -24
  69. package/lib/expiring-code/expiring-code-params.js +0 -1
  70. package/lib/expiring-code/expiring-code-provider.js +0 -1
  71. package/lib/expiring-code/expiring-code-ratchet.js +0 -34
  72. package/lib/expiring-code/expiring-code-ratchet.spec.js +0 -7
  73. package/lib/expiring-code/expiring-code.js +0 -1
  74. package/lib/expiring-code/s3-expiring-code-provider.js +0 -48
  75. package/lib/expiring-code/s3-expiring-code-provider.spec.js +0 -46
  76. package/lib/iam/aws-credentials-ratchet.js +0 -18
  77. package/lib/index.js +0 -1
  78. package/lib/lambda/lambda-event-detector.js +0 -38
  79. package/lib/lambda/lambda-event-type-guards.js +0 -24
  80. package/lib/model/cloud-watch-metrics-minute-level-dynamo-count-request.js +0 -1
  81. package/lib/model/cloud-watch-metrics-unit.js +0 -30
  82. package/lib/model/dynamo/doc-put-item-command-input.js +0 -1
  83. package/lib/model/dynamo/doc-query-command-input.js +0 -1
  84. package/lib/model/dynamo/doc-scan-command-input.js +0 -1
  85. package/lib/model/dynamo/doc-update-item-command-input.js +0 -1
  86. package/lib/model/dynamo-count-result.js +0 -1
  87. package/lib/route53/route-53-ratchet.js +0 -55
  88. package/lib/runtime-parameter/cached-stored-runtime-parameter.js +0 -1
  89. package/lib/runtime-parameter/dynamo-runtime-parameter-provider.js +0 -36
  90. package/lib/runtime-parameter/dynamo-runtime-parameter-provider.spec.js +0 -49
  91. package/lib/runtime-parameter/global-variable-override-runtime-parameter-provider.js +0 -51
  92. package/lib/runtime-parameter/global-variable-override-runtime-parameter-provider.spec.js +0 -37
  93. package/lib/runtime-parameter/memory-runtime-parameter-provider.js +0 -27
  94. package/lib/runtime-parameter/runtime-parameter-provider.js +0 -1
  95. package/lib/runtime-parameter/runtime-parameter-ratchet.js +0 -71
  96. package/lib/runtime-parameter/runtime-parameter-ratchet.spec.js +0 -39
  97. package/lib/runtime-parameter/stored-runtime-parameter.js +0 -1
  98. package/lib/s3/s3-cache-ratchet.js +0 -330
  99. package/lib/s3/s3-cache-ratchet.spec.js +0 -97
  100. package/lib/s3/s3-cache-to-local-disk-ratchet.js +0 -105
  101. package/lib/s3/s3-cache-to-local-dist-ratchet.spec.js +0 -22
  102. package/lib/s3/s3-location-sync-ratchet.js +0 -140
  103. package/lib/s3/s3-ratchet.js +0 -22
  104. package/lib/s3/s3-ratchet.spec.js +0 -20
  105. package/lib/ses/email-attachment.js +0 -1
  106. package/lib/ses/mailer-config.js +0 -1
  107. package/lib/ses/mailer-like.js +0 -1
  108. package/lib/ses/mailer.js +0 -206
  109. package/lib/ses/mailer.spec.js +0 -104
  110. package/lib/ses/ratchet-template-renderer.js +0 -1
  111. package/lib/ses/ready-to-send-email.js +0 -1
  112. package/lib/ses/remote-handlebars-template-renderer.js +0 -78
  113. package/lib/ses/resolved-ready-to-send-email.js +0 -1
  114. package/lib/sns/sns-ratchet.js +0 -45
  115. package/lib/sns/sns-ratchet.spec.js +0 -17
  116. package/lib/sync-lock/dynamo-db-sync-lock.js +0 -69
  117. package/lib/sync-lock/dynamo-db-sync-lock.spec.js +0 -30
  118. package/lib/sync-lock/memory-sync-lock.js +0 -35
  119. package/lib/sync-lock/sync-lock-provider.js +0 -1
@@ -3,5 +3,6 @@ export declare class Route53Ratchet {
3
3
  private route53;
4
4
  private hostedZoneId;
5
5
  constructor(route53: Route53Client, hostedZoneId: string);
6
+ get route53Client(): Route53Client;
6
7
  changeCnameRecordTarget(domainName: string, target: string, hostedZoneId?: string, ttlSeconds?: number): Promise<boolean>;
7
8
  }
@@ -1,11 +1,12 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- /// <reference types="node" resolution-mode="require"/>
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
3
  import { CompleteMultipartUploadCommandOutput, CopyObjectCommandOutput, DeleteObjectCommandOutput, GetObjectCommandOutput, HeadObjectCommandOutput, PutObjectCommandInput, S3Client } from '@aws-sdk/client-s3';
4
4
  import { Readable } from 'stream';
5
5
  export declare class S3CacheRatchet {
6
6
  private s3;
7
7
  private defaultBucket;
8
8
  constructor(s3: S3Client, defaultBucket?: string);
9
+ get s3Client(): S3Client;
9
10
  static applyCacheControlMaxAge(input: PutObjectCommandInput, seconds: number): PutObjectCommandInput;
10
11
  static applyUserMetaData(input: PutObjectCommandInput, key: string, value: string): PutObjectCommandInput;
11
12
  getDefaultBucket(): string;
@@ -1,4 +1,4 @@
1
- /// <reference types="node" resolution-mode="require"/>
1
+ /// <reference types="node" />
2
2
  import { S3CacheRatchet } from './s3-cache-ratchet.js';
3
3
  export declare class S3CacheToLocalDiskRatchet {
4
4
  private s3;
@@ -8,6 +8,7 @@ export declare class Mailer implements MailerLike {
8
8
  private config;
9
9
  static readonly EMAIL: RegExp;
10
10
  constructor(ses: SESClient, config?: MailerConfig);
11
+ get sESClient(): SESClient;
11
12
  fillEmailBody(rts: ReadyToSendEmail, context: any, htmlTemplateName: string, txtTemplateName?: string, layoutName?: string, partialNames?: string[]): Promise<ReadyToSendEmail>;
12
13
  fillEmailBodyAndSend(rts: ReadyToSendEmail, context: any, htmlTemplateName: string, txtTemplateName?: string, layoutName?: string, partialNames?: string[]): Promise<SendRawEmailResponse>;
13
14
  filterEmailsToValid(emails: string[]): string[];
@@ -3,6 +3,7 @@ export declare class SnsRatchet {
3
3
  private sns;
4
4
  private topicArn;
5
5
  constructor(sns: SNSClient, topicArn: string);
6
+ get snsClient(): SNSClient;
6
7
  sendMessage(inMsg: any, suppressErrors?: boolean): Promise<PublishCommandOutput>;
7
8
  conditionallySendMessage(inMsg: any, condition: boolean, suppressErrors?: boolean): Promise<PublishCommandOutput>;
8
9
  }
package/package.json CHANGED
@@ -1,14 +1,21 @@
1
1
  {
2
2
  "name": "@bitblit/ratchet-aws",
3
- "version": "4.0.115-alpha",
3
+ "version": "4.0.116-alpha",
4
4
  "description": "Common tools for use with AWS browser and node",
5
5
  "sideEffects": false,
6
6
  "type": "module",
7
- "module": "index.js",
7
+ "_module": "lib/index.js",
8
+ "_typings": "lib/index.d.ts",
8
9
  "files": [
9
10
  "lib/*",
10
11
  "bin/*"
11
12
  ],
13
+ "exports": {
14
+ ".": {
15
+ "types": "./lib/index.d.ts",
16
+ "import": "./lib/index.mjs"
17
+ }
18
+ },
12
19
  "contributors": [
13
20
  "Christopher Weiss <bitblit@gmail.com>",
14
21
  "William Weiss <npm@codification.org>",
@@ -35,9 +42,16 @@
35
42
  "docs": "typedoc",
36
43
  "lint": "eslint src/**/*.ts",
37
44
  "lint-fix": "eslint --fix src/**/*.ts",
38
- "__generate-barrels": "barrelsby -q --delete -d src -e .*\\.spec\\.ts",
39
- "__build": "yarn run generate-barrels && tsc",
40
- "build": "tsc",
45
+ "generate-barrels": "barrelsby -q --delete -d src -e .*\\.spec\\.ts && sed -i 's/\\x27;/.js\\x27;/' src/index.ts",
46
+ "__build": "yarn build-code && yarn build-types",
47
+ "__build-code": "yarn run generate-barrels && node esbuild-conf.mjs",
48
+ "__build-types": " npm-dts generate --output lib/index.d.ts",
49
+ "__build-types": "tsc --emitDeclarationOnly",
50
+ "__build": "tsc",
51
+ "___build": "rollup src/index.ts -f esm -o lib/t.mjs",
52
+ "_build": "yarn clean && yarn generate-barrels && tsc && rollup -c rollup.config.js && cp src/index.ts.bak lib/index.d.ts",
53
+ "build": "yarn clean && yarn generate-barrels && rollup -c rollup.config.js",
54
+ "_1build": "yarn clean && yarn generate-barrels && tsc",
41
55
  "force-build": "tsc --build --force"
42
56
  },
43
57
  "repository": {
@@ -57,9 +71,7 @@
57
71
  },
58
72
  "license": "Apache-2.0",
59
73
  "dependencies": {
60
- "@bitblit/ratchet-common": "4.0.115-alpha"
61
- },
62
- "optionalDependencies": {
74
+ "@bitblit/ratchet-common": "4.0.116-alpha",
63
75
  "@aws-sdk/abort-controller": "3.310.0",
64
76
  "@aws-sdk/client-athena": "3.328.0",
65
77
  "@aws-sdk/client-batch": "3.328.0",
@@ -78,86 +90,15 @@
78
90
  "@aws-sdk/s3-request-presigner": "3.328.0",
79
91
  "@aws-sdk/smithy-client": "3.325.0",
80
92
  "@aws-sdk/types": "3.310.0",
81
- "@aws-sdk/util-waiter": "3.310.0",
82
- "@types/aws-lambda": "8.10.115"
93
+ "@aws-sdk/util-waiter": "3.310.0"
83
94
  },
84
- "peerDependencies": {
85
- "@aws-sdk/abort-controller": "^3.310.0",
86
- "@aws-sdk/client-athena": "^3.328.0",
87
- "@aws-sdk/client-batch": "^3.328.0",
88
- "@aws-sdk/client-cloudwatch": "^3.328.0",
89
- "@aws-sdk/client-cloudwatch-logs": "^3.328.0",
90
- "@aws-sdk/client-dynamodb": "^3.328.0",
91
- "@aws-sdk/client-ec2": "^3.328.0",
92
- "@aws-sdk/client-ec2-instance-connect": "^3.328.0",
93
- "@aws-sdk/client-route-53": "^3.328.0",
94
- "@aws-sdk/client-s3": "^3.328.0",
95
- "@aws-sdk/client-ses": "^3.328.0",
96
- "@aws-sdk/client-sns": "^3.328.0",
97
- "@aws-sdk/client-ssm": "^3.328.0",
98
- "@aws-sdk/lib-dynamodb": "^3.328.0",
99
- "@aws-sdk/lib-storage": "^3.328.0",
100
- "@aws-sdk/s3-request-presigner": "^3.328.0",
101
- "@aws-sdk/smithy-client": "^3.328.0",
102
- "@aws-sdk/types": "^3.310.0",
103
- "@aws-sdk/util-waiter": "^3.310.0",
104
- "@bitblit/ratchet-common": "4.0.115-alpha",
105
- "@types/aws-lambda": "^8.10.115"
106
- },
107
- "peerDependenciesMeta": {
108
- "@aws-sdk/client-athena": {
109
- "optional": true
110
- },
111
- "@aws-sdk/client-batch": {
112
- "optional": true
113
- },
114
- "@aws-sdk/client-cloudwatch": {
115
- "optional": true
116
- },
117
- "@aws-sdk/client-cloudwatch-logs": {
118
- "optional": true
119
- },
120
- "@aws-sdk/client-dynamodb": {
121
- "optional": true
122
- },
123
- "@aws-sdk/client-ec2": {
124
- "optional": true
125
- },
126
- "@aws-sdk/client-ec2-instance-connect": {
127
- "optional": true
128
- },
129
- "@aws-sdk/client-route-53": {
130
- "optional": true
131
- },
132
- "@aws-sdk/client-s3": {
133
- "optional": true
134
- },
135
- "@aws-sdk/client-ses": {
136
- "optional": true
137
- },
138
- "@aws-sdk/client-sns": {
139
- "optional": true
140
- },
141
- "@aws-sdk/client-ssm": {
142
- "optional": true
143
- },
144
- "@aws-sdk/lib-dynamodb": {
145
- "optional": true
146
- },
147
- "@aws-sdk/lib-storage": {
148
- "optional": true
149
- },
150
- "@aws-sdk/s3-request-presigner": {
151
- "optional": true
152
- },
153
- "@aws-sdk/smithy-client": {
154
- "optional": true
155
- }
95
+ "optionalDependencies": {
156
96
  },
157
97
  "resolutions": {},
158
98
  "devDependencies": {
159
- "@bitblit/ratchet-jest": "4.0.115-alpha",
160
- "@bitblit/ratchet-node-only": "4.0.115-alpha",
99
+ "@types/aws-lambda": "8.10.115",
100
+ "@bitblit/ratchet-jest": "4.0.116-alpha",
101
+ "@bitblit/ratchet-node-only": "4.0.116-alpha",
161
102
  "aws-sdk-client-mock": "2.1.1"
162
103
  }
163
104
  }
@@ -1,45 +0,0 @@
1
- import { DateTime } from 'luxon';
2
- import { ErrorRatchet } from '@bitblit/ratchet-common/lib/lang/error-ratchet.js';
3
- import { Logger } from '@bitblit/ratchet-common/lib/logger/logger.js';
4
- import { RequireRatchet } from '@bitblit/ratchet-common/lib/lang/require-ratchet.js';
5
- import { StringRatchet } from '@bitblit/ratchet-common/lib/lang/string-ratchet.js';
6
- export class AwsBatchBackgroundProcessor {
7
- batchRatchet;
8
- validTaskNames;
9
- constructor(batchRatchet, validTaskNames) {
10
- this.batchRatchet = batchRatchet;
11
- this.validTaskNames = validTaskNames;
12
- RequireRatchet.notNullOrUndefined(this.batchRatchet, 'batchRatchet');
13
- RequireRatchet.notNullOrUndefined(this.batchRatchet.batchClient, 'batchRatchet.batchClient');
14
- RequireRatchet.notNullOrUndefined(this.batchRatchet.defaultJobDefinition, 'batchRatchet.defaultJobDefinition');
15
- RequireRatchet.notNullOrUndefined(this.batchRatchet.defaultQueueName, 'batchRatchet.defaultQueueName');
16
- }
17
- async scheduleBackgroundTask(taskName, data = {}, meta = {}) {
18
- if (this.validTaskNames &&
19
- this.validTaskNames.length &&
20
- (!StringRatchet.trimToNull(taskName) || !this.validTaskNames.includes(taskName))) {
21
- ErrorRatchet.throwFormattedErr('Cannot start task %s - not found in valid task list', taskName);
22
- }
23
- Logger.info('Submitting background task to AWS batch: %s %j %s', taskName, data, this.batchRatchet.defaultQueueName);
24
- let rval = null;
25
- const jobName = `${this.batchRatchet.defaultJobDefinition}-${taskName}_${DateTime.utc().toFormat('yyyy-MM-dd-HH-mm')}`;
26
- const options = {
27
- jobName: jobName,
28
- jobDefinition: this.batchRatchet.defaultJobDefinition,
29
- jobQueue: this.batchRatchet.defaultQueueName,
30
- parameters: {
31
- taskName,
32
- taskData: JSON.stringify(data),
33
- taskMetadata: JSON.stringify(meta),
34
- },
35
- };
36
- try {
37
- rval = await this.batchRatchet.scheduleJob(options);
38
- Logger.info('Job %s(%s) submitted', rval.jobName, rval.jobId);
39
- }
40
- catch (err) {
41
- Logger.error('Cannot submit batch job taskName: %s jobDef: %s queue: %s jobName: %s data: %j', taskName, this.batchRatchet.defaultJobDefinition, this.batchRatchet.defaultQueueName, jobName, data, err);
42
- }
43
- return rval;
44
- }
45
- }
@@ -1,15 +0,0 @@
1
- import { JestRatchet } from '@bitblit/ratchet-jest/lib/jest/jest-ratchet.js';
2
- import { AwsBatchBackgroundProcessor } from './aws-batch-background-processor.js';
3
- import { jest } from '@jest/globals';
4
- let mockBatchRatchet;
5
- describe('#AwsBatchBackgroundProcessor', () => {
6
- beforeEach(() => {
7
- mockBatchRatchet = JestRatchet.mock(jest.fn);
8
- });
9
- it('Should schedule background task', async () => {
10
- mockBatchRatchet.scheduleJob.mockResolvedValue({ jobId: 'newID', jobName: 'name', $metadata: null });
11
- const svc = new AwsBatchBackgroundProcessor(mockBatchRatchet, null);
12
- const res = await svc.scheduleBackgroundTask('BACKGROUND_TASK_NAME', {}, {});
13
- expect(res).not.toBeNull();
14
- });
15
- });
@@ -1,55 +0,0 @@
1
- import { ListJobsCommand, SubmitJobCommand, } from '@aws-sdk/client-batch';
2
- import { RequireRatchet } from '@bitblit/ratchet-common/lib/lang/require-ratchet.js';
3
- import { Logger } from '@bitblit/ratchet-common/lib/logger/logger.js';
4
- export class AwsBatchRatchet {
5
- _batchClient;
6
- _defaultQueueName;
7
- _defaultJobDefinition;
8
- constructor(_batchClient, _defaultQueueName, _defaultJobDefinition) {
9
- this._batchClient = _batchClient;
10
- this._defaultQueueName = _defaultQueueName;
11
- this._defaultJobDefinition = _defaultJobDefinition;
12
- }
13
- get batchClient() {
14
- return this._batchClient;
15
- }
16
- get defaultQueueName() {
17
- return this._defaultQueueName;
18
- }
19
- get defaultJobDefinition() {
20
- return this._defaultJobDefinition;
21
- }
22
- async scheduleJob(options) {
23
- Logger.info('Submitting batch job %s', options.jobName);
24
- try {
25
- const rval = await this._batchClient.send(new SubmitJobCommand(options));
26
- Logger.info('Job %s(%s) submitted', rval.jobName, rval.jobId);
27
- return rval;
28
- }
29
- catch (err) {
30
- Logger.error('Cannot submit batch job %s: %s', options.jobName, err);
31
- }
32
- return null;
33
- }
34
- async jobCountInState(jobStatus, queueName = this.defaultQueueName) {
35
- const all = await this.listJobs(queueName, jobStatus);
36
- return all.length;
37
- }
38
- async listJobs(queueName = this.defaultQueueName, jobStatus = null) {
39
- RequireRatchet.notNullOrUndefined(queueName, 'queueName');
40
- let rval = [];
41
- const request = {
42
- jobQueue: queueName,
43
- jobStatus: jobStatus,
44
- nextToken: null,
45
- };
46
- Logger.info('Fetching %j', request);
47
- do {
48
- Logger.info('Pulling page...');
49
- const tmp = await this._batchClient.send(new ListJobsCommand(request));
50
- rval = rval.concat(tmp.jobSummaryList);
51
- request.nextToken = tmp.nextToken;
52
- } while (request.nextToken);
53
- return rval;
54
- }
55
- }
@@ -1,33 +0,0 @@
1
- import { AwsBatchRatchet } from './aws-batch-ratchet.js';
2
- import { BatchClient, JobStatus, ListJobsCommand, SubmitJobCommand } from '@aws-sdk/client-batch';
3
- import { mockClient } from 'aws-sdk-client-mock';
4
- let mockBatch;
5
- describe('#AwsBatchService', () => {
6
- mockBatch = mockClient(BatchClient);
7
- beforeEach(() => {
8
- mockBatch.reset();
9
- });
10
- it('Should schedule batch job', async () => {
11
- const svc = new AwsBatchRatchet(mockBatch);
12
- mockBatch.on(SubmitJobCommand).resolves({ jobName: 'b' });
13
- const res = await svc.scheduleJob({
14
- jobName: 'testName',
15
- jobDefinition: 'testDefinition',
16
- jobQueue: 'testQueue',
17
- });
18
- expect(res).not.toBeNull();
19
- });
20
- it('Should list jobs', async () => {
21
- const svc = new AwsBatchRatchet(mockBatch);
22
- mockBatch.on(ListJobsCommand).resolves([{}]);
23
- const res = await svc.listJobs('testQueue');
24
- expect(res).not.toBeNull();
25
- expect(res.length).toEqual(1);
26
- });
27
- it('Should count jobs in state', async () => {
28
- const svc = new AwsBatchRatchet(mockBatch);
29
- mockBatch.on(ListJobsCommand).resolves([{}]);
30
- const res = await svc.jobCountInState(JobStatus.RUNNABLE, 'testQueue');
31
- expect(res).toEqual(1);
32
- });
33
- });
@@ -1,14 +0,0 @@
1
- export class RatchetAwsInfo {
2
- constructor() { }
3
- static buildInformation() {
4
- const val = {
5
- version: 'LOCAL-SNAPSHOT',
6
- hash: 'LOCAL-HASH',
7
- branch: 'LOCAL-BRANCH',
8
- tag: 'LOCAL-TAG',
9
- timeBuiltISO: 'LOCAL-TIME-ISO',
10
- notes: 'LOCAL-NOTES',
11
- };
12
- return val;
13
- }
14
- }
@@ -1,109 +0,0 @@
1
- import { RequireRatchet } from '@bitblit/ratchet-common/lib/lang/require-ratchet.js';
2
- export class DynamoDbStorageProvider {
3
- dynamo;
4
- opts;
5
- constructor(dynamo, opts) {
6
- this.dynamo = dynamo;
7
- this.opts = opts;
8
- RequireRatchet.notNullOrUndefined(this.dynamo, 'dynamo');
9
- RequireRatchet.notNullOrUndefined(this.opts, 'opts');
10
- RequireRatchet.notNullOrUndefined(this.opts.tableName, 'opts.tableName');
11
- RequireRatchet.notNullOrUndefined(this.opts.hashKeyName, 'opts.hashKeyName');
12
- RequireRatchet.true(!this.opts.useRangeKeys || (!!this.opts.rangeKeyName && !!this.opts.hashKeyValue), 'invalid range configuration');
13
- }
14
- static createDefaultOptions() {
15
- const rval = {
16
- tableName: 'simple-cache',
17
- useRangeKeys: false,
18
- hashKeyName: 'cache-key',
19
- rangeKeyName: null,
20
- hashKeyValue: null,
21
- };
22
- return rval;
23
- }
24
- createKeyObject(cacheKey) {
25
- const keys = {};
26
- if (this.opts.useRangeKeys) {
27
- keys[this.opts.hashKeyName] = this.opts.hashKeyValue;
28
- keys[this.opts.rangeKeyName] = cacheKey;
29
- }
30
- else {
31
- keys[this.opts.hashKeyName] = cacheKey;
32
- }
33
- return keys;
34
- }
35
- cleanDynamoFieldsFromObjectInPlace(rval) {
36
- if (rval) {
37
- delete rval[this.opts.hashKeyName];
38
- if (this.opts.rangeKeyName) {
39
- delete rval[this.opts.rangeKeyName];
40
- }
41
- if (this.opts.dynamoExpiresColumnName) {
42
- delete rval[this.opts.dynamoExpiresColumnName];
43
- }
44
- }
45
- }
46
- extractKeysFromObject(rval) {
47
- let keys = null;
48
- if (rval) {
49
- keys = {};
50
- if (this.opts.useRangeKeys) {
51
- keys[this.opts.hashKeyName] = this.opts.hashKeyValue;
52
- keys[this.opts.rangeKeyName] = rval.cacheKey;
53
- }
54
- else {
55
- keys[this.opts.hashKeyName] = rval.cacheKey;
56
- }
57
- }
58
- return keys;
59
- }
60
- async readFromCache(cacheKey) {
61
- const dKey = this.createKeyObject(cacheKey);
62
- const rval = await this.dynamo.simpleGet(this.opts.tableName, dKey);
63
- this.cleanDynamoFieldsFromObjectInPlace(rval);
64
- return rval;
65
- }
66
- async storeInCache(value) {
67
- RequireRatchet.notNullOrUndefined(value, 'value');
68
- RequireRatchet.notNullOrUndefined(value.cacheKey, 'value.cacheKey');
69
- const toSave = Object.assign({}, value, this.createKeyObject(value.cacheKey));
70
- if (this.opts.dynamoExpiresColumnName && value.expiresEpochMS) {
71
- toSave[this.opts.dynamoExpiresColumnName] = Math.floor(value.expiresEpochMS / 1000);
72
- }
73
- const wrote = await this.dynamo.simplePut(this.opts.tableName, toSave);
74
- return !!wrote;
75
- }
76
- async removeFromCache(cacheKey) {
77
- await this.dynamo.simpleDelete(this.opts.tableName, this.createKeyObject(cacheKey));
78
- }
79
- async clearCache() {
80
- const allValues = await this.readAll();
81
- const allKeys = allValues.map((a) => this.extractKeysFromObject(a));
82
- const rval = await this.dynamo.deleteAllInBatches(this.opts.tableName, allKeys, 25);
83
- return rval;
84
- }
85
- async readAll() {
86
- let rval = null;
87
- if (this.opts.useRangeKeys) {
88
- const qry = {
89
- TableName: this.opts.tableName,
90
- KeyConditionExpression: '#cacheKey = :cacheKey',
91
- ExpressionAttributeNames: {
92
- '#cacheKey': this.opts.hashKeyName,
93
- },
94
- ExpressionAttributeValues: {
95
- ':cacheKey': this.opts.hashKeyValue,
96
- },
97
- };
98
- rval = await this.dynamo.fullyExecuteQuery(qry);
99
- }
100
- else {
101
- const scan = {
102
- TableName: this.opts.tableName,
103
- };
104
- rval = await this.dynamo.fullyExecuteScan(scan);
105
- }
106
- rval.forEach((r) => this.cleanDynamoFieldsFromObjectInPlace(r));
107
- return rval;
108
- }
109
- }
@@ -1,43 +0,0 @@
1
- import { RequireRatchet } from '@bitblit/ratchet-common/lib/lang/require-ratchet.js';
2
- import { StringRatchet } from '@bitblit/ratchet-common/lib/lang/string-ratchet.js';
3
- export class S3StorageProvider {
4
- s3CacheRatchet;
5
- prefix;
6
- constructor(s3CacheRatchet, prefix) {
7
- this.s3CacheRatchet = s3CacheRatchet;
8
- this.prefix = prefix;
9
- RequireRatchet.notNullOrUndefined(this.s3CacheRatchet, 's3CacheRatchet');
10
- RequireRatchet.notNullOrUndefined(this.s3CacheRatchet.getDefaultBucket(), 's3CacheRatchet.defaultBucket');
11
- }
12
- keyToPath(cacheKey) {
13
- let rval = StringRatchet.trimToEmpty(this.prefix);
14
- if (rval.length > 0 && !rval.endsWith('/')) {
15
- rval += '/';
16
- }
17
- rval += cacheKey;
18
- return rval;
19
- }
20
- async readFromCache(cacheKey) {
21
- const rval = await this.s3CacheRatchet.fetchCacheFileAsObject(this.keyToPath(cacheKey));
22
- return rval;
23
- }
24
- async storeInCache(value) {
25
- RequireRatchet.notNullOrUndefined(value, 'value');
26
- RequireRatchet.notNullOrUndefined(value.cacheKey, 'value.cacheKey');
27
- const tmp = await this.s3CacheRatchet.writeObjectToCacheFile(this.keyToPath(value.cacheKey), value);
28
- return !!tmp;
29
- }
30
- async removeFromCache(cacheKey) {
31
- await this.s3CacheRatchet.removeCacheFile(this.keyToPath(cacheKey));
32
- }
33
- async clearCache() {
34
- const keys = await this.s3CacheRatchet.directChildrenOfPrefix(this.keyToPath(''));
35
- const removed = await Promise.all(keys.map((k) => this.removeFromCache(k)));
36
- return keys.length;
37
- }
38
- async readAll() {
39
- const keys = await this.s3CacheRatchet.directChildrenOfPrefix(this.keyToPath(''));
40
- const rval = await Promise.all(keys.map((k) => this.readFromCache(k)));
41
- return rval;
42
- }
43
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,64 +0,0 @@
1
- import { Logger } from '@bitblit/ratchet-common/lib/logger/logger.js';
2
- export class SimpleCache {
3
- provider;
4
- defaultTimeToLiveMS;
5
- constructor(provider, defaultTimeToLiveMS = 1_000 * 60) {
6
- this.provider = provider;
7
- this.defaultTimeToLiveMS = defaultTimeToLiveMS;
8
- }
9
- createDefaultReadOptions() {
10
- return {
11
- maxStalenessMS: null,
12
- timeToLiveMS: this.defaultTimeToLiveMS,
13
- cacheNullValues: false,
14
- };
15
- }
16
- async fetchWrapper(cacheKey, producer, opts = this.createDefaultReadOptions()) {
17
- Logger.silly('Fetching %s', cacheKey);
18
- const now = new Date().getTime();
19
- let rval = await this.provider.readFromCache(cacheKey);
20
- if (rval && rval.expiresEpochMS < now) {
21
- Logger.debug('Object found, but expired - removing');
22
- rval = null;
23
- }
24
- if (rval && opts && opts.maxStalenessMS && now - rval.createdEpochMS > opts.maxStalenessMS) {
25
- Logger.debug('Object found by too stale - removing');
26
- rval = null;
27
- }
28
- if (!rval) {
29
- Logger.debug('%s not found in cache, generating', cacheKey);
30
- const tmp = await producer();
31
- if (tmp || opts?.cacheNullValues) {
32
- Logger.debug('Writing %j to cache');
33
- rval = {
34
- cacheKey: cacheKey,
35
- createdEpochMS: now,
36
- expiresEpochMS: opts && opts.timeToLiveMS ? now + opts.timeToLiveMS : null,
37
- value: tmp,
38
- generated: false,
39
- };
40
- await this.provider.storeInCache(rval);
41
- rval.generated = true;
42
- }
43
- }
44
- return rval;
45
- }
46
- async fetch(cacheKey, producer, opts = null) {
47
- const wrapper = await this.fetchWrapper(cacheKey, producer, opts);
48
- return wrapper ? wrapper.value : null;
49
- }
50
- async removeFromCache(cacheKey, returnOldValue) {
51
- let rval = null;
52
- if (returnOldValue) {
53
- rval = await this.fetchWrapper(cacheKey, () => null);
54
- }
55
- await this.provider.removeFromCache(cacheKey);
56
- return rval;
57
- }
58
- async clearCache() {
59
- return this.provider.clearCache();
60
- }
61
- async readAll() {
62
- return this.provider.readAll();
63
- }
64
- }
@@ -1,67 +0,0 @@
1
- import { S3StorageProvider } from './s3-storage-provider.js';
2
- import { SimpleCache } from './simple-cache.js';
3
- import { S3CacheRatchet } from '../s3/s3-cache-ratchet.js';
4
- import { DynamoRatchet } from '../dynamodb/dynamo-ratchet.js';
5
- import { DynamoDbStorageProvider } from './dynamo-db-storage-provider.js';
6
- import { S3Client } from '@aws-sdk/client-s3';
7
- import { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';
8
- import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
9
- describe('#simpleCache', function () {
10
- xit('should read/write/delete with an S3 handler', async () => {
11
- const s3 = new S3Client({ region: 'us-east-1' });
12
- const cache = new S3CacheRatchet(s3, 'test-bucket');
13
- const s3StorageProvider = new S3StorageProvider(cache, 'test-cache');
14
- const simpleCache = new SimpleCache(s3StorageProvider, 2000000);
15
- await simpleCache.removeFromCache('test1');
16
- const test1a = await simpleCache.fetchWrapper('test1', () => Promise.resolve({ x: 1 }));
17
- expect(test1a).not.toBeNull();
18
- expect(test1a.generated).toBeTruthy();
19
- expect(test1a.value).not.toBeNull();
20
- expect(test1a.value['x']).toEqual(1);
21
- const test1b = await simpleCache.fetchWrapper('test1', () => Promise.resolve({ x: 1 }));
22
- expect(test1b).not.toBeNull();
23
- expect(test1b.generated).toBeFalsy();
24
- expect(test1b.value).not.toBeNull();
25
- expect(test1b.value['x']).toEqual(1);
26
- await simpleCache.removeFromCache('test1');
27
- }, 60_000);
28
- xit('should read/write/delete with an dynamo handler', async () => {
29
- const dr = new DynamoRatchet(DynamoDBDocument.from(new DynamoDBClient({ region: 'us-east-1' })));
30
- const opts = DynamoDbStorageProvider.createDefaultOptions();
31
- opts.tableName = 'test-table';
32
- opts.useRangeKeys = false;
33
- opts.hashKeyName = 'cacheUid';
34
- opts.dynamoExpiresColumnName = 'expiresEpochSeconds';
35
- const ddbStorage = new DynamoDbStorageProvider(dr, opts);
36
- const simpleCache = new SimpleCache(ddbStorage, 2000000);
37
- await simpleCache.removeFromCache('test1');
38
- const test1a = await simpleCache.fetchWrapper('test1', () => Promise.resolve({ x: 1 }));
39
- expect(test1a).not.toBeNull();
40
- expect(test1a.generated).toBeTruthy();
41
- expect(test1a.value).not.toBeNull();
42
- expect(test1a.value['x']).toEqual(1);
43
- const test1b = await simpleCache.fetchWrapper('test1', () => Promise.resolve({ x: 1 }));
44
- expect(test1b).not.toBeNull();
45
- expect(test1b.generated).toBeFalsy();
46
- expect(test1b.value).not.toBeNull();
47
- expect(test1b.value['x']).toEqual(1);
48
- await simpleCache.removeFromCache('test1');
49
- }, 60_000);
50
- xit('should write a bunch', async () => {
51
- const dr = new DynamoRatchet(DynamoDBDocument.from(new DynamoDBClient({ region: 'us-east-1' })));
52
- const opts = DynamoDbStorageProvider.createDefaultOptions();
53
- opts.tableName = 'test-table';
54
- opts.useRangeKeys = false;
55
- opts.hashKeyName = 'cacheUid';
56
- opts.dynamoExpiresColumnName = 'expiresEpochSeconds';
57
- const ddbStorage = new DynamoDbStorageProvider(dr, opts);
58
- const simpleCache = new SimpleCache(ddbStorage, 1000);
59
- for (let i = 0; i < 10; i++) {
60
- const tests = await simpleCache.fetchWrapper('test' + i, () => Promise.resolve({ x: i }));
61
- }
62
- const all = await simpleCache.readAll();
63
- expect(all).not.toBeNull();
64
- expect(all.length).toBeGreaterThan(9);
65
- await simpleCache.clearCache();
66
- }, 60_000);
67
- });