@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,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.decryptionAuthProvider = void 0;
4
+ const resolveConfigValue_1 = require("../../config/resolveConfigValue");
5
+ const errors_1 = require("../../errors");
6
+ const guards_1 = require("../../guards");
7
+ const helpers_1 = require("../../misc/helpers");
8
+ const decryptAndVerify_1 = require("./utils/decryptAndVerify");
9
+ const userSubrequest_1 = require("./utils/userSubrequest");
10
+ const _1 = require(".");
11
+ const decryptionAuthProvider = (initializer) => (configProvider) => {
12
+ const config = configProvider[(0, guards_1.ifDefined)(initializer.configSpace, 'decryption')];
13
+ const accountsBase = (0, helpers_1.once)(() => (0, resolveConfigValue_1.resolveConfigValue)(config.accountsBase));
14
+ const cookieName = (0, helpers_1.once)(() => (0, resolveConfigValue_1.resolveConfigValue)(config.cookieName));
15
+ const encryptionPrivateKey = (0, helpers_1.once)(() => (0, resolveConfigValue_1.resolveConfigValue)(config.encryptionPrivateKey));
16
+ const signaturePublicKey = (0, helpers_1.once)(() => (0, resolveConfigValue_1.resolveConfigValue)(config.signaturePublicKey));
17
+ return ({ request, logger }) => {
18
+ let user;
19
+ let userData;
20
+ const getAuthToken = async () => (0, _1.getAuthTokenOrCookie)(request, await cookieName())[0];
21
+ const getAuthorizedFetchConfig = async () => {
22
+ const [token, headers] = (0, _1.getAuthTokenOrCookie)(request, await cookieName());
23
+ if (!token) {
24
+ return {};
25
+ }
26
+ return { headers };
27
+ };
28
+ const getDecryptedPayload = async (tokenString) => {
29
+ const token = tokenString !== null && tokenString !== void 0 ? tokenString : await getAuthToken();
30
+ if (!token) {
31
+ return undefined;
32
+ }
33
+ return (0, decryptAndVerify_1.decryptAndVerify)(token, await encryptionPrivateKey(), await signaturePublicKey());
34
+ };
35
+ const getUser = async () => {
36
+ if (!user) {
37
+ const result = await getDecryptedPayload();
38
+ if (!result) {
39
+ return undefined;
40
+ }
41
+ if ('error' in result && result.error == 'expired token') {
42
+ throw new errors_1.SessionExpiredError();
43
+ }
44
+ if ('user' in result) {
45
+ logger.setContext({ user: result.user.uuid });
46
+ user = result.user;
47
+ }
48
+ }
49
+ return user;
50
+ };
51
+ return {
52
+ getAuthToken,
53
+ getAuthorizedFetchConfig,
54
+ getTokenExpiration: async (tokenString) => {
55
+ var _a;
56
+ const payload = await getDecryptedPayload(tokenString);
57
+ return payload ? ((_a = payload.exp) !== null && _a !== void 0 ? _a : null) : undefined;
58
+ },
59
+ getUser,
60
+ loadUserData: async () => {
61
+ if (!userData) {
62
+ const token = await getAuthToken();
63
+ if (!token) {
64
+ return undefined;
65
+ }
66
+ userData = await (0, userSubrequest_1.loadUserData)(initializer.fetch, await accountsBase(), await cookieName(), token);
67
+ }
68
+ return userData;
69
+ },
70
+ };
71
+ };
72
+ };
73
+ exports.decryptionAuthProvider = decryptionAuthProvider;
@@ -0,0 +1,63 @@
1
+ import type { FetchConfig } from '../../fetch';
2
+ import type { HttpHeaders, QueryParams } from '../../routing';
3
+ import type { Logger } from '../logger';
4
+ export type ConsentPreferences = {
5
+ consent_preferences: {
6
+ accepted: string[];
7
+ rejected: string[];
8
+ };
9
+ };
10
+ export type TokenUser = {
11
+ id: number;
12
+ name: string;
13
+ uuid: string;
14
+ faculty_status: string;
15
+ is_admin: boolean;
16
+ };
17
+ export type ApiUser = TokenUser & {
18
+ first_name: string;
19
+ last_name: string;
20
+ full_name: string;
21
+ contact_infos: Array<{
22
+ type: string;
23
+ value: string;
24
+ is_verified: boolean;
25
+ is_guessed_preferred: boolean;
26
+ }>;
27
+ applications: Array<{
28
+ id: number;
29
+ name: string;
30
+ roles: string[];
31
+ }>;
32
+ external_ids: string[];
33
+ is_not_gdpr_location: boolean;
34
+ self_reported_role: string;
35
+ signed_contract_names: string[];
36
+ using_openstax: boolean;
37
+ } & Partial<ConsentPreferences>;
38
+ export type User = TokenUser | ApiUser;
39
+ export type AuthProvider = {
40
+ getAuthToken: () => Promise<string | null>;
41
+ getUser: () => Promise<User | undefined>;
42
+ /**
43
+ * gets second argument for `fetch` that has authentication token or cookie
44
+ */
45
+ getAuthorizedFetchConfig: () => Promise<FetchConfig>;
46
+ loadUserData: () => Promise<ApiUser | undefined>;
47
+ };
48
+ export type CookieAuthProviderRequest = {
49
+ cookies?: string[];
50
+ headers: HttpHeaders;
51
+ queryStringParameters?: QueryParams;
52
+ };
53
+ export type CookieAuthProvider<T extends AuthProvider = AuthProvider> = (inputs: {
54
+ request: CookieAuthProviderRequest;
55
+ logger: Logger;
56
+ }) => T;
57
+ export type StubAuthProvider = (user: User | undefined) => AuthProvider;
58
+ export declare const stubAuthProvider: (user?: User) => AuthProvider;
59
+ export declare const getAuthTokenOrCookie: (request: CookieAuthProviderRequest, cookieName: string, queryKey?: string) => [string, {
60
+ Authorization: string;
61
+ }] | [string, {
62
+ cookie: string;
63
+ }] | [null, {}];
@@ -0,0 +1,34 @@
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.getAuthTokenOrCookie = exports.stubAuthProvider = void 0;
7
+ const cookie_1 = __importDefault(require("cookie"));
8
+ const helpers_1 = require("../../misc/helpers");
9
+ const helpers_2 = require("../../routing/helpers");
10
+ const stubAuthProvider = (user) => {
11
+ const getUser = () => Promise.resolve(user);
12
+ return {
13
+ getAuthToken: () => Promise.resolve('authToken'),
14
+ getUser,
15
+ getAuthorizedFetchConfig: () => Promise.resolve(user ? { headers: { Authorization: user.uuid } } : {}),
16
+ // This is not technically correct, but most tests won't care
17
+ loadUserData: getUser
18
+ };
19
+ };
20
+ exports.stubAuthProvider = stubAuthProvider;
21
+ const getAuthTokenOrCookie = (request, cookieName, queryKey = 'auth') => {
22
+ var _a, _b;
23
+ const authParam = request.queryStringParameters ? request.queryStringParameters[queryKey] : undefined;
24
+ const authHeader = (0, helpers_2.getHeader)(request.headers, 'authorization');
25
+ const cookieValue = cookie_1.default.parse((_b = (_a = request.cookies) === null || _a === void 0 ? void 0 : _a.join('; ')) !== null && _b !== void 0 ? _b : '')[cookieName];
26
+ return typeof authParam === 'string'
27
+ ? (0, helpers_1.tuple)(authParam, { Authorization: `Bearer ${authParam}` })
28
+ : authHeader && authHeader.length >= 8 && authHeader.startsWith('Bearer ')
29
+ ? (0, helpers_1.tuple)(authHeader.slice(7), { Authorization: authHeader })
30
+ : cookieValue
31
+ ? (0, helpers_1.tuple)(cookieValue, { cookie: cookie_1.default.serialize(cookieName, cookieValue) })
32
+ : (0, helpers_1.tuple)(null, {});
33
+ };
34
+ exports.getAuthTokenOrCookie = getAuthTokenOrCookie;
@@ -0,0 +1,13 @@
1
+ import { ConfigProviderForConfig } from '../../config';
2
+ import { GenericFetch } from '../../fetch';
3
+ import { CookieAuthProvider } from '.';
4
+ type Config = {
5
+ accountsBase: string;
6
+ cookieName: string;
7
+ };
8
+ interface Initializer<C> {
9
+ configSpace?: C;
10
+ fetch: GenericFetch;
11
+ }
12
+ export declare const subrequestAuthProvider: <C extends string = "subrequest">(initializer: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => CookieAuthProvider;
13
+ export {};
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.subrequestAuthProvider = void 0;
4
+ const __1 = require("../..");
5
+ const config_1 = require("../../config");
6
+ const guards_1 = require("../../guards");
7
+ const userSubrequest_1 = require("./utils/userSubrequest");
8
+ const _1 = require(".");
9
+ const subrequestAuthProvider = (initializer) => (configProvider) => {
10
+ const config = configProvider[(0, guards_1.ifDefined)(initializer.configSpace, 'subrequest')];
11
+ const cookieName = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.cookieName));
12
+ const accountsBase = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.accountsBase));
13
+ return ({ request, logger }) => {
14
+ let user;
15
+ const getAuthToken = async () => (0, _1.getAuthTokenOrCookie)(request, await cookieName())[0];
16
+ const getAuthorizedFetchConfig = async () => {
17
+ const [token, headers] = (0, _1.getAuthTokenOrCookie)(request, await cookieName());
18
+ if (!token) {
19
+ return {};
20
+ }
21
+ return { headers };
22
+ };
23
+ const loadUser = async () => {
24
+ const resolvedCookieName = await cookieName();
25
+ const [token] = (0, _1.getAuthTokenOrCookie)(request, resolvedCookieName);
26
+ if (!token) {
27
+ return undefined;
28
+ }
29
+ const user = await (0, userSubrequest_1.loadUserData)(initializer.fetch, await accountsBase(), resolvedCookieName, token);
30
+ if (user) {
31
+ logger.setContext({ user: user.uuid });
32
+ }
33
+ return user;
34
+ };
35
+ const getUser = async () => {
36
+ if (!user) {
37
+ user = await loadUser();
38
+ }
39
+ return user;
40
+ };
41
+ return {
42
+ getAuthToken,
43
+ getAuthorizedFetchConfig,
44
+ getUser,
45
+ loadUserData: getUser
46
+ };
47
+ };
48
+ };
49
+ exports.subrequestAuthProvider = subrequestAuthProvider;
@@ -0,0 +1,28 @@
1
+ import type { User } from '..';
2
+ export declare const decryptJwe: (jwe: string, encryptionPrivateKey: Buffer | string) => string | undefined;
3
+ type MaybeAccountsSSOToken = {
4
+ iss?: string;
5
+ sub?: User | string;
6
+ aud?: string;
7
+ exp?: number;
8
+ nbf?: number;
9
+ iat?: number;
10
+ jti?: string;
11
+ };
12
+ export declare const verifyJws: (jws: string, signaturePublicKey: Buffer | string) => MaybeAccountsSSOToken | undefined;
13
+ /**
14
+ * Decrypts and verifies a SSO cookie.
15
+ *
16
+ * @param token the encrypted token
17
+ * @param encryptionPrivateKey the private key used to encrypt the token
18
+ * @param signaturePublicKey the public key used to verify the decrypted token
19
+ * @returns {user: User; exp: number} (success) or {error: string} (failure)
20
+ */
21
+ export declare const decryptAndVerify: (token: string, encryptionPrivateKey: string, signaturePublicKey: string) => {
22
+ user: User;
23
+ exp: number;
24
+ } | {
25
+ error: string;
26
+ exp?: number;
27
+ };
28
+ export {};
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.decryptAndVerify = exports.verifyJws = exports.decryptJwe = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const guards_1 = require("../../../guards");
6
+ const decryptJwe = (jwe, encryptionPrivateKey) => {
7
+ const jweParts = jwe.split('.', 6);
8
+ if (jweParts.length !== 5 || jweParts[1]) {
9
+ return undefined;
10
+ } // Invalid/unsupported JWE
11
+ const header = JSON.parse(Buffer.from(jweParts[0], 'base64url').toString());
12
+ if (header.alg !== 'dir' || header.enc !== 'A256GCM') {
13
+ // Unsupported signature/encryption algorithm
14
+ return undefined;
15
+ }
16
+ const aad = Buffer.from(jweParts[0]);
17
+ const iv = Buffer.from(jweParts[2], 'base64url');
18
+ const cipherText = Buffer.from(jweParts[3], 'base64url');
19
+ const authTag = Buffer.from(jweParts[4], 'base64url');
20
+ // Verify token signature and decrypt
21
+ const decipher = (0, crypto_1.createDecipheriv)('aes-256-gcm', encryptionPrivateKey, iv, { authTagLength: 16 });
22
+ decipher.setAAD(aad, { plaintextLength: cipherText.length });
23
+ try {
24
+ decipher.setAuthTag(authTag);
25
+ return `${decipher.update(cipherText)}${decipher.final()}`;
26
+ }
27
+ catch (error) {
28
+ // Invalid cipherText or authTag
29
+ return undefined;
30
+ }
31
+ };
32
+ exports.decryptJwe = decryptJwe;
33
+ const issuer = 'OpenStax Accounts';
34
+ const audience = 'OpenStax';
35
+ const clockTolerance = 300; // 5 minutes
36
+ const verifyJws = (jws, signaturePublicKey) => {
37
+ const jwsParts = jws.split('.', 4);
38
+ if (jwsParts.length !== 3) {
39
+ return undefined;
40
+ } // Invalid JWS
41
+ const header = JSON.parse(Buffer.from(jwsParts[0], 'base64url').toString());
42
+ if (header.alg !== 'RS256' || header.typ !== 'JWT') {
43
+ return undefined;
44
+ } // Unsupported JWS
45
+ const signedContent = Buffer.from(`${jwsParts[0]}.${jwsParts[1]}`);
46
+ const signature = Buffer.from(jwsParts[2], 'base64url');
47
+ if (!(0, crypto_1.verify)('RSA-SHA256', signedContent, signaturePublicKey, signature)) {
48
+ return undefined;
49
+ }
50
+ const payload = Buffer.from(jwsParts[1], 'base64url').toString();
51
+ try {
52
+ return JSON.parse(payload);
53
+ }
54
+ catch (error) {
55
+ return undefined;
56
+ }
57
+ };
58
+ exports.verifyJws = verifyJws;
59
+ /**
60
+ * Decrypts and verifies a SSO cookie.
61
+ *
62
+ * @param token the encrypted token
63
+ * @param encryptionPrivateKey the private key used to encrypt the token
64
+ * @param signaturePublicKey the public key used to verify the decrypted token
65
+ * @returns {user: User; exp: number} (success) or {error: string} (failure)
66
+ */
67
+ const decryptAndVerify = (token, encryptionPrivateKey, signaturePublicKey) => {
68
+ const timestamp = Math.floor(Date.now() / 1000);
69
+ const jws = (0, exports.decryptJwe)(token, encryptionPrivateKey);
70
+ if (!jws) {
71
+ return { error: 'invalid token' };
72
+ }
73
+ const payload = (0, exports.verifyJws)(jws, signaturePublicKey);
74
+ // Ensure payload contains all the claims we expect
75
+ // Normally "sub" would be a string but Accounts uses an object for it instead
76
+ if (!(0, guards_1.isPlainObject)(payload) ||
77
+ !(0, guards_1.isPlainObject)(payload.sub) || !payload.sub.uuid ||
78
+ payload.iss !== issuer ||
79
+ payload.aud !== audience ||
80
+ !payload.exp ||
81
+ !payload.nbf || payload.nbf > timestamp + clockTolerance ||
82
+ !payload.iat || payload.iat > timestamp + clockTolerance ||
83
+ !payload.jti) {
84
+ return { error: 'invalid token' };
85
+ }
86
+ if (payload.exp < timestamp - clockTolerance) {
87
+ return { error: 'expired token', exp: payload.exp };
88
+ }
89
+ return { user: payload.sub, exp: payload.exp };
90
+ };
91
+ exports.decryptAndVerify = decryptAndVerify;
@@ -0,0 +1,26 @@
1
+ import { User } from '..';
2
+ import { Window } from '../browser';
3
+ export type UserData<T = User> = {
4
+ user?: T;
5
+ token: string | null;
6
+ };
7
+ type UserDataLoader = () => Promise<UserData>;
8
+ export declare enum PostMessageTypes {
9
+ ReceiveUser = "receive-user",
10
+ RequestUser = "request-user"
11
+ }
12
+ export declare const embeddedAuthProvider: (getUserData: UserDataLoader, { authQuery, window }: {
13
+ authQuery?: {
14
+ key: string;
15
+ value: string | null;
16
+ };
17
+ window: Window;
18
+ }) => {
19
+ embeddedQueryKey: string;
20
+ embeddedQueryValue: string;
21
+ getAuthorizedEmbedUrl: (urlString: string, extraParams?: {
22
+ [key: string]: string;
23
+ }) => string;
24
+ unmount: () => void;
25
+ };
26
+ export {};
@@ -0,0 +1,47 @@
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.embeddedAuthProvider = exports.PostMessageTypes = void 0;
7
+ const query_string_1 = __importDefault(require("query-string"));
8
+ var PostMessageTypes;
9
+ (function (PostMessageTypes) {
10
+ PostMessageTypes["ReceiveUser"] = "receive-user";
11
+ PostMessageTypes["RequestUser"] = "request-user";
12
+ })(PostMessageTypes || (exports.PostMessageTypes = PostMessageTypes = {}));
13
+ const embeddedAuthProvider = (getUserData, { authQuery, window }) => {
14
+ const trustedEmbeds = new Set();
15
+ const embeddedQueryKey = 'embedded';
16
+ const embeddedQueryValue = 'true';
17
+ const messageHandler = event => {
18
+ if (event.data.type === PostMessageTypes.RequestUser && trustedEmbeds.has(event.origin)) {
19
+ getUserData().then(data => {
20
+ event.source.postMessage({ type: PostMessageTypes.ReceiveUser, userData: data }, event.origin);
21
+ });
22
+ }
23
+ };
24
+ window.addEventListener('message', messageHandler);
25
+ const getAuthorizedEmbedUrl = (urlString, extraParams) => {
26
+ const url = new URL(urlString);
27
+ trustedEmbeds.add(url.origin);
28
+ const params = query_string_1.default.parse(url.search);
29
+ url.search = query_string_1.default.stringify({
30
+ ...params,
31
+ ...extraParams,
32
+ ...(authQuery && authQuery.value ? { [authQuery.key]: authQuery.value } : { auth: 'embedded' }),
33
+ [embeddedQueryKey]: embeddedQueryValue,
34
+ subcontent: 'true',
35
+ });
36
+ return url.href;
37
+ };
38
+ return {
39
+ embeddedQueryKey,
40
+ embeddedQueryValue,
41
+ getAuthorizedEmbedUrl,
42
+ unmount: () => {
43
+ window.removeEventListener('message', messageHandler);
44
+ }
45
+ };
46
+ };
47
+ exports.embeddedAuthProvider = embeddedAuthProvider;
@@ -0,0 +1,13 @@
1
+ import { AuthProvider } from '..';
2
+ import { AssertionFailed } from '../../../assertions';
3
+ import { ConfigProviderForConfig } from '../../../config';
4
+ type Config = {
5
+ application: string;
6
+ };
7
+ export declare const createUserRoleValidator: (auth: AuthProvider, config: ConfigProviderForConfig<Config>) => {
8
+ getUserRoles: () => Promise<string[]>;
9
+ userHasRole: (role: string[]) => Promise<boolean>;
10
+ assertUserRole: (role: string[], fail?: AssertionFailed) => Promise<void>;
11
+ };
12
+ export type UserRoleValidator = ReturnType<typeof createUserRoleValidator>;
13
+ export {};
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createUserRoleValidator = void 0;
4
+ const assertions_1 = require("../../../assertions");
5
+ const resolveConfigValue_1 = require("../../../config/resolveConfigValue");
6
+ const errors_1 = require("../../../errors");
7
+ const helpers_1 = require("../../../misc/helpers");
8
+ const createUserRoleValidator = (auth, config) => {
9
+ const application = (0, helpers_1.once)(() => (0, resolveConfigValue_1.resolveConfigValue)(config.application));
10
+ const getUserRoles = async () => {
11
+ var _a;
12
+ const user = await auth.getUser();
13
+ const appName = await application();
14
+ if (!user || !('applications' in user)) {
15
+ return [];
16
+ }
17
+ return ((_a = user.applications.find(a => a.name === appName)) === null || _a === void 0 ? void 0 : _a.roles) || [];
18
+ };
19
+ const userHasRole = async (role) => {
20
+ const roles = await getUserRoles();
21
+ if (!roles.some(r => role.includes(r))) {
22
+ return false;
23
+ }
24
+ return true;
25
+ };
26
+ const assertUserRole = async (role, fail = new errors_1.UnauthorizedError()) => {
27
+ if (!await userHasRole(role)) {
28
+ return (0, assertions_1.doThrow)(fail);
29
+ }
30
+ };
31
+ return {
32
+ getUserRoles,
33
+ userHasRole,
34
+ assertUserRole
35
+ };
36
+ };
37
+ exports.createUserRoleValidator = createUserRoleValidator;
@@ -0,0 +1,3 @@
1
+ import { ApiUser } from '..';
2
+ import { GenericFetch } from '../../../fetch';
3
+ export declare const loadUserData: (fetch: GenericFetch, accountsBase: string, cookieName: string, token: string) => Promise<ApiUser | undefined>;
@@ -0,0 +1,13 @@
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.loadUserData = void 0;
7
+ const cookie_1 = __importDefault(require("cookie"));
8
+ const loadUserData = (fetch, accountsBase, cookieName, token) => {
9
+ const headers = { cookie: cookie_1.default.serialize(cookieName, token) };
10
+ return fetch(accountsBase.replace(/\/+$/, '') + '/api/user', { headers })
11
+ .then(response => response.json());
12
+ };
13
+ exports.loadUserData = loadUserData;
@@ -0,0 +1,10 @@
1
+ import { AttributeValue } from '@aws-sdk/client-dynamodb';
2
+ import { DocumentBaseType, DocumentBaseValueTypes } from '.';
3
+ export declare const encodeDynamoAttribute: (value: DocumentBaseValueTypes) => AttributeValue;
4
+ export declare const encodeDynamoDocument: (base: DocumentBaseType) => {
5
+ [k: string]: AttributeValue;
6
+ };
7
+ export declare const decodeDynamoAttribute: (value: AttributeValue) => DocumentBaseValueTypes;
8
+ export declare const decodeDynamoDocument: <T extends DocumentBaseType>(document: {
9
+ [key: string]: AttributeValue;
10
+ }) => T;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.decodeDynamoDocument = exports.decodeDynamoAttribute = exports.encodeDynamoDocument = exports.encodeDynamoAttribute = void 0;
4
+ const guards_1 = require("../../guards");
5
+ const encodeDynamoAttribute = (value) => {
6
+ if (typeof value === 'string') {
7
+ return { S: value };
8
+ }
9
+ if (typeof value === 'number') {
10
+ return { N: value.toString() };
11
+ }
12
+ if (typeof value === 'boolean') {
13
+ return { BOOL: value };
14
+ }
15
+ if (value === null) {
16
+ return { NULL: true };
17
+ }
18
+ if (value instanceof Array) {
19
+ return { L: value.map(exports.encodeDynamoAttribute) };
20
+ }
21
+ if ((0, guards_1.isPlainObject)(value)) {
22
+ return { M: (0, exports.encodeDynamoDocument)(value) };
23
+ }
24
+ throw new Error(`unknown attribute type ${typeof value} with value ${value}.`);
25
+ };
26
+ exports.encodeDynamoAttribute = encodeDynamoAttribute;
27
+ const encodeDynamoDocument = (base) => Object.fromEntries(Object.entries(base).map(([key, value]) => ([key, (0, exports.encodeDynamoAttribute)(value)])));
28
+ exports.encodeDynamoDocument = encodeDynamoDocument;
29
+ const decodeDynamoAttribute = (value) => {
30
+ if (value.S !== undefined) {
31
+ return value.S;
32
+ }
33
+ if (value.N !== undefined) {
34
+ return parseFloat(value.N);
35
+ }
36
+ if (value.BOOL !== undefined) {
37
+ return value.BOOL;
38
+ }
39
+ if (value.NULL !== undefined) {
40
+ return null;
41
+ }
42
+ if (value.L !== undefined) {
43
+ return value.L.map(exports.decodeDynamoAttribute);
44
+ }
45
+ if (value.M !== undefined) {
46
+ return (0, exports.decodeDynamoDocument)(value.M);
47
+ }
48
+ throw new Error(`unknown attribute type: ${JSON.stringify(value)}.`);
49
+ };
50
+ exports.decodeDynamoAttribute = decodeDynamoAttribute;
51
+ const decodeDynamoDocument = (document) => Object.fromEntries(Object.entries(document).map(([key, value]) => ([key, (0, exports.decodeDynamoAttribute)(value)])));
52
+ exports.decodeDynamoDocument = decodeDynamoDocument;
@@ -0,0 +1 @@
1
+ export declare const assertNoUndefined: (obj: any, path?: string[]) => void;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertNoUndefined = void 0;
4
+ const assertNoUndefined = (obj, path = []) => {
5
+ if (obj === undefined) {
6
+ throw new Error(`unknown attribute type ${typeof obj} with value ${obj} at ${path.join('.') || 'root'}.`);
7
+ }
8
+ if (obj && typeof obj === 'object') {
9
+ for (const [key, value] of Object.entries(obj)) {
10
+ (0, exports.assertNoUndefined)(value, [...path, key]);
11
+ }
12
+ }
13
+ };
14
+ exports.assertNoUndefined = assertNoUndefined;
@@ -1,14 +1,14 @@
1
1
  export type Config = {
2
- tableName: string;
2
+ tableName: string;
3
+ };
4
+ export type DocumentBaseMapType = {
5
+ [key: string]: DocumentBaseValueTypes;
3
6
  };
