@openstax/ts-utils 1.33.0 → 1.34.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 (503) hide show
  1. package/.cfnlintrc +2 -0
  2. package/.github/CODEOWNERS +1 -0
  3. package/.github/workflows/ci.yml +36 -0
  4. package/.github/workflows/lint.yml +55 -0
  5. package/.nvmrc +1 -0
  6. package/.syncignore +4 -0
  7. package/.syncpackrc +18 -0
  8. package/CONTRIBUTING.md +96 -0
  9. package/LICENSE +661 -0
  10. package/Procfile +1 -0
  11. package/README.md +62 -90
  12. package/app.json +23 -0
  13. package/cspell.json +32 -0
  14. package/deploy/constants.env +21 -0
  15. package/deploy/deploy.bash +157 -0
  16. package/deploy/deployment-alt-region.cfn.yml +70 -0
  17. package/deploy/deployment.cfn.yml +650 -0
  18. package/deploy/destroy-deployment.bash +23 -0
  19. package/deploy/shared.cfn.yml +94 -0
  20. package/docs/lambda-build.md +35 -0
  21. package/package.json +12 -228
  22. package/packages/frontend/README.md +46 -0
  23. package/packages/frontend/package.json +101 -0
  24. package/packages/frontend/public/favicon.ico +0 -0
  25. package/packages/frontend/public/index.html +107 -0
  26. package/packages/frontend/public/maintenance.html +59 -0
  27. package/packages/frontend/public/manifest.json +15 -0
  28. package/packages/frontend/public/robots.txt +3 -0
  29. package/packages/frontend/script/make-certificate.bash +49 -0
  30. package/packages/frontend/script/server/cli.js +11 -0
  31. package/packages/frontend/script/server/index.js +47 -0
  32. package/packages/frontend/script/start.bash +22 -0
  33. package/packages/frontend/script/trust-localhost.bash +7 -0
  34. package/packages/frontend/src/auth/authProvider.ts +10 -0
  35. package/packages/frontend/src/auth/useAuth.ts +33 -0
  36. package/packages/frontend/src/components/Pagination.tsx +26 -0
  37. package/packages/frontend/src/configProvider/index.ts +53 -0
  38. package/packages/frontend/src/configProvider/use.ts +41 -0
  39. package/packages/frontend/src/core/context/services.spec.tsx +39 -0
  40. package/packages/frontend/src/core/context/services.tsx +16 -0
  41. package/packages/frontend/src/core/index.spec.ts +7 -0
  42. package/packages/frontend/src/core/index.ts +20 -0
  43. package/packages/frontend/src/core/services.tsx +14 -0
  44. package/packages/frontend/src/core/types.ts +3 -0
  45. package/packages/frontend/src/example/api.ts +28 -0
  46. package/packages/frontend/src/example/components/Layout.tsx +23 -0
  47. package/packages/frontend/src/example/screens/Home.spec.tsx +68 -0
  48. package/packages/frontend/src/example/screens/Home.tsx +78 -0
  49. package/packages/frontend/src/example/screens/ThingList.spec.tsx +60 -0
  50. package/packages/frontend/src/example/screens/ThingList.tsx +75 -0
  51. package/packages/frontend/src/example/screens/ThingView.spec.tsx +71 -0
  52. package/packages/frontend/src/example/screens/ThingView.tsx +47 -0
  53. package/packages/frontend/src/example/screens/index.ts +9 -0
  54. package/packages/frontend/src/index.css +159 -0
  55. package/packages/frontend/src/index.tsx +67 -0
  56. package/packages/frontend/src/react-app-env.d.ts +1 -0
  57. package/packages/frontend/src/routing/components/RouteLink.spec.tsx +55 -0
  58. package/packages/frontend/src/routing/components/RouteLink.tsx +35 -0
  59. package/packages/frontend/src/routing/middleware.ts +6 -0
  60. package/packages/frontend/src/routing/useQuery.ts +14 -0
  61. package/packages/frontend/src/setupProxy.js +19 -0
  62. package/packages/frontend/src/setupTests.ts +9 -0
  63. package/packages/frontend/src/tests/testServices.tsx +23 -0
  64. package/packages/frontend/tsconfig.json +27 -0
  65. package/packages/lambda/.eslintrc.js +64 -0
  66. package/packages/lambda/jest-global-setup.js +3 -0
  67. package/packages/lambda/jest-setup-after-env.js +1 -0
  68. package/packages/lambda/jest.config.js +31 -0
  69. package/packages/lambda/jest.resolver.js +17 -0
  70. package/packages/lambda/package.json +68 -0
  71. package/packages/lambda/script/build.bash +19 -0
  72. package/packages/lambda/script/bundle-functions.bash +10 -0
  73. package/packages/lambda/script/lambdaLocalProxy.js +16 -0
  74. package/packages/lambda/script/lambdaLocalProxy.spec.ts +147 -0
  75. package/packages/lambda/script/utils/getRouteData.ts +7 -0
  76. package/packages/lambda/script/utils/routeDataLoader.js +8 -0
  77. package/packages/lambda/script/utils/routeDataLoader.spec.ts +8 -0
  78. package/packages/lambda/src/functions/serviceApi/core/index.ts +7 -0
  79. package/packages/lambda/src/functions/serviceApi/core/request.spec.ts +38 -0
  80. package/packages/lambda/src/functions/serviceApi/core/request.ts +42 -0
  81. package/packages/lambda/src/functions/serviceApi/core/routes.spec.ts +7 -0
  82. package/packages/lambda/src/functions/serviceApi/core/routes.ts +10 -0
  83. package/packages/lambda/src/functions/serviceApi/core/services.ts +9 -0
  84. package/packages/lambda/src/functions/serviceApi/core/types.ts +13 -0
  85. package/packages/lambda/src/functions/serviceApi/entry/lambda/https-xray.ts +4 -0
  86. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.spec.ts +48 -0
  87. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.ts +58 -0
  88. package/packages/lambda/src/functions/serviceApi/entry/lambda/services.ts +36 -0
  89. package/packages/lambda/src/functions/serviceApi/entry/local.ts +71 -0
  90. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.spec.ts +16 -0
  91. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.ts +41 -0
  92. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.spec.ts +78 -0
  93. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.ts +70 -0
  94. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.spec.ts +306 -0
  95. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.ts +176 -0
  96. package/packages/lambda/src/functions/serviceApi/versions/v0/index.spec.ts +263 -0
  97. package/packages/lambda/src/functions/serviceApi/versions/v0/index.ts +134 -0
  98. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.spec.ts +23 -0
  99. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.ts +32 -0
  100. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.spec.ts +10 -0
  101. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.ts +7 -0
  102. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.spec.ts +13 -0
  103. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.ts +23 -0
  104. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.spec.ts +9 -0
  105. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.ts +9 -0
  106. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.spec.ts +12 -0
  107. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.ts +21 -0
  108. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.spec.ts +21 -0
  109. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.ts +18 -0
  110. package/packages/lambda/tsconfig.json +30 -0
  111. package/packages/lambda/webpack.config.js +97 -0
  112. package/packages/utils/.eslintrc.js +64 -0
  113. package/packages/utils/README.md +118 -0
  114. package/packages/utils/jest-global-setup.js +3 -0
  115. package/packages/utils/jest.config.js +25 -0
  116. package/packages/utils/jest.resolver.js +17 -0
  117. package/packages/utils/package.json +238 -0
  118. package/packages/utils/src/assertions/index.spec.ts +126 -0
  119. package/{dist/esm/assertions/index.js → packages/utils/src/assertions/index.ts} +64 -49
  120. package/packages/utils/src/aws/ssmService.ts +7 -0
  121. package/packages/utils/src/config/awsParameterConfig.ts +24 -0
  122. package/packages/utils/src/config/envConfig.ts +58 -0
  123. package/packages/utils/src/config/index.spec.ts +165 -0
  124. package/{dist/esm/config/index.d.ts → packages/utils/src/config/index.ts} +29 -13
  125. package/packages/utils/src/config/lambdaParameterConfig.ts +49 -0
  126. package/{dist/esm/config/replaceConfig.js → packages/utils/src/config/replaceConfig.ts} +16 -6
  127. package/packages/utils/src/config/resolveConfigValue.ts +10 -0
  128. package/packages/utils/src/errors/index.spec.ts +35 -0
  129. package/{dist/esm/errors/index.js → packages/utils/src/errors/index.ts} +57 -41
  130. package/packages/utils/src/fetch/fetchStatusRetry.spec.ts +197 -0
  131. package/packages/utils/src/fetch/fetchStatusRetry.ts +33 -0
  132. package/packages/utils/src/fetch/index.spec.ts +34 -0
  133. package/packages/utils/src/fetch/index.ts +87 -0
  134. package/packages/utils/src/guards/index.spec.ts +58 -0
  135. package/{dist/esm/guards/index.d.ts → packages/utils/src/guards/index.ts} +10 -7
  136. package/packages/utils/src/index.spec.ts +471 -0
  137. package/packages/utils/src/middleware/apiErrorHandler.spec.ts +65 -0
  138. package/packages/utils/src/middleware/apiErrorHandler.ts +67 -0
  139. package/packages/utils/src/middleware/apiSlowResponseMiddleware.spec.ts +184 -0
  140. package/packages/utils/src/middleware/apiSlowResponseMiddleware.ts +71 -0
  141. package/packages/utils/src/middleware/index.spec.ts +99 -0
  142. package/{dist/cjs/middleware/index.d.ts → packages/utils/src/middleware/index.ts} +53 -5
  143. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.spec.ts +103 -0
  144. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.ts +52 -0
  145. package/packages/utils/src/middleware/throwNotFoundMiddleware.spec.ts +20 -0
  146. package/packages/utils/src/middleware/throwNotFoundMiddleware.ts +11 -0
  147. package/packages/utils/src/misc/hashValue.ts +18 -0
  148. package/packages/utils/src/misc/helpers.ts +259 -0
  149. package/packages/utils/src/misc/merge.ts +48 -0
  150. package/{dist/esm/misc/partitionSequence.js → packages/utils/src/misc/partitionSequence.ts} +23 -15
  151. package/packages/utils/src/pagination/index.spec.ts +150 -0
  152. package/packages/utils/src/pagination/index.ts +117 -0
  153. package/{dist/esm/routing/helpers.js → packages/utils/src/routing/helpers.ts} +42 -30
  154. package/packages/utils/src/routing/index.spec.ts +553 -0
  155. package/packages/utils/src/routing/index.ts +424 -0
  156. package/packages/utils/src/routing/validators/zod.spec.ts +16 -0
  157. package/packages/utils/src/routing/validators/zod.ts +14 -0
  158. package/packages/utils/src/services/accountsGateway/README.md +3 -0
  159. package/packages/utils/src/services/accountsGateway/index.spec.ts +518 -0
  160. package/packages/utils/src/services/accountsGateway/index.ts +251 -0
  161. package/packages/utils/src/services/apiGateway/README.md +93 -0
  162. package/packages/utils/src/services/apiGateway/index.spec.ts +254 -0
  163. package/packages/utils/src/services/apiGateway/index.ts +189 -0
  164. package/packages/utils/src/services/authProvider/README.md +21 -0
  165. package/packages/utils/src/services/authProvider/browser.spec.ts +391 -0
  166. package/packages/utils/src/services/authProvider/browser.ts +209 -0
  167. package/packages/utils/src/services/authProvider/decryption.spec.ts +337 -0
  168. package/packages/utils/src/services/authProvider/decryption.ts +98 -0
  169. package/packages/utils/src/services/authProvider/index.ts +93 -0
  170. package/packages/utils/src/services/authProvider/stub.spec.ts +29 -0
  171. package/packages/utils/src/services/authProvider/subrequest.spec.ts +105 -0
  172. package/packages/utils/src/services/authProvider/subrequest.ts +68 -0
  173. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.spec.ts +128 -0
  174. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.ts +106 -0
  175. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.spec.ts +26 -0
  176. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.ts +57 -0
  177. package/packages/utils/src/services/authProvider/utils/userRoleValidator.spec.ts +135 -0
  178. package/packages/utils/src/services/authProvider/utils/userRoleValidator.ts +49 -0
  179. package/packages/utils/src/services/authProvider/utils/userSubrequest.spec.ts +26 -0
  180. package/packages/utils/src/services/authProvider/utils/userSubrequest.ts +10 -0
  181. package/packages/utils/src/services/documentStore/dynamoEncoding.ts +57 -0
  182. package/packages/utils/src/services/documentStore/fileSystemAssert.spec.ts +43 -0
  183. package/packages/utils/src/services/documentStore/fileSystemAssert.ts +10 -0
  184. package/{dist/cjs/services/documentStore/index.d.ts → packages/utils/src/services/documentStore/index.ts} +8 -8
  185. package/packages/utils/src/services/documentStore/unversioned/README.md +13 -0
  186. package/packages/utils/src/services/documentStore/unversioned/dynamodb.spec.ts +859 -0
  187. package/packages/utils/src/services/documentStore/unversioned/dynamodb.ts +243 -0
  188. package/packages/utils/src/services/documentStore/unversioned/file-system.spec.ts +629 -0
  189. package/packages/utils/src/services/documentStore/unversioned/file-system.ts +194 -0
  190. package/{dist/cjs/services/documentStore/unversioned/index.d.ts → packages/utils/src/services/documentStore/unversioned/index.ts} +2 -0
  191. package/packages/utils/src/services/documentStore/versioned/README.md +13 -0
  192. package/packages/utils/src/services/documentStore/versioned/dynamodb.spec.ts +376 -0
  193. package/packages/utils/src/services/documentStore/versioned/dynamodb.ts +167 -0
  194. package/packages/utils/src/services/documentStore/versioned/file-system.spec.ts +262 -0
  195. package/packages/utils/src/services/documentStore/versioned/file-system.ts +90 -0
  196. package/packages/utils/src/services/documentStore/versioned/index.ts +25 -0
  197. package/packages/utils/src/services/exercisesGateway/README.md +5 -0
  198. package/packages/utils/src/services/exercisesGateway/index.spec.ts +326 -0
  199. package/packages/utils/src/services/exercisesGateway/index.ts +163 -0
  200. package/packages/utils/src/services/fileServer/index.spec.ts +88 -0
  201. package/packages/utils/src/services/fileServer/index.ts +43 -0
  202. package/packages/utils/src/services/fileServer/localFileServer.spec.ts +182 -0
  203. package/packages/utils/src/services/fileServer/localFileServer.ts +159 -0
  204. package/packages/utils/src/services/fileServer/s3FileServer.spec.ts +266 -0
  205. package/packages/utils/src/services/fileServer/s3FileServer.ts +155 -0
  206. package/packages/utils/src/services/launchParams/index.spec.ts +366 -0
  207. package/packages/utils/src/services/launchParams/signer.ts +73 -0
  208. package/packages/utils/src/services/launchParams/verifier.ts +120 -0
  209. package/packages/utils/src/services/logger/console.spec.ts +29 -0
  210. package/{dist/esm/services/logger/console.js → packages/utils/src/services/logger/console.ts} +5 -2
  211. package/packages/utils/src/services/logger/index.spec.ts +65 -0
  212. package/{dist/esm/services/logger/index.d.ts → packages/utils/src/services/logger/index.ts} +23 -9
  213. package/packages/utils/src/services/lrsGateway/README.md +5 -0
  214. package/packages/utils/src/services/lrsGateway/addStatementDefaultFields.ts +22 -0
  215. package/packages/utils/src/services/lrsGateway/attempt-utils.spec.ts +847 -0
  216. package/packages/utils/src/services/lrsGateway/attempt-utils.ts +358 -0
  217. package/packages/utils/src/services/lrsGateway/file-system.spec.ts +363 -0
  218. package/packages/utils/src/services/lrsGateway/file-system.ts +165 -0
  219. package/packages/utils/src/services/lrsGateway/index.spec.ts +194 -0
  220. package/packages/utils/src/services/lrsGateway/index.ts +257 -0
  221. package/packages/utils/src/services/lrsGateway/xapiUtils.spec.ts +887 -0
  222. package/packages/utils/src/services/lrsGateway/xapiUtils.ts +262 -0
  223. package/packages/utils/src/services/postgresConnection/index.spec.ts +170 -0
  224. package/packages/utils/src/services/postgresConnection/index.ts +84 -0
  225. package/packages/utils/src/services/searchProvider/README.md +3 -0
  226. package/packages/utils/src/services/searchProvider/index.ts +59 -0
  227. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.spec.ts +526 -0
  228. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.ts +223 -0
  229. package/packages/utils/src/services/searchProvider/openSearch.spec.ts +926 -0
  230. package/packages/utils/src/services/searchProvider/openSearch.ts +195 -0
  231. package/{dist/esm/types.d.ts → packages/utils/src/types.ts} +34 -6
  232. package/packages/utils/tsconfig.json +31 -0
  233. package/packages/utils/tsconfig.without-specs.cjs.json +7 -0
  234. package/packages/utils/tsconfig.without-specs.esm.json +7 -0
  235. package/packages/utils/tsconfig.without-specs.json +6 -0
  236. package/scripts/build.bash +24 -0
  237. package/scripts/ci.bash +10 -0
  238. package/scripts/start.bash +29 -0
  239. package/dist/cjs/assertions/index.d.ts +0 -89
  240. package/dist/cjs/assertions/index.js +0 -157
  241. package/dist/cjs/aws/ssmService.d.ts +0 -5
  242. package/dist/cjs/aws/ssmService.js +0 -9
  243. package/dist/cjs/config/awsParameterConfig.d.ts +0 -10
  244. package/dist/cjs/config/awsParameterConfig.js +0 -26
  245. package/dist/cjs/config/envConfig.d.ts +0 -24
  246. package/dist/cjs/config/envConfig.js +0 -57
  247. package/dist/cjs/config/index.d.ts +0 -48
  248. package/dist/cjs/config/index.js +0 -35
  249. package/dist/cjs/config/lambdaParameterConfig.d.ts +0 -12
  250. package/dist/cjs/config/lambdaParameterConfig.js +0 -45
  251. package/dist/cjs/config/replaceConfig.d.ts +0 -14
  252. package/dist/cjs/config/replaceConfig.js +0 -22
  253. package/dist/cjs/config/resolveConfigValue.d.ts +0 -5
  254. package/dist/cjs/config/resolveConfigValue.js +0 -12
  255. package/dist/cjs/errors/index.d.ts +0 -88
  256. package/dist/cjs/errors/index.js +0 -123
  257. package/dist/cjs/fetch/fetchStatusRetry.d.ts +0 -8
  258. package/dist/cjs/fetch/fetchStatusRetry.js +0 -27
  259. package/dist/cjs/fetch/index.d.ts +0 -64
  260. package/dist/cjs/fetch/index.js +0 -55
  261. package/dist/cjs/guards/index.d.ts +0 -38
  262. package/dist/cjs/guards/index.js +0 -44
  263. package/dist/cjs/index.js +0 -20
  264. package/dist/cjs/middleware/apiErrorHandler.d.ts +0 -24
  265. package/dist/cjs/middleware/apiErrorHandler.js +0 -42
  266. package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +0 -23
  267. package/dist/cjs/middleware/apiSlowResponseMiddleware.js +0 -54
  268. package/dist/cjs/middleware/index.js +0 -48
  269. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
  270. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +0 -44
  271. package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +0 -4
  272. package/dist/cjs/middleware/throwNotFoundMiddleware.js +0 -14
  273. package/dist/cjs/misc/hashValue.d.ts +0 -10
  274. package/dist/cjs/misc/hashValue.js +0 -17
  275. package/dist/cjs/misc/helpers.d.ts +0 -124
  276. package/dist/cjs/misc/helpers.js +0 -214
  277. package/dist/cjs/misc/merge.d.ts +0 -21
  278. package/dist/cjs/misc/merge.js +0 -45
  279. package/dist/cjs/misc/partitionSequence.d.ts +0 -35
  280. package/dist/cjs/misc/partitionSequence.js +0 -55
  281. package/dist/cjs/pagination/index.d.ts +0 -91
  282. package/dist/cjs/pagination/index.js +0 -83
  283. package/dist/cjs/routing/helpers.d.ts +0 -57
  284. package/dist/cjs/routing/helpers.js +0 -90
  285. package/dist/cjs/routing/index.d.ts +0 -290
  286. package/dist/cjs/routing/index.js +0 -295
  287. package/dist/cjs/routing/validators/zod.d.ts +0 -4
  288. package/dist/cjs/routing/validators/zod.js +0 -14
  289. package/dist/cjs/services/accountsGateway/index.d.ts +0 -92
  290. package/dist/cjs/services/accountsGateway/index.js +0 -138
  291. package/dist/cjs/services/apiGateway/index.d.ts +0 -68
  292. package/dist/cjs/services/apiGateway/index.js +0 -118
  293. package/dist/cjs/services/authProvider/browser.d.ts +0 -40
  294. package/dist/cjs/services/authProvider/browser.js +0 -155
  295. package/dist/cjs/services/authProvider/decryption.d.ts +0 -19
  296. package/dist/cjs/services/authProvider/decryption.js +0 -73
  297. package/dist/cjs/services/authProvider/index.d.ts +0 -63
  298. package/dist/cjs/services/authProvider/index.js +0 -34
  299. package/dist/cjs/services/authProvider/subrequest.d.ts +0 -13
  300. package/dist/cjs/services/authProvider/subrequest.js +0 -49
  301. package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +0 -28
  302. package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +0 -91
  303. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
  304. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.js +0 -47
  305. package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +0 -13
  306. package/dist/cjs/services/authProvider/utils/userRoleValidator.js +0 -37
  307. package/dist/cjs/services/authProvider/utils/userSubrequest.d.ts +0 -3
  308. package/dist/cjs/services/authProvider/utils/userSubrequest.js +0 -13
  309. package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +0 -10
  310. package/dist/cjs/services/documentStore/dynamoEncoding.js +0 -52
  311. package/dist/cjs/services/documentStore/fileSystemAssert.d.ts +0 -1
  312. package/dist/cjs/services/documentStore/fileSystemAssert.js +0 -14
  313. package/dist/cjs/services/documentStore/index.js +0 -2
  314. package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +0 -31
  315. package/dist/cjs/services/documentStore/unversioned/dynamodb.js +0 -233
  316. package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +0 -32
  317. package/dist/cjs/services/documentStore/unversioned/file-system.js +0 -214
  318. package/dist/cjs/services/documentStore/unversioned/index.js +0 -2
  319. package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +0 -25
  320. package/dist/cjs/services/documentStore/versioned/dynamodb.js +0 -143
  321. package/dist/cjs/services/documentStore/versioned/file-system.d.ts +0 -25
  322. package/dist/cjs/services/documentStore/versioned/file-system.js +0 -73
  323. package/dist/cjs/services/documentStore/versioned/index.d.ts +0 -17
  324. package/dist/cjs/services/documentStore/versioned/index.js +0 -2
  325. package/dist/cjs/services/exercisesGateway/index.d.ts +0 -67
  326. package/dist/cjs/services/exercisesGateway/index.js +0 -107
  327. package/dist/cjs/services/fileServer/index.d.ts +0 -30
  328. package/dist/cjs/services/fileServer/index.js +0 -19
  329. package/dist/cjs/services/fileServer/localFileServer.d.ts +0 -13
  330. package/dist/cjs/services/fileServer/localFileServer.js +0 -132
  331. package/dist/cjs/services/fileServer/s3FileServer.d.ts +0 -14
  332. package/dist/cjs/services/fileServer/s3FileServer.js +0 -131
  333. package/dist/cjs/services/launchParams/index.js +0 -7
  334. package/dist/cjs/services/launchParams/signer.d.ts +0 -23
  335. package/dist/cjs/services/launchParams/signer.js +0 -58
  336. package/dist/cjs/services/launchParams/verifier.d.ts +0 -21
  337. package/dist/cjs/services/launchParams/verifier.js +0 -129
  338. package/dist/cjs/services/logger/console.d.ts +0 -4
  339. package/dist/cjs/services/logger/console.js +0 -12
  340. package/dist/cjs/services/logger/index.d.ts +0 -39
  341. package/dist/cjs/services/logger/index.js +0 -31
  342. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
  343. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +0 -21
  344. package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +0 -70
  345. package/dist/cjs/services/lrsGateway/attempt-utils.js +0 -258
  346. package/dist/cjs/services/lrsGateway/file-system.d.ts +0 -15
  347. package/dist/cjs/services/lrsGateway/file-system.js +0 -150
  348. package/dist/cjs/services/lrsGateway/index.d.ts +0 -122
  349. package/dist/cjs/services/lrsGateway/index.js +0 -148
  350. package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +0 -68
  351. package/dist/cjs/services/lrsGateway/xapiUtils.js +0 -109
  352. package/dist/cjs/services/postgresConnection/index.d.ts +0 -28
  353. package/dist/cjs/services/postgresConnection/index.js +0 -65
  354. package/dist/cjs/services/searchProvider/index.d.ts +0 -67
  355. package/dist/cjs/services/searchProvider/index.js +0 -2
  356. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +0 -20
  357. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +0 -191
  358. package/dist/cjs/services/searchProvider/openSearch.d.ts +0 -28
  359. package/dist/cjs/services/searchProvider/openSearch.js +0 -154
  360. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +0 -1
  361. package/dist/cjs/types.d.ts +0 -31
  362. package/dist/cjs/types.js +0 -2
  363. package/dist/esm/assertions/index.d.ts +0 -89
  364. package/dist/esm/aws/ssmService.d.ts +0 -5
  365. package/dist/esm/aws/ssmService.js +0 -6
  366. package/dist/esm/config/awsParameterConfig.d.ts +0 -10
  367. package/dist/esm/config/awsParameterConfig.js +0 -22
  368. package/dist/esm/config/envConfig.d.ts +0 -24
  369. package/dist/esm/config/envConfig.js +0 -53
  370. package/dist/esm/config/index.js +0 -17
  371. package/dist/esm/config/lambdaParameterConfig.d.ts +0 -12
  372. package/dist/esm/config/lambdaParameterConfig.js +0 -38
  373. package/dist/esm/config/replaceConfig.d.ts +0 -14
  374. package/dist/esm/config/resolveConfigValue.d.ts +0 -5
  375. package/dist/esm/config/resolveConfigValue.js +0 -8
  376. package/dist/esm/errors/index.d.ts +0 -88
  377. package/dist/esm/fetch/fetchStatusRetry.d.ts +0 -8
  378. package/dist/esm/fetch/fetchStatusRetry.js +0 -23
  379. package/dist/esm/fetch/index.d.ts +0 -64
  380. package/dist/esm/fetch/index.js +0 -46
  381. package/dist/esm/guards/index.js +0 -36
  382. package/dist/esm/index.d.ts +0 -4
  383. package/dist/esm/index.js +0 -4
  384. package/dist/esm/middleware/apiErrorHandler.d.ts +0 -24
  385. package/dist/esm/middleware/apiErrorHandler.js +0 -38
  386. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +0 -23
  387. package/dist/esm/middleware/apiSlowResponseMiddleware.js +0 -50
  388. package/dist/esm/middleware/index.d.ts +0 -47
  389. package/dist/esm/middleware/index.js +0 -44
  390. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
  391. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +0 -40
  392. package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +0 -4
  393. package/dist/esm/middleware/throwNotFoundMiddleware.js +0 -10
  394. package/dist/esm/misc/hashValue.d.ts +0 -10
  395. package/dist/esm/misc/hashValue.js +0 -13
  396. package/dist/esm/misc/helpers.d.ts +0 -124
  397. package/dist/esm/misc/helpers.js +0 -199
  398. package/dist/esm/misc/merge.d.ts +0 -21
  399. package/dist/esm/misc/merge.js +0 -40
  400. package/dist/esm/misc/partitionSequence.d.ts +0 -35
  401. package/dist/esm/pagination/index.d.ts +0 -91
  402. package/dist/esm/pagination/index.js +0 -77
  403. package/dist/esm/routing/helpers.d.ts +0 -57
  404. package/dist/esm/routing/index.d.ts +0 -290
  405. package/dist/esm/routing/index.js +0 -246
  406. package/dist/esm/routing/validators/zod.d.ts +0 -4
  407. package/dist/esm/routing/validators/zod.js +0 -10
  408. package/dist/esm/services/accountsGateway/index.d.ts +0 -92
  409. package/dist/esm/services/accountsGateway/index.js +0 -131
  410. package/dist/esm/services/apiGateway/index.d.ts +0 -68
  411. package/dist/esm/services/apiGateway/index.js +0 -77
  412. package/dist/esm/services/authProvider/browser.d.ts +0 -40
  413. package/dist/esm/services/authProvider/browser.js +0 -151
  414. package/dist/esm/services/authProvider/decryption.d.ts +0 -19
  415. package/dist/esm/services/authProvider/decryption.js +0 -69
  416. package/dist/esm/services/authProvider/index.d.ts +0 -63
  417. package/dist/esm/services/authProvider/index.js +0 -26
  418. package/dist/esm/services/authProvider/subrequest.d.ts +0 -13
  419. package/dist/esm/services/authProvider/subrequest.js +0 -45
  420. package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +0 -28
  421. package/dist/esm/services/authProvider/utils/decryptAndVerify.js +0 -85
  422. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
  423. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +0 -40
  424. package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +0 -13
  425. package/dist/esm/services/authProvider/utils/userRoleValidator.js +0 -33
  426. package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +0 -3
  427. package/dist/esm/services/authProvider/utils/userSubrequest.js +0 -6
  428. package/dist/esm/services/documentStore/dynamoEncoding.d.ts +0 -10
  429. package/dist/esm/services/documentStore/dynamoEncoding.js +0 -45
  430. package/dist/esm/services/documentStore/fileSystemAssert.d.ts +0 -1
  431. package/dist/esm/services/documentStore/fileSystemAssert.js +0 -10
  432. package/dist/esm/services/documentStore/index.d.ts +0 -14
  433. package/dist/esm/services/documentStore/index.js +0 -1
  434. package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +0 -31
  435. package/dist/esm/services/documentStore/unversioned/dynamodb.js +0 -226
  436. package/dist/esm/services/documentStore/unversioned/file-system.d.ts +0 -32
  437. package/dist/esm/services/documentStore/unversioned/file-system.js +0 -174
  438. package/dist/esm/services/documentStore/unversioned/index.d.ts +0 -2
  439. package/dist/esm/services/documentStore/unversioned/index.js +0 -1
  440. package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +0 -25
  441. package/dist/esm/services/documentStore/versioned/dynamodb.js +0 -139
  442. package/dist/esm/services/documentStore/versioned/file-system.d.ts +0 -25
  443. package/dist/esm/services/documentStore/versioned/file-system.js +0 -69
  444. package/dist/esm/services/documentStore/versioned/index.d.ts +0 -17
  445. package/dist/esm/services/documentStore/versioned/index.js +0 -1
  446. package/dist/esm/services/exercisesGateway/index.d.ts +0 -67
  447. package/dist/esm/services/exercisesGateway/index.js +0 -70
  448. package/dist/esm/services/fileServer/index.d.ts +0 -30
  449. package/dist/esm/services/fileServer/index.js +0 -13
  450. package/dist/esm/services/fileServer/localFileServer.d.ts +0 -13
  451. package/dist/esm/services/fileServer/localFileServer.js +0 -125
  452. package/dist/esm/services/fileServer/s3FileServer.d.ts +0 -14
  453. package/dist/esm/services/fileServer/s3FileServer.js +0 -124
  454. package/dist/esm/services/launchParams/index.d.ts +0 -2
  455. package/dist/esm/services/launchParams/index.js +0 -2
  456. package/dist/esm/services/launchParams/signer.d.ts +0 -23
  457. package/dist/esm/services/launchParams/signer.js +0 -51
  458. package/dist/esm/services/launchParams/verifier.d.ts +0 -21
  459. package/dist/esm/services/launchParams/verifier.js +0 -92
  460. package/dist/esm/services/logger/console.d.ts +0 -4
  461. package/dist/esm/services/logger/index.js +0 -27
  462. package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
  463. package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +0 -14
  464. package/dist/esm/services/lrsGateway/attempt-utils.d.ts +0 -70
  465. package/dist/esm/services/lrsGateway/attempt-utils.js +0 -236
  466. package/dist/esm/services/lrsGateway/file-system.d.ts +0 -15
  467. package/dist/esm/services/lrsGateway/file-system.js +0 -110
  468. package/dist/esm/services/lrsGateway/index.d.ts +0 -122
  469. package/dist/esm/services/lrsGateway/index.js +0 -111
  470. package/dist/esm/services/lrsGateway/xapiUtils.d.ts +0 -68
  471. package/dist/esm/services/lrsGateway/xapiUtils.js +0 -99
  472. package/dist/esm/services/postgresConnection/index.d.ts +0 -28
  473. package/dist/esm/services/postgresConnection/index.js +0 -58
  474. package/dist/esm/services/searchProvider/index.d.ts +0 -67
  475. package/dist/esm/services/searchProvider/index.js +0 -1
  476. package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +0 -20
  477. package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +0 -187
  478. package/dist/esm/services/searchProvider/openSearch.d.ts +0 -28
  479. package/dist/esm/services/searchProvider/openSearch.js +0 -150
  480. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +0 -1
  481. package/dist/esm/types.js +0 -1
  482. /package/{script → packages/utils/script}/bin/copy-from-template.bash +0 -0
  483. /package/{script → packages/utils/script}/bin/delete-stack.bash +0 -0
  484. /package/{script → packages/utils/script}/bin/deploy.bash +0 -0
  485. /package/{script → packages/utils/script}/bin/destroy-deployment.bash +0 -0
  486. /package/{script → packages/utils/script}/bin/empty-bucket.bash +0 -0
  487. /package/{script → packages/utils/script}/bin/get-arg.bash +0 -0
  488. /package/{script → packages/utils/script}/bin/get-deployed-environments.bash +0 -0
  489. /package/{script → packages/utils/script}/bin/get-env-param.bash +0 -0
  490. /package/{script → packages/utils/script}/bin/get-kwarg.bash +0 -0
  491. /package/{script → packages/utils/script}/bin/get-stack-param.bash +0 -0
  492. /package/{script → packages/utils/script}/bin/has-flag.bash +0 -0
  493. /package/{script → packages/utils/script}/bin/init-constants-script.bash +0 -0
  494. /package/{script → packages/utils/script}/bin/init-params-script.bash +0 -0
  495. /package/{script → packages/utils/script}/bin/stack-exists.bash +0 -0
  496. /package/{script → packages/utils/script}/bin/update-utils.bash +0 -0
  497. /package/{script → packages/utils/script}/bin/upload-pager-duty-endpoints.bash +0 -0
  498. /package/{script → packages/utils/script}/bin/upload-params.bash +0 -0
  499. /package/{script → packages/utils/script}/bin/which.bash +0 -0
  500. /package/{script → packages/utils/script}/bin-entry.bash +0 -0
  501. /package/{script → packages/utils/script}/build.bash +0 -0
  502. /package/{dist/cjs/index.d.ts → packages/utils/src/index.ts} +0 -0
  503. /package/{dist/cjs/services/launchParams/index.d.ts → packages/utils/src/services/launchParams/index.ts} +0 -0
