@tempoxyz/id 0.0.0-stage → 0.0.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.
- package/README.md +80 -2
- package/dist/App.d.ts +20 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +26 -0
- package/dist/App.js.map +1 -0
- package/dist/app/client/.assetsignore +2 -0
- package/dist/app/client/assets/BRLA-CZvVDNYr.png +0 -0
- package/dist/app/client/assets/CHFAU-DCedc4aH.png +0 -0
- package/dist/app/client/assets/DLUSD-BnRXm3EI.png +0 -0
- package/dist/app/client/assets/PRIME-CiFp2-3e.svg +14 -0
- package/dist/app/client/assets/Pilat-Bold-C1t1eIrF.woff2 +0 -0
- package/dist/app/client/assets/Pilat-Book-CbS8ofT8.woff2 +0 -0
- package/dist/app/client/assets/Pilat-Demi-CADSbPAt.woff2 +0 -0
- package/dist/app/client/assets/Pilat-Regular-Bx8vzE7q.woff2 +0 -0
- package/dist/app/client/assets/USD1-COVcO_PB.svg +30 -0
- package/dist/app/client/assets/YLDS-CRh8Zw0g.svg +3 -0
- package/dist/app/client/assets/ccip-Cq1mMiVl.js +1 -0
- package/dist/app/client/assets/frxUSD-n9pTpinR.svg +1 -0
- package/dist/app/client/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/app/client/assets/index-B7YJVP00.css +1 -0
- package/dist/app/client/assets/index-UXTxXCLk.js +55 -0
- package/dist/app/client/assets/pathUSD-BvaO6ooS.svg +25 -0
- package/dist/app/client/assets/reset-co-CHrff.css +1 -0
- package/dist/app/client/assets/wYLDS-CaCKDrO-.svg +10 -0
- package/dist/app/db/auth.d.ts +3207 -0
- package/dist/app/db/auth.d.ts.map +1 -0
- package/dist/app/db/auth.js +330 -0
- package/dist/app/db/auth.js.map +1 -0
- package/dist/app/db/schema.d.ts +932 -0
- package/dist/app/db/schema.d.ts.map +1 -0
- package/dist/app/db/schema.js +171 -0
- package/dist/app/db/schema.js.map +1 -0
- package/dist/app/server/.vite/manifest.json +489 -0
- package/dist/app/server/assets/BRLA-CZvVDNYr.png +0 -0
- package/dist/app/server/assets/CHFAU-DCedc4aH.png +0 -0
- package/dist/app/server/assets/DLUSD-BnRXm3EI.png +0 -0
- package/dist/app/server/assets/PRIME-CiFp2-3e.svg +14 -0
- package/dist/app/server/assets/Pilat-Bold-C1t1eIrF.woff2 +0 -0
- package/dist/app/server/assets/Pilat-Book-CbS8ofT8.woff2 +0 -0
- package/dist/app/server/assets/Pilat-Demi-CADSbPAt.woff2 +0 -0
- package/dist/app/server/assets/Pilat-Regular-Bx8vzE7q.woff2 +0 -0
- package/dist/app/server/assets/USD1-COVcO_PB.svg +30 -0
- package/dist/app/server/assets/YLDS-CRh8Zw0g.svg +3 -0
- package/dist/app/server/assets/_tanstack-start-manifest_v-11GtFGrq.js +1 -0
- package/dist/app/server/assets/arktype-aI7TBD0R-D1R3Byo5.js +2 -0
- package/dist/app/server/assets/arktype-aI7TBD0R-D1R3Byo5.js.map +1 -0
- package/dist/app/server/assets/authorize-C95F-9E1-CbESJKGU.js +31 -0
- package/dist/app/server/assets/authorize-C95F-9E1-CbESJKGU.js.map +1 -0
- package/dist/app/server/assets/bun-sqlite-dialect-DoOVo4ja-CtyBkVMb.js +2 -0
- package/dist/app/server/assets/bun-sqlite-dialect-DoOVo4ja-CtyBkVMb.js.map +1 -0
- package/dist/app/server/assets/call-UQamaCKN.js +32 -0
- package/dist/app/server/assets/call-UQamaCKN.js.map +1 -0
- package/dist/app/server/assets/ccip-CbNKFO4n.js +2 -0
- package/dist/app/server/assets/ccip-CbNKFO4n.js.map +1 -0
- package/dist/app/server/assets/compiled-query-Ds2NVcFT.js +2 -0
- package/dist/app/server/assets/compiled-query-Ds2NVcFT.js.map +1 -0
- package/dist/app/server/assets/convert-BIC8n32x.js +2 -0
- package/dist/app/server/assets/convert-BIC8n32x.js.map +1 -0
- package/dist/app/server/assets/cookie-CS900nSP.css +1 -0
- package/dist/app/server/assets/cookie-Cce9CrIP.js +10 -0
- package/dist/app/server/assets/cookie-Cce9CrIP.js.map +1 -0
- package/dist/app/server/assets/core-B1HCXUmx.js +56 -0
- package/dist/app/server/assets/core-B1HCXUmx.js.map +1 -0
- package/dist/app/server/assets/d1-sqlite-dialect-m0f01-4z-Cv-csE1u.js +2 -0
- package/dist/app/server/assets/d1-sqlite-dialect-m0f01-4z-Cv-csE1u.js.map +1 -0
- package/dist/app/server/assets/default-u_dwuiYb-BJJ9PwCi.js +2 -0
- package/dist/app/server/assets/default-u_dwuiYb-BJJ9PwCi.js.map +1 -0
- package/dist/app/server/assets/dist-BxSwugSY.js +1 -0
- package/dist/app/server/assets/dist-CZGFhmQd.js +2 -0
- package/dist/app/server/assets/dist-CZGFhmQd.js.map +1 -0
- package/dist/app/server/assets/dist-Dg3PQqiW.js +15 -0
- package/dist/app/server/assets/dist-Dg3PQqiW.js.map +1 -0
- package/dist/app/server/assets/effect-QlVUlMFu-2tSPDT2b.js +2 -0
- package/dist/app/server/assets/effect-QlVUlMFu-2tSPDT2b.js.map +1 -0
- package/dist/app/server/assets/empty-plugin-adapters-BaGcmrjC.js +2 -0
- package/dist/app/server/assets/empty-plugin-adapters-BaGcmrjC.js.map +1 -0
- package/dist/app/server/assets/factory-ipHlJXZY.js +5 -0
- package/dist/app/server/assets/factory-ipHlJXZY.js.map +1 -0
- package/dist/app/server/assets/frxUSD-n9pTpinR.svg +1 -0
- package/dist/app/server/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/app/server/assets/get-id-field-B0x109VU.js +6 -0
- package/dist/app/server/assets/get-id-field-B0x109VU.js.map +1 -0
- package/dist/app/server/assets/index-CLddUTqr-xpSuLpBt.js +2 -0
- package/dist/app/server/assets/index-CLddUTqr-xpSuLpBt.js.map +1 -0
- package/dist/app/server/assets/index-DZEfthgZ-8Uq5s5Pt.js +2 -0
- package/dist/app/server/assets/index-DZEfthgZ-8Uq5s5Pt.js.map +1 -0
- package/dist/app/server/assets/kysely-adapter-MkHAI9Jk.js +1 -0
- package/dist/app/server/assets/node-sqlite-dialect-BowWLXvK.js +2 -0
- package/dist/app/server/assets/node-sqlite-dialect-BowWLXvK.js.map +1 -0
- package/dist/app/server/assets/pathUSD-BvaO6ooS.svg +25 -0
- package/dist/app/server/assets/reset-co-CHrff.css +1 -0
- package/dist/app/server/assets/rolldown-runtime-B0Z9INg1.js +1 -0
- package/dist/app/server/assets/router-CcbyBCI4.css +1 -0
- package/dist/app/server/assets/router-xjZtEeaI.js +7 -0
- package/dist/app/server/assets/router-xjZtEeaI.js.map +1 -0
- package/dist/app/server/assets/schema-check-Cf7QOZZD.js +9 -0
- package/dist/app/server/assets/schema-check-Cf7QOZZD.js.map +1 -0
- package/dist/app/server/assets/schemas-C2lCYmR5.js +2 -0
- package/dist/app/server/assets/schemas-C2lCYmR5.js.map +1 -0
- package/dist/app/server/assets/secp256k1-buM5g4AL.js +2 -0
- package/dist/app/server/assets/secp256k1-buM5g4AL.js.map +1 -0
- package/dist/app/server/assets/sqlite-adapter-C_LAV4e3.js +2 -0
- package/dist/app/server/assets/sqlite-adapter-C_LAV4e3.js.map +1 -0
- package/dist/app/server/assets/sqlite-introspector-DSCAP82F-Crx7Ny14.js +6 -0
- package/dist/app/server/assets/sqlite-introspector-DSCAP82F-Crx7Ny14.js.map +1 -0
- package/dist/app/server/assets/standard-json-Cg1N07hM.js +2 -0
- package/dist/app/server/assets/standard-json-Cg1N07hM.js.map +1 -0
- package/dist/app/server/assets/standard-json-DY77efq0.js +2 -0
- package/dist/app/server/assets/standard-json-DY77efq0.js.map +1 -0
- package/dist/app/server/assets/standard-json-ig2t0wRt.js +2 -0
- package/dist/app/server/assets/standard-json-ig2t0wRt.js.map +1 -0
- package/dist/app/server/assets/standard-json-t-LNckA6.js +2 -0
- package/dist/app/server/assets/standard-json-t-LNckA6.js.map +1 -0
- package/dist/app/server/assets/standard-openapi-CONmVRl8.js +2 -0
- package/dist/app/server/assets/standard-openapi-CONmVRl8.js.map +1 -0
- package/dist/app/server/assets/start-C63VetBp.js +2 -0
- package/dist/app/server/assets/start-C63VetBp.js.map +1 -0
- package/dist/app/server/assets/sury-CWZTCd75-xt1mWc9f.js +2 -0
- package/dist/app/server/assets/sury-CWZTCd75-xt1mWc9f.js.map +1 -0
- package/dist/app/server/assets/typebox-Dei93FPO-D_lCVdAz.js +2 -0
- package/dist/app/server/assets/typebox-Dei93FPO-D_lCVdAz.js.map +1 -0
- package/dist/app/server/assets/utils-C4ZXZIZW.js +2 -0
- package/dist/app/server/assets/utils-C4ZXZIZW.js.map +1 -0
- package/dist/app/server/assets/valibot--1zFm7rT-NSoY2xTp.js +2 -0
- package/dist/app/server/assets/valibot--1zFm7rT-NSoY2xTp.js.map +1 -0
- package/dist/app/server/assets/valibot-D_HTw1Gn-CJwWeOUE.js +2 -0
- package/dist/app/server/assets/valibot-D_HTw1Gn-CJwWeOUE.js.map +1 -0
- package/dist/app/server/assets/wYLDS-CaCKDrO-.svg +10 -0
- package/dist/app/server/assets/zod-Bwrt9trS-CV38yPnQ.js +2 -0
- package/dist/app/server/assets/zod-Bwrt9trS-CV38yPnQ.js.map +1 -0
- package/dist/app/server/assets/zod-DSgpEGAE-BvlnBE2L.js +2 -0
- package/dist/app/server/assets/zod-DSgpEGAE-BvlnBE2L.js.map +1 -0
- package/dist/app/server/index.js +574 -0
- package/dist/app/server/index.js.map +1 -0
- package/dist/app/server/wrangler.json +1 -0
- package/dist/cli/Admin.d.ts +38 -0
- package/dist/cli/Admin.d.ts.map +1 -0
- package/dist/cli/Admin.js +62 -0
- package/dist/cli/Admin.js.map +1 -0
- package/dist/cli/Apps.d.ts +9 -0
- package/dist/cli/Apps.d.ts.map +1 -0
- package/dist/cli/Apps.js +36 -0
- package/dist/cli/Apps.js.map +1 -0
- package/dist/cli/Cli.d.ts +14 -0
- package/dist/cli/Cli.d.ts.map +1 -0
- package/dist/cli/Cli.js +27 -0
- package/dist/cli/Cli.js.map +1 -0
- package/dist/cli/Project.d.ts +20 -0
- package/dist/cli/Project.d.ts.map +1 -0
- package/dist/cli/Project.js +88 -0
- package/dist/cli/Project.js.map +1 -0
- package/dist/cli/Realms.d.ts +24 -0
- package/dist/cli/Realms.d.ts.map +1 -0
- package/dist/cli/Realms.js +49 -0
- package/dist/cli/Realms.js.map +1 -0
- package/dist/cli/Session.d.ts +85 -0
- package/dist/cli/Session.d.ts.map +1 -0
- package/dist/cli/Session.js +178 -0
- package/dist/cli/Session.js.map +1 -0
- package/dist/cli/User.d.ts +29 -0
- package/dist/cli/User.d.ts.map +1 -0
- package/dist/cli/User.js +39 -0
- package/dist/cli/User.js.map +1 -0
- package/dist/cli/V1.d.ts +35 -0
- package/dist/cli/V1.d.ts.map +1 -0
- package/dist/cli/V1.js +41 -0
- package/dist/cli/V1.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +46 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/admin/apps/create.d.ts +23 -0
- package/dist/cli/commands/admin/apps/create.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/create.js +89 -0
- package/dist/cli/commands/admin/apps/create.js.map +1 -0
- package/dist/cli/commands/admin/apps/delete.d.ts +14 -0
- package/dist/cli/commands/admin/apps/delete.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/delete.js +41 -0
- package/dist/cli/commands/admin/apps/delete.js.map +1 -0
- package/dist/cli/commands/admin/apps/index.d.ts +5 -0
- package/dist/cli/commands/admin/apps/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/index.js +14 -0
- package/dist/cli/commands/admin/apps/index.js.map +1 -0
- package/dist/cli/commands/admin/apps/list.d.ts +9 -0
- package/dist/cli/commands/admin/apps/list.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/list.js +26 -0
- package/dist/cli/commands/admin/apps/list.js.map +1 -0
- package/dist/cli/commands/admin/apps/rotate-secret.d.ts +16 -0
- package/dist/cli/commands/admin/apps/rotate-secret.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/rotate-secret.js +47 -0
- package/dist/cli/commands/admin/apps/rotate-secret.js.map +1 -0
- package/dist/cli/commands/admin/apps/update.d.ts +20 -0
- package/dist/cli/commands/admin/apps/update.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/update.js +76 -0
- package/dist/cli/commands/admin/apps/update.js.map +1 -0
- package/dist/cli/commands/admin/index.d.ts +5 -0
- package/dist/cli/commands/admin/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/index.js +13 -0
- package/dist/cli/commands/admin/index.js.map +1 -0
- package/dist/cli/commands/admin/migrate.d.ts +9 -0
- package/dist/cli/commands/admin/migrate.d.ts.map +1 -0
- package/dist/cli/commands/admin/migrate.js +17 -0
- package/dist/cli/commands/admin/migrate.js.map +1 -0
- package/dist/cli/commands/admin/realms/add.d.ts +12 -0
- package/dist/cli/commands/admin/realms/add.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/add.js +42 -0
- package/dist/cli/commands/admin/realms/add.js.map +1 -0
- package/dist/cli/commands/admin/realms/index.d.ts +5 -0
- package/dist/cli/commands/admin/realms/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/index.js +13 -0
- package/dist/cli/commands/admin/realms/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/list.d.ts +13 -0
- package/dist/cli/commands/admin/realms/list.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/list.js +36 -0
- package/dist/cli/commands/admin/realms/list.js.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/index.d.ts +5 -0
- package/dist/cli/commands/admin/realms/passkeys/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/index.js +13 -0
- package/dist/cli/commands/admin/realms/passkeys/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/set.d.ts +16 -0
- package/dist/cli/commands/admin/realms/passkeys/set.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/set.js +46 -0
- package/dist/cli/commands/admin/realms/passkeys/set.js.map +1 -0
- package/dist/cli/commands/admin/realms/privy/index.d.ts +5 -0
- package/dist/cli/commands/admin/realms/privy/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/privy/index.js +13 -0
- package/dist/cli/commands/admin/realms/privy/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/privy/set.d.ts +18 -0
- package/dist/cli/commands/admin/realms/privy/set.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/privy/set.js +66 -0
- package/dist/cli/commands/admin/realms/privy/set.js.map +1 -0
- package/dist/cli/commands/admin/realms/remove.d.ts +11 -0
- package/dist/cli/commands/admin/realms/remove.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/remove.js +35 -0
- package/dist/cli/commands/admin/realms/remove.js.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.d.ts +15 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.js +42 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.js.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.d.ts +15 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.js +42 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.js.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.d.ts +9 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.js +17 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/set.d.ts +16 -0
- package/dist/cli/commands/admin/realms/set.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/set.js +46 -0
- package/dist/cli/commands/admin/realms/set.js.map +1 -0
- package/dist/cli/commands/admin/rotate-key.d.ts +15 -0
- package/dist/cli/commands/admin/rotate-key.d.ts.map +1 -0
- package/dist/cli/commands/admin/rotate-key.js +46 -0
- package/dist/cli/commands/admin/rotate-key.js.map +1 -0
- package/dist/cli/commands/init.d.ts +11 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +34 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/login.d.ts +12 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +29 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +8 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +12 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +24 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/client/Actions.d.ts +101 -0
- package/dist/client/Actions.d.ts.map +1 -0
- package/dist/client/Actions.js +90 -0
- package/dist/client/Actions.js.map +1 -0
- package/dist/client/Auth.d.ts +161 -0
- package/dist/client/Auth.d.ts.map +1 -0
- package/dist/client/Auth.js +113 -0
- package/dist/client/Auth.js.map +1 -0
- package/dist/client/Authorization.d.ts +29 -0
- package/dist/client/Authorization.d.ts.map +1 -0
- package/dist/client/Authorization.js +12 -0
- package/dist/client/Authorization.js.map +1 -0
- package/dist/client/Decorator.d.ts +170 -0
- package/dist/client/Decorator.d.ts.map +1 -0
- package/dist/client/Decorator.js +227 -0
- package/dist/client/Decorator.js.map +1 -0
- package/dist/client/Key.d.ts +85 -0
- package/dist/client/Key.d.ts.map +1 -0
- package/dist/client/Key.js +83 -0
- package/dist/client/Key.js.map +1 -0
- package/dist/client/Pending.d.ts +39 -0
- package/dist/client/Pending.d.ts.map +1 -0
- package/dist/client/Pending.js +12 -0
- package/dist/client/Pending.js.map +1 -0
- package/dist/client/Permissions.d.ts +34 -0
- package/dist/client/Permissions.d.ts.map +1 -0
- package/dist/client/Permissions.js +16 -0
- package/dist/client/Permissions.js.map +1 -0
- package/dist/client/Provider.d.ts +16 -0
- package/dist/client/Provider.d.ts.map +1 -0
- package/dist/client/Provider.js +12 -0
- package/dist/client/Provider.js.map +1 -0
- package/dist/client/Step.d.ts +21 -0
- package/dist/client/Step.d.ts.map +1 -0
- package/dist/client/Step.js +16 -0
- package/dist/client/Step.js.map +1 -0
- package/dist/client/Storage.d.ts +27 -0
- package/dist/client/Storage.d.ts.map +1 -0
- package/dist/client/Storage.js +16 -0
- package/dist/client/Storage.js.map +1 -0
- package/dist/client/TempoAccount.d.ts +40 -0
- package/dist/client/TempoAccount.d.ts.map +1 -0
- package/dist/client/TempoAccount.js +16 -0
- package/dist/client/TempoAccount.js.map +1 -0
- package/dist/client/Tokens.d.ts +25 -0
- package/dist/client/Tokens.d.ts.map +1 -0
- package/dist/client/Tokens.js +12 -0
- package/dist/client/Tokens.js.map +1 -0
- package/dist/client/User.d.ts +21 -0
- package/dist/client/User.d.ts.map +1 -0
- package/dist/client/User.js +12 -0
- package/dist/client/User.js.map +1 -0
- package/dist/client/actions/account.d.ts +25 -0
- package/dist/client/actions/account.d.ts.map +1 -0
- package/dist/client/actions/account.js +34 -0
- package/dist/client/actions/account.js.map +1 -0
- package/dist/client/actions/device.d.ts +53 -0
- package/dist/client/actions/device.d.ts.map +1 -0
- package/dist/client/actions/device.js +79 -0
- package/dist/client/actions/device.js.map +1 -0
- package/dist/client/actions/email.d.ts +84 -0
- package/dist/client/actions/email.d.ts.map +1 -0
- package/dist/client/actions/email.js +63 -0
- package/dist/client/actions/email.js.map +1 -0
- package/dist/client/actions/oauth.d.ts +115 -0
- package/dist/client/actions/oauth.d.ts.map +1 -0
- package/dist/client/actions/oauth.js +105 -0
- package/dist/client/actions/oauth.js.map +1 -0
- package/dist/client/actions/passkey.d.ts +88 -0
- package/dist/client/actions/passkey.d.ts.map +1 -0
- package/dist/client/actions/passkey.js +60 -0
- package/dist/client/actions/passkey.js.map +1 -0
- package/dist/client/actions/provider.d.ts +49 -0
- package/dist/client/actions/provider.d.ts.map +1 -0
- package/dist/client/actions/provider.js +34 -0
- package/dist/client/actions/provider.js.map +1 -0
- package/dist/client/actions/realm.d.ts +24 -0
- package/dist/client/actions/realm.d.ts.map +1 -0
- package/dist/client/actions/realm.js +15 -0
- package/dist/client/actions/realm.js.map +1 -0
- package/dist/client/actions/redirect.d.ts +153 -0
- package/dist/client/actions/redirect.d.ts.map +1 -0
- package/dist/client/actions/redirect.js +236 -0
- package/dist/client/actions/redirect.js.map +1 -0
- package/dist/client/internal/accessKey.d.ts +21 -0
- package/dist/client/internal/accessKey.d.ts.map +1 -0
- package/dist/client/internal/accessKey.js +38 -0
- package/dist/client/internal/accessKey.js.map +1 -0
- package/dist/client/internal/account.d.ts +14 -0
- package/dist/client/internal/account.d.ts.map +1 -0
- package/dist/client/internal/account.js +3 -0
- package/dist/client/internal/account.js.map +1 -0
- package/dist/client/internal/api.d.ts +106 -0
- package/dist/client/internal/api.d.ts.map +1 -0
- package/dist/client/internal/api.js +129 -0
- package/dist/client/internal/api.js.map +1 -0
- package/dist/client/internal/headless.d.ts +33 -0
- package/dist/client/internal/headless.d.ts.map +1 -0
- package/dist/client/internal/headless.js +46 -0
- package/dist/client/internal/headless.js.map +1 -0
- package/dist/client/internal/indexedDb.d.ts +9 -0
- package/dist/client/internal/indexedDb.d.ts.map +1 -0
- package/dist/client/internal/indexedDb.js +32 -0
- package/dist/client/internal/indexedDb.js.map +1 -0
- package/dist/client/internal/request.d.ts +58 -0
- package/dist/client/internal/request.d.ts.map +1 -0
- package/dist/client/internal/request.js +45 -0
- package/dist/client/internal/request.js.map +1 -0
- package/dist/client/internal/store.d.ts +12 -0
- package/dist/client/internal/store.d.ts.map +1 -0
- package/dist/client/internal/store.js +15 -0
- package/dist/client/internal/store.js.map +1 -0
- package/dist/client.d.ts +20 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +20 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/Apps.d.ts +3051 -0
- package/dist/internal/Apps.d.ts.map +1 -0
- package/dist/internal/Apps.js +472 -0
- package/dist/internal/Apps.js.map +1 -0
- package/dist/internal/Auth.d.ts +4058 -0
- package/dist/internal/Auth.d.ts.map +1 -0
- package/dist/internal/Auth.js +137 -0
- package/dist/internal/Auth.js.map +1 -0
- package/dist/internal/Authorize.d.ts +532 -0
- package/dist/internal/Authorize.d.ts.map +1 -0
- package/dist/internal/Authorize.js +326 -0
- package/dist/internal/Authorize.js.map +1 -0
- package/dist/internal/Device.d.ts +371 -0
- package/dist/internal/Device.d.ts.map +1 -0
- package/dist/internal/Device.js +271 -0
- package/dist/internal/Device.js.map +1 -0
- package/dist/internal/Env.d.ts +57 -0
- package/dist/internal/Env.d.ts.map +1 -0
- package/dist/internal/Env.js +2 -0
- package/dist/internal/Env.js.map +1 -0
- package/dist/internal/ErrorResponse.d.ts +609 -0
- package/dist/internal/ErrorResponse.d.ts.map +1 -0
- package/dist/internal/ErrorResponse.js +679 -0
- package/dist/internal/ErrorResponse.js.map +1 -0
- package/dist/internal/Id.d.ts +10 -0
- package/dist/internal/Id.d.ts.map +1 -0
- package/dist/internal/Id.js +34 -0
- package/dist/internal/Id.js.map +1 -0
- package/dist/internal/KeyAuthorization.d.ts +1456 -0
- package/dist/internal/KeyAuthorization.d.ts.map +1 -0
- package/dist/internal/KeyAuthorization.js +1030 -0
- package/dist/internal/KeyAuthorization.js.map +1 -0
- package/dist/internal/Limits.d.ts +65 -0
- package/dist/internal/Limits.d.ts.map +1 -0
- package/dist/internal/Limits.js +35 -0
- package/dist/internal/Limits.js.map +1 -0
- package/dist/internal/Log.d.ts +49 -0
- package/dist/internal/Log.d.ts.map +1 -0
- package/dist/internal/Log.js +101 -0
- package/dist/internal/Log.js.map +1 -0
- package/dist/internal/LogLine.d.ts +33 -0
- package/dist/internal/LogLine.d.ts.map +1 -0
- package/dist/internal/LogLine.js +56 -0
- package/dist/internal/LogLine.js.map +1 -0
- package/dist/internal/Migrations.d.ts +19 -0
- package/dist/internal/Migrations.d.ts.map +1 -0
- package/dist/internal/Migrations.js +57 -0
- package/dist/internal/Migrations.js.map +1 -0
- package/dist/internal/Owner.d.ts +146 -0
- package/dist/internal/Owner.d.ts.map +1 -0
- package/dist/internal/Owner.js +65 -0
- package/dist/internal/Owner.js.map +1 -0
- package/dist/internal/Passkey.d.ts +528 -0
- package/dist/internal/Passkey.d.ts.map +1 -0
- package/dist/internal/Passkey.js +658 -0
- package/dist/internal/Passkey.js.map +1 -0
- package/dist/internal/PendingKey.d.ts +49 -0
- package/dist/internal/PendingKey.d.ts.map +1 -0
- package/dist/internal/PendingKey.js +58 -0
- package/dist/internal/PendingKey.js.map +1 -0
- package/dist/internal/Privy.d.ts +105 -0
- package/dist/internal/Privy.d.ts.map +1 -0
- package/dist/internal/Privy.js +224 -0
- package/dist/internal/Privy.js.map +1 -0
- package/dist/internal/RateLimit.d.ts +190 -0
- package/dist/internal/RateLimit.d.ts.map +1 -0
- package/dist/internal/RateLimit.js +148 -0
- package/dist/internal/RateLimit.js.map +1 -0
- package/dist/internal/Realm.d.ts +281 -0
- package/dist/internal/Realm.d.ts.map +1 -0
- package/dist/internal/Realm.js +477 -0
- package/dist/internal/Realm.js.map +1 -0
- package/dist/internal/RequestId.d.ts +16 -0
- package/dist/internal/RequestId.d.ts.map +1 -0
- package/dist/internal/RequestId.js +78 -0
- package/dist/internal/RequestId.js.map +1 -0
- package/dist/internal/SigningKey.d.ts +115 -0
- package/dist/internal/SigningKey.d.ts.map +1 -0
- package/dist/internal/SigningKey.js +197 -0
- package/dist/internal/SigningKey.js.map +1 -0
- package/dist/internal/TestInbox.d.ts +42 -0
- package/dist/internal/TestInbox.d.ts.map +1 -0
- package/dist/internal/TestInbox.js +20 -0
- package/dist/internal/TestInbox.js.map +1 -0
- package/dist/internal/Timing.d.ts +51 -0
- package/dist/internal/Timing.d.ts.map +1 -0
- package/dist/internal/Timing.js +103 -0
- package/dist/internal/Timing.js.map +1 -0
- package/dist/internal/Validation.d.ts +52 -0
- package/dist/internal/Validation.d.ts.map +1 -0
- package/dist/internal/Validation.js +22 -0
- package/dist/internal/Validation.js.map +1 -0
- package/dist/internal/Wallet.d.ts +37 -0
- package/dist/internal/Wallet.d.ts.map +1 -0
- package/dist/internal/Wallet.js +43 -0
- package/dist/internal/Wallet.js.map +1 -0
- package/dist/worker.d.ts +12 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +12 -0
- package/dist/worker.js.map +1 -0
- package/package.json +79 -3
- package/src/Api.ts +151 -0
- package/src/App.ts +56 -0
- package/src/api/account.ts +311 -0
- package/src/api/authenticate.ts +1290 -0
- package/src/api/authorize.ts +1030 -0
- package/src/api/device.ts +874 -0
- package/src/api/health.ts +72 -0
- package/src/api/lib/AccountStep.ts +335 -0
- package/src/api/lib/Auth.ts +134 -0
- package/src/api/lib/Consent.ts +339 -0
- package/src/api/lib/Cors.ts +107 -0
- package/src/api/lib/Database.ts +10 -0
- package/src/api/lib/DeviceRequest.ts +265 -0
- package/src/api/lib/FirstAccount.ts +90 -0
- package/src/api/lib/KeySigner.ts +393 -0
- package/src/api/lib/PasskeyLink.ts +162 -0
- package/src/api/lib/Session.ts +34 -0
- package/src/api/lib/SignInConsent.ts +316 -0
- package/src/api/oauth.ts +1282 -0
- package/src/api/provider.ts +441 -0
- package/src/app/components/Button.tsx +128 -0
- package/src/app/components/CodeInput.tsx +186 -0
- package/src/app/components/ErrorMessage.tsx +66 -0
- package/src/app/components/Grant.tsx +323 -0
- package/src/app/components/Input.tsx +48 -0
- package/src/app/components/Tooltip.tsx +45 -0
- package/src/app/components/icons/BRLA.png +0 -0
- package/src/app/components/icons/BRZ.svg +1 -0
- package/src/app/components/icons/CHFAU.png +0 -0
- package/src/app/components/icons/DLUSD.png +0 -0
- package/src/app/components/icons/EURAU.svg +1 -0
- package/src/app/components/icons/EURC.e.svg +1 -0
- package/src/app/components/icons/GBPA.svg +4 -0
- package/src/app/components/icons/GUSD.svg +1 -0
- package/src/app/components/icons/MACH.svg +4 -0
- package/src/app/components/icons/OUSD.svg +5 -0
- package/src/app/components/icons/PRIME.svg +14 -0
- package/src/app/components/icons/SBC.svg +1 -0
- package/src/app/components/icons/SEKAU.svg +5 -0
- package/src/app/components/icons/USD1.svg +30 -0
- package/src/app/components/icons/USDB.svg +11 -0
- package/src/app/components/icons/USDC.e.svg +1 -0
- package/src/app/components/icons/USDT0.svg +1 -0
- package/src/app/components/icons/USDY.svg +16 -0
- package/src/app/components/icons/USDe.svg +1 -0
- package/src/app/components/icons/YLDS.svg +3 -0
- package/src/app/components/icons/alphaUSD.svg +1 -0
- package/src/app/components/icons/betaUSD.svg +1 -0
- package/src/app/components/icons/cUSD.svg +1 -0
- package/src/app/components/icons/cbBTC.svg +1 -0
- package/src/app/components/icons/frxUSD.svg +1 -0
- package/src/app/components/icons/goUSD.svg +5 -0
- package/src/app/components/icons/iUSD.svg +1 -0
- package/src/app/components/icons/pathUSD.svg +25 -0
- package/src/app/components/icons/rUSD.svg +1 -0
- package/src/app/components/icons/reUSD.svg +1 -0
- package/src/app/components/icons/sUSDe.svg +1 -0
- package/src/app/components/icons/siUSD.svg +1 -0
- package/src/app/components/icons/stcUSD.svg +1 -0
- package/src/app/components/icons/syrupUSDC.svg +5 -0
- package/src/app/components/icons/thetaUSD.svg +1 -0
- package/src/app/components/icons/wYLDS.svg +10 -0
- package/src/app/components/icons/wsrUSD.svg +1 -0
- package/src/app/components/logos/OUSD.dark.svg +17 -0
- package/src/app/components/logos/OUSD.light.svg +17 -0
- package/src/app/crons/cleanup.ts +42 -0
- package/src/app/db/auth.ts +416 -0
- package/src/app/db/migrations/0000_better_auth.sql +53 -0
- package/src/app/db/migrations/0001_oauth_provider.sql +162 -0
- package/src/app/db/migrations/0002_device_code.sql +17 -0
- package/src/app/db/migrations/0003_realms.sql +27 -0
- package/src/app/db/migrations/0004_default_realm.sql +2 -0
- package/src/app/db/migrations/0005_passkeys.sql +30 -0
- package/src/app/db/migrations/0006_first_accounts.sql +9 -0
- package/src/app/db/migrations/0007_pending_keys.sql +13 -0
- package/src/app/db/migrations/0008_secp256k1_owners.sql +18 -0
- package/src/app/db/migrations/0009_device_requests.sql +8 -0
- package/src/app/db/migrations/0010_device_keys.sql +4 -0
- package/src/app/db/migrations/meta/0000_snapshot.json +362 -0
- package/src/app/db/migrations/meta/0001_snapshot.json +1487 -0
- package/src/app/db/migrations/meta/0002_snapshot.json +1603 -0
- package/src/app/db/migrations/meta/0003_snapshot.json +1760 -0
- package/src/app/db/migrations/meta/0004_snapshot.json +1760 -0
- package/src/app/db/migrations/meta/0005_snapshot.json +1911 -0
- package/src/app/db/migrations/meta/0006_snapshot.json +1967 -0
- package/src/app/db/migrations/meta/0007_snapshot.json +2047 -0
- package/src/app/db/migrations/meta/0008_snapshot.json +2157 -0
- package/src/app/db/migrations/meta/0009_snapshot.json +2207 -0
- package/src/app/db/migrations/meta/0010_snapshot.json +2231 -0
- package/src/app/db/migrations/meta/_journal.json +83 -0
- package/src/app/db/schema.ts +218 -0
- package/src/app/env.ts +49 -0
- package/src/app/lib/Client.ts +82 -0
- package/src/app/lib/Loader.ts +24 -0
- package/src/app/package.json +8 -0
- package/src/app/routeTree.gen.ts +198 -0
- package/src/app/router.tsx +48 -0
- package/src/app/routes/[_].flows.tsx +3001 -0
- package/src/app/routes/__root.tsx +91 -0
- package/src/app/routes/authorize.tsx +197 -0
- package/src/app/routes/choose-account.tsx +111 -0
- package/src/app/routes/deposit.tsx +105 -0
- package/src/app/routes/device.tsx +227 -0
- package/src/app/routes/index.tsx +115 -0
- package/src/app/routes/login.tsx +506 -0
- package/src/app/screens/Account.tsx +347 -0
- package/src/app/screens/Approval.tsx +276 -0
- package/src/app/screens/ChooseAccount.tsx +240 -0
- package/src/app/screens/Deposit.tsx +762 -0
- package/src/app/screens/DeviceApproval.tsx +480 -0
- package/src/app/screens/SignIn.tsx +362 -0
- package/src/app/screens/chains/base.svg +3 -0
- package/src/app/screens/chains/ethereum.svg +11 -0
- package/src/app/screens/chains/solana.svg +4 -0
- package/src/app/screens/chains/tempo.svg +4 -0
- package/src/app/server.ts +204 -0
- package/src/app/vite.config.ts +95 -0
- package/src/app/void.config.ts +29 -0
- package/src/app/zyzz.config.ts +274 -0
- package/src/cli/Admin.ts +73 -0
- package/src/cli/Apps.ts +29 -0
- package/src/cli/Cli.ts +42 -0
- package/src/cli/Project.ts +117 -0
- package/src/cli/Realms.ts +50 -0
- package/src/cli/Session.ts +239 -0
- package/src/cli/User.ts +45 -0
- package/src/cli/V1.ts +57 -0
- package/src/cli/bin.ts +44 -0
- package/src/cli/commands/admin/apps/create.ts +101 -0
- package/src/cli/commands/admin/apps/delete.ts +38 -0
- package/src/cli/commands/admin/apps/index.ts +15 -0
- package/src/cli/commands/admin/apps/list.ts +25 -0
- package/src/cli/commands/admin/apps/rotate-secret.ts +47 -0
- package/src/cli/commands/admin/apps/update.ts +86 -0
- package/src/cli/commands/admin/index.ts +14 -0
- package/src/cli/commands/admin/migrate.ts +16 -0
- package/src/cli/commands/admin/realms/add.ts +40 -0
- package/src/cli/commands/admin/realms/index.ts +14 -0
- package/src/cli/commands/admin/realms/list.ts +38 -0
- package/src/cli/commands/admin/realms/passkeys/index.ts +15 -0
- package/src/cli/commands/admin/realms/passkeys/set.ts +44 -0
- package/src/cli/commands/admin/realms/privy/index.ts +14 -0
- package/src/cli/commands/admin/realms/privy/set.ts +69 -0
- package/src/cli/commands/admin/realms/remove.ts +33 -0
- package/src/cli/commands/admin/realms/secp256k1/disable.ts +40 -0
- package/src/cli/commands/admin/realms/secp256k1/enable.ts +40 -0
- package/src/cli/commands/admin/realms/secp256k1/index.ts +19 -0
- package/src/cli/commands/admin/realms/set.ts +46 -0
- package/src/cli/commands/admin/rotate-key.ts +47 -0
- package/src/cli/commands/init.ts +42 -0
- package/src/cli/commands/login.ts +32 -0
- package/src/cli/commands/logout.ts +19 -0
- package/src/cli/commands/whoami.ts +23 -0
- package/src/client/Actions.ts +168 -0
- package/src/client/Auth.ts +285 -0
- package/src/client/Authorization.ts +34 -0
- package/src/client/Decorator.ts +410 -0
- package/src/client/Key.ts +140 -0
- package/src/client/Pending.ts +46 -0
- package/src/client/Permissions.ts +39 -0
- package/src/client/Provider.ts +18 -0
- package/src/client/Step.ts +24 -0
- package/src/client/Storage.ts +29 -0
- package/src/client/TempoAccount.ts +42 -0
- package/src/client/Tokens.ts +27 -0
- package/src/client/User.ts +23 -0
- package/src/client/actions/account.ts +57 -0
- package/src/client/actions/device.ts +151 -0
- package/src/client/actions/email.ts +141 -0
- package/src/client/actions/oauth.ts +182 -0
- package/src/client/actions/passkey.ts +141 -0
- package/src/client/actions/provider.ts +70 -0
- package/src/client/actions/realm.ts +36 -0
- package/src/client/actions/redirect.ts +408 -0
- package/src/client/internal/accessKey.ts +54 -0
- package/src/client/internal/account.ts +15 -0
- package/src/client/internal/api.ts +224 -0
- package/src/client/internal/headless.ts +77 -0
- package/src/client/internal/indexedDb.ts +44 -0
- package/src/client/internal/request.ts +71 -0
- package/src/client/internal/store.ts +20 -0
- package/src/client.ts +19 -0
- package/src/index.ts +6 -0
- package/src/internal/Apps.ts +718 -0
- package/src/internal/Auth.ts +203 -0
- package/src/internal/Authorize.ts +424 -0
- package/src/internal/Balance.ts +168 -0
- package/src/internal/BodyLimit.ts +36 -0
- package/src/internal/Chain.ts +16 -0
- package/src/internal/Device.ts +469 -0
- package/src/internal/Env.ts +58 -0
- package/src/internal/ErrorResponse.ts +854 -0
- package/src/internal/Id.ts +41 -0
- package/src/internal/KeyAuthorization.ts +1339 -0
- package/src/internal/Limits.ts +39 -0
- package/src/internal/Log.ts +178 -0
- package/src/internal/LogLine.ts +87 -0
- package/src/internal/Logout.ts +336 -0
- package/src/internal/Migrations.ts +86 -0
- package/src/internal/OpenApi.ts +300 -0
- package/src/internal/Owner.ts +211 -0
- package/src/internal/Passkey.ts +1052 -0
- package/src/internal/PendingKey.ts +104 -0
- package/src/internal/Privy.ts +402 -0
- package/src/internal/Provider.ts +125 -0
- package/src/internal/RateLimit.ts +259 -0
- package/src/internal/Realm.ts +768 -0
- package/src/internal/RequestId.ts +118 -0
- package/src/internal/SignInGrant.ts +168 -0
- package/src/internal/SigningKey.ts +286 -0
- package/src/internal/TempoAccount.ts +342 -0
- package/src/internal/TestInbox.ts +51 -0
- package/src/internal/Timing.ts +158 -0
- package/src/internal/Validation.ts +52 -0
- package/src/internal/Wallet.ts +62 -0
- package/src/internal/owners/Passkey.ts +72 -0
- package/src/internal/owners/Privy.ts +81 -0
- package/src/internal/owners/Secp256k1.ts +143 -0
- package/src/types/app.d.ts +19 -0
- package/src/worker.ts +11 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applies the package's migrations to a Postgres database. It keeps Void's ledger, `_void_migrations`
|
|
3
|
+
* by file name, so `void db migrate` in `src/app` and `tempo-id admin migrate` each skip what the
|
|
4
|
+
* other applied.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import * as Fs from 'node:fs'
|
|
8
|
+
import * as Path from 'node:path'
|
|
9
|
+
import pg from 'pg'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The advisory lock that serializes concurrent runs. Void's own runner takes none, so it and this
|
|
13
|
+
* command must not run at once.
|
|
14
|
+
*/
|
|
15
|
+
const lock = 7_105_201_133
|
|
16
|
+
|
|
17
|
+
/** The package's migrations. The module is `src/internal/` or `dist/internal/`, two folders below the root. */
|
|
18
|
+
export const directory = Path.join(
|
|
19
|
+
import.meta.dirname,
|
|
20
|
+
'..',
|
|
21
|
+
'..',
|
|
22
|
+
'src',
|
|
23
|
+
'app',
|
|
24
|
+
'db',
|
|
25
|
+
'migrations',
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Applies each migration in `directory` that the ledger lacks, in file name order, each in its own
|
|
30
|
+
* transaction. Connects directly, since the lock needs a session that Hyperdrive does not keep.
|
|
31
|
+
* Returns the names it applied. A failed migration rolls back, and the error names its file.
|
|
32
|
+
*/
|
|
33
|
+
export async function apply(options: apply.Options) {
|
|
34
|
+
const client = new pg.Client({ connectionString: options.connectionString })
|
|
35
|
+
await client.connect()
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
await client.query('select pg_advisory_lock($1)', [lock])
|
|
39
|
+
await client.query(
|
|
40
|
+
'create table if not exists _void_migrations (name text primary key, applied_at text not null)',
|
|
41
|
+
)
|
|
42
|
+
const ledger = await client.query<{ name: string }>(
|
|
43
|
+
'select name from _void_migrations',
|
|
44
|
+
)
|
|
45
|
+
const done = new Set(ledger.rows.map((row) => row.name))
|
|
46
|
+
|
|
47
|
+
const applied: string[] = []
|
|
48
|
+
const names = Fs.readdirSync(options.directory ?? directory)
|
|
49
|
+
.filter((name) => name.endsWith('.sql'))
|
|
50
|
+
.sort()
|
|
51
|
+
for (const name of names) {
|
|
52
|
+
if (done.has(name)) continue
|
|
53
|
+
const sql = Fs.readFileSync(
|
|
54
|
+
Path.join(options.directory ?? directory, name),
|
|
55
|
+
'utf8',
|
|
56
|
+
)
|
|
57
|
+
try {
|
|
58
|
+
await client.query('begin')
|
|
59
|
+
await client.query(sql)
|
|
60
|
+
await client.query(
|
|
61
|
+
'insert into _void_migrations (name, applied_at) values ($1, $2)',
|
|
62
|
+
[name, new Date().toISOString()],
|
|
63
|
+
)
|
|
64
|
+
await client.query('commit')
|
|
65
|
+
} catch (error) {
|
|
66
|
+
await client.query('rollback')
|
|
67
|
+
throw new Error(`Migration ${name} failed.`, { cause: error })
|
|
68
|
+
}
|
|
69
|
+
applied.push(name)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return { applied }
|
|
73
|
+
} finally {
|
|
74
|
+
// Ending the session releases the lock.
|
|
75
|
+
await client.end()
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export declare namespace apply {
|
|
80
|
+
type Options = {
|
|
81
|
+
/** A direct Postgres connection string, never a Hyperdrive one. */
|
|
82
|
+
connectionString: string
|
|
83
|
+
/** The folder of `.sql` migrations. Defaults to the package's. */
|
|
84
|
+
directory?: string | undefined
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Documents the API's Hono routes with `hono-openapi`. Routes stay plain Hono routes: each one adds
|
|
3
|
+
* `describeRoute` for its documentation and `validate` for each input. The document is generated
|
|
4
|
+
* from the mounted app.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import type { Hono, MiddlewareHandler, ValidationTargets } from 'hono'
|
|
8
|
+
import {
|
|
9
|
+
generateSpecs,
|
|
10
|
+
type HandlerUniqueProperty,
|
|
11
|
+
resolver,
|
|
12
|
+
type ResponsesWithResolver,
|
|
13
|
+
uniqueSymbol,
|
|
14
|
+
validator,
|
|
15
|
+
} from 'hono-openapi'
|
|
16
|
+
import type * as z from 'zod'
|
|
17
|
+
import * as Auth from './Auth.js'
|
|
18
|
+
import * as ErrorResponse from './ErrorResponse.js'
|
|
19
|
+
import * as Validation from './Validation.js'
|
|
20
|
+
|
|
21
|
+
export { describeRoute, resolver, validator } from 'hono-openapi'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Conversion options for every schema. A hex quantity also accepts a bigint in process, which JSON
|
|
25
|
+
* Schema cannot express. That branch converts to `{}` and is dropped, which leaves the hex string
|
|
26
|
+
* that JSON requests send. Zod marks `.readonly()` schemas `readOnly`, which OpenAPI reads as
|
|
27
|
+
* server-set, so request fields drop it.
|
|
28
|
+
*/
|
|
29
|
+
const options = {
|
|
30
|
+
options: {
|
|
31
|
+
override: (context: {
|
|
32
|
+
jsonSchema: {
|
|
33
|
+
anyOf?: Record<string, unknown>[] | undefined
|
|
34
|
+
readOnly?: boolean | undefined
|
|
35
|
+
}
|
|
36
|
+
}) => {
|
|
37
|
+
const { jsonSchema } = context
|
|
38
|
+
delete jsonSchema.readOnly
|
|
39
|
+
const anyOf = jsonSchema.anyOf?.filter(
|
|
40
|
+
(branch) => Object.keys(branch).length > 0,
|
|
41
|
+
)
|
|
42
|
+
if (!anyOf || anyOf.length === jsonSchema.anyOf!.length) return
|
|
43
|
+
if (anyOf.length === 1) {
|
|
44
|
+
delete jsonSchema.anyOf
|
|
45
|
+
Object.assign(jsonSchema, anyOf[0])
|
|
46
|
+
} else jsonSchema.anyOf = anyOf
|
|
47
|
+
},
|
|
48
|
+
unrepresentable: 'any',
|
|
49
|
+
},
|
|
50
|
+
} as const
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The Scalar bundle the reference loads: one file, pinned by version and by the SHA-384 digest of
|
|
54
|
+
* `dist/browser/standalone.js` in the npm tarball of `@scalar/api-reference@1.72.1`.
|
|
55
|
+
*/
|
|
56
|
+
const scalar = {
|
|
57
|
+
integrity:
|
|
58
|
+
'sha384-U11tb2XnKvmwt8RlTvnwUnYgrN+ur4Xyh9htLhjajWNR/Oyl5AX5DEz00qRmlrmK',
|
|
59
|
+
src: 'https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.72.1/dist/browser/standalone.js',
|
|
60
|
+
} as const
|
|
61
|
+
|
|
62
|
+
/** The OpenAPI document's description of the API. */
|
|
63
|
+
const info = {
|
|
64
|
+
description:
|
|
65
|
+
'Tempo ID signs users in to Tempo apps, authorizes apps for them, and signs key authorizations on their Tempo Accounts. Every refusal is an OAuth error response (RFC 6749 §5.2) whose `reason` determines its `error` and status.',
|
|
66
|
+
title: 'Tempo ID',
|
|
67
|
+
version: '0.0.0',
|
|
68
|
+
} as const
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Returns the OpenAPI document for `app`, generated on the first call. The document is reused for
|
|
72
|
+
* the life of the isolate, since routes do not change while it runs. Every refusal joins its
|
|
73
|
+
* components, including those no route declares, such as `unknown_endpoint`.
|
|
74
|
+
*/
|
|
75
|
+
export function document(
|
|
76
|
+
app: Hono<any, any, any>,
|
|
77
|
+
): ReturnType<typeof generateSpecs> {
|
|
78
|
+
const cached = documents.get(app)
|
|
79
|
+
if (cached) return cached
|
|
80
|
+
|
|
81
|
+
const generated = generate(app)
|
|
82
|
+
documents.set(app, generated)
|
|
83
|
+
// A failed generation is not cached, so the next request tries again.
|
|
84
|
+
generated.catch(() => documents.delete(app))
|
|
85
|
+
return generated
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The API reference page, which renders `/openapi.json` with Scalar. Scalar mounts from the
|
|
90
|
+
* `api-reference` element, so the page has no inline script.
|
|
91
|
+
*/
|
|
92
|
+
export const reference = `<!doctype html>
|
|
93
|
+
<html lang="en">
|
|
94
|
+
<head>
|
|
95
|
+
<meta charset="utf-8" />
|
|
96
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
97
|
+
<title>Tempo ID API</title>
|
|
98
|
+
</head>
|
|
99
|
+
<body>
|
|
100
|
+
<script id="api-reference" type="application/json" data-url="/openapi.json"></script>
|
|
101
|
+
<script src="${scalar.src}" integrity="${scalar.integrity}" crossorigin="anonymous"></script>
|
|
102
|
+
</body>
|
|
103
|
+
</html>
|
|
104
|
+
`
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* The reference page's Content Security Policy. The page shares the session cookie's origin, so it
|
|
108
|
+
* runs only the pinned Scalar bundle, whose integrity the browser checks, and calls only this origin.
|
|
109
|
+
*/
|
|
110
|
+
export const referencePolicy = [
|
|
111
|
+
"default-src 'self'",
|
|
112
|
+
`script-src ${scalar.src}`,
|
|
113
|
+
// Scalar injects its styles at runtime, and loads its fonts from its own host.
|
|
114
|
+
"style-src 'self' 'unsafe-inline' https://fonts.scalar.com",
|
|
115
|
+
'font-src https://fonts.scalar.com',
|
|
116
|
+
"img-src 'self' data:",
|
|
117
|
+
"connect-src 'self'",
|
|
118
|
+
"object-src 'none'",
|
|
119
|
+
"base-uri 'none'",
|
|
120
|
+
"form-action 'none'",
|
|
121
|
+
"frame-ancestors 'none'",
|
|
122
|
+
].join('; ')
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* The OpenAPI responses for the refusals in `classes`, grouped by the status of each, plus
|
|
126
|
+
* `unexpected`, which any route can return.
|
|
127
|
+
*/
|
|
128
|
+
export function errors(classes: readonly ErrorResponse.Class[]) {
|
|
129
|
+
const byStatus = new Map<number, ErrorResponse.Reason[]>()
|
|
130
|
+
for (const reason of new Set(
|
|
131
|
+
[...classes, ErrorResponse.UnexpectedError].map((error) => error.reason),
|
|
132
|
+
).values()) {
|
|
133
|
+
const status = ErrorResponse.reasons[reason].status
|
|
134
|
+
byStatus.set(status, [...(byStatus.get(status) ?? []), reason])
|
|
135
|
+
}
|
|
136
|
+
return Object.fromEntries(
|
|
137
|
+
[...byStatus].map(([status, group]) => [
|
|
138
|
+
status,
|
|
139
|
+
{
|
|
140
|
+
content: {
|
|
141
|
+
'application/json': {
|
|
142
|
+
schema: {
|
|
143
|
+
anyOf: group.map((reason) => ({
|
|
144
|
+
$ref: `#/components/schemas/ErrorResponse.${reason}`,
|
|
145
|
+
})),
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
description: group.map((reason) => `\`${reason}\``).join(', '),
|
|
150
|
+
},
|
|
151
|
+
]),
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Documents `target` with `schema` without validating or changing the request, for routes that
|
|
157
|
+
* fall through to a page or pass the issuer's requests through. A `form` documents a URL-encoded
|
|
158
|
+
* body.
|
|
159
|
+
*/
|
|
160
|
+
export function input<const target extends keyof ValidationTargets>(
|
|
161
|
+
target: target,
|
|
162
|
+
schema: z.ZodType,
|
|
163
|
+
): MiddlewareHandler {
|
|
164
|
+
// The validator carries the documentation, which the generator reads from this symbol. OAuth
|
|
165
|
+
// form posts are URL-encoded, where the generator would otherwise document multipart.
|
|
166
|
+
const documented = validator(target, schema, undefined, {
|
|
167
|
+
...options,
|
|
168
|
+
...(target === 'form'
|
|
169
|
+
? { media: 'application/x-www-form-urlencoded' }
|
|
170
|
+
: {}),
|
|
171
|
+
}) as {
|
|
172
|
+
[uniqueSymbol]?: HandlerUniqueProperty | undefined
|
|
173
|
+
}
|
|
174
|
+
return Object.assign<MiddlewareHandler, object>((_c, next) => next(), {
|
|
175
|
+
[uniqueSymbol]: documented[uniqueSymbol],
|
|
176
|
+
})
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* The OpenAPI responses of a JSON route: `success` at its status, and the refusals in `errors`,
|
|
181
|
+
* grouped by the status of each, plus `unexpected`.
|
|
182
|
+
*/
|
|
183
|
+
export function responses<const schema extends z.ZodType>(
|
|
184
|
+
options_: responses.Options<schema>,
|
|
185
|
+
): ResponsesWithResolver {
|
|
186
|
+
const { errors: classes = [], success } = options_
|
|
187
|
+
return {
|
|
188
|
+
[success.status ?? 200]: {
|
|
189
|
+
content: {
|
|
190
|
+
'application/json': { schema: resolver(success.schema, options) },
|
|
191
|
+
},
|
|
192
|
+
description: success.description,
|
|
193
|
+
},
|
|
194
|
+
...errors(classes),
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export declare namespace responses {
|
|
199
|
+
type Options<schema extends z.ZodType> = {
|
|
200
|
+
/** The class of every refusal the route returns, thrown ones included. */
|
|
201
|
+
errors?: readonly ErrorResponse.Class[] | undefined
|
|
202
|
+
/** The success response. */
|
|
203
|
+
success: {
|
|
204
|
+
/** What the response means. */
|
|
205
|
+
description: string
|
|
206
|
+
/** The response body's schema. */
|
|
207
|
+
schema: schema
|
|
208
|
+
/** The success status. Defaults to 200. */
|
|
209
|
+
status?: 200 | 201 | undefined
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Validates `target` against `schema`, documents it, and responds to a failure with an
|
|
216
|
+
* `invalid_field` error response. Hono refuses an unreadable JSON body as `malformed_body` before
|
|
217
|
+
* the schema runs.
|
|
218
|
+
*/
|
|
219
|
+
export function validate<
|
|
220
|
+
const target extends keyof ValidationTargets,
|
|
221
|
+
const schema extends z.ZodType,
|
|
222
|
+
>(target: target, schema: schema) {
|
|
223
|
+
return validator(
|
|
224
|
+
target,
|
|
225
|
+
schema,
|
|
226
|
+
(result, c) => {
|
|
227
|
+
if (!result.success)
|
|
228
|
+
return ErrorResponse.json(
|
|
229
|
+
c,
|
|
230
|
+
new Validation.InvalidFieldError({ issues: result.error }),
|
|
231
|
+
)
|
|
232
|
+
},
|
|
233
|
+
options,
|
|
234
|
+
)
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export namespace validate {
|
|
238
|
+
/** The refusals validation returns. Hono refuses an unreadable JSON body before the schema runs. */
|
|
239
|
+
export const errors = [
|
|
240
|
+
ErrorResponse.MalformedBodyError,
|
|
241
|
+
Validation.InvalidFieldError,
|
|
242
|
+
] as const
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/** Each app's document, generated once per isolate. */
|
|
246
|
+
const documents = new WeakMap<
|
|
247
|
+
Hono<any, any, any>,
|
|
248
|
+
ReturnType<typeof generate>
|
|
249
|
+
>()
|
|
250
|
+
|
|
251
|
+
/** Generates the OpenAPI document for `app`. */
|
|
252
|
+
async function generate(app: Hono<any, any, any>) {
|
|
253
|
+
// Each refusal's schema has an `id`, so converting it yields a reference plus the component.
|
|
254
|
+
const converted = await Promise.all(
|
|
255
|
+
(Object.keys(ErrorResponse.reasons) as ErrorResponse.Reason[]).map(
|
|
256
|
+
async (reason) =>
|
|
257
|
+
(
|
|
258
|
+
await resolver(
|
|
259
|
+
ErrorResponse.schema.of(reason),
|
|
260
|
+
options,
|
|
261
|
+
).toOpenAPISchema()
|
|
262
|
+
).components?.schemas,
|
|
263
|
+
),
|
|
264
|
+
)
|
|
265
|
+
const schemas = Object.assign({}, ...converted)
|
|
266
|
+
return generateSpecs(app, {
|
|
267
|
+
defaultValidationErrorResponse: false,
|
|
268
|
+
// The document's own route ends in `.json`, which the generator would skip as a static file.
|
|
269
|
+
excludeStaticFile: false,
|
|
270
|
+
documentation: {
|
|
271
|
+
components: {
|
|
272
|
+
schemas,
|
|
273
|
+
securitySchemes: {
|
|
274
|
+
accessToken: {
|
|
275
|
+
bearerFormat: 'JWT',
|
|
276
|
+
description:
|
|
277
|
+
'An access token from `/oauth2/token`, as `Authorization: Bearer <token>`.',
|
|
278
|
+
scheme: 'bearer',
|
|
279
|
+
type: 'http',
|
|
280
|
+
},
|
|
281
|
+
clientBasic: {
|
|
282
|
+
description:
|
|
283
|
+
"An OAuth app's client ID and secret, as HTTP Basic `Authorization` (RFC 6749 §2.3.1).",
|
|
284
|
+
scheme: 'basic',
|
|
285
|
+
type: 'http',
|
|
286
|
+
},
|
|
287
|
+
sessionCookie: {
|
|
288
|
+
description:
|
|
289
|
+
"The Tempo ID session, which sign-in sets as an HTTP-only cookie on Tempo ID's origin.",
|
|
290
|
+
in: 'cookie',
|
|
291
|
+
name: Auth.sessionCookie,
|
|
292
|
+
type: 'apiKey',
|
|
293
|
+
},
|
|
294
|
+
},
|
|
295
|
+
},
|
|
296
|
+
info,
|
|
297
|
+
openapi: '3.1.0',
|
|
298
|
+
},
|
|
299
|
+
})
|
|
300
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The keys that own Tempo Accounts, and the contract that each kind of owner key implements, such as
|
|
3
|
+
* Privy wallets and wallet.tempo passkeys. `TempoAccount` lists the user's owners through every kind,
|
|
4
|
+
* and creates a first account through the first kind that creates owner keys in a realm. A new kind
|
|
5
|
+
* implements {@link Kind}, and joins `TempoAccount.kinds`.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { Hex } from 'ox'
|
|
9
|
+
import type { LocalAccount } from 'viem'
|
|
10
|
+
import type { Account, AccountConfig } from 'viem/tempo'
|
|
11
|
+
import { sql } from 'drizzle-orm'
|
|
12
|
+
import type * as Auth from './Auth.js'
|
|
13
|
+
import type * as ErrorResponse from './ErrorResponse.js'
|
|
14
|
+
import type * as Realm from './Realm.js'
|
|
15
|
+
import type * as Timing from './Timing.js'
|
|
16
|
+
|
|
17
|
+
/** The deployment variables that owner kinds read. */
|
|
18
|
+
export type Env = {
|
|
19
|
+
/** The RS256 private key, as PKCS #8 PEM, whose public half each Privy app trusts. Absent, no Privy wallet signs. */
|
|
20
|
+
PRIVY_JWT_PRIVATE_KEY?: string | undefined
|
|
21
|
+
/** The `SECRET` variable, which encrypts the owner configurations of each realm. */
|
|
22
|
+
SECRET: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* One kind of owner key. `load` reads the kind's configuration for the realms that a request
|
|
27
|
+
* reaches, once, and returns the operations that list and create the user's owner keys.
|
|
28
|
+
*/
|
|
29
|
+
export type Kind<
|
|
30
|
+
type extends string = string,
|
|
31
|
+
errors extends readonly ErrorResponse.Class[] =
|
|
32
|
+
readonly ErrorResponse.Class[],
|
|
33
|
+
> = {
|
|
34
|
+
/** The refusals that the kind's operations throw, such as an upstream service's failures. */
|
|
35
|
+
errors: errors
|
|
36
|
+
/** Reads the kind's configuration for `realms`, and returns the operations on the user's owner keys. */
|
|
37
|
+
load: (
|
|
38
|
+
c: Timing.measure.Context,
|
|
39
|
+
options: Kind.load.Options,
|
|
40
|
+
) => Promise<Kind.Loaded<type>>
|
|
41
|
+
/** The owner type in the API, such as `privy` or `webAuthn`. */
|
|
42
|
+
type: type
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export declare namespace Kind {
|
|
46
|
+
/** The operations on the user's owner keys of one kind, within the realms that `load` received. */
|
|
47
|
+
type Loaded<type extends string = string> = {
|
|
48
|
+
/**
|
|
49
|
+
* Returns a function that creates the user's first owner key in `realm`, or `undefined` when
|
|
50
|
+
* the kind creates none there, such as for a realm without the kind's configuration. Absent on
|
|
51
|
+
* a kind that only links owner keys created elsewhere. Such a kind lists from the database
|
|
52
|
+
* alone, since `TempoAccount.create` lists it again under the user's lock.
|
|
53
|
+
*/
|
|
54
|
+
create?:
|
|
55
|
+
| ((
|
|
56
|
+
realm: Realm.Realm,
|
|
57
|
+
) => ((c: Timing.measure.Context) => Promise<Owner<type>>) | undefined)
|
|
58
|
+
| undefined
|
|
59
|
+
/** Returns the user's owner keys of this kind, oldest first, and creates none. */
|
|
60
|
+
list: (
|
|
61
|
+
c: Timing.measure.Context,
|
|
62
|
+
options: Loaded.list.Options,
|
|
63
|
+
) => Promise<readonly Owner<type>[]>
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
namespace Loaded {
|
|
67
|
+
namespace list {
|
|
68
|
+
type Options = {
|
|
69
|
+
/** The database or transaction to read. */
|
|
70
|
+
db: Realm.Database
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
namespace load {
|
|
76
|
+
type Options = {
|
|
77
|
+
/** The database. */
|
|
78
|
+
db: Realm.Database
|
|
79
|
+
/** The deployment variables. */
|
|
80
|
+
env: Env
|
|
81
|
+
/** The realms that the request reaches, in order. */
|
|
82
|
+
realms: readonly Realm.Realm[]
|
|
83
|
+
/** The user's ID. */
|
|
84
|
+
userId: string
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** A passkey that owns a Tempo Account, which signs only in a browser at its relying party. */
|
|
90
|
+
export type Credential = {
|
|
91
|
+
/** The credential ID, base64url. */
|
|
92
|
+
id: string
|
|
93
|
+
/** The uncompressed P256 public key, hex. */
|
|
94
|
+
publicKey: Hex.Hex
|
|
95
|
+
/** The relying party ID of the passkey. */
|
|
96
|
+
rpId: string
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** A key that owns one of the user's Tempo Accounts, with the account's realm. */
|
|
100
|
+
export type Owner<type extends string = string> = {
|
|
101
|
+
/** The Tempo Account that the key owns. It cannot sign. */
|
|
102
|
+
account: Account.ConfigurableAccount<AccountConfig.Config>
|
|
103
|
+
/** When the key was created, or linked when its creation time is unknown. */
|
|
104
|
+
createdAt: Date
|
|
105
|
+
/**
|
|
106
|
+
* The passkey that signs for the key in the browser. Absent for a key that signs on the server,
|
|
107
|
+
* such as a Privy wallet.
|
|
108
|
+
*/
|
|
109
|
+
credential?: Credential | undefined
|
|
110
|
+
/** The account's realm. */
|
|
111
|
+
realm: Realm.Realm
|
|
112
|
+
/**
|
|
113
|
+
* Returns the key as a Viem account that signs on the server. `undefined` for a key that signs
|
|
114
|
+
* only in the browser, such as a passkey.
|
|
115
|
+
*/
|
|
116
|
+
signer:
|
|
117
|
+
| ((
|
|
118
|
+
c: Timing.measure.Context,
|
|
119
|
+
options: signer.Options,
|
|
120
|
+
) => Promise<LocalAccount>)
|
|
121
|
+
| undefined
|
|
122
|
+
/** The kind of the key, such as `privy` or `webAuthn`. */
|
|
123
|
+
type: type
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export declare namespace signer {
|
|
127
|
+
type Options = {
|
|
128
|
+
/** The request's Better Auth instance, which signs tokens that an upstream signer verifies. */
|
|
129
|
+
auth: Auth.Instance
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Instantiates an {@link Owner}.
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```ts
|
|
138
|
+
* const owner = Owner.from({
|
|
139
|
+
* account,
|
|
140
|
+
* createdAt: key.createdAt,
|
|
141
|
+
* credential: { id: key.id, publicKey: key.publicKey, rpId: key.rpId },
|
|
142
|
+
* realm,
|
|
143
|
+
* signer: undefined,
|
|
144
|
+
* type: 'webAuthn',
|
|
145
|
+
* })
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
export function from<const type extends string>(
|
|
149
|
+
value: Owner<type>,
|
|
150
|
+
): Owner<type> {
|
|
151
|
+
return value
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Instantiates a {@link Kind}.
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```ts
|
|
159
|
+
* export const owner = Owner.kind({ errors: [], load, type: 'webAuthn' })
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
export function kind<
|
|
163
|
+
const type extends string,
|
|
164
|
+
const errors extends readonly ErrorResponse.Class[],
|
|
165
|
+
>(value: Kind<type, errors>): Kind<type, errors> {
|
|
166
|
+
return value
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Merges lists of owners, each already oldest first, by creation time in seconds, the precision
|
|
171
|
+
* Privy records. A merge keeps the order of each list, so the first Privy wallet of a realm stays
|
|
172
|
+
* before its later wallets. An earlier list wins a tie.
|
|
173
|
+
*/
|
|
174
|
+
export function merge<const type extends string>(
|
|
175
|
+
lists: readonly (readonly Owner<type>[])[],
|
|
176
|
+
): readonly Owner<type>[] {
|
|
177
|
+
const seconds = (date: Date) => Math.floor(date.getTime() / 1000)
|
|
178
|
+
const heads = lists.map(() => 0)
|
|
179
|
+
const merged: Owner<type>[] = []
|
|
180
|
+
while (true) {
|
|
181
|
+
const next = lists.reduce<number | undefined>((best, list, index) => {
|
|
182
|
+
const entry = list[heads[index]!]
|
|
183
|
+
if (!entry) return best
|
|
184
|
+
if (best === undefined) return index
|
|
185
|
+
const current = lists[best]![heads[best]!]!
|
|
186
|
+
return seconds(entry.createdAt) < seconds(current.createdAt)
|
|
187
|
+
? index
|
|
188
|
+
: best
|
|
189
|
+
}, undefined)
|
|
190
|
+
if (next === undefined) return merged
|
|
191
|
+
merged.push(lists[next]![heads[next]!]!)
|
|
192
|
+
heads[next] = heads[next]! + 1
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Takes the user's account lock until the transaction `tx` ends. `TempoAccount.create` and every
|
|
198
|
+
* kind that links owner keys take it, so a first account and a link for one user never interleave.
|
|
199
|
+
*/
|
|
200
|
+
export async function lock(tx: Realm.Database, options: lock.Options) {
|
|
201
|
+
await tx.execute(
|
|
202
|
+
sql`select pg_advisory_xact_lock(hashtextextended(${`tempo-account:${options.userId}`}, 0))`,
|
|
203
|
+
)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export declare namespace lock {
|
|
207
|
+
type Options = {
|
|
208
|
+
/** The user's ID. */
|
|
209
|
+
userId: string
|
|
210
|
+
}
|
|
211
|
+
}
|