@openstax/ts-utils 1.34.0 → 1.35.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 (507) hide show
  1. package/README.md +90 -62
  2. package/dist/cjs/assertions/index.d.ts +89 -0
  3. package/dist/cjs/assertions/index.js +157 -0
  4. package/dist/cjs/aws/ssmService.d.ts +5 -0
  5. package/dist/cjs/aws/ssmService.js +9 -0
  6. package/dist/cjs/config/awsParameterConfig.d.ts +10 -0
  7. package/dist/cjs/config/awsParameterConfig.js +26 -0
  8. package/dist/cjs/config/envConfig.d.ts +24 -0
  9. package/dist/cjs/config/envConfig.js +57 -0
  10. package/{packages/utils/src/config/index.ts → dist/cjs/config/index.d.ts} +13 -29
  11. package/dist/cjs/config/index.js +35 -0
  12. package/dist/cjs/config/lambdaParameterConfig.d.ts +12 -0
  13. package/dist/cjs/config/lambdaParameterConfig.js +45 -0
  14. package/dist/cjs/config/replaceConfig.d.ts +14 -0
  15. package/dist/cjs/config/replaceConfig.js +22 -0
  16. package/dist/cjs/config/resolveConfigValue.d.ts +5 -0
  17. package/dist/cjs/config/resolveConfigValue.js +12 -0
  18. package/dist/cjs/errors/index.d.ts +88 -0
  19. package/dist/cjs/errors/index.js +123 -0
  20. package/dist/cjs/fetch/fetchStatusRetry.d.ts +8 -0
  21. package/dist/cjs/fetch/fetchStatusRetry.js +27 -0
  22. package/dist/cjs/fetch/index.d.ts +64 -0
  23. package/dist/cjs/fetch/index.js +55 -0
  24. package/{packages/utils/src/guards/index.ts → dist/cjs/guards/index.d.ts} +7 -10
  25. package/dist/cjs/guards/index.js +44 -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 +42 -0
  29. package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +23 -0
  30. package/dist/cjs/middleware/apiSlowResponseMiddleware.js +54 -0
  31. package/{packages/utils/src/middleware/index.ts → dist/cjs/middleware/index.d.ts} +5 -53
  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 +44 -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 +290 -0
  50. package/dist/cjs/routing/index.js +295 -0
  51. package/dist/cjs/routing/validators/zod.d.ts +4 -0
  52. package/dist/cjs/routing/validators/zod.js +14 -0
  53. package/dist/cjs/services/accountsGateway/index.d.ts +92 -0
  54. package/dist/cjs/services/accountsGateway/index.js +138 -0
  55. package/dist/cjs/services/apiGateway/index.d.ts +68 -0
  56. package/dist/cjs/services/apiGateway/index.js +118 -0
  57. package/dist/cjs/services/authProvider/browser.d.ts +40 -0
  58. package/dist/cjs/services/authProvider/browser.js +155 -0
  59. package/dist/cjs/services/authProvider/decryption.d.ts +19 -0
  60. package/dist/cjs/services/authProvider/decryption.js +73 -0
  61. package/dist/cjs/services/authProvider/index.d.ts +63 -0
  62. package/dist/cjs/services/authProvider/index.js +34 -0
  63. package/dist/cjs/services/authProvider/subrequest.d.ts +13 -0
  64. package/dist/cjs/services/authProvider/subrequest.js +49 -0
  65. package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +28 -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/authProvider/utils/userSubrequest.d.ts +3 -0
  72. package/dist/cjs/services/authProvider/utils/userSubrequest.js +13 -0
  73. package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +10 -0
  74. package/dist/cjs/services/documentStore/dynamoEncoding.js +52 -0
  75. package/dist/cjs/services/documentStore/fileSystemAssert.d.ts +1 -0
  76. package/dist/cjs/services/documentStore/fileSystemAssert.js +14 -0
  77. package/{packages/utils/src/services/documentStore/index.ts → dist/cjs/services/documentStore/index.d.ts} +8 -8
  78. package/dist/cjs/services/documentStore/index.js +2 -0
  79. package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +31 -0
  80. package/dist/cjs/services/documentStore/unversioned/dynamodb.js +233 -0
  81. package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +32 -0
  82. package/dist/cjs/services/documentStore/unversioned/file-system.js +214 -0
  83. package/{packages/utils/src/services/documentStore/unversioned/index.ts → dist/cjs/services/documentStore/unversioned/index.d.ts} +0 -2
  84. package/dist/cjs/services/documentStore/unversioned/index.js +2 -0
  85. package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +25 -0
  86. package/dist/cjs/services/documentStore/versioned/dynamodb.js +143 -0
  87. package/dist/cjs/services/documentStore/versioned/file-system.d.ts +25 -0
  88. package/dist/cjs/services/documentStore/versioned/file-system.js +73 -0
  89. package/dist/cjs/services/documentStore/versioned/index.d.ts +17 -0
  90. package/dist/cjs/services/documentStore/versioned/index.js +2 -0
  91. package/dist/cjs/services/exercisesGateway/index.d.ts +67 -0
  92. package/dist/cjs/services/exercisesGateway/index.js +107 -0
  93. package/dist/cjs/services/fileServer/index.d.ts +30 -0
  94. package/dist/cjs/services/fileServer/index.js +19 -0
  95. package/dist/cjs/services/fileServer/localFileServer.d.ts +13 -0
  96. package/dist/cjs/services/fileServer/localFileServer.js +132 -0
  97. package/dist/cjs/services/fileServer/s3FileServer.d.ts +14 -0
  98. package/dist/cjs/services/fileServer/s3FileServer.js +131 -0
  99. package/dist/cjs/services/launchParams/index.js +7 -0
  100. package/dist/cjs/services/launchParams/signer.d.ts +23 -0
  101. package/dist/cjs/services/launchParams/signer.js +58 -0
  102. package/dist/cjs/services/launchParams/verifier.d.ts +21 -0
  103. package/dist/cjs/services/launchParams/verifier.js +129 -0
  104. package/dist/cjs/services/logger/console.d.ts +4 -0
  105. package/dist/cjs/services/logger/console.js +12 -0
  106. package/{packages/utils/src/services/logger/index.ts → dist/cjs/services/logger/index.d.ts} +9 -23
  107. package/dist/cjs/services/logger/index.js +31 -0
  108. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
  109. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +21 -0
  110. package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +72 -0
  111. package/dist/cjs/services/lrsGateway/attempt-utils.js +283 -0
  112. package/dist/cjs/services/lrsGateway/file-system.d.ts +15 -0
  113. package/dist/cjs/services/lrsGateway/file-system.js +150 -0
  114. package/dist/cjs/services/lrsGateway/index.d.ts +122 -0
  115. package/dist/cjs/services/lrsGateway/index.js +148 -0
  116. package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +71 -0
  117. package/dist/cjs/services/lrsGateway/xapiUtils.js +145 -0
  118. package/dist/cjs/services/postgresConnection/index.d.ts +28 -0
  119. package/dist/cjs/services/postgresConnection/index.js +65 -0
  120. package/dist/cjs/services/searchProvider/index.d.ts +69 -0
  121. package/dist/cjs/services/searchProvider/index.js +2 -0
  122. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +20 -0
  123. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +191 -0
  124. package/dist/cjs/services/searchProvider/openSearch.d.ts +28 -0
  125. package/dist/cjs/services/searchProvider/openSearch.js +162 -0
  126. package/dist/cjs/services/searchProvider/streamIndexer.d.ts +17 -0
  127. package/dist/cjs/services/searchProvider/streamIndexer.js +41 -0
  128. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +1 -0
  129. package/{packages/utils/src/types.ts → dist/cjs/types.d.ts} +6 -34
  130. package/dist/cjs/types.js +2 -0
  131. package/dist/esm/assertions/index.d.ts +89 -0
  132. package/{packages/utils/src/assertions/index.ts → dist/esm/assertions/index.js} +49 -64
  133. package/dist/esm/aws/ssmService.d.ts +5 -0
  134. package/dist/esm/aws/ssmService.js +6 -0
  135. package/dist/esm/config/awsParameterConfig.d.ts +10 -0
  136. package/dist/esm/config/awsParameterConfig.js +22 -0
  137. package/dist/esm/config/envConfig.d.ts +24 -0
  138. package/dist/esm/config/envConfig.js +53 -0
  139. package/dist/esm/config/index.d.ts +48 -0
  140. package/dist/esm/config/index.js +17 -0
  141. package/dist/esm/config/lambdaParameterConfig.d.ts +12 -0
  142. package/dist/esm/config/lambdaParameterConfig.js +38 -0
  143. package/dist/esm/config/replaceConfig.d.ts +14 -0
  144. package/{packages/utils/src/config/replaceConfig.ts → dist/esm/config/replaceConfig.js} +6 -16
  145. package/dist/esm/config/resolveConfigValue.d.ts +5 -0
  146. package/dist/esm/config/resolveConfigValue.js +8 -0
  147. package/dist/esm/errors/index.d.ts +88 -0
  148. package/{packages/utils/src/errors/index.ts → dist/esm/errors/index.js} +41 -57
  149. package/dist/esm/fetch/fetchStatusRetry.d.ts +8 -0
  150. package/dist/esm/fetch/fetchStatusRetry.js +23 -0
  151. package/dist/esm/fetch/index.d.ts +64 -0
  152. package/dist/esm/fetch/index.js +46 -0
  153. package/dist/esm/guards/index.d.ts +38 -0
  154. package/dist/esm/guards/index.js +36 -0
  155. package/dist/esm/index.d.ts +4 -0
  156. package/dist/esm/index.js +4 -0
  157. package/dist/esm/middleware/apiErrorHandler.d.ts +24 -0
  158. package/dist/esm/middleware/apiErrorHandler.js +38 -0
  159. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +23 -0
  160. package/dist/esm/middleware/apiSlowResponseMiddleware.js +50 -0
  161. package/dist/esm/middleware/index.d.ts +47 -0
  162. package/dist/esm/middleware/index.js +44 -0
  163. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +20 -0
  164. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +40 -0
  165. package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +4 -0
  166. package/dist/esm/middleware/throwNotFoundMiddleware.js +10 -0
  167. package/dist/esm/misc/hashValue.d.ts +10 -0
  168. package/dist/esm/misc/hashValue.js +13 -0
  169. package/dist/esm/misc/helpers.d.ts +124 -0
  170. package/dist/esm/misc/helpers.js +199 -0
  171. package/dist/esm/misc/merge.d.ts +21 -0
  172. package/dist/esm/misc/merge.js +40 -0
  173. package/dist/esm/misc/partitionSequence.d.ts +35 -0
  174. package/{packages/utils/src/misc/partitionSequence.ts → dist/esm/misc/partitionSequence.js} +15 -23
  175. package/dist/esm/pagination/index.d.ts +91 -0
  176. package/dist/esm/pagination/index.js +77 -0
  177. package/dist/esm/routing/helpers.d.ts +57 -0
  178. package/{packages/utils/src/routing/helpers.ts → dist/esm/routing/helpers.js} +30 -42
  179. package/dist/esm/routing/index.d.ts +290 -0
  180. package/dist/esm/routing/index.js +246 -0
  181. package/dist/esm/routing/validators/zod.d.ts +4 -0
  182. package/dist/esm/routing/validators/zod.js +10 -0
  183. package/dist/esm/services/accountsGateway/index.d.ts +92 -0
  184. package/dist/esm/services/accountsGateway/index.js +131 -0
  185. package/dist/esm/services/apiGateway/index.d.ts +68 -0
  186. package/dist/esm/services/apiGateway/index.js +77 -0
  187. package/dist/esm/services/authProvider/browser.d.ts +40 -0
  188. package/dist/esm/services/authProvider/browser.js +151 -0
  189. package/dist/esm/services/authProvider/decryption.d.ts +19 -0
  190. package/dist/esm/services/authProvider/decryption.js +69 -0
  191. package/dist/esm/services/authProvider/index.d.ts +63 -0
  192. package/dist/esm/services/authProvider/index.js +26 -0
  193. package/dist/esm/services/authProvider/subrequest.d.ts +13 -0
  194. package/dist/esm/services/authProvider/subrequest.js +45 -0
  195. package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +28 -0
  196. package/dist/esm/services/authProvider/utils/decryptAndVerify.js +85 -0
  197. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +26 -0
  198. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +40 -0
  199. package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +13 -0
  200. package/dist/esm/services/authProvider/utils/userRoleValidator.js +33 -0
  201. package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +3 -0
  202. package/dist/esm/services/authProvider/utils/userSubrequest.js +6 -0
  203. package/dist/esm/services/documentStore/dynamoEncoding.d.ts +10 -0
  204. package/dist/esm/services/documentStore/dynamoEncoding.js +45 -0
  205. package/dist/esm/services/documentStore/fileSystemAssert.d.ts +1 -0
  206. package/dist/esm/services/documentStore/fileSystemAssert.js +10 -0
  207. package/dist/esm/services/documentStore/index.d.ts +14 -0
  208. package/dist/esm/services/documentStore/index.js +1 -0
  209. package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +31 -0
  210. package/dist/esm/services/documentStore/unversioned/dynamodb.js +226 -0
  211. package/dist/esm/services/documentStore/unversioned/file-system.d.ts +32 -0
  212. package/dist/esm/services/documentStore/unversioned/file-system.js +174 -0
  213. package/dist/esm/services/documentStore/unversioned/index.d.ts +2 -0
  214. package/dist/esm/services/documentStore/unversioned/index.js +1 -0
  215. package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +25 -0
  216. package/dist/esm/services/documentStore/versioned/dynamodb.js +139 -0
  217. package/dist/esm/services/documentStore/versioned/file-system.d.ts +25 -0
  218. package/dist/esm/services/documentStore/versioned/file-system.js +69 -0
  219. package/dist/esm/services/documentStore/versioned/index.d.ts +17 -0
  220. package/dist/esm/services/documentStore/versioned/index.js +1 -0
  221. package/dist/esm/services/exercisesGateway/index.d.ts +67 -0
  222. package/dist/esm/services/exercisesGateway/index.js +70 -0
  223. package/dist/esm/services/fileServer/index.d.ts +30 -0
  224. package/dist/esm/services/fileServer/index.js +13 -0
  225. package/dist/esm/services/fileServer/localFileServer.d.ts +13 -0
  226. package/dist/esm/services/fileServer/localFileServer.js +125 -0
  227. package/dist/esm/services/fileServer/s3FileServer.d.ts +14 -0
  228. package/dist/esm/services/fileServer/s3FileServer.js +124 -0
  229. package/dist/esm/services/launchParams/index.d.ts +2 -0
  230. package/dist/esm/services/launchParams/index.js +2 -0
  231. package/dist/esm/services/launchParams/signer.d.ts +23 -0
  232. package/dist/esm/services/launchParams/signer.js +51 -0
  233. package/dist/esm/services/launchParams/verifier.d.ts +21 -0
  234. package/dist/esm/services/launchParams/verifier.js +92 -0
  235. package/dist/esm/services/logger/console.d.ts +4 -0
  236. package/{packages/utils/src/services/logger/console.ts → dist/esm/services/logger/console.js} +2 -5
  237. package/dist/esm/services/logger/index.d.ts +39 -0
  238. package/dist/esm/services/logger/index.js +27 -0
  239. package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
  240. package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +14 -0
  241. package/dist/esm/services/lrsGateway/attempt-utils.d.ts +72 -0
  242. package/dist/esm/services/lrsGateway/attempt-utils.js +261 -0
  243. package/dist/esm/services/lrsGateway/file-system.d.ts +15 -0
  244. package/dist/esm/services/lrsGateway/file-system.js +110 -0
  245. package/dist/esm/services/lrsGateway/index.d.ts +122 -0
  246. package/dist/esm/services/lrsGateway/index.js +111 -0
  247. package/dist/esm/services/lrsGateway/xapiUtils.d.ts +71 -0
  248. package/dist/esm/services/lrsGateway/xapiUtils.js +134 -0
  249. package/dist/esm/services/postgresConnection/index.d.ts +28 -0
  250. package/dist/esm/services/postgresConnection/index.js +58 -0
  251. package/dist/esm/services/searchProvider/index.d.ts +69 -0
  252. package/dist/esm/services/searchProvider/index.js +1 -0
  253. package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +20 -0
  254. package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +187 -0
  255. package/dist/esm/services/searchProvider/openSearch.d.ts +28 -0
  256. package/dist/esm/services/searchProvider/openSearch.js +158 -0
  257. package/dist/esm/services/searchProvider/streamIndexer.d.ts +17 -0
  258. package/dist/esm/services/searchProvider/streamIndexer.js +37 -0
  259. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +1 -0
  260. package/dist/esm/types.d.ts +31 -0
  261. package/dist/esm/types.js +1 -0
  262. package/package.json +234 -12
  263. package/.cfnlintrc +0 -2
  264. package/.github/CODEOWNERS +0 -1
  265. package/.github/workflows/ci.yml +0 -36
  266. package/.github/workflows/lint.yml +0 -55
  267. package/.nvmrc +0 -1
  268. package/.syncignore +0 -4
  269. package/.syncpackrc +0 -18
  270. package/CONTRIBUTING.md +0 -96
  271. package/LICENSE +0 -661
  272. package/Procfile +0 -1
  273. package/app.json +0 -23
  274. package/cspell.json +0 -32
  275. package/deploy/constants.env +0 -21
  276. package/deploy/deploy.bash +0 -157
  277. package/deploy/deployment-alt-region.cfn.yml +0 -70
  278. package/deploy/deployment.cfn.yml +0 -650
  279. package/deploy/destroy-deployment.bash +0 -23
  280. package/deploy/shared.cfn.yml +0 -94
  281. package/docs/lambda-build.md +0 -35
  282. package/packages/frontend/README.md +0 -46
  283. package/packages/frontend/package.json +0 -101
  284. package/packages/frontend/public/favicon.ico +0 -0
  285. package/packages/frontend/public/index.html +0 -107
  286. package/packages/frontend/public/maintenance.html +0 -59
  287. package/packages/frontend/public/manifest.json +0 -15
  288. package/packages/frontend/public/robots.txt +0 -3
  289. package/packages/frontend/script/make-certificate.bash +0 -49
  290. package/packages/frontend/script/server/cli.js +0 -11
  291. package/packages/frontend/script/server/index.js +0 -47
  292. package/packages/frontend/script/start.bash +0 -22
  293. package/packages/frontend/script/trust-localhost.bash +0 -7
  294. package/packages/frontend/src/auth/authProvider.ts +0 -10
  295. package/packages/frontend/src/auth/useAuth.ts +0 -33
  296. package/packages/frontend/src/components/Pagination.tsx +0 -26
  297. package/packages/frontend/src/configProvider/index.ts +0 -53
  298. package/packages/frontend/src/configProvider/use.ts +0 -41
  299. package/packages/frontend/src/core/context/services.spec.tsx +0 -39
  300. package/packages/frontend/src/core/context/services.tsx +0 -16
  301. package/packages/frontend/src/core/index.spec.ts +0 -7
  302. package/packages/frontend/src/core/index.ts +0 -20
  303. package/packages/frontend/src/core/services.tsx +0 -14
  304. package/packages/frontend/src/core/types.ts +0 -3
  305. package/packages/frontend/src/example/api.ts +0 -28
  306. package/packages/frontend/src/example/components/Layout.tsx +0 -23
  307. package/packages/frontend/src/example/screens/Home.spec.tsx +0 -68
  308. package/packages/frontend/src/example/screens/Home.tsx +0 -78
  309. package/packages/frontend/src/example/screens/ThingList.spec.tsx +0 -60
  310. package/packages/frontend/src/example/screens/ThingList.tsx +0 -75
  311. package/packages/frontend/src/example/screens/ThingView.spec.tsx +0 -71
  312. package/packages/frontend/src/example/screens/ThingView.tsx +0 -47
  313. package/packages/frontend/src/example/screens/index.ts +0 -9
  314. package/packages/frontend/src/index.css +0 -159
  315. package/packages/frontend/src/index.tsx +0 -67
  316. package/packages/frontend/src/react-app-env.d.ts +0 -1
  317. package/packages/frontend/src/routing/components/RouteLink.spec.tsx +0 -55
  318. package/packages/frontend/src/routing/components/RouteLink.tsx +0 -35
  319. package/packages/frontend/src/routing/middleware.ts +0 -6
  320. package/packages/frontend/src/routing/useQuery.ts +0 -14
  321. package/packages/frontend/src/setupProxy.js +0 -19
  322. package/packages/frontend/src/setupTests.ts +0 -9
  323. package/packages/frontend/src/tests/testServices.tsx +0 -23
  324. package/packages/frontend/tsconfig.json +0 -27
  325. package/packages/lambda/.eslintrc.js +0 -64
  326. package/packages/lambda/jest-global-setup.js +0 -3
  327. package/packages/lambda/jest-setup-after-env.js +0 -1
  328. package/packages/lambda/jest.config.js +0 -31
  329. package/packages/lambda/jest.resolver.js +0 -17
  330. package/packages/lambda/package.json +0 -68
  331. package/packages/lambda/script/build.bash +0 -19
  332. package/packages/lambda/script/bundle-functions.bash +0 -10
  333. package/packages/lambda/script/lambdaLocalProxy.js +0 -16
  334. package/packages/lambda/script/lambdaLocalProxy.spec.ts +0 -147
  335. package/packages/lambda/script/utils/getRouteData.ts +0 -7
  336. package/packages/lambda/script/utils/routeDataLoader.js +0 -8
  337. package/packages/lambda/script/utils/routeDataLoader.spec.ts +0 -8
  338. package/packages/lambda/src/functions/serviceApi/core/index.ts +0 -7
  339. package/packages/lambda/src/functions/serviceApi/core/request.spec.ts +0 -38
  340. package/packages/lambda/src/functions/serviceApi/core/request.ts +0 -42
  341. package/packages/lambda/src/functions/serviceApi/core/routes.spec.ts +0 -7
  342. package/packages/lambda/src/functions/serviceApi/core/routes.ts +0 -10
  343. package/packages/lambda/src/functions/serviceApi/core/services.ts +0 -9
  344. package/packages/lambda/src/functions/serviceApi/core/types.ts +0 -13
  345. package/packages/lambda/src/functions/serviceApi/entry/lambda/https-xray.ts +0 -4
  346. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.spec.ts +0 -48
  347. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.ts +0 -58
  348. package/packages/lambda/src/functions/serviceApi/entry/lambda/services.ts +0 -36
  349. package/packages/lambda/src/functions/serviceApi/entry/local.ts +0 -71
  350. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.spec.ts +0 -16
  351. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.ts +0 -41
  352. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.spec.ts +0 -78
  353. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.ts +0 -70
  354. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.spec.ts +0 -306
  355. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.ts +0 -176
  356. package/packages/lambda/src/functions/serviceApi/versions/v0/index.spec.ts +0 -263
  357. package/packages/lambda/src/functions/serviceApi/versions/v0/index.ts +0 -134
  358. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.spec.ts +0 -23
  359. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.ts +0 -32
  360. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.spec.ts +0 -10
  361. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.ts +0 -7
  362. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.spec.ts +0 -13
  363. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.ts +0 -23
  364. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.spec.ts +0 -9
  365. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.ts +0 -9
  366. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.spec.ts +0 -12
  367. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.ts +0 -21
  368. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.spec.ts +0 -21
  369. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.ts +0 -18
  370. package/packages/lambda/tsconfig.json +0 -30
  371. package/packages/lambda/webpack.config.js +0 -97
  372. package/packages/utils/.eslintrc.js +0 -64
  373. package/packages/utils/README.md +0 -118
  374. package/packages/utils/jest-global-setup.js +0 -3
  375. package/packages/utils/jest.config.js +0 -25
  376. package/packages/utils/jest.resolver.js +0 -17
  377. package/packages/utils/package.json +0 -238
  378. package/packages/utils/src/assertions/index.spec.ts +0 -126
  379. package/packages/utils/src/aws/ssmService.ts +0 -7
  380. package/packages/utils/src/config/awsParameterConfig.ts +0 -24
  381. package/packages/utils/src/config/envConfig.ts +0 -58
  382. package/packages/utils/src/config/index.spec.ts +0 -165
  383. package/packages/utils/src/config/lambdaParameterConfig.ts +0 -49
  384. package/packages/utils/src/config/resolveConfigValue.ts +0 -10
  385. package/packages/utils/src/errors/index.spec.ts +0 -35
  386. package/packages/utils/src/fetch/fetchStatusRetry.spec.ts +0 -197
  387. package/packages/utils/src/fetch/fetchStatusRetry.ts +0 -33
  388. package/packages/utils/src/fetch/index.spec.ts +0 -34
  389. package/packages/utils/src/fetch/index.ts +0 -87
  390. package/packages/utils/src/guards/index.spec.ts +0 -58
  391. package/packages/utils/src/index.spec.ts +0 -471
  392. package/packages/utils/src/middleware/apiErrorHandler.spec.ts +0 -65
  393. package/packages/utils/src/middleware/apiErrorHandler.ts +0 -67
  394. package/packages/utils/src/middleware/apiSlowResponseMiddleware.spec.ts +0 -184
  395. package/packages/utils/src/middleware/apiSlowResponseMiddleware.ts +0 -71
  396. package/packages/utils/src/middleware/index.spec.ts +0 -99
  397. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.spec.ts +0 -103
  398. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.ts +0 -52
  399. package/packages/utils/src/middleware/throwNotFoundMiddleware.spec.ts +0 -20
  400. package/packages/utils/src/middleware/throwNotFoundMiddleware.ts +0 -11
  401. package/packages/utils/src/misc/hashValue.ts +0 -18
  402. package/packages/utils/src/misc/helpers.ts +0 -259
  403. package/packages/utils/src/misc/merge.ts +0 -48
  404. package/packages/utils/src/pagination/index.spec.ts +0 -150
  405. package/packages/utils/src/pagination/index.ts +0 -117
  406. package/packages/utils/src/routing/index.spec.ts +0 -553
  407. package/packages/utils/src/routing/index.ts +0 -424
  408. package/packages/utils/src/routing/validators/zod.spec.ts +0 -16
  409. package/packages/utils/src/routing/validators/zod.ts +0 -14
  410. package/packages/utils/src/services/accountsGateway/README.md +0 -3
  411. package/packages/utils/src/services/accountsGateway/index.spec.ts +0 -518
  412. package/packages/utils/src/services/accountsGateway/index.ts +0 -251
  413. package/packages/utils/src/services/apiGateway/README.md +0 -93
  414. package/packages/utils/src/services/apiGateway/index.spec.ts +0 -254
  415. package/packages/utils/src/services/apiGateway/index.ts +0 -189
  416. package/packages/utils/src/services/authProvider/README.md +0 -21
  417. package/packages/utils/src/services/authProvider/browser.spec.ts +0 -391
  418. package/packages/utils/src/services/authProvider/browser.ts +0 -209
  419. package/packages/utils/src/services/authProvider/decryption.spec.ts +0 -337
  420. package/packages/utils/src/services/authProvider/decryption.ts +0 -98
  421. package/packages/utils/src/services/authProvider/index.ts +0 -93
  422. package/packages/utils/src/services/authProvider/stub.spec.ts +0 -29
  423. package/packages/utils/src/services/authProvider/subrequest.spec.ts +0 -105
  424. package/packages/utils/src/services/authProvider/subrequest.ts +0 -68
  425. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.spec.ts +0 -128
  426. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.ts +0 -106
  427. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.spec.ts +0 -26
  428. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.ts +0 -57
  429. package/packages/utils/src/services/authProvider/utils/userRoleValidator.spec.ts +0 -135
  430. package/packages/utils/src/services/authProvider/utils/userRoleValidator.ts +0 -49
  431. package/packages/utils/src/services/authProvider/utils/userSubrequest.spec.ts +0 -26
  432. package/packages/utils/src/services/authProvider/utils/userSubrequest.ts +0 -10
  433. package/packages/utils/src/services/documentStore/dynamoEncoding.ts +0 -57
  434. package/packages/utils/src/services/documentStore/fileSystemAssert.spec.ts +0 -43
  435. package/packages/utils/src/services/documentStore/fileSystemAssert.ts +0 -10
  436. package/packages/utils/src/services/documentStore/unversioned/README.md +0 -13
  437. package/packages/utils/src/services/documentStore/unversioned/dynamodb.spec.ts +0 -859
  438. package/packages/utils/src/services/documentStore/unversioned/dynamodb.ts +0 -243
  439. package/packages/utils/src/services/documentStore/unversioned/file-system.spec.ts +0 -629
  440. package/packages/utils/src/services/documentStore/unversioned/file-system.ts +0 -194
  441. package/packages/utils/src/services/documentStore/versioned/README.md +0 -13
  442. package/packages/utils/src/services/documentStore/versioned/dynamodb.spec.ts +0 -376
  443. package/packages/utils/src/services/documentStore/versioned/dynamodb.ts +0 -167
  444. package/packages/utils/src/services/documentStore/versioned/file-system.spec.ts +0 -262
  445. package/packages/utils/src/services/documentStore/versioned/file-system.ts +0 -90
  446. package/packages/utils/src/services/documentStore/versioned/index.ts +0 -25
  447. package/packages/utils/src/services/exercisesGateway/README.md +0 -5
  448. package/packages/utils/src/services/exercisesGateway/index.spec.ts +0 -326
  449. package/packages/utils/src/services/exercisesGateway/index.ts +0 -163
  450. package/packages/utils/src/services/fileServer/index.spec.ts +0 -88
  451. package/packages/utils/src/services/fileServer/index.ts +0 -43
  452. package/packages/utils/src/services/fileServer/localFileServer.spec.ts +0 -182
  453. package/packages/utils/src/services/fileServer/localFileServer.ts +0 -159
  454. package/packages/utils/src/services/fileServer/s3FileServer.spec.ts +0 -266
  455. package/packages/utils/src/services/fileServer/s3FileServer.ts +0 -155
  456. package/packages/utils/src/services/launchParams/index.spec.ts +0 -366
  457. package/packages/utils/src/services/launchParams/signer.ts +0 -73
  458. package/packages/utils/src/services/launchParams/verifier.ts +0 -120
  459. package/packages/utils/src/services/logger/console.spec.ts +0 -29
  460. package/packages/utils/src/services/logger/index.spec.ts +0 -65
  461. package/packages/utils/src/services/lrsGateway/README.md +0 -5
  462. package/packages/utils/src/services/lrsGateway/addStatementDefaultFields.ts +0 -22
  463. package/packages/utils/src/services/lrsGateway/attempt-utils.spec.ts +0 -847
  464. package/packages/utils/src/services/lrsGateway/attempt-utils.ts +0 -358
  465. package/packages/utils/src/services/lrsGateway/file-system.spec.ts +0 -363
  466. package/packages/utils/src/services/lrsGateway/file-system.ts +0 -165
  467. package/packages/utils/src/services/lrsGateway/index.spec.ts +0 -194
  468. package/packages/utils/src/services/lrsGateway/index.ts +0 -257
  469. package/packages/utils/src/services/lrsGateway/xapiUtils.spec.ts +0 -887
  470. package/packages/utils/src/services/lrsGateway/xapiUtils.ts +0 -262
  471. package/packages/utils/src/services/postgresConnection/index.spec.ts +0 -170
  472. package/packages/utils/src/services/postgresConnection/index.ts +0 -84
  473. package/packages/utils/src/services/searchProvider/README.md +0 -3
  474. package/packages/utils/src/services/searchProvider/index.ts +0 -59
  475. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.spec.ts +0 -526
  476. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.ts +0 -223
  477. package/packages/utils/src/services/searchProvider/openSearch.spec.ts +0 -926
  478. package/packages/utils/src/services/searchProvider/openSearch.ts +0 -195
  479. package/packages/utils/tsconfig.json +0 -31
  480. package/packages/utils/tsconfig.without-specs.cjs.json +0 -7
  481. package/packages/utils/tsconfig.without-specs.esm.json +0 -7
  482. package/packages/utils/tsconfig.without-specs.json +0 -6
  483. package/scripts/build.bash +0 -24
  484. package/scripts/ci.bash +0 -10
  485. package/scripts/start.bash +0 -29
  486. /package/{packages/utils/src/index.ts → dist/cjs/index.d.ts} +0 -0
  487. /package/{packages/utils/src/services/launchParams/index.ts → dist/cjs/services/launchParams/index.d.ts} +0 -0
  488. /package/{packages/utils/script → script}/bin/copy-from-template.bash +0 -0
  489. /package/{packages/utils/script → script}/bin/delete-stack.bash +0 -0
  490. /package/{packages/utils/script → script}/bin/deploy.bash +0 -0
  491. /package/{packages/utils/script → script}/bin/destroy-deployment.bash +0 -0
  492. /package/{packages/utils/script → script}/bin/empty-bucket.bash +0 -0
  493. /package/{packages/utils/script → script}/bin/get-arg.bash +0 -0
  494. /package/{packages/utils/script → script}/bin/get-deployed-environments.bash +0 -0
  495. /package/{packages/utils/script → script}/bin/get-env-param.bash +0 -0
  496. /package/{packages/utils/script → script}/bin/get-kwarg.bash +0 -0
  497. /package/{packages/utils/script → script}/bin/get-stack-param.bash +0 -0
  498. /package/{packages/utils/script → script}/bin/has-flag.bash +0 -0
  499. /package/{packages/utils/script → script}/bin/init-constants-script.bash +0 -0
  500. /package/{packages/utils/script → script}/bin/init-params-script.bash +0 -0
  501. /package/{packages/utils/script → script}/bin/stack-exists.bash +0 -0
  502. /package/{packages/utils/script → script}/bin/update-utils.bash +0 -0
  503. /package/{packages/utils/script → script}/bin/upload-pager-duty-endpoints.bash +0 -0
  504. /package/{packages/utils/script → script}/bin/upload-params.bash +0 -0
  505. /package/{packages/utils/script → script}/bin/which.bash +0 -0
  506. /package/{packages/utils/script → script}/bin-entry.bash +0 -0
  507. /package/{packages/utils/script → script}/build.bash +0 -0
