@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,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCoreLogger = exports.Level = void 0;
4
+ /**
5
+ * The log level
6
+ */
7
+ var Level;
8
+ (function (Level) {
9
+ Level["Info"] = "info";
10
+ Level["Warn"] = "warn";
11
+ Level["Error"] = "error";
12
+ })(Level = exports.Level || (exports.Level = {}));
13
+ /**
14
+ * Creates a logger that logs events using the given driver and context provider.
15
+ *
16
+ * @param driver the driver that logs events
17
+ * @param getParentContext a provider that returns the context to use for this logger
18
+ * (the context is returned when messages are logged with the logger)
19
+ * @returns a Logger
20
+ */
21
+ const createCoreLogger = (driver, getParentContext) => {
22
+ const context = {};
23
+ const getContext = () => ({ ...getParentContext === null || getParentContext === void 0 ? void 0 : getParentContext(), ...context });
24
+ return {
25
+ logEvent: (level, event) => driver(level, { ...event, context: getContext() }),
26
+ log: (message, level = Level.Info) => driver(level, { message, context: getContext() }),
27
+ setContext: (obj) => { Object.assign(context, obj); },
28
+ createSubContext: () => (0, exports.createCoreLogger)(driver, getContext),
29
+ };
30
+ };
31
+ exports.createCoreLogger = createCoreLogger;
@@ -0,0 +1,5 @@
1
+ import { User } from '../authProvider';
2
+ import { EagerXapiStatement, UXapiStatement, XapiStatement } from '.';
3
+ export declare const addStatementDefaultFields: (statement: (Pick<XapiStatement, 'object' | 'verb' | 'context' | 'result'> & {
4
+ id?: string;
5
+ }) | UXapiStatement, user: User) => EagerXapiStatement;
@@ -0,0 +1,21 @@
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.addStatementDefaultFields = void 0;
7
+ const formatISO_1 = __importDefault(require("date-fns/formatISO"));
8
+ const uuid_1 = require("uuid");
9
+ const addStatementDefaultFields = (statement, user) => ({
10
+ id: (0, uuid_1.v4)(),
11
+ actor: {
12
+ account: {
13
+ homePage: 'https://openstax.org',
14
+ name: user.uuid,
15
+ },
16
+ objectType: 'Agent',
17
+ },
18
+ timestamp: (0, formatISO_1.default)(new Date()),
19
+ ...statement,
20
+ });
21
+ exports.addStatementDefaultFields = addStatementDefaultFields;
@@ -0,0 +1,70 @@
1
+ import { LrsGateway, UXapiStatement } from '.';
2
+ export declare type ActivityState = {
3
+ attempts: number;
4
+ completedAttempts: number;
5
+ currentAttempt?: UXapiStatement;
6
+ currentAttemptCompleted?: UXapiStatement;
7
+ currentAttemptStatements: UXapiStatement[];
8
+ mostRecentAttemptWithCompleted?: UXapiStatement;
9
+ mostRecentAttemptWithCompletedCompleted?: UXapiStatement;
10
+ };
11
+ export declare const matchAttempt: (statement: UXapiStatement) => boolean;
12
+ export declare const matchAttemptCompleted: (attempt: UXapiStatement) => (statement: UXapiStatement) => boolean;
13
+ export declare const resolveAttempts: (statements: UXapiStatement[], options?: {
14
+ activityIRI?: string | undefined;
15
+ parentActivityAttempt?: string | undefined;
16
+ } | undefined) => UXapiStatement[];
17
+ export declare const resolveCompletedForAttempt: (statements: UXapiStatement[], attempt: UXapiStatement, activityIRI?: string | undefined) => UXapiStatement | undefined;
18
+ export declare const oldestStatement: (statements: UXapiStatement[]) => UXapiStatement | undefined;
19
+ export declare const mostRecentStatement: (statements: UXapiStatement[]) => UXapiStatement | undefined;
20
+ export declare const resolveAttemptInfo: (statements: UXapiStatement[], options?: {
21
+ activityIRI?: string | undefined;
22
+ currentAttempt?: string | undefined;
23
+ parentActivityAttempt?: string | undefined;
24
+ currentPreference?: "latest" | "oldest" | undefined;
25
+ } | undefined) => ActivityState;
26
+ export declare const loadStatementsForActivityAndFirstChildren: (gateway: LrsGateway, activityIRI: string, options?: {
27
+ anyUser?: boolean | undefined;
28
+ attempt?: string | undefined;
29
+ ensureSync?: boolean | undefined;
30
+ user?: string | undefined;
31
+ } | undefined) => Promise<import(".").XapiStatement[]>;
32
+ export declare const loadActivityAttemptInfo: (gateway: LrsGateway, activityIRI: string, options?: {
33
+ currentAttempt?: string | undefined;
34
+ parentActivityAttempt?: string | undefined;
35
+ ensureSync?: boolean | undefined;
36
+ } | undefined) => Promise<ActivityState>;
37
+ export declare const createStatement: (verb: UXapiStatement['verb'], activity: {
38
+ iri: string;
39
+ type: string;
40
+ name: string;
41
+ extensions?: {
42
+ [key: string]: string;
43
+ } | undefined;
44
+ }, attempt: string, parentActivityIRI?: string | undefined) => Pick<UXapiStatement, 'object' | 'verb' | 'context'>;
45
+ export declare const createAttemptStatement: (activity: {
46
+ iri: string;
47
+ type: string;
48
+ name: string;
49
+ extensions?: {
50
+ [key: string]: string;
51
+ } | undefined;
52
+ }, parentActivity?: {
53
+ iri?: string | undefined;
54
+ attempt?: string | undefined;
55
+ } | undefined) => Pick<UXapiStatement, 'object' | 'verb' | 'context'>;
56
+ export declare const putAttemptStatement: (gateway: LrsGateway, activity: {
57
+ iri: string;
58
+ type: string;
59
+ name: string;
60
+ extensions?: {
61
+ [key: string]: string;
62
+ } | undefined;
63
+ }, parentActivity?: {
64
+ iri?: string | undefined;
65
+ attempt?: string | undefined;
66
+ } | undefined) => Promise<import(".").EagerXapiStatement>;
67
+ export declare const createAttemptActivityStatement: (attemptStatement: UXapiStatement, verb: UXapiStatement['verb'], result?: UXapiStatement['result']) => Pick<UXapiStatement, 'object' | 'verb' | 'context' | 'result'>;
68
+ export declare const putAttemptActivityStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, verb: UXapiStatement['verb'], result?: UXapiStatement['result']) => Promise<import(".").EagerXapiStatement>;
69
+ export declare const createCompletedStatement: (attemptStatement: UXapiStatement, result?: UXapiStatement['result']) => Pick<UXapiStatement, 'object' | 'verb' | 'context' | 'result'>;
70
+ export declare const putCompletedStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, result: UXapiStatement['result']) => Promise<import(".").EagerXapiStatement>;
@@ -0,0 +1,258 @@
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.putCompletedStatement = exports.createCompletedStatement = exports.putAttemptActivityStatement = exports.createAttemptActivityStatement = exports.putAttemptStatement = exports.createAttemptStatement = exports.createStatement = exports.loadActivityAttemptInfo = exports.loadStatementsForActivityAndFirstChildren = exports.resolveAttemptInfo = exports.mostRecentStatement = exports.oldestStatement = exports.resolveCompletedForAttempt = exports.resolveAttempts = exports.matchAttemptCompleted = exports.matchAttempt = void 0;
7
+ /*
8
+ * the structure of xapi statements for handling multiple attempts of an activity
9
+ * including the option of a parent activity/attempt such that a new attempt
10
+ * of a parent activity inherently creates a new attempt scope for sub-activities
11
+ * is done by convention using certain context and verb pieces of a statement.
12
+ * this module provides helpers for creating and retrieving statements according
13
+ * to this convention.
14
+ */
15
+ const formatISODuration_1 = __importDefault(require("date-fns/formatISODuration"));
16
+ const intervalToDuration_1 = __importDefault(require("date-fns/intervalToDuration"));
17
+ const isAfter_1 = __importDefault(require("date-fns/isAfter"));
18
+ const isBefore_1 = __importDefault(require("date-fns/isBefore"));
19
+ const parseISO_1 = __importDefault(require("date-fns/parseISO"));
20
+ var Verb;
21
+ (function (Verb) {
22
+ Verb["Attempted"] = "http://adlnet.gov/expapi/verbs/attempted";
23
+ Verb["Completed"] = "http://adlnet.gov/expapi/verbs/completed";
24
+ })(Verb || (Verb = {}));
25
+ const matchAttempt = (statement) => statement.verb.id === Verb.Attempted;
26
+ exports.matchAttempt = matchAttempt;
27
+ const matchAttemptCompleted = (attempt) => (statement) => {
28
+ var _a, _b;
29
+ return statement.verb.id === Verb.Completed
30
+ && statement.context !== undefined
31
+ && ((_a = statement.context.statement) === null || _a === void 0 ? void 0 : _a.id) === attempt.id
32
+ && statement.context.registration === ((_b = attempt.context) === null || _b === void 0 ? void 0 : _b.registration);
33
+ };
34
+ exports.matchAttemptCompleted = matchAttemptCompleted;
35
+ const resolveAttempts = (statements, options) => statements.filter(statement => {
36
+ var _a;
37
+ return (0, exports.matchAttempt)(statement)
38
+ && (!(options === null || options === void 0 ? void 0 : options.activityIRI) || statement.object.id === options.activityIRI)
39
+ && (!(options === null || options === void 0 ? void 0 : options.parentActivityAttempt) || ((_a = statement.context) === null || _a === void 0 ? void 0 : _a.registration) === options.parentActivityAttempt);
40
+ });
41
+ exports.resolveAttempts = resolveAttempts;
42
+ const resolveCompletedForAttempt = (statements, attempt, activityIRI) => statements.find(statement => (0, exports.matchAttemptCompleted)(attempt)(statement)
43
+ && (!activityIRI || statement.object.id === activityIRI));
44
+ exports.resolveCompletedForAttempt = resolveCompletedForAttempt;
45
+ const oldestStatement = (statements) => statements.reduce((result, statement) => result && (0, isBefore_1.default)((0, parseISO_1.default)('stored' in result && result.stored ? result.stored : result.timestamp), (0, parseISO_1.default)(statement.timestamp)) ? result : statement, statements[0]);
46
+ exports.oldestStatement = oldestStatement;
47
+ const mostRecentStatement = (statements) => statements.reduce((result, statement) => result && (0, isAfter_1.default)((0, parseISO_1.default)('stored' in result && result.stored ? result.stored : result.timestamp), (0, parseISO_1.default)(statement.timestamp)) ? result : statement, statements[0]);
48
+ exports.mostRecentStatement = mostRecentStatement;
49
+ const resolveAttemptInfo = (statements, options) => {
50
+ // TODO optimize. i'm 100% that this could all be done in one iteration but i'm not messing around with that for now.
51
+ const attempts = (0, exports.resolveAttempts)(statements, options);
52
+ /* attempts that have a completed statement */
53
+ const completedAttempts = attempts.filter(attempt => !!(0, exports.resolveCompletedForAttempt)(statements, attempt, options === null || options === void 0 ? void 0 : options.activityIRI));
54
+ /* the last attempt sorted by timestamp */
55
+ const currentAttempt = (options === null || options === void 0 ? void 0 : options.currentAttempt)
56
+ ? attempts.find(attempt => attempt.id === options.currentAttempt)
57
+ : (options === null || options === void 0 ? void 0 : options.currentPreference) === 'oldest'
58
+ ? (0, exports.oldestStatement)(attempts)
59
+ : (0, exports.mostRecentStatement)(attempts);
60
+ /* all statements for the current attempt (doesn't include the attempt or completed statements) */
61
+ const currentAttemptStatements = currentAttempt ? statements.filter(statement => {
62
+ var _a;
63
+ return (!(options === null || options === void 0 ? void 0 : options.activityIRI) || statement.object.id === options.activityIRI)
64
+ && ((_a = statement.context) === null || _a === void 0 ? void 0 : _a.registration) === currentAttempt.id;
65
+ }) : [];
66
+ const currentAttemptCompleted = currentAttempt && (0, exports.resolveCompletedForAttempt)(statements, currentAttempt, options === null || options === void 0 ? void 0 : options.activityIRI);
67
+ const mostRecentAttemptWithCompleted = completedAttempts.reduce((current, attempt) => current && (0, isAfter_1.default)((0, parseISO_1.default)(current.timestamp), (0, parseISO_1.default)(attempt.timestamp)) ? current : attempt, completedAttempts[0]);
68
+ const mostRecentAttemptWithCompletedCompleted = mostRecentAttemptWithCompleted
69
+ && (0, exports.resolveCompletedForAttempt)(statements, mostRecentAttemptWithCompleted, options === null || options === void 0 ? void 0 : options.activityIRI);
70
+ /*
71
+ * the structure allows for the possibility of multiple incomplete attempts.
72
+ * the implementation can choose at its discretion to ignore the currentAttempt
73
+ * and instead make a new one, for instance if the implementation desires
74
+ * an attempt timeout feature
75
+ */
76
+ return {
77
+ attempts: attempts.length,
78
+ completedAttempts: completedAttempts.length,
79
+ currentAttempt,
80
+ currentAttemptCompleted: currentAttemptCompleted,
81
+ currentAttemptStatements,
82
+ mostRecentAttemptWithCompleted,
83
+ mostRecentAttemptWithCompletedCompleted,
84
+ };
85
+ };
86
+ exports.resolveAttemptInfo = resolveAttemptInfo;
87
+ /*
88
+ * loads all statements (for this actor) that have the given activityIRI as the object.id or the context.contextActivities.parent.id
89
+ *
90
+ * note: if you filter on attempt you're only gonna get the `Attempted` statements from the child activities, subsequent child activity
91
+ * statements would then have to be fetched using
92
+ * `gateway.getAllXapiStatements({ activity: childActivityIRI, registration: childAttemptStatementID })`.
93
+ * this is because child activities could have multiple attempts under one attempt on the parent activity.
94
+ */
95
+ const loadStatementsForActivityAndFirstChildren = (gateway, activityIRI, options) => {
96
+ const { attempt, ...partialOptions } = options ? options : { attempt: undefined };
97
+ const getOptions = attempt ? { registration: attempt, ...partialOptions } : partialOptions;
98
+ return gateway.getAllXapiStatements({
99
+ activity: activityIRI,
100
+ related_activities: true,
101
+ ...getOptions,
102
+ });
103
+ };
104
+ exports.loadStatementsForActivityAndFirstChildren = loadStatementsForActivityAndFirstChildren;
105
+ const loadActivityAttemptInfo = async (gateway, activityIRI, options) => {
106
+ const { parentActivityAttempt, ...partialOptions } = options ? options : { parentActivityAttempt: undefined };
107
+ const loadOptions = parentActivityAttempt ? { ...partialOptions, registration: parentActivityAttempt } : partialOptions;
108
+ return (0, exports.resolveAttemptInfo)(await gateway.getAllXapiStatements({ ...loadOptions, activity: activityIRI }), { ...options, activityIRI });
109
+ };
110
+ exports.loadActivityAttemptInfo = loadActivityAttemptInfo;
111
+ const createStatement = (verb, activity, attempt, parentActivityIRI) => {
112
+ return {
113
+ context: {
114
+ ...(parentActivityIRI ? {
115
+ contextActivities: {
116
+ parent: [
117
+ {
118
+ id: parentActivityIRI,
119
+ objectType: 'Activity',
120
+ },
121
+ ],
122
+ },
123
+ } : {}),
124
+ registration: attempt,
125
+ },
126
+ object: {
127
+ definition: {
128
+ extensions: {
129
+ ...activity.extensions
130
+ },
131
+ name: {
132
+ 'en-US': activity.name,
133
+ },
134
+ type: activity.type,
135
+ },
136
+ id: activity.iri,
137
+ objectType: 'Activity'
138
+ },
139
+ verb,
140
+ };
141
+ };
142
+ exports.createStatement = createStatement;
143
+ /*
144
+ * activity:
145
+ * - iri: the IRI formatted id for this activity
146
+ * - type: the IRI formatted activity type (eg: http://id.tincanapi.com/activitytype/school-assignment)
147
+ * - name: the plaintext name of the activity, for reporting
148
+ *
149
+ * parentActivity:
150
+ * - iri: the IRI formatted id for the parent activity
151
+ * - attempt: the statement id for the parent attempt (the object of which should be the parentActivity.iri)
152
+ */
153
+ const createAttemptStatement = (activity, parentActivity) => {
154
+ return {
155
+ ...((parentActivity === null || parentActivity === void 0 ? void 0 : parentActivity.iri) || (parentActivity === null || parentActivity === void 0 ? void 0 : parentActivity.attempt) ? {
156
+ context: {
157
+ ...(parentActivity.iri ? {
158
+ contextActivities: {
159
+ parent: [
160
+ {
161
+ id: parentActivity.iri,
162
+ objectType: 'Activity',
163
+ },
164
+ ],
165
+ },
166
+ } : {}),
167
+ ...(parentActivity.attempt ? {
168
+ registration: parentActivity.attempt,
169
+ } : {})
170
+ },
171
+ } : {}),
172
+ object: {
173
+ definition: {
174
+ extensions: {
175
+ ...activity.extensions
176
+ },
177
+ name: {
178
+ 'en-US': activity.name,
179
+ },
180
+ type: activity.type,
181
+ },
182
+ id: activity.iri,
183
+ objectType: 'Activity'
184
+ },
185
+ verb: {
186
+ display: { 'en-US': 'Attempted' },
187
+ id: Verb.Attempted,
188
+ },
189
+ };
190
+ };
191
+ exports.createAttemptStatement = createAttemptStatement;
192
+ /* resolves with the statement id */
193
+ const putAttemptStatement = async (gateway, activity, parentActivity) => {
194
+ return (await gateway.putXapiStatements([(0, exports.createAttemptStatement)(activity, parentActivity)]))[0];
195
+ };
196
+ exports.putAttemptStatement = putAttemptStatement;
197
+ /*
198
+ * creates a statement under the given attempt.
199
+ *
200
+ * `result` optional context for the attempt result (score, selected answer, etc)
201
+ */
202
+ const createAttemptActivityStatement = (attemptStatement, verb, result) => {
203
+ var _a;
204
+ return {
205
+ context: {
206
+ ...(((_a = attemptStatement.context) === null || _a === void 0 ? void 0 : _a.contextActivities) ? {
207
+ contextActivities: attemptStatement.context.contextActivities,
208
+ } : {}),
209
+ registration: attemptStatement.id,
210
+ },
211
+ object: attemptStatement.object,
212
+ verb: verb,
213
+ ...(result ? { result } : {}),
214
+ };
215
+ };
216
+ exports.createAttemptActivityStatement = createAttemptActivityStatement;
217
+ const putAttemptActivityStatement = async (gateway, attemptStatement, verb, result) => {
218
+ return (await gateway.putXapiStatements([(0, exports.createAttemptActivityStatement)(attemptStatement, verb, result)]))[0];
219
+ };
220
+ exports.putAttemptActivityStatement = putAttemptActivityStatement;
221
+ /*
222
+ * creates a statement that completes the given attempt.
223
+ *
224
+ * `result` optional context for the attempt result (score, selected answer, etc)
225
+ */
226
+ const createCompletedStatement = (attemptStatement, result) => {
227
+ var _a, _b;
228
+ return {
229
+ context: {
230
+ ...(((_a = attemptStatement.context) === null || _a === void 0 ? void 0 : _a.contextActivities) ? {
231
+ contextActivities: attemptStatement.context.contextActivities,
232
+ } : {}),
233
+ ...(((_b = attemptStatement.context) === null || _b === void 0 ? void 0 : _b.registration) ? {
234
+ registration: attemptStatement.context.registration,
235
+ } : {}),
236
+ statement: {
237
+ objectType: 'StatementRef',
238
+ id: attemptStatement.id,
239
+ }
240
+ },
241
+ object: attemptStatement.object,
242
+ verb: {
243
+ display: { 'en-US': 'Completed' },
244
+ id: Verb.Completed,
245
+ },
246
+ result: {
247
+ duration: (0, formatISODuration_1.default)((0, intervalToDuration_1.default)({
248
+ start: (0, parseISO_1.default)(attemptStatement.timestamp), end: new Date()
249
+ })),
250
+ ...result,
251
+ }
252
+ };
253
+ };
254
+ exports.createCompletedStatement = createCompletedStatement;
255
+ const putCompletedStatement = async (gateway, attemptStatement, result) => {
256
+ return (await gateway.putXapiStatements([(0, exports.createCompletedStatement)(attemptStatement, result)]))[0];
257
+ };
258
+ exports.putCompletedStatement = putCompletedStatement;
@@ -0,0 +1,17 @@
1
+ import { ConfigProviderForConfig } from '../../config';
2
+ import { AuthProvider } from '../authProvider';
3
+ import { LrsGateway } from '.';
4
+ declare type Config = {
5
+ name: string;
6
+ };
7
+ interface Initializer<C> {
8
+ dataDir: string;
9
+ fs?: Pick<typeof import('fs'), 'readFile' | 'writeFile'>;
10
+ configSpace?: C;
11
+ }
12
+ export declare const fileSystemLrsGateway: <C extends string = "fileSystem">(initializer: Initializer<C>) => (configProvider: { [key in C]: {
13
+ name: import("../../config").ConfigValueProvider<string>;
14
+ }; }) => ({ authProvider }: {
15
+ authProvider: AuthProvider;
16
+ }) => LrsGateway;
17
+ export {};
@@ -0,0 +1,140 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.fileSystemLrsGateway = void 0;
30
+ const fsModule = __importStar(require("fs"));
31
+ const path_1 = __importDefault(require("path"));
32
+ const formatISO_1 = __importDefault(require("date-fns/formatISO"));
33
+ const uuid_1 = require("uuid");
34
+ const assertions_1 = require("../../assertions");
35
+ const config_1 = require("../../config");
36
+ const errors_1 = require("../../errors");
37
+ const guards_1 = require("../../guards");
38
+ const pageSize = 5;
39
+ const fileSystemLrsGateway = (initializer) => (configProvider) => ({ authProvider }) => {
40
+ const name = (0, config_1.resolveConfigValue)(configProvider[initializer.configSpace || 'fileSystem'].name);
41
+ const filePath = name.then((fileName) => path_1.default.join(initializer.dataDir, fileName));
42
+ const { readFile, writeFile } = (0, guards_1.ifDefined)(initializer.fs, fsModule);
43
+ let data;
44
+ const load = filePath.then(path => new Promise(resolve => {
45
+ readFile(path, (err, readData) => {
46
+ if (err) {
47
+ console.error(err);
48
+ }
49
+ else {
50
+ try {
51
+ data = JSON.parse(readData.toString());
52
+ if (typeof data !== 'object' || !(data instanceof Array)) {
53
+ data = undefined;
54
+ }
55
+ }
56
+ catch (e) {
57
+ console.error(e);
58
+ }
59
+ }
60
+ resolve();
61
+ });
62
+ }));
63
+ let previousSave;
64
+ const putXapiStatements = async (statements) => {
65
+ const user = (0, assertions_1.assertDefined)(await authProvider.getUser(), new errors_1.UnauthorizedError);
66
+ const statementsWithDefaults = statements.map(statement => ({
67
+ ...statement,
68
+ id: (0, uuid_1.v4)(),
69
+ actor: {
70
+ account: {
71
+ homePage: 'https://openstax.org',
72
+ name: user.uuid,
73
+ },
74
+ objectType: 'Agent',
75
+ },
76
+ timestamp: (0, formatISO_1.default)(new Date()),
77
+ }));
78
+ await load;
79
+ await previousSave;
80
+ const path = await filePath;
81
+ const save = previousSave = new Promise(resolve => {
82
+ data = data || [];
83
+ data.push(...statementsWithDefaults.map(statement => ({ ...statement, stored: statement.timestamp })));
84
+ writeFile(path, JSON.stringify(data, null, 2), () => resolve());
85
+ });
86
+ await save;
87
+ return statementsWithDefaults;
88
+ };
89
+ const getAllXapiStatements = async ({ user, anyUser, fetchUntil, ...options }) => {
90
+ const authUser = await authProvider.getUser();
91
+ await load;
92
+ let filteredData = (data || []).filter(statement => {
93
+ var _a, _b, _c, _d;
94
+ const statementDate = new Date(statement.timestamp);
95
+ const sinceDate = options.since ? new Date(options.since) : null;
96
+ const untilDate = options.until ? new Date(options.until) : null;
97
+ return (anyUser === true || statement.actor.account.name === (user || (0, assertions_1.assertDefined)(authUser, new errors_1.UnauthorizedError()).uuid))
98
+ && (!options.verb || statement.verb.id === options.verb)
99
+ && (!options.registration || ((_a = statement.context) === null || _a === void 0 ? void 0 : _a.registration) === options.registration)
100
+ && (!options.activity || (options.related_activities
101
+ ? ((statement.object.id === options.activity && statement.object.objectType === 'Activity')
102
+ || (!!((_d = (_c = (_b = statement.context) === null || _b === void 0 ? void 0 : _b.contextActivities) === null || _c === void 0 ? void 0 : _c.parent) === null || _d === void 0 ? void 0 : _d.find(parent => parent.id === options.activity && parent.objectType === 'Activity'))))
103
+ : (statement.object.id === options.activity && statement.object.objectType === 'Activity')))
104
+ && (!sinceDate || statementDate >= sinceDate)
105
+ && (!untilDate || statementDate <= untilDate);
106
+ });
107
+ if (fetchUntil) {
108
+ for (let i = 0; i < filteredData.length; i += pageSize) {
109
+ if (fetchUntil(filteredData.slice(0, i + pageSize))) {
110
+ filteredData = filteredData.slice(0, i + pageSize);
111
+ break;
112
+ }
113
+ }
114
+ }
115
+ return filteredData;
116
+ };
117
+ const getMoreXapiStatements = async (more) => {
118
+ const { args, offset } = JSON.parse(more);
119
+ const allResults = await getAllXapiStatements(...args);
120
+ const end = offset + pageSize;
121
+ return {
122
+ more: allResults.length > end ? JSON.stringify({ args, offset: end }) : '',
123
+ statements: allResults.slice(offset, end)
124
+ };
125
+ };
126
+ const getXapiStatements = async (...args) => {
127
+ const allResults = await getAllXapiStatements(...args);
128
+ return {
129
+ more: allResults.length > pageSize ? JSON.stringify({ args, offset: pageSize }) : '',
130
+ statements: allResults.slice(0, pageSize)
131
+ };
132
+ };
133
+ return {
134
+ putXapiStatements,
135
+ getAllXapiStatements,
136
+ getXapiStatements,
137
+ getMoreXapiStatements,
138
+ };
139
+ };
140
+ exports.fileSystemLrsGateway = fileSystemLrsGateway;
@@ -0,0 +1,125 @@
1
+ import { ConfigProviderForConfig } from '../../config';
2
+ import { GenericFetch } from '../../fetch';
3
+ import { WithRequired } from '../../types';
4
+ import { AuthProvider } from '../authProvider';
5
+ import { Logger } from '../logger';
6
+ declare type Config = {
7
+ lrsHost: string;
8
+ lrsAuthorization: string;
9
+ };
10
+ interface Initializer<C> {
11
+ configSpace?: C;
12
+ fetch: GenericFetch;
13
+ }
14
+ export interface XapiStatement {
15
+ actor: {
16
+ account: {
17
+ homePage: 'https://openstax.org';
18
+ name: string;
19
+ };
20
+ objectType: 'Agent';
21
+ };
22
+ id: string;
23
+ context?: {
24
+ contextActivities?: {
25
+ parent?: [
26
+ {
27
+ id: string;
28
+ objectType: 'Activity';
29
+ }
30
+ ];
31
+ };
32
+ statement?: {
33
+ objectType: 'StatementRef';
34
+ id: string;
35
+ };
36
+ registration?: string;
37
+ platform?: string;
38
+ };
39
+ object: {
40
+ definition?: {
41
+ extensions?: {
42
+ [key: string]: string;
43
+ };
44
+ name: {
45
+ [key: string]: string;
46
+ };
47
+ type: string;
48
+ };
49
+ id: string;
50
+ objectType: 'Activity';
51
+ };
52
+ result?: {
53
+ score?: {
54
+ scaled?: number;
55
+ raw?: number;
56
+ min?: number;
57
+ max?: number;
58
+ };
59
+ success?: boolean;
60
+ completion?: boolean;
61
+ response?: string;
62
+ duration?: string;
63
+ extensions?: {
64
+ [key: string]: string;
65
+ };
66
+ };
67
+ verb: {
68
+ display?: {
69
+ [key: string]: string;
70
+ };
71
+ id: string;
72
+ };
73
+ timestamp: string;
74
+ stored?: string;
75
+ }
76
+ export declare type SavedXapiStatement = WithRequired<XapiStatement, 'stored'>;
77
+ export declare type EagerXapiStatement = Omit<XapiStatement, 'stored'>;
78
+ export declare type UXapiStatement = XapiStatement | EagerXapiStatement | SavedXapiStatement;
79
+ export declare type LrsGateway = ReturnType<ReturnType<ReturnType<typeof lrsGateway>>>;
80
+ export declare type LrsProvider = ReturnType<ReturnType<typeof lrsGateway>>;
81
+ export declare const lrsGateway: <C extends string = "lrs">(initializer: Initializer<C>) => (configProvider: { [key in C]: {
82
+ lrsHost: import("../../config").ConfigValueProvider<string>;
83
+ lrsAuthorization: import("../../config").ConfigValueProvider<string>;
84
+ }; }) => ({ authProvider, logger }: {
85
+ authProvider: AuthProvider;
86
+ logger: Logger;
87
+ }) => {
88
+ putXapiStatements: (statements: Array<(Pick<XapiStatement, 'object' | 'verb' | 'context' | 'result'> & {
89
+ id?: string;
90
+ }) | UXapiStatement>) => Promise<EagerXapiStatement[]>;
91
+ getXapiStatements: (params: {
92
+ verb?: string | undefined;
93
+ activity?: string | undefined;
94
+ registration?: string | undefined;
95
+ related_activities?: boolean | undefined;
96
+ user?: string | undefined;
97
+ anyUser?: boolean | undefined;
98
+ since?: string | undefined;
99
+ until?: string | undefined;
100
+ } & {
101
+ ensureSync?: boolean | undefined;
102
+ }) => Promise<{
103
+ more: string;
104
+ statements: XapiStatement[];
105
+ }>;
106
+ getMoreXapiStatements: (more: string) => Promise<{
107
+ more: string;
108
+ statements: XapiStatement[];
109
+ }>;
110
+ getAllXapiStatements: ({ fetchUntil, ...params }: {
111
+ verb?: string | undefined;
112
+ activity?: string | undefined;
113
+ registration?: string | undefined;
114
+ related_activities?: boolean | undefined;
115
+ user?: string | undefined;
116
+ anyUser?: boolean | undefined;
117
+ since?: string | undefined;
118
+ until?: string | undefined;
119
+ } & {
120
+ ensureSync?: boolean | undefined;
121
+ } & {
122
+ fetchUntil?: ((statements: XapiStatement[]) => boolean) | undefined;
123
+ }) => Promise<XapiStatement[]>;
124
+ };
125
+ export {};