@@ -1,151 +0,0 @@
1
- import { once } from '../..';
2
- import { resolveConfigValue } from '../../config';
3
- import { ifDefined } from '../../guards';
4
- import { METHOD, unsafePayloadValidator } from '../../routing';
5
- import { embeddedAuthProvider, PostMessageTypes } from './utils/embeddedAuthProvider';
6
- const isUserData = unsafePayloadValidator();
7
- export const browserAuthProvider = ({ window, configSpace }) => (configProvider) => {
8
- const config = configProvider[ifDefined(configSpace, 'auth')];
9
- const accountsBase = once(() => resolveConfigValue(config.accountsBase));
10
- const queryString = window.location.search;
11
- const queryKey = 'auth';
12
- const urlSearchParams = new URLSearchParams(queryString);
13
- const authQuery = urlSearchParams.get(queryKey);
14
- const referrer = window.document.referrer ? new URL(window.document.referrer) : undefined;
15
- const isEmbedded = window.parent !== window;
16
- const trustedParent = isEmbedded && referrer && referrer.hostname.match(/^(openstax\.org|((.*)(\.openstax\.org|local|localhost)))$/) ? referrer : undefined;
17
- const { embeddedQueryKey, embeddedQueryValue, getAuthorizedEmbedUrl } = embeddedAuthProvider(() => getUserData(), { authQuery: { key: queryKey, value: authQuery }, window });
18
- const embeddedQuery = urlSearchParams.get(embeddedQueryKey);
19
- let userData = { token: authQuery };
20
- const getAuthToken = async () => {
21
- return (await getUserData()).token;
22
- };
23
- const getAuthorizedLinkUrl = (urlString) => {
24
- const url = new URL(urlString);
25
- if (userData.token) {
26
- url.searchParams.set(queryKey, userData.token);
27
- }
28
- return url.href;
29
- };
30
- const getAuthorizedUrl = (urlString) => {
31
- const url = new URL(urlString);
32
- if (authQuery) {
33
- url.searchParams.set(queryKey, authQuery);
34
- }
35
- else if (embeddedQuery) {
36
- url.searchParams.set(queryKey, 'embedded');
37
- }
38
- if (embeddedQuery) {
39
- url.searchParams.set(embeddedQueryKey, embeddedQuery);
40
- }
41
- return url.href;
42
- };
43
- // *note* that this does not actually prevent cookies from being sent on same-origin
44
- // requests, i'm not sure if its possible to stop browsers from sending cookies in
45
- // that case
46
- const getAuthorizedFetchConfigFromData = (data) => {
47
- const { token } = data;
48
- return token ? {
49
- headers: { Authorization: `Bearer ${token}` },
50
- } : {
51
- credentials: 'include',
52
- };
53
- };
54
- const getAuthorizedFetchConfig = async () => {
55
- return getAuthorizedFetchConfigFromData(userData.token ? userData : await getUserData());
56
- };
57
- /*
58
- * requests user identity from parent window via postMessage
59
- */
60
- const getParentWindowUser = () => new Promise((resolve, reject) => {
61
- if (!window.parent || !trustedParent) {
62
- return reject(new Error('parent window is undefined or not trusted'));
63
- }
64
- const handler = (event) => {
65
- if (event.data.type === PostMessageTypes.ReceiveUser && event.origin === trustedParent.origin) {
66
- clearTimeout(timeout);
67
- window.removeEventListener('message', handler);
68
- resolve(event.data.userData);
69
- }
70
- };
71
- window.addEventListener('message', handler);
72
- window.parent.postMessage({ type: PostMessageTypes.RequestUser }, trustedParent.origin);
73
- const timeout = setTimeout(() => {
74
- window.removeEventListener('message', handler);
75
- reject(new Error('loading user identity timed out'));
76
- }, 5000);
77
- });
78
- /*
79
- * requests user identity from accounts api using given token or cookie
80
- */
81
- const getFetchUser = async () => {
82
- const response = await window.fetch((await accountsBase()).replace(/\/+$/, '') + '/api/user?always_200=true', getAuthorizedFetchConfigFromData(userData));
83
- if (response.status === 200) {
84
- const body = await response.json();
85
- const user = isUserData(body) ? body : undefined;
86
- return { ...userData, user };
87
- }
88
- const message = await response.text();
89
- throw new Error(`Error response from Accounts ${response.status}: ${message}`);
90
- };
91
- const getUserData = once(async () => {
92
- // For backwards compatibility
93
- if (authQuery === 'embedded') {
94
- return getParentWindowUser();
95
- }
96
- // getFetchUser() will throw here if authQuery is not set
97
- return await (embeddedQuery === embeddedQueryValue ? getParentWindowUser() : getFetchUser());
98
- });
99
- const getUser = async () => {
100
- return (await getUserData()).user;
101
- };
102
- const updateUser = async (updates) => {
103
- const response = await window.fetch((await accountsBase()).replace(/\/+$/, '') + '/api/user', { ...getAuthorizedFetchConfigFromData(userData), method: METHOD.PUT, body: JSON.stringify(updates) });
104
- if (response.status === 200) {
105
- const user = await response.json();
106
- if (isUserData(user)) {
107
- return { ...userData, user };
108
- }
109
- }
110
- const message = await response.text();
111
- throw new Error(`Error response from Accounts ${response.status}: ${message}`);
112
- };
113
- return {
114
- /**
115
- * gets the authentication token
116
- */
117
- getAuthToken,
118
- /**
119
- * adds auth parameters to the url. this is only safe to use when using javascript to navigate
120
- * within the current window, eg `window.location = 'https://my.otherservice.com';` anchors
121
- * should use getAuthorizedLinkUrl for their href.
122
- *
123
- * result unreliable unless `getUser` is resolved first.
124
- */
125
- getAuthorizedUrl,
126
- /**
127
- * all link href-s must be rendered with auth tokens so that they work when opened in a new tab
128
- *
129
- * result unreliable unless `getUser` is resolved first.
130
- */
131
- getAuthorizedLinkUrl,
132
- /**
133
- * gets an authorized url for an iframe src. sets params on the url and saves its
134
- * origin to trust releasing user identity to it
135
- */
136
- getAuthorizedEmbedUrl,
137
- /**
138
- * gets second argument for `fetch` that has authentication token or cookie
139
- */
140
- getAuthorizedFetchConfig,
141
- /**
142
- * loads current user identity. does not reflect changes in identity after being called the first time.
143
- */
144
- getUser,
145
- loadUserData: getUser,
146
- /**
147
- * updates user settings, for example the cookie consent preferences
148
- */
149
- updateUser,
150
- };
151
- };
@@ -1,19 +0,0 @@
1
- import type { ConfigProviderForConfig } from '../../config';
2
- import { GenericFetch } from '../../fetch';
3
- import { ApiUser, AuthProvider, CookieAuthProvider } from '.';
4
- type Config = {
5
- accountsBase: string;
6
- cookieName: string;
7
- encryptionPrivateKey: string;
8
- signaturePublicKey: string;
9
- };
10
- interface Initializer<C> {
11
- configSpace?: C;
12
- fetch: GenericFetch;
13
- }
14
- export type DecryptionAuthProvider = AuthProvider & {
15
- getTokenExpiration: (tokenString?: string) => Promise<number | null | undefined>;
16
- loadUserData: () => Promise<ApiUser | undefined>;
17
- };
18
- export declare const decryptionAuthProvider: <C extends string = "decryption">(initializer: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => CookieAuthProvider<DecryptionAuthProvider>;
19
- export {};
@@ -1,69 +0,0 @@
1
- import { resolveConfigValue } from '../../config/resolveConfigValue';
2
- import { SessionExpiredError } from '../../errors';
3
- import { ifDefined } from '../../guards';
4
- import { once } from '../../misc/helpers';
5
- import { decryptAndVerify } from './utils/decryptAndVerify';
6
- import { loadUserData } from './utils/userSubrequest';
7
- import { getAuthTokenOrCookie } from '.';
8
- export const decryptionAuthProvider = (initializer) => (configProvider) => {
9
- const config = configProvider[ifDefined(initializer.configSpace, 'decryption')];
10
- const accountsBase = once(() => resolveConfigValue(config.accountsBase));
11
- const cookieName = once(() => resolveConfigValue(config.cookieName));
12
- const encryptionPrivateKey = once(() => resolveConfigValue(config.encryptionPrivateKey));
13
- const signaturePublicKey = once(() => resolveConfigValue(config.signaturePublicKey));
14
- return ({ request, logger }) => {
15
- let user;
16
- let userData;
17
- const getAuthToken = async () => getAuthTokenOrCookie(request, await cookieName())[0];
18
- const getAuthorizedFetchConfig = async () => {
19
- const [token, headers] = getAuthTokenOrCookie(request, await cookieName());
20
- if (!token) {
21
- return {};
22
- }
23
- return { headers };
24
- };
25
- const getDecryptedPayload = async (tokenString) => {
26
- const token = tokenString !== null && tokenString !== void 0 ? tokenString : await getAuthToken();
27
- if (!token) {
28
- return undefined;
29
- }
30
- return decryptAndVerify(token, await encryptionPrivateKey(), await signaturePublicKey());
31
- };
32
- const getUser = async () => {
33
- if (!user) {
34
- const result = await getDecryptedPayload();
35
- if (!result) {
36
- return undefined;
37
- }
38
- if ('error' in result && result.error == 'expired token') {
39
- throw new SessionExpiredError();
40
- }
41
- if ('user' in result) {
42
- logger.setContext({ user: result.user.uuid });
43
- user = result.user;
44
- }
45
- }
46
- return user;
47
- };
48
- return {
49
- getAuthToken,
50
- getAuthorizedFetchConfig,
51
- getTokenExpiration: async (tokenString) => {
52
- var _a;
53
- const payload = await getDecryptedPayload(tokenString);
54
- return payload ? ((_a = payload.exp) !== null && _a !== void 0 ? _a : null) : undefined;
55
- },
56
- getUser,
57
- loadUserData: async () => {
58
- if (!userData) {
59
- const token = await getAuthToken();
60
- if (!token) {
61
- return undefined;
62
- }
63
- userData = await loadUserData(initializer.fetch, await accountsBase(), await cookieName(), token);
64
- }
65
- return userData;
66
- },
67
- };
68
- };
69
- };
@@ -1,63 +0,0 @@
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, {}];
@@ -1,26 +0,0 @@
1
- import cookie from 'cookie';
2
- import { tuple } from '../../misc/helpers';
3
- import { getHeader } from '../../routing/helpers';
4
- export const stubAuthProvider = (user) => {
5
- const getUser = () => Promise.resolve(user);
6
- return {
7
- getAuthToken: () => Promise.resolve('authToken'),
8
- getUser,
9
- getAuthorizedFetchConfig: () => Promise.resolve(user ? { headers: { Authorization: user.uuid } } : {}),
10
- // This is not technically correct, but most tests won't care
11
- loadUserData: getUser
12
- };
13
- };
14
- export const getAuthTokenOrCookie = (request, cookieName, queryKey = 'auth') => {
15
- var _a, _b;
16
- const authParam = request.queryStringParameters ? request.queryStringParameters[queryKey] : undefined;
17
- const authHeader = getHeader(request.headers, 'authorization');
18
- const cookieValue = cookie.parse((_b = (_a = request.cookies) === null || _a === void 0 ? void 0 : _a.join('; ')) !== null && _b !== void 0 ? _b : '')[cookieName];
19
- return typeof authParam === 'string'
20
- ? tuple(authParam, { Authorization: `Bearer ${authParam}` })
21
- : authHeader && authHeader.length >= 8 && authHeader.startsWith('Bearer ')
22
- ? tuple(authHeader.slice(7), { Authorization: authHeader })
23
- : cookieValue
24
- ? tuple(cookieValue, { cookie: cookie.serialize(cookieName, cookieValue) })
25
- : tuple(null, {});
26
- };
@@ -1,13 +0,0 @@
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 {};
@@ -1,45 +0,0 @@
1
- import { once } from '../..';
2
- import { resolveConfigValue } from '../../config';
3
- import { ifDefined } from '../../guards';
4
- import { loadUserData } from './utils/userSubrequest';
5
- import { getAuthTokenOrCookie } from '.';
6
- export const subrequestAuthProvider = (initializer) => (configProvider) => {
7
- const config = configProvider[ifDefined(initializer.configSpace, 'subrequest')];
8
- const cookieName = once(() => resolveConfigValue(config.cookieName));
9
- const accountsBase = once(() => resolveConfigValue(config.accountsBase));
10
- return ({ request, logger }) => {
11
- let user;
12
- const getAuthToken = async () => getAuthTokenOrCookie(request, await cookieName())[0];
13
- const getAuthorizedFetchConfig = async () => {
14
- const [token, headers] = getAuthTokenOrCookie(request, await cookieName());
15
- if (!token) {
16
- return {};
17
- }
18
- return { headers };
19
- };
20
- const loadUser = async () => {
21
- const resolvedCookieName = await cookieName();
22
- const [token] = getAuthTokenOrCookie(request, resolvedCookieName);
23
- if (!token) {
24
- return undefined;
25
- }
26
- const user = await loadUserData(initializer.fetch, await accountsBase(), resolvedCookieName, token);
27
- if (user) {
28
- logger.setContext({ user: user.uuid });
29
- }
30
- return user;
31
- };
32
- const getUser = async () => {
33
- if (!user) {
34
- user = await loadUser();
35
- }
36
- return user;
37
- };
38
- return {
39
- getAuthToken,
40
- getAuthorizedFetchConfig,
41
- getUser,
42
- loadUserData: getUser
43
- };
44
- };
45
- };
@@ -1,28 +0,0 @@
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 {};
@@ -1,85 +0,0 @@
1
- import { createDecipheriv, verify } from 'crypto';
2
- import { isPlainObject } from '../../../guards';
3
- export const decryptJwe = (jwe, encryptionPrivateKey) => {
4
- const jweParts = jwe.split('.', 6);
5
- if (jweParts.length !== 5 || jweParts[1]) {
6
- return undefined;
7
- } // Invalid/unsupported JWE
8
- const header = JSON.parse(Buffer.from(jweParts[0], 'base64url').toString());
9
- if (header.alg !== 'dir' || header.enc !== 'A256GCM') {
10
- // Unsupported signature/encryption algorithm
11
- return undefined;
12
- }
13
- const aad = Buffer.from(jweParts[0]);
14
- const iv = Buffer.from(jweParts[2], 'base64url');
15
- const cipherText = Buffer.from(jweParts[3], 'base64url');
16
- const authTag = Buffer.from(jweParts[4], 'base64url');
17
- // Verify token signature and decrypt
18
- const decipher = createDecipheriv('aes-256-gcm', encryptionPrivateKey, iv, { authTagLength: 16 });
19
- decipher.setAAD(aad, { plaintextLength: cipherText.length });
20
- try {
21
- decipher.setAuthTag(authTag);
22
- return `${decipher.update(cipherText)}${decipher.final()}`;
23
- }
24
- catch (error) {
25
- // Invalid cipherText or authTag
26
- return undefined;
27
- }
28
- };
29
- const issuer = 'OpenStax Accounts';
30
- const audience = 'OpenStax';
31
- const clockTolerance = 300; // 5 minutes
32
- export const verifyJws = (jws, signaturePublicKey) => {
33
- const jwsParts = jws.split('.', 4);
34
- if (jwsParts.length !== 3) {
35
- return undefined;
36
- } // Invalid JWS
37
- const header = JSON.parse(Buffer.from(jwsParts[0], 'base64url').toString());
38
- if (header.alg !== 'RS256' || header.typ !== 'JWT') {
39
- return undefined;
40
- } // Unsupported JWS
41
- const signedContent = Buffer.from(`${jwsParts[0]}.${jwsParts[1]}`);
42
- const signature = Buffer.from(jwsParts[2], 'base64url');
43
- if (!verify('RSA-SHA256', signedContent, signaturePublicKey, signature)) {
44
- return undefined;
45
- }
46
- const payload = Buffer.from(jwsParts[1], 'base64url').toString();
47
- try {
48
- return JSON.parse(payload);
49
- }
50
- catch (error) {
51
- return undefined;
52
- }
53
- };
54
- /**
55
- * Decrypts and verifies a SSO cookie.
56
- *
57
- * @param token the encrypted token
58
- * @param encryptionPrivateKey the private key used to encrypt the token
59
- * @param signaturePublicKey the public key used to verify the decrypted token
60
- * @returns {user: User; exp: number} (success) or {error: string} (failure)
61
- */
62
- export const decryptAndVerify = (token, encryptionPrivateKey, signaturePublicKey) => {
63
- const timestamp = Math.floor(Date.now() / 1000);
64
- const jws = decryptJwe(token, encryptionPrivateKey);
65
- if (!jws) {
66
- return { error: 'invalid token' };
67
- }
68
- const payload = verifyJws(jws, signaturePublicKey);
69
- // Ensure payload contains all the claims we expect
70
- // Normally "sub" would be a string but Accounts uses an object for it instead
71
- if (!isPlainObject(payload) ||
72
- !isPlainObject(payload.sub) || !payload.sub.uuid ||
73
- payload.iss !== issuer ||
74
- payload.aud !== audience ||
75
- !payload.exp ||
76
- !payload.nbf || payload.nbf > timestamp + clockTolerance ||
77
- !payload.iat || payload.iat > timestamp + clockTolerance ||
78
- !payload.jti) {
79
- return { error: 'invalid token' };
80
- }
81
- if (payload.exp < timestamp - clockTolerance) {
82
- return { error: 'expired token', exp: payload.exp };
83
- }
84
- return { user: payload.sub, exp: payload.exp };
85
- };
@@ -1,26 +0,0 @@
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 {};
@@ -1,40 +0,0 @@
1
- import queryString from 'query-string';
2
- export var PostMessageTypes;
3
- (function (PostMessageTypes) {
4
- PostMessageTypes["ReceiveUser"] = "receive-user";
5
- PostMessageTypes["RequestUser"] = "request-user";
6
- })(PostMessageTypes || (PostMessageTypes = {}));
7
- export const embeddedAuthProvider = (getUserData, { authQuery, window }) => {
8
- const trustedEmbeds = new Set();
9
- const embeddedQueryKey = 'embedded';
10
- const embeddedQueryValue = 'true';
11
- const messageHandler = event => {
12
- if (event.data.type === PostMessageTypes.RequestUser && trustedEmbeds.has(event.origin)) {
13
- getUserData().then(data => {
14
- event.source.postMessage({ type: PostMessageTypes.ReceiveUser, userData: data }, event.origin);
15
- });
16
- }
17
- };
18
- window.addEventListener('message', messageHandler);
19
- const getAuthorizedEmbedUrl = (urlString, extraParams) => {
20
- const url = new URL(urlString);
21
- trustedEmbeds.add(url.origin);
22
- const params = queryString.parse(url.search);
23
- url.search = queryString.stringify({
24
- ...params,
25
- ...extraParams,
26
- ...(authQuery && authQuery.value ? { [authQuery.key]: authQuery.value } : { auth: 'embedded' }),
27
- [embeddedQueryKey]: embeddedQueryValue,
28
- subcontent: 'true',
29
- });
30
- return url.href;
31
- };
32
- return {
33
- embeddedQueryKey,
34
- embeddedQueryValue,
35
- getAuthorizedEmbedUrl,
36
- unmount: () => {
37
- window.removeEventListener('message', messageHandler);
38
- }
39
- };
40
- };
@@ -1,13 +0,0 @@
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 {};
@@ -1,33 +0,0 @@
1
- import { doThrow } from '../../../assertions';
2
- import { resolveConfigValue } from '../../../config/resolveConfigValue';
3
- import { UnauthorizedError } from '../../../errors';
4
- import { once } from '../../../misc/helpers';
5
- export const createUserRoleValidator = (auth, config) => {
6
- const application = once(() => resolveConfigValue(config.application));
7
- const getUserRoles = async () => {
8
- var _a;
9
- const user = await auth.getUser();
10
- const appName = await application();
11
- if (!user || !('applications' in user)) {
12
- return [];
13
- }
14
- return ((_a = user.applications.find(a => a.name === appName)) === null || _a === void 0 ? void 0 : _a.roles) || [];
15
- };
16
- const userHasRole = async (role) => {
17
- const roles = await getUserRoles();
18
- if (!roles.some(r => role.includes(r))) {
19
- return false;
20
- }
21
- return true;
22
- };
23
- const assertUserRole = async (role, fail = new UnauthorizedError()) => {
24
- if (!await userHasRole(role)) {
25
- return doThrow(fail);
26
- }
27
- };
28
- return {
29
- getUserRoles,
30
- userHasRole,
31
- assertUserRole
32
- };
33
- };
@@ -1,3 +0,0 @@
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>;
@@ -1,6 +0,0 @@
1
- import cookie from 'cookie';
2
- export const loadUserData = (fetch, accountsBase, cookieName, token) => {
3
- const headers = { cookie: cookie.serialize(cookieName, token) };
4
- return fetch(accountsBase.replace(/\/+$/, '') + '/api/user', { headers })
5
- .then(response => response.json());
6
- };
@@ -1,10 +0,0 @@
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;