@atproto/pds 0.4.122 → 0.4.124
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.
- package/CHANGELOG.md +16 -0
- package/dist/account-manager/account-manager.js +17 -7
- package/dist/account-manager/account-manager.js.map +1 -1
- package/dist/account-manager/db/index.d.ts.map +1 -1
- package/dist/account-manager/db/migrations/005-oauth-account-management.d.ts +20 -0
- package/dist/account-manager/db/migrations/005-oauth-account-management.d.ts.map +1 -0
- package/dist/account-manager/db/migrations/005-oauth-account-management.js +72 -0
- package/dist/account-manager/db/migrations/005-oauth-account-management.js.map +1 -0
- package/dist/account-manager/db/migrations/index.d.ts +2 -0
- package/dist/account-manager/db/migrations/index.d.ts.map +1 -1
- package/dist/account-manager/db/migrations/index.js +19 -7
- package/dist/account-manager/db/migrations/index.js.map +1 -1
- package/dist/account-manager/db/schema/account-device.d.ts +13 -0
- package/dist/account-manager/db/schema/account-device.d.ts.map +1 -0
- package/dist/account-manager/db/schema/{device-account.js → account-device.js} +2 -2
- package/dist/account-manager/db/schema/account-device.js.map +1 -0
- package/dist/account-manager/db/schema/authorization-request.d.ts +4 -4
- package/dist/account-manager/db/schema/authorization-request.d.ts.map +1 -1
- package/dist/account-manager/db/schema/authorization-request.js.map +1 -1
- package/dist/account-manager/db/schema/authorized-client.d.ts +16 -0
- package/dist/account-manager/db/schema/authorized-client.d.ts.map +1 -0
- package/dist/account-manager/db/schema/authorized-client.js +5 -0
- package/dist/account-manager/db/schema/authorized-client.js.map +1 -0
- package/dist/account-manager/db/schema/index.d.ts +4 -3
- package/dist/account-manager/db/schema/index.d.ts.map +1 -1
- package/dist/account-manager/db/schema/token.d.ts +5 -5
- package/dist/account-manager/db/schema/token.d.ts.map +1 -1
- package/dist/account-manager/db/schema/token.js.map +1 -1
- package/dist/account-manager/helpers/account-device.d.ts +204 -0
- package/dist/account-manager/helpers/account-device.d.ts.map +1 -0
- package/dist/account-manager/helpers/account-device.js +54 -0
- package/dist/account-manager/helpers/account-device.js.map +1 -0
- package/dist/account-manager/helpers/account.d.ts +2 -1
- package/dist/account-manager/helpers/account.d.ts.map +1 -1
- package/dist/account-manager/helpers/auth.d.ts.map +1 -1
- package/dist/account-manager/helpers/auth.js +17 -7
- package/dist/account-manager/helpers/auth.js.map +1 -1
- package/dist/account-manager/helpers/authorization-request.d.ts.map +1 -1
- package/dist/account-manager/helpers/authorization-request.js +4 -4
- package/dist/account-manager/helpers/authorization-request.js.map +1 -1
- package/dist/account-manager/helpers/authorized-client.d.ts +6 -0
- package/dist/account-manager/helpers/authorized-client.d.ts.map +1 -0
- package/dist/account-manager/helpers/authorized-client.js +47 -0
- package/dist/account-manager/helpers/authorized-client.js.map +1 -0
- package/dist/account-manager/helpers/device.d.ts +1 -1
- package/dist/account-manager/helpers/device.d.ts.map +1 -1
- package/dist/account-manager/helpers/device.js.map +1 -1
- package/dist/account-manager/helpers/email-token.d.ts.map +1 -1
- package/dist/account-manager/helpers/invite.d.ts.map +1 -1
- package/dist/account-manager/helpers/password.d.ts.map +1 -1
- package/dist/account-manager/helpers/password.js +17 -7
- package/dist/account-manager/helpers/password.js.map +1 -1
- package/dist/account-manager/helpers/repo.d.ts.map +1 -1
- package/dist/account-manager/helpers/scrypt.d.ts.map +1 -1
- package/dist/account-manager/helpers/scrypt.js +17 -7
- package/dist/account-manager/helpers/scrypt.js.map +1 -1
- package/dist/account-manager/helpers/token.d.ts +566 -59
- package/dist/account-manager/helpers/token.d.ts.map +1 -1
- package/dist/account-manager/helpers/token.js +17 -32
- package/dist/account-manager/helpers/token.js.map +1 -1
- package/dist/account-manager/helpers/used-refresh-token.d.ts.map +1 -1
- package/dist/account-manager/oauth-store.d.ts +17 -7
- package/dist/account-manager/oauth-store.d.ts.map +1 -1
- package/dist/account-manager/oauth-store.js +138 -86
- package/dist/account-manager/oauth-store.js.map +1 -1
- package/dist/actor-store/actor-store.js +17 -7
- package/dist/actor-store/actor-store.js.map +1 -1
- package/dist/actor-store/blob/transactor.js +17 -7
- package/dist/actor-store/blob/transactor.js.map +1 -1
- package/dist/actor-store/db/index.d.ts.map +1 -1
- package/dist/actor-store/db/migrations/index.js +17 -7
- package/dist/actor-store/db/migrations/index.js.map +1 -1
- package/dist/actor-store/migrate.d.ts.map +1 -1
- package/dist/actor-store/preference/reader.d.ts.map +1 -1
- package/dist/actor-store/preference/util.d.ts.map +1 -1
- package/dist/actor-store/record/reader.d.ts.map +1 -1
- package/dist/actor-store/record/reader.js +17 -7
- package/dist/actor-store/record/reader.js.map +1 -1
- package/dist/actor-store/repo/sql-repo-reader.d.ts +1 -1
- package/dist/api/app/bsky/util/resolver.d.ts.map +1 -1
- package/dist/api/com/atproto/identity/signPlcOperation.js +17 -7
- package/dist/api/com/atproto/identity/signPlcOperation.js.map +1 -1
- package/dist/api/com/atproto/identity/submitPlcOperation.js +17 -7
- package/dist/api/com/atproto/identity/submitPlcOperation.js.map +1 -1
- package/dist/api/com/atproto/repo/describeRepo.js +17 -7
- package/dist/api/com/atproto/repo/describeRepo.js.map +1 -1
- package/dist/api/com/atproto/repo/importRepo.d.ts.map +1 -1
- package/dist/api/com/atproto/server/createAccount.js +17 -7
- package/dist/api/com/atproto/server/createAccount.js.map +1 -1
- package/dist/api/com/atproto/server/util.d.ts.map +1 -1
- package/dist/api/com/atproto/server/util.js +17 -7
- package/dist/api/com/atproto/server/util.js.map +1 -1
- package/dist/api/com/atproto/sync/getRecord.js +17 -7
- package/dist/api/com/atproto/sync/getRecord.js.map +1 -1
- package/dist/api/com/atproto/sync/getRepo.d.ts.map +1 -1
- package/dist/api/com/atproto/sync/util.d.ts.map +1 -1
- package/dist/api/proxy.d.ts.map +1 -1
- package/dist/auth-routes.d.ts.map +1 -1
- package/dist/auth-routes.js +2 -3
- package/dist/auth-routes.js.map +1 -1
- package/dist/auth-verifier.d.ts.map +1 -1
- package/dist/auth-verifier.js +19 -13
- package/dist/auth-verifier.js.map +1 -1
- package/dist/basic-routes.d.ts.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +1 -1
- package/dist/config/config.js.map +1 -1
- package/dist/config/env.d.ts +1 -1
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +1 -1
- package/dist/config/env.js.map +1 -1
- package/dist/config/secrets.d.ts.map +1 -1
- package/dist/context.js +18 -8
- package/dist/context.js.map +1 -1
- package/dist/db/cast.d.ts +17 -13
- package/dist/db/cast.d.ts.map +1 -1
- package/dist/db/cast.js +13 -52
- package/dist/db/cast.js.map +1 -1
- package/dist/db/pagination.d.ts.map +1 -1
- package/dist/db/util.d.ts.map +1 -1
- package/dist/did-cache/db/index.d.ts.map +1 -1
- package/dist/disk-blobstore.d.ts.map +1 -1
- package/dist/handle/explicit-slurs.d.ts.map +1 -1
- package/dist/handle/index.d.ts.map +1 -1
- package/dist/index.js +17 -7
- package/dist/index.js.map +1 -1
- package/dist/lexicon/index.d.ts +4 -0
- package/dist/lexicon/index.d.ts.map +1 -1
- package/dist/lexicon/index.js +8 -0
- package/dist/lexicon/index.js.map +1 -1
- package/dist/lexicon/lexicons.d.ts +254 -4
- package/dist/lexicon/lexicons.d.ts.map +1 -1
- package/dist/lexicon/lexicons.js +134 -2
- package/dist/lexicon/lexicons.js.map +1 -1
- package/dist/lexicon/types/com/atproto/sync/defs.d.ts +2 -0
- package/dist/lexicon/types/com/atproto/sync/defs.d.ts.map +1 -0
- package/dist/lexicon/types/com/atproto/sync/defs.js +7 -0
- package/dist/lexicon/types/com/atproto/sync/defs.js.map +1 -0
- package/dist/lexicon/types/com/atproto/sync/getHostStatus.d.ts +43 -0
- package/dist/lexicon/types/com/atproto/sync/getHostStatus.d.ts.map +1 -0
- package/dist/lexicon/types/com/atproto/sync/getHostStatus.js +7 -0
- package/dist/lexicon/types/com/atproto/sync/getHostStatus.js.map +1 -0
- package/dist/lexicon/types/com/atproto/sync/listHosts.d.ts +51 -0
- package/dist/lexicon/types/com/atproto/sync/listHosts.d.ts.map +1 -0
- package/dist/lexicon/types/com/atproto/sync/listHosts.js +16 -0
- package/dist/lexicon/types/com/atproto/sync/listHosts.js.map +1 -0
- package/dist/lexicon/types/com/atproto/sync/requestCrawl.d.ts +1 -0
- package/dist/lexicon/types/com/atproto/sync/requestCrawl.d.ts.map +1 -1
- package/dist/lexicon/util.d.ts.map +1 -1
- package/dist/mailer/index.js +17 -7
- package/dist/mailer/index.js.map +1 -1
- package/dist/mailer/templates/plc-operation.js +1 -1
- package/dist/mailer/templates/plc-operation.js.map +1 -1
- package/dist/pipethrough.d.ts.map +1 -1
- package/dist/read-after-write/util.d.ts.map +1 -1
- package/dist/redis.d.ts.map +1 -1
- package/dist/repo/prepare.d.ts.map +1 -1
- package/dist/repo/prepare.js +17 -7
- package/dist/repo/prepare.js.map +1 -1
- package/dist/scripts/publish-identity.d.ts.map +1 -1
- package/dist/scripts/rebuild-repo.d.ts.map +1 -1
- package/dist/scripts/rotate-keys.d.ts.map +1 -1
- package/dist/scripts/sequencer-recovery/index.d.ts.map +1 -1
- package/dist/scripts/sequencer-recovery/recoverer.d.ts.map +1 -1
- package/dist/scripts/sequencer-recovery/recovery-db.d.ts.map +1 -1
- package/dist/scripts/sequencer-recovery/repair-repos.d.ts.map +1 -1
- package/dist/scripts/util.d.ts.map +1 -1
- package/dist/sequencer/db/index.d.ts.map +1 -1
- package/dist/sequencer/db/migrations/index.js +17 -7
- package/dist/sequencer/db/migrations/index.js.map +1 -1
- package/dist/sequencer/events.d.ts +6 -6
- package/dist/sequencer/events.d.ts.map +1 -1
- package/dist/sequencer/sequencer.d.ts.map +1 -1
- package/dist/util/debug.d.ts.map +1 -1
- package/dist/util/params.d.ts.map +1 -1
- package/dist/well-known.d.ts.map +1 -1
- package/package.json +6 -5
- package/src/account-manager/db/migrations/005-oauth-account-management.ts +112 -0
- package/src/account-manager/db/migrations/index.ts +2 -0
- package/src/account-manager/db/schema/account-device.ts +14 -0
- package/src/account-manager/db/schema/authorization-request.ts +5 -3
- package/src/account-manager/db/schema/authorized-client.ts +19 -0
- package/src/account-manager/db/schema/index.ts +5 -3
- package/src/account-manager/db/schema/token.ts +7 -4
- package/src/account-manager/helpers/account-device.ts +66 -0
- package/src/account-manager/helpers/authorization-request.ts +5 -5
- package/src/account-manager/helpers/authorized-client.ts +69 -0
- package/src/account-manager/helpers/device.ts +3 -1
- package/src/account-manager/helpers/token.ts +19 -57
- package/src/account-manager/oauth-store.ts +182 -103
- package/src/auth-routes.ts +11 -7
- package/src/auth-verifier.ts +2 -7
- package/src/config/config.ts +1 -1
- package/src/config/env.ts +2 -2
- package/src/context.ts +2 -2
- package/src/db/cast.ts +43 -50
- package/src/lexicon/index.ts +24 -0
- package/src/lexicon/lexicons.ts +141 -2
- package/src/lexicon/types/com/atproto/sync/defs.ts +23 -0
- package/src/lexicon/types/com/atproto/sync/getHostStatus.ts +61 -0
- package/src/lexicon/types/com/atproto/sync/listHosts.ts +77 -0
- package/src/lexicon/types/com/atproto/sync/requestCrawl.ts +1 -0
- package/src/mailer/templates/plc-operation.hbs +2 -2
- package/tests/db.test.ts +2 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/tsconfig.tests.tsbuildinfo +1 -1
- package/dist/account-manager/db/schema/device-account.d.ts +0 -14
- package/dist/account-manager/db/schema/device-account.d.ts.map +0 -1
- package/dist/account-manager/db/schema/device-account.js.map +0 -1
- package/dist/account-manager/helpers/device-account.d.ts +0 -108
- package/dist/account-manager/helpers/device-account.d.ts.map +0 -1
- package/dist/account-manager/helpers/device-account.js +0 -83
- package/dist/account-manager/helpers/device-account.js.map +0 -1
- package/src/account-manager/db/schema/device-account.ts +0 -15
- package/src/account-manager/helpers/device-account.ts +0 -135
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sequencer/db/migrations/index.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sequencer/db/migrations/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAkC;AAElC,kBAAe;IACb,KAAK,EAAE,IAAI;CACZ,CAAA"}
|
@@ -31,7 +31,7 @@ export declare const commitEvt: z.ZodObject<{
|
|
31
31
|
commit: z.ZodEffects<z.ZodEffects<z.ZodAny, any, any>, import("multiformats/cid").CID, any>;
|
32
32
|
rev: z.ZodString;
|
33
33
|
since: z.ZodNullable<z.ZodString>;
|
34
|
-
blocks: z.ZodType<Uint8Array
|
34
|
+
blocks: z.ZodType<Uint8Array<ArrayBuffer>, z.ZodTypeDef, Uint8Array<ArrayBuffer>>;
|
35
35
|
ops: z.ZodArray<z.ZodObject<{
|
36
36
|
action: z.ZodUnion<[z.ZodLiteral<"create">, z.ZodLiteral<"update">, z.ZodLiteral<"delete">]>;
|
37
37
|
path: z.ZodString;
|
@@ -58,7 +58,7 @@ export declare const commitEvt: z.ZodObject<{
|
|
58
58
|
since: string | null;
|
59
59
|
rebase: boolean;
|
60
60
|
tooBig: boolean;
|
61
|
-
blocks: Uint8Array
|
61
|
+
blocks: Uint8Array<ArrayBuffer>;
|
62
62
|
ops: {
|
63
63
|
path: string;
|
64
64
|
cid: import("multiformats/cid").CID | null;
|
@@ -73,7 +73,7 @@ export declare const commitEvt: z.ZodObject<{
|
|
73
73
|
since: string | null;
|
74
74
|
rebase: boolean;
|
75
75
|
tooBig: boolean;
|
76
|
-
blocks: Uint8Array
|
76
|
+
blocks: Uint8Array<ArrayBuffer>;
|
77
77
|
ops: {
|
78
78
|
path: string;
|
79
79
|
action: "create" | "delete" | "update";
|
@@ -86,16 +86,16 @@ export declare const commitEvt: z.ZodObject<{
|
|
86
86
|
export type CommitEvt = z.infer<typeof commitEvt>;
|
87
87
|
export declare const syncEvt: z.ZodObject<{
|
88
88
|
did: z.ZodString;
|
89
|
-
blocks: z.ZodType<Uint8Array
|
89
|
+
blocks: z.ZodType<Uint8Array<ArrayBuffer>, z.ZodTypeDef, Uint8Array<ArrayBuffer>>;
|
90
90
|
rev: z.ZodString;
|
91
91
|
}, "strip", z.ZodTypeAny, {
|
92
92
|
did: string;
|
93
93
|
rev: string;
|
94
|
-
blocks: Uint8Array
|
94
|
+
blocks: Uint8Array<ArrayBuffer>;
|
95
95
|
}, {
|
96
96
|
did: string;
|
97
97
|
rev: string;
|
98
|
-
blocks: Uint8Array
|
98
|
+
blocks: Uint8Array<ArrayBuffer>;
|
99
99
|
}>;
|
100
100
|
export type SyncEvt = z.infer<typeof syncEvt>;
|
101
101
|
export declare const identityEvt: z.ZodObject<{
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/sequencer/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AAEpC,eAAO,MAAM,eAAe,
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/sequencer/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AAEpC,eAAO,MAAM,eAAe,GAC1B,KAAK,MAAM,EACX,YAAY,iBAAiB,KAC5B,OAAO,CAAC,aAAa,CAyBvB,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,KAAK,MAAM,EACX,MAAM,WAAW,KAChB,OAAO,CAAC,aAAa,CAavB,CAAA;AAED,eAAO,MAAM,qBAAqB,GAChC,YAAY,iBAAiB,KAC5B,WAaF,CAAA;AAED,eAAO,MAAM,oBAAoB,GAC/B,KAAK,MAAM,EACX,SAAS,MAAM,KACd,OAAO,CAAC,aAAa,CAavB,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,KAAK,MAAM,EACX,QAAQ,aAAa,KACpB,OAAO,CAAC,aAAa,CAevB,CAAA;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;EAStB,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAErD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWpB,CAAA;AACF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AAEjD,eAAO,MAAM,OAAO;;;;;;;;;;;;EAIlB,CAAA;AACF,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAA;AAE7C,eAAO,MAAM,WAAW;;;;;;;;;EAGtB,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAErD,eAAO,MAAM,UAAU;;;;;;;;;;;;EAWrB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,KAAK,cAAc,GAAG;IACpB,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,SAAS,CAAA;CACf,CAAA;AACD,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,OAAO,CAAA;CACb,CAAA;AACD,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,WAAW,CAAA;CACjB,CAAA;AACD,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,SAAS,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,UAAU,CAAA;CAChB,CAAA;AACD,MAAM,MAAM,MAAM,GACd,cAAc,GACd,YAAY,GACZ,gBAAgB,GAChB,eAAe,CAAA"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EAGZ,MAAM,MAAM,CAAA;AACb,OAAO,EAIL,MAAM,EAMP,MAAM,UAAU,CAAA;AAEjB,cAAc,UAAU,CAAA;
|
1
|
+
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EAGZ,MAAM,MAAM,CAAA;AACb,OAAO,EAIL,MAAM,EAMP,MAAM,UAAU,CAAA;AAEjB,cAAc,UAAU,CAAA;8BAEwB,UAAU,gBAAgB;AAA1E,qBAAa,SAAU,SAAQ,cAA4C;IAOhE,UAAU,EAAE,MAAM;IAClB,QAAQ,EAAE,QAAQ;IAClB,QAAQ;IARjB,EAAE,EAAE,WAAW,CAAA;IACf,SAAS,UAAQ;IACjB,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAO;IACxC,kBAAkB,SAAI;gBAGb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,SAAI,EACnB,wBAAwB,UAAQ;IAQ5B,KAAK;IAWL,OAAO;IAQP,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAU9B,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAW5C,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWvD,eAAe,CAAC,IAAI,EAAE;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YA6BP,MAAM;YAwBN,kBAAkB;IAM1B,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAQhD,cAAc,CAClB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,iBAAiB,GAC5B,OAAO,CAAC,MAAM,CAAC;IAKZ,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW;IAK9C,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlE,kBAAkB,CACtB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,CAAC;IAKZ,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,GAAE,MAAM,EAAO;CAUjE;AAED,eAAO,MAAM,gBAAgB,GAAI,MAAM,YAAY,EAAE,KAAG,MAAM,EAuC7D,CAAA;AAED,KAAK,MAAM,GAAG,YAAY,CAAA;AAE1B,KAAK,eAAe,GAAG;IACrB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAChC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC,eAAe,CAAC,CAAA;AAE5D,eAAe,SAAS,CAAA"}
|
package/dist/util/debug.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/util/debug.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,IAAI,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/util/debug.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,IAAI,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,IAAI,MACzD,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,8BAQxC,CAAA"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/util/params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAGtC,eAAO,MAAM,aAAa,
|
1
|
+
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/util/params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAGtC,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,GAS3C,CAAA"}
|
package/dist/well-known.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"well-known.d.ts","sourceRoot":"","sources":["../src/well-known.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,eAAO,MAAM,YAAY,
|
1
|
+
{"version":3,"file":"well-known.d.ts","sourceRoot":"","sources":["../src/well-known.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,eAAO,MAAM,YAAY,GAAI,KAAK,UAAU,KAAG,MAyB9C,CAAA"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@atproto/pds",
|
3
|
-
"version": "0.4.
|
3
|
+
"version": "0.4.124",
|
4
4
|
"license": "MIT",
|
5
5
|
"description": "Reference implementation of atproto Personal Data Server (PDS)",
|
6
6
|
"keywords": [
|
@@ -50,13 +50,13 @@
|
|
50
50
|
"zod": "^3.23.8",
|
51
51
|
"@atproto-labs/fetch-node": "0.1.8",
|
52
52
|
"@atproto-labs/xrpc-utils": "0.0.11",
|
53
|
-
"@atproto/api": "^0.14.
|
53
|
+
"@atproto/api": "^0.14.22",
|
54
54
|
"@atproto/aws": "^0.2.20",
|
55
55
|
"@atproto/common": "^0.4.10",
|
56
56
|
"@atproto/crypto": "^0.4.4",
|
57
57
|
"@atproto/identity": "^0.4.7",
|
58
58
|
"@atproto/lexicon": "^0.4.10",
|
59
|
-
"@atproto/oauth-provider": "^0.
|
59
|
+
"@atproto/oauth-provider": "^0.7.0",
|
60
60
|
"@atproto/repo": "^0.8.0",
|
61
61
|
"@atproto/syntax": "^0.4.0",
|
62
62
|
"@atproto/xrpc": "^0.6.12",
|
@@ -78,8 +78,9 @@
|
|
78
78
|
"ts-node": "^10.8.2",
|
79
79
|
"typescript": "^5.6.3",
|
80
80
|
"ws": "^8.12.0",
|
81
|
-
"@atproto/api": "^0.14.
|
82
|
-
"@atproto/bsky": "^0.0.
|
81
|
+
"@atproto/api": "^0.14.22",
|
82
|
+
"@atproto/bsky": "^0.0.139",
|
83
|
+
"@atproto/dev-env": "^0.3.117",
|
83
84
|
"@atproto/lex-cli": "^0.7.2",
|
84
85
|
"@atproto/oauth-client-browser-example": "0.0.2"
|
85
86
|
},
|
@@ -0,0 +1,112 @@
|
|
1
|
+
import { Kysely } from 'kysely'
|
2
|
+
import { HOUR } from '@atproto/common'
|
3
|
+
import { ClientId, DeviceId } from '@atproto/oauth-provider'
|
4
|
+
import { DateISO, JsonEncoded, toDateISO } from '../../../db'
|
5
|
+
|
6
|
+
export async function up(
|
7
|
+
db: Kysely<{
|
8
|
+
device_account: {
|
9
|
+
did: string
|
10
|
+
deviceId: DeviceId
|
11
|
+
|
12
|
+
remember: 0 | 1
|
13
|
+
authenticatedAt: string
|
14
|
+
authorizedClients: JsonEncoded<ClientId[]>
|
15
|
+
}
|
16
|
+
account_device: {
|
17
|
+
did: string
|
18
|
+
deviceId: DeviceId
|
19
|
+
|
20
|
+
createdAt: DateISO
|
21
|
+
updatedAt: DateISO
|
22
|
+
}
|
23
|
+
}>,
|
24
|
+
): Promise<void> {
|
25
|
+
// Security: Delete any leftover device accounts that are not remembered
|
26
|
+
await db
|
27
|
+
.deleteFrom('device_account')
|
28
|
+
.where('remember', '=', 0)
|
29
|
+
.where('authenticatedAt', '<', toDateISO(new Date(Date.now() - HOUR)))
|
30
|
+
.execute()
|
31
|
+
|
32
|
+
// replaces "device_account"
|
33
|
+
await db.schema
|
34
|
+
.createTable('account_device')
|
35
|
+
.addColumn('did', 'varchar', (col) => col.notNull())
|
36
|
+
.addColumn('deviceId', 'varchar', (col) => col.notNull())
|
37
|
+
.addColumn('createdAt', 'varchar', (col) => col.notNull())
|
38
|
+
.addColumn('updatedAt', 'varchar', (col) => col.notNull())
|
39
|
+
.addPrimaryKeyConstraint('account_device_pk', [
|
40
|
+
'deviceId', // first because this table will be joined from the "device" table
|
41
|
+
'did',
|
42
|
+
])
|
43
|
+
.addForeignKeyConstraint(
|
44
|
+
'account_device_did_fk',
|
45
|
+
['did'],
|
46
|
+
'account',
|
47
|
+
['did'],
|
48
|
+
// cascade on delete, future-proofing on update (fk can't be altered)
|
49
|
+
(qb) => qb.onDelete('cascade').onUpdate('cascade'),
|
50
|
+
)
|
51
|
+
.addForeignKeyConstraint(
|
52
|
+
'account_device_device_id_fk',
|
53
|
+
['deviceId'],
|
54
|
+
'device',
|
55
|
+
['id'],
|
56
|
+
// cascade on delete, future-proofing on update (fk can't be altered)
|
57
|
+
(qb) => qb.onDelete('cascade').onUpdate('cascade'),
|
58
|
+
)
|
59
|
+
.execute()
|
60
|
+
|
61
|
+
// Migrate "device_account" to "account_device"
|
62
|
+
await db
|
63
|
+
.insertInto('account_device')
|
64
|
+
.columns(['did', 'deviceId', 'createdAt', 'updatedAt'])
|
65
|
+
.expression(
|
66
|
+
db
|
67
|
+
.selectFrom('device_account')
|
68
|
+
.select('did')
|
69
|
+
.select('deviceId')
|
70
|
+
.select('authenticatedAt as createdAt') // Best we can do
|
71
|
+
.select('authenticatedAt as updatedAt')
|
72
|
+
.where('remember', '=', 1),
|
73
|
+
)
|
74
|
+
.onConflict((oc) => oc.doNothing())
|
75
|
+
.execute()
|
76
|
+
|
77
|
+
// @NOTE No need to create an index on "deviceId" for "account_device" because
|
78
|
+
// it is the first column in the primary key constraint
|
79
|
+
|
80
|
+
await db.schema
|
81
|
+
.createIndex('account_device_did_idx')
|
82
|
+
.on('account_device')
|
83
|
+
.column('did')
|
84
|
+
.execute()
|
85
|
+
|
86
|
+
await db.schema
|
87
|
+
.createTable('authorized_client')
|
88
|
+
.addColumn('did', 'varchar', (col) => col.notNull())
|
89
|
+
.addColumn('clientId', 'varchar', (col) => col.notNull())
|
90
|
+
.addColumn('createdAt', 'varchar', (col) => col.notNull())
|
91
|
+
.addColumn('updatedAt', 'varchar', (col) => col.notNull())
|
92
|
+
.addColumn('data', 'varchar', (col) => col.notNull())
|
93
|
+
.addPrimaryKeyConstraint('authorized_client_pk', ['did', 'clientId'])
|
94
|
+
.addForeignKeyConstraint(
|
95
|
+
'authorized_client_did_fk',
|
96
|
+
['did'],
|
97
|
+
'account',
|
98
|
+
['did'],
|
99
|
+
// cascade on delete, future-proofing on update (fk can't be altered)
|
100
|
+
(qb) => qb.onDelete('cascade').onUpdate('cascade'),
|
101
|
+
)
|
102
|
+
.execute()
|
103
|
+
|
104
|
+
// We don't migrate the "device_account" authorized clients. Users will need
|
105
|
+
// to reauthorize the client during the next oauth flow (minor inconvenience
|
106
|
+
// for authenticated clients users).
|
107
|
+
}
|
108
|
+
|
109
|
+
export async function down(db: Kysely<unknown>): Promise<void> {
|
110
|
+
await db.schema.dropTable('authorized_client').execute()
|
111
|
+
await db.schema.dropTable('account_device').execute()
|
112
|
+
}
|
@@ -2,10 +2,12 @@ import * as mig001 from './001-init'
|
|
2
2
|
import * as mig002 from './002-account-deactivation'
|
3
3
|
import * as mig003 from './003-privileged-app-passwords'
|
4
4
|
import * as mig004 from './004-oauth'
|
5
|
+
import * as mig005 from './005-oauth-account-management'
|
5
6
|
|
6
7
|
export default {
|
7
8
|
'001': mig001,
|
8
9
|
'002': mig002,
|
9
10
|
'003': mig003,
|
10
11
|
'004': mig004,
|
12
|
+
'005': mig005,
|
11
13
|
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import { DeviceId } from '@atproto/oauth-provider'
|
2
|
+
import { DateISO } from '../../../db'
|
3
|
+
|
4
|
+
export interface AccountDevice {
|
5
|
+
did: string
|
6
|
+
deviceId: DeviceId
|
7
|
+
|
8
|
+
createdAt: DateISO
|
9
|
+
updatedAt: DateISO
|
10
|
+
}
|
11
|
+
|
12
|
+
export const tableName = 'account_device'
|
13
|
+
|
14
|
+
export type PartialDB = { [tableName]: AccountDevice }
|
@@ -1,11 +1,13 @@
|
|
1
1
|
import { Selectable } from 'kysely'
|
2
2
|
import {
|
3
|
+
ClientAuth,
|
3
4
|
Code,
|
4
5
|
DeviceId,
|
6
|
+
OAuthAuthorizationRequestParameters,
|
5
7
|
OAuthClientId,
|
6
8
|
RequestId,
|
7
9
|
} from '@atproto/oauth-provider'
|
8
|
-
import { DateISO,
|
10
|
+
import { DateISO, JsonEncoded } from '../../../db'
|
9
11
|
|
10
12
|
export interface AuthorizationRequest {
|
11
13
|
id: RequestId
|
@@ -13,8 +15,8 @@ export interface AuthorizationRequest {
|
|
13
15
|
deviceId: DeviceId | null
|
14
16
|
|
15
17
|
clientId: OAuthClientId
|
16
|
-
clientAuth:
|
17
|
-
parameters:
|
18
|
+
clientAuth: JsonEncoded<ClientAuth>
|
19
|
+
parameters: JsonEncoded<OAuthAuthorizationRequestParameters>
|
18
20
|
expiresAt: DateISO
|
19
21
|
code: Code | null
|
20
22
|
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { Selectable } from 'kysely'
|
2
|
+
import { AuthorizedClientData, OAuthClientId } from '@atproto/oauth-provider'
|
3
|
+
import { DateISO, JsonEncoded } from '../../../db'
|
4
|
+
|
5
|
+
export interface AuthorizedClient {
|
6
|
+
did: string
|
7
|
+
clientId: OAuthClientId
|
8
|
+
|
9
|
+
createdAt: DateISO
|
10
|
+
updatedAt: DateISO
|
11
|
+
|
12
|
+
data: JsonEncoded<AuthorizedClientData>
|
13
|
+
}
|
14
|
+
|
15
|
+
export type AuthorizedClientEntry = Selectable<AuthorizedClient>
|
16
|
+
|
17
|
+
export const tableName = 'authorized_client'
|
18
|
+
|
19
|
+
export type PartialDB = { [tableName]: AuthorizedClient }
|
@@ -1,9 +1,10 @@
|
|
1
1
|
import * as account from './account'
|
2
|
+
import * as accountDevice from './account-device'
|
2
3
|
import * as actor from './actor'
|
3
4
|
import * as appPassword from './app-password'
|
4
5
|
import * as oauthRequest from './authorization-request'
|
6
|
+
import * as authorizedClient from './authorized-client'
|
5
7
|
import * as device from './device'
|
6
|
-
import * as deviceAccount from './device-account'
|
7
8
|
import * as emailToken from './email-token'
|
8
9
|
import * as inviteCode from './invite-code'
|
9
10
|
import * as refreshToken from './refresh-token'
|
@@ -13,8 +14,9 @@ import * as usedRefreshToken from './used-refresh-token'
|
|
13
14
|
|
14
15
|
export type DatabaseSchema = actor.PartialDB &
|
15
16
|
account.PartialDB &
|
17
|
+
accountDevice.PartialDB &
|
18
|
+
authorizedClient.PartialDB &
|
16
19
|
device.PartialDB &
|
17
|
-
deviceAccount.PartialDB &
|
18
20
|
oauthRequest.PartialDB &
|
19
21
|
token.PartialDB &
|
20
22
|
usedRefreshToken.PartialDB &
|
@@ -26,8 +28,8 @@ export type DatabaseSchema = actor.PartialDB &
|
|
26
28
|
|
27
29
|
export type { Actor, ActorEntry } from './actor'
|
28
30
|
export type { Account, AccountEntry } from './account'
|
31
|
+
export type { AccountDevice } from './account-device'
|
29
32
|
export type { Device } from './device'
|
30
|
-
export type { DeviceAccount } from './device-account'
|
31
33
|
export type { AuthorizationRequest } from './authorization-request'
|
32
34
|
export type { Token } from './token'
|
33
35
|
export type { UsedRefreshToken } from './used-refresh-token'
|
@@ -1,13 +1,16 @@
|
|
1
1
|
import { Generated, Selectable } from 'kysely'
|
2
2
|
import {
|
3
|
+
ClientAuth,
|
3
4
|
Code,
|
4
5
|
DeviceId,
|
6
|
+
OAuthAuthorizationDetails,
|
7
|
+
OAuthAuthorizationRequestParameters,
|
5
8
|
OAuthClientId,
|
6
9
|
RefreshToken,
|
7
10
|
Sub,
|
8
11
|
TokenId,
|
9
12
|
} from '@atproto/oauth-provider'
|
10
|
-
import { DateISO,
|
13
|
+
import { DateISO, JsonEncoded } from '../../../db/cast'
|
11
14
|
|
12
15
|
export interface Token {
|
13
16
|
id: Generated<number>
|
@@ -18,10 +21,10 @@ export interface Token {
|
|
18
21
|
updatedAt: DateISO
|
19
22
|
expiresAt: DateISO
|
20
23
|
clientId: OAuthClientId
|
21
|
-
clientAuth:
|
24
|
+
clientAuth: JsonEncoded<ClientAuth>
|
22
25
|
deviceId: DeviceId | null
|
23
|
-
parameters:
|
24
|
-
details:
|
26
|
+
parameters: JsonEncoded<OAuthAuthorizationRequestParameters>
|
27
|
+
details: JsonEncoded<OAuthAuthorizationDetails> | null
|
25
28
|
code: Code | null
|
26
29
|
currentRefreshToken: RefreshToken | null
|
27
30
|
}
|
@@ -0,0 +1,66 @@
|
|
1
|
+
import assert from 'node:assert'
|
2
|
+
import { DeviceId } from '@atproto/oauth-provider'
|
3
|
+
import { toDateISO } from '../../db'
|
4
|
+
import { AccountDb } from '../db'
|
5
|
+
import { selectAccountQB } from './account'
|
6
|
+
|
7
|
+
export function upsertQB(db: AccountDb, deviceId: DeviceId, did: string) {
|
8
|
+
const now = new Date()
|
9
|
+
|
10
|
+
return db.db
|
11
|
+
.insertInto('account_device')
|
12
|
+
.values({
|
13
|
+
did,
|
14
|
+
deviceId,
|
15
|
+
createdAt: toDateISO(now),
|
16
|
+
updatedAt: toDateISO(now),
|
17
|
+
})
|
18
|
+
.onConflict((oc) =>
|
19
|
+
// uses pk
|
20
|
+
oc.columns(['deviceId', 'did']).doUpdateSet({
|
21
|
+
updatedAt: toDateISO(now),
|
22
|
+
}),
|
23
|
+
)
|
24
|
+
}
|
25
|
+
|
26
|
+
export function selectQB(
|
27
|
+
db: AccountDb,
|
28
|
+
filter: {
|
29
|
+
sub?: string
|
30
|
+
deviceId?: DeviceId
|
31
|
+
},
|
32
|
+
) {
|
33
|
+
assert(
|
34
|
+
filter.sub != null || filter.deviceId != null,
|
35
|
+
'Either sub or deviceId must be provided',
|
36
|
+
)
|
37
|
+
|
38
|
+
return (
|
39
|
+
selectAccountQB(db, { includeDeactivated: true })
|
40
|
+
// note: query planner should use "account_device_pk" index
|
41
|
+
.innerJoin('account_device', 'account_device.did', 'actor.did')
|
42
|
+
.select([
|
43
|
+
'account_device.deviceId',
|
44
|
+
'account_device.createdAt as adCreatedAt',
|
45
|
+
'account_device.updatedAt as adUpdatedAt',
|
46
|
+
])
|
47
|
+
.innerJoin('device', 'device.id', 'account_device.deviceId')
|
48
|
+
.select([
|
49
|
+
'device.sessionId',
|
50
|
+
'device.userAgent',
|
51
|
+
'device.ipAddress',
|
52
|
+
'device.lastSeenAt',
|
53
|
+
])
|
54
|
+
.if(filter.sub != null, (qb) => qb.where('actor.did', '=', filter.sub!))
|
55
|
+
.if(filter.deviceId != null, (qb) =>
|
56
|
+
qb.where('account_device.deviceId', '=', filter.deviceId!),
|
57
|
+
)
|
58
|
+
)
|
59
|
+
}
|
60
|
+
|
61
|
+
export function removeQB(db: AccountDb, deviceId: DeviceId, did: string) {
|
62
|
+
return db.db
|
63
|
+
.deleteFrom('account_device')
|
64
|
+
.where('deviceId', '=', deviceId)
|
65
|
+
.where('did', '=', did)
|
66
|
+
}
|
@@ -6,15 +6,15 @@ import {
|
|
6
6
|
RequestId,
|
7
7
|
UpdateRequestData,
|
8
8
|
} from '@atproto/oauth-provider'
|
9
|
-
import { fromDateISO,
|
9
|
+
import { fromDateISO, fromJson, toDateISO, toJson } from '../../db'
|
10
10
|
import { AccountDb, AuthorizationRequest } from '../db'
|
11
11
|
|
12
12
|
export const rowToRequestData = (
|
13
13
|
row: Selectable<AuthorizationRequest>,
|
14
14
|
): RequestData => ({
|
15
15
|
clientId: row.clientId,
|
16
|
-
clientAuth:
|
17
|
-
parameters:
|
16
|
+
clientAuth: fromJson(row.clientAuth),
|
17
|
+
parameters: fromJson(row.parameters),
|
18
18
|
expiresAt: fromDateISO(row.expiresAt),
|
19
19
|
deviceId: row.deviceId,
|
20
20
|
sub: row.did,
|
@@ -37,8 +37,8 @@ const requestDataToRow = (
|
|
37
37
|
deviceId: data.deviceId,
|
38
38
|
|
39
39
|
clientId: data.clientId,
|
40
|
-
clientAuth:
|
41
|
-
parameters:
|
40
|
+
clientAuth: toJson(data.clientAuth),
|
41
|
+
parameters: toJson(data.parameters),
|
42
42
|
expiresAt: toDateISO(data.expiresAt),
|
43
43
|
code: data.code,
|
44
44
|
})
|
@@ -0,0 +1,69 @@
|
|
1
|
+
import {
|
2
|
+
AuthorizedClientData,
|
3
|
+
AuthorizedClients,
|
4
|
+
ClientId,
|
5
|
+
Sub,
|
6
|
+
} from '@atproto/oauth-provider'
|
7
|
+
import { fromJson, toDateISO, toJson } from '../../db'
|
8
|
+
import { AccountDb } from '../db'
|
9
|
+
|
10
|
+
export async function upsert(
|
11
|
+
db: AccountDb,
|
12
|
+
did: string,
|
13
|
+
clientId: ClientId,
|
14
|
+
data: AuthorizedClientData,
|
15
|
+
) {
|
16
|
+
const now = new Date()
|
17
|
+
|
18
|
+
return db.db
|
19
|
+
.insertInto('authorized_client')
|
20
|
+
.values({
|
21
|
+
did,
|
22
|
+
clientId,
|
23
|
+
createdAt: toDateISO(now),
|
24
|
+
updatedAt: toDateISO(now),
|
25
|
+
data: toJson(data),
|
26
|
+
})
|
27
|
+
.onConflict((oc) =>
|
28
|
+
// uses "authorized_client_pk" idx
|
29
|
+
oc.columns(['did', 'clientId']).doUpdateSet({
|
30
|
+
updatedAt: toDateISO(now),
|
31
|
+
data: toJson(data),
|
32
|
+
}),
|
33
|
+
)
|
34
|
+
.executeTakeFirst()
|
35
|
+
}
|
36
|
+
|
37
|
+
export async function getAuthorizedClients(
|
38
|
+
db: AccountDb,
|
39
|
+
did: string,
|
40
|
+
): Promise<AuthorizedClients> {
|
41
|
+
return (await getAuthorizedClientsMulti(db, [did])).get(did)!
|
42
|
+
}
|
43
|
+
|
44
|
+
export async function getAuthorizedClientsMulti(
|
45
|
+
db: AccountDb,
|
46
|
+
dids: Iterable<string>,
|
47
|
+
): Promise<Map<Sub, AuthorizedClients>> {
|
48
|
+
// Using a Map will ensure unicity of dids (through unicity of keys)
|
49
|
+
const map = new Map<Sub, AuthorizedClients>(
|
50
|
+
Array.from(dids, (did) => [did, new Map()]),
|
51
|
+
)
|
52
|
+
|
53
|
+
if (map.size) {
|
54
|
+
const found = await db.db
|
55
|
+
.selectFrom('authorized_client')
|
56
|
+
.select('did')
|
57
|
+
.select('clientId')
|
58
|
+
.select('data')
|
59
|
+
// uses "authorized_client_pk"
|
60
|
+
.where('did', 'in', [...map.keys()])
|
61
|
+
.execute()
|
62
|
+
|
63
|
+
for (const { did, clientId, data } of found) {
|
64
|
+
map.get(did)!.set(clientId, fromJson(data))
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
return map
|
69
|
+
}
|
@@ -3,7 +3,9 @@ import { DeviceData, DeviceId } from '@atproto/oauth-provider'
|
|
3
3
|
import { fromDateISO, toDateISO } from '../../db'
|
4
4
|
import { AccountDb, Device } from '../db'
|
5
5
|
|
6
|
-
export const rowToDeviceData = (
|
6
|
+
export const rowToDeviceData = (
|
7
|
+
row: Omit<Selectable<Device>, 'id'>,
|
8
|
+
): DeviceData => ({
|
7
9
|
sessionId: row.sessionId,
|
8
10
|
userAgent: row.userAgent,
|
9
11
|
ipAddress: row.ipAddress,
|