@sudoplatform/sudo-common 7.1.3 → 8.0.2

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 (100) hide show
  1. package/bin/outdated-with-suppression.sh +203 -0
  2. package/bin/suppress-audit.sh +15 -0
  3. package/bin/suppress-outdated.sh +60 -0
  4. package/bin/yarn-audit-with-suppression.sh +19 -0
  5. package/cjs/configurationManager/defaultConfigurationManager.js +122 -0
  6. package/cjs/configurationManager/defaultConfigurationManager.js.map +1 -0
  7. package/cjs/errors/error.js +442 -0
  8. package/cjs/errors/error.js.map +1 -0
  9. package/cjs/index.js +13 -0
  10. package/cjs/index.js.map +1 -0
  11. package/cjs/logging/bunyanLogger.js +36 -0
  12. package/cjs/logging/bunyanLogger.js.map +1 -0
  13. package/cjs/logging/logger.js +77 -0
  14. package/cjs/logging/logger.js.map +1 -0
  15. package/cjs/sudoKeyArchive/index.js +8 -0
  16. package/cjs/sudoKeyArchive/index.js.map +1 -0
  17. package/cjs/sudoKeyArchive/keyArchive.js +84 -0
  18. package/cjs/sudoKeyArchive/keyArchive.js.map +1 -0
  19. package/cjs/sudoKeyArchive/keyInfo.js +17 -0
  20. package/cjs/sudoKeyArchive/keyInfo.js.map +1 -0
  21. package/cjs/sudoKeyArchive/keyType.js +39 -0
  22. package/cjs/sudoKeyArchive/keyType.js.map +1 -0
  23. package/cjs/sudoKeyArchive/sudoKeyArchive.js +373 -0
  24. package/cjs/sudoKeyArchive/sudoKeyArchive.js.map +1 -0
  25. package/cjs/sudoKeyManager/index.js +8 -0
  26. package/cjs/sudoKeyManager/index.js.map +1 -0
  27. package/cjs/sudoKeyManager/keyData.js +46 -0
  28. package/cjs/sudoKeyManager/keyData.js.map +1 -0
  29. package/cjs/sudoKeyManager/publicKey.js +9 -0
  30. package/cjs/sudoKeyManager/publicKey.js.map +1 -0
  31. package/cjs/sudoKeyManager/sudoCryptoProvider.js +12 -0
  32. package/cjs/sudoKeyManager/sudoCryptoProvider.js.map +1 -0
  33. package/cjs/sudoKeyManager/sudoKeyManager.js +140 -0
  34. package/cjs/sudoKeyManager/sudoKeyManager.js.map +1 -0
  35. package/cjs/types/types.js +45 -0
  36. package/cjs/types/types.js.map +1 -0
  37. package/cjs/utils/base64.js +71 -0
  38. package/cjs/utils/base64.js.map +1 -0
  39. package/cjs/utils/buffer.js +37 -0
  40. package/cjs/utils/buffer.js.map +1 -0
  41. package/cjs/utils/stream.js +70 -0
  42. package/cjs/utils/stream.js.map +1 -0
  43. package/lib/configurationManager/defaultConfigurationManager.js +106 -156
  44. package/lib/configurationManager/defaultConfigurationManager.js.map +1 -0
  45. package/lib/errors/error.js +226 -438
  46. package/lib/errors/error.js.map +1 -0
  47. package/lib/index.js +10 -109
  48. package/lib/index.js.map +1 -0
  49. package/lib/logging/bunyanLogger.js +29 -41
  50. package/lib/logging/bunyanLogger.js.map +1 -0
  51. package/lib/logging/logger.js +66 -92
  52. package/lib/logging/logger.js.map +1 -0
  53. package/lib/sudoKeyArchive/index.js +5 -57
  54. package/lib/sudoKeyArchive/index.js.map +1 -0
  55. package/lib/sudoKeyArchive/keyArchive.js +69 -96
  56. package/lib/sudoKeyArchive/keyArchive.js.map +1 -0
  57. package/lib/sudoKeyArchive/keyInfo.js +11 -49
  58. package/lib/sudoKeyArchive/keyInfo.js.map +1 -0
  59. package/lib/sudoKeyArchive/keyType.js +27 -37
  60. package/lib/sudoKeyArchive/keyType.js.map +1 -0
  61. package/lib/sudoKeyArchive/sudoKeyArchive.js +351 -444
  62. package/lib/sudoKeyArchive/sudoKeyArchive.js.map +1 -0
  63. package/lib/sudoKeyManager/index.js +5 -57
  64. package/lib/sudoKeyManager/index.js.map +1 -0
  65. package/lib/sudoKeyManager/keyData.js +38 -33
  66. package/lib/sudoKeyManager/keyData.js.map +1 -0
  67. package/lib/sudoKeyManager/publicKey.js +5 -12
  68. package/lib/sudoKeyManager/publicKey.js.map +1 -0
  69. package/lib/sudoKeyManager/sudoCryptoProvider.js +8 -26
  70. package/lib/sudoKeyManager/sudoCryptoProvider.js.map +1 -0
  71. package/lib/sudoKeyManager/sudoKeyManager.js +135 -173
  72. package/lib/sudoKeyManager/sudoKeyManager.js.map +1 -0
  73. package/lib/types/types.js +27 -33
  74. package/lib/types/types.js.map +1 -0
  75. package/lib/utils/base64.js +63 -93
  76. package/lib/utils/base64.js.map +1 -0
  77. package/lib/utils/buffer.js +28 -46
  78. package/lib/utils/buffer.js.map +1 -0
  79. package/lib/utils/stream.js +63 -0
  80. package/lib/utils/stream.js.map +1 -0
  81. package/package.json +45 -28
  82. package/{lib → types}/configurationManager/defaultConfigurationManager.d.ts +0 -0
  83. package/{lib → types}/errors/error.d.ts +0 -0
  84. package/{lib → types}/index.d.ts +1 -0
  85. package/{lib → types}/logging/bunyanLogger.d.ts +0 -0
  86. package/{lib → types}/logging/logger.d.ts +0 -0
  87. package/{lib → types}/sudoKeyArchive/index.d.ts +0 -0
  88. package/{lib → types}/sudoKeyArchive/keyArchive.d.ts +8 -8
  89. package/{lib → types}/sudoKeyArchive/keyInfo.d.ts +0 -0
  90. package/{lib → types}/sudoKeyArchive/keyType.d.ts +0 -0
  91. package/{lib → types}/sudoKeyArchive/sudoKeyArchive.d.ts +0 -0
  92. package/{lib → types}/sudoKeyManager/index.d.ts +0 -0
  93. package/{lib → types}/sudoKeyManager/keyData.d.ts +0 -0
  94. package/{lib → types}/sudoKeyManager/publicKey.d.ts +0 -0
  95. package/{lib → types}/sudoKeyManager/sudoCryptoProvider.d.ts +0 -0
  96. package/{lib → types}/sudoKeyManager/sudoKeyManager.d.ts +0 -0
  97. package/{lib → types}/types/types.d.ts +1 -1
  98. package/{lib → types}/utils/base64.d.ts +0 -0
  99. package/{lib → types}/utils/buffer.d.ts +0 -0
  100. package/types/utils/stream.d.ts +6 -0