@@ -0,0 +1,124 @@
1
+ /* cspell:ignore presigner */
2
+ import path from 'path';
3
+ import { CopyObjectCommand, GetObjectCommand, HeadObjectCommand, PutObjectCommand, S3Client } from '@aws-sdk/client-s3';
4
+ import { createPresignedPost } from '@aws-sdk/s3-presigned-post';
5
+ import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
6
+ import { v4 as uuid } from 'uuid';
7
+ import { once } from '../..';
8
+ import { assertDefined } from '../../assertions';
9
+ import { resolveConfigValue } from '../../config';
10
+ import { ifDefined } from '../../guards';
11
+ export const s3FileServer = (initializer) => (configProvider) => {
12
+ const config = configProvider[ifDefined(initializer.configSpace, 'deployed')];
13
+ const bucketName = once(() => resolveConfigValue(config.bucketName));
14
+ const bucketRegion = once(() => resolveConfigValue(config.bucketRegion));
15
+ const publicViewerDomain = once(() => 'publicViewerDomain' in config && config.publicViewerDomain
16
+ ? resolveConfigValue(config.publicViewerDomain)
17
+ : undefined);
18
+ const s3Service = once(async () => {
19
+ var _a, _b;
20
+ const args = { apiVersion: '2012-08-10', region: await bucketRegion() };
21
+ return (_b = (_a = initializer.getS3Client) === null || _a === void 0 ? void 0 : _a.call(initializer, args)) !== null && _b !== void 0 ? _b : new S3Client(args);
22
+ });
23
+ /*
24
+ * https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html
25
+ */
26
+ const getSignedViewerUrl = async (source) => {
27
+ const bucket = (await bucketName());
28
+ const command = new GetObjectCommand({ Bucket: bucket, Key: source.path });
29
+ return getSignedUrl(await s3Service(), command, {
30
+ expiresIn: 3600, // 1 hour
31
+ });
32
+ };
33
+ const getPublicViewerUrl = async (source) => {
34
+ const host = assertDefined(await publicViewerDomain(), new Error(`Tried to get public viewer URL for ${source.path} but no publicViewerDomain configured`));
35
+ return `https://${host}/${source.path}`;
36
+ };
37
+ const getFileContent = async (source) => {
38
+ const bucket = await bucketName();
39
+ const command = new GetObjectCommand({ Bucket: bucket, Key: source.path });
40
+ const response = await (await s3Service()).send(command);
41
+ return Buffer.from(await assertDefined(response.Body, new Error('Invalid Response from s3')).transformToByteArray());
42
+ };
43
+ const putFileContent = async (source, content) => {
44
+ const bucket = await bucketName();
45
+ const command = new PutObjectCommand({
46
+ Bucket: bucket,
47
+ Key: source.path,
48
+ Body: content,
49
+ ContentType: source.mimeType,
50
+ });
51
+ await (await s3Service()).send(command);
52
+ return source;
53
+ };
54
+ /*
55
+ * https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_s3_presigned_post.html
56
+ * https://docs.aws.amazon.com/AmazonS3/latest/userguide/HTTPPOSTExamples.html
57
+ * https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html
58
+ */
59
+ const getSignedFileUploadConfig = async () => {
60
+ const prefix = 'uploads/' + uuid();
61
+ const bucket = (await bucketName());
62
+ const Conditions = [
63
+ { acl: 'private' },
64
+ { bucket },
65
+ ['starts-with', '$key', prefix]
66
+ ];
67
+ const defaultFields = {
68
+ acl: 'private',
69
+ };
70
+ const { url, fields } = await createPresignedPost(await s3Service(), {
71
+ Bucket: bucket,
72
+ Key: prefix + '/${filename}',
73
+ Conditions,
74
+ Fields: defaultFields,
75
+ Expires: 3600, // 1 hour
76
+ });
77
+ return {
78
+ url, payload: fields
79
+ };
80
+ };
81
+ const copyFileTo = async (source, destinationPath) => {
82
+ const bucket = (await bucketName());
83
+ const destinationPathWithoutLeadingSlash = destinationPath.replace(/^\//, '');
84
+ const command = new CopyObjectCommand({
85
+ Bucket: bucket,
86
+ Key: destinationPathWithoutLeadingSlash,
87
+ CopySource: path.join(bucket, source.path),
88
+ });
89
+ await (await s3Service()).send(command);
90
+ return {
91
+ ...source,
92
+ path: destinationPathWithoutLeadingSlash
93
+ };
94
+ };
95
+ const copyFileToDirectory = async (source, destination) => {
96
+ const destinationPath = path.join(destination, source.label);
97
+ return copyFileTo(source, destinationPath);
98
+ };
99
+ const isTemporaryUpload = (source) => {
100
+ return source.path.indexOf('uploads/') === 0;
101
+ };
102
+ const getFileChecksum = async (source) => {
103
+ const bucket = (await bucketName());
104
+ const command = new HeadObjectCommand({ Bucket: bucket, Key: source.path });
105
+ const response = await (await s3Service()).send(command);
106
+ return assertDefined(response.ETag);
107
+ };
108
+ const filesEqual = async (sourceA, sourceB) => {
109
+ const [aSum, bSum] = await Promise.all([getFileChecksum(sourceA), getFileChecksum(sourceB)]);
110
+ return aSum === bSum;
111
+ };
112
+ return {
113
+ getFileContent,
114
+ putFileContent,
115
+ getSignedViewerUrl,
116
+ getPublicViewerUrl,
117
+ getSignedFileUploadConfig,
118
+ copyFileTo,
119
+ copyFileToDirectory,
120
+ isTemporaryUpload,
121
+ getFileChecksum,
122
+ filesEqual,
123
+ };
124
+ };
@@ -0,0 +1,2 @@
1
+ export { createLaunchSigner } from './signer';
2
+ export { createLaunchVerifier } from './verifier';
@@ -0,0 +1,2 @@
1
+ export { createLaunchSigner } from './signer';
2
+ export { createLaunchVerifier } from './verifier';
@@ -0,0 +1,23 @@
1
+ import { JWK } from 'node-jose';
2
+ import { ConfigProviderForConfig } from '../../config';
3
+ import type { JsonCompatibleStruct } from '../../routing';
4
+ type Config = {
5
+ alg: string;
6
+ expiresIn: string;
7
+ iss: string;
8
+ privateKey: string;
9
+ };
10
+ interface Initializer<C> {
11
+ configSpace?: C;
12
+ }
13
+ /**
14
+ * Creates a class that can sign launch params
15
+ */
16
+ export declare const createLaunchSigner: <C extends string = "launch">({ configSpace }: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => {
17
+ jwks: () => Promise<{
18
+ keys: JWK.RawKey[];
19
+ }>;
20
+ sign: (data: JsonCompatibleStruct, subject: string, maxExp?: number | null) => Promise<string>;
21
+ };
22
+ export type LaunchSigner = ReturnType<ReturnType<typeof createLaunchSigner>>;
23
+ export {};
@@ -0,0 +1,51 @@
1
+ import jwt from 'jsonwebtoken';
2
+ import ms from 'ms';
3
+ import { JWK } from 'node-jose';
4
+ import { once } from '../..';
5
+ import { resolveConfigValue } from '../../config';
6
+ import { ifDefined } from '../../guards';
7
+ const SUPPORTED_ALGORITHMS = [
8
+ 'RS256', 'RS384', 'RS512', 'ES256', 'ES384', 'ES512', 'HS256', 'HS384', 'HS512', 'PS256', 'PS384', 'PS512'
9
+ ];
10
+ const assertAlg = (alg) => {
11
+ if ((SUPPORTED_ALGORITHMS).includes(alg)) {
12
+ return alg;
13
+ }
14
+ throw new Error(`"${alg}" is not a valid algorithm`);
15
+ };
16
+ /**
17
+ * Creates a class that can sign launch params
18
+ */
19
+ export const createLaunchSigner = ({ configSpace }) => (configProvider) => {
20
+ const config = configProvider[ifDefined(configSpace, 'launch')];
21
+ const getAlg = once(async () => assertAlg(await resolveConfigValue(config.alg)));
22
+ const getExpiresIn = once(() => resolveConfigValue(config.expiresIn));
23
+ const getIss = once(() => resolveConfigValue(config.iss));
24
+ const getPrivateKey = once(() => resolveConfigValue(config.privateKey));
25
+ const getKeyStore = once(async () => {
26
+ const keystore = JWK.createKeyStore();
27
+ await keystore.add(await getPrivateKey(), 'pem');
28
+ return keystore;
29
+ });
30
+ const jwks = async () => (await getKeyStore()).toJSON(false);
31
+ const getExpiresInWithMax = async (maxExp) => {
32
+ const expiresIn = await getExpiresIn();
33
+ // The ms library used by jsonwebtoken can handle a value in seconds as well as a string like '1d'
34
+ if (!maxExp) {
35
+ return expiresIn;
36
+ }
37
+ // Convert both values to seconds for comparison
38
+ const expiresInSeconds = Math.floor(ms(expiresIn) / 1000);
39
+ const maxExpSeconds = maxExp - Math.floor(Date.now() / 1000);
40
+ return Math.min(expiresInSeconds, maxExpSeconds);
41
+ };
42
+ const sign = async (data, subject, maxExp) => {
43
+ const alg = await getAlg();
44
+ // expiresIn can be a number of seconds or a string like '1h' or '1d'
45
+ const expiresIn = await getExpiresInWithMax(maxExp);
46
+ const iss = await getIss();
47
+ const header = { alg, iss };
48
+ return jwt.sign(data, await getPrivateKey(), { algorithm: alg, expiresIn, header, issuer: iss, subject });
49
+ };
50
+ return { jwks, sign };
51
+ };
@@ -0,0 +1,21 @@
1
+ import jwt from 'jsonwebtoken';
2
+ import type { JWK } from 'node-jose';
3
+ import { ConfigProviderForConfig } from '../../config';
4
+ type Config = {
5
+ trustedDomain: string;
6
+ bypassSignatureVerification: string;
7
+ };
8
+ interface Initializer<C> {
9
+ configSpace?: C;
10
+ fetcher?: (uri: string) => Promise<{
11
+ keys: JWK.RawKey[];
12
+ }>;
13
+ }
14
+ /**
15
+ * Creates a class that can verify launch params
16
+ */
17
+ export declare const createLaunchVerifier: <C extends string = "launch">({ configSpace, fetcher }: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => (_services: {}, getDefaultToken?: () => string) => {
18
+ verify: <T = undefined>(...args: T extends undefined ? ([] | [string]) : ([(input: any) => T] | [string, (input: any) => T])) => Promise<T extends undefined ? jwt.JwtPayload : T>;
19
+ };
20
+ export type LaunchVerifier = ReturnType<ReturnType<ReturnType<typeof createLaunchVerifier>>>;
21
+ export {};
@@ -0,0 +1,92 @@
1
+ import jwt, { TokenExpiredError } from 'jsonwebtoken';
2
+ import { JwksClient } from 'jwks-rsa';
3
+ import { memoize } from '../..';
4
+ import { resolveConfigValue } from '../../config';
5
+ import { InvalidRequestError, SessionExpiredError } from '../../errors';
6
+ import { ifDefined } from '../../guards';
7
+ import { once } from '../../misc/helpers';
8
+ /**
9
+ * Creates a class that can verify launch params
10
+ */
11
+ export const createLaunchVerifier = ({ configSpace, fetcher }) => (configProvider) => {
12
+ const config = configProvider[ifDefined(configSpace, 'launch')];
13
+ const getTrustedDomain = once(() => resolveConfigValue(config.trustedDomain));
14
+ const getBypassSignatureVerification = once(async () => (await resolveConfigValue(config.bypassSignatureVerification)) === 'true');
15
+ const getJwksClient = memoize((jwksUri) => new JwksClient({ fetcher, jwksUri }));
16
+ const getJwksKey = memoize(async (jwksUri, kid) => {
17
+ const client = getJwksClient(jwksUri);
18
+ const key = await client.getSigningKey(kid);
19
+ return key.getPublicKey();
20
+ });
21
+ const getKey = async (header, callback) => {
22
+ // The JWT spec allows iss in the header as a copy of the iss claim, but we require it
23
+ if (!header.iss) {
24
+ return callback(new Error('JWT header missing iss claim'));
25
+ }
26
+ const { iss, kid } = header;
27
+ try {
28
+ const jwksUrl = new URL('/.well-known/jwks.json', iss);
29
+ const launchDomain = jwksUrl.hostname;
30
+ const trustedDomain = await getTrustedDomain();
31
+ if (launchDomain !== trustedDomain && !launchDomain.endsWith(`.${trustedDomain}`)) {
32
+ return callback(new Error(`Untrusted launch domain: "${launchDomain}"`));
33
+ }
34
+ callback(null, await getJwksKey(jwksUrl.toString(), kid));
35
+ }
36
+ catch (error) {
37
+ callback(error);
38
+ }
39
+ };
40
+ return (_services, getDefaultToken) => {
41
+ const verify = async (...args) => {
42
+ const [inputToken, validator] = args.length === 1
43
+ ? typeof args[0] === 'string'
44
+ ? [args[0], undefined]
45
+ : [undefined, args[0]]
46
+ : args;
47
+ const bypassSignatureVerification = await getBypassSignatureVerification();
48
+ return new Promise((resolve, reject) => {
49
+ const token = inputToken !== null && inputToken !== void 0 ? inputToken : getDefaultToken === null || getDefaultToken === void 0 ? void 0 : getDefaultToken();
50
+ if (!token) {
51
+ return reject(new InvalidRequestError('Missing token for launch verification'));
52
+ }
53
+ const resolvePayload = (err, payload) => {
54
+ if (err && err instanceof TokenExpiredError) {
55
+ reject(new SessionExpiredError());
56
+ }
57
+ else if (err) {
58
+ reject(err);
59
+ }
60
+ else if (typeof payload !== 'object' || payload === null) {
61
+ reject(new Error('received JWT token with unexpected non-JSON payload'));
62
+ }
63
+ else if (!payload.sub) {
64
+ reject(new Error('JWT payload missing sub claim'));
65
+ }
66
+ else {
67
+ // we are migrating away from json encoding all the parameters into the `sub` claim
68
+ // and into using separate claims for each parameter. in transition, we check if the sub
69
+ // is json and return it if it is. this is still a breaking change when using this
70
+ // utility because applications no longer need to independently json parse the result
71
+ // starting now.
72
+ const parsed = payload;
73
+ try {
74
+ const jsonSubContents = JSON.parse(payload.sub);
75
+ Object.assign(parsed, jsonSubContents);
76
+ }
77
+ catch (e) { } // eslint-disable-line no-empty
78
+ // conditional return types are annoying
79
+ resolve((validator ? validator(parsed) : parsed));
80
+ }
81
+ };
82
+ if (bypassSignatureVerification) {
83
+ return resolvePayload(null, jwt.decode(token));
84
+ }
85
+ else {
86
+ return jwt.verify(token, getKey, {}, resolvePayload);
87
+ }
88
+ });
89
+ };
90
+ return { verify };
91
+ };
92
+ };
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Creates a logger that logs to the console.
3
+ */
4
+ export declare const createConsoleLogger: () => import(".").Logger;
@@ -1,11 +1,8 @@
1
1
  import { createCoreLogger } from '.';
2
-
3
2
  /**
4
3
  * Creates a logger that logs to the console.
5
4
  */
6
- export const createConsoleLogger = () => createCoreLogger((level, event) =>
7
- console[level](JSON.stringify({
5
+ export const createConsoleLogger = () => createCoreLogger((level, event) => console[level](JSON.stringify({
8
6
  eventType: level.toUpperCase(),
9
7
  ...event,
10
- }))
11
- );
8
+ })));
@@ -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 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) => Logger;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The log level
3
+ */
4
+ export var Level;
5
+ (function (Level) {
6
+ Level["Info"] = "info";
7
+ Level["Warn"] = "warn";
8
+ Level["Error"] = "error";
9
+ })(Level || (Level = {}));
10
+ /**
11
+ * Creates a logger that logs events using the given driver and context provider.
12
+ *
13
+ * @param driver the driver that logs events
14
+ * @param getParentContext a provider that returns the context to use for this logger
15
+ * (the context is returned when messages are logged with the logger)
16
+ * @returns a Logger
17
+ */
18
+ export const createCoreLogger = (driver, getParentContext) => {
19
+ const context = {};
20
+ const getContext = () => ({ ...getParentContext === null || getParentContext === void 0 ? void 0 : getParentContext(), ...context });
21
+ return {
22
+ logEvent: (level, event) => driver(level, { ...event, context: getContext() }),
23
+ log: (message, level = Level.Info) => driver(level, { message, context: getContext() }),
24
+ setContext: (obj) => { Object.assign(context, obj); },
25
+ createSubContext: () => createCoreLogger(driver, getContext),
26
+ };
27
+ };
@@ -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,14 @@
1
+ import formatISO from 'date-fns/formatISO';
2
+ import { v4 as uuid } from 'uuid';
3
+ export const addStatementDefaultFields = (statement, user) => ({
4
+ id: uuid(),
5
+ actor: {
6
+ account: {
7
+ homePage: 'https://openstax.org',
8
+ name: user.uuid,
9
+ },
10
+ objectType: 'Agent',
11
+ },
12
+ timestamp: formatISO(new Date()),
13
+ ...statement,
14
+ });
@@ -0,0 +1,72 @@
1
+ import { LrsGateway, UXapiStatement } from '.';
2
+ export type ActivityState = {
3
+ attempts: number;
4
+ bestCompletedAttempt?: UXapiStatement;
5
+ bestCompletedAttemptCompleted?: UXapiStatement;
6
+ completedAttempts: number;
7
+ currentAttempt?: UXapiStatement;
8
+ currentAttemptCompleted?: UXapiStatement;
9
+ currentAttemptStatements: UXapiStatement[];
10
+ mostRecentAttemptWithCompleted?: UXapiStatement;
11
+ mostRecentAttemptWithCompletedCompleted?: UXapiStatement;
12
+ };
13
+ export declare const matchAttempt: (statement: UXapiStatement) => boolean;
14
+ export declare const matchAttemptCompleted: (attempt: UXapiStatement) => (statement: UXapiStatement) => boolean;
15
+ export declare const resolveAttempts: (statements: UXapiStatement[], options?: {
16
+ activityIRI?: string;
17
+ parentActivityAttempt?: string;
18
+ }) => UXapiStatement[];
19
+ export declare const resolveCompletedForAttempt: (statements: UXapiStatement[], attempt: UXapiStatement, activityIRI?: string) => UXapiStatement | undefined;
20
+ export declare const oldestStatement: (statements: UXapiStatement[]) => UXapiStatement | undefined;
21
+ export declare const mostRecentStatement: (statements: UXapiStatement[]) => UXapiStatement | undefined;
22
+ export declare const resolveAttemptInfo: (statements: UXapiStatement[], options?: {
23
+ activityIRI?: string;
24
+ currentAttempt?: string;
25
+ parentActivityAttempt?: string;
26
+ currentPreference?: "latest" | "oldest";
27
+ }) => ActivityState;
28
+ export declare const loadStatementsForActivityAndFirstChildren: (gateway: LrsGateway, activityIRI: string, options?: {
29
+ anyUser?: boolean;
30
+ attempt?: string;
31
+ ensureSync?: boolean;
32
+ user?: string;
33
+ }) => Promise<import(".").XapiStatement[]>;
34
+ export declare const loadActivityAttemptInfo: (gateway: LrsGateway, activityIRI: string, options?: {
35
+ currentAttempt?: string;
36
+ parentActivityAttempt?: string;
37
+ ensureSync?: boolean;
38
+ }) => Promise<ActivityState>;
39
+ export declare const createStatement: (verb: UXapiStatement["verb"], activity: {
40
+ iri: string;
41
+ type: string;
42
+ name: string;
43
+ extensions?: {
44
+ [key: string]: string;
45
+ };
46
+ }, attempt: string, parentActivityIRI?: string) => Pick<UXapiStatement, "object" | "verb" | "context">;
47
+ export declare const createAttemptStatement: (activity: {
48
+ iri: string;
49
+ type: string;
50
+ name: string;
51
+ extensions?: {
52
+ [key: string]: string;
53
+ };
54
+ }, parentActivity?: {
55
+ iri?: string;
56
+ attempt?: string;
57
+ }) => Pick<UXapiStatement, "object" | "verb" | "context">;
58
+ export declare const putAttemptStatement: (gateway: LrsGateway, activity: {
59
+ iri: string;
60
+ type: string;
61
+ name: string;
62
+ extensions?: {
63
+ [key: string]: string;
64
+ };
65
+ }, parentActivity?: {
66
+ iri?: string;
67
+ attempt?: string;
68
+ }) => Promise<import(".").EagerXapiStatement>;
69
+ export declare const createAttemptActivityStatement: (attemptStatement: UXapiStatement, verb: UXapiStatement["verb"], result?: UXapiStatement["result"]) => Pick<UXapiStatement, "object" | "verb" | "context" | "result">;
70
+ export declare const putAttemptActivityStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, verb: UXapiStatement["verb"], result?: UXapiStatement["result"]) => Promise<import(".").EagerXapiStatement>;
71
+ export declare const createCompletedStatement: (attemptStatement: UXapiStatement, result?: UXapiStatement["result"]) => Pick<UXapiStatement, "object" | "verb" | "context" | "result">;
72
+ export declare const putCompletedStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, result: UXapiStatement["result"]) => Promise<import(".").EagerXapiStatement>;