@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,98 @@
1
+ import { checkOAuthGrant } from "./grant.js";
2
+
3
+ //#region src/server/oauth/authorize.ts
4
+ function jsonError(status, error, description) {
5
+ return new Response(JSON.stringify({
6
+ error,
7
+ error_description: description
8
+ }), {
9
+ status,
10
+ headers: { "Content-Type": "application/json" }
11
+ });
12
+ }
13
+ /**
14
+ * Validate an RFC 8707 `resource` indicator: it must be an absolute URI with an
15
+ * `http`/`https` scheme and no fragment. The value is an audience identifier for
16
+ * the protected resource (e.g. the MCP endpoint URL), not a fetch target.
17
+ *
18
+ * @see https://www.rfc-editor.org/rfc/rfc8707
19
+ */
20
+ function isValidResourceIndicator(resource) {
21
+ let url;
22
+ try {
23
+ url = new URL(resource);
24
+ } catch {
25
+ return false;
26
+ }
27
+ if (url.hash !== "") return false;
28
+ return url.protocol === "https:" || url.protocol === "http:";
29
+ }
30
+ /**
31
+ * Redirect an OAuth error back to a registered `redirect_uri`. The parse is
32
+ * guarded so a malformed (yet registered) URI yields a 400 rather than a 500.
33
+ */
34
+ function oauthError(redirectUri, error, state) {
35
+ try {
36
+ const url = new URL(redirectUri);
37
+ url.searchParams.set("error", error);
38
+ if (state) url.searchParams.set("state", state);
39
+ return Response.redirect(url.toString(), 302);
40
+ } catch {
41
+ return jsonError(400, "invalid_request", "Invalid redirect_uri.");
42
+ }
43
+ }
44
+ /**
45
+ * Build the `GET /oauth2/authorize` request handler.
46
+ *
47
+ * The client and `redirect_uri` registration are validated before any redirect:
48
+ * an unknown client or unregistered `redirect_uri` yields a direct error
49
+ * response, never a redirect, to avoid an open redirect (RFC 6749 §3.1.2.4,
50
+ * RFC 9700). Only once `redirect_uri` is a registered value are subsequent
51
+ * validation failures surfaced back via redirect. Requires PKCE `S256`. The
52
+ * client-grant predicate is shared with the consent mutation and token endpoint
53
+ * via {@link checkOAuthGrant}; only the error formatting differs per boundary.
54
+ *
55
+ * @see https://www.rfc-editor.org/rfc/rfc6749#section-3.1.2.4
56
+ * @see https://www.rfc-editor.org/rfc/rfc9700
57
+ * @internal
58
+ */
59
+ function createAuthorizeHandler(deps) {
60
+ return async (ctx, request) => {
61
+ const p = new URL(request.url).searchParams;
62
+ const clientId = p.get("client_id");
63
+ const redirectUri = p.get("redirect_uri");
64
+ const responseType = p.get("response_type");
65
+ const scope = p.get("scope") ?? "";
66
+ const state = p.get("state");
67
+ const codeChallenge = p.get("code_challenge");
68
+ const codeChallengeMethod = p.get("code_challenge_method");
69
+ const resource = p.get("resource");
70
+ if (!clientId || !redirectUri || !codeChallenge) return jsonError(400, "invalid_request", "Missing required parameter.");
71
+ const check = checkOAuthGrant({
72
+ client: await deps.getClient(ctx, clientId),
73
+ grantType: "authorization_code",
74
+ redirectUri,
75
+ requestedScopes: scope ? scope.split(" ").filter(Boolean) : []
76
+ });
77
+ if (!check.ok && check.denial.reason === "client_not_found") return jsonError(401, "invalid_client", "Unknown or inactive client.");
78
+ if (!check.ok && check.denial.reason === "redirect_uri_mismatch") return jsonError(400, "invalid_request", "redirect_uri mismatch.");
79
+ if (responseType !== "code") return oauthError(redirectUri, "unsupported_response_type", state);
80
+ if (codeChallengeMethod !== "S256") return oauthError(redirectUri, "invalid_request", state);
81
+ if (!check.ok && check.denial.reason === "grant_type_not_allowed") return oauthError(redirectUri, "unauthorized_client", state);
82
+ if (!check.ok && check.denial.reason === "scope_not_allowed") return oauthError(redirectUri, "invalid_scope", state);
83
+ if (resource !== null && !isValidResourceIndicator(resource)) return oauthError(redirectUri, "invalid_target", state);
84
+ const authorizeUrl = new URL(deps.consentPage, deps.authSiteUrl());
85
+ authorizeUrl.searchParams.set("client_id", clientId);
86
+ authorizeUrl.searchParams.set("scope", scope);
87
+ authorizeUrl.searchParams.set("redirect_uri", redirectUri);
88
+ authorizeUrl.searchParams.set("code_challenge", codeChallenge);
89
+ authorizeUrl.searchParams.set("code_challenge_method", "S256");
90
+ if (state) authorizeUrl.searchParams.set("state", state);
91
+ if (resource !== null) authorizeUrl.searchParams.set("resource", resource);
92
+ return Response.redirect(authorizeUrl.toString(), 302);
93
+ };
94
+ }
95
+
96
+ //#endregion
97
+ export { createAuthorizeHandler };
98
+ //# sourceMappingURL=authorize.js.map
@@ -0,0 +1,93 @@
1
+ import { vOAuthClientDoc } from "../../component/model.js";
2
+ import "../component/api.js";
3
+ import { ComponentCtx, ComponentReadCtx } from "../component/context.js";
4
+ import "../config.js";
5
+ import { Infer } from "convex/values";
6
+ import { PaginationResult } from "convex/server";
7
+
8
+ //#region src/server/oauth/client.d.ts
9
+ /**
10
+ * An OAuth client document crossing the component boundary — the single source
11
+ * of truth is `vOAuthClientDoc`. `clientSecretHash` is present iff the client is
12
+ * confidential (server-side only).
13
+ */
14
+ type OAuthClientDoc = Infer<typeof vOAuthClientDoc>;
15
+ /** Token-endpoint auth method stored on a client; `none` marks a public client. */
16
+ type OAuthTokenEndpointAuthMethod = NonNullable<OAuthClientDoc["tokenEndpointAuthMethod"]>;
17
+ /** Fields accepted when registering a client (the `data` payload). */
18
+ type OAuthClientData = {
19
+ name: string;
20
+ redirectUris: string[];
21
+ scopes: string[];
22
+ grantTypes?: string[];
23
+ tokenEndpointAuthMethod?: OAuthTokenEndpointAuthMethod;
24
+ createdBy?: string;
25
+ extend?: Record<string, unknown>;
26
+ };
27
+ /** Mutable client metadata replaced by an RFC 7592 `PUT` (none of it secret). */
28
+ type OAuthClientUpdate = {
29
+ name?: string;
30
+ redirectUris?: string[];
31
+ scopes?: string[];
32
+ grantTypes?: string[];
33
+ tokenEndpointAuthMethod?: OAuthTokenEndpointAuthMethod;
34
+ };
35
+ /** Public API surface for the OAuth client sub-domain. */
36
+ interface OAuthClientDomain {
37
+ /** Register a new OAuth client. Returns the public `clientId`, the one-time
38
+ * `clientSecret` (`cs_*`, omitted for public `none` clients), and the
39
+ * one-time RFC 7592 `registrationAccessToken` (`reg_*`) used to manage it.
40
+ * Store the secrets securely — they cannot be retrieved later. */
41
+ create(ctx: ComponentCtx, args: {
42
+ data: OAuthClientData;
43
+ }): Promise<{
44
+ clientId: string;
45
+ clientSecret?: string;
46
+ registrationAccessToken: string;
47
+ tokenEndpointAuthMethod: OAuthTokenEndpointAuthMethod;
48
+ }>;
49
+ /** Fetch a client by its public `clientId`. Returns `null` if not found. */
50
+ get(ctx: ComponentReadCtx, args: {
51
+ clientId: string;
52
+ }): Promise<OAuthClientDoc | null>;
53
+ /** Replace a client's mutable registration metadata (RFC 7592 `PUT`). The
54
+ * caller is responsible for validating the patch (redirect-uri rules, scope
55
+ * clamping) before calling. */
56
+ update(ctx: ComponentCtx, args: {
57
+ clientId: string;
58
+ patch: OAuthClientUpdate;
59
+ }): Promise<void>;
60
+ /** Verify an RFC 7592 registration access token against the client named by
61
+ * `clientId`. Returns the client doc on a constant-time hash match, else
62
+ * `null` (unknown/revoked client, or no/again-mismatched token). */
63
+ verifyRegistrationToken(ctx: ComponentReadCtx, args: {
64
+ clientId: string;
65
+ token: string;
66
+ }): Promise<OAuthClientDoc | null>;
67
+ /** List clients, optionally filtered by creator. Excludes revoked by default. */
68
+ list(ctx: ComponentReadCtx, args?: {
69
+ where?: {
70
+ createdBy?: string;
71
+ includeRevoked?: boolean;
72
+ };
73
+ paginationOpts?: {
74
+ numItems: number;
75
+ cursor: string | null;
76
+ };
77
+ }): Promise<PaginationResult<OAuthClientDoc>>;
78
+ /** Soft-revoke a client. Revoked clients can no longer obtain tokens. */
79
+ revoke(ctx: ComponentCtx, args: {
80
+ clientId: string;
81
+ }): Promise<{
82
+ clientId: string;
83
+ }>;
84
+ /** Verify a client secret against the stored hash. Returns the client doc
85
+ * on success, `null` on mismatch or if the client is revoked. */
86
+ verify(ctx: ComponentReadCtx, args: {
87
+ clientId: string;
88
+ clientSecret: string;
89
+ }): Promise<OAuthClientDoc | null>;
90
+ }
91
+ //#endregion
92
+ export { OAuthClientDomain };
93
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1,115 @@
1
+ import { constantTimeEqualHex } from "../../shared/compare.js";
2
+ import { cached, invalidateCtxCache } from "../cache/context.js";
3
+ import { generateRandomString } from "../random.js";
4
+ import { emitAuthEvent } from "../events.js";
5
+ import { generateApiKey, hashApiKey } from "../keys.js";
6
+
7
+ //#region src/server/oauth/client.ts
8
+ const CLIENT_ID_ALPHABET = "abcdefghijklmnopqrstuvwxyz0123456789";
9
+ const CLIENT_ID_LENGTH = 24;
10
+ /** @internal */
11
+ function createOAuthClientDomain(deps) {
12
+ const component = deps.component;
13
+ return {
14
+ async create(ctx, { data }) {
15
+ const clientId = "oc_" + generateRandomString(CLIENT_ID_LENGTH, CLIENT_ID_ALPHABET);
16
+ const tokenEndpointAuthMethod = data.tokenEndpointAuthMethod ?? "client_secret_post";
17
+ const secret = tokenEndpointAuthMethod === "none" ? null : await generateApiKey("cs_");
18
+ const { raw: registrationAccessToken, hashedKey: registrationAccessTokenHash } = await generateApiKey("reg_");
19
+ await ctx.runMutation(component.oauth.client.create, {
20
+ clientId,
21
+ clientSecretHash: secret?.hashedKey,
22
+ tokenEndpointAuthMethod,
23
+ registrationAccessTokenHash,
24
+ name: data.name,
25
+ redirectUris: data.redirectUris,
26
+ scopes: data.scopes,
27
+ grantTypes: data.grantTypes ?? ["authorization_code", "refresh_token"],
28
+ createdBy: data.createdBy,
29
+ extend: data.extend
30
+ });
31
+ await emitAuthEvent(ctx, deps, {
32
+ kind: "oauth.client.created",
33
+ actor: data.createdBy ? {
34
+ type: "user",
35
+ id: data.createdBy
36
+ } : { type: "system" },
37
+ subject: {
38
+ type: "oauth_client",
39
+ id: clientId
40
+ },
41
+ targets: [{
42
+ kind: "oauth_client",
43
+ id: clientId
44
+ }, ...data.createdBy ? [{
45
+ kind: "user",
46
+ id: data.createdBy
47
+ }] : []],
48
+ outcome: "success",
49
+ data: {
50
+ clientId,
51
+ name: data.name,
52
+ scopes: data.scopes
53
+ }
54
+ });
55
+ return {
56
+ clientId,
57
+ clientSecret: secret?.raw,
58
+ registrationAccessToken,
59
+ tokenEndpointAuthMethod
60
+ };
61
+ },
62
+ async get(ctx, { clientId }) {
63
+ return await cached(ctx, `oauth-client:${clientId}`, () => ctx.runQuery(component.oauth.client.get, { clientId }));
64
+ },
65
+ async list(ctx, args) {
66
+ return await ctx.runQuery(component.oauth.client.list, {
67
+ where: args?.where,
68
+ paginationOpts: args?.paginationOpts ?? {
69
+ numItems: 50,
70
+ cursor: null
71
+ }
72
+ });
73
+ },
74
+ async revoke(ctx, { clientId }) {
75
+ await ctx.runMutation(component.oauth.client.revoke, { clientId });
76
+ invalidateCtxCache(ctx, `oauth-client:${clientId}`);
77
+ await emitAuthEvent(ctx, deps, {
78
+ kind: "oauth.client.revoked",
79
+ actor: { type: "system" },
80
+ subject: {
81
+ type: "oauth_client",
82
+ id: clientId
83
+ },
84
+ targets: [{
85
+ kind: "oauth_client",
86
+ id: clientId
87
+ }],
88
+ outcome: "success",
89
+ data: { clientId }
90
+ });
91
+ return { clientId };
92
+ },
93
+ async update(ctx, { clientId, patch }) {
94
+ await ctx.runMutation(component.oauth.client.update, {
95
+ clientId,
96
+ patch
97
+ });
98
+ invalidateCtxCache(ctx, `oauth-client:${clientId}`);
99
+ },
100
+ async verify(ctx, { clientId, clientSecret }) {
101
+ const doc = await cached(ctx, `oauth-client:${clientId}`, () => ctx.runQuery(component.oauth.client.get, { clientId }));
102
+ if (!doc || doc.revoked || doc.tokenEndpointAuthMethod === "none" || !doc.clientSecretHash) return null;
103
+ return constantTimeEqualHex(await hashApiKey(clientSecret), doc.clientSecretHash) ? doc : null;
104
+ },
105
+ async verifyRegistrationToken(ctx, { clientId, token }) {
106
+ const doc = await cached(ctx, `oauth-client:${clientId}`, () => ctx.runQuery(component.oauth.client.get, { clientId }));
107
+ if (!doc || doc.revoked || !doc.registrationAccessTokenHash) return null;
108
+ return constantTimeEqualHex(await hashApiKey(token), doc.registrationAccessTokenHash) ? doc : null;
109
+ }
110
+ };
111
+ }
112
+
113
+ //#endregion
114
+ export { createOAuthClientDomain };
115
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1,63 @@
1
+ import { vOAuthCodeDoc } from "../../component/model.js";
2
+ import { ComponentCtx } from "../component/context.js";
3
+ import { Infer } from "convex/values";
4
+
5
+ //#region src/server/oauth/code.d.ts
6
+ /**
7
+ * Stored authorization-code grant consumed at the token endpoint — derived from
8
+ * `vOAuthCodeDoc` (the single source of truth) so it never drifts from storage.
9
+ */
10
+ type OAuthCodeRecord = Infer<typeof vOAuthCodeDoc>;
11
+ /** Public API surface for the OAuth authorization-code sub-domain. */
12
+ interface OAuthCodeDomain {
13
+ /**
14
+ * Record a user's approval of a client's access request and mint a single-use
15
+ * authorization code (plain returned, hash stored). Validates the client grant
16
+ * via the shared {@link checkOAuthGrant} predicate, inserts an `OAuthCode` with
17
+ * the PKCE challenge and TTL, and emits `oauth.code.created`.
18
+ *
19
+ * Call this from an app mutation after confirming the user's intent on the
20
+ * consent page. `userId` MUST be the authenticated caller resolved via
21
+ * `ctx.auth.getUserIdentity()` — never a value from request input, or a client
22
+ * could mint codes for arbitrary users.
23
+ */
24
+ authorize(ctx: ComponentCtx, args: {
25
+ userId: string;
26
+ clientId: string;
27
+ scopes: string[];
28
+ redirectUri: string;
29
+ codeChallenge: string;
30
+ resource?: string;
31
+ state?: string | null;
32
+ }): Promise<{
33
+ code: string;
34
+ redirectUri: string;
35
+ state?: string | null;
36
+ }>;
37
+ /**
38
+ * Accept (consume) a single-use authorization code by its hash, enforcing the
39
+ * `clientId`, `redirectUri`, and PKCE `codeChallenge` bindings in-transaction.
40
+ * Returns the grant, or `null` if the hash is unknown or any binding fails (the
41
+ * code is NOT burned). Throws `OAUTH_CODE_ALREADY_USED` on replay /
42
+ * `OAUTH_CODE_EXPIRED` if stale.
43
+ *
44
+ * When `refresh` is supplied, its grant + token are minted in the SAME
45
+ * transaction that consumes the code, so a refresh-creation failure rolls back
46
+ * the code consumption too (the caller can retry) instead of burning the code
47
+ * and returning an access token with no refresh token. The caller generates the
48
+ * refresh secret (CSPRNG requires an action); only its `tokenHash` is passed.
49
+ */
50
+ accept(ctx: ComponentCtx, args: {
51
+ codeHash: string;
52
+ clientId: string;
53
+ redirectUri: string;
54
+ codeChallenge: string;
55
+ refresh?: {
56
+ tokenHash: string;
57
+ expiresAt: number;
58
+ };
59
+ }): Promise<OAuthCodeRecord | null>;
60
+ }
61
+ //#endregion
62
+ export { OAuthCodeDomain };
63
+ //# sourceMappingURL=code.d.ts.map
@@ -0,0 +1,124 @@
1
+ import { ErrorCode } from "../../shared/codes.js";
2
+ import { cached } from "../cache/context.js";
3
+ import { generateRandomString, sha256 } from "../random.js";
4
+ import { emitAuthEvent } from "../events.js";
5
+ import { checkOAuthGrant } from "./grant.js";
6
+ import { ConvexError } from "convex/values";
7
+
8
+ //#region src/server/oauth/code.ts
9
+ const CODE_LENGTH = 32;
10
+ const CODE_ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
11
+ const CODE_TTL_MS = 120 * 1e3;
12
+ /** Map a grant denial to a `ConvexError` for the post-consent (mutation) boundary. */
13
+ const GRANT_ERROR = {
14
+ client_not_found: {
15
+ code: ErrorCode.OAUTH_CLIENT_NOT_FOUND,
16
+ message: "Unknown or inactive OAuth client."
17
+ },
18
+ redirect_uri_mismatch: {
19
+ code: ErrorCode.OAUTH_REDIRECT_URI_MISMATCH,
20
+ message: "redirect_uri not registered for this client."
21
+ },
22
+ grant_type_not_allowed: {
23
+ code: ErrorCode.OAUTH_GRANT_TYPE_NOT_ALLOWED,
24
+ message: "authorization_code grant is not allowed for this client."
25
+ },
26
+ scope_not_allowed: {
27
+ code: ErrorCode.OAUTH_SCOPE_NOT_ALLOWED,
28
+ message: "Scope not permitted for this client."
29
+ }
30
+ };
31
+ function oauthGrantConvexError(denial) {
32
+ return new ConvexError(GRANT_ERROR[denial.reason]);
33
+ }
34
+ /**
35
+ * Harden the library boundary for {@link OAuthCodeDomain.authorize}: the minted
36
+ * authorization code is bound to `userId`, so that id MUST be the authenticated
37
+ * caller — never a value taken from request input, or a client could mint codes
38
+ * for arbitrary users. Resolve the caller from `ctx.auth.getUserIdentity()` and
39
+ * reject unless its subject matches the passed `userId`.
40
+ *
41
+ * `ComponentCtx` is typed only for `runQuery`/`runMutation`, but the documented
42
+ * caller is an authenticated app mutation whose ctx carries `auth`; so the
43
+ * identity is read defensively. A ctx that exposes no identity capability, an
44
+ * unauthenticated caller, or a subject mismatch all fail closed.
45
+ */
46
+ async function assertAuthorizeCallerMatchesUser(ctx, userId) {
47
+ const auth = ctx.auth;
48
+ const identity = typeof auth?.getUserIdentity === "function" ? await auth.getUserIdentity() : void 0;
49
+ if (!identity || identity.subject !== userId) throw new ConvexError({
50
+ code: ErrorCode.NOT_AUTHORIZED,
51
+ message: "oauth.authorize must be called by the authenticated user it authorizes; resolve `userId` from ctx.auth.getUserIdentity() rather than request input."
52
+ });
53
+ }
54
+ /** @internal */
55
+ function createOAuthCodeDomain(deps) {
56
+ const component = deps.component;
57
+ return {
58
+ async authorize(ctx, args) {
59
+ await assertAuthorizeCallerMatchesUser(ctx, args.userId);
60
+ const check = checkOAuthGrant({
61
+ client: await cached(ctx, `oauth-client:${args.clientId}`, () => ctx.runQuery(component.oauth.client.get, { clientId: args.clientId })),
62
+ grantType: "authorization_code",
63
+ redirectUri: args.redirectUri,
64
+ requestedScopes: args.scopes
65
+ });
66
+ if (!check.ok) throw oauthGrantConvexError(check.denial);
67
+ const rawCode = generateRandomString(CODE_LENGTH, CODE_ALPHABET);
68
+ const codeHash = await sha256(rawCode);
69
+ await ctx.runMutation(component.oauth.code.create, {
70
+ codeHash,
71
+ userId: args.userId,
72
+ clientId: args.clientId,
73
+ redirectUri: args.redirectUri,
74
+ scopes: args.scopes,
75
+ codeChallenge: args.codeChallenge,
76
+ resource: args.resource,
77
+ expiresAt: Date.now() + CODE_TTL_MS
78
+ });
79
+ await emitAuthEvent(ctx, deps, {
80
+ kind: "oauth.code.created",
81
+ actor: {
82
+ type: "user",
83
+ id: args.userId
84
+ },
85
+ subject: {
86
+ type: "oauth_code",
87
+ id: codeHash
88
+ },
89
+ targets: [{
90
+ kind: "oauth_client",
91
+ id: args.clientId
92
+ }, {
93
+ kind: "user",
94
+ id: args.userId
95
+ }],
96
+ outcome: "success",
97
+ data: {
98
+ clientId: args.clientId,
99
+ codeId: codeHash,
100
+ scopes: args.scopes,
101
+ redirectUri: args.redirectUri
102
+ }
103
+ });
104
+ return {
105
+ code: rawCode,
106
+ redirectUri: args.redirectUri,
107
+ state: args.state
108
+ };
109
+ },
110
+ async accept(ctx, { codeHash, clientId, redirectUri, codeChallenge, refresh }) {
111
+ return await ctx.runMutation(component.oauth.code.accept, {
112
+ codeHash,
113
+ clientId,
114
+ redirectUri,
115
+ codeChallenge,
116
+ ...refresh === void 0 ? {} : { refresh }
117
+ });
118
+ }
119
+ };
120
+ }
121
+
122
+ //#endregion
123
+ export { createOAuthCodeDomain };
124
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1,23 @@
1
+ import { OAuthClientDomain } from "./client.js";
2
+ import { OAuthCodeDomain } from "./code.js";
3
+ import { OAuthRefreshDomain } from "./refresh.js";
4
+
5
+ //#region src/server/oauth/domain.d.ts
6
+ /**
7
+ * The full `auth.oauth` runtime surface (app-as-IdP; LEXICON §8a). Pins every
8
+ * namespace to its domain interface, the way `connection`/`event` are pinned in
9
+ * the auth runtime, so the surface is documented in one place and never drifts.
10
+ */
11
+ interface OAuthRuntimeDomain {
12
+ /** OAuth client registry: `create`/`get`/`list`/`revoke`/`verify`. */
13
+ client: OAuthClientDomain;
14
+ /** Authorization-code lifecycle: `authorize` (mint) + `accept` (consume). */
15
+ code: OAuthCodeDomain;
16
+ /** Rotating refresh tokens: `create`/`exchange`/`revoke`. */
17
+ refresh: OAuthRefreshDomain;
18
+ /** Consent shortcut — alias of `code.authorize`; preserves `auth.oauth.authorize(ctx, …)`. */
19
+ authorize: OAuthCodeDomain["authorize"];
20
+ }
21
+ //#endregion
22
+ export { OAuthRuntimeDomain };
23
+ //# sourceMappingURL=domain.d.ts.map
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,46 @@
1
+ import { normalizeOAuthTokenResponse } from "./normalize.js";
2
+
3
+ //#region src/server/oauth/factory.ts
4
+ function normalizeTokens(tokens) {
5
+ return normalizeOAuthTokenResponse(tokens.data);
6
+ }
7
+ function createArcticOAuthClient(provider, options) {
8
+ const getProvider = (redirectUri) => typeof provider === "function" ? provider(redirectUri) : provider;
9
+ const pkce = options?.pkce ?? (getProvider().createAuthorizationURL.length >= 3 ? "required" : "never");
10
+ return {
11
+ pkce,
12
+ createAuthorizationURL({ state, codeVerifier, scopes, nonce, redirectUri }) {
13
+ const provider$1 = getProvider(redirectUri);
14
+ const url = pkce !== "never" ? provider$1.createAuthorizationURL(state, codeVerifier, scopes) : provider$1.createAuthorizationURL(state, scopes);
15
+ if (nonce !== void 0) url.searchParams.set("nonce", nonce);
16
+ return url;
17
+ },
18
+ async validateAuthorizationCode({ code, codeVerifier, redirectUri }) {
19
+ const provider$1 = getProvider(redirectUri);
20
+ return normalizeTokens(pkce !== "never" ? await provider$1.validateAuthorizationCode(code, codeVerifier) : await provider$1.validateAuthorizationCode(code));
21
+ }
22
+ };
23
+ }
24
+ /**
25
+ * Materialize a validated OAuth provider definition for internal auth runtime use.
26
+ *
27
+ * @internal
28
+ */
29
+ function createOAuthProvider(config) {
30
+ if (!config.provider || typeof config.provider.createAuthorizationURL !== "function" || typeof config.provider.validateAuthorizationCode !== "function") throw new Error(`OAuth provider "${config.id}" must expose createAuthorizationURL() and validateAuthorizationCode().`);
31
+ return {
32
+ id: config.id,
33
+ type: "oauth",
34
+ provider: config.provider,
35
+ scopes: [...config.scopes],
36
+ profile: config.profile,
37
+ nonce: config.nonce,
38
+ validateTokens: config.validateTokens,
39
+ accountLinking: config.accountLinking,
40
+ updateProfileOnLogin: config.updateProfileOnLogin
41
+ };
42
+ }
43
+
44
+ //#endregion
45
+ export { createArcticOAuthClient, createOAuthProvider };
46
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1,46 @@
1
+ //#region src/server/oauth/grant.ts
2
+ /**
3
+ * The single source of truth for "client active, redirect_uri registered, grant
4
+ * type allowed, requested scopes ⊆ client.scopes". Pure — the caller loads
5
+ * `client` through its own trust path (cached `getClient`, or `verifyClientSecret`)
6
+ * and formats `denial` per its boundary; the security checks are NOT collapsed,
7
+ * only the duplicated predicate.
8
+ *
9
+ * Check order is fixed (client → redirect_uri → grant_type → scope), matching
10
+ * what all three call sites already do. `redirectUri` is omitted for grants
11
+ * without a redirect (`client_credentials`). On success, `scopes` is the
12
+ * resolved effective set: the requested scopes, or — when `requestedScopes` is
13
+ * empty and `grantType` is `client_credentials` — the client's full set.
14
+ */
15
+ function checkOAuthGrant(args) {
16
+ const { client, grantType, redirectUri, requestedScopes } = args;
17
+ if (!client || client.revoked) return {
18
+ ok: false,
19
+ denial: { reason: "client_not_found" }
20
+ };
21
+ if (redirectUri !== void 0 && !client.redirectUris.includes(redirectUri)) return {
22
+ ok: false,
23
+ denial: { reason: "redirect_uri_mismatch" }
24
+ };
25
+ if (!client.grantTypes.includes(grantType)) return {
26
+ ok: false,
27
+ denial: { reason: "grant_type_not_allowed" }
28
+ };
29
+ const disallowed = requestedScopes.filter((s) => !client.scopes.includes(s));
30
+ if (disallowed.length > 0) return {
31
+ ok: false,
32
+ denial: {
33
+ reason: "scope_not_allowed",
34
+ disallowed
35
+ }
36
+ };
37
+ return {
38
+ ok: true,
39
+ client,
40
+ scopes: requestedScopes.length > 0 ? requestedScopes : grantType === "client_credentials" ? client.scopes : requestedScopes
41
+ };
42
+ }
43
+
44
+ //#endregion
45
+ export { checkOAuthGrant };
46
+ //# sourceMappingURL=grant.js.map