@samebase/identity-broker 0.0.0-stage → 0.1.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 (82) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +4 -0
  3. package/README.md +90 -2
  4. package/dist/cli/index.d.ts +2 -0
  5. package/dist/cli/index.js +26 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/client/connectors/email.d.ts +6 -0
  8. package/dist/client/connectors/email.js +5 -0
  9. package/dist/client/connectors/email.js.map +1 -0
  10. package/dist/client/connectors/github.d.ts +7 -0
  11. package/dist/client/connectors/github.js +57 -0
  12. package/dist/client/connectors/github.js.map +1 -0
  13. package/dist/client/connectors/google.d.ts +7 -0
  14. package/dist/client/connectors/google.js +13 -0
  15. package/dist/client/connectors/google.js.map +1 -0
  16. package/dist/client/connectors/types.d.ts +47 -0
  17. package/dist/client/connectors/types.js +2 -0
  18. package/dist/client/connectors/types.js.map +1 -0
  19. package/dist/client/connectors/upstream.d.ts +25 -0
  20. package/dist/client/connectors/upstream.js +86 -0
  21. package/dist/client/connectors/upstream.js.map +1 -0
  22. package/dist/client/html.d.ts +30 -0
  23. package/dist/client/html.js +84 -0
  24. package/dist/client/html.js.map +1 -0
  25. package/dist/client/index.d.ts +78 -0
  26. package/dist/client/index.js +721 -0
  27. package/dist/client/index.js.map +1 -0
  28. package/dist/client/jwt.d.ts +31 -0
  29. package/dist/client/jwt.js +55 -0
  30. package/dist/client/jwt.js.map +1 -0
  31. package/dist/client/keys.d.ts +44 -0
  32. package/dist/client/keys.js +130 -0
  33. package/dist/client/keys.js.map +1 -0
  34. package/dist/client/protocol.d.ts +75 -0
  35. package/dist/client/protocol.js +259 -0
  36. package/dist/client/protocol.js.map +1 -0
  37. package/dist/client/responses.d.ts +24 -0
  38. package/dist/client/responses.js +57 -0
  39. package/dist/client/responses.js.map +1 -0
  40. package/dist/client/subject.d.ts +15 -0
  41. package/dist/client/subject.js +32 -0
  42. package/dist/client/subject.js.map +1 -0
  43. package/dist/component/_generated/api.d.ts +45 -0
  44. package/dist/component/_generated/api.js +31 -0
  45. package/dist/component/_generated/api.js.map +1 -0
  46. package/dist/component/_generated/component.d.ts +375 -0
  47. package/dist/component/_generated/component.js +11 -0
  48. package/dist/component/_generated/component.js.map +1 -0
  49. package/dist/component/_generated/dataModel.d.ts +45 -0
  50. package/dist/component/_generated/dataModel.js +11 -0
  51. package/dist/component/_generated/dataModel.js.map +1 -0
  52. package/dist/component/_generated/server.d.ts +132 -0
  53. package/dist/component/_generated/server.js +80 -0
  54. package/dist/component/_generated/server.js.map +1 -0
  55. package/dist/component/apps.d.ts +36 -0
  56. package/dist/component/apps.js +124 -0
  57. package/dist/component/apps.js.map +1 -0
  58. package/dist/component/authRequests.d.ts +254 -0
  59. package/dist/component/authRequests.js +392 -0
  60. package/dist/component/authRequests.js.map +1 -0
  61. package/dist/component/clients.d.ts +43 -0
  62. package/dist/component/clients.js +95 -0
  63. package/dist/component/clients.js.map +1 -0
  64. package/dist/component/convex.config.d.ts +2 -0
  65. package/dist/component/convex.config.js +3 -0
  66. package/dist/component/convex.config.js.map +1 -0
  67. package/dist/component/crypto.d.ts +2 -0
  68. package/dist/component/crypto.js +9 -0
  69. package/dist/component/crypto.js.map +1 -0
  70. package/dist/component/lifecycle.d.ts +15 -0
  71. package/dist/component/lifecycle.js +59 -0
  72. package/dist/component/lifecycle.js.map +1 -0
  73. package/dist/component/registration.d.ts +17 -0
  74. package/dist/component/registration.js +57 -0
  75. package/dist/component/registration.js.map +1 -0
  76. package/dist/component/schema.d.ts +650 -0
  77. package/dist/component/schema.js +122 -0
  78. package/dist/component/schema.js.map +1 -0
  79. package/dist/component/signIns.d.ts +8 -0
  80. package/dist/component/signIns.js +26 -0
  81. package/dist/component/signIns.js.map +1 -0
  82. package/package.json +51 -3
