@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,210 @@
1
+ import { LOG_LEVELS } from "../../../shared/log.js";
2
+ import { queueAuthEvent } from "../../events.js";
3
+ import { log, maybeRedact } from "../../log.js";
4
+ import { encodeRefreshToken, refreshTokenExpirationTime } from "../../token/refresh.js";
5
+ import { setActiveSpanAttributes, withSpan } from "../../utils/span.js";
6
+ import { buildSessionIdentity, getAuthSessionId, sessionExpirationTime } from "../../session/lifecycle.js";
7
+ import { verify } from "../../crypto.js";
8
+ import { AUTH_STORE_REF } from "../store/refs.js";
9
+ import { maxSignInAttempts } from "../../limits.js";
10
+ import { buildKnownSignInIdentityAttributes } from "../../telemetry.js";
11
+ import { v } from "convex/values";
12
+
13
+ //#region src/server/mutations/credentials/signin.ts
14
+ /**
15
+ * A well-formed but intentionally unmatchable password hash. Verifying any
16
+ * secret against it runs the provider's full (scrypt) work and always fails.
17
+ * Used on the missing-account branch so sign-in spends comparable time whether
18
+ * or not the account exists — closing the user-enumeration timing oracle.
19
+ *
20
+ * The prefix and params mirror the default password provider's scrypt format so
21
+ * that provider performs a real scrypt hash; the salt and digest are all zero,
22
+ * a digest scrypt can never actually produce, so verification never succeeds.
23
+ */
24
+ const DUMMY_PASSWORD_HASH = `scrypt:N=16384,r=16,p=1,dkLen=64$${"0".repeat(64)}$${"0".repeat(128)}`;
25
+ /**
26
+ * Run a throwaway secret verification purely to equalize timing on branches
27
+ * that reject before the real verify would run. Never authenticates: it
28
+ * verifies against {@link DUMMY_PASSWORD_HASH} (which cannot match) and swallows
29
+ * any error, so a misconfigured or non-credentials provider still yields the
30
+ * unified rejection rather than a distinguishable error or timing.
31
+ */
32
+ async function burnVerifyForTiming(getProviderOrThrow, providerId, secret) {
33
+ try {
34
+ await verify(getProviderOrThrow(providerId), secret, DUMMY_PASSWORD_HASH);
35
+ } catch {}
36
+ }
37
+ /** Argument validator for the combined credentials-verify + session-issue mutation. */
38
+ const vCredentialsSignInArgs = v.object({
39
+ provider: v.string(),
40
+ account: v.object({
41
+ id: v.string(),
42
+ secret: v.string()
43
+ }),
44
+ generateTokens: v.boolean(),
45
+ requireVerifiedEmail: v.boolean(),
46
+ enforceTotp: v.boolean()
47
+ });
48
+ /**
49
+ * Verify credentials and issue a session through one app mutation.
50
+ *
51
+ * Enforces sign-in rate limiting, optional verified-email and TOTP gates, and
52
+ * returns a discriminated result (`invalidAccount`, `tooManyAttempts`,
53
+ * `invalidSecret`, `emailVerificationRequired`, `totpRequired`, or `signedIn`).
54
+ *
55
+ * @internal
56
+ */
57
+ async function credentialsSignInImpl(ctx, args, getProviderOrThrow, config) {
58
+ return withSpan("convex-auth.mutations.credentialsSignIn", {
59
+ provider: args.provider,
60
+ generateTokens: args.generateTokens
61
+ }, () => credentialsSignInInner(ctx, args, getProviderOrThrow, config));
62
+ }
63
+ async function credentialsSignInInner(ctx, args, getProviderOrThrow, config) {
64
+ const { provider: providerId, account, generateTokens, requireVerifiedEmail, enforceTotp } = args;
65
+ log(LOG_LEVELS.DEBUG, "credentialsSignInImpl args:", {
66
+ provider: providerId,
67
+ account: {
68
+ id: account.id,
69
+ secret: maybeRedact(account.secret)
70
+ },
71
+ generateTokens,
72
+ requireVerifiedEmail,
73
+ enforceTotp
74
+ });
75
+ const begun = await ctx.runMutation(config.component.account.beginCredentialsSignIn, {
76
+ provider: providerId,
77
+ providerAccountId: account.id,
78
+ maxAttemptsPerHour: maxSignInAttempts(config),
79
+ reserveAttempt: true,
80
+ includeTotp: enforceTotp
81
+ });
82
+ if (begun.status === "invalid") {
83
+ await burnVerifyForTiming(getProviderOrThrow, providerId, account.secret);
84
+ return { kind: "invalidAccount" };
85
+ }
86
+ if (begun.status === "limited") return { kind: "tooManyAttempts" };
87
+ const existingAccount = begun.account;
88
+ const user = begun.user;
89
+ if (!await withSpan("convex-auth.credentials.verify", { providerId }, () => verify(getProviderOrThrow(providerId), account.secret, existingAccount.secret ?? ""))) return { kind: "invalidSecret" };
90
+ const complete = async (issueSession) => await ctx.runMutation(config.component.account.completeCredentialsSignIn, {
91
+ accountId: existingAccount._id,
92
+ issueSession,
93
+ generateTokens,
94
+ replaceSessionId: issueSession ? await getAuthSessionId(ctx) ?? void 0 : void 0,
95
+ sessionExpirationTime: sessionExpirationTime(config),
96
+ refreshTokenExpirationTime: refreshTokenExpirationTime(config)
97
+ });
98
+ if (requireVerifiedEmail && !existingAccount.emailVerified) {
99
+ await complete(false);
100
+ return {
101
+ kind: "emailVerificationRequired",
102
+ account: {
103
+ _id: existingAccount._id,
104
+ emailVerified: existingAccount.emailVerified
105
+ },
106
+ user: {
107
+ _id: user._id,
108
+ email: user.email
109
+ }
110
+ };
111
+ }
112
+ if (enforceTotp && begun.hasTotp) {
113
+ await complete(false);
114
+ return {
115
+ kind: "totpRequired",
116
+ account: {
117
+ _id: existingAccount._id,
118
+ emailVerified: existingAccount.emailVerified
119
+ },
120
+ user: {
121
+ _id: user._id,
122
+ email: user.email
123
+ }
124
+ };
125
+ }
126
+ const completed = await complete(true);
127
+ if (completed.status !== "accepted") return { kind: "invalidAccount" };
128
+ const userId = completed.user._id;
129
+ const sessionId = completed.sessionId;
130
+ setActiveSpanAttributes({
131
+ "auth.signin.result": "success",
132
+ ...buildKnownSignInIdentityAttributes(config, {
133
+ userId,
134
+ sessionId
135
+ }, completed.user.email)
136
+ });
137
+ if (completed.replacedSessionId !== void 0) {
138
+ const replacedSessionId = completed.replacedSessionId;
139
+ await queueAuthEvent(ctx, config, {
140
+ kind: "session.invalidated",
141
+ actor: { type: "system" },
142
+ subject: {
143
+ type: "session",
144
+ id: replacedSessionId
145
+ },
146
+ targets: [{
147
+ kind: "user",
148
+ id: userId
149
+ }, {
150
+ kind: "session",
151
+ id: replacedSessionId
152
+ }],
153
+ outcome: "success",
154
+ data: {
155
+ userId,
156
+ reason: "replaced"
157
+ }
158
+ });
159
+ }
160
+ await queueAuthEvent(ctx, config, {
161
+ kind: "session.signed_in",
162
+ actor: {
163
+ type: "user",
164
+ id: userId
165
+ },
166
+ subject: {
167
+ type: "session",
168
+ id: sessionId
169
+ },
170
+ targets: [{
171
+ kind: "user",
172
+ id: userId
173
+ }, {
174
+ kind: "session",
175
+ id: sessionId
176
+ }],
177
+ outcome: "success",
178
+ data: { provider: providerId }
179
+ });
180
+ const refreshTokenId = completed.refreshTokenId;
181
+ return {
182
+ kind: "signedIn",
183
+ issuance: {
184
+ userId,
185
+ sessionId,
186
+ identity: buildSessionIdentity(userId, sessionId, completed.user),
187
+ refreshToken: generateTokens && refreshTokenId !== void 0 ? encodeRefreshToken(refreshTokenId, sessionId) : null
188
+ },
189
+ account: {
190
+ _id: existingAccount._id,
191
+ emailVerified: existingAccount.emailVerified
192
+ },
193
+ user: {
194
+ _id: user._id,
195
+ email: user.email,
196
+ hasTotp: begun.hasTotp
197
+ }
198
+ };
199
+ }
200
+ /** @internal */
201
+ const callCredentialsSignIn = async (ctx, args) => {
202
+ return await ctx.runMutation(AUTH_STORE_REF, { args: {
203
+ type: "credentialsSignIn",
204
+ ...args
205
+ } });
206
+ };
207
+
208
+ //#endregion
209
+ export { callCredentialsSignIn, credentialsSignInImpl, vCredentialsSignInArgs };
210
+ //# sourceMappingURL=signin.js.map
@@ -0,0 +1,60 @@
1
+ import { LOG_LEVELS } from "../../shared/log.js";
2
+ import { emitAuthEvent } from "../events.js";
3
+ import { authDb } from "../db.js";
4
+ import { log } from "../log.js";
5
+ import { deleteSession } from "../session/lifecycle.js";
6
+ import { AUTH_STORE_REF } from "./store/refs.js";
7
+ import { v } from "convex/values";
8
+
9
+ //#region src/server/mutations/invalidate.ts
10
+ const vInvalidateSessionsArgs = v.object({
11
+ userId: v.string(),
12
+ except: v.optional(v.array(v.string()))
13
+ });
14
+ const callInvalidateSessions = async (ctx, args) => {
15
+ return ctx.runMutation(AUTH_STORE_REF, { args: {
16
+ type: "invalidateSessions",
17
+ ...args
18
+ } });
19
+ };
20
+ async function invalidateSessionsImpl(ctx, args, config) {
21
+ log(LOG_LEVELS.DEBUG, "invalidateSessionsImpl args:", args);
22
+ const { userId, except } = args;
23
+ const exceptSet = new Set(except ?? []);
24
+ const typedUserId = userId;
25
+ const sessions = await authDb(ctx, config).sessions.listByUser(typedUserId);
26
+ const deleted = [];
27
+ await Promise.all(sessions.map(async (session) => {
28
+ if (exceptSet.has(session._id)) return;
29
+ await deleteSession(ctx, session, config);
30
+ deleted.push(session._id);
31
+ }));
32
+ for (const sessionId of deleted) await emitAuthEvent(ctx, config, {
33
+ kind: "session.invalidated",
34
+ actor: { type: "system" },
35
+ subject: {
36
+ type: "session",
37
+ id: sessionId
38
+ },
39
+ targets: [
40
+ {
41
+ kind: "user",
42
+ id: typedUserId
43
+ },
44
+ {
45
+ kind: "session",
46
+ id: sessionId
47
+ },
48
+ {
49
+ kind: "global",
50
+ id: "security"
51
+ }
52
+ ],
53
+ outcome: "success",
54
+ data: { userId: typedUserId }
55
+ });
56
+ }
57
+
58
+ //#endregion
59
+ export { callInvalidateSessions, invalidateSessionsImpl, vInvalidateSessionsArgs };
60
+ //# sourceMappingURL=invalidate.js.map
@@ -0,0 +1,251 @@
1
+ import { ErrorCode } from "../../shared/codes.js";
2
+ import { generateRandomString, sha256 } from "../random.js";
3
+ import { authDb } from "../db.js";
4
+ import { log, maybeRedact } from "../log.js";
5
+ import { AUTH_STORE_REF } from "./store/refs.js";
6
+ import { upsertUserAndAccount } from "../user/account.js";
7
+ import { getGroup, getGroupConnection } from "../contract.js";
8
+ import { vAccountExtend, vPayloadRecord } from "../payloads.js";
9
+ import { vProfileEmail } from "../../component/model.js";
10
+ import { single } from "../component/api.js";
11
+ import { GROUP_OIDC_PROVIDER_PREFIX, GROUP_SAML_PROVIDER_PREFIX, isGroupProviderId } from "../connection/shared.js";
12
+ import { createSyntheticOAuthMaterializedConfig } from "../connection/oidc.js";
13
+ import { normalizeGroupConnectionPolicy, resolveProvisionedRoleIds } from "../connection/policy.js";
14
+ import { ConvexError, v } from "convex/values";
15
+
16
+ //#region src/server/mutations/oauth.ts
17
+ const OAUTH_SIGN_IN_EXPIRATION_MS = 1e3 * 60 * 2;
18
+ /**
19
+ * Length and alphabet of the short-lived OAuth sign-in handoff code minted
20
+ * below. Matches the 32-char alphanumeric convention used for OAuth
21
+ * authorization codes elsewhere (`server/oauth/code.ts`): ~190 bits of entropy,
22
+ * versus ~26.6 bits for the previous 8-digit numeric code — which was
23
+ * brute-forceable within this handoff's 2-minute TTL.
24
+ * @internal
25
+ */
26
+ const OAUTH_SIGN_IN_CODE_LENGTH = 32;
27
+ /** @internal */
28
+ const OAUTH_SIGN_IN_CODE_ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
29
+ /** Argument validator for the OAuth/Connection user provisioning mutation. */
30
+ const vUserOAuthArgs = v.object({
31
+ provider: v.string(),
32
+ providerAccountId: v.string(),
33
+ profile: vPayloadRecord,
34
+ emails: v.optional(v.array(vProfileEmail)),
35
+ signature: v.string(),
36
+ accountExtend: v.optional(vAccountExtend)
37
+ });
38
+ function normalizeAccountExtend(provider, providerAccountId, accountExtend) {
39
+ const baseIdentity = {
40
+ type: "oauth",
41
+ provider,
42
+ providerAccountId
43
+ };
44
+ if (provider.startsWith(GROUP_OIDC_PROVIDER_PREFIX)) {
45
+ baseIdentity.type = "group-connection-oidc";
46
+ baseIdentity.connectionId = provider.slice(GROUP_OIDC_PROVIDER_PREFIX.length);
47
+ }
48
+ if (provider.startsWith(GROUP_SAML_PROVIDER_PREFIX)) {
49
+ baseIdentity.type = "group-connection-saml";
50
+ baseIdentity.connectionId = provider.slice(GROUP_SAML_PROVIDER_PREFIX.length);
51
+ }
52
+ const provided = accountExtend;
53
+ const providedIdentity = provided?.identity;
54
+ return {
55
+ ...provided,
56
+ identity: {
57
+ ...baseIdentity,
58
+ ...providedIdentity
59
+ }
60
+ };
61
+ }
62
+ /**
63
+ * Read a free-form string-array claim (e.g. `groups`, `roles`) from an IdP
64
+ * profile. The value arrives as untyped wire data; the array branch is
65
+ * re-narrowed to `string[]` at this single boundary.
66
+ */
67
+ function readStringArrayClaim(profile, key) {
68
+ const value = profile[key];
69
+ return Array.isArray(value) ? value : void 0;
70
+ }
71
+ /** Lowercased registrable domain of an email address, or `null` when unparseable. */
72
+ function emailDomain(email) {
73
+ if (typeof email !== "string") return null;
74
+ const at = email.lastIndexOf("@");
75
+ if (at === -1 || at === email.length - 1) return null;
76
+ return email.slice(at + 1).toLowerCase();
77
+ }
78
+ /**
79
+ * Whether a SAML-asserted email may be treated as verified: true only when its
80
+ * domain matches a verified (`verifiedAt` set) domain attached to the
81
+ * connection. SAML carries no `email_verified` claim, so a domain-ownership
82
+ * proof is the only signal that lets a SAML email drive `verifiedEmail`
83
+ * account-linking — without it a malicious IdP could assert `victim@other.com`.
84
+ */
85
+ async function isSamlEmailDomainVerified(ctx, config, connectionId, email) {
86
+ const domain = emailDomain(email);
87
+ if (domain === null) return false;
88
+ return (await ctx.runQuery(config.component.connection.domain.list, { connectionId })).some((row) => row.verifiedAt !== void 0 && row.domain.toLowerCase() === domain);
89
+ }
90
+ /**
91
+ * Just-in-time membership provisioning for a connection-owned group on SSO
92
+ * login, reconcile-to-set on roles.
93
+ *
94
+ * @remarks
95
+ * The IdP assertion is authoritative for a connection-owned membership's roles:
96
+ * an existing membership's `roleIds` are overwritten with exactly the mapped
97
+ * set even when that shrinks (or empties) it, so a demotion at the IdP drops the
98
+ * local roles rather than leaving them (the previous additive-only behavior).
99
+ * The membership itself is never removed here — the user just authenticated
100
+ * through this connection's IdP, so JIT keeps them a member; full
101
+ * de-provisioning (and session revocation) is SCIM's responsibility.
102
+ */
103
+ async function jitProvisionMembership(ctx, config, connectionPolicy, connection, userId, profile) {
104
+ if (connectionPolicy?.provisioning.jit.mode !== "createUserAndMembership") return;
105
+ const groupId = connection?.groupId;
106
+ if (!groupId) return;
107
+ const definedRoleIds = new Set(Object.keys(config.permissions?.roles ?? {}));
108
+ const provisionedRoleIds = resolveProvisionedRoleIds({
109
+ policy: connectionPolicy,
110
+ groups: readStringArrayClaim(profile, "groups"),
111
+ roles: readStringArrayClaim(profile, "roles")
112
+ }).filter((roleId) => definedRoleIds.has(roleId));
113
+ const existingMembership = single(await ctx.runQuery(config.component.group.member.get, {
114
+ userId,
115
+ groupId
116
+ }));
117
+ if (existingMembership === null) {
118
+ await ctx.runMutation(config.component.group.member.create, {
119
+ groupId,
120
+ userId,
121
+ roleIds: provisionedRoleIds,
122
+ status: "active"
123
+ });
124
+ return;
125
+ }
126
+ const currentRoleIds = existingMembership.roleIds ?? [];
127
+ const nextRoleSet = new Set(provisionedRoleIds);
128
+ if (!(currentRoleIds.length === nextRoleSet.size && currentRoleIds.every((roleId) => nextRoleSet.has(roleId)))) await ctx.runMutation(config.component.group.member.update, {
129
+ id: existingMembership._id,
130
+ patch: { roleIds: provisionedRoleIds }
131
+ });
132
+ }
133
+ /**
134
+ * Redact secret-bearing fields (the OAuth state `signature`) from the
135
+ * provisioning args before they reach a DEBUG log line, so enabling DEBUG never
136
+ * writes the verifier signature to logs.
137
+ * @internal
138
+ */
139
+ function redactUserOAuthArgsForLog(args) {
140
+ return {
141
+ ...args,
142
+ signature: maybeRedact(args.signature)
143
+ };
144
+ }
145
+ /**
146
+ * Provision a user and account from a verified OAuth/Connection profile.
147
+ *
148
+ * Resolves any group connection (OIDC/SAML) and its policy, runs the
149
+ * profile/provision hooks, upserts the user and account, performs JIT
150
+ * membership provisioning, and mints a short-lived single-use sign-in code.
151
+ *
152
+ * @returns The numeric sign-in code the action side exchanges for tokens.
153
+ */
154
+ async function userOAuthImpl(ctx, args, getProviderOrThrow, config) {
155
+ log("DEBUG", "userOAuthImpl args:", redactUserOAuthArgsForLog(args));
156
+ const { profile, provider, providerAccountId, signature, accountExtend } = args;
157
+ const typedProfile = profile;
158
+ const db = authDb(ctx, config);
159
+ const connectionId = provider.startsWith(GROUP_OIDC_PROVIDER_PREFIX) ? provider.slice(GROUP_OIDC_PROVIDER_PREFIX.length) : provider.startsWith(GROUP_SAML_PROVIDER_PREFIX) ? provider.slice(GROUP_SAML_PROVIDER_PREFIX.length) : null;
160
+ const connectionProtocol = provider.startsWith(GROUP_OIDC_PROVIDER_PREFIX) ? "oidc" : provider.startsWith(GROUP_SAML_PROVIDER_PREFIX) ? "saml" : null;
161
+ const existingAccount = await db.accounts.get({
162
+ provider,
163
+ providerAccountId
164
+ });
165
+ const connection = connectionId !== null ? await getGroupConnection(ctx, config.component.connection, connectionId) : null;
166
+ const group = connection !== null ? await getGroup(ctx, config.component.group, connection.groupId) : null;
167
+ const connectionPolicy = connection ? normalizeGroupConnectionPolicy(group?.policy) : null;
168
+ /**
169
+ * SCIM identity `userId` crosses the component boundary as `string`; re-brand
170
+ * to the server's `Id<"User">` here — the one legitimate cast at the boundary.
171
+ */
172
+ const existingScimUserId = (connectionId !== null && existingAccount === null && connectionPolicy?.provisioning.scimReuse.user === "externalId" ? single(await ctx.runQuery(config.component.connection.scim.identity.get, {
173
+ connectionId,
174
+ resourceType: "user",
175
+ externalId: providerAccountId
176
+ })) : null)?.userId;
177
+ let verifier;
178
+ try {
179
+ verifier = await db.verifiers.get({ signature });
180
+ } catch (err) {
181
+ console.error("[auth] OAuth verifier lookup failed", { err });
182
+ throw new ConvexError({
183
+ code: ErrorCode.OAUTH_INVALID_STATE,
184
+ message: "Invalid OAuth state. Please try signing in again."
185
+ });
186
+ }
187
+ if (verifier === null) throw new ConvexError({
188
+ code: ErrorCode.OAUTH_INVALID_STATE,
189
+ message: "Invalid OAuth state. Please try signing in again."
190
+ });
191
+ const profileResolved = (config.connection?.hooks?.profileResolved ? await config.connection.hooks.profileResolved({
192
+ protocol: connectionProtocol ?? "oidc",
193
+ connectionId: connectionId ?? void 0,
194
+ profile: typedProfile
195
+ }) : void 0) ?? typedProfile;
196
+ const profileForProvisioning = (config.connection?.hooks?.beforeProvision ? await config.connection.hooks.beforeProvision({
197
+ protocol: connectionProtocol ?? "oidc",
198
+ connectionId: connectionId ?? void 0,
199
+ profile: profileResolved
200
+ }) : void 0) ?? profileResolved;
201
+ const provisioningProfile = connectionProtocol === "saml" && connectionId !== null ? {
202
+ ...profileForProvisioning,
203
+ emailVerified: await isSamlEmailDomainVerified(ctx, config, connectionId, profileForProvisioning.email)
204
+ } : profileForProvisioning;
205
+ const { accountId } = await upsertUserAndAccount(ctx, verifier.sessionId ?? null, existingAccount !== null ? { existingAccount } : { providerAccountId }, {
206
+ type: "oauth",
207
+ provider: isGroupProviderId(provider) ? createSyntheticOAuthMaterializedConfig(provider, { accountLinking: connectionProtocol === "oidc" ? connectionPolicy?.identity.accountLinking.oidc : connectionProtocol === "saml" ? connectionPolicy?.identity.accountLinking.saml : void 0 }) : getProviderOrThrow(provider),
208
+ profile: provisioningProfile,
209
+ emails: args.emails,
210
+ accountExtend: normalizeAccountExtend(provider, providerAccountId, accountExtend)
211
+ }, config, connectionPolicy?.provisioning.user ? {
212
+ existingUserId: existingScimUserId,
213
+ provisioningUser: connectionPolicy.provisioning.user,
214
+ source: "login"
215
+ } : existingScimUserId ? { existingUserId: existingScimUserId } : void 0);
216
+ if (connectionId !== null) {
217
+ const userId = (await db.accounts.get({ id: accountId }))?.userId;
218
+ if (userId) {
219
+ await jitProvisionMembership(ctx, config, connectionPolicy, connection, userId, typedProfile);
220
+ if (config.connection?.hooks?.afterProvision) await config.connection.hooks.afterProvision({
221
+ protocol: connectionProtocol ?? "oidc",
222
+ connectionId,
223
+ profile: profileForProvisioning,
224
+ userId
225
+ });
226
+ }
227
+ }
228
+ const code = generateRandomString(OAUTH_SIGN_IN_CODE_LENGTH, OAUTH_SIGN_IN_CODE_ALPHABET);
229
+ await db.verifiers.delete(verifier._id);
230
+ const existingVerificationCode = await db.verificationCodes.get({ accountId });
231
+ if (existingVerificationCode !== null) await db.verificationCodes.delete(existingVerificationCode._id);
232
+ await db.verificationCodes.create({
233
+ code: await sha256(code),
234
+ accountId,
235
+ provider,
236
+ expirationTime: Date.now() + OAUTH_SIGN_IN_EXPIRATION_MS,
237
+ verifier: verifier._id
238
+ });
239
+ return code;
240
+ }
241
+ /** Action-side wrapper that runs {@link userOAuthImpl} through the auth store. */
242
+ const callUserOAuth = async (ctx, args) => {
243
+ return ctx.runMutation(AUTH_STORE_REF, { args: {
244
+ type: "userOAuth",
245
+ ...args
246
+ } });
247
+ };
248
+
249
+ //#endregion
250
+ export { callUserOAuth, userOAuthImpl, vUserOAuthArgs };
251
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1,152 @@
1
+ import { emitAuthEvent, queueAuthEvent } from "../events.js";
2
+ import { authDb } from "../db.js";
3
+ import { log, maybeRedact } from "../log.js";
4
+ import { REFRESH_TOKEN_REUSE_WINDOW_MS, encodeRefreshToken, parseRefreshToken, refreshTokenExpirationTime } from "../token/refresh.js";
5
+ import { setActiveSpanAttributes, withSpan } from "../utils/span.js";
6
+ import { buildSessionIdentity, finalizeSessionIssuance } from "../session/lifecycle.js";
7
+ import { AUTH_STORE_REF } from "./store/refs.js";
8
+ import { buildKnownRefreshIdentityAttributes } from "../telemetry.js";
9
+ import { v } from "convex/values";
10
+
11
+ //#region src/server/mutations/refresh.ts
12
+ const vRefreshSessionArgs = v.object({ refreshToken: v.string() });
13
+ /**
14
+ * Exchange a refresh token and mint the next pair of session IDs + refresh
15
+ * token string. The RSA-2048 JWT signing used to live here; it has been
16
+ * moved to the action wrapper ({@link callRefreshSession}) so the mutation
17
+ * can commit without paying 5–30ms of CPU per refresh.
18
+ *
19
+ * @internal
20
+ */
21
+ async function refreshSessionImpl(ctx, args, config) {
22
+ const db = authDb(ctx, config);
23
+ return withSpan("convex-auth.refresh.session", {
24
+ hasRefreshToken: true,
25
+ "auth.flow": "refresh"
26
+ }, async () => {
27
+ try {
28
+ let refreshTokenId;
29
+ let sessionId;
30
+ try {
31
+ ({refreshTokenId, sessionId} = parseRefreshToken(args.refreshToken));
32
+ } catch {
33
+ throw new RefreshFailure("parse_failure", "Failed to parse refresh token");
34
+ }
35
+ log("DEBUG", `refreshSessionImpl args: Token ID: ${maybeRedact(refreshTokenId)} Session ID: ${maybeRedact(sessionId)}`);
36
+ let exchanged;
37
+ try {
38
+ exchanged = await db.refreshTokens.exchange({
39
+ refreshTokenId,
40
+ sessionId,
41
+ now: Date.now(),
42
+ refreshTokenExpirationTime: refreshTokenExpirationTime(config),
43
+ reuseWindowMs: REFRESH_TOKEN_REUSE_WINDOW_MS
44
+ });
45
+ } catch {
46
+ throw new RefreshFailure("exchange_failure", "Failed to exchange refresh token");
47
+ }
48
+ if (exchanged.status === "reuse_detected") {
49
+ setActiveSpanAttributes({ "auth.refresh.result": "reuse_detected" });
50
+ await emitAuthEvent(ctx, config, {
51
+ kind: "session.refresh_reuse_detected",
52
+ actor: { type: "system" },
53
+ subject: {
54
+ type: "session",
55
+ id: sessionId
56
+ },
57
+ targets: [
58
+ {
59
+ kind: "user",
60
+ id: exchanged.userId
61
+ },
62
+ {
63
+ kind: "session",
64
+ id: sessionId
65
+ },
66
+ {
67
+ kind: "global",
68
+ id: "security"
69
+ }
70
+ ],
71
+ outcome: "failure",
72
+ data: {
73
+ userId: exchanged.userId,
74
+ refreshTokenId: exchanged.refreshTokenId
75
+ }
76
+ });
77
+ return null;
78
+ }
79
+ if (exchanged.status === "invalid") {
80
+ setActiveSpanAttributes({ "auth.refresh.result": "null" });
81
+ return null;
82
+ }
83
+ setActiveSpanAttributes({
84
+ "auth.refresh.result": "success",
85
+ ...buildKnownRefreshIdentityAttributes(config, {
86
+ userId: exchanged.userId,
87
+ sessionId: exchanged.sessionId,
88
+ refreshTokenId: exchanged.refreshTokenId
89
+ }, exchanged.user.email)
90
+ });
91
+ await queueAuthEvent(ctx, config, {
92
+ kind: "session.refresh_exchanged",
93
+ actor: { type: "system" },
94
+ subject: {
95
+ type: "session",
96
+ id: exchanged.sessionId
97
+ },
98
+ targets: [{
99
+ kind: "user",
100
+ id: exchanged.userId
101
+ }, {
102
+ kind: "session",
103
+ id: exchanged.sessionId
104
+ }],
105
+ outcome: "success",
106
+ data: { sessionId: exchanged.sessionId }
107
+ });
108
+ return {
109
+ userId: exchanged.userId,
110
+ sessionId: exchanged.sessionId,
111
+ identity: buildSessionIdentity(exchanged.userId, exchanged.sessionId, exchanged.user),
112
+ refreshToken: encodeRefreshToken(exchanged.refreshTokenId, exchanged.sessionId)
113
+ };
114
+ } catch (e) {
115
+ if (e instanceof RefreshFailure) {
116
+ setActiveSpanAttributes({
117
+ "auth.refresh.result": e.code,
118
+ "auth.refresh.failure_reason": e.reason
119
+ });
120
+ log("DEBUG", e.reason);
121
+ return null;
122
+ }
123
+ throw e;
124
+ }
125
+ });
126
+ }
127
+ var RefreshFailure = class extends Error {
128
+ constructor(code, reason) {
129
+ super(reason);
130
+ this.code = code;
131
+ this.reason = reason;
132
+ }
133
+ };
134
+ /**
135
+ * Action-side wrapper: exchange the refresh token via the mutation, then
136
+ * sign the next JWT outside the mutation transaction. See
137
+ * {@link refreshSessionImpl} for the rationale.
138
+ *
139
+ * @internal
140
+ */
141
+ const callRefreshSession = async (ctx, args) => {
142
+ const issuance = await ctx.runMutation(AUTH_STORE_REF, { args: {
143
+ type: "refreshSession",
144
+ ...args
145
+ } });
146
+ if (issuance === null || issuance.refreshToken === null) return null;
147
+ return await finalizeSessionIssuance(ctx.auth.config, issuance);
148
+ };
149
+
150
+ //#endregion
151
+ export { callRefreshSession, refreshSessionImpl, vRefreshSessionArgs };
152
+ //# sourceMappingURL=refresh.js.map