@stackframe/stack-shared 2.8.7 → 2.8.10
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.
- package/CHANGELOG.md +10 -0
- package/dist/config/format.d.cts +39 -0
- package/dist/config/format.d.ts +14 -13
- package/dist/config/format.js +147 -206
- package/dist/config/format.js.map +1 -0
- package/dist/config/schema.d.cts +724 -0
- package/dist/config/schema.d.ts +51 -48
- package/dist/config/schema.js +230 -172
- package/dist/config/schema.js.map +1 -0
- package/dist/crud.d.cts +102 -0
- package/dist/crud.d.ts +15 -13
- package/dist/crud.js +83 -128
- package/dist/crud.js.map +1 -0
- package/dist/esm/config/format.js +135 -0
- package/dist/esm/config/format.js.map +1 -0
- package/dist/esm/config/schema.js +199 -0
- package/dist/esm/config/schema.js.map +1 -0
- package/dist/esm/crud.js +60 -0
- package/dist/esm/crud.js.map +1 -0
- package/dist/esm/global.d.js +1 -0
- package/dist/esm/global.d.js.map +1 -0
- package/dist/esm/helpers/password.js +17 -0
- package/dist/esm/helpers/password.js.map +1 -0
- package/dist/esm/helpers/production-mode.js +50 -0
- package/dist/esm/helpers/production-mode.js.map +1 -0
- package/dist/esm/hooks/use-async-callback.js +38 -0
- package/dist/esm/hooks/use-async-callback.js.map +1 -0
- package/dist/esm/hooks/use-async-external-store.js +23 -0
- package/dist/esm/hooks/use-async-external-store.js.map +1 -0
- package/dist/esm/hooks/use-hash.js +17 -0
- package/dist/esm/hooks/use-hash.js.map +1 -0
- package/dist/esm/hooks/use-strict-memo.js +61 -0
- package/dist/esm/hooks/use-strict-memo.js.map +1 -0
- package/dist/esm/index.js +22 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interface/adminInterface.js +244 -0
- package/dist/esm/interface/adminInterface.js.map +1 -0
- package/dist/esm/interface/clientInterface.js +2041 -0
- package/dist/esm/interface/clientInterface.js.map +1 -0
- package/dist/esm/interface/crud/contact-channels.js +77 -0
- package/dist/esm/interface/crud/contact-channels.js.map +1 -0
- package/dist/esm/interface/crud/current-user.js +65 -0
- package/dist/esm/interface/crud/current-user.js.map +1 -0
- package/dist/esm/interface/crud/email-templates.js +52 -0
- package/dist/esm/interface/crud/email-templates.js.map +1 -0
- package/dist/esm/interface/crud/emails.js +20 -0
- package/dist/esm/interface/crud/emails.js.map +1 -0
- package/dist/esm/interface/crud/internal-api-keys.js +69 -0
- package/dist/esm/interface/crud/internal-api-keys.js.map +1 -0
- package/dist/esm/interface/crud/oauth.js +24 -0
- package/dist/esm/interface/crud/oauth.js.map +1 -0
- package/dist/esm/interface/crud/project-api-keys.js +93 -0
- package/dist/esm/interface/crud/project-api-keys.js.map +1 -0
- package/dist/esm/interface/crud/project-permissions.js +113 -0
- package/dist/esm/interface/crud/project-permissions.js.map +1 -0
- package/dist/esm/interface/crud/projects.js +188 -0
- package/dist/esm/interface/crud/projects.js.map +1 -0
- package/dist/esm/interface/crud/sessions.js +62 -0
- package/dist/esm/interface/crud/sessions.js.map +1 -0
- package/dist/esm/interface/crud/svix-token.js +22 -0
- package/dist/esm/interface/crud/svix-token.js.map +1 -0
- package/dist/esm/interface/crud/team-invitation-details.js +23 -0
- package/dist/esm/interface/crud/team-invitation-details.js.map +1 -0
- package/dist/esm/interface/crud/team-invitation.js +36 -0
- package/dist/esm/interface/crud/team-invitation.js.map +1 -0
- package/dist/esm/interface/crud/team-member-profiles.js +62 -0
- package/dist/esm/interface/crud/team-member-profiles.js.map +1 -0
- package/dist/esm/interface/crud/team-memberships.js +60 -0
- package/dist/esm/interface/crud/team-memberships.js.map +1 -0
- package/dist/esm/interface/crud/team-permissions.js +114 -0
- package/dist/esm/interface/crud/team-permissions.js.map +1 -0
- package/dist/esm/interface/crud/teams.js +143 -0
- package/dist/esm/interface/crud/teams.js.map +1 -0
- package/dist/esm/interface/crud/users.js +139 -0
- package/dist/esm/interface/crud/users.js.map +1 -0
- package/dist/esm/interface/serverInterface.js +485 -0
- package/dist/esm/interface/serverInterface.js.map +1 -0
- package/dist/esm/interface/webhooks.js +21 -0
- package/dist/esm/interface/webhooks.js.map +1 -0
- package/dist/esm/known-errors.js +1223 -0
- package/dist/esm/known-errors.js.map +1 -0
- package/dist/esm/schema-fields.js +484 -0
- package/dist/esm/schema-fields.js.map +1 -0
- package/dist/esm/sessions.js +168 -0
- package/dist/esm/sessions.js.map +1 -0
- package/dist/esm/utils/api-keys.js +79 -0
- package/dist/esm/utils/api-keys.js.map +1 -0
- package/dist/esm/utils/arrays.js +78 -0
- package/dist/esm/utils/arrays.js.map +1 -0
- package/dist/esm/utils/base64.js +18 -0
- package/dist/esm/utils/base64.js.map +1 -0
- package/dist/esm/utils/booleans.js +12 -0
- package/dist/esm/utils/booleans.js.map +1 -0
- package/dist/esm/utils/browser-compat.js +21 -0
- package/dist/esm/utils/browser-compat.js.map +1 -0
- package/dist/esm/utils/bytes.js +160 -0
- package/dist/esm/utils/bytes.js.map +1 -0
- package/dist/esm/utils/caches.js +167 -0
- package/dist/esm/utils/caches.js.map +1 -0
- package/dist/esm/utils/compile-time.js +11 -0
- package/dist/esm/utils/compile-time.js.map +1 -0
- package/dist/esm/utils/crypto.js +25 -0
- package/dist/esm/utils/crypto.js.map +1 -0
- package/dist/esm/utils/dates.js +64 -0
- package/dist/esm/utils/dates.js.map +1 -0
- package/dist/esm/utils/dom.js +11 -0
- package/dist/esm/utils/dom.js.map +1 -0
- package/dist/esm/utils/env.js +58 -0
- package/dist/esm/utils/env.js.map +1 -0
- package/dist/esm/utils/errors.js +174 -0
- package/dist/esm/utils/errors.js.map +1 -0
- package/dist/esm/utils/fs.js +37 -0
- package/dist/esm/utils/fs.js.map +1 -0
- package/dist/esm/utils/functions.js +12 -0
- package/dist/esm/utils/functions.js.map +1 -0
- package/dist/esm/utils/geo.js +15 -0
- package/dist/esm/utils/geo.js.map +1 -0
- package/dist/esm/utils/globals.js +18 -0
- package/dist/esm/utils/globals.js.map +1 -0
- package/dist/esm/utils/hashes.js +55 -0
- package/dist/esm/utils/hashes.js.map +1 -0
- package/dist/esm/utils/html.js +13 -0
- package/dist/esm/utils/html.js.map +1 -0
- package/dist/esm/utils/http.js +60 -0
- package/dist/esm/utils/http.js.map +1 -0
- package/dist/esm/utils/ips.js +15 -0
- package/dist/esm/utils/ips.js.map +1 -0
- package/dist/esm/utils/json.js +31 -0
- package/dist/esm/utils/json.js.map +1 -0
- package/dist/esm/utils/jwt.js +87 -0
- package/dist/esm/utils/jwt.js.map +1 -0
- package/dist/esm/utils/locks.js +57 -0
- package/dist/esm/utils/locks.js.map +1 -0
- package/dist/esm/utils/maps.js +181 -0
- package/dist/esm/utils/maps.js.map +1 -0
- package/dist/esm/utils/math.js +8 -0
- package/dist/esm/utils/math.js.map +1 -0
- package/dist/esm/utils/node-http.js +42 -0
- package/dist/esm/utils/node-http.js.map +1 -0
- package/dist/esm/utils/numbers.js +32 -0
- package/dist/esm/utils/numbers.js.map +1 -0
- package/dist/esm/utils/oauth.js +10 -0
- package/dist/esm/utils/oauth.js.map +1 -0
- package/dist/esm/utils/objects.js +153 -0
- package/dist/esm/utils/objects.js.map +1 -0
- package/dist/esm/utils/passkey.js +1 -0
- package/dist/esm/utils/passkey.js.map +1 -0
- package/dist/esm/utils/promises.js +233 -0
- package/dist/esm/utils/promises.js.map +1 -0
- package/dist/esm/utils/proxies.js +128 -0
- package/dist/esm/utils/proxies.js.map +1 -0
- package/dist/esm/utils/react.js +78 -0
- package/dist/esm/utils/react.js.map +1 -0
- package/dist/esm/utils/results.js +141 -0
- package/dist/esm/utils/results.js.map +1 -0
- package/dist/esm/utils/sentry.js +20 -0
- package/dist/esm/utils/sentry.js.map +1 -0
- package/dist/esm/utils/stores.js +195 -0
- package/dist/esm/utils/stores.js.map +1 -0
- package/dist/esm/utils/strings.js +294 -0
- package/dist/esm/utils/strings.js.map +1 -0
- package/dist/esm/utils/strings.nicify.test.js +222 -0
- package/dist/esm/utils/strings.nicify.test.js.map +1 -0
- package/dist/esm/utils/types.js +1 -0
- package/dist/esm/utils/types.js.map +1 -0
- package/dist/esm/utils/unicode.js +11 -0
- package/dist/esm/utils/unicode.js.map +1 -0
- package/dist/esm/utils/urls.js +53 -0
- package/dist/esm/utils/urls.js.map +1 -0
- package/dist/esm/utils/uuids.js +16 -0
- package/dist/esm/utils/uuids.js.map +1 -0
- package/dist/global.d.d.cts +1 -0
- package/dist/global.d.d.ts +1 -0
- package/dist/global.d.js +2 -0
- package/dist/global.d.js.map +1 -0
- package/dist/helpers/password.d.cts +11 -0
- package/dist/helpers/password.d.ts +11 -2
- package/dist/helpers/password.js +41 -11
- package/dist/helpers/password.js.map +1 -0
- package/dist/helpers/production-mode.d.cts +12 -0
- package/dist/helpers/production-mode.d.ts +9 -3
- package/dist/helpers/production-mode.js +72 -45
- package/dist/helpers/production-mode.js.map +1 -0
- package/dist/hooks/use-async-callback.d.cts +6 -0
- package/dist/hooks/use-async-callback.d.ts +6 -3
- package/dist/hooks/use-async-callback.js +72 -30
- package/dist/hooks/use-async-callback.js.map +1 -0
- package/dist/hooks/use-async-external-store.d.cts +7 -0
- package/dist/hooks/use-async-external-store.d.ts +5 -2
- package/dist/hooks/use-async-external-store.js +47 -19
- package/dist/hooks/use-async-external-store.js.map +1 -0
- package/dist/hooks/use-hash.d.cts +3 -0
- package/dist/hooks/use-hash.d.ts +3 -1
- package/dist/hooks/use-hash.js +41 -8
- package/dist/hooks/use-hash.js.map +1 -0
- package/dist/hooks/use-strict-memo.d.cts +8 -0
- package/dist/hooks/use-strict-memo.d.ts +3 -1
- package/dist/hooks/use-strict-memo.js +78 -131
- package/dist/hooks/use-strict-memo.js.map +1 -0
- package/dist/index.d.cts +30 -0
- package/dist/index.d.ts +30 -4
- package/dist/index.js +42 -4
- package/dist/index.js.map +1 -0
- package/dist/interface/adminInterface.d.cts +94 -0
- package/dist/interface/adminInterface.d.ts +38 -15
- package/dist/interface/adminInterface.js +269 -174
- package/dist/interface/adminInterface.js.map +1 -0
- package/dist/interface/clientInterface.d.cts +260 -0
- package/dist/interface/clientInterface.d.ts +25 -18
- package/dist/interface/clientInterface.js +2054 -995
- package/dist/interface/clientInterface.js.map +1 -0
- package/dist/interface/crud/contact-channels.d.cts +180 -0
- package/dist/interface/crud/contact-channels.d.ts +30 -25
- package/dist/interface/crud/contact-channels.js +101 -59
- package/dist/interface/crud/contact-channels.js.map +1 -0
- package/dist/interface/crud/current-user.d.cts +205 -0
- package/dist/interface/crud/current-user.d.ts +17 -12
- package/dist/interface/crud/current-user.js +86 -56
- package/dist/interface/crud/current-user.js.map +1 -0
- package/dist/interface/crud/email-templates.d.cts +84 -0
- package/dist/interface/crud/email-templates.d.ts +24 -19
- package/dist/interface/crud/email-templates.js +77 -37
- package/dist/interface/crud/email-templates.js.map +1 -0
- package/dist/interface/crud/emails.d.cts +69 -0
- package/dist/interface/crud/emails.d.ts +12 -7
- package/dist/interface/crud/emails.js +54 -12
- package/dist/interface/crud/emails.js.map +1 -0
- package/dist/interface/crud/internal-api-keys.d.cts +139 -0
- package/dist/interface/crud/internal-api-keys.d.ts +22 -17
- package/dist/interface/crud/internal-api-keys.js +92 -54
- package/dist/interface/crud/internal-api-keys.js.map +1 -0
- package/dist/interface/crud/oauth.d.cts +34 -0
- package/dist/interface/crud/oauth.d.ts +16 -11
- package/dist/interface/crud/oauth.js +48 -14
- package/dist/interface/crud/oauth.js.map +1 -0
- package/dist/interface/crud/project-api-keys.d.cts +196 -0
- package/dist/interface/crud/project-api-keys.d.ts +18 -10
- package/dist/interface/crud/project-api-keys.js +121 -74
- package/dist/interface/crud/project-api-keys.js.map +1 -0
- package/dist/interface/crud/project-permissions.d.cts +160 -0
- package/dist/interface/crud/project-permissions.d.ts +38 -33
- package/dist/interface/crud/project-permissions.js +148 -90
- package/dist/interface/crud/project-permissions.js.map +1 -0
- package/dist/interface/crud/projects.d.cts +640 -0
- package/dist/interface/crud/projects.d.ts +36 -31
- package/dist/interface/crud/projects.js +218 -156
- package/dist/interface/crud/projects.js.map +1 -0
- package/dist/interface/crud/sessions.d.cts +149 -0
- package/dist/interface/crud/sessions.d.ts +21 -16
- package/dist/interface/crud/sessions.js +86 -50
- package/dist/interface/crud/sessions.js.map +1 -0
- package/dist/interface/crud/svix-token.d.cts +26 -0
- package/dist/interface/crud/svix-token.d.ts +14 -9
- package/dist/interface/crud/svix-token.js +46 -12
- package/dist/interface/crud/svix-token.js.map +1 -0
- package/dist/interface/crud/team-invitation-details.d.cts +30 -0
- package/dist/interface/crud/team-invitation-details.d.ts +12 -7
- package/dist/interface/crud/team-invitation-details.js +57 -15
- package/dist/interface/crud/team-invitation-details.js.map +1 -0
- package/dist/interface/crud/team-invitation.d.cts +49 -0
- package/dist/interface/crud/team-invitation.d.ts +13 -8
- package/dist/interface/crud/team-invitation.js +69 -27
- package/dist/interface/crud/team-invitation.js.map +1 -0
- package/dist/interface/crud/team-member-profiles.d.cts +229 -0
- package/dist/interface/crud/team-member-profiles.d.ts +20 -15
- package/dist/interface/crud/team-member-profiles.js +95 -49
- package/dist/interface/crud/team-member-profiles.js.map +1 -0
- package/dist/interface/crud/team-memberships.d.cts +74 -0
- package/dist/interface/crud/team-memberships.d.ts +22 -17
- package/dist/interface/crud/team-memberships.js +85 -45
- package/dist/interface/crud/team-memberships.js.map +1 -0
- package/dist/interface/crud/team-permissions.d.cts +168 -0
- package/dist/interface/crud/team-permissions.d.ts +38 -33
- package/dist/interface/crud/team-permissions.js +149 -91
- package/dist/interface/crud/team-permissions.js.map +1 -0
- package/dist/interface/crud/teams.d.cts +298 -0
- package/dist/interface/crud/teams.d.ts +45 -40
- package/dist/interface/crud/teams.js +177 -119
- package/dist/interface/crud/teams.js.map +1 -0
- package/dist/interface/crud/users.d.cts +469 -0
- package/dist/interface/crud/users.d.ts +31 -26
- package/dist/interface/crud/users.js +172 -118
- package/dist/interface/crud/users.js.map +1 -0
- package/dist/interface/serverInterface.d.cts +128 -0
- package/dist/interface/serverInterface.d.ts +29 -17
- package/dist/interface/serverInterface.js +506 -339
- package/dist/interface/serverInterface.js.map +1 -0
- package/dist/interface/webhooks.d.cts +292 -0
- package/dist/interface/webhooks.d.ts +6 -3
- package/dist/interface/webhooks.js +45 -15
- package/dist/interface/webhooks.js.map +1 -0
- package/dist/known-errors.d.cts +444 -0
- package/dist/known-errors.d.ts +12 -9
- package/dist/known-errors.js +1088 -561
- package/dist/known-errors.js.map +1 -0
- package/dist/schema-fields.d.cts +163 -0
- package/dist/schema-fields.d.ts +116 -114
- package/dist/schema-fields.js +593 -427
- package/dist/schema-fields.js.map +1 -0
- package/dist/sessions.d.cts +109 -0
- package/dist/sessions.d.ts +6 -3
- package/dist/sessions.js +201 -172
- package/dist/sessions.js.map +1 -0
- package/dist/utils/api-keys.d.cts +24 -0
- package/dist/utils/api-keys.d.ts +5 -4
- package/dist/utils/api-keys.js +106 -66
- package/dist/utils/api-keys.js.map +1 -0
- package/dist/utils/arrays.d.cts +18 -0
- package/dist/utils/arrays.d.ts +15 -13
- package/dist/utils/arrays.js +101 -168
- package/dist/utils/arrays.js.map +1 -0
- package/dist/utils/base64.d.cts +4 -0
- package/dist/utils/base64.d.ts +4 -2
- package/dist/utils/base64.js +41 -20
- package/dist/utils/base64.js.map +1 -0
- package/dist/utils/booleans.d.cts +6 -0
- package/dist/utils/booleans.d.ts +6 -4
- package/dist/utils/booleans.js +35 -27
- package/dist/utils/booleans.js.map +1 -0
- package/dist/utils/browser-compat.d.cts +8 -0
- package/dist/utils/browser-compat.d.ts +3 -1
- package/dist/utils/browser-compat.js +45 -16
- package/dist/utils/browser-compat.js.map +1 -0
- package/dist/utils/bytes.d.cts +15 -0
- package/dist/utils/bytes.d.ts +15 -13
- package/dist/utils/bytes.js +182 -270
- package/dist/utils/bytes.js.map +1 -0
- package/dist/utils/caches.d.cts +98 -0
- package/dist/utils/caches.d.ts +17 -14
- package/dist/utils/caches.js +188 -193
- package/dist/utils/caches.js.map +1 -0
- package/dist/utils/compile-time.d.cts +8 -0
- package/dist/utils/compile-time.d.ts +3 -1
- package/dist/utils/compile-time.js +35 -10
- package/dist/utils/compile-time.js.map +1 -0
- package/dist/utils/crypto.d.cts +8 -0
- package/dist/utils/crypto.d.ts +4 -2
- package/dist/utils/crypto.js +49 -21
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/dates.d.cts +15 -0
- package/dist/utils/dates.d.ts +6 -4
- package/dist/utils/dates.js +83 -105
- package/dist/utils/dates.js.map +1 -0
- package/dist/utils/dom.d.cts +3 -0
- package/dist/utils/dom.d.ts +3 -1
- package/dist/utils/dom.js +35 -7
- package/dist/utils/dom.js.map +1 -0
- package/dist/utils/env.d.cts +9 -0
- package/dist/utils/env.d.ts +6 -4
- package/dist/utils/env.js +70 -43
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/errors.d.cts +223 -0
- package/dist/utils/errors.d.ts +14 -11
- package/dist/utils/errors.js +148 -126
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/fs.d.cts +7 -0
- package/dist/utils/fs.d.ts +5 -3
- package/dist/utils/fs.js +70 -27
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/functions.d.cts +4 -0
- package/dist/utils/functions.d.ts +4 -2
- package/dist/utils/functions.js +35 -18
- package/dist/utils/functions.js.map +1 -0
- package/dist/utils/geo.d.cts +22 -0
- package/dist/utils/geo.d.ts +6 -3
- package/dist/utils/geo.js +39 -9
- package/dist/utils/geo.js.map +1 -0
- package/dist/utils/globals.d.cts +5 -0
- package/dist/utils/globals.d.ts +4 -2
- package/dist/utils/globals.js +41 -14
- package/dist/utils/globals.js.map +1 -0
- package/dist/utils/hashes.d.cts +7 -0
- package/dist/utils/hashes.d.ts +7 -5
- package/dist/utils/hashes.js +87 -41
- package/dist/utils/hashes.js.map +1 -0
- package/dist/utils/html.d.cts +4 -0
- package/dist/utils/html.d.ts +4 -2
- package/dist/utils/html.js +36 -37
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/http.d.cts +43 -0
- package/dist/utils/http.d.ts +6 -4
- package/dist/utils/http.js +83 -83
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/ips.d.cts +6 -0
- package/dist/utils/ips.d.ts +6 -4
- package/dist/utils/ips.js +48 -35
- package/dist/utils/ips.js.map +1 -0
- package/dist/utils/json.d.cts +13 -0
- package/dist/utils/json.d.ts +9 -6
- package/dist/utils/json.js +54 -157
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/jwt.d.cts +44 -0
- package/dist/utils/jwt.d.ts +14 -11
- package/dist/utils/jwt.js +119 -84
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/locks.d.cts +15 -0
- package/dist/utils/locks.d.ts +3 -2
- package/dist/utils/locks.js +76 -56
- package/dist/utils/locks.js.map +1 -0
- package/dist/utils/maps.d.cts +59 -0
- package/dist/utils/maps.d.ts +6 -4
- package/dist/utils/maps.js +207 -343
- package/dist/utils/maps.js.map +1 -0
- package/dist/utils/math.d.cts +6 -0
- package/dist/utils/math.d.ts +3 -1
- package/dist/utils/math.js +31 -16
- package/dist/utils/math.js.map +1 -0
- package/dist/utils/node-http.d.cts +15 -0
- package/dist/utils/node-http.d.ts +5 -5
- package/dist/utils/node-http.js +65 -36
- package/dist/utils/node-http.js.map +1 -0
- package/dist/utils/numbers.d.cts +5 -0
- package/dist/utils/numbers.d.ts +5 -3
- package/dist/utils/numbers.js +53 -66
- package/dist/utils/numbers.js.map +1 -0
- package/dist/utils/oauth.d.cts +8 -0
- package/dist/utils/oauth.d.ts +8 -6
- package/dist/utils/oauth.js +37 -4
- package/dist/utils/oauth.js.map +1 -0
- package/dist/utils/objects.d.cts +65 -0
- package/dist/utils/objects.d.ts +31 -30
- package/dist/utils/objects.js +196 -374
- package/dist/utils/objects.js.map +1 -0
- package/dist/utils/passkey.d.cts +1 -0
- package/dist/utils/passkey.d.ts +1 -1
- package/dist/utils/passkey.js +19 -1
- package/dist/utils/passkey.js.map +1 -0
- package/dist/utils/promises.d.cts +74 -0
- package/dist/utils/promises.d.ts +20 -18
- package/dist/utils/promises.js +252 -393
- package/dist/utils/promises.js.map +1 -0
- package/dist/utils/proxies.d.cts +4 -0
- package/dist/utils/proxies.d.ts +4 -2
- package/dist/utils/proxies.js +150 -161
- package/dist/utils/proxies.js.map +1 -0
- package/dist/utils/react.d.cts +25 -0
- package/dist/utils/react.d.ts +9 -6
- package/dist/utils/react.js +88 -134
- package/dist/utils/react.js.map +1 -0
- package/dist/utils/results.d.cts +78 -0
- package/dist/utils/results.d.ts +10 -9
- package/dist/utils/results.js +143 -324
- package/dist/utils/results.js.map +1 -0
- package/dist/utils/sentry.d.cts +5 -0
- package/dist/utils/sentry.d.ts +5 -2
- package/dist/utils/sentry.js +44 -14
- package/dist/utils/sentry.js.map +1 -0
- package/dist/utils/stores.d.cts +102 -0
- package/dist/utils/stores.d.ts +12 -9
- package/dist/utils/stores.js +219 -189
- package/dist/utils/stores.js.map +1 -0
- package/dist/utils/strings.d.cts +72 -0
- package/dist/utils/strings.d.ts +22 -20
- package/dist/utils/strings.js +299 -580
- package/dist/utils/strings.js.map +1 -0
- package/dist/utils/strings.nicify.test.d.cts +2 -0
- package/dist/utils/strings.nicify.test.d.ts +2 -1
- package/dist/utils/strings.nicify.test.js +168 -158
- package/dist/utils/strings.nicify.test.js.map +1 -0
- package/dist/utils/types.d.cts +23 -0
- package/dist/utils/types.d.ts +8 -6
- package/dist/utils/types.js +19 -1
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/unicode.d.cts +3 -0
- package/dist/utils/unicode.d.ts +3 -1
- package/dist/utils/unicode.js +34 -21
- package/dist/utils/unicode.js.map +1 -0
- package/dist/utils/urls.d.cts +20 -0
- package/dist/utils/urls.d.ts +10 -8
- package/dist/utils/urls.js +76 -165
- package/dist/utils/urls.js.map +1 -0
- package/dist/utils/uuids.d.cts +4 -0
- package/dist/utils/uuids.d.ts +4 -2
- package/dist/utils/uuids.js +39 -35
- package/dist/utils/uuids.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as jose from 'jose';
|
|
2
|
+
|
|
3
|
+
declare function legacySignGlobalJWT(issuer: string, payload: any, expirationTime?: string): Promise<string>;
|
|
4
|
+
declare function legacyVerifyGlobalJWT(issuer: string, jwt: string): Promise<jose.JWTPayload>;
|
|
5
|
+
declare function signJWT(options: {
|
|
6
|
+
issuer: string;
|
|
7
|
+
audience: string;
|
|
8
|
+
payload: any;
|
|
9
|
+
expirationTime?: string;
|
|
10
|
+
}): Promise<string>;
|
|
11
|
+
declare function verifyJWT(options: {
|
|
12
|
+
issuer: string;
|
|
13
|
+
jwt: string;
|
|
14
|
+
}): Promise<jose.JWTPayload>;
|
|
15
|
+
type PrivateJwk = {
|
|
16
|
+
kty: "EC";
|
|
17
|
+
alg: "ES256";
|
|
18
|
+
crv: "P-256";
|
|
19
|
+
kid: string;
|
|
20
|
+
d: string;
|
|
21
|
+
x: string;
|
|
22
|
+
y: string;
|
|
23
|
+
};
|
|
24
|
+
declare function getPrivateJwk(secret: string): Promise<PrivateJwk>;
|
|
25
|
+
type PublicJwk = {
|
|
26
|
+
kty: "EC";
|
|
27
|
+
alg: "ES256";
|
|
28
|
+
crv: "P-256";
|
|
29
|
+
kid: string;
|
|
30
|
+
x: string;
|
|
31
|
+
y: string;
|
|
32
|
+
};
|
|
33
|
+
declare function getPublicJwkSet(secretOrPrivateJwk: string | PrivateJwk): Promise<{
|
|
34
|
+
keys: PublicJwk[];
|
|
35
|
+
}>;
|
|
36
|
+
declare function getPerAudienceSecret(options: {
|
|
37
|
+
audience: string;
|
|
38
|
+
secret: string;
|
|
39
|
+
}): string;
|
|
40
|
+
declare function getKid(options: {
|
|
41
|
+
secret: string;
|
|
42
|
+
}): string;
|
|
43
|
+
|
|
44
|
+
export { type PrivateJwk, type PublicJwk, getKid, getPerAudienceSecret, getPrivateJwk, getPublicJwkSet, legacySignGlobalJWT, legacyVerifyGlobalJWT, signJWT, verifyJWT };
|
package/dist/utils/jwt.d.ts
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import * as jose from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import * as jose from 'jose';
|
|
2
|
+
|
|
3
|
+
declare function legacySignGlobalJWT(issuer: string, payload: any, expirationTime?: string): Promise<string>;
|
|
4
|
+
declare function legacyVerifyGlobalJWT(issuer: string, jwt: string): Promise<jose.JWTPayload>;
|
|
5
|
+
declare function signJWT(options: {
|
|
5
6
|
issuer: string;
|
|
6
7
|
audience: string;
|
|
7
8
|
payload: any;
|
|
8
9
|
expirationTime?: string;
|
|
9
10
|
}): Promise<string>;
|
|
10
|
-
|
|
11
|
+
declare function verifyJWT(options: {
|
|
11
12
|
issuer: string;
|
|
12
13
|
jwt: string;
|
|
13
14
|
}): Promise<jose.JWTPayload>;
|
|
14
|
-
|
|
15
|
+
type PrivateJwk = {
|
|
15
16
|
kty: "EC";
|
|
16
17
|
alg: "ES256";
|
|
17
18
|
crv: "P-256";
|
|
@@ -20,8 +21,8 @@ export type PrivateJwk = {
|
|
|
20
21
|
x: string;
|
|
21
22
|
y: string;
|
|
22
23
|
};
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
declare function getPrivateJwk(secret: string): Promise<PrivateJwk>;
|
|
25
|
+
type PublicJwk = {
|
|
25
26
|
kty: "EC";
|
|
26
27
|
alg: "ES256";
|
|
27
28
|
crv: "P-256";
|
|
@@ -29,13 +30,15 @@ export type PublicJwk = {
|
|
|
29
30
|
x: string;
|
|
30
31
|
y: string;
|
|
31
32
|
};
|
|
32
|
-
|
|
33
|
+
declare function getPublicJwkSet(secretOrPrivateJwk: string | PrivateJwk): Promise<{
|
|
33
34
|
keys: PublicJwk[];
|
|
34
35
|
}>;
|
|
35
|
-
|
|
36
|
+
declare function getPerAudienceSecret(options: {
|
|
36
37
|
audience: string;
|
|
37
38
|
secret: string;
|
|
38
39
|
}): string;
|
|
39
|
-
|
|
40
|
+
declare function getKid(options: {
|
|
40
41
|
secret: string;
|
|
41
42
|
}): string;
|
|
43
|
+
|
|
44
|
+
export { type PrivateJwk, type PublicJwk, getKid, getPerAudienceSecret, getPrivateJwk, getPublicJwkSet, legacySignGlobalJWT, legacyVerifyGlobalJWT, signJWT, verifyJWT };
|
package/dist/utils/jwt.js
CHANGED
|
@@ -1,94 +1,129 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/utils/jwt.tsx
|
|
31
|
+
var jwt_exports = {};
|
|
32
|
+
__export(jwt_exports, {
|
|
33
|
+
getKid: () => getKid,
|
|
34
|
+
getPerAudienceSecret: () => getPerAudienceSecret,
|
|
35
|
+
getPrivateJwk: () => getPrivateJwk,
|
|
36
|
+
getPublicJwkSet: () => getPublicJwkSet,
|
|
37
|
+
legacySignGlobalJWT: () => legacySignGlobalJWT,
|
|
38
|
+
legacyVerifyGlobalJWT: () => legacyVerifyGlobalJWT,
|
|
39
|
+
signJWT: () => signJWT,
|
|
40
|
+
verifyJWT: () => verifyJWT
|
|
41
|
+
});
|
|
42
|
+
module.exports = __toCommonJS(jwt_exports);
|
|
43
|
+
var import_crypto = __toESM(require("crypto"), 1);
|
|
44
|
+
var import_elliptic = __toESM(require("elliptic"), 1);
|
|
45
|
+
var jose = __toESM(require("jose"), 1);
|
|
46
|
+
var import_errors = require("jose/errors");
|
|
47
|
+
var import_bytes = require("./bytes");
|
|
48
|
+
var import_errors2 = require("./errors");
|
|
49
|
+
var import_globals = require("./globals");
|
|
50
|
+
var import_objects = require("./objects");
|
|
51
|
+
var STACK_SERVER_SECRET = process.env.STACK_SERVER_SECRET ?? "";
|
|
10
52
|
try {
|
|
11
|
-
|
|
53
|
+
jose.base64url.decode(STACK_SERVER_SECRET);
|
|
54
|
+
} catch (e) {
|
|
55
|
+
throw new Error("STACK_SERVER_SECRET is not valid. Please use the generateKeys script to generate a new secret.");
|
|
12
56
|
}
|
|
13
|
-
|
|
14
|
-
|
|
57
|
+
async function legacySignGlobalJWT(issuer, payload, expirationTime = "5m") {
|
|
58
|
+
const privateJwk = await jose.importJWK(await getPrivateJwk(STACK_SERVER_SECRET));
|
|
59
|
+
return await new jose.SignJWT(payload).setProtectedHeader({ alg: "ES256" }).setIssuer(issuer).setIssuedAt().setExpirationTime(expirationTime).sign(privateJwk);
|
|
15
60
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
.setProtectedHeader({ alg: "ES256" })
|
|
21
|
-
.setIssuer(issuer)
|
|
22
|
-
.setIssuedAt()
|
|
23
|
-
.setExpirationTime(expirationTime)
|
|
24
|
-
.sign(privateJwk);
|
|
61
|
+
async function legacyVerifyGlobalJWT(issuer, jwt) {
|
|
62
|
+
const jwkSet = jose.createLocalJWKSet(await getPublicJwkSet(STACK_SERVER_SECRET));
|
|
63
|
+
const verified = await jose.jwtVerify(jwt, jwkSet, { issuer });
|
|
64
|
+
return verified.payload;
|
|
25
65
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
66
|
+
async function signJWT(options) {
|
|
67
|
+
const secret = getPerAudienceSecret({ audience: options.audience, secret: STACK_SERVER_SECRET });
|
|
68
|
+
const kid = getKid({ secret });
|
|
69
|
+
const privateJwk = await jose.importJWK(await getPrivateJwk(secret));
|
|
70
|
+
return await new jose.SignJWT(options.payload).setProtectedHeader({ alg: "ES256", kid }).setIssuer(options.issuer).setIssuedAt().setAudience(options.audience).setExpirationTime(options.expirationTime || "5m").sign(privateJwk);
|
|
31
71
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
.setExpirationTime(options.expirationTime || "5m")
|
|
42
|
-
.sign(privateJwk);
|
|
72
|
+
async function verifyJWT(options) {
|
|
73
|
+
const audience = jose.decodeJwt(options.jwt).aud;
|
|
74
|
+
if (!audience || typeof audience !== "string") {
|
|
75
|
+
throw new import_errors.JOSEError("Invalid JWT audience");
|
|
76
|
+
}
|
|
77
|
+
const secret = getPerAudienceSecret({ audience, secret: STACK_SERVER_SECRET });
|
|
78
|
+
const jwkSet = jose.createLocalJWKSet(await getPublicJwkSet(secret));
|
|
79
|
+
const verified = await jose.jwtVerify(options.jwt, jwkSet, { issuer: options.issuer });
|
|
80
|
+
return verified.payload;
|
|
43
81
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
82
|
+
async function getPrivateJwk(secret) {
|
|
83
|
+
const secretHash = await import_globals.globalVar.crypto.subtle.digest("SHA-256", jose.base64url.decode(secret));
|
|
84
|
+
const priv = new Uint8Array(secretHash);
|
|
85
|
+
const ec = new import_elliptic.default.ec("p256");
|
|
86
|
+
const key = ec.keyFromPrivate(priv);
|
|
87
|
+
const publicKey = key.getPublic();
|
|
88
|
+
return {
|
|
89
|
+
kty: "EC",
|
|
90
|
+
crv: "P-256",
|
|
91
|
+
alg: "ES256",
|
|
92
|
+
kid: getKid({ secret }),
|
|
93
|
+
d: (0, import_bytes.encodeBase64Url)(priv),
|
|
94
|
+
x: (0, import_bytes.encodeBase64Url)(publicKey.getX().toBuffer()),
|
|
95
|
+
y: (0, import_bytes.encodeBase64Url)(publicKey.getY().toBuffer())
|
|
96
|
+
};
|
|
53
97
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return {
|
|
61
|
-
kty: 'EC',
|
|
62
|
-
crv: 'P-256',
|
|
63
|
-
alg: 'ES256',
|
|
64
|
-
kid: getKid({ secret }),
|
|
65
|
-
d: encodeBase64Url(priv),
|
|
66
|
-
x: encodeBase64Url(publicKey.getX().toBuffer()),
|
|
67
|
-
y: encodeBase64Url(publicKey.getY().toBuffer()),
|
|
68
|
-
};
|
|
98
|
+
async function getPublicJwkSet(secretOrPrivateJwk) {
|
|
99
|
+
const privateJwk = typeof secretOrPrivateJwk === "string" ? await getPrivateJwk(secretOrPrivateJwk) : secretOrPrivateJwk;
|
|
100
|
+
const jwk = (0, import_objects.pick)(privateJwk, ["kty", "alg", "crv", "x", "y", "kid"]);
|
|
101
|
+
return {
|
|
102
|
+
keys: [jwk]
|
|
103
|
+
};
|
|
69
104
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
105
|
+
function getPerAudienceSecret(options) {
|
|
106
|
+
if (options.audience === "kid") {
|
|
107
|
+
throw new import_errors2.StackAssertionError("You cannot use the 'kid' audience for a per-audience secret, see comment below in jwt.tsx");
|
|
108
|
+
}
|
|
109
|
+
return jose.base64url.encode(
|
|
110
|
+
import_crypto.default.createHash("sha256").update(JSON.stringify([options.secret, options.audience])).digest()
|
|
111
|
+
);
|
|
76
112
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
return jose.base64url.encode(crypto
|
|
82
|
-
.createHash('sha256')
|
|
83
|
-
// TODO we should prefix a string like "stack-audience-secret" before we hash so you can't use `getKid(...)` to get the secret for eg. the "kid" audience if the same secret value is used
|
|
84
|
-
// Sadly doing this modification is a bit annoying as we need to leave the old keys to be valid for a little longer
|
|
85
|
-
.update(JSON.stringify([options.secret, options.audience]))
|
|
86
|
-
.digest());
|
|
87
|
-
}
|
|
88
|
-
;
|
|
89
|
-
export function getKid(options) {
|
|
90
|
-
return jose.base64url.encode(crypto
|
|
91
|
-
.createHash('sha256')
|
|
92
|
-
.update(JSON.stringify([options.secret, "kid"])) // TODO see above in getPerAudienceSecret
|
|
93
|
-
.digest()).slice(0, 12);
|
|
113
|
+
function getKid(options) {
|
|
114
|
+
return jose.base64url.encode(
|
|
115
|
+
import_crypto.default.createHash("sha256").update(JSON.stringify([options.secret, "kid"])).digest()
|
|
116
|
+
).slice(0, 12);
|
|
94
117
|
}
|
|
118
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
119
|
+
0 && (module.exports = {
|
|
120
|
+
getKid,
|
|
121
|
+
getPerAudienceSecret,
|
|
122
|
+
getPrivateJwk,
|
|
123
|
+
getPublicJwkSet,
|
|
124
|
+
legacySignGlobalJWT,
|
|
125
|
+
legacyVerifyGlobalJWT,
|
|
126
|
+
signJWT,
|
|
127
|
+
verifyJWT
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/jwt.tsx"],"sourcesContent":["import crypto from \"crypto\";\nimport elliptic from \"elliptic\";\nimport * as jose from \"jose\";\nimport { JOSEError } from \"jose/errors\";\nimport { encodeBase64Url } from \"./bytes\";\nimport { StackAssertionError } from \"./errors\";\nimport { globalVar } from \"./globals\";\nimport { pick } from \"./objects\";\n\nconst STACK_SERVER_SECRET = process.env.STACK_SERVER_SECRET ?? \"\";\ntry {\n jose.base64url.decode(STACK_SERVER_SECRET);\n} catch (e) {\n throw new Error(\"STACK_SERVER_SECRET is not valid. Please use the generateKeys script to generate a new secret.\");\n}\n\n// TODO: remove this after moving everyone to project specific JWTs\nexport async function legacySignGlobalJWT(issuer: string, payload: any, expirationTime = \"5m\") {\n const privateJwk = await jose.importJWK(await getPrivateJwk(STACK_SERVER_SECRET));\n return await new jose.SignJWT(payload)\n .setProtectedHeader({ alg: \"ES256\" })\n .setIssuer(issuer)\n .setIssuedAt()\n .setExpirationTime(expirationTime)\n .sign(privateJwk);\n}\n\n// TODO: remove this after moving everyone to project specific JWTs\nexport async function legacyVerifyGlobalJWT(issuer: string, jwt: string) {\n const jwkSet = jose.createLocalJWKSet(await getPublicJwkSet(STACK_SERVER_SECRET));\n const verified = await jose.jwtVerify(jwt, jwkSet, { issuer });\n return verified.payload;\n}\n\nexport async function signJWT(options: {\n issuer: string,\n audience: string,\n payload: any,\n expirationTime?: string,\n}) {\n const secret = getPerAudienceSecret({ audience: options.audience, secret: STACK_SERVER_SECRET });\n const kid = getKid({ secret });\n const privateJwk = await jose.importJWK(await getPrivateJwk(secret));\n return await new jose.SignJWT(options.payload)\n .setProtectedHeader({ alg: \"ES256\", kid })\n .setIssuer(options.issuer)\n .setIssuedAt()\n .setAudience(options.audience)\n .setExpirationTime(options.expirationTime || \"5m\")\n .sign(privateJwk);\n}\n\nexport async function verifyJWT(options: {\n issuer: string,\n jwt: string,\n}) {\n const audience = jose.decodeJwt(options.jwt).aud;\n if (!audience || typeof audience !== \"string\") {\n throw new JOSEError(\"Invalid JWT audience\");\n }\n const secret = getPerAudienceSecret({ audience, secret: STACK_SERVER_SECRET });\n const jwkSet = jose.createLocalJWKSet(await getPublicJwkSet(secret));\n const verified = await jose.jwtVerify(options.jwt, jwkSet, { issuer: options.issuer });\n return verified.payload;\n}\n\nexport type PrivateJwk = {\n kty: \"EC\",\n alg: \"ES256\",\n crv: \"P-256\",\n kid: string,\n d: string,\n x: string,\n y: string,\n};\nexport async function getPrivateJwk(secret: string): Promise<PrivateJwk> {\n const secretHash = await globalVar.crypto.subtle.digest(\"SHA-256\", jose.base64url.decode(secret));\n const priv = new Uint8Array(secretHash);\n\n const ec = new elliptic.ec('p256');\n const key = ec.keyFromPrivate(priv);\n const publicKey = key.getPublic();\n\n return {\n kty: 'EC',\n crv: 'P-256',\n alg: 'ES256',\n kid: getKid({ secret }),\n d: encodeBase64Url(priv),\n x: encodeBase64Url(publicKey.getX().toBuffer()),\n y: encodeBase64Url(publicKey.getY().toBuffer()),\n };\n}\n\nexport type PublicJwk = {\n kty: \"EC\",\n alg: \"ES256\",\n crv: \"P-256\",\n kid: string,\n x: string,\n y: string,\n};\nexport async function getPublicJwkSet(secretOrPrivateJwk: string | PrivateJwk): Promise<{ keys: PublicJwk[] }> {\n const privateJwk = typeof secretOrPrivateJwk === \"string\" ? await getPrivateJwk(secretOrPrivateJwk) : secretOrPrivateJwk;\n const jwk = pick(privateJwk, [\"kty\", \"alg\", \"crv\", \"x\", \"y\", \"kid\"]);\n return {\n keys: [jwk],\n };\n}\n\nexport function getPerAudienceSecret(options: {\n audience: string,\n secret: string,\n}) {\n if (options.audience === \"kid\") {\n throw new StackAssertionError(\"You cannot use the 'kid' audience for a per-audience secret, see comment below in jwt.tsx\");\n }\n return jose.base64url.encode(\n crypto\n .createHash('sha256')\n // TODO we should prefix a string like \"stack-audience-secret\" before we hash so you can't use `getKid(...)` to get the secret for eg. the \"kid\" audience if the same secret value is used\n // Sadly doing this modification is a bit annoying as we need to leave the old keys to be valid for a little longer\n .update(JSON.stringify([options.secret, options.audience]))\n .digest()\n );\n};\n\nexport function getKid(options: {\n secret: string,\n}) {\n return jose.base64url.encode(\n crypto\n .createHash('sha256')\n .update(JSON.stringify([options.secret, \"kid\"])) // TODO see above in getPerAudienceSecret\n .digest()\n ).slice(0, 12);\n}\n"],"mappings":"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","names":["import_errors","elliptic","crypto","crypto"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type LockCallback<T> = () => Promise<T>;
|
|
2
|
+
declare class ReadWriteLock {
|
|
3
|
+
private semaphore;
|
|
4
|
+
private readers;
|
|
5
|
+
private readersMutex;
|
|
6
|
+
constructor();
|
|
7
|
+
withReadLock<T>(callback: LockCallback<T>): Promise<T>;
|
|
8
|
+
withWriteLock<T>(callback: LockCallback<T>): Promise<T>;
|
|
9
|
+
private _acquireReadLock;
|
|
10
|
+
private _releaseReadLock;
|
|
11
|
+
private _acquireWriteLock;
|
|
12
|
+
private _releaseWriteLock;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { ReadWriteLock };
|
package/dist/utils/locks.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
type LockCallback<T> = () => Promise<T>;
|
|
2
|
-
|
|
2
|
+
declare class ReadWriteLock {
|
|
3
3
|
private semaphore;
|
|
4
4
|
private readers;
|
|
5
5
|
private readersMutex;
|
|
@@ -11,4 +11,5 @@ export declare class ReadWriteLock {
|
|
|
11
11
|
private _acquireWriteLock;
|
|
12
12
|
private _releaseWriteLock;
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
|
|
15
|
+
export { ReadWriteLock };
|
package/dist/utils/locks.js
CHANGED
|
@@ -1,62 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/utils/locks.tsx
|
|
21
|
+
var locks_exports = {};
|
|
22
|
+
__export(locks_exports, {
|
|
23
|
+
ReadWriteLock: () => ReadWriteLock
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(locks_exports);
|
|
26
|
+
var import_async_mutex = require("async-mutex");
|
|
27
|
+
var ReadWriteLock = class {
|
|
28
|
+
constructor() {
|
|
29
|
+
this.semaphore = new import_async_mutex.Semaphore(1);
|
|
30
|
+
this.readers = 0;
|
|
31
|
+
this.readersMutex = new import_async_mutex.Semaphore(1);
|
|
32
|
+
}
|
|
33
|
+
async withReadLock(callback) {
|
|
34
|
+
await this._acquireReadLock();
|
|
35
|
+
try {
|
|
36
|
+
return await callback();
|
|
37
|
+
} finally {
|
|
38
|
+
await this._releaseReadLock();
|
|
7
39
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
40
|
+
}
|
|
41
|
+
async withWriteLock(callback) {
|
|
42
|
+
await this._acquireWriteLock();
|
|
43
|
+
try {
|
|
44
|
+
return await callback();
|
|
45
|
+
} finally {
|
|
46
|
+
await this._releaseWriteLock();
|
|
16
47
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
await this._releaseWriteLock();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
async _acquireReadLock() {
|
|
27
|
-
// Increment the readers count
|
|
28
|
-
await this.readersMutex.acquire();
|
|
29
|
-
try {
|
|
30
|
-
this.readers += 1;
|
|
31
|
-
// If this is the first reader, block writers
|
|
32
|
-
if (this.readers === 1) {
|
|
33
|
-
await this.semaphore.acquire();
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
finally {
|
|
37
|
-
this.readersMutex.release();
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
async _releaseReadLock() {
|
|
41
|
-
// Decrement the readers count
|
|
42
|
-
await this.readersMutex.acquire();
|
|
43
|
-
try {
|
|
44
|
-
this.readers -= 1;
|
|
45
|
-
// If this was the last reader, release the writer block
|
|
46
|
-
if (this.readers === 0) {
|
|
47
|
-
this.semaphore.release();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
this.readersMutex.release();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
async _acquireWriteLock() {
|
|
55
|
-
// Writers acquire the main semaphore exclusively
|
|
48
|
+
}
|
|
49
|
+
async _acquireReadLock() {
|
|
50
|
+
await this.readersMutex.acquire();
|
|
51
|
+
try {
|
|
52
|
+
this.readers += 1;
|
|
53
|
+
if (this.readers === 1) {
|
|
56
54
|
await this.semaphore.acquire();
|
|
55
|
+
}
|
|
56
|
+
} finally {
|
|
57
|
+
this.readersMutex.release();
|
|
57
58
|
}
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
}
|
|
60
|
+
async _releaseReadLock() {
|
|
61
|
+
await this.readersMutex.acquire();
|
|
62
|
+
try {
|
|
63
|
+
this.readers -= 1;
|
|
64
|
+
if (this.readers === 0) {
|
|
60
65
|
this.semaphore.release();
|
|
66
|
+
}
|
|
67
|
+
} finally {
|
|
68
|
+
this.readersMutex.release();
|
|
61
69
|
}
|
|
62
|
-
}
|
|
70
|
+
}
|
|
71
|
+
async _acquireWriteLock() {
|
|
72
|
+
await this.semaphore.acquire();
|
|
73
|
+
}
|
|
74
|
+
async _releaseWriteLock() {
|
|
75
|
+
this.semaphore.release();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
79
|
+
0 && (module.exports = {
|
|
80
|
+
ReadWriteLock
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=locks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/locks.tsx"],"sourcesContent":["import { Semaphore } from 'async-mutex';\n\ntype LockCallback<T> = () => Promise<T>;\n\nexport class ReadWriteLock {\n private semaphore: Semaphore;\n private readers: number;\n private readersMutex: Semaphore;\n\n constructor() {\n this.semaphore = new Semaphore(1); // Semaphore with 1 permit\n this.readers = 0; // Track the number of readers\n this.readersMutex = new Semaphore(1); // Protect access to `readers` count\n }\n\n async withReadLock<T>(callback: LockCallback<T>): Promise<T> {\n await this._acquireReadLock();\n try {\n return await callback();\n } finally {\n await this._releaseReadLock();\n }\n }\n\n async withWriteLock<T>(callback: LockCallback<T>): Promise<T> {\n await this._acquireWriteLock();\n try {\n return await callback();\n } finally {\n await this._releaseWriteLock();\n }\n }\n\n private async _acquireReadLock(): Promise<void> {\n // Increment the readers count\n await this.readersMutex.acquire();\n try {\n this.readers += 1;\n // If this is the first reader, block writers\n if (this.readers === 1) {\n await this.semaphore.acquire();\n }\n } finally {\n this.readersMutex.release();\n }\n }\n\n private async _releaseReadLock(): Promise<void> {\n // Decrement the readers count\n await this.readersMutex.acquire();\n try {\n this.readers -= 1;\n // If this was the last reader, release the writer block\n if (this.readers === 0) {\n this.semaphore.release();\n }\n } finally {\n this.readersMutex.release();\n }\n }\n\n private async _acquireWriteLock(): Promise<void> {\n // Writers acquire the main semaphore exclusively\n await this.semaphore.acquire();\n }\n\n private async _releaseWriteLock(): Promise<void> {\n // Writers release the main semaphore\n this.semaphore.release();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA0B;AAInB,IAAM,gBAAN,MAAoB;AAAA,EAKzB,cAAc;AACZ,SAAK,YAAY,IAAI,6BAAU,CAAC;AAChC,SAAK,UAAU;AACf,SAAK,eAAe,IAAI,6BAAU,CAAC;AAAA,EACrC;AAAA,EAEA,MAAM,aAAgB,UAAuC;AAC3D,UAAM,KAAK,iBAAiB;AAC5B,QAAI;AACF,aAAO,MAAM,SAAS;AAAA,IACxB,UAAE;AACA,YAAM,KAAK,iBAAiB;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,cAAiB,UAAuC;AAC5D,UAAM,KAAK,kBAAkB;AAC7B,QAAI;AACF,aAAO,MAAM,SAAS;AAAA,IACxB,UAAE;AACA,YAAM,KAAK,kBAAkB;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAc,mBAAkC;AAE9C,UAAM,KAAK,aAAa,QAAQ;AAChC,QAAI;AACF,WAAK,WAAW;AAEhB,UAAI,KAAK,YAAY,GAAG;AACtB,cAAM,KAAK,UAAU,QAAQ;AAAA,MAC/B;AAAA,IACF,UAAE;AACA,WAAK,aAAa,QAAQ;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAc,mBAAkC;AAE9C,UAAM,KAAK,aAAa,QAAQ;AAChC,QAAI;AACF,WAAK,WAAW;AAEhB,UAAI,KAAK,YAAY,GAAG;AACtB,aAAK,UAAU,QAAQ;AAAA,MACzB;AAAA,IACF,UAAE;AACA,WAAK,aAAa,QAAQ;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAc,oBAAmC;AAE/C,UAAM,KAAK,UAAU,QAAQ;AAAA,EAC/B;AAAA,EAEA,MAAc,oBAAmC;AAE/C,SAAK,UAAU,QAAQ;AAAA,EACzB;AACF;","names":[]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
declare class WeakRefIfAvailable<T extends object> {
|
|
2
|
+
private readonly _ref;
|
|
3
|
+
constructor(value: T);
|
|
4
|
+
deref(): T | undefined;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* A WeakMap-like object that can be iterated over.
|
|
8
|
+
*
|
|
9
|
+
* Note that it relies on WeakRef, and always falls back to the regular Map behavior (ie. no GC) in browsers that don't support it.
|
|
10
|
+
*/
|
|
11
|
+
declare class IterableWeakMap<K extends object, V> {
|
|
12
|
+
private readonly _weakMap;
|
|
13
|
+
private readonly _keyRefs;
|
|
14
|
+
constructor(entries?: readonly (readonly [K, V])[] | null);
|
|
15
|
+
get(key: K): V | undefined;
|
|
16
|
+
set(key: K, value: V): this;
|
|
17
|
+
delete(key: K): boolean;
|
|
18
|
+
has(key: K): boolean;
|
|
19
|
+
[Symbol.iterator](): IterableIterator<[K, V]>;
|
|
20
|
+
[Symbol.toStringTag]: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A map that is a IterableWeakMap for object keys and a regular Map for primitive keys. Also provides iteration over both
|
|
24
|
+
* object and primitive keys.
|
|
25
|
+
*
|
|
26
|
+
* Note that, just like IterableWeakMap, older browsers without support for WeakRef will use a regular Map for object keys.
|
|
27
|
+
*/
|
|
28
|
+
declare class MaybeWeakMap<K, V> {
|
|
29
|
+
private readonly _primitiveMap;
|
|
30
|
+
private readonly _weakMap;
|
|
31
|
+
constructor(entries?: readonly (readonly [K, V])[] | null);
|
|
32
|
+
private _isAllowedInWeakMap;
|
|
33
|
+
get(key: K): V | undefined;
|
|
34
|
+
set(key: K, value: V): this;
|
|
35
|
+
delete(key: K): boolean;
|
|
36
|
+
has(key: K): boolean;
|
|
37
|
+
[Symbol.iterator](): IterableIterator<[K, V]>;
|
|
38
|
+
[Symbol.toStringTag]: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* A map that stores values indexed by an array of keys. If the keys are objects and the environment supports WeakRefs,
|
|
42
|
+
* they are stored in a WeakMap.
|
|
43
|
+
*/
|
|
44
|
+
declare class DependenciesMap<K extends any[], V> {
|
|
45
|
+
private _inner;
|
|
46
|
+
private _valueToResult;
|
|
47
|
+
private _unwrapFromInner;
|
|
48
|
+
private _setInInner;
|
|
49
|
+
private _iterateInner;
|
|
50
|
+
get(dependencies: K): V | undefined;
|
|
51
|
+
set(dependencies: K, value: V): this;
|
|
52
|
+
delete(dependencies: K): boolean;
|
|
53
|
+
has(dependencies: K): boolean;
|
|
54
|
+
clear(): void;
|
|
55
|
+
[Symbol.iterator](): IterableIterator<[K, V]>;
|
|
56
|
+
[Symbol.toStringTag]: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { DependenciesMap, IterableWeakMap, MaybeWeakMap, WeakRefIfAvailable };
|
package/dist/utils/maps.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
declare class WeakRefIfAvailable<T extends object> {
|
|
2
2
|
private readonly _ref;
|
|
3
3
|
constructor(value: T);
|
|
4
4
|
deref(): T | undefined;
|
|
@@ -8,7 +8,7 @@ export declare class WeakRefIfAvailable<T extends object> {
|
|
|
8
8
|
*
|
|
9
9
|
* Note that it relies on WeakRef, and always falls back to the regular Map behavior (ie. no GC) in browsers that don't support it.
|
|
10
10
|
*/
|
|
11
|
-
|
|
11
|
+
declare class IterableWeakMap<K extends object, V> {
|
|
12
12
|
private readonly _weakMap;
|
|
13
13
|
private readonly _keyRefs;
|
|
14
14
|
constructor(entries?: readonly (readonly [K, V])[] | null);
|
|
@@ -25,7 +25,7 @@ export declare class IterableWeakMap<K extends object, V> {
|
|
|
25
25
|
*
|
|
26
26
|
* Note that, just like IterableWeakMap, older browsers without support for WeakRef will use a regular Map for object keys.
|
|
27
27
|
*/
|
|
28
|
-
|
|
28
|
+
declare class MaybeWeakMap<K, V> {
|
|
29
29
|
private readonly _primitiveMap;
|
|
30
30
|
private readonly _weakMap;
|
|
31
31
|
constructor(entries?: readonly (readonly [K, V])[] | null);
|
|
@@ -41,7 +41,7 @@ export declare class MaybeWeakMap<K, V> {
|
|
|
41
41
|
* A map that stores values indexed by an array of keys. If the keys are objects and the environment supports WeakRefs,
|
|
42
42
|
* they are stored in a WeakMap.
|
|
43
43
|
*/
|
|
44
|
-
|
|
44
|
+
declare class DependenciesMap<K extends any[], V> {
|
|
45
45
|
private _inner;
|
|
46
46
|
private _valueToResult;
|
|
47
47
|
private _unwrapFromInner;
|
|
@@ -55,3 +55,5 @@ export declare class DependenciesMap<K extends any[], V> {
|
|
|
55
55
|
[Symbol.iterator](): IterableIterator<[K, V]>;
|
|
56
56
|
[Symbol.toStringTag]: string;
|
|
57
57
|
}
|
|
58
|
+
|
|
59
|
+
export { DependenciesMap, IterableWeakMap, MaybeWeakMap, WeakRefIfAvailable };
|