@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.
- package/bin/outdated-with-suppression.sh +203 -0
- package/bin/suppress-audit.sh +15 -0
- package/bin/suppress-outdated.sh +60 -0
- package/bin/yarn-audit-with-suppression.sh +19 -0
- package/cjs/configurationManager/defaultConfigurationManager.js +122 -0
- package/cjs/configurationManager/defaultConfigurationManager.js.map +1 -0
- package/cjs/errors/error.js +442 -0
- package/cjs/errors/error.js.map +1 -0
- package/cjs/index.js +13 -0
- package/cjs/index.js.map +1 -0
- package/cjs/logging/bunyanLogger.js +36 -0
- package/cjs/logging/bunyanLogger.js.map +1 -0
- package/cjs/logging/logger.js +77 -0
- package/cjs/logging/logger.js.map +1 -0
- package/cjs/sudoKeyArchive/index.js +8 -0
- package/cjs/sudoKeyArchive/index.js.map +1 -0
- package/cjs/sudoKeyArchive/keyArchive.js +84 -0
- package/cjs/sudoKeyArchive/keyArchive.js.map +1 -0
- package/cjs/sudoKeyArchive/keyInfo.js +17 -0
- package/cjs/sudoKeyArchive/keyInfo.js.map +1 -0
- package/cjs/sudoKeyArchive/keyType.js +39 -0
- package/cjs/sudoKeyArchive/keyType.js.map +1 -0
- package/cjs/sudoKeyArchive/sudoKeyArchive.js +373 -0
- package/cjs/sudoKeyArchive/sudoKeyArchive.js.map +1 -0
- package/cjs/sudoKeyManager/index.js +8 -0
- package/cjs/sudoKeyManager/index.js.map +1 -0
- package/cjs/sudoKeyManager/keyData.js +46 -0
- package/cjs/sudoKeyManager/keyData.js.map +1 -0
- package/cjs/sudoKeyManager/publicKey.js +9 -0
- package/cjs/sudoKeyManager/publicKey.js.map +1 -0
- package/cjs/sudoKeyManager/sudoCryptoProvider.js +12 -0
- package/cjs/sudoKeyManager/sudoCryptoProvider.js.map +1 -0
- package/cjs/sudoKeyManager/sudoKeyManager.js +140 -0
- package/cjs/sudoKeyManager/sudoKeyManager.js.map +1 -0
- package/cjs/types/types.js +45 -0
- package/cjs/types/types.js.map +1 -0
- package/cjs/utils/base64.js +71 -0
- package/cjs/utils/base64.js.map +1 -0
- package/cjs/utils/buffer.js +37 -0
- package/cjs/utils/buffer.js.map +1 -0
- package/cjs/utils/stream.js +70 -0
- package/cjs/utils/stream.js.map +1 -0
- package/lib/configurationManager/defaultConfigurationManager.js +106 -156
- package/lib/configurationManager/defaultConfigurationManager.js.map +1 -0
- package/lib/errors/error.js +226 -438
- package/lib/errors/error.js.map +1 -0
- package/lib/index.js +10 -109
- package/lib/index.js.map +1 -0
- package/lib/logging/bunyanLogger.js +29 -41
- package/lib/logging/bunyanLogger.js.map +1 -0
- package/lib/logging/logger.js +66 -92
- package/lib/logging/logger.js.map +1 -0
- package/lib/sudoKeyArchive/index.js +5 -57
- package/lib/sudoKeyArchive/index.js.map +1 -0
- package/lib/sudoKeyArchive/keyArchive.js +69 -96
- package/lib/sudoKeyArchive/keyArchive.js.map +1 -0
- package/lib/sudoKeyArchive/keyInfo.js +11 -49
- package/lib/sudoKeyArchive/keyInfo.js.map +1 -0
- package/lib/sudoKeyArchive/keyType.js +27 -37
- package/lib/sudoKeyArchive/keyType.js.map +1 -0
- package/lib/sudoKeyArchive/sudoKeyArchive.js +351 -444
- package/lib/sudoKeyArchive/sudoKeyArchive.js.map +1 -0
- package/lib/sudoKeyManager/index.js +5 -57
- package/lib/sudoKeyManager/index.js.map +1 -0
- package/lib/sudoKeyManager/keyData.js +38 -33
- package/lib/sudoKeyManager/keyData.js.map +1 -0
- package/lib/sudoKeyManager/publicKey.js +5 -12
- package/lib/sudoKeyManager/publicKey.js.map +1 -0
- package/lib/sudoKeyManager/sudoCryptoProvider.js +8 -26
- package/lib/sudoKeyManager/sudoCryptoProvider.js.map +1 -0
- package/lib/sudoKeyManager/sudoKeyManager.js +135 -173
- package/lib/sudoKeyManager/sudoKeyManager.js.map +1 -0
- package/lib/types/types.js +27 -33
- package/lib/types/types.js.map +1 -0
- package/lib/utils/base64.js +63 -93
- package/lib/utils/base64.js.map +1 -0
- package/lib/utils/buffer.js +28 -46
- package/lib/utils/buffer.js.map +1 -0
- package/lib/utils/stream.js +63 -0
- package/lib/utils/stream.js.map +1 -0
- package/package.json +45 -28
- package/{lib → types}/configurationManager/defaultConfigurationManager.d.ts +0 -0
- package/{lib → types}/errors/error.d.ts +0 -0
- package/{lib → types}/index.d.ts +1 -0
- package/{lib → types}/logging/bunyanLogger.d.ts +0 -0
- package/{lib → types}/logging/logger.d.ts +0 -0
- package/{lib → types}/sudoKeyArchive/index.d.ts +0 -0
- package/{lib → types}/sudoKeyArchive/keyArchive.d.ts +8 -8
- package/{lib → types}/sudoKeyArchive/keyInfo.d.ts +0 -0
- package/{lib → types}/sudoKeyArchive/keyType.d.ts +0 -0
- package/{lib → types}/sudoKeyArchive/sudoKeyArchive.d.ts +0 -0
- package/{lib → types}/sudoKeyManager/index.d.ts +0 -0
- package/{lib → types}/sudoKeyManager/keyData.d.ts +0 -0
- package/{lib → types}/sudoKeyManager/publicKey.d.ts +0 -0
- package/{lib → types}/sudoKeyManager/sudoCryptoProvider.d.ts +0 -0
- package/{lib → types}/sudoKeyManager/sudoKeyManager.d.ts +0 -0
- package/{lib → types}/types/types.d.ts +1 -1
- package/{lib → types}/utils/base64.d.ts +0 -0
- package/{lib → types}/utils/buffer.d.ts +0 -0
- package/types/utils/stream.d.ts +6 -0
|
@@ -1,168 +1,118 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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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"}
|