@@ -0,0 +1,59 @@
1
+ import { v } from "convex/values";
2
+ import { mutation } from "./_generated/server";
3
+ const { number, object } = v;
4
+ /** How many documents one run deletes per table, so a run stays well inside one transaction. */
5
+ const BATCH = 200;
6
+ /**
7
+ * Deletes what has run out: expired requests and codes, preview clients nobody used for
8
+ * `previewClientMaxAgeMs`, and audit rows older than `signInRetentionMs`. The host calls this from a
9
+ * cron; production and development clients are never touched.
10
+ */
11
+ export const cleanup = mutation({
12
+ args: { now: number(), previewClientMaxAgeMs: number(), signInRetentionMs: number() },
13
+ returns: object({
14
+ authRequests: number(),
15
+ authorizationCodes: number(),
16
+ previewClients: number(),
17
+ signIns: number(),
18
+ }),
19
+ handler: async (ctx, args) => {
20
+ const requests = await ctx.db
21
+ .query("authRequests")
22
+ .withIndex("by_expires_at", (q) => q.lt("expiresAt", args.now))
23
+ .take(BATCH);
24
+ for (const request of requests) {
25
+ await ctx.db.delete("authRequests", request._id);
26
+ }
27
+ const codes = await ctx.db
28
+ .query("authorizationCodes")
29
+ .withIndex("by_expires_at", (q) => q.lt("expiresAt", args.now))
30
+ .take(BATCH);
31
+ for (const code of codes) {
32
+ await ctx.db.delete("authorizationCodes", code._id);
33
+ }
34
+ const previewCutoff = args.now - args.previewClientMaxAgeMs;
35
+ const previewClients = (await ctx.db
36
+ .query("clients")
37
+ .withIndex("by_deployment_type", (q) => q.eq("deploymentType", "preview"))
38
+ .collect())
39
+ .filter((client) => (client.lastSignInAt ?? client.createdAt) < previewCutoff)
40
+ .slice(0, BATCH);
41
+ for (const client of previewClients) {
42
+ await ctx.db.delete("clients", client._id);
43
+ }
44
+ const signIns = await ctx.db
45
+ .query("signIns")
46
+ .withIndex("by_at", (q) => q.lt("at", args.now - args.signInRetentionMs))
47
+ .take(BATCH);
48
+ for (const signIn of signIns) {
49
+ await ctx.db.delete("signIns", signIn._id);
50
+ }
51
+ return {
52
+ authRequests: requests.length,
53
+ authorizationCodes: codes.length,
54
+ previewClients: previewClients.length,
55
+ signIns: signIns.length,
56
+ };
57
+ },
58
+ });
59
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/component/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AAE7B,gGAAgG;AAChG,MAAM,KAAK,GAAG,GAAG,CAAC;AAElB;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;IAC9B,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE;IACrF,OAAO,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,EAAE;QACtB,kBAAkB,EAAE,MAAM,EAAE;QAC5B,cAAc,EAAE,MAAM,EAAE;QACxB,OAAO,EAAE,MAAM,EAAE;KAClB,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE;aAC1B,KAAK,CAAC,cAAc,CAAC;aACrB,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;aAC9D,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE;aACvB,KAAK,CAAC,oBAAoB,CAAC;aAC3B,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;aAC9D,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAC5D,MAAM,cAAc,GAAG,CACrB,MAAM,GAAG,CAAC,EAAE;aACT,KAAK,CAAC,SAAS,CAAC;aAChB,SAAS,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;aACzE,OAAO,EAAE,CACb;aACE,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC;aAC7E,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACnB,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;aACzB,KAAK,CAAC,SAAS,CAAC;aAChB,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;aACxE,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO;YACL,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC7B,kBAAkB,EAAE,KAAK,CAAC,MAAM;YAChC,cAAc,EAAE,cAAc,CAAC,MAAM;YACrC,OAAO,EAAE,OAAO,CAAC,MAAM;SACxB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /** Stores the hash of an initial access token (RFC 7591 section 3) that registers clients of one app. */
2
+ export declare const mintToken: import("convex/server").RegisteredMutation<"public", {
3
+ appId: string;
4
+ createdAt: number;
5
+ expiresAt: number;
6
+ tokenHash: string;
7
+ }, Promise<null>>;
8
+ /** The app a live registration token belongs to, or null for an unknown or expired token. */
9
+ export declare const readToken: import("convex/server").RegisteredQuery<"public", {
10
+ now: number;
11
+ tokenHash: string;
12
+ }, Promise<{
13
+ appId: string;
14
+ name: string;
15
+ firstParty: boolean;
16
+ allowedCallbackHosts: string[];
17
+ } | null>>;
@@ -0,0 +1,57 @@
1
+ import { v } from "convex/values";
2
+ import { mutation, query } from "./_generated/server";
3
+ const { array, boolean, number, object, string } = v;
4
+ /** Stores the hash of an initial access token (RFC 7591 section 3) that registers clients of one app. */
5
+ export const mintToken = mutation({
6
+ args: { tokenHash: string(), appId: string(), expiresAt: number(), createdAt: number() },
7
+ returns: v.null(),
8
+ handler: async (ctx, args) => {
9
+ const app = await ctx.db
10
+ .query("apps")
11
+ .withIndex("by_app_id", (q) => q.eq("appId", args.appId))
12
+ .unique();
13
+ if (app === null) {
14
+ throw new Error(`Unknown app "${args.appId}"`);
15
+ }
16
+ await ctx.db.insert("registrationTokens", {
17
+ tokenHash: args.tokenHash,
18
+ appId: args.appId,
19
+ expiresAt: args.expiresAt,
20
+ createdAt: args.createdAt,
21
+ });
22
+ return null;
23
+ },
24
+ });
25
+ /** The app a live registration token belongs to, or null for an unknown or expired token. */
26
+ export const readToken = query({
27
+ args: { tokenHash: string(), now: number() },
28
+ returns: v.union(object({
29
+ appId: string(),
30
+ name: string(),
31
+ firstParty: boolean(),
32
+ allowedCallbackHosts: array(string()),
33
+ }), v.null()),
34
+ handler: async (ctx, args) => {
35
+ const token = await ctx.db
36
+ .query("registrationTokens")
37
+ .withIndex("by_token_hash", (q) => q.eq("tokenHash", args.tokenHash))
38
+ .unique();
39
+ if (token === null || token.expiresAt <= args.now) {
40
+ return null;
41
+ }
42
+ const app = await ctx.db
43
+ .query("apps")
44
+ .withIndex("by_app_id", (q) => q.eq("appId", token.appId))
45
+ .unique();
46
+ if (app === null) {
47
+ return null;
48
+ }
49
+ return {
50
+ appId: app.appId,
51
+ name: app.name,
52
+ firstParty: app.firstParty,
53
+ allowedCallbackHosts: app.allowedCallbackHosts,
54
+ };
55
+ },
56
+ });
57
+ //# sourceMappingURL=registration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/component/registration.ts"],"names":[],"mappings":"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"}