4
-
5
- export type DocumentBaseMapType = {[key: string]: DocumentBaseValueTypes};
6
7
  export type DocumentBaseListType = DocumentBaseValueTypes[];
7
-
8
8
  export type DocumentBaseValueTypes = number | boolean | string | null | DocumentBaseMapType | DocumentBaseListType;
9
-
10
- export type DocumentBaseType = {[key: string]: DocumentBaseValueTypes};
11
-
9
+ export type DocumentBaseType = {
10
+ [key: string]: DocumentBaseValueTypes;
11
+ };
12
12
  export type TDocument<T> = {
13
- [_key in keyof T]: DocumentBaseValueTypes;
13
+ [_key in keyof T]: DocumentBaseValueTypes;
14
14
  };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,31 @@
1
+ import { DynamoDB } from '@aws-sdk/client-dynamodb';
2
+ import { Config, TDocument } from '..';
3
+ import { ConfigProviderForConfig } from '../../../config';
4
+ interface Initializer<C> {
5
+ configSpace?: C;
6
+ dynamoClient?: DynamoDB;
7
+ }
8
+ export declare const dynamoUnversionedDocumentStore: <C extends string = "dynamodb">(initializer?: Initializer<C>) => <T extends TDocument<T>>() => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => <K extends keyof T>(_: {}, hashKey: K, options?: {
9
+ afterWrite?: (item: T) => void | Promise<void>;
10
+ batchAfterWrite?: (items: T[]) => void | Promise<void>;
11
+ }) => {
12
+ loadAllDocumentsTheBadWay: () => Promise<T[]>;
13
+ getItemsByField: (key: keyof T, value: T[K], pageKey?: string) => Promise<{
14
+ items: T[];
15
+ nextPageToken: string | undefined;
16
+ }>;
17
+ batchGetItem: (ids: T[K][]) => Promise<T[]>;
18
+ getItem: (id: T[K]) => Promise<T | undefined>;
19
+ incrementItemAttribute: (id: T[K], attribute: keyof T) => Promise<number>;
20
+ patchItem: (item: Partial<T>) => Promise<T>;
21
+ putItem: (item: T) => Promise<T>;
22
+ createItem: (item: T) => Promise<T>;
23
+ batchCreateItem: (items: T[], concurrency?: number) => Promise<{
24
+ successful: T[];
25
+ failed: Array<{
26
+ item: T;
27
+ error: Error;
28
+ }>;
29
+ }>;
30
+ };
31
+ export {};