@openstax/ts-utils 1.21.9 → 1.21.11
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/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -11
- package/dist/cjs/assertions/index.d.ts +0 -85
- package/dist/cjs/assertions/index.js +0 -157
- package/dist/cjs/aws/ssmService.d.ts +0 -5
- package/dist/cjs/aws/ssmService.js +0 -9
- package/dist/cjs/config/awsParameterConfig.d.ts +0 -10
- package/dist/cjs/config/awsParameterConfig.js +0 -26
- package/dist/cjs/config/envConfig.d.ts +0 -24
- package/dist/cjs/config/envConfig.js +0 -57
- package/dist/cjs/config/index.d.ts +0 -48
- package/dist/cjs/config/index.js +0 -35
- package/dist/cjs/config/lambdaParameterConfig.d.ts +0 -12
- package/dist/cjs/config/lambdaParameterConfig.js +0 -45
- package/dist/cjs/config/replaceConfig.d.ts +0 -14
- package/dist/cjs/config/replaceConfig.js +0 -22
- package/dist/cjs/config/resolveConfigValue.d.ts +0 -5
- package/dist/cjs/config/resolveConfigValue.js +0 -12
- package/dist/cjs/errors/index.d.ts +0 -66
- package/dist/cjs/errors/index.js +0 -95
- package/dist/cjs/fetch/fetchStatusRetry.d.ts +0 -7
- package/dist/cjs/fetch/fetchStatusRetry.js +0 -16
- package/dist/cjs/fetch/index.d.ts +0 -64
- package/dist/cjs/fetch/index.js +0 -55
- package/dist/cjs/guards/index.d.ts +0 -30
- package/dist/cjs/guards/index.js +0 -35
- package/dist/cjs/index.d.ts +0 -4
- package/dist/cjs/index.js +0 -20
- package/dist/cjs/middleware/apiErrorHandler.d.ts +0 -23
- package/dist/cjs/middleware/apiErrorHandler.js +0 -40
- package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +0 -23
- package/dist/cjs/middleware/apiSlowResponseMiddleware.js +0 -54
- package/dist/cjs/middleware/index.d.ts +0 -47
- package/dist/cjs/middleware/index.js +0 -48
- package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
- package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +0 -42
- package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +0 -4
- package/dist/cjs/middleware/throwNotFoundMiddleware.js +0 -14
- package/dist/cjs/misc/hashValue.d.ts +0 -10
- package/dist/cjs/misc/hashValue.js +0 -17
- package/dist/cjs/misc/helpers.d.ts +0 -124
- package/dist/cjs/misc/helpers.js +0 -214
- package/dist/cjs/misc/merge.d.ts +0 -21
- package/dist/cjs/misc/merge.js +0 -45
- package/dist/cjs/misc/partitionSequence.d.ts +0 -35
- package/dist/cjs/misc/partitionSequence.js +0 -55
- package/dist/cjs/pagination/index.d.ts +0 -91
- package/dist/cjs/pagination/index.js +0 -83
- package/dist/cjs/routing/helpers.d.ts +0 -57
- package/dist/cjs/routing/helpers.js +0 -90
- package/dist/cjs/routing/index.d.ts +0 -272
- package/dist/cjs/routing/index.js +0 -270
- package/dist/cjs/routing/validators/zod.d.ts +0 -4
- package/dist/cjs/routing/validators/zod.js +0 -12
- package/dist/cjs/services/accountsGateway/index.d.ts +0 -85
- package/dist/cjs/services/accountsGateway/index.js +0 -118
- package/dist/cjs/services/apiGateway/index.d.ts +0 -59
- package/dist/cjs/services/apiGateway/index.js +0 -96
- package/dist/cjs/services/authProvider/browser.d.ts +0 -74
- package/dist/cjs/services/authProvider/browser.js +0 -154
- package/dist/cjs/services/authProvider/decryption.d.ts +0 -19
- package/dist/cjs/services/authProvider/decryption.js +0 -61
- package/dist/cjs/services/authProvider/index.d.ts +0 -61
- package/dist/cjs/services/authProvider/index.js +0 -26
- package/dist/cjs/services/authProvider/subrequest.d.ts +0 -16
- package/dist/cjs/services/authProvider/subrequest.js +0 -50
- package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +0 -29
- package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +0 -91
- package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
- package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.js +0 -47
- package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +0 -13
- package/dist/cjs/services/authProvider/utils/userRoleValidator.js +0 -37
- package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +0 -10
- package/dist/cjs/services/documentStore/dynamoEncoding.js +0 -52
- package/dist/cjs/services/documentStore/index.d.ts +0 -14
- package/dist/cjs/services/documentStore/index.js +0 -2
- package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +0 -16
- package/dist/cjs/services/documentStore/unversioned/dynamodb.js +0 -122
- package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +0 -18
- package/dist/cjs/services/documentStore/unversioned/file-system.js +0 -121
- package/dist/cjs/services/documentStore/unversioned/index.d.ts +0 -2
- package/dist/cjs/services/documentStore/unversioned/index.js +0 -2
- package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +0 -22
- package/dist/cjs/services/documentStore/versioned/dynamodb.js +0 -135
- package/dist/cjs/services/documentStore/versioned/file-system.d.ts +0 -24
- package/dist/cjs/services/documentStore/versioned/file-system.js +0 -62
- package/dist/cjs/services/documentStore/versioned/index.d.ts +0 -17
- package/dist/cjs/services/documentStore/versioned/index.js +0 -2
- package/dist/cjs/services/exercisesGateway/index.d.ts +0 -71
- package/dist/cjs/services/exercisesGateway/index.js +0 -97
- package/dist/cjs/services/fileServer/index.d.ts +0 -19
- package/dist/cjs/services/fileServer/index.js +0 -19
- package/dist/cjs/services/fileServer/localFileServer.d.ts +0 -17
- package/dist/cjs/services/fileServer/localFileServer.js +0 -80
- package/dist/cjs/services/fileServer/s3FileServer.d.ts +0 -16
- package/dist/cjs/services/fileServer/s3FileServer.js +0 -49
- package/dist/cjs/services/launchParams/index.d.ts +0 -2
- package/dist/cjs/services/launchParams/index.js +0 -7
- package/dist/cjs/services/launchParams/signer.d.ts +0 -27
- package/dist/cjs/services/launchParams/signer.js +0 -58
- package/dist/cjs/services/launchParams/verifier.d.ts +0 -22
- package/dist/cjs/services/launchParams/verifier.js +0 -94
- package/dist/cjs/services/logger/console.d.ts +0 -4
- package/dist/cjs/services/logger/console.js +0 -12
- package/dist/cjs/services/logger/index.d.ts +0 -39
- package/dist/cjs/services/logger/index.js +0 -31
- package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
- package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +0 -21
- package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +0 -70
- package/dist/cjs/services/lrsGateway/attempt-utils.js +0 -258
- package/dist/cjs/services/lrsGateway/file-system.d.ts +0 -17
- package/dist/cjs/services/lrsGateway/file-system.js +0 -140
- package/dist/cjs/services/lrsGateway/index.d.ts +0 -125
- package/dist/cjs/services/lrsGateway/index.js +0 -138
- package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +0 -61
- package/dist/cjs/services/lrsGateway/xapiUtils.js +0 -94
- package/dist/cjs/services/postgresConnection/index.d.ts +0 -35
- package/dist/cjs/services/postgresConnection/index.js +0 -65
- package/dist/cjs/services/searchProvider/index.d.ts +0 -31
- package/dist/cjs/services/searchProvider/index.js +0 -2
- package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +0 -14
- package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +0 -89
- package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +0 -1
- package/dist/cjs/types.d.ts +0 -31
- package/dist/cjs/types.js +0 -2
- package/dist/esm/assertions/index.d.ts +0 -85
- package/dist/esm/assertions/index.js +0 -146
- package/dist/esm/aws/ssmService.d.ts +0 -5
- package/dist/esm/aws/ssmService.js +0 -6
- package/dist/esm/config/awsParameterConfig.d.ts +0 -10
- package/dist/esm/config/awsParameterConfig.js +0 -22
- package/dist/esm/config/envConfig.d.ts +0 -24
- package/dist/esm/config/envConfig.js +0 -53
- package/dist/esm/config/index.d.ts +0 -48
- package/dist/esm/config/index.js +0 -17
- package/dist/esm/config/lambdaParameterConfig.d.ts +0 -12
- package/dist/esm/config/lambdaParameterConfig.js +0 -38
- package/dist/esm/config/replaceConfig.d.ts +0 -14
- package/dist/esm/config/replaceConfig.js +0 -18
- package/dist/esm/config/resolveConfigValue.d.ts +0 -5
- package/dist/esm/config/resolveConfigValue.js +0 -8
- package/dist/esm/errors/index.d.ts +0 -66
- package/dist/esm/errors/index.js +0 -86
- package/dist/esm/fetch/fetchStatusRetry.d.ts +0 -7
- package/dist/esm/fetch/fetchStatusRetry.js +0 -12
- package/dist/esm/fetch/index.d.ts +0 -64
- package/dist/esm/fetch/index.js +0 -46
- package/dist/esm/guards/index.d.ts +0 -30
- package/dist/esm/guards/index.js +0 -28
- package/dist/esm/index.d.ts +0 -4
- package/dist/esm/index.js +0 -4
- package/dist/esm/middleware/apiErrorHandler.d.ts +0 -23
- package/dist/esm/middleware/apiErrorHandler.js +0 -36
- package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +0 -23
- package/dist/esm/middleware/apiSlowResponseMiddleware.js +0 -50
- package/dist/esm/middleware/index.d.ts +0 -47
- package/dist/esm/middleware/index.js +0 -44
- package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
- package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +0 -38
- package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +0 -4
- package/dist/esm/middleware/throwNotFoundMiddleware.js +0 -10
- package/dist/esm/misc/hashValue.d.ts +0 -10
- package/dist/esm/misc/hashValue.js +0 -13
- package/dist/esm/misc/helpers.d.ts +0 -124
- package/dist/esm/misc/helpers.js +0 -199
- package/dist/esm/misc/merge.d.ts +0 -21
- package/dist/esm/misc/merge.js +0 -40
- package/dist/esm/misc/partitionSequence.d.ts +0 -35
- package/dist/esm/misc/partitionSequence.js +0 -48
- package/dist/esm/pagination/index.d.ts +0 -91
- package/dist/esm/pagination/index.js +0 -77
- package/dist/esm/routing/helpers.d.ts +0 -57
- package/dist/esm/routing/helpers.js +0 -83
- package/dist/esm/routing/index.d.ts +0 -272
- package/dist/esm/routing/index.js +0 -232
- package/dist/esm/routing/validators/zod.d.ts +0 -4
- package/dist/esm/routing/validators/zod.js +0 -8
- package/dist/esm/services/accountsGateway/index.d.ts +0 -85
- package/dist/esm/services/accountsGateway/index.js +0 -111
- package/dist/esm/services/apiGateway/index.d.ts +0 -59
- package/dist/esm/services/apiGateway/index.js +0 -65
- package/dist/esm/services/authProvider/browser.d.ts +0 -74
- package/dist/esm/services/authProvider/browser.js +0 -150
- package/dist/esm/services/authProvider/decryption.d.ts +0 -19
- package/dist/esm/services/authProvider/decryption.js +0 -57
- package/dist/esm/services/authProvider/index.d.ts +0 -61
- package/dist/esm/services/authProvider/index.js +0 -18
- package/dist/esm/services/authProvider/subrequest.d.ts +0 -16
- package/dist/esm/services/authProvider/subrequest.js +0 -43
- package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +0 -29
- package/dist/esm/services/authProvider/utils/decryptAndVerify.js +0 -85
- package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
- package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +0 -40
- package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +0 -13
- package/dist/esm/services/authProvider/utils/userRoleValidator.js +0 -33
- package/dist/esm/services/documentStore/dynamoEncoding.d.ts +0 -10
- package/dist/esm/services/documentStore/dynamoEncoding.js +0 -45
- package/dist/esm/services/documentStore/index.d.ts +0 -14
- package/dist/esm/services/documentStore/index.js +0 -1
- package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +0 -16
- package/dist/esm/services/documentStore/unversioned/dynamodb.js +0 -118
- package/dist/esm/services/documentStore/unversioned/file-system.d.ts +0 -18
- package/dist/esm/services/documentStore/unversioned/file-system.js +0 -91
- package/dist/esm/services/documentStore/unversioned/index.d.ts +0 -2
- package/dist/esm/services/documentStore/unversioned/index.js +0 -1
- package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +0 -22
- package/dist/esm/services/documentStore/versioned/dynamodb.js +0 -131
- package/dist/esm/services/documentStore/versioned/file-system.d.ts +0 -24
- package/dist/esm/services/documentStore/versioned/file-system.js +0 -58
- package/dist/esm/services/documentStore/versioned/index.d.ts +0 -17
- package/dist/esm/services/documentStore/versioned/index.js +0 -1
- package/dist/esm/services/exercisesGateway/index.d.ts +0 -71
- package/dist/esm/services/exercisesGateway/index.js +0 -70
- package/dist/esm/services/fileServer/index.d.ts +0 -19
- package/dist/esm/services/fileServer/index.js +0 -13
- package/dist/esm/services/fileServer/localFileServer.d.ts +0 -17
- package/dist/esm/services/fileServer/localFileServer.js +0 -73
- package/dist/esm/services/fileServer/s3FileServer.d.ts +0 -16
- package/dist/esm/services/fileServer/s3FileServer.js +0 -45
- package/dist/esm/services/launchParams/index.d.ts +0 -2
- package/dist/esm/services/launchParams/index.js +0 -2
- package/dist/esm/services/launchParams/signer.d.ts +0 -27
- package/dist/esm/services/launchParams/signer.js +0 -51
- package/dist/esm/services/launchParams/verifier.d.ts +0 -22
- package/dist/esm/services/launchParams/verifier.js +0 -67
- package/dist/esm/services/logger/console.d.ts +0 -4
- package/dist/esm/services/logger/console.js +0 -8
- package/dist/esm/services/logger/index.d.ts +0 -39
- package/dist/esm/services/logger/index.js +0 -27
- package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
- package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +0 -14
- package/dist/esm/services/lrsGateway/attempt-utils.d.ts +0 -70
- package/dist/esm/services/lrsGateway/attempt-utils.js +0 -236
- package/dist/esm/services/lrsGateway/file-system.d.ts +0 -17
- package/dist/esm/services/lrsGateway/file-system.js +0 -110
- package/dist/esm/services/lrsGateway/index.d.ts +0 -125
- package/dist/esm/services/lrsGateway/index.js +0 -111
- package/dist/esm/services/lrsGateway/xapiUtils.d.ts +0 -61
- package/dist/esm/services/lrsGateway/xapiUtils.js +0 -84
- package/dist/esm/services/postgresConnection/index.d.ts +0 -35
- package/dist/esm/services/postgresConnection/index.js +0 -58
- package/dist/esm/services/searchProvider/index.d.ts +0 -31
- package/dist/esm/services/searchProvider/index.js +0 -1
- package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +0 -14
- package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +0 -85
- package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +0 -1
- package/dist/esm/types.d.ts +0 -31
- package/dist/esm/types.js +0 -1
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.fileSystemVersionedDocumentStore = void 0;
|
|
4
|
-
const file_system_1 = require("../unversioned/file-system");
|
|
5
|
-
const PAGE_LIMIT = 5;
|
|
6
|
-
const fileSystemVersionedDocumentStore = (initializer) => () => (configProvider) => (_, hashKey, getAuthor) => {
|
|
7
|
-
const unversionedDocuments = (0, file_system_1.fileSystemUnversionedDocumentStore)(initializer)()(configProvider)({}, 'id');
|
|
8
|
-
return {
|
|
9
|
-
loadAllDocumentsTheBadWay: () => {
|
|
10
|
-
return unversionedDocuments.loadAllDocumentsTheBadWay().then(documents => documents.map(document => {
|
|
11
|
-
return document.items[document.items.length - 1];
|
|
12
|
-
}));
|
|
13
|
-
},
|
|
14
|
-
getVersions: async (id, startVersion) => {
|
|
15
|
-
const item = await unversionedDocuments.getItem(id);
|
|
16
|
-
const versions = item === null || item === void 0 ? void 0 : item.items.reverse();
|
|
17
|
-
if (!versions) {
|
|
18
|
-
return undefined;
|
|
19
|
-
}
|
|
20
|
-
const startIndex = startVersion ? versions.findIndex(version => version.timestamp === startVersion) + 1 : 0;
|
|
21
|
-
const items = versions.slice(startIndex, startIndex + PAGE_LIMIT);
|
|
22
|
-
const hasMore = (startIndex + 5) < versions.length;
|
|
23
|
-
return {
|
|
24
|
-
items,
|
|
25
|
-
nextPageToken: hasMore ? items[items.length - 1].timestamp : undefined
|
|
26
|
-
};
|
|
27
|
-
},
|
|
28
|
-
getItem: async (id, timestamp) => {
|
|
29
|
-
const item = await unversionedDocuments.getItem(id);
|
|
30
|
-
if (timestamp) {
|
|
31
|
-
return item === null || item === void 0 ? void 0 : item.items.find(version => version.timestamp === timestamp);
|
|
32
|
-
}
|
|
33
|
-
return item ? item.items[item.items.length - 1] : undefined;
|
|
34
|
-
},
|
|
35
|
-
prepareItem: async (item, ...authorArgs) => {
|
|
36
|
-
// this getAuthor type is terrible
|
|
37
|
-
const author = getAuthor ? await getAuthor(...authorArgs) : authorArgs[0];
|
|
38
|
-
const timestamp = new Date().getTime();
|
|
39
|
-
return {
|
|
40
|
-
document: { ...item, timestamp, author },
|
|
41
|
-
save: async (changes) => {
|
|
42
|
-
var _a;
|
|
43
|
-
const document = { ...item, ...changes, timestamp, author };
|
|
44
|
-
const container = (_a = await unversionedDocuments.getItem(document[hashKey])) !== null && _a !== void 0 ? _a : { id: document[hashKey], items: [] };
|
|
45
|
-
const updated = { ...container, items: [...container.items, document] };
|
|
46
|
-
await unversionedDocuments.putItem(updated);
|
|
47
|
-
return document;
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
},
|
|
51
|
-
putItem: async (item, ...authorArgs) => {
|
|
52
|
-
var _a;
|
|
53
|
-
const author = getAuthor ? await getAuthor(...authorArgs) : authorArgs[0];
|
|
54
|
-
const document = { ...item, timestamp: new Date().getTime(), author };
|
|
55
|
-
const container = (_a = await unversionedDocuments.getItem(document[hashKey])) !== null && _a !== void 0 ? _a : { id: document[hashKey], items: [] };
|
|
56
|
-
const updated = { ...container, items: [...container.items, document] };
|
|
57
|
-
await unversionedDocuments.putItem(updated);
|
|
58
|
-
return document;
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
};
|
|
62
|
-
exports.fileSystemVersionedDocumentStore = fileSystemVersionedDocumentStore;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { TDocument } from '..';
|
|
2
|
-
import { dynamoVersionedDocumentStore } from './dynamodb';
|
|
3
|
-
export declare type VersionedDocumentAuthor = {
|
|
4
|
-
type: 'user';
|
|
5
|
-
uuid: string;
|
|
6
|
-
name: string;
|
|
7
|
-
reason?: string;
|
|
8
|
-
} | {
|
|
9
|
-
type: 'system';
|
|
10
|
-
reason: string;
|
|
11
|
-
};
|
|
12
|
-
export declare type VersionedDocumentRequiredFields = {
|
|
13
|
-
timestamp: number;
|
|
14
|
-
author: VersionedDocumentAuthor;
|
|
15
|
-
};
|
|
16
|
-
export declare type VersionedTDocument<T> = TDocument<T> & VersionedDocumentRequiredFields;
|
|
17
|
-
export declare type VersionedDocumentStoreCreator = typeof dynamoVersionedDocumentStore;
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { ConfigProviderForConfig } from '../../config';
|
|
2
|
-
import { GenericFetch } from '../../fetch';
|
|
3
|
-
export declare type Config = {
|
|
4
|
-
defaultCorrectness?: string;
|
|
5
|
-
exercisesHost: string;
|
|
6
|
-
exercisesAuthToken: string;
|
|
7
|
-
};
|
|
8
|
-
interface Initializer<C> {
|
|
9
|
-
configSpace?: C;
|
|
10
|
-
fetch: GenericFetch;
|
|
11
|
-
}
|
|
12
|
-
export declare type Answer = {
|
|
13
|
-
id: number;
|
|
14
|
-
content_html: string;
|
|
15
|
-
correctness?: string;
|
|
16
|
-
feedback_html?: string;
|
|
17
|
-
};
|
|
18
|
-
export declare type Solution = {
|
|
19
|
-
images: any[];
|
|
20
|
-
solution_type: string;
|
|
21
|
-
content_html: string;
|
|
22
|
-
};
|
|
23
|
-
export declare type Question = {
|
|
24
|
-
id: number;
|
|
25
|
-
is_answer_order_important: boolean;
|
|
26
|
-
stimulus_html: string;
|
|
27
|
-
stem_html: string;
|
|
28
|
-
answers: Answer[];
|
|
29
|
-
hints: string[];
|
|
30
|
-
formats: string[];
|
|
31
|
-
combo_choices: any[];
|
|
32
|
-
collaborator_solutions?: Solution[];
|
|
33
|
-
community_solutions?: Solution[];
|
|
34
|
-
};
|
|
35
|
-
export declare type Exercise = {
|
|
36
|
-
images: any[];
|
|
37
|
-
tags: string[];
|
|
38
|
-
uuid: string;
|
|
39
|
-
group_uuid: string;
|
|
40
|
-
number: number;
|
|
41
|
-
version: number;
|
|
42
|
-
uid: string;
|
|
43
|
-
published_at: string;
|
|
44
|
-
solutions_are_public: boolean;
|
|
45
|
-
authors: any[];
|
|
46
|
-
copyright_holders: any[];
|
|
47
|
-
derived_from: any[];
|
|
48
|
-
is_vocab: boolean;
|
|
49
|
-
questions: Question[];
|
|
50
|
-
delegations: any[];
|
|
51
|
-
versions: number[];
|
|
52
|
-
stimulus_html: string;
|
|
53
|
-
};
|
|
54
|
-
export declare type ExercisesSearchResults = {
|
|
55
|
-
total_count: number;
|
|
56
|
-
items: Exercise[];
|
|
57
|
-
};
|
|
58
|
-
export declare type ExercisesSearchResultsWithDigest = ExercisesSearchResults & {
|
|
59
|
-
digest: string;
|
|
60
|
-
};
|
|
61
|
-
export declare const exercisesGateway: <C extends string = "exercises">(initializer: Initializer<C>) => (configProvider: { [key in C]: {
|
|
62
|
-
defaultCorrectness?: import("../../config").ConfigValueProvider<string> | undefined;
|
|
63
|
-
exercisesHost: import("../../config").ConfigValueProvider<string>;
|
|
64
|
-
exercisesAuthToken: import("../../config").ConfigValueProvider<string>;
|
|
65
|
-
}; }) => (_: {}) => {
|
|
66
|
-
searchDigest: (query: string, page?: number, per_page?: number) => Promise<string>;
|
|
67
|
-
get: (uuid: string) => Promise<Exercise | undefined>;
|
|
68
|
-
search: (query: string, page?: number, per_page?: number) => Promise<ExercisesSearchResultsWithDigest>;
|
|
69
|
-
};
|
|
70
|
-
export declare type ExercisesGateway = ReturnType<ReturnType<ReturnType<typeof exercisesGateway>>>;
|
|
71
|
-
export {};
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.exercisesGateway = void 0;
|
|
27
|
-
const queryString = __importStar(require("query-string"));
|
|
28
|
-
const __1 = require("../..");
|
|
29
|
-
const assertions_1 = require("../../assertions");
|
|
30
|
-
const config_1 = require("../../config");
|
|
31
|
-
const guards_1 = require("../../guards");
|
|
32
|
-
const routing_1 = require("../../routing");
|
|
33
|
-
const exercisesGateway = (initializer) => (configProvider) => {
|
|
34
|
-
const config = configProvider[(0, guards_1.ifDefined)(initializer.configSpace, 'exercises')];
|
|
35
|
-
const exercisesHost = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.exercisesHost));
|
|
36
|
-
const exercisesAuthToken = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.exercisesAuthToken));
|
|
37
|
-
const defaultCorrectness = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.defaultCorrectness || ''));
|
|
38
|
-
const doDefaultCorrectness = async (exercise) => {
|
|
39
|
-
if (await defaultCorrectness() !== 'true') {
|
|
40
|
-
return exercise;
|
|
41
|
-
}
|
|
42
|
-
for (const question of exercise.questions) {
|
|
43
|
-
const existingCorrect = question.answers.find(answer => answer.correctness !== undefined);
|
|
44
|
-
if (question.answers.length < 1 || existingCorrect) {
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
const defaultCorrectIndex = question.id % question.answers.length;
|
|
48
|
-
const defaultCorrect = question.answers[defaultCorrectIndex];
|
|
49
|
-
const defaultHint = `<em>random default: the correct answer is ${defaultCorrect.id}: ${defaultCorrect.content_html.slice(0, 20)}</em>`;
|
|
50
|
-
question.stem_html += `\n<br>${defaultHint}`;
|
|
51
|
-
question.collaborator_solutions = [
|
|
52
|
-
{ solution_type: 'detailed', images: [], content_html: defaultHint }
|
|
53
|
-
];
|
|
54
|
-
for (let index = 0; index < question.answers.length; index++) {
|
|
55
|
-
const answer = question.answers[index];
|
|
56
|
-
answer.correctness = defaultCorrectIndex === index ? '1.0' : '0.0';
|
|
57
|
-
answer.feedback_html = defaultCorrectIndex === index ? 'This is the good one!' : defaultHint;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return exercise;
|
|
61
|
-
};
|
|
62
|
-
return (_) => {
|
|
63
|
-
const request = async (method, path, query = undefined) => {
|
|
64
|
-
const host = (await exercisesHost()).replace(/\/+$/, '');
|
|
65
|
-
const baseUrl = `${host}/api/${path}`;
|
|
66
|
-
const url = query ? `${baseUrl}?${queryString.stringify(query)}` : baseUrl;
|
|
67
|
-
return initializer.fetch(url, {
|
|
68
|
-
headers: {
|
|
69
|
-
Authorization: `Bearer ${await exercisesAuthToken()}`,
|
|
70
|
-
},
|
|
71
|
-
method,
|
|
72
|
-
});
|
|
73
|
-
};
|
|
74
|
-
const searchDigest = async (query, page = 1, per_page = 100) => {
|
|
75
|
-
const response = await request(routing_1.METHOD.HEAD, 'exercises', { query, page, per_page });
|
|
76
|
-
return (0, assertions_1.assertString)(response.headers.get('X-Digest'), 'OpenStax Exercises search endpoint HEAD did not return an X-Digest header');
|
|
77
|
-
};
|
|
78
|
-
const search = async (query, page = 1, per_page = 100) => {
|
|
79
|
-
const response = await request(routing_1.METHOD.GET, 'exercises', { query, page, per_page });
|
|
80
|
-
const digest = (0, assertions_1.assertString)(response.headers.get('X-Digest'), 'OpenStax Exercises search endpoint GET did not return an X-Digest header');
|
|
81
|
-
const { items, total_count } = await response.json();
|
|
82
|
-
return { digest, items: await Promise.all(items.map(doDefaultCorrectness)), total_count };
|
|
83
|
-
};
|
|
84
|
-
const get = async (uuid) => {
|
|
85
|
-
const response = await request(routing_1.METHOD.GET, `exercises/${uuid}`);
|
|
86
|
-
return response.status === 404
|
|
87
|
-
? undefined
|
|
88
|
-
: response.json().then(doDefaultCorrectness);
|
|
89
|
-
};
|
|
90
|
-
return {
|
|
91
|
-
searchDigest,
|
|
92
|
-
get,
|
|
93
|
-
search,
|
|
94
|
-
};
|
|
95
|
-
};
|
|
96
|
-
};
|
|
97
|
-
exports.exercisesGateway = exercisesGateway;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
export declare type FileValue = {
|
|
3
|
-
dataType: 'file';
|
|
4
|
-
mimeType: string;
|
|
5
|
-
path: string;
|
|
6
|
-
label: string;
|
|
7
|
-
};
|
|
8
|
-
export declare type FolderValue = {
|
|
9
|
-
dataType: 'folder';
|
|
10
|
-
files: FileValue[];
|
|
11
|
-
};
|
|
12
|
-
export declare const isFileValue: (thing: any) => thing is FileValue;
|
|
13
|
-
export declare const isFolderValue: (thing: any) => thing is FolderValue;
|
|
14
|
-
export interface FileServerAdapter {
|
|
15
|
-
putFileContent: (source: FileValue, content: string) => Promise<FileValue>;
|
|
16
|
-
getSignedViewerUrl: (source: FileValue) => Promise<string>;
|
|
17
|
-
getFileContent: (source: FileValue) => Promise<Buffer>;
|
|
18
|
-
}
|
|
19
|
-
export declare const isFileOrFolder: (thing: any) => thing is FileValue | FolderValue;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isFileOrFolder = exports.isFolderValue = exports.isFileValue = void 0;
|
|
4
|
-
const guards_1 = require("../../guards");
|
|
5
|
-
const isFileValue = (thing) => (0, guards_1.isPlainObject)(thing)
|
|
6
|
-
&& Object.keys(thing).every(key => ['dataType', 'path', 'label', 'mimeType'].includes(key))
|
|
7
|
-
&& thing.dataType === 'file'
|
|
8
|
-
&& typeof thing.mimeType === 'string'
|
|
9
|
-
&& typeof thing.path === 'string'
|
|
10
|
-
&& typeof thing.label === 'string';
|
|
11
|
-
exports.isFileValue = isFileValue;
|
|
12
|
-
const isFolderValue = (thing) => (0, guards_1.isPlainObject)(thing)
|
|
13
|
-
&& Object.keys(thing).every(key => ['dataType', 'files'].includes(key))
|
|
14
|
-
&& thing.dataType === 'folder'
|
|
15
|
-
&& thing.files instanceof Array
|
|
16
|
-
&& thing.files.every(exports.isFileValue);
|
|
17
|
-
exports.isFolderValue = isFolderValue;
|
|
18
|
-
const isFileOrFolder = (thing) => (0, exports.isFileValue)(thing) || (0, exports.isFolderValue)(thing);
|
|
19
|
-
exports.isFileOrFolder = isFileOrFolder;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { ConfigProviderForConfig } from '../../config';
|
|
2
|
-
import { FileServerAdapter } from '.';
|
|
3
|
-
export declare type Config = {
|
|
4
|
-
port?: string;
|
|
5
|
-
host?: string;
|
|
6
|
-
storagePrefix: string;
|
|
7
|
-
};
|
|
8
|
-
interface Initializer<C> {
|
|
9
|
-
dataDir: string;
|
|
10
|
-
configSpace?: C;
|
|
11
|
-
}
|
|
12
|
-
export declare const localFileServer: <C extends string = "local">(initializer: Initializer<C>) => (configProvider: { [key in C]: {
|
|
13
|
-
port?: import("../../config").ConfigValueProvider<string> | undefined;
|
|
14
|
-
host?: import("../../config").ConfigValueProvider<string> | undefined;
|
|
15
|
-
storagePrefix: import("../../config").ConfigValueProvider<string>;
|
|
16
|
-
}; }) => FileServerAdapter;
|
|
17
|
-
export {};
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.localFileServer = void 0;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const config_1 = require("../../config");
|
|
10
|
-
const guards_1 = require("../../guards");
|
|
11
|
-
const cors_1 = __importDefault(require("cors"));
|
|
12
|
-
const express_1 = __importDefault(require("express"));
|
|
13
|
-
const multer_1 = __importDefault(require("multer"));
|
|
14
|
-
const https_1 = __importDefault(require("https"));
|
|
15
|
-
const helpers_1 = require("../../misc/helpers");
|
|
16
|
-
const assertions_1 = require("../../assertions");
|
|
17
|
-
/* istanbul ignore next */
|
|
18
|
-
const startServer = (0, helpers_1.once)((port, uploadDir) => {
|
|
19
|
-
// TODO - re-evaluate the `preservePath` behavior to match whatever s3 does
|
|
20
|
-
const upload = (0, multer_1.default)({ dest: uploadDir, preservePath: true });
|
|
21
|
-
const fileServerApp = (0, express_1.default)();
|
|
22
|
-
fileServerApp.use((0, cors_1.default)());
|
|
23
|
-
fileServerApp.use(express_1.default.static(uploadDir));
|
|
24
|
-
fileServerApp.post('/', upload.single('file'), async (req, res) => {
|
|
25
|
-
const file = req.file;
|
|
26
|
-
if (!file) {
|
|
27
|
-
return res.status(400).send({ message: 'file is required' });
|
|
28
|
-
}
|
|
29
|
-
const destinationName = req.body.key.replace('${filename}', file.originalname);
|
|
30
|
-
const destinationPath = path_1.default.join(uploadDir, destinationName);
|
|
31
|
-
const destinationDirectory = path_1.default.dirname(destinationPath);
|
|
32
|
-
await fs_1.default.promises.mkdir(destinationDirectory, { recursive: true });
|
|
33
|
-
await fs_1.default.promises.rename(file.path, destinationPath);
|
|
34
|
-
res.status(201).send();
|
|
35
|
-
});
|
|
36
|
-
const server = https_1.default.createServer({
|
|
37
|
-
key: fs_1.default.readFileSync((0, assertions_1.assertString)(process.env.SSL_KEY_FILE, new Error('ssl key is required for localFileServer')), 'utf8'),
|
|
38
|
-
cert: fs_1.default.readFileSync((0, assertions_1.assertString)(process.env.SSL_CRT_FILE, new Error('ssl key is required for localFileServer')), 'utf8'),
|
|
39
|
-
}, fileServerApp);
|
|
40
|
-
server.once('error', function (err) {
|
|
41
|
-
if (err.code === 'EADDRINUSE') {
|
|
42
|
-
// when the local dev server reloads files on every request it doesn't
|
|
43
|
-
// actually tear down the old modules, so this server only starts on the
|
|
44
|
-
// first execution and changes in its code will not be reloaded
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
throw err;
|
|
48
|
-
});
|
|
49
|
-
server.listen(port);
|
|
50
|
-
return true;
|
|
51
|
-
});
|
|
52
|
-
const localFileServer = (initializer) => (configProvider) => {
|
|
53
|
-
const config = configProvider[(0, guards_1.ifDefined)(initializer.configSpace, 'local')];
|
|
54
|
-
const port = (0, config_1.resolveConfigValue)(config.port || '');
|
|
55
|
-
const host = (0, config_1.resolveConfigValue)(config.host || '');
|
|
56
|
-
const storagePrefix = (0, config_1.resolveConfigValue)(config.storagePrefix);
|
|
57
|
-
const fileDir = storagePrefix.then((prefix) => path_1.default.join(initializer.dataDir, prefix));
|
|
58
|
-
Promise.all([port, fileDir])
|
|
59
|
-
.then(([port, fileDir]) => port && startServer(port, fileDir));
|
|
60
|
-
const getSignedViewerUrl = async (source) => {
|
|
61
|
-
return `https://${await host}:${await port}/${source.path}`;
|
|
62
|
-
};
|
|
63
|
-
const getFileContent = async (source) => {
|
|
64
|
-
const filePath = path_1.default.join(await fileDir, source.path);
|
|
65
|
-
return fs_1.default.promises.readFile(filePath);
|
|
66
|
-
};
|
|
67
|
-
const putFileContent = async (source, content) => {
|
|
68
|
-
const filePath = path_1.default.join(await fileDir, source.path);
|
|
69
|
-
const directory = path_1.default.dirname(filePath);
|
|
70
|
-
await fs_1.default.promises.mkdir(directory, { recursive: true });
|
|
71
|
-
await fs_1.default.promises.writeFile(filePath, content);
|
|
72
|
-
return source;
|
|
73
|
-
};
|
|
74
|
-
return {
|
|
75
|
-
getSignedViewerUrl,
|
|
76
|
-
getFileContent,
|
|
77
|
-
putFileContent,
|
|
78
|
-
};
|
|
79
|
-
};
|
|
80
|
-
exports.localFileServer = localFileServer;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { S3Client } from '@aws-sdk/client-s3';
|
|
2
|
-
import { ConfigProviderForConfig } from '../../config';
|
|
3
|
-
import { FileServerAdapter } from '.';
|
|
4
|
-
export declare type Config = {
|
|
5
|
-
bucketName: string;
|
|
6
|
-
bucketRegion: string;
|
|
7
|
-
};
|
|
8
|
-
interface Initializer<C> {
|
|
9
|
-
configSpace?: C;
|
|
10
|
-
s3Client?: typeof S3Client;
|
|
11
|
-
}
|
|
12
|
-
export declare const s3FileServer: <C extends string = "deployed">(initializer: Initializer<C>) => (configProvider: { [key in C]: {
|
|
13
|
-
bucketName: import("../../config").ConfigValueProvider<string>;
|
|
14
|
-
bucketRegion: import("../../config").ConfigValueProvider<string>;
|
|
15
|
-
}; }) => FileServerAdapter;
|
|
16
|
-
export {};
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.s3FileServer = void 0;
|
|
4
|
-
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
5
|
-
const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
|
|
6
|
-
const __1 = require("../..");
|
|
7
|
-
const assertions_1 = require("../../assertions");
|
|
8
|
-
const config_1 = require("../../config");
|
|
9
|
-
const guards_1 = require("../../guards");
|
|
10
|
-
const s3FileServer = (initializer) => (configProvider) => {
|
|
11
|
-
const config = configProvider[(0, guards_1.ifDefined)(initializer.configSpace, 'deployed')];
|
|
12
|
-
const bucketName = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.bucketName));
|
|
13
|
-
const bucketRegion = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.bucketRegion));
|
|
14
|
-
const client = (0, guards_1.ifDefined)(initializer.s3Client, client_s3_1.S3Client);
|
|
15
|
-
const s3Service = (0, __1.once)(async () => new client({ apiVersion: '2012-08-10', region: await bucketRegion() }));
|
|
16
|
-
/*
|
|
17
|
-
* https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html
|
|
18
|
-
*/
|
|
19
|
-
const getSignedViewerUrl = async (source) => {
|
|
20
|
-
const bucket = (await bucketName());
|
|
21
|
-
const command = new client_s3_1.GetObjectCommand({ Bucket: bucket, Key: source.path });
|
|
22
|
-
return (0, s3_request_presigner_1.getSignedUrl)(await s3Service(), command, {
|
|
23
|
-
expiresIn: 3600, // 1 hour
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
|
-
const getFileContent = async (source) => {
|
|
27
|
-
const bucket = await bucketName();
|
|
28
|
-
const command = new client_s3_1.GetObjectCommand({ Bucket: bucket, Key: source.path });
|
|
29
|
-
const response = await (await s3Service()).send(command);
|
|
30
|
-
return Buffer.from(await (0, assertions_1.assertDefined)(response.Body, new Error('Invalid Response from s3')).transformToByteArray());
|
|
31
|
-
};
|
|
32
|
-
const putFileContent = async (source, content) => {
|
|
33
|
-
const bucket = await bucketName();
|
|
34
|
-
const command = new client_s3_1.PutObjectCommand({
|
|
35
|
-
Bucket: bucket,
|
|
36
|
-
Key: source.path,
|
|
37
|
-
Body: content,
|
|
38
|
-
ContentType: source.mimeType,
|
|
39
|
-
});
|
|
40
|
-
await (await s3Service()).send(command);
|
|
41
|
-
return source;
|
|
42
|
-
};
|
|
43
|
-
return {
|
|
44
|
-
getFileContent,
|
|
45
|
-
putFileContent,
|
|
46
|
-
getSignedViewerUrl,
|
|
47
|
-
};
|
|
48
|
-
};
|
|
49
|
-
exports.s3FileServer = s3FileServer;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createLaunchVerifier = exports.createLaunchSigner = void 0;
|
|
4
|
-
var signer_1 = require("./signer");
|
|
5
|
-
Object.defineProperty(exports, "createLaunchSigner", { enumerable: true, get: function () { return signer_1.createLaunchSigner; } });
|
|
6
|
-
var verifier_1 = require("./verifier");
|
|
7
|
-
Object.defineProperty(exports, "createLaunchVerifier", { enumerable: true, get: function () { return verifier_1.createLaunchVerifier; } });
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { JWK } from 'node-jose';
|
|
2
|
-
import { ConfigProviderForConfig } from '../../config';
|
|
3
|
-
declare type Config = {
|
|
4
|
-
alg: string;
|
|
5
|
-
expiresIn: string;
|
|
6
|
-
iss: string;
|
|
7
|
-
privateKey: string;
|
|
8
|
-
};
|
|
9
|
-
interface Initializer<C> {
|
|
10
|
-
configSpace?: C;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Creates a class that can sign launch params
|
|
14
|
-
*/
|
|
15
|
-
export declare const createLaunchSigner: <C extends string = "launch">({ configSpace }: Initializer<C>) => (configProvider: { [key in C]: {
|
|
16
|
-
alg: import("../../config").ConfigValueProvider<string>;
|
|
17
|
-
expiresIn: import("../../config").ConfigValueProvider<string>;
|
|
18
|
-
iss: import("../../config").ConfigValueProvider<string>;
|
|
19
|
-
privateKey: import("../../config").ConfigValueProvider<string>;
|
|
20
|
-
}; }) => {
|
|
21
|
-
jwks: () => Promise<{
|
|
22
|
-
keys: JWK.RawKey[];
|
|
23
|
-
}>;
|
|
24
|
-
sign: (subject: string, maxExp?: number | null | undefined) => Promise<string>;
|
|
25
|
-
};
|
|
26
|
-
export declare type LaunchSigner = ReturnType<ReturnType<typeof createLaunchSigner>>;
|
|
27
|
-
export {};
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createLaunchSigner = void 0;
|
|
7
|
-
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
-
const ms_1 = __importDefault(require("ms"));
|
|
9
|
-
const node_jose_1 = require("node-jose");
|
|
10
|
-
const __1 = require("../..");
|
|
11
|
-
const config_1 = require("../../config");
|
|
12
|
-
const guards_1 = require("../../guards");
|
|
13
|
-
const SUPPORTED_ALGORITHMS = [
|
|
14
|
-
'RS256', 'RS384', 'RS512', 'ES256', 'ES384', 'ES512', 'HS256', 'HS384', 'HS512', 'PS256', 'PS384', 'PS512'
|
|
15
|
-
];
|
|
16
|
-
const assertAlg = (alg) => {
|
|
17
|
-
if ((SUPPORTED_ALGORITHMS).includes(alg)) {
|
|
18
|
-
return alg;
|
|
19
|
-
}
|
|
20
|
-
throw new Error(`"${alg}" is not a valid algorithm`);
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* Creates a class that can sign launch params
|
|
24
|
-
*/
|
|
25
|
-
const createLaunchSigner = ({ configSpace }) => (configProvider) => {
|
|
26
|
-
const config = configProvider[(0, guards_1.ifDefined)(configSpace, 'launch')];
|
|
27
|
-
const getAlg = (0, __1.once)(async () => assertAlg(await (0, config_1.resolveConfigValue)(config.alg)));
|
|
28
|
-
const getExpiresIn = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.expiresIn));
|
|
29
|
-
const getIss = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.iss));
|
|
30
|
-
const getPrivateKey = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.privateKey));
|
|
31
|
-
const getKeyStore = (0, __1.once)(async () => {
|
|
32
|
-
const keystore = node_jose_1.JWK.createKeyStore();
|
|
33
|
-
await keystore.add(await getPrivateKey(), 'pem');
|
|
34
|
-
return keystore;
|
|
35
|
-
});
|
|
36
|
-
const jwks = async () => (await getKeyStore()).toJSON(false);
|
|
37
|
-
const getExpiresInWithMax = async (maxExp) => {
|
|
38
|
-
const expiresIn = await getExpiresIn();
|
|
39
|
-
// The ms library used by jsonwebtoken can handle a value in seconds as well as a string like '1d'
|
|
40
|
-
if (!maxExp) {
|
|
41
|
-
return expiresIn;
|
|
42
|
-
}
|
|
43
|
-
// Convert both values to seconds for comparison
|
|
44
|
-
const expiresInSeconds = Math.floor((0, ms_1.default)(expiresIn) / 1000);
|
|
45
|
-
const maxExpSeconds = maxExp - Math.floor(Date.now() / 1000);
|
|
46
|
-
return Math.min(expiresInSeconds, maxExpSeconds);
|
|
47
|
-
};
|
|
48
|
-
const sign = async (subject, maxExp) => {
|
|
49
|
-
const alg = await getAlg();
|
|
50
|
-
// expiresIn can be a number of seconds or a string like '1h' or '1d'
|
|
51
|
-
const expiresIn = await getExpiresInWithMax(maxExp);
|
|
52
|
-
const iss = await getIss();
|
|
53
|
-
const header = { alg, iss };
|
|
54
|
-
return jsonwebtoken_1.default.sign({}, await getPrivateKey(), { algorithm: alg, expiresIn, header, issuer: iss, subject });
|
|
55
|
-
};
|
|
56
|
-
return { jwks, sign };
|
|
57
|
-
};
|
|
58
|
-
exports.createLaunchSigner = createLaunchSigner;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import jwt from 'jsonwebtoken';
|
|
2
|
-
import type { JWK } from 'node-jose';
|
|
3
|
-
import { ConfigProviderForConfig } from '../../config';
|
|
4
|
-
declare type Config = {
|
|
5
|
-
trustedDomain: string;
|
|
6
|
-
};
|
|
7
|
-
interface Initializer<C> {
|
|
8
|
-
configSpace?: C;
|
|
9
|
-
fetcher?: (uri: string) => Promise<{
|
|
10
|
-
keys: JWK.RawKey[];
|
|
11
|
-
}>;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Creates a class that can verify launch params
|
|
15
|
-
*/
|
|
16
|
-
export declare const createLaunchVerifier: <C extends string = "launch">({ configSpace, fetcher }: Initializer<C>) => (configProvider: { [key in C]: {
|
|
17
|
-
trustedDomain: import("../../config").ConfigValueProvider<string>;
|
|
18
|
-
}; }) => {
|
|
19
|
-
verify: <T = undefined>(...[token, validator]: T extends undefined ? [string] : [string, (input: any) => T]) => Promise<T extends undefined ? jwt.JwtPayload : T>;
|
|
20
|
-
};
|
|
21
|
-
export declare type LaunchVerifier = ReturnType<ReturnType<typeof createLaunchVerifier>>;
|
|
22
|
-
export {};
|