@estifanos-sh/convex-auth 0.0.1-preview.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/README.md +52 -0
  2. package/dist/_generated/component.d.ts +2981 -0
  3. package/dist/bin.js +7194 -0
  4. package/dist/browser/index.d.ts +22 -0
  5. package/dist/browser/index.js +61 -0
  6. package/dist/browser/locks.js +20 -0
  7. package/dist/browser/navigation.js +14 -0
  8. package/dist/browser/runtime.js +90 -0
  9. package/dist/browser/webauthn.js +99 -0
  10. package/dist/client/core/types.d.ts +615 -0
  11. package/dist/client/core/types.js +23 -0
  12. package/dist/client/errors.js +30 -0
  13. package/dist/client/factors/device.js +100 -0
  14. package/dist/client/factors/totp.js +111 -0
  15. package/dist/client/factors/webauthn.js +69 -0
  16. package/dist/client/index.d.ts +60 -0
  17. package/dist/client/index.js +976 -0
  18. package/dist/client/runtime/invite.js +50 -0
  19. package/dist/client/runtime/mutex.js +25 -0
  20. package/dist/client/runtime/proxy.js +75 -0
  21. package/dist/client/runtime/storage.js +65 -0
  22. package/dist/component/_generated/api.js +26 -0
  23. package/dist/component/_generated/component.d.ts +2981 -0
  24. package/dist/component/_generated/component.js +1 -0
  25. package/dist/component/_generated/dataModel.js +1 -0
  26. package/dist/component/_generated/server.js +74 -0
  27. package/dist/component/account.js +197 -0
  28. package/dist/component/connection/audit.js +152 -0
  29. package/dist/component/connection/cache.js +205 -0
  30. package/dist/component/connection/domain/verification.js +63 -0
  31. package/dist/component/connection/domain.js +108 -0
  32. package/dist/component/connection/saml/assertion.js +41 -0
  33. package/dist/component/connection/saml/request.js +61 -0
  34. package/dist/component/connection/scim/config.js +55 -0
  35. package/dist/component/connection/scim/identity.js +162 -0
  36. package/dist/component/connection/secret.js +65 -0
  37. package/dist/component/connection/webhook/delivery.js +396 -0
  38. package/dist/component/connection/webhook/endpoint.js +77 -0
  39. package/dist/component/connection.js +204 -0
  40. package/dist/component/convex.config.d.ts +7 -0
  41. package/dist/component/convex.config.js +15 -0
  42. package/dist/component/crons.js +27 -0
  43. package/dist/component/event.js +341 -0
  44. package/dist/component/factor/device.js +141 -0
  45. package/dist/component/factor/passkey.js +385 -0
  46. package/dist/component/factor/totp.js +253 -0
  47. package/dist/component/functions.js +3 -0
  48. package/dist/component/group/active.js +63 -0
  49. package/dist/component/group/invite.js +300 -0
  50. package/dist/component/group/member.js +188 -0
  51. package/dist/component/group.js +431 -0
  52. package/dist/component/http.js +9 -0
  53. package/dist/component/index.d.ts +5 -0
  54. package/dist/component/index.js +3 -0
  55. package/dist/component/limits.js +103 -0
  56. package/dist/component/maintenance.js +205 -0
  57. package/dist/component/migrations.js +277 -0
  58. package/dist/component/model.d.ts +384 -0
  59. package/dist/component/model.js +709 -0
  60. package/dist/component/modules.js +53 -0
  61. package/dist/component/oauth/client.js +196 -0
  62. package/dist/component/oauth/code.js +97 -0
  63. package/dist/component/oauth/refresh.js +230 -0
  64. package/dist/component/schema.d.ts +1530 -0
  65. package/dist/component/schema.js +401 -0
  66. package/dist/component/session.js +134 -0
  67. package/dist/component/token/pkce.js +121 -0
  68. package/dist/component/token/refresh.js +189 -0
  69. package/dist/component/token/verification.js +155 -0
  70. package/dist/component/user/email.js +147 -0
  71. package/dist/component/user/key.js +273 -0
  72. package/dist/component/user.js +173 -0
  73. package/dist/core/index.d.ts +531 -0
  74. package/dist/core/index.js +81 -0
  75. package/dist/expo/index.d.ts +43 -0
  76. package/dist/expo/index.js +131 -0
  77. package/dist/expo/webauthn.js +88 -0
  78. package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/NoopLogger.d.ts +2 -0
  79. package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/api/logs.d.ts +3 -0
  80. package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/index.d.ts +7 -0
  81. package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/AnyValue.d.ts +21 -0
  82. package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/LogRecord.d.ts +36 -0
  83. package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/Logger.d.ts +1 -0
  84. package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/LoggerOptions.d.ts +1 -0
  85. package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/LoggerProvider.d.ts +2 -0
  86. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/baggage/propagation/W3CBaggagePropagator.d.ts +1 -0
  87. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/baggage/utils.d.ts +1 -0
  88. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/attributes.d.ts +1 -0
  89. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/global-error-handler.d.ts +2 -0
  90. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/logging-error-handler.d.ts +1 -0
  91. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/time.d.ts +1 -0
  92. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/types.d.ts +16 -0
  93. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/index.d.ts +13 -0
  94. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/propagation/composite.d.ts +1 -0
  95. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/TraceState.d.ts +1 -0
  96. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/W3CTraceContextPropagator.d.ts +1 -0
  97. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/rpc-metadata.d.ts +1 -0
  98. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/suppress-tracing.d.ts +1 -0
  99. package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/utils/configuration.d.ts +1 -0
  100. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/LogRecordProcessor.d.ts +24 -0
  101. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/LoggerProvider.d.ts +2 -0
  102. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/config/LoggerConfigurators.d.ts +1 -0
  103. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/BatchLogRecordProcessorBase.d.ts +4 -0
  104. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/ConsoleLogRecordExporter.d.ts +3 -0
  105. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/InMemoryLogRecordExporter.d.ts +3 -0
  106. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/LogRecordExporter.d.ts +2 -0
  107. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/ReadableLogRecord.d.ts +4 -0
  108. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/SdkLogRecord.d.ts +71 -0
  109. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/SimpleLogRecordProcessor.d.ts +3 -0
  110. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/index.d.ts +11 -0
  111. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/platform/index.d.ts +1 -0
  112. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/export/BatchLogRecordProcessor.d.ts +2 -0
  113. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/index.d.ts +1 -0
  114. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/types.d.ts +4 -0
  115. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/InstrumentDescriptor.d.ts +3 -0
  116. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/MeterProvider.d.ts +4 -0
  117. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/Drop.d.ts +4 -0
  118. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/ExponentialHistogram.d.ts +5 -0
  119. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/Histogram.d.ts +5 -0
  120. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/LastValue.d.ts +5 -0
  121. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/Sum.d.ts +5 -0
  122. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/index.d.ts +6 -0
  123. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/types.d.ts +53 -0
  124. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/AggregationSelector.d.ts +16 -0
  125. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/AggregationTemporality.d.ts +11 -0
  126. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/CardinalitySelector.d.ts +10 -0
  127. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/ConsoleMetricExporter.d.ts +4 -0
  128. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/InMemoryMetricExporter.d.ts +3 -0
  129. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricData.d.ts +148 -0
  130. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricExporter.d.ts +3 -0
  131. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricProducer.d.ts +27 -0
  132. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricReader.d.ts +138 -0
  133. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/PeriodicExportingMetricReader.d.ts +3 -0
  134. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/index.d.ts +15 -0
  135. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/types.d.ts +10 -0
  136. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/utils.d.ts +2 -0
  137. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/Aggregation.d.ts +4 -0
  138. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/AggregationOption.d.ts +41 -0
  139. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/AttributesProcessor.d.ts +1 -0
  140. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/InstrumentSelector.d.ts +1 -0
  141. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/View.d.ts +5 -0
  142. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/BasicTracerProvider.d.ts +2 -0
  143. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/IdGenerator.d.ts +11 -0
  144. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/Sampler.d.ts +74 -0
  145. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/Span.d.ts +17 -0
  146. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/SpanProcessor.d.ts +43 -0
  147. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/TimedEvent.d.ts +19 -0
  148. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/BatchSpanProcessorBase.d.ts +6 -0
  149. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/ConsoleSpanExporter.d.ts +3 -0
  150. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/InMemorySpanExporter.d.ts +3 -0
  151. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/NoopSpanProcessor.d.ts +4 -0
  152. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/ReadableSpan.d.ts +29 -0
  153. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/SimpleSpanProcessor.d.ts +5 -0
  154. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/SpanExporter.d.ts +2 -0
  155. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/index.d.ts +18 -0
  156. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/index.d.ts +1 -0
  157. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/export/BatchSpanProcessor.d.ts +2 -0
  158. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/index.d.ts +1 -0
  159. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/AlwaysOffSampler.d.ts +1 -0
  160. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/AlwaysOnSampler.d.ts +1 -0
  161. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/ParentBasedSampler.d.ts +2 -0
  162. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/TraceIdRatioBasedSampler.d.ts +1 -0
  163. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/types.d.ts +66 -0
  164. package/dist/otel.d.ts +73 -0
  165. package/dist/otel.js +82 -0
  166. package/dist/permissions/index.d.ts +81 -0
  167. package/dist/permissions/index.js +18 -0
  168. package/dist/providers/anonymous.d.ts +35 -0
  169. package/dist/providers/anonymous.js +40 -0
  170. package/dist/providers/apple.d.ts +61 -0
  171. package/dist/providers/apple.js +57 -0
  172. package/dist/providers/connection.d.ts +30 -0
  173. package/dist/providers/connection.js +33 -0
  174. package/dist/providers/credentials.d.ts +78 -0
  175. package/dist/providers/credentials.js +31 -0
  176. package/dist/providers/custom.d.ts +96 -0
  177. package/dist/providers/custom.js +108 -0
  178. package/dist/providers/device.d.ts +33 -0
  179. package/dist/providers/device.js +30 -0
  180. package/dist/providers/email.d.ts +45 -0
  181. package/dist/providers/email.js +52 -0
  182. package/dist/providers/github.d.ts +56 -0
  183. package/dist/providers/github.js +79 -0
  184. package/dist/providers/google.d.ts +56 -0
  185. package/dist/providers/google.js +59 -0
  186. package/dist/providers/index.d.ts +16 -0
  187. package/dist/providers/index.js +16 -0
  188. package/dist/providers/microsoft.d.ts +59 -0
  189. package/dist/providers/microsoft.js +98 -0
  190. package/dist/providers/password.d.ts +68 -0
  191. package/dist/providers/password.js +348 -0
  192. package/dist/providers/phone.d.ts +33 -0
  193. package/dist/providers/phone.js +35 -0
  194. package/dist/providers/redirect.d.ts +1 -0
  195. package/dist/providers/redirect.js +11 -0
  196. package/dist/providers/totp.d.ts +29 -0
  197. package/dist/providers/totp.js +29 -0
  198. package/dist/providers/webauthn/attestation.d.ts +42 -0
  199. package/dist/providers/webauthn/attestation.js +167 -0
  200. package/dist/providers/webauthn.d.ts +83 -0
  201. package/dist/providers/webauthn.js +57 -0
  202. package/dist/react/index.d.ts +55 -0
  203. package/dist/react/index.js +80 -0
  204. package/dist/server/auth.d.ts +443 -0
  205. package/dist/server/auth.js +178 -0
  206. package/dist/server/cache/context.js +94 -0
  207. package/dist/server/component/api.d.ts +14 -0
  208. package/dist/server/component/api.js +13 -0
  209. package/dist/server/component/context.d.ts +16 -0
  210. package/dist/server/component/context.js +1 -0
  211. package/dist/server/component/factor/db.js +71 -0
  212. package/dist/server/config.d.ts +3 -0
  213. package/dist/server/config.js +78 -0
  214. package/dist/server/connection/config.js +101 -0
  215. package/dist/server/connection/domain.d.ts +878 -0
  216. package/dist/server/connection/domain.js +1122 -0
  217. package/dist/server/connection/group/service.d.ts +25 -0
  218. package/dist/server/connection/group/service.js +250 -0
  219. package/dist/server/connection/http.js +1485 -0
  220. package/dist/server/connection/oidc.js +366 -0
  221. package/dist/server/connection/policy/domain.js +59 -0
  222. package/dist/server/connection/policy.d.ts +1 -0
  223. package/dist/server/connection/policy.js +163 -0
  224. package/dist/server/connection/profile.js +22 -0
  225. package/dist/server/connection/provision.js +182 -0
  226. package/dist/server/connection/saml/api.js +70 -0
  227. package/dist/server/connection/saml/binding/post.js +140 -0
  228. package/dist/server/connection/saml/binding/redirect.js +139 -0
  229. package/dist/server/connection/saml/binding/shared.js +18 -0
  230. package/dist/server/connection/saml/c14n.js +224 -0
  231. package/dist/server/connection/saml/constants.js +100 -0
  232. package/dist/server/connection/saml/crypto.js +170 -0
  233. package/dist/server/connection/saml/dom/select.js +299 -0
  234. package/dist/server/connection/saml/encoding.js +93 -0
  235. package/dist/server/connection/saml/encryption.js +34 -0
  236. package/dist/server/connection/saml/entity.js +24 -0
  237. package/dist/server/connection/saml/extractor.js +408 -0
  238. package/dist/server/connection/saml/flow.js +150 -0
  239. package/dist/server/connection/saml/identity/provider.js +66 -0
  240. package/dist/server/connection/saml/index.js +5 -0
  241. package/dist/server/connection/saml/metadata.js +294 -0
  242. package/dist/server/connection/saml/service/provider.js +117 -0
  243. package/dist/server/connection/saml/signature.js +214 -0
  244. package/dist/server/connection/saml/template.js +68 -0
  245. package/dist/server/connection/saml/types.js +1 -0
  246. package/dist/server/connection/saml/validator.js +32 -0
  247. package/dist/server/connection/saml/xml/builder.js +68 -0
  248. package/dist/server/connection/saml/xmldsig.js +598 -0
  249. package/dist/server/connection/saml/xmlenc.js +162 -0
  250. package/dist/server/connection/saml.d.ts +56 -0
  251. package/dist/server/connection/saml.js +762 -0
  252. package/dist/server/connection/scim.js +115 -0
  253. package/dist/server/connection/shared.js +74 -0
  254. package/dist/server/connection/webhook.js +163 -0
  255. package/dist/server/context.d.ts +137 -0
  256. package/dist/server/context.js +108 -0
  257. package/dist/server/contract.d.ts +48 -0
  258. package/dist/server/contract.js +107 -0
  259. package/dist/server/cookies.js +90 -0
  260. package/dist/server/core.js +163 -0
  261. package/dist/server/cors.d.ts +22 -0
  262. package/dist/server/cors.js +93 -0
  263. package/dist/server/crypto.js +43 -0
  264. package/dist/server/db.js +88 -0
  265. package/dist/server/device.js +140 -0
  266. package/dist/server/domains/access.js +29 -0
  267. package/dist/server/domains/account.d.ts +16 -0
  268. package/dist/server/domains/account.js +92 -0
  269. package/dist/server/domains/factor.d.ts +28 -0
  270. package/dist/server/domains/factor.js +115 -0
  271. package/dist/server/domains/group.js +87 -0
  272. package/dist/server/domains/invite.js +76 -0
  273. package/dist/server/domains/key.js +253 -0
  274. package/dist/server/domains/member.js +149 -0
  275. package/dist/server/domains/session.js +29 -0
  276. package/dist/server/domains/user.js +119 -0
  277. package/dist/server/env.d.ts +46 -0
  278. package/dist/server/env.js +96 -0
  279. package/dist/server/errors.js +38 -0
  280. package/dist/server/events.d.ts +880 -0
  281. package/dist/server/events.js +406 -0
  282. package/dist/server/facade.d.ts +83 -0
  283. package/dist/server/facade.js +124 -0
  284. package/dist/server/http.d.ts +125 -0
  285. package/dist/server/http.js +566 -0
  286. package/dist/server/identity/claims.js +58 -0
  287. package/dist/server/identity/convex.d.ts +15 -0
  288. package/dist/server/identity/convex.js +1 -0
  289. package/dist/server/index.d.ts +17 -0
  290. package/dist/server/index.js +11 -0
  291. package/dist/server/keys.js +60 -0
  292. package/dist/server/limits.js +41 -0
  293. package/dist/server/log.js +28 -0
  294. package/dist/server/mcp.d.ts +19 -0
  295. package/dist/server/mcp.js +250 -0
  296. package/dist/server/mutations/account.js +47 -0
  297. package/dist/server/mutations/calls.js +16 -0
  298. package/dist/server/mutations/code.js +91 -0
  299. package/dist/server/mutations/credentials/signin.js +210 -0
  300. package/dist/server/mutations/invalidate.js +60 -0
  301. package/dist/server/mutations/oauth.js +251 -0
  302. package/dist/server/mutations/refresh.js +152 -0
  303. package/dist/server/mutations/register.js +93 -0
  304. package/dist/server/mutations/retrieve.js +66 -0
  305. package/dist/server/mutations/signature.js +36 -0
  306. package/dist/server/mutations/signin.js +81 -0
  307. package/dist/server/mutations/signout.js +61 -0
  308. package/dist/server/mutations/store/refs.js +15 -0
  309. package/dist/server/mutations/store.js +82 -0
  310. package/dist/server/mutations/verifier.js +25 -0
  311. package/dist/server/mutations/verify.js +199 -0
  312. package/dist/server/oauth/authorize.js +98 -0
  313. package/dist/server/oauth/client.d.ts +93 -0
  314. package/dist/server/oauth/client.js +115 -0
  315. package/dist/server/oauth/code.d.ts +63 -0
  316. package/dist/server/oauth/code.js +124 -0
  317. package/dist/server/oauth/domain.d.ts +23 -0
  318. package/dist/server/oauth/domain.js +1 -0
  319. package/dist/server/oauth/factory.js +46 -0
  320. package/dist/server/oauth/grant.js +46 -0
  321. package/dist/server/oauth/handlers.js +108 -0
  322. package/dist/server/oauth/manage.js +121 -0
  323. package/dist/server/oauth/normalize.js +27 -0
  324. package/dist/server/oauth/refresh.d.ts +71 -0
  325. package/dist/server/oauth/refresh.js +132 -0
  326. package/dist/server/oauth/register.js +147 -0
  327. package/dist/server/oauth/runtime.js +280 -0
  328. package/dist/server/oauth/token.js +355 -0
  329. package/dist/server/payloads.d.ts +16 -0
  330. package/dist/server/payloads.js +30 -0
  331. package/dist/server/preload.d.ts +249 -0
  332. package/dist/server/preload.js +673 -0
  333. package/dist/server/random.js +25 -0
  334. package/dist/server/redirects.js +85 -0
  335. package/dist/server/runtime.d.ts +845 -0
  336. package/dist/server/runtime.js +387 -0
  337. package/dist/server/secret.js +46 -0
  338. package/dist/server/services/factors.js +117 -0
  339. package/dist/server/services/providers.js +23 -0
  340. package/dist/server/services/resolve.js +17 -0
  341. package/dist/server/session/lifecycle.d.ts +23 -0
  342. package/dist/server/session/lifecycle.js +139 -0
  343. package/dist/server/signin/flow.js +359 -0
  344. package/dist/server/telemetry.js +68 -0
  345. package/dist/server/templates.js +91 -0
  346. package/dist/server/token/refresh.js +35 -0
  347. package/dist/server/tokens.js +164 -0
  348. package/dist/server/totp.js +282 -0
  349. package/dist/server/types.d.ts +1154 -0
  350. package/dist/server/types.js +1 -0
  351. package/dist/server/url.js +43 -0
  352. package/dist/server/user/account.js +325 -0
  353. package/dist/server/utils/bearer.js +24 -0
  354. package/dist/server/utils/cache.js +51 -0
  355. package/dist/server/utils/retry.js +3 -0
  356. package/dist/server/utils/span.js +59 -0
  357. package/dist/server/validators.d.ts +2061 -0
  358. package/dist/server/validators.js +320 -0
  359. package/dist/server/webauthn.js +699 -0
  360. package/dist/server/wellknown.d.ts +74 -0
  361. package/dist/server/wellknown.js +195 -0
  362. package/dist/shared/brand.d.ts +28 -0
  363. package/dist/shared/brand.js +13 -0
  364. package/dist/shared/codes.d.ts +99 -0
  365. package/dist/shared/codes.js +98 -0
  366. package/dist/shared/compare.js +23 -0
  367. package/dist/shared/errors.js +24 -0
  368. package/dist/shared/event/kinds.d.ts +188 -0
  369. package/dist/shared/event/kinds.js +103 -0
  370. package/dist/shared/fetch/guard.js +189 -0
  371. package/dist/shared/log.js +62 -0
  372. package/dist/shared/results.d.ts +58 -0
  373. package/dist/shared/retry.js +27 -0
  374. package/dist/shared/webauthn.js +9 -0
  375. package/dist/svelte/AuthLoading.svelte +13 -0
  376. package/dist/svelte/AuthLoading.svelte.d.ts +8 -0
  377. package/dist/svelte/SignedIn.svelte +14 -0
  378. package/dist/svelte/SignedIn.svelte.d.ts +8 -0
  379. package/dist/svelte/SignedOut.svelte +13 -0
  380. package/dist/svelte/SignedOut.svelte.d.ts +8 -0
  381. package/dist/svelte/context.svelte.d.ts +26 -0
  382. package/dist/svelte/context.svelte.js +61 -0
  383. package/dist/svelte/index.d.ts +5 -0
  384. package/dist/svelte/index.js +4 -0
  385. package/dist/test.d.ts +48 -0
  386. package/dist/test.js +54 -0
  387. package/package.json +247 -0
