@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,366 @@
1
+ import { retryWithBackoff } from "../../shared/retry.js";
2
+ import { log } from "../log.js";
3
+ import { withSpan } from "../utils/span.js";
4
+ import { assertSafeIdpFetchUrl, assertSafeIdpHost } from "../../shared/fetch/guard.js";
5
+ import { normalizeOAuthTokenResponse } from "../oauth/normalize.js";
6
+ import { createCache } from "../utils/cache.js";
7
+ import { finalizeNormalizedProfile, normalizeStringArray } from "./profile.js";
8
+ import { getGroupOidcUrls, groupOidcProviderId } from "./shared.js";
9
+ import { sha256 } from "@oslojs/crypto/sha2";
10
+ import { encodeBase64, encodeBase64urlNoPadding } from "@oslojs/encoding";
11
+ import { createRemoteJWKSet, customFetch, decodeProtectedHeader, jwtVerify } from "jose";
12
+
13
+ //#region src/server/connection/oidc.ts
14
+ const OIDC_JWKS_CACHE = createCache({
15
+ capacity: 128,
16
+ timeToLiveMs: 3600 * 1e3,
17
+ lookup: (cacheKey) => {
18
+ const key = JSON.parse(cacheKey);
19
+ const fetchImpl = key.runtimeOrigin !== void 0 || key.externalHost !== void 0 ? createGroupConnectionOidcFetchFromParts(key.runtimeOrigin, key.externalHost) : void 0;
20
+ return fetchImpl ? createRemoteJWKSet(new URL(key.url), { [customFetch]: fetchImpl }) : createRemoteJWKSet(new URL(key.url));
21
+ }
22
+ });
23
+ function validateOidcDiscovery(data) {
24
+ if (typeof data !== "object" || data === null) throw new Error("OIDC discovery response is not an object.");
25
+ const obj = data;
26
+ if (typeof obj.issuer !== "string") throw new Error("OIDC discovery is missing 'issuer'.");
27
+ if (typeof obj.authorization_endpoint !== "string") throw new Error("OIDC discovery is missing 'authorization_endpoint'.");
28
+ if (typeof obj.token_endpoint !== "string") throw new Error("OIDC discovery is missing 'token_endpoint'.");
29
+ if (typeof obj.jwks_uri !== "string") throw new Error("OIDC discovery is missing 'jwks_uri'.");
30
+ return {
31
+ issuer: obj.issuer,
32
+ authorization_endpoint: obj.authorization_endpoint,
33
+ token_endpoint: obj.token_endpoint,
34
+ jwks_uri: obj.jwks_uri,
35
+ userinfo_endpoint: typeof obj.userinfo_endpoint === "string" ? obj.userinfo_endpoint : void 0,
36
+ token_endpoint_auth_methods_supported: Array.isArray(obj.token_endpoint_auth_methods_supported) ? obj.token_endpoint_auth_methods_supported.filter((v) => typeof v === "string") : void 0,
37
+ id_token_signing_alg_values_supported: Array.isArray(obj.id_token_signing_alg_values_supported) ? obj.id_token_signing_alg_values_supported.filter((v) => typeof v === "string") : void 0
38
+ };
39
+ }
40
+ function validateOidcUserInfo(data) {
41
+ if (typeof data !== "object" || data === null) return {};
42
+ const obj = data;
43
+ return {
44
+ sub: typeof obj.sub === "string" ? obj.sub : void 0,
45
+ email: typeof obj.email === "string" ? obj.email : void 0,
46
+ email_verified: typeof obj.email_verified === "boolean" ? obj.email_verified : void 0,
47
+ name: typeof obj.name === "string" ? obj.name : void 0,
48
+ picture: typeof obj.picture === "string" ? obj.picture : void 0,
49
+ groups: obj.groups,
50
+ roles: obj.roles
51
+ };
52
+ }
53
+ const asError = (error) => error instanceof Error ? error : new Error(String(error));
54
+ function resolveOidcAuthMethod(client, discoveredMethods) {
55
+ if (client.authMethod === "client_secret_basic" || client.authMethod === "client_secret_post") return client.authMethod;
56
+ return discoveredMethods.includes("client_secret_basic") ? "client_secret_basic" : "client_secret_post";
57
+ }
58
+ function normalizeOidcIssuer(value) {
59
+ return typeof value === "string" ? value.replace(/\/$/, "") : "";
60
+ }
61
+ function getOidcSections(config) {
62
+ return {
63
+ discovery: typeof config.discovery === "object" && config.discovery !== null ? config.discovery : {},
64
+ client: typeof config.client === "object" && config.client !== null ? config.client : {},
65
+ request: typeof config.request === "object" && config.request !== null ? config.request : {},
66
+ security: typeof config.security === "object" && config.security !== null ? config.security : {},
67
+ profile: typeof config.profile === "object" && config.profile !== null ? config.profile : {}
68
+ };
69
+ }
70
+ async function discoverOidcConfiguration(ctx, componentConnection, config) {
71
+ const { discovery } = getOidcSections(config);
72
+ const discoveryUrl = typeof discovery.discoveryUrl === "string" ? discovery.discoveryUrl : typeof discovery.issuer === "string" ? `${discovery.issuer.replace(/\/$/, "")}/.well-known/openid-configuration` : null;
73
+ if (!discoveryUrl) throw new Error("Group connection OIDC requires an issuer or discoveryUrl.");
74
+ const runtimeOrigin = typeof discovery.discoveryUrl === "string" ? new URL(discovery.discoveryUrl).origin : void 0;
75
+ const externalHost = typeof discovery.issuer === "string" ? new URL(discovery.issuer).host : void 0;
76
+ assertSafeIdpFetchUrl(discoveryUrl);
77
+ return withSpan("convex-auth.connection.oidc.discovery", {}, async () => {
78
+ return retryWithBackoff(async () => {
79
+ return validateOidcDiscovery(await ctx.runAction(componentConnection.cache.oidcDiscovery, {
80
+ url: discoveryUrl,
81
+ runtimeOrigin,
82
+ externalHost
83
+ }));
84
+ }, {
85
+ maxRetries: 2,
86
+ baseMs: 200
87
+ });
88
+ });
89
+ }
90
+ function createGroupConnectionOidcFetch(config, discoveredIssuer) {
91
+ const { discovery } = getOidcSections(config);
92
+ return createGroupConnectionOidcFetchFromParts(typeof discovery.discoveryUrl === "string" ? new URL(discovery.discoveryUrl).origin : void 0, typeof discovery.issuer === "string" ? new URL(discovery.issuer).host : typeof discoveredIssuer === "string" ? new URL(discoveredIssuer).host : void 0);
93
+ }
94
+ function createGroupConnectionOidcFetchFromParts(runtimeOrigin, externalHost) {
95
+ return async (input, init) => {
96
+ const url = new URL(typeof input === "string" ? input : input.toString());
97
+ const rewrittenUrl = runtimeOrigin !== void 0 && url.origin !== runtimeOrigin ? new URL(`${runtimeOrigin}${url.pathname}${url.search}`) : url;
98
+ const headers = new Headers(init?.headers);
99
+ if (runtimeOrigin !== void 0 && externalHost !== void 0) {
100
+ assertSafeIdpHost(externalHost);
101
+ headers.set("host", externalHost);
102
+ }
103
+ assertSafeIdpFetchUrl(rewrittenUrl.toString());
104
+ return await fetch(rewrittenUrl, {
105
+ ...init,
106
+ headers,
107
+ redirect: "manual"
108
+ });
109
+ };
110
+ }
111
+ function normalizeOidcProfile(claims, mapping) {
112
+ const getMapped = (key) => typeof key === "string" ? claims[key] : void 0;
113
+ return finalizeNormalizedProfile({
114
+ id: (typeof getMapped(mapping?.subject) === "string" ? getMapped(mapping?.subject) : void 0) ?? (typeof claims.sub === "string" ? claims.sub : crypto.randomUUID()),
115
+ email: (typeof getMapped(mapping?.email) === "string" ? getMapped(mapping?.email) : void 0) ?? (typeof claims.email === "string" ? claims.email : void 0),
116
+ emailVerified: (typeof getMapped(mapping?.emailVerified) === "boolean" ? getMapped(mapping?.emailVerified) : void 0) ?? (typeof claims.email_verified === "boolean" ? claims.email_verified : void 0),
117
+ name: (typeof getMapped(mapping?.name) === "string" ? getMapped(mapping?.name) : void 0) ?? (typeof claims.name === "string" ? claims.name : void 0),
118
+ image: (typeof getMapped(mapping?.image) === "string" ? getMapped(mapping?.image) : void 0) ?? (typeof claims.picture === "string" ? claims.picture : void 0),
119
+ groups: normalizeStringArray(getMapped(mapping?.groups)),
120
+ roles: normalizeStringArray(getMapped(mapping?.roles))
121
+ });
122
+ }
123
+ function getOidcJwks(url, runtimeOrigin, externalHost, fetchImpl) {
124
+ const cacheKey = JSON.stringify({
125
+ url,
126
+ runtimeOrigin: fetchImpl ? runtimeOrigin : void 0,
127
+ externalHost: fetchImpl ? externalHost : void 0
128
+ });
129
+ return OIDC_JWKS_CACHE.get(cacheKey);
130
+ }
131
+ async function userInfoProfile(opts) {
132
+ return withSpan("convex-auth.connection.oidc.userinfo", {}, async () => {
133
+ let userInfo;
134
+ try {
135
+ const response = await (opts.fetchImpl ?? fetch)(opts.endpoint, { headers: { Authorization: `Bearer ${opts.accessToken}` } });
136
+ if (!response.ok) throw new Error(`OIDC userinfo request failed: ${response.status}`);
137
+ userInfo = validateOidcUserInfo(await response.json());
138
+ } catch {
139
+ return null;
140
+ }
141
+ const userInfoSubject = typeof userInfo.sub === "string" ? userInfo.sub : void 0;
142
+ const tokenSubject = typeof opts.verifiedClaims.sub === "string" ? opts.verifiedClaims.sub : void 0;
143
+ if (userInfoSubject !== void 0 && tokenSubject !== void 0 && userInfoSubject !== tokenSubject) throw new Error("OIDC userinfo subject does not match ID token subject.");
144
+ return {
145
+ id: userInfoSubject ?? (typeof opts.verifiedClaims.sub === "string" ? opts.verifiedClaims.sub : void 0) ?? crypto.randomUUID(),
146
+ email: typeof userInfo.email === "string" ? userInfo.email : opts.verifiedProfile.email,
147
+ emailVerified: typeof userInfo.email_verified === "boolean" ? userInfo.email_verified : opts.verifiedProfile.emailVerified,
148
+ name: typeof userInfo.name === "string" ? userInfo.name : opts.verifiedProfile.name,
149
+ image: typeof userInfo.picture === "string" ? userInfo.picture : opts.verifiedProfile.image,
150
+ groups: normalizeStringArray(userInfo.groups) ?? opts.verifiedProfile.groups,
151
+ roles: normalizeStringArray(userInfo.roles) ?? opts.verifiedProfile.roles
152
+ };
153
+ });
154
+ }
155
+ /**
156
+ * Build the OIDC authorization-code provider and oauth config for a group
157
+ * connection from its discovery document and stored config.
158
+ *
159
+ * The authorization URL always uses PKCE with `S256` and a nonce, and rejects
160
+ * attempts to override reserved OAuth parameters. Token validation requires the
161
+ * nonce, verifies the ID token against the JWKS (or the client secret for
162
+ * advertised HS* algorithms), and enforces the audience, the issuer (against
163
+ * the configured/discovered issuer set; exact match when `strictIssuer`), the
164
+ * nonce, and `azp` when present. UserInfo results are rejected if their subject
165
+ * disagrees with the ID token's.
166
+ *
167
+ * @see https://openid.net/specs/openid-connect-core-1_0.html
168
+ * @internal
169
+ */
170
+ async function createGroupConnectionOidcProvider(ctx, componentConnection, config, redirectUri) {
171
+ const { discovery: discoveryConfig, client, request, security, profile } = getOidcSections(config);
172
+ const discovery = await discoverOidcConfiguration(ctx, componentConnection, config);
173
+ const discoveredIssuer = normalizeOidcIssuer(discovery.issuer);
174
+ const expectedIssuer = typeof discoveryConfig.issuer === "string" ? normalizeOidcIssuer(discoveryConfig.issuer) : discoveredIssuer;
175
+ const strictIssuer = security.strictIssuer === true;
176
+ if (typeof discoveryConfig.issuer === "string" && expectedIssuer !== discoveredIssuer) {
177
+ if (strictIssuer) throw new Error(`Configured OIDC issuer mismatch. configured=${expectedIssuer} discovery=${discoveredIssuer}`);
178
+ log("WARN", "Configured OIDC issuer differs from discovery issuer; accepting both for token verification.", {
179
+ configuredIssuer: expectedIssuer,
180
+ discoveryIssuer: discoveredIssuer
181
+ });
182
+ }
183
+ const authorizationEndpoint = discovery.authorization_endpoint;
184
+ const tokenEndpoint = discovery.token_endpoint;
185
+ const jwksUri = typeof discoveryConfig.jwksUri === "string" ? discoveryConfig.jwksUri : typeof discovery.jwks_uri === "string" ? discovery.jwks_uri : "";
186
+ const supportedIdTokenSigningAlgs = Array.isArray(discovery.id_token_signing_alg_values_supported) ? discovery.id_token_signing_alg_values_supported.filter((value) => typeof value === "string") : [];
187
+ const discoveredTokenEndpointAuthMethods = Array.isArray(discovery.token_endpoint_auth_methods_supported) ? discovery.token_endpoint_auth_methods_supported.filter((value) => typeof value === "string") : [];
188
+ const tokenEndpointAuthMethod = resolveOidcAuthMethod(client, discoveredTokenEndpointAuthMethods);
189
+ if (typeof client.authMethod === "string" && discoveredTokenEndpointAuthMethods.length > 0 && !discoveredTokenEndpointAuthMethods.includes(tokenEndpointAuthMethod)) throw new Error(`OIDC token endpoint auth method ${tokenEndpointAuthMethod} is not advertised by discovery.`);
190
+ const userinfoEndpoint = discovery.userinfo_endpoint ?? void 0;
191
+ const claimMapping = typeof profile.mapping === "object" && profile.mapping !== null ? profile.mapping : void 0;
192
+ const oidcFetch = createGroupConnectionOidcFetch(config, discovery.issuer);
193
+ const runtimeOrigin = typeof discoveryConfig.discoveryUrl === "string" ? new URL(discoveryConfig.discoveryUrl).origin : void 0;
194
+ const externalHost = typeof discoveryConfig.issuer === "string" ? new URL(discoveryConfig.issuer).host : typeof discovery.issuer === "string" ? new URL(discovery.issuer).host : void 0;
195
+ const scopes = Array.isArray(request.scopes) ? request.scopes.filter((value) => typeof value === "string") : [
196
+ "openid",
197
+ "profile",
198
+ "email"
199
+ ];
200
+ const expectedAudience = Array.isArray(discoveryConfig.audience) ? discoveryConfig.audience.filter((value) => typeof value === "string") : typeof discoveryConfig.audience === "string" ? discoveryConfig.audience : String(client.id);
201
+ const clockToleranceSeconds = typeof security.clockToleranceSeconds === "number" ? security.clockToleranceSeconds : 10;
202
+ if (clockToleranceSeconds < 0 || clockToleranceSeconds > 300) throw new Error("OIDC clockToleranceSeconds must be between 0 and 300.");
203
+ const expectedIssuers = strictIssuer ? [expectedIssuer] : Array.from(new Set([expectedIssuer, discoveredIssuer]));
204
+ const jwks = getOidcJwks(jwksUri, runtimeOrigin, externalHost, oidcFetch);
205
+ let verifiedClaims = null;
206
+ let verifiedProfile = null;
207
+ const normalizeProfile = (claims) => normalizeOidcProfile(claims, claimMapping);
208
+ return {
209
+ provider: {
210
+ pkce: "required",
211
+ createAuthorizationURL({ state, codeVerifier, scopes: requestedScopes, nonce, loginHint }) {
212
+ if (!codeVerifier) throw new Error("OIDC PKCE requires a code verifier.");
213
+ const url = new URL(authorizationEndpoint);
214
+ url.searchParams.set("response_type", "code");
215
+ url.searchParams.set("client_id", String(client.id));
216
+ url.searchParams.set("redirect_uri", redirectUri);
217
+ url.searchParams.set("scope", (requestedScopes.length > 0 ? requestedScopes : scopes).join(" "));
218
+ url.searchParams.set("state", state);
219
+ url.searchParams.set("code_challenge_method", "S256");
220
+ url.searchParams.set("code_challenge", encodeBase64urlNoPadding(sha256(new TextEncoder().encode(codeVerifier))));
221
+ if (nonce !== void 0) url.searchParams.set("nonce", nonce);
222
+ if (typeof loginHint === "string") url.searchParams.set("login_hint", loginHint);
223
+ const authorizationParams = typeof request.authorizationParams === "object" && request.authorizationParams !== null ? request.authorizationParams : {};
224
+ const reservedAuthorizationParams = new Set([
225
+ "response_type",
226
+ "client_id",
227
+ "redirect_uri",
228
+ "scope",
229
+ "state",
230
+ "code_challenge",
231
+ "code_challenge_method",
232
+ "nonce",
233
+ "login_hint"
234
+ ]);
235
+ for (const [key, value] of Object.entries(authorizationParams)) {
236
+ if (reservedAuthorizationParams.has(key)) throw new Error(`OIDC authorizationParams cannot override reserved parameter: ${key}`);
237
+ if (typeof value === "string") url.searchParams.set(key, value);
238
+ }
239
+ return url;
240
+ },
241
+ async validateAuthorizationCode({ code, codeVerifier }) {
242
+ const body = new URLSearchParams({
243
+ grant_type: "authorization_code",
244
+ code,
245
+ redirect_uri: redirectUri
246
+ });
247
+ const headers = new Headers({ "Content-Type": "application/x-www-form-urlencoded" });
248
+ if (typeof client.secret === "string" && tokenEndpointAuthMethod === "client_secret_basic") {
249
+ const encodeCredential = (value) => encodeURIComponent(value).replace(/%20/g, "+");
250
+ const credentials = `${encodeCredential(String(client.id))}:${encodeCredential(client.secret)}`;
251
+ const basicAuth = encodeBase64(new TextEncoder().encode(credentials));
252
+ headers.set("Authorization", `Basic ${basicAuth}`);
253
+ } else {
254
+ body.set("client_id", String(client.id));
255
+ if (typeof client.secret === "string") body.set("client_secret", client.secret);
256
+ }
257
+ if (codeVerifier) body.set("code_verifier", codeVerifier);
258
+ const response = await oidcFetch(tokenEndpoint, {
259
+ method: "POST",
260
+ headers,
261
+ body
262
+ });
263
+ if (!response.ok) {
264
+ const detail = await response.text();
265
+ throw new Error(`OIDC token exchange failed: ${response.status}${detail ? ` ${detail}` : ""}`);
266
+ }
267
+ return normalizeOAuthTokenResponse(await response.json());
268
+ }
269
+ },
270
+ oauthConfig: {
271
+ scopes,
272
+ nonce: true,
273
+ validateTokens: async (tokens, ctx$1) => {
274
+ if (ctx$1.nonce === void 0) throw new Error("OIDC nonce is required.");
275
+ const idToken = tokens.idToken;
276
+ if (idToken === void 0) throw new Error("OIDC response is missing id_token.");
277
+ const verifiedIdToken = idToken;
278
+ const tokenAlg = decodeProtectedHeader(verifiedIdToken).alg;
279
+ const useSymmetricValidation = typeof tokenAlg === "string" && (tokenAlg === "HS256" || tokenAlg === "HS384" || tokenAlg === "HS512") && supportedIdTokenSigningAlgs.includes(tokenAlg);
280
+ const verificationOptions = {
281
+ audience: expectedAudience,
282
+ requiredClaims: [
283
+ "iss",
284
+ "sub",
285
+ "aud",
286
+ "exp",
287
+ "iat"
288
+ ],
289
+ clockTolerance: clockToleranceSeconds
290
+ };
291
+ let verification;
292
+ try {
293
+ verification = await (useSymmetricValidation ? jwtVerify(verifiedIdToken, (() => {
294
+ if (typeof client.secret !== "string") throw new Error("OIDC provider uses symmetric ID token signatures but clientSecret is missing.");
295
+ return new TextEncoder().encode(client.secret);
296
+ })(), verificationOptions) : jwtVerify(verifiedIdToken, jwks, verificationOptions));
297
+ } catch (error) {
298
+ throw asError(error);
299
+ }
300
+ const payload = verification.payload;
301
+ const tokenIssuerRaw = typeof payload.iss === "string" ? payload.iss : void 0;
302
+ const tokenIssuer = typeof tokenIssuerRaw === "string" ? tokenIssuerRaw.replace(/\/$/, "") : void 0;
303
+ if (!tokenIssuer || !expectedIssuers.includes(tokenIssuer)) throw new Error(`OIDC token issuer mismatch. Received: ${tokenIssuer ?? "<missing>"}. Expected one of: ${expectedIssuers.join(", ")}`);
304
+ if (payload.nonce !== ctx$1.nonce) throw new Error("OIDC nonce mismatch.");
305
+ if (payload.azp !== void 0 && payload.azp !== String(client.id)) throw new Error("OIDC authorized party does not match client ID.");
306
+ verifiedClaims = payload;
307
+ verifiedProfile = normalizeProfile(payload);
308
+ },
309
+ accountLinking: config.accountLinking,
310
+ profile: async (tokens) => {
311
+ if (verifiedProfile === null || verifiedClaims === null) throw new Error("OIDC profile requested before the id_token was verified.");
312
+ if (userinfoEndpoint && typeof tokens.accessToken === "string") {
313
+ const resolvedProfile = await userInfoProfile({
314
+ endpoint: userinfoEndpoint,
315
+ accessToken: tokens.accessToken,
316
+ verifiedClaims,
317
+ verifiedProfile,
318
+ fetchImpl: oidcFetch
319
+ });
320
+ if (resolvedProfile !== null) return resolvedProfile;
321
+ }
322
+ return verifiedProfile;
323
+ }
324
+ }
325
+ };
326
+ }
327
+ /**
328
+ * Build a minimal {@link OAuthMaterializedConfig} (no runtime provider) for a
329
+ * group connection, used where only the provider id and account-linking mode
330
+ * are needed.
331
+ * @internal
332
+ */
333
+ function createSyntheticOAuthMaterializedConfig(providerId, options) {
334
+ return {
335
+ id: providerId,
336
+ type: "oauth",
337
+ provider: null,
338
+ scopes: [],
339
+ accountLinking: options?.accountLinking ?? "sameConnection"
340
+ };
341
+ }
342
+ /**
343
+ * Assemble the per-request OIDC runtime for a group connection: its provider
344
+ * id, the configured provider and oauth config, and the group OIDC URLs.
345
+ * @internal
346
+ */
347
+ async function createGroupConnectionOidcRuntime(opts) {
348
+ const providerId = groupOidcProviderId(opts.connectionId);
349
+ const urls = getGroupOidcUrls({
350
+ rootUrl: opts.rootUrl,
351
+ connectionId: opts.connectionId,
352
+ sharedRedirectURI: opts.sharedRedirectURI
353
+ });
354
+ const { provider, oauthConfig } = await createGroupConnectionOidcProvider(opts.ctx, opts.componentConnection, opts.oidc, urls.callbackUrl);
355
+ return {
356
+ oidc: opts.oidc,
357
+ providerId,
358
+ provider,
359
+ oauthConfig,
360
+ ...urls
361
+ };
362
+ }
363
+
364
+ //#endregion
365
+ export { createGroupConnectionOidcRuntime, createSyntheticOAuthMaterializedConfig };
366
+ //# sourceMappingURL=oidc.js.map
@@ -0,0 +1,59 @@
1
+ import { ErrorCode } from "../../../shared/codes.js";
2
+ import { convexError } from "../../errors.js";
3
+ import { getGroup } from "../../contract.js";
4
+ import { patchGroupConnectionPolicy } from "../policy.js";
5
+
6
+ //#region src/server/connection/policy/domain.ts
7
+ function createGroupPolicyDomain(deps) {
8
+ const { config, loadGroupPolicyOrThrow, validateGroupConnectionPolicy, emitGroupAuthEvent } = deps;
9
+ return {
10
+ get: async (ctx, args) => {
11
+ return await loadGroupPolicyOrThrow(ctx, args.groupId);
12
+ },
13
+ update: async (ctx, args) => {
14
+ const { groupId } = args;
15
+ const group = await getGroup(ctx, config.component.group, groupId);
16
+ if (!group) throw convexError(ErrorCode.INVALID_PARAMETERS, "Group not found.");
17
+ const policy = patchGroupConnectionPolicy(group.policy, args.patch);
18
+ await ctx.runMutation(config.component.group.update, {
19
+ id: groupId,
20
+ patch: { policy }
21
+ });
22
+ await emitGroupAuthEvent(ctx, {
23
+ groupId,
24
+ kind: "connection.policy.updated",
25
+ actor: { type: "system" },
26
+ subject: {
27
+ type: "group",
28
+ id: groupId
29
+ },
30
+ data: { version: policy.version }
31
+ });
32
+ return policy;
33
+ },
34
+ validate: async (ctx, args) => {
35
+ const { groupId } = args;
36
+ if (!await getGroup(ctx, config.component.group, groupId)) return {
37
+ ok: false,
38
+ groupId,
39
+ checks: [{
40
+ name: "group_exists",
41
+ ok: false,
42
+ message: "Group not found."
43
+ }]
44
+ };
45
+ const policy = await loadGroupPolicyOrThrow(ctx, groupId);
46
+ const checks = validateGroupConnectionPolicy(policy);
47
+ return {
48
+ ok: checks.every((check) => check.ok),
49
+ groupId,
50
+ policy,
51
+ checks
52
+ };
53
+ }
54
+ };
55
+ }
56
+
57
+ //#endregion
58
+ export { createGroupPolicyDomain };
59
+ //# sourceMappingURL=domain.js.map
@@ -0,0 +1 @@
1
+ import "../types.js";
@@ -0,0 +1,163 @@
1
+ import { asRecord } from "./shared.js";
2
+
3
+ //#region src/server/connection/policy.ts
4
+ const DEFAULT_GROUP_CONNECTION_POLICY = {
5
+ version: 1,
6
+ identity: { accountLinking: {
7
+ oidc: "sameConnection",
8
+ saml: "sameConnection"
9
+ } },
10
+ provisioning: {
11
+ user: {
12
+ createOnSignIn: true,
13
+ updateProfileOnLogin: "missing",
14
+ updateProfileFromScim: "always",
15
+ authority: "app"
16
+ },
17
+ scimReuse: { user: "externalId" },
18
+ jit: {
19
+ mode: "createUserAndMembership",
20
+ defaultRoleIds: []
21
+ },
22
+ deprovision: { mode: "soft" },
23
+ groups: {
24
+ mode: "ignore",
25
+ source: "protocol"
26
+ },
27
+ roles: {
28
+ mode: "ignore",
29
+ source: "protocol"
30
+ }
31
+ }
32
+ };
33
+ /** Accept a value only if it's one of the allowed options, otherwise return the fallback. */
34
+ function oneOf(value, allowed, fallback) {
35
+ return allowed.includes(value) ? value : fallback;
36
+ }
37
+ /** Parse an object whose values are string arrays (e.g. group→roleIds mapping). */
38
+ function parseStringArrayMapping(raw) {
39
+ if (typeof raw !== "object" || raw === null) return void 0;
40
+ return Object.fromEntries(Object.entries(raw).filter(([key, value]) => typeof key === "string" && Array.isArray(value)).map(([key, value]) => [key, Array.from(new Set(value.filter((item) => typeof item === "string" && item.length > 0)))]));
41
+ }
42
+ function normalizeGroupConnectionPolicy(policy) {
43
+ const d = DEFAULT_GROUP_CONNECTION_POLICY;
44
+ const input = asRecord(policy) ?? {};
45
+ const accountLinking = asRecord((asRecord(input.identity) ?? {}).accountLinking) ?? {};
46
+ const provisioning = asRecord(input.provisioning) ?? {};
47
+ const scimReuse = asRecord(provisioning.scimReuse) ?? {};
48
+ const user = asRecord(provisioning.user) ?? {};
49
+ const jit = asRecord(provisioning.jit) ?? {};
50
+ const deprovision = asRecord(provisioning.deprovision) ?? {};
51
+ const groups = asRecord(provisioning.groups) ?? {};
52
+ const roles = asRecord(provisioning.roles) ?? {};
53
+ const extend = asRecord(input.extend) ?? void 0;
54
+ const groupsMapping = parseStringArrayMapping(groups.mapping);
55
+ const rolesMapping = parseStringArrayMapping(roles.mapping);
56
+ return {
57
+ version: 1,
58
+ identity: { accountLinking: {
59
+ oidc: oneOf(accountLinking.oidc, [
60
+ "none",
61
+ "verifiedEmail",
62
+ "sameConnection"
63
+ ], d.identity.accountLinking.oidc),
64
+ saml: oneOf(accountLinking.saml, [
65
+ "none",
66
+ "verifiedEmail",
67
+ "sameConnection"
68
+ ], d.identity.accountLinking.saml)
69
+ } },
70
+ provisioning: {
71
+ user: {
72
+ createOnSignIn: typeof user.createOnSignIn === "boolean" ? user.createOnSignIn : d.provisioning.user.createOnSignIn,
73
+ updateProfileOnLogin: oneOf(user.updateProfileOnLogin, ["never", "always"], d.provisioning.user.updateProfileOnLogin),
74
+ updateProfileFromScim: oneOf(user.updateProfileFromScim, ["never", "missing"], d.provisioning.user.updateProfileFromScim),
75
+ authority: oneOf(user.authority, ["connection", "scim"], d.provisioning.user.authority)
76
+ },
77
+ scimReuse: { user: oneOf(scimReuse.user, ["none"], d.provisioning.scimReuse.user) },
78
+ jit: {
79
+ mode: oneOf(jit.mode, [
80
+ "off",
81
+ "createUser",
82
+ "createUserAndMembership"
83
+ ], d.provisioning.jit.mode),
84
+ defaultRoleIds: Array.isArray(jit.defaultRoleIds) ? Array.from(new Set(jit.defaultRoleIds.filter((value) => typeof value === "string" && value.length > 0))) : typeof jit.defaultRole === "string" && jit.defaultRole.length > 0 ? [jit.defaultRole] : d.provisioning.jit.defaultRoleIds
85
+ },
86
+ deprovision: { mode: oneOf(deprovision.mode, ["hard"], d.provisioning.deprovision.mode) },
87
+ groups: {
88
+ mode: oneOf(groups.mode, ["sync"], d.provisioning.groups.mode),
89
+ source: "protocol",
90
+ ...groupsMapping ? { mapping: groupsMapping } : {}
91
+ },
92
+ roles: {
93
+ mode: oneOf(roles.mode, ["map"], d.provisioning.roles.mode),
94
+ source: "protocol",
95
+ ...rolesMapping ? { mapping: rolesMapping } : {}
96
+ }
97
+ },
98
+ ...extend ? { extend } : {}
99
+ };
100
+ }
101
+ function patchGroupConnectionPolicy(current, patch) {
102
+ const base = normalizeGroupConnectionPolicy(current);
103
+ return normalizeGroupConnectionPolicy({
104
+ ...base,
105
+ ...patch,
106
+ identity: {
107
+ ...base.identity,
108
+ ...patch.identity,
109
+ accountLinking: {
110
+ ...base.identity.accountLinking,
111
+ ...patch.identity?.accountLinking
112
+ }
113
+ },
114
+ provisioning: {
115
+ ...base.provisioning,
116
+ ...patch.provisioning,
117
+ scimReuse: {
118
+ ...base.provisioning.scimReuse,
119
+ ...patch.provisioning?.scimReuse
120
+ },
121
+ user: {
122
+ ...base.provisioning.user,
123
+ ...patch.provisioning?.user
124
+ },
125
+ jit: {
126
+ ...base.provisioning.jit,
127
+ ...patch.provisioning?.jit
128
+ },
129
+ deprovision: {
130
+ ...base.provisioning.deprovision,
131
+ ...patch.provisioning?.deprovision
132
+ },
133
+ groups: {
134
+ ...base.provisioning.groups,
135
+ ...patch.provisioning?.groups
136
+ },
137
+ roles: {
138
+ ...base.provisioning.roles,
139
+ ...patch.provisioning?.roles
140
+ }
141
+ },
142
+ extend: patch.extend === void 0 ? base.extend : {
143
+ ...base.extend,
144
+ ...patch.extend
145
+ }
146
+ });
147
+ }
148
+ function resolveProvisionedRoleIds(opts) {
149
+ const roleIds = new Set(opts.policy.provisioning.jit.defaultRoleIds);
150
+ if (opts.policy.provisioning.groups.mode === "sync") {
151
+ const mapping = opts.policy.provisioning.groups.mapping ?? {};
152
+ for (const group of opts.groups ?? []) for (const roleId of mapping[group] ?? []) roleIds.add(roleId);
153
+ }
154
+ if (opts.policy.provisioning.roles.mode === "map") {
155
+ const mapping = opts.policy.provisioning.roles.mapping ?? {};
156
+ for (const role of opts.roles ?? []) for (const roleId of mapping[role] ?? []) roleIds.add(roleId);
157
+ }
158
+ return Array.from(roleIds);
159
+ }
160
+
161
+ //#endregion
162
+ export { normalizeGroupConnectionPolicy, patchGroupConnectionPolicy, resolveProvisionedRoleIds };
163
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1,22 @@
1
+ //#region src/server/connection/profile.ts
2
+ /** @internal */
3
+ function normalizeStringArray(value) {
4
+ if (Array.isArray(value)) {
5
+ const values = value.filter((item) => typeof item === "string" && item.length > 0);
6
+ return values.length > 0 ? values : void 0;
7
+ }
8
+ if (typeof value === "string" && value.length > 0) return [value];
9
+ }
10
+ /** @internal */
11
+ function finalizeNormalizedProfile(input) {
12
+ return {
13
+ ...input,
14
+ groups: normalizeStringArray(input.groups),
15
+ roles: normalizeStringArray(input.roles),
16
+ ...input.extend && Object.keys(input.extend).length > 0 ? { extend: input.extend } : {}
17
+ };
18
+ }
19
+
20
+ //#endregion
21
+ export { finalizeNormalizedProfile, normalizeStringArray };
22
+ //# sourceMappingURL=profile.js.map