@@ -1,168 +1,118 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.DefaultConfigurationManager = void 0;
7
-
8
- var _Either = require("fp-ts/lib/Either");
9
-
10
- var _pipeable = require("fp-ts/lib/pipeable");
11
-
12
- var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
13
-
14
- var _PathReporter = require("io-ts/lib/PathReporter");
15
-
16
- var _error = require("../errors/error");
17
-
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
21
-
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
3
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
4
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
5
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
6
+ import { fold, left } from 'fp-ts/lib/Either';
7
+ import { pipe } from 'fp-ts/lib/pipeable';
8
+ import { PathReporter } from 'io-ts/lib/PathReporter';
9
+ import { ConfigurationNotSetError, DecodeError, ConfigurationSetNotFoundError, FatalError, } from '../errors/error';
10
+ import { S3Client, ListObjectsCommand, GetObjectCommand, } from '@aws-sdk/client-s3';
11
+ import { bodyToString } from '../utils/stream';
22
12
  /**
23
13
  * Singleton to manage configuration
24
14
  */
25
- class DefaultConfigurationManager {
26
- constructor() {// Do Nothing.
27
-
28
- _defineProperty(this, "_config", void 0);
29
- }
30
-
31
- static getInstance() {
32
- if (!DefaultConfigurationManager.instance) {
33
- DefaultConfigurationManager.instance = new DefaultConfigurationManager();
15
+ export class DefaultConfigurationManager {
16
+ constructor() {
17
+ // Do Nothing.
34
18
  }
35
-
36
- return DefaultConfigurationManager.instance;
37
- }
38
-
39
- setConfig(config) {
40
- this._config = config;
41
- return DefaultConfigurationManager.instance;
42
- }
43
-
44
- getConfigSet(namespace) {
45
- if (!this._config) {
46
- throw new _error.ConfigurationNotSetError();
19
+ static getInstance() {
20
+ if (!DefaultConfigurationManager.instance) {
21
+ DefaultConfigurationManager.instance = new DefaultConfigurationManager();
22
+ }
23
+ return DefaultConfigurationManager.instance;
47
24
  }
48
-
49
- const parsed = JSON.parse(this._config);
50
- const configSet = namespace ? parsed[namespace] : parsed;
51
- return configSet;
52
- }
53
-
54
- bind(configSet, codec) {
55
- // Decode and validate config
56
- return (0, _pipeable.pipe)(codec.decode(configSet), (0, _Either.fold)(errors => {
57
- throw new _error.DecodeError(_PathReporter.PathReporter.report((0, _Either.left)(errors)).join('\n'));
58
- }, v => v));
59
- }
60
-
61
- bindConfigSet(codec, namespace) {
62
- const configSet = this.getConfigSet(namespace);
63
-
64
- if (!configSet) {
65
- throw new _error.ConfigurationSetNotFoundError(namespace);
25
+ setConfig(config) {
26
+ this._config = config;
27
+ return DefaultConfigurationManager.instance;
66
28
  }
67
-
68
- return this.bind(configSet, codec);
69
- }
70
-
71
- async validateConfig() {
72
- var _config$identityServi, _config$identityServi2, _objects$Contents;
73
-
74
- if (!this._config) {
75
- return {
76
- incompatible: [],
77
- deprecated: []
78
- };
29
+ getConfigSet(namespace) {
30
+ if (!this._config) {
31
+ throw new ConfigurationNotSetError();
32
+ }
33
+ const parsed = JSON.parse(this._config);
34
+ const configSet = namespace ? parsed[namespace] : parsed;
35
+ return configSet;
79
36
  }
80
-
81
- const config = JSON.parse(this._config);
82
- const region = (_config$identityServi = config.identityService) === null || _config$identityServi === void 0 ? void 0 : _config$identityServi.region;
83
- const bucket = (_config$identityServi2 = config.identityService) === null || _config$identityServi2 === void 0 ? void 0 : _config$identityServi2.serviceInfoBucket;
84
-
85
- if (!(region && bucket)) {
86
- return {
87
- incompatible: [],
88
- deprecated: []
89
- };
37
+ bind(configSet, codec) {
38
+ // Decode and validate config
39
+ return pipe(codec.decode(configSet), fold((errors) => {
40
+ throw new DecodeError(PathReporter.report(left(errors)).join('\n'));
41
+ }, (v) => v));
90
42
  }
91
-
92
- const s3Client = new _s.default({
93
- region: region
94
- });
95
- const incompatible = [];
96
- const deprecated = [];
97
- const objects = await s3Client.makeUnauthenticatedRequest('listObjects', {
98
- Bucket: bucket
99
- }).promise();
100
-
101
- if (!((_objects$Contents = objects.Contents) !== null && _objects$Contents !== void 0 && _objects$Contents.length)) {
102
- return {
103
- incompatible: [],
104
- deprecated: []
105
- };
43
+ bindConfigSet(codec, namespace) {
44
+ const configSet = this.getConfigSet(namespace);
45
+ if (!configSet) {
46
+ throw new ConfigurationSetNotFoundError(namespace);
47
+ }
48
+ return this.bind(configSet, codec);
106
49
  }
107
-
108
- const keys = objects.Contents.map(object => object.Key); // Only fetch the service info docs for the services that are present in client config
109
- // to minimize the network calls.
110
-
111
- const keysToFetch = keys.filter(key => key.endsWith('.json') && config[key.replace('.json', '')]);
112
-
113
- for (const key of keysToFetch) {
114
- const object = await s3Client.makeUnauthenticatedRequest('getObject', {
115
- Key: key,
116
- Bucket: bucket
117
- }).promise();
118
- let body;
119
-
120
- if (typeof object.Body === 'string') {
121
- body = object.Body;
122
- } else if (ArrayBuffer.isView(object.Body)) {
123
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
124
- body = new TextDecoder().decode(object.Body);
125
- } else {
126
- continue;
127
- }
128
-
129
- const json = JSON.parse(body);
130
- const serviceName = key.replace('.json', '');
131
- const serviceInfo = json[serviceName];
132
- const serviceConfig = config[serviceName];
133
-
134
- if (serviceInfo && serviceConfig) {
135
- const currentVersion = serviceConfig.version ?? 1;
136
- const deprecationGrace = serviceInfo.deprecationGrace ?? -1;
137
- const compatibilityInfo = {
138
- name: serviceName,
139
- configVersion: currentVersion,
140
- minSupportedVersion: serviceInfo.minVersion,
141
- deprecatedVersion: serviceInfo.deprecated,
142
- deprecationGrace: deprecationGrace != -1 ? new Date(deprecationGrace) : undefined
143
- }; // If the service config in `sudoplatformconfig.json` is less than the
144
- // minimum supported version then the client is incompatible.
145
-
146
- if (currentVersion < (compatibilityInfo.minSupportedVersion ?? 0)) {
147
- incompatible.push(compatibilityInfo);
148
- } // If the service config is less than or equal to the deprecated version
149
- // then it will be made incompatible after the deprecation grace.
150
-
151
-
152
- if (currentVersion <= (compatibilityInfo.deprecatedVersion ?? 0)) {
153
- deprecated.push(compatibilityInfo);
50
+ async validateConfig() {
51
+ if (!this._config) {
52
+ return { incompatible: [], deprecated: [] };
53
+ }
54
+ const config = JSON.parse(this._config);
55
+ const region = config.identityService?.region;
56
+ const bucket = config.identityService?.serviceInfoBucket;
57
+ if (!(region && bucket)) {
58
+ return { incompatible: [], deprecated: [] };
59
+ }
60
+ const s3Client = new S3Client({
61
+ region: region,
62
+ // We want these request to be unauthenticated
63
+ // so we provide a no-op signer for the requests
64
+ signer: { sign: (request) => Promise.resolve(request) },
65
+ });
66
+ const incompatible = [];
67
+ const deprecated = [];
68
+ const listObjectsCommand = new ListObjectsCommand({
69
+ Bucket: bucket,
70
+ });
71
+ const objects = await s3Client.send(listObjectsCommand);
72
+ if (!objects.Contents?.length) {
73
+ return { incompatible: [], deprecated: [] };
74
+ }
75
+ const keys = objects.Contents.map((object) => object.Key);
76
+ // Only fetch the service info docs for the services that are present in client config
77
+ // to minimize the network calls.
78
+ const keysToFetch = keys.filter((key) => key.endsWith('.json') && config[key.replace('.json', '')]);
79
+ for (const key of keysToFetch) {
80
+ const getObject = new GetObjectCommand({
81
+ Key: key,
82
+ Bucket: bucket,
83
+ });
84
+ const object = await s3Client.send(getObject);
85
+ if (!object.Body) {
86
+ throw new FatalError('No S3 object body');
87
+ }
88
+ const body = await bodyToString(object.Body);
89
+ const json = JSON.parse(body);
90
+ const serviceName = key.replace('.json', '');
91
+ const serviceInfo = json[serviceName];
92
+ const serviceConfig = config[serviceName];
93
+ if (serviceInfo && serviceConfig) {
94
+ const currentVersion = serviceConfig.version ?? 1;
95
+ const deprecationGrace = serviceInfo.deprecationGrace ?? -1;
96
+ const compatibilityInfo = {
97
+ name: serviceName,
98
+ configVersion: currentVersion,
99
+ minSupportedVersion: serviceInfo.minVersion,
100
+ deprecatedVersion: serviceInfo.deprecated,
101
+ deprecationGrace: deprecationGrace != -1 ? new Date(deprecationGrace) : undefined,
102
+ };
103
+ // If the service config in `sudoplatformconfig.json` is less than the
104
+ // minimum supported version then the client is incompatible.
105
+ if (currentVersion < (compatibilityInfo.minSupportedVersion ?? 0)) {
106
+ incompatible.push(compatibilityInfo);
107
+ }
108
+ // If the service config is less than or equal to the deprecated version
109
+ // then it will be made incompatible after the deprecation grace.
110
+ if (currentVersion <= (compatibilityInfo.deprecatedVersion ?? 0)) {
111
+ deprecated.push(compatibilityInfo);
112
+ }
113
+ }
154
114
  }
155
- }
115
+ return { incompatible, deprecated };
156
116
  }
157
-
158
- return {
159
- incompatible,
160
- deprecated
161
- };
162
- }
163
-
164
117
  }
165
-
166
- exports.DefaultConfigurationManager = DefaultConfigurationManager;
167
-
168
- _defineProperty(DefaultConfigurationManager, "instance", void 0);
118
+ //# sourceMappingURL=defaultConfigurationManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultConfigurationManager.js","sourceRoot":"","sources":["../../src/configurationManager/defaultConfigurationManager.ts"],"names":[],"mappings":"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"}