@openstax/ts-utils 1.21.11 → 1.23.0

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 (252) hide show
  1. package/dist/cjs/assertions/index.d.ts +85 -0
  2. package/dist/cjs/assertions/index.js +157 -0
  3. package/dist/cjs/aws/ssmService.d.ts +5 -0
  4. package/dist/cjs/aws/ssmService.js +9 -0
  5. package/dist/cjs/config/awsParameterConfig.d.ts +10 -0
  6. package/dist/cjs/config/awsParameterConfig.js +26 -0
  7. package/dist/cjs/config/envConfig.d.ts +24 -0
  8. package/dist/cjs/config/envConfig.js +57 -0
  9. package/dist/cjs/config/index.d.ts +48 -0
  10. package/dist/cjs/config/index.js +35 -0
  11. package/dist/cjs/config/lambdaParameterConfig.d.ts +12 -0
  12. package/dist/cjs/config/lambdaParameterConfig.js +45 -0
  13. package/dist/cjs/config/replaceConfig.d.ts +14 -0
  14. package/dist/cjs/config/replaceConfig.js +22 -0
  15. package/dist/cjs/config/resolveConfigValue.d.ts +5 -0
  16. package/dist/cjs/config/resolveConfigValue.js +12 -0
  17. package/dist/cjs/errors/index.d.ts +77 -0
  18. package/dist/cjs/errors/index.js +109 -0
  19. package/dist/cjs/fetch/fetchStatusRetry.d.ts +7 -0
  20. package/dist/cjs/fetch/fetchStatusRetry.js +16 -0
  21. package/dist/cjs/fetch/index.d.ts +64 -0
  22. package/dist/cjs/fetch/index.js +55 -0
  23. package/dist/cjs/guards/index.d.ts +30 -0
  24. package/dist/cjs/guards/index.js +35 -0
  25. package/dist/cjs/index.d.ts +4 -0
  26. package/dist/cjs/index.js +20 -0
  27. package/dist/cjs/middleware/apiErrorHandler.d.ts +24 -0
  28. package/dist/cjs/middleware/apiErrorHandler.js +41 -0
  29. package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +23 -0
  30. package/dist/cjs/middleware/apiSlowResponseMiddleware.js +54 -0
  31. package/dist/cjs/middleware/index.d.ts +47 -0
  32. package/dist/cjs/middleware/index.js +48 -0
  33. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +20 -0
  34. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +42 -0
  35. package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +4 -0
  36. package/dist/cjs/middleware/throwNotFoundMiddleware.js +14 -0
  37. package/dist/cjs/misc/hashValue.d.ts +10 -0
  38. package/dist/cjs/misc/hashValue.js +17 -0
  39. package/dist/cjs/misc/helpers.d.ts +124 -0
  40. package/dist/cjs/misc/helpers.js +214 -0
  41. package/dist/cjs/misc/merge.d.ts +21 -0
  42. package/dist/cjs/misc/merge.js +45 -0
  43. package/dist/cjs/misc/partitionSequence.d.ts +35 -0
  44. package/dist/cjs/misc/partitionSequence.js +55 -0
  45. package/dist/cjs/pagination/index.d.ts +91 -0
  46. package/dist/cjs/pagination/index.js +83 -0
  47. package/dist/cjs/routing/helpers.d.ts +57 -0
  48. package/dist/cjs/routing/helpers.js +90 -0
  49. package/dist/cjs/routing/index.d.ts +272 -0
  50. package/dist/cjs/routing/index.js +270 -0
  51. package/dist/cjs/routing/validators/zod.d.ts +4 -0
  52. package/dist/cjs/routing/validators/zod.js +12 -0
  53. package/dist/cjs/services/accountsGateway/index.d.ts +85 -0
  54. package/dist/cjs/services/accountsGateway/index.js +118 -0
  55. package/dist/cjs/services/apiGateway/index.d.ts +63 -0
  56. package/dist/cjs/services/apiGateway/index.js +108 -0
  57. package/dist/cjs/services/authProvider/browser.d.ts +74 -0
  58. package/dist/cjs/services/authProvider/browser.js +154 -0
  59. package/dist/cjs/services/authProvider/decryption.d.ts +19 -0
  60. package/dist/cjs/services/authProvider/decryption.js +61 -0
  61. package/dist/cjs/services/authProvider/index.d.ts +61 -0
  62. package/dist/cjs/services/authProvider/index.js +26 -0
  63. package/dist/cjs/services/authProvider/subrequest.d.ts +16 -0
  64. package/dist/cjs/services/authProvider/subrequest.js +50 -0
  65. package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +29 -0
  66. package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +91 -0
  67. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +26 -0
  68. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.js +47 -0
  69. package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +13 -0
  70. package/dist/cjs/services/authProvider/utils/userRoleValidator.js +37 -0
  71. package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +10 -0
  72. package/dist/cjs/services/documentStore/dynamoEncoding.js +52 -0
  73. package/dist/cjs/services/documentStore/index.d.ts +14 -0
  74. package/dist/cjs/services/documentStore/index.js +2 -0
  75. package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +16 -0
  76. package/dist/cjs/services/documentStore/unversioned/dynamodb.js +122 -0
  77. package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +18 -0
  78. package/dist/cjs/services/documentStore/unversioned/file-system.js +121 -0
  79. package/dist/cjs/services/documentStore/unversioned/index.d.ts +2 -0
  80. package/dist/cjs/services/documentStore/unversioned/index.js +2 -0
  81. package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +22 -0
  82. package/dist/cjs/services/documentStore/versioned/dynamodb.js +135 -0
  83. package/dist/cjs/services/documentStore/versioned/file-system.d.ts +24 -0
  84. package/dist/cjs/services/documentStore/versioned/file-system.js +62 -0
  85. package/dist/cjs/services/documentStore/versioned/index.d.ts +17 -0
  86. package/dist/cjs/services/documentStore/versioned/index.js +2 -0
  87. package/dist/cjs/services/exercisesGateway/index.d.ts +71 -0
  88. package/dist/cjs/services/exercisesGateway/index.js +97 -0
  89. package/dist/cjs/services/fileServer/index.d.ts +17 -0
  90. package/dist/cjs/services/fileServer/index.js +19 -0
  91. package/dist/cjs/services/fileServer/localFileServer.d.ts +13 -0
  92. package/dist/cjs/services/fileServer/localFileServer.js +23 -0
  93. package/dist/cjs/services/fileServer/s3FileServer.d.ts +16 -0
  94. package/dist/cjs/services/fileServer/s3FileServer.js +25 -0
  95. package/dist/cjs/services/launchParams/index.d.ts +2 -0
  96. package/dist/cjs/services/launchParams/index.js +7 -0
  97. package/dist/cjs/services/launchParams/signer.d.ts +27 -0
  98. package/dist/cjs/services/launchParams/signer.js +58 -0
  99. package/dist/cjs/services/launchParams/verifier.d.ts +22 -0
  100. package/dist/cjs/services/launchParams/verifier.js +94 -0
  101. package/dist/cjs/services/logger/console.d.ts +4 -0
  102. package/dist/cjs/services/logger/console.js +12 -0
  103. package/dist/cjs/services/logger/index.d.ts +39 -0
  104. package/dist/cjs/services/logger/index.js +31 -0
  105. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
  106. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +21 -0
  107. package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +70 -0
  108. package/dist/cjs/services/lrsGateway/attempt-utils.js +258 -0
  109. package/dist/cjs/services/lrsGateway/file-system.d.ts +17 -0
  110. package/dist/cjs/services/lrsGateway/file-system.js +140 -0
  111. package/dist/cjs/services/lrsGateway/index.d.ts +125 -0
  112. package/dist/cjs/services/lrsGateway/index.js +138 -0
  113. package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +61 -0
  114. package/dist/cjs/services/lrsGateway/xapiUtils.js +94 -0
  115. package/dist/cjs/services/postgresConnection/index.d.ts +35 -0
  116. package/dist/cjs/services/postgresConnection/index.js +63 -0
  117. package/dist/cjs/services/searchProvider/index.d.ts +31 -0
  118. package/dist/cjs/services/searchProvider/index.js +2 -0
  119. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +14 -0
  120. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +89 -0
  121. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +1 -0
  122. package/dist/cjs/types.d.ts +31 -0
  123. package/dist/cjs/types.js +2 -0
  124. package/dist/esm/assertions/index.d.ts +85 -0
  125. package/dist/esm/assertions/index.js +146 -0
  126. package/dist/esm/aws/ssmService.d.ts +5 -0
  127. package/dist/esm/aws/ssmService.js +6 -0
  128. package/dist/esm/config/awsParameterConfig.d.ts +10 -0
  129. package/dist/esm/config/awsParameterConfig.js +22 -0
  130. package/dist/esm/config/envConfig.d.ts +24 -0
  131. package/dist/esm/config/envConfig.js +53 -0
  132. package/dist/esm/config/index.d.ts +48 -0
  133. package/dist/esm/config/index.js +17 -0
  134. package/dist/esm/config/lambdaParameterConfig.d.ts +12 -0
  135. package/dist/esm/config/lambdaParameterConfig.js +38 -0
  136. package/dist/esm/config/replaceConfig.d.ts +14 -0
  137. package/dist/esm/config/replaceConfig.js +18 -0
  138. package/dist/esm/config/resolveConfigValue.d.ts +5 -0
  139. package/dist/esm/config/resolveConfigValue.js +8 -0
  140. package/dist/esm/errors/index.d.ts +77 -0
  141. package/dist/esm/errors/index.js +99 -0
  142. package/dist/esm/fetch/fetchStatusRetry.d.ts +7 -0
  143. package/dist/esm/fetch/fetchStatusRetry.js +12 -0
  144. package/dist/esm/fetch/index.d.ts +64 -0
  145. package/dist/esm/fetch/index.js +46 -0
  146. package/dist/esm/guards/index.d.ts +30 -0
  147. package/dist/esm/guards/index.js +28 -0
  148. package/dist/esm/index.d.ts +4 -0
  149. package/dist/esm/index.js +4 -0
  150. package/dist/esm/middleware/apiErrorHandler.d.ts +24 -0
  151. package/dist/esm/middleware/apiErrorHandler.js +37 -0
  152. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +23 -0
  153. package/dist/esm/middleware/apiSlowResponseMiddleware.js +50 -0
  154. package/dist/esm/middleware/index.d.ts +47 -0
  155. package/dist/esm/middleware/index.js +44 -0
  156. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +20 -0
  157. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +38 -0
  158. package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +4 -0
  159. package/dist/esm/middleware/throwNotFoundMiddleware.js +10 -0
  160. package/dist/esm/misc/hashValue.d.ts +10 -0
  161. package/dist/esm/misc/hashValue.js +13 -0
  162. package/dist/esm/misc/helpers.d.ts +124 -0
  163. package/dist/esm/misc/helpers.js +199 -0
  164. package/dist/esm/misc/merge.d.ts +21 -0
  165. package/dist/esm/misc/merge.js +40 -0
  166. package/dist/esm/misc/partitionSequence.d.ts +35 -0
  167. package/dist/esm/misc/partitionSequence.js +48 -0
  168. package/dist/esm/pagination/index.d.ts +91 -0
  169. package/dist/esm/pagination/index.js +77 -0
  170. package/dist/esm/routing/helpers.d.ts +57 -0
  171. package/dist/esm/routing/helpers.js +83 -0
  172. package/dist/esm/routing/index.d.ts +272 -0
  173. package/dist/esm/routing/index.js +232 -0
  174. package/dist/esm/routing/validators/zod.d.ts +4 -0
  175. package/dist/esm/routing/validators/zod.js +8 -0
  176. package/dist/esm/services/accountsGateway/index.d.ts +85 -0
  177. package/dist/esm/services/accountsGateway/index.js +111 -0
  178. package/dist/esm/services/apiGateway/index.d.ts +63 -0
  179. package/dist/esm/services/apiGateway/index.js +77 -0
  180. package/dist/esm/services/authProvider/browser.d.ts +74 -0
  181. package/dist/esm/services/authProvider/browser.js +150 -0
  182. package/dist/esm/services/authProvider/decryption.d.ts +19 -0
  183. package/dist/esm/services/authProvider/decryption.js +57 -0
  184. package/dist/esm/services/authProvider/index.d.ts +61 -0
  185. package/dist/esm/services/authProvider/index.js +18 -0
  186. package/dist/esm/services/authProvider/subrequest.d.ts +16 -0
  187. package/dist/esm/services/authProvider/subrequest.js +43 -0
  188. package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +29 -0
  189. package/dist/esm/services/authProvider/utils/decryptAndVerify.js +85 -0
  190. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +26 -0
  191. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +40 -0
  192. package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +13 -0
  193. package/dist/esm/services/authProvider/utils/userRoleValidator.js +33 -0
  194. package/dist/esm/services/documentStore/dynamoEncoding.d.ts +10 -0
  195. package/dist/esm/services/documentStore/dynamoEncoding.js +45 -0
  196. package/dist/esm/services/documentStore/index.d.ts +14 -0
  197. package/dist/esm/services/documentStore/index.js +1 -0
  198. package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +16 -0
  199. package/dist/esm/services/documentStore/unversioned/dynamodb.js +118 -0
  200. package/dist/esm/services/documentStore/unversioned/file-system.d.ts +18 -0
  201. package/dist/esm/services/documentStore/unversioned/file-system.js +91 -0
  202. package/dist/esm/services/documentStore/unversioned/index.d.ts +2 -0
  203. package/dist/esm/services/documentStore/unversioned/index.js +1 -0
  204. package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +22 -0
  205. package/dist/esm/services/documentStore/versioned/dynamodb.js +131 -0
  206. package/dist/esm/services/documentStore/versioned/file-system.d.ts +24 -0
  207. package/dist/esm/services/documentStore/versioned/file-system.js +58 -0
  208. package/dist/esm/services/documentStore/versioned/index.d.ts +17 -0
  209. package/dist/esm/services/documentStore/versioned/index.js +1 -0
  210. package/dist/esm/services/exercisesGateway/index.d.ts +71 -0
  211. package/dist/esm/services/exercisesGateway/index.js +70 -0
  212. package/dist/esm/services/fileServer/index.d.ts +17 -0
  213. package/dist/esm/services/fileServer/index.js +13 -0
  214. package/dist/esm/services/fileServer/localFileServer.d.ts +13 -0
  215. package/dist/esm/services/fileServer/localFileServer.js +16 -0
  216. package/dist/esm/services/fileServer/s3FileServer.d.ts +16 -0
  217. package/dist/esm/services/fileServer/s3FileServer.js +21 -0
  218. package/dist/esm/services/launchParams/index.d.ts +2 -0
  219. package/dist/esm/services/launchParams/index.js +2 -0
  220. package/dist/esm/services/launchParams/signer.d.ts +27 -0
  221. package/dist/esm/services/launchParams/signer.js +51 -0
  222. package/dist/esm/services/launchParams/verifier.d.ts +22 -0
  223. package/dist/esm/services/launchParams/verifier.js +67 -0
  224. package/dist/esm/services/logger/console.d.ts +4 -0
  225. package/dist/esm/services/logger/console.js +8 -0
  226. package/dist/esm/services/logger/index.d.ts +39 -0
  227. package/dist/esm/services/logger/index.js +27 -0
  228. package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
  229. package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +14 -0
  230. package/dist/esm/services/lrsGateway/attempt-utils.d.ts +70 -0
  231. package/dist/esm/services/lrsGateway/attempt-utils.js +236 -0
  232. package/dist/esm/services/lrsGateway/file-system.d.ts +17 -0
  233. package/dist/esm/services/lrsGateway/file-system.js +110 -0
  234. package/dist/esm/services/lrsGateway/index.d.ts +125 -0
  235. package/dist/esm/services/lrsGateway/index.js +111 -0
  236. package/dist/esm/services/lrsGateway/xapiUtils.d.ts +61 -0
  237. package/dist/esm/services/lrsGateway/xapiUtils.js +84 -0
  238. package/dist/esm/services/postgresConnection/index.d.ts +35 -0
  239. package/dist/esm/services/postgresConnection/index.js +56 -0
  240. package/dist/esm/services/searchProvider/index.d.ts +31 -0
  241. package/dist/esm/services/searchProvider/index.js +1 -0
  242. package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +14 -0
  243. package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +85 -0
  244. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +1 -0
  245. package/dist/esm/types.d.ts +31 -0
  246. package/dist/esm/types.js +1 -0
  247. package/package.json +16 -16
  248. package/script/bin/deploy.bash +8 -0
  249. package/script/bin/get-env-param.bash +3 -3
  250. package/script/bin/init-params-script.bash +10 -1
  251. package/script/bin/upload-params.bash +3 -3
  252. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,62 @@
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;
@@ -0,0 +1,17 @@
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;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,71 @@
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 {};
@@ -0,0 +1,97 @@
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;
@@ -0,0 +1,17 @@
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
+ getFileContent: (source: FileValue) => Promise<Buffer>;
16
+ }
17
+ export declare const isFileOrFolder: (thing: any) => thing is FileValue | FolderValue;
@@ -0,0 +1,19 @@
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;
@@ -0,0 +1,13 @@
1
+ import { ConfigProviderForConfig } from '../../config';
2
+ import { FileServerAdapter } from '.';
3
+ export declare type Config = {
4
+ storagePrefix: string;
5
+ };
6
+ interface Initializer<C> {
7
+ dataDir: string;
8
+ configSpace?: C;
9
+ }
10
+ export declare const localFileServer: <C extends string = "local">(initializer: Initializer<C>) => (configProvider: { [key in C]: {
11
+ storagePrefix: import("../../config").ConfigValueProvider<string>;
12
+ }; }) => FileServerAdapter;
13
+ export {};
@@ -0,0 +1,23 @@
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 localFileServer = (initializer) => (configProvider) => {
12
+ const config = configProvider[(0, guards_1.ifDefined)(initializer.configSpace, 'local')];
13
+ const storagePrefix = (0, config_1.resolveConfigValue)(config.storagePrefix);
14
+ const fileDir = storagePrefix.then((prefix) => path_1.default.join(initializer.dataDir, prefix));
15
+ const getFileContent = async (source) => {
16
+ const filePath = path_1.default.join(await fileDir, source.path);
17
+ return fs_1.default.promises.readFile(filePath);
18
+ };
19
+ return {
20
+ getFileContent,
21
+ };
22
+ };
23
+ exports.localFileServer = localFileServer;
@@ -0,0 +1,16 @@
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 {};
@@ -0,0 +1,25 @@
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 __1 = require("../..");
6
+ const assertions_1 = require("../../assertions");
7
+ const config_1 = require("../../config");
8
+ const guards_1 = require("../../guards");
9
+ const s3FileServer = (initializer) => (configProvider) => {
10
+ const config = configProvider[(0, guards_1.ifDefined)(initializer.configSpace, 'deployed')];
11
+ const bucketName = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.bucketName));
12
+ const bucketRegion = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.bucketRegion));
13
+ const client = (0, guards_1.ifDefined)(initializer.s3Client, client_s3_1.S3Client);
14
+ const s3Service = (0, __1.once)(async () => new client({ apiVersion: '2012-08-10', region: await bucketRegion() }));
15
+ const getFileContent = async (source) => {
16
+ const bucket = await bucketName();
17
+ const command = new client_s3_1.GetObjectCommand({ Bucket: bucket, Key: source.path });
18
+ const response = await (await s3Service()).send(command);
19
+ return Buffer.from(await (0, assertions_1.assertDefined)(response.Body, new Error('Invalid Response from s3')).transformToByteArray());
20
+ };
21
+ return {
22
+ getFileContent,
23
+ };
24
+ };
25
+ exports.s3FileServer = s3FileServer;
@@ -0,0 +1,2 @@
1
+ export { createLaunchSigner } from './signer';
2
+ export { createLaunchVerifier } from './verifier';
@@ -0,0 +1,7 @@
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; } });
@@ -0,0 +1,27 @@
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 {};
@@ -0,0 +1,58 @@
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;
@@ -0,0 +1,22 @@
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 {};
@@ -0,0 +1,94 @@
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.createLaunchVerifier = void 0;
27
+ const jsonwebtoken_1 = __importStar(require("jsonwebtoken"));
28
+ const jwks_rsa_1 = require("jwks-rsa");
29
+ const __1 = require("../..");
30
+ const config_1 = require("../../config");
31
+ const errors_1 = require("../../errors");
32
+ const guards_1 = require("../../guards");
33
+ /**
34
+ * Creates a class that can verify launch params
35
+ */
36
+ const createLaunchVerifier = ({ configSpace, fetcher }) => (configProvider) => {
37
+ const config = configProvider[(0, guards_1.ifDefined)(configSpace, 'launch')];
38
+ const getJwksClient = (0, __1.memoize)((jwksUri) => new jwks_rsa_1.JwksClient({ fetcher, jwksUri }));
39
+ const getJwksKey = (0, __1.memoize)(async (jwksUri, kid) => {
40
+ const client = getJwksClient(jwksUri);
41
+ const key = await client.getSigningKey(kid);
42
+ return key.getPublicKey();
43
+ });
44
+ const getKey = async (header, callback) => {
45
+ // The JWT spec allows iss in the header as a copy of the iss claim, but we require it
46
+ if (!header.iss) {
47
+ return callback(new Error('JWT header missing iss claim'));
48
+ }
49
+ const { iss, kid } = header;
50
+ try {
51
+ const jwksUrl = new URL('/.well-known/jwks.json', iss);
52
+ const launchDomain = jwksUrl.hostname;
53
+ const trustedDomain = await (0, config_1.resolveConfigValue)(config.trustedDomain);
54
+ if (launchDomain !== trustedDomain && !launchDomain.endsWith(`.${trustedDomain}`)) {
55
+ return callback(new Error(`Untrusted launch domain: "${launchDomain}"`));
56
+ }
57
+ callback(null, await getJwksKey(jwksUrl.toString(), kid));
58
+ }
59
+ catch (error) {
60
+ callback(error);
61
+ }
62
+ };
63
+ const verify = (...[token, validator]) => new Promise((resolve, reject) => jsonwebtoken_1.default.verify(token, getKey, {}, (err, payload) => {
64
+ if (err && err instanceof jsonwebtoken_1.TokenExpiredError) {
65
+ reject(new errors_1.SessionExpiredError());
66
+ }
67
+ else if (err) {
68
+ reject(err);
69
+ }
70
+ else if (typeof payload !== 'object') {
71
+ reject(new Error('received JWT token with unexpected non-JSON payload'));
72
+ }
73
+ else if (!payload.sub) {
74
+ reject(new Error('JWT payload missing sub claim'));
75
+ }
76
+ else {
77
+ // we are migrating away from json encoding all the parameters into the `sub` claim
78
+ // and into using separate claims for each parameter. in transition, we check if the sub
79
+ // is json and return it if it is. this is still a breaking change when using this
80
+ // utility because applications no longer need to independently json parse the result
81
+ // starting now.
82
+ const parsed = payload;
83
+ try {
84
+ const jsonSubContents = JSON.parse(payload.sub);
85
+ Object.assign(parsed, jsonSubContents);
86
+ }
87
+ catch (e) { } // eslint-disable-line no-empty
88
+ // conditional return types are annoying
89
+ resolve((validator ? validator(parsed) : parsed));
90
+ }
91
+ }));
92
+ return { verify };
93
+ };
94
+ exports.createLaunchVerifier = createLaunchVerifier;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Creates a logger that logs to the console.
3
+ */
4
+ export declare const createConsoleLogger: () => import(".").Logger;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createConsoleLogger = void 0;
4
+ const _1 = require(".");
5
+ /**
6
+ * Creates a logger that logs to the console.
7
+ */
8
+ const createConsoleLogger = () => (0, _1.createCoreLogger)((level, event) => console[level](JSON.stringify({
9
+ eventType: level.toUpperCase(),
10
+ ...event,
11
+ })));
12
+ exports.createConsoleLogger = createConsoleLogger;
@@ -0,0 +1,39 @@
1
+ import { JsonCompatibleStruct } from '../../routing';
2
+ /**
3
+ * The log level
4
+ */
5
+ export declare enum Level {
6
+ Info = "info",
7
+ Warn = "warn",
8
+ Error = "error"
9
+ }
10
+ /**
11
+ * A function that logs an event at a certain level.
12
+ *
13
+ * @param level - log level
14
+ * @param event - event to log
15
+ */
16
+ export declare type LogEvent = (level: Level, event: JsonCompatibleStruct) => void;
17
+ /**
18
+ * A logger that can be used to log events.
19
+ *
20
+ * @property setContext - sets a context object to be included in all future logged events
21
+ * @property logEvent - logs an arbitrary event at a certain level, without context
22
+ * @property log - logs a message and the context at a certain level
23
+ * @property createSubContext - creates a new logger that inherits the context of this logger
24
+ */
25
+ export interface Logger {
26
+ setContext: (obj: JsonCompatibleStruct) => void;
27
+ logEvent: LogEvent;
28
+ log: (message: string, level?: Level) => void;
29
+ createSubContext: () => Logger;
30
+ }
31
+ /**
32
+ * Creates a logger that logs events using the given driver and context provider.
33
+ *
34
+ * @param driver the driver that logs events
35
+ * @param getParentContext a provider that returns the context to use for this logger
36
+ * (the context is returned when messages are logged with the logger)
37
+ * @returns a Logger
38
+ */
39
+ export declare const createCoreLogger: (driver: LogEvent, getParentContext?: (() => JsonCompatibleStruct) | undefined) => Logger;