@@ -0,0 +1,35 @@
1
+ import { ErrorCode } from "../../shared/codes.js";
2
+ import { envOptionalNumber, readConfigSync } from "../env.js";
3
+ import { maybeRedact } from "../log.js";
4
+ import { ConvexError } from "convex/values";
5
+
6
+ //#region src/server/token/refresh.ts
7
+ const REFRESH_TOKEN_DIVIDER = "|";
8
+ /** @internal Encode the `(refreshTokenId, sessionId)` pair into a refresh token. */
9
+ const encodeRefreshToken = (refreshTokenId, sessionId) => `${refreshTokenId}${REFRESH_TOKEN_DIVIDER}${sessionId}`;
10
+ const DEFAULT_SESSION_INACTIVE_DURATION_MS = 1e3 * 60 * 60 * 24 * 30;
11
+ /** @internal */
12
+ const REFRESH_TOKEN_REUSE_WINDOW_MS = 10 * 1e3;
13
+ const refreshTokenExpirationTime = (config, now = Date.now()) => now + (config.session?.inactiveDurationMs ?? readConfigSync(envOptionalNumber("AUTH_SESSION_INACTIVE_DURATION_MS")) ?? DEFAULT_SESSION_INACTIVE_DURATION_MS);
14
+ /** @internal */
15
+ const parseRefreshToken = (refreshToken) => {
16
+ const parts = refreshToken.split(REFRESH_TOKEN_DIVIDER);
17
+ const message = `Can't parse refresh token: ${maybeRedact(refreshToken)}`;
18
+ if (parts.length !== 2) throw new ConvexError({
19
+ code: ErrorCode.INVALID_REFRESH_TOKEN,
20
+ message
21
+ });
22
+ const [refreshTokenId, sessionId] = parts;
23
+ if (refreshTokenId == null || sessionId == null) throw new ConvexError({
24
+ code: ErrorCode.INVALID_REFRESH_TOKEN,
25
+ message
26
+ });
27
+ return {
28
+ refreshTokenId,
29
+ sessionId
30
+ };
31
+ };
32
+
33
+ //#endregion
34
+ export { REFRESH_TOKEN_REUSE_WINDOW_MS, encodeRefreshToken, parseRefreshToken, refreshTokenExpirationTime };
35
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1,164 @@
1
+ import { envOptionalString, requireEnv } from "./env.js";
2
+ import { authUrlFromEnv } from "./url.js";
3
+ import { generateRandomString } from "./random.js";
4
+ import { withSpan } from "./utils/span.js";
5
+ import { SignJWT, createLocalJWKSet, importPKCS8, jwtVerify } from "jose";
6
+
7
+ //#region src/server/tokens.ts
8
+ const DEFAULT_JWT_DURATION_MS = 1e3 * 60 * 60;
9
+ const TOKEN_JTI_LENGTH = 24;
10
+ const TOKEN_JTI_ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
11
+ let cachedPrivateKeyPromise = null;
12
+ const cachedIssuers = /* @__PURE__ */ new Map();
13
+ const JWT_ALG = "EdDSA";
14
+ function normalizePkcs8Pem(value) {
15
+ const trimmed = value.trim();
16
+ if (!trimmed.includes("-----BEGIN PRIVATE KEY-----")) return trimmed;
17
+ const withEscapedNewlines = trimmed.replace(/\\n/g, "\n");
18
+ if (withEscapedNewlines.includes("\n")) return withEscapedNewlines;
19
+ const beginMarker = "-----BEGIN PRIVATE KEY-----";
20
+ const endMarker = "-----END PRIVATE KEY-----";
21
+ const body = trimmed.replace(beginMarker, "").replace(endMarker, "").trim().replace(/\s+/g, "");
22
+ if (body.length === 0) return trimmed;
23
+ return `${beginMarker}\n${body.match(/.{1,64}/g)?.join("\n") ?? body}\n${endMarker}`;
24
+ }
25
+ const getPrivateKey = () => {
26
+ if (cachedPrivateKeyPromise === null) try {
27
+ cachedPrivateKeyPromise = importPKCS8(normalizePkcs8Pem(requireEnv("JWT_PRIVATE_KEY")), JWT_ALG).catch((error) => {
28
+ cachedPrivateKeyPromise = null;
29
+ throw error;
30
+ });
31
+ } catch (error) {
32
+ cachedPrivateKeyPromise = null;
33
+ throw error;
34
+ }
35
+ return cachedPrivateKeyPromise;
36
+ };
37
+ const getIssuer = (path) => {
38
+ const key = path ?? "";
39
+ let issuer = cachedIssuers.get(key);
40
+ if (issuer === void 0) {
41
+ issuer = authUrlFromEnv(path);
42
+ cachedIssuers.set(key, issuer);
43
+ }
44
+ return issuer;
45
+ };
46
+ if (envOptionalString("JWT_PRIVATE_KEY")) try {
47
+ getPrivateKey().catch((err) => {
48
+ console.error("[auth] JWT private key pre-warm failed", { err });
49
+ });
50
+ } catch (err) {
51
+ console.error("[auth] JWT private key pre-warm threw synchronously", { err });
52
+ }
53
+ if (envOptionalString("CONVEX_SITE_URL")) try {
54
+ getIssuer();
55
+ } catch (err) {
56
+ console.error("[auth] JWT issuer pre-warm threw", { err });
57
+ }
58
+ /** Lifetime of an issued OAuth access token, in seconds. Shared with the token endpoint's `expires_in`. */
59
+ const OAUTH_ACCESS_TOKEN_DURATION_S = 900;
60
+ /**
61
+ * Sign an OAuth access token (EdDSA) for the given user, client, and scopes.
62
+ *
63
+ * The `aud` claim is `"convex"` so the token is a valid Convex identity
64
+ * (`applicationID: "convex"`) — load-bearing: MCP tools run the user's queries
65
+ * via `ctx.runQuery`, which requires Convex's identity layer to accept this
66
+ * token. For that reason the access token must look like an ID-token-shaped JWT:
67
+ * it carries NO `typ: "at+jwt"` header (Convex's validator rejects that RFC 9068
68
+ * type), and is instead marked as an access token by a positive `token_use:
69
+ * "access"` claim, which `verifyOAuthToken` checks (alongside the `client_id`
70
+ * claim) to tell it apart from a session token. We don't issue OIDC ID tokens,
71
+ * so there is no id-vs-access confusion for the `at+jwt` typ to guard against.
72
+ *
73
+ * When an RFC 8707 `resource` is supplied the token carries a `resource` claim
74
+ * binding it to that protected resource; an MCP endpoint rejects tokens whose
75
+ * `resource` does not match its own canonical resource.
76
+ *
77
+ * @internal
78
+ */
79
+ async function generateOAuthToken(args) {
80
+ const privateKey = await withSpan("convex-auth.tokens.import-key", { alg: JWT_ALG }, () => getPrivateKey());
81
+ const exp = new Date(Date.now() + OAUTH_ACCESS_TOKEN_DURATION_S * 1e3);
82
+ return await withSpan("convex-auth.tokens.sign-oauth", { alg: JWT_ALG }, () => new SignJWT({
83
+ sub: args.userId,
84
+ aud: "convex",
85
+ token_use: "access",
86
+ scope: args.scopes.join(" "),
87
+ client_id: args.clientId,
88
+ ...args.resource !== void 0 ? { resource: args.resource } : null
89
+ }).setProtectedHeader({ alg: JWT_ALG }).setIssuedAt().setJti(generateRandomString(TOKEN_JTI_LENGTH, TOKEN_JTI_ALPHABET)).setIssuer(args.issuer ?? getIssuer()).setExpirationTime(exp).sign(privateKey));
90
+ }
91
+ let cachedKeySet = null;
92
+ /**
93
+ * The local JWKS keyset, built once and reused. The `JWKS` env is static per
94
+ * deployment, so caching also preserves jose's internal imported-key cache
95
+ * across requests rather than re-importing keys on every verification.
96
+ */
97
+ function getJwkSet() {
98
+ if (cachedKeySet === null) cachedKeySet = createLocalJWKSet(JSON.parse(requireEnv("JWKS")));
99
+ return cachedKeySet;
100
+ }
101
+ /**
102
+ * Verify an OAuth access token against the local JWKS and issuer.
103
+ *
104
+ * When `opts.resource` is supplied, the token's RFC 8707 `resource` claim must
105
+ * equal it exactly — a token bound to a different (or no) resource is rejected.
106
+ * This is how an MCP endpoint enforces that a token was issued for *it*.
107
+ *
108
+ * @returns The token's user, client, scopes, and bound `resource`, or `null` if
109
+ * verification fails, the token is not an OAuth access token, or the resource
110
+ * assertion does not hold.
111
+ * @internal
112
+ */
113
+ async function verifyOAuthToken(token, opts) {
114
+ try {
115
+ const { payload } = await jwtVerify(token, getJwkSet(), {
116
+ issuer: opts?.issuer ?? getIssuer(),
117
+ audience: "convex",
118
+ algorithms: [JWT_ALG],
119
+ clockTolerance: 30
120
+ });
121
+ if (payload.token_use !== "access") return null;
122
+ const userId = payload.sub;
123
+ const clientId = payload.client_id;
124
+ const scope = payload.scope ?? "";
125
+ if (!userId || !clientId) return null;
126
+ const resourceClaim = payload.resource;
127
+ const resource = typeof resourceClaim === "string" ? resourceClaim : null;
128
+ if (opts?.resource !== void 0 && resource !== opts.resource) return null;
129
+ return {
130
+ userId,
131
+ clientId,
132
+ scopes: scope ? scope.split(" ") : [],
133
+ resource
134
+ };
135
+ } catch {
136
+ return null;
137
+ }
138
+ }
139
+ /**
140
+ * Sign a session access token (EdDSA) carrying the identity claims, audienced to Convex.
141
+ *
142
+ * Expiry is `config.jwt.durationMs` from now, defaulting to one hour.
143
+ *
144
+ * @internal
145
+ */
146
+ async function generateToken(args, config) {
147
+ const privateKey = await withSpan("convex-auth.tokens.import-key", { alg: JWT_ALG }, () => getPrivateKey());
148
+ const expirationTime = new Date(Date.now() + (config.jwt?.durationMs ?? DEFAULT_JWT_DURATION_MS));
149
+ const claims = {
150
+ sub: args.identity.subject,
151
+ sid: args.identity.sessionId,
152
+ ...args.identity.name !== void 0 ? { name: args.identity.name } : null,
153
+ ...args.identity.email !== void 0 ? { email: args.identity.email } : null,
154
+ ...args.identity.emailVerified !== void 0 ? { email_verified: args.identity.emailVerified } : null,
155
+ ...args.identity.picture !== void 0 ? { picture: args.identity.picture } : null,
156
+ ...args.identity.phoneNumber !== void 0 ? { phone_number: args.identity.phoneNumber } : null,
157
+ ...args.identity.phoneNumberVerified !== void 0 ? { phone_number_verified: args.identity.phoneNumberVerified } : null
158
+ };
159
+ return await withSpan("convex-auth.tokens.sign", { alg: JWT_ALG }, () => new SignJWT(claims).setProtectedHeader({ alg: JWT_ALG }).setIssuedAt().setJti(generateRandomString(TOKEN_JTI_LENGTH, TOKEN_JTI_ALPHABET)).setIssuer(getIssuer(config.path)).setAudience("convex").setExpirationTime(expirationTime).sign(privateKey));
160
+ }
161
+
162
+ //#endregion
163
+ export { OAUTH_ACCESS_TOKEN_DURATION_S, generateOAuthToken, generateToken, verifyOAuthToken };
164
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1,282 @@
1
+ import { ErrorCode } from "../shared/codes.js";
2
+ import { getAuthenticatedUserIdOrNull } from "./identity/claims.js";
3
+ import { queueAuthEvent } from "./events.js";
4
+ import { encodeRefreshToken, refreshTokenExpirationTime } from "./token/refresh.js";
5
+ import { setActiveSpanAttributes } from "./utils/span.js";
6
+ import { buildSessionIdentity, finalizeSessionIssuance, getAuthSessionId, sessionExpirationTime } from "./session/lifecycle.js";
7
+ import { authFlowError } from "../shared/errors.js";
8
+ import { toConvexError } from "./errors.js";
9
+ import { maxSignInAttempts } from "./limits.js";
10
+ import { buildKnownSignInIdentityAttributes } from "./telemetry.js";
11
+ import { decryptSecret, encryptSecret } from "./secret.js";
12
+ import { ConvexError } from "convex/values";
13
+ import { decodeBase64urlIgnorePadding, encodeBase32LowerCaseNoPadding, encodeBase64urlNoPadding } from "@oslojs/encoding";
14
+ import { createTOTPKeyURI, verifyTOTPWithGracePeriod } from "@oslojs/otp";
15
+
16
+ //#region src/server/totp.ts
17
+ /**
18
+ * Server-side TOTP ceremony logic for two-factor authentication.
19
+ *
20
+ * Two single-word flows:
21
+ *
22
+ * - `setup` — generate a TOTP secret and `otpauth://` URI for enrollment.
23
+ * - `verify` — consume a TOTP code. Auto-detects:
24
+ * - first-time enrollment confirmation (caller passes `totpId`), or
25
+ * - 2FA sign-in challenge (no `totpId`).
26
+ */
27
+ const TOTP_FLOWS = ["setup", "verify"];
28
+ const convexError = (code, message) => toConvexError(authFlowError(code, message));
29
+ const asConvexError = (error, code, message) => error instanceof ConvexError ? error : error instanceof Error ? toConvexError(authFlowError(code, error.message || message)) : convexError(code, message);
30
+ /**
31
+ * Encrypt a raw TOTP secret for storage. The secret bytes are base64url-encoded
32
+ * and sealed with the server's {@link encryptSecret} (AES-GCM); the resulting
33
+ * ciphertext string is stored UTF-8-encoded in the `TotpFactor.secret` bytes
34
+ * field. Runs server-side because component functions cannot read
35
+ * `AUTH_SECRET_ENCRYPTION_KEY`.
36
+ */
37
+ async function encryptTotpSecret(secret) {
38
+ const ciphertext = await encryptSecret(encodeBase64urlNoPadding(secret));
39
+ const encoded = new TextEncoder().encode(ciphertext);
40
+ return encoded.buffer.slice(encoded.byteOffset, encoded.byteOffset + encoded.byteLength);
41
+ }
42
+ /**
43
+ * Reverse {@link encryptTotpSecret}: decode the stored ciphertext bytes, decrypt
44
+ * to the base64url secret, and return the raw secret bytes for verification.
45
+ */
46
+ async function decryptTotpSecret(stored) {
47
+ return decodeBase64urlIgnorePadding(await decryptSecret(new TextDecoder().decode(stored)));
48
+ }
49
+ function resolveTotpFlow(params) {
50
+ const flow = params.flow;
51
+ if (typeof flow === "string" && TOTP_FLOWS.includes(flow)) return flow;
52
+ throw convexError(ErrorCode.TOTP_MISSING_FLOW, "Missing `flow` parameter. Expected one of: " + TOTP_FLOWS.join(", "));
53
+ }
54
+ function requireTotpVerifier(verifier) {
55
+ if (verifier != null) return verifier;
56
+ throw convexError(ErrorCode.TOTP_MISSING_VERIFIER, "Missing verifier for TOTP operation.");
57
+ }
58
+ function requireTotpCode(params) {
59
+ if (typeof params.code === "string") return params.code;
60
+ throw convexError(ErrorCode.TOTP_MISSING_CODE, "Missing TOTP code.");
61
+ }
62
+ function resolveTotpDispatch(params, verifier) {
63
+ if (resolveTotpFlow(params) === "setup") return {
64
+ flow: "setup",
65
+ params
66
+ };
67
+ const resolvedVerifier = requireTotpVerifier(verifier);
68
+ const code = requireTotpCode(params);
69
+ if (typeof params.totpId === "string" && params.totpId.length > 0) return {
70
+ flow: "verify",
71
+ code,
72
+ totpId: params.totpId,
73
+ verifier: resolvedVerifier,
74
+ intent: "enrollment"
75
+ };
76
+ return {
77
+ flow: "verify",
78
+ code,
79
+ verifier: resolvedVerifier,
80
+ intent: "challenge"
81
+ };
82
+ }
83
+ async function requireAuthenticatedUserId(ctx) {
84
+ try {
85
+ const userId = await getAuthenticatedUserIdOrNull(ctx);
86
+ if (userId === null) throw convexError(ErrorCode.TOTP_AUTH_REQUIRED, "Sign in first, then set up two-factor authentication.");
87
+ return userId;
88
+ } catch (error) {
89
+ if (error instanceof ConvexError) throw error;
90
+ throw asConvexError(error, ErrorCode.INTERNAL_ERROR, String(error));
91
+ }
92
+ }
93
+ /**
94
+ * Drive the TOTP provider's `setup` / `verify` flow.
95
+ *
96
+ * `setup` issues an enrollment secret and `otpauth://` URI; `verify` either
97
+ * confirms a first-time enrollment (when `params.totpId` is present) or
98
+ * completes a 2FA challenge during sign-in.
99
+ *
100
+ * @internal
101
+ */
102
+ const handleTotp = async (ctx, provider, args) => {
103
+ const dispatch = resolveTotpDispatch(args.params ?? {}, args.verifier);
104
+ const flowHandlers = {
105
+ setup: async () => {
106
+ const { params: setupParams } = dispatch;
107
+ const userId = await requireAuthenticatedUserId(ctx);
108
+ const secret = new Uint8Array(20);
109
+ crypto.getRandomValues(secret);
110
+ const base32Secret = encodeBase32LowerCaseNoPadding(secret);
111
+ let enrollment;
112
+ try {
113
+ enrollment = await ctx.runMutation(ctx.auth.config.component.factor.totp.createEnrollment, {
114
+ userId,
115
+ secret: await encryptTotpSecret(secret),
116
+ digits: provider.options.digits,
117
+ period: provider.options.period,
118
+ name: typeof setupParams.name === "string" ? setupParams.name : void 0,
119
+ createdAt: Date.now()
120
+ });
121
+ } catch (error) {
122
+ throw asConvexError(error, ErrorCode.INTERNAL_ERROR, `TOTP setup failed: ${String(error)}`);
123
+ }
124
+ const accountName = typeof setupParams.accountName === "string" && setupParams.accountName.length > 0 ? setupParams.accountName : enrollment.user.email ?? "user";
125
+ return {
126
+ kind: "totpSetup",
127
+ totpSetup: {
128
+ uri: createTOTPKeyURI(provider.options.issuer, accountName, secret, provider.options.period, provider.options.digits),
129
+ secret: base32Secret,
130
+ totpId: enrollment.totpId
131
+ },
132
+ verifier: enrollment.verifierId
133
+ };
134
+ },
135
+ verify: async () => {
136
+ if (dispatch.flow !== "verify") throw convexError(ErrorCode.TOTP_MISSING_FLOW, `Unexpected dispatch: ${dispatch.flow}`);
137
+ if (dispatch.intent === "enrollment") return await confirmEnrollment(dispatch.code, dispatch.totpId, dispatch.verifier);
138
+ return await verifyChallenge(dispatch.code, dispatch.verifier);
139
+ }
140
+ };
141
+ /**
142
+ * `verify` with `totpId`: completes a first-time enrollment after `setup`.
143
+ * Marks the TOTP factor as verified and signs the user in.
144
+ */
145
+ async function confirmEnrollment(code, totpId, verifier) {
146
+ const userId = await requireAuthenticatedUserId(ctx);
147
+ const result = await verifyTotp({
148
+ code,
149
+ verifier,
150
+ intent: "enrollment",
151
+ authenticatedUserId: userId,
152
+ totpId
153
+ });
154
+ await queueAuthEvent(ctx, ctx.auth.config, {
155
+ kind: "totp.enrolled",
156
+ actor: {
157
+ type: "user",
158
+ id: userId
159
+ },
160
+ subject: {
161
+ type: "totp",
162
+ id: totpId
163
+ },
164
+ targets: [{
165
+ kind: "user",
166
+ id: userId
167
+ }],
168
+ outcome: "success",
169
+ data: { totpId }
170
+ });
171
+ return result;
172
+ }
173
+ /**
174
+ * `verify` without `totpId`: completes a 2FA challenge during sign-in.
175
+ * Looks up the user's verified TOTP factor, validates the code, signs in.
176
+ */
177
+ async function verifyChallenge(code, verifier) {
178
+ return await verifyTotp({
179
+ code,
180
+ verifier,
181
+ intent: "challenge"
182
+ });
183
+ }
184
+ async function verifyTotp(input) {
185
+ const begun = await ctx.runMutation(ctx.auth.config.component.factor.totp.beginVerification, {
186
+ verifierId: input.verifier,
187
+ intent: input.intent,
188
+ authenticatedUserId: input.authenticatedUserId,
189
+ totpId: input.totpId,
190
+ maxAttemptsPerHour: maxSignInAttempts(ctx.auth.config)
191
+ });
192
+ if (begun.status === "invalid_verifier") throw convexError(ErrorCode.TOTP_INVALID_VERIFIER, "Invalid or expired TOTP verifier.");
193
+ if (begun.status === "limited") throw convexError(ErrorCode.RATE_LIMITED, "Too many TOTP attempts. Try again later.");
194
+ if (begun.status === "already_verified") throw convexError(ErrorCode.TOTP_ALREADY_VERIFIED, "TOTP enrollment is already verified.");
195
+ if (begun.status === "not_found") throw convexError(input.intent === "enrollment" ? ErrorCode.TOTP_NOT_FOUND : ErrorCode.TOTP_NO_ENROLLMENT, input.intent === "enrollment" ? "TOTP enrollment not found." : "No verified TOTP enrollment found.");
196
+ if (begun.status !== "ready") throw convexError(ErrorCode.INTERNAL_ERROR, "Unexpected TOTP verification state.");
197
+ if (!verifyTOTPWithGracePeriod(await decryptTotpSecret(begun.factor.secret), begun.factor.period, begun.factor.digits, input.code, 30)) throw convexError(ErrorCode.TOTP_INVALID_CODE, "Invalid TOTP code.");
198
+ const replaceSessionId = await getAuthSessionId(ctx) ?? void 0;
199
+ const completed = await ctx.runMutation(ctx.auth.config.component.factor.totp.completeVerification, {
200
+ verifierId: input.verifier,
201
+ intent: input.intent,
202
+ authenticatedUserId: input.authenticatedUserId,
203
+ totpId: input.totpId,
204
+ replaceSessionId,
205
+ sessionExpirationTime: sessionExpirationTime(ctx.auth.config),
206
+ refreshTokenExpirationTime: refreshTokenExpirationTime(ctx.auth.config),
207
+ now: Date.now()
208
+ });
209
+ if (completed.status !== "accepted") throw convexError(ErrorCode.TOTP_INVALID_VERIFIER, "Invalid or expired TOTP verifier.");
210
+ const userId = completed.user._id;
211
+ const sessionId = completed.sessionId;
212
+ setActiveSpanAttributes({
213
+ "auth.signin.result": "success",
214
+ ...buildKnownSignInIdentityAttributes(ctx.auth.config, {
215
+ userId,
216
+ sessionId
217
+ }, completed.user.email)
218
+ });
219
+ if (completed.replacedSessionId !== void 0) {
220
+ const replacedSessionId = completed.replacedSessionId;
221
+ await queueAuthEvent(ctx, ctx.auth.config, {
222
+ kind: "session.invalidated",
223
+ actor: { type: "system" },
224
+ subject: {
225
+ type: "session",
226
+ id: replacedSessionId
227
+ },
228
+ targets: [{
229
+ kind: "user",
230
+ id: userId
231
+ }, {
232
+ kind: "session",
233
+ id: replacedSessionId
234
+ }],
235
+ outcome: "success",
236
+ data: {
237
+ userId,
238
+ reason: "replaced"
239
+ }
240
+ });
241
+ }
242
+ await queueAuthEvent(ctx, ctx.auth.config, {
243
+ kind: "session.signed_in",
244
+ actor: {
245
+ type: "user",
246
+ id: userId
247
+ },
248
+ subject: {
249
+ type: "session",
250
+ id: sessionId
251
+ },
252
+ targets: [{
253
+ kind: "user",
254
+ id: userId
255
+ }, {
256
+ kind: "session",
257
+ id: sessionId
258
+ }],
259
+ outcome: "success",
260
+ data: {
261
+ provider: "session",
262
+ method: provider.id
263
+ }
264
+ });
265
+ return {
266
+ kind: "signedIn",
267
+ session: await finalizeSessionIssuance(ctx.auth.config, {
268
+ userId,
269
+ sessionId,
270
+ identity: buildSessionIdentity(userId, sessionId, completed.user),
271
+ refreshToken: encodeRefreshToken(completed.refreshTokenId, sessionId)
272
+ })
273
+ };
274
+ }
275
+ const handler = flowHandlers[dispatch.flow];
276
+ if (!handler) throw convexError(ErrorCode.TOTP_MISSING_FLOW, `Unknown TOTP flow: ${dispatch.flow}`);
277
+ return handler();
278
+ };
279
+
280
+ //#endregion
281
+ export { handleTotp };
282
+ //# sourceMappingURL=totp.js.map