@atproto/pds 0.4.204 → 0.4.205
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 +18 -0
- package/LICENSE.txt +1 -1
- package/dist/account-manager/helpers/token.d.ts +32 -32
- package/dist/actor-store/blob/transactor.d.ts +0 -2
- package/dist/actor-store/blob/transactor.d.ts.map +1 -1
- package/dist/actor-store/blob/transactor.js +2 -41
- package/dist/actor-store/blob/transactor.js.map +1 -1
- package/dist/actor-store/db/schema/blob.d.ts +0 -2
- package/dist/actor-store/db/schema/blob.d.ts.map +1 -1
- package/dist/actor-store/db/schema/blob.js.map +1 -1
- package/dist/lexicon/index.d.ts +13 -0
- package/dist/lexicon/index.d.ts.map +1 -1
- package/dist/lexicon/index.js +37 -1
- package/dist/lexicon/index.js.map +1 -1
- package/dist/lexicon/lexicons.d.ts +784 -6
- package/dist/lexicon/lexicons.d.ts.map +1 -1
- package/dist/lexicon/lexicons.js +404 -2
- package/dist/lexicon/lexicons.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/defs.d.ts +19 -1
- package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/defs.js +18 -0
- package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/draft/createDraft.d.ts +27 -0
- package/dist/lexicon/types/app/bsky/draft/createDraft.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/createDraft.js +7 -0
- package/dist/lexicon/types/app/bsky/draft/createDraft.js.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/defs.d.ts +106 -0
- package/dist/lexicon/types/app/bsky/draft/defs.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/defs.js +97 -0
- package/dist/lexicon/types/app/bsky/draft/defs.js.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/deleteDraft.d.ts +14 -0
- package/dist/lexicon/types/app/bsky/draft/deleteDraft.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/deleteDraft.js +7 -0
- package/dist/lexicon/types/app/bsky/draft/deleteDraft.js.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/getDrafts.d.ts +24 -0
- package/dist/lexicon/types/app/bsky/draft/getDrafts.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/getDrafts.js +7 -0
- package/dist/lexicon/types/app/bsky/draft/getDrafts.js.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/updateDraft.d.ts +15 -0
- package/dist/lexicon/types/app/bsky/draft/updateDraft.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/draft/updateDraft.js +7 -0
- package/dist/lexicon/types/app/bsky/draft/updateDraft.js.map +1 -0
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.d.ts +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsers.js.map +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.d.ts +1 -1
- package/dist/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.js.map +1 -1
- package/dist/sequencer/events.d.ts +6 -6
- package/dist/sequencer/events.js +1 -1
- package/dist/sequencer/events.js.map +1 -1
- package/package.json +11 -12
- package/src/actor-store/blob/transactor.ts +2 -10
- package/src/actor-store/db/schema/blob.ts +2 -2
- package/src/lexicon/index.ts +62 -0
- package/src/lexicon/lexicons.ts +414 -2
- package/src/lexicon/types/app/bsky/actor/defs.ts +37 -0
- package/src/lexicon/types/app/bsky/draft/createDraft.ts +46 -0
- package/src/lexicon/types/app/bsky/draft/defs.ts +208 -0
- package/src/lexicon/types/app/bsky/draft/deleteDraft.ts +33 -0
- package/src/lexicon/types/app/bsky/draft/getDrafts.ts +42 -0
- package/src/lexicon/types/app/bsky/draft/updateDraft.ts +34 -0
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsers.ts +1 -1
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts +1 -1
- package/src/sequencer/events.ts +2 -2
- package/tests/file-uploads.test.ts +0 -6
- package/tsconfig.build.tsbuildinfo +1 -1
- package/dist/image/index.d.ts +0 -16
- package/dist/image/index.d.ts.map +0 -1
- package/dist/image/index.js +0 -59
- package/dist/image/index.js.map +0 -1
- package/src/image/index.ts +0 -67
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @atproto/pds
|
|
2
2
|
|
|
3
|
+
## 0.4.205
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#4564](https://github.com/bluesky-social/atproto/pull/4564) [`3fbec80`](https://github.com/bluesky-social/atproto/commit/3fbec803ed188cef9baa998ac3e66ccb8c0f1e5c) Thanks [@DavidBuchanan314](https://github.com/DavidBuchanan314)! - Stop probing image dimensions unnecessarily (the data was never used)
|
|
8
|
+
|
|
9
|
+
- [#4562](https://github.com/bluesky-social/atproto/pull/4562) [`7310b97`](https://github.com/bluesky-social/atproto/commit/7310b9704de678a3b389a741784d58bb7f79b10b) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Remove un-necessary call to `noUndefinedVals`
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [[`cbd5837`](https://github.com/bluesky-social/atproto/commit/cbd5837f015e6b5e098a60098faea82e7f9419f3), [`99963d0`](https://github.com/bluesky-social/atproto/commit/99963d002a9e030e79aed5fba700e0a68f31e101), [`7310b97`](https://github.com/bluesky-social/atproto/commit/7310b9704de678a3b389a741784d58bb7f79b10b), [`7310b97`](https://github.com/bluesky-social/atproto/commit/7310b9704de678a3b389a741784d58bb7f79b10b), [`d8e5363`](https://github.com/bluesky-social/atproto/commit/d8e53636c84da6dd3dd69e1d260f4fa617f3883c), [`99963d0`](https://github.com/bluesky-social/atproto/commit/99963d002a9e030e79aed5fba700e0a68f31e101), [`9bdd358`](https://github.com/bluesky-social/atproto/commit/9bdd35881aa7efce6595ef708ba13d99c473d114), [`99963d0`](https://github.com/bluesky-social/atproto/commit/99963d002a9e030e79aed5fba700e0a68f31e101), [`ecf5921`](https://github.com/bluesky-social/atproto/commit/ecf59214d59d9d2530c197c0679d26e76c6a60ef), [`99963d0`](https://github.com/bluesky-social/atproto/commit/99963d002a9e030e79aed5fba700e0a68f31e101), [`fa4ef5e`](https://github.com/bluesky-social/atproto/commit/fa4ef5e8150b6ae7fabdc90b847370481e1a6b33), [`7310b97`](https://github.com/bluesky-social/atproto/commit/7310b9704de678a3b389a741784d58bb7f79b10b), [`99963d0`](https://github.com/bluesky-social/atproto/commit/99963d002a9e030e79aed5fba700e0a68f31e101), [`99963d0`](https://github.com/bluesky-social/atproto/commit/99963d002a9e030e79aed5fba700e0a68f31e101), [`99963d0`](https://github.com/bluesky-social/atproto/commit/99963d002a9e030e79aed5fba700e0a68f31e101)]:
|
|
12
|
+
- @atproto/api@0.18.17
|
|
13
|
+
- @atproto/syntax@0.4.3
|
|
14
|
+
- @atproto/lex-cbor@0.0.9
|
|
15
|
+
- @atproto/lexicon@0.6.1
|
|
16
|
+
- @atproto/oauth-provider@0.15.5
|
|
17
|
+
- @atproto/lex-data@0.0.9
|
|
18
|
+
- @atproto/common@0.5.9
|
|
19
|
+
- @atproto/xrpc-server@0.10.10
|
|
20
|
+
|
|
3
21
|
## 0.4.204
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
package/LICENSE.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Dual MIT/Apache-2.0 License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2022-
|
|
3
|
+
Copyright (c) 2022-2026 Bluesky Social PBC, and Contributors
|
|
4
4
|
|
|
5
5
|
Except as otherwise noted in individual files, this software is licensed under the MIT license (<http://opensource.org/licenses/MIT>), or the Apache License, Version 2.0 (<http://www.apache.org/licenses/LICENSE-2.0>).
|
|
6
6
|
|
|
@@ -58,7 +58,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
58
58
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
59
59
|
account_device: import("../db").AccountDevice;
|
|
60
60
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
61
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
61
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
62
62
|
lexicon: import("../db").Lexicon;
|
|
63
63
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
64
64
|
token: Token;
|
|
@@ -90,7 +90,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
90
90
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
91
91
|
account_device: import("../db").AccountDevice;
|
|
92
92
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
93
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
93
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>, import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
94
94
|
lexicon: import("../db").Lexicon;
|
|
95
95
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
96
96
|
token: Token;
|
|
@@ -122,7 +122,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
122
122
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
123
123
|
account_device: import("../db").AccountDevice;
|
|
124
124
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
125
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
125
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
126
126
|
lexicon: import("../db").Lexicon;
|
|
127
127
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
128
128
|
token: Token;
|
|
@@ -154,7 +154,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
154
154
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
155
155
|
account_device: import("../db").AccountDevice;
|
|
156
156
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
157
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
157
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>>, import("kysely/dist/cjs/util/type-utils").MergePartial<import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
158
158
|
lexicon: import("../db").Lexicon;
|
|
159
159
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
160
160
|
token: Token;
|
|
@@ -186,7 +186,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
186
186
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
187
187
|
account_device: import("../db").AccountDevice;
|
|
188
188
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
189
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
189
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
190
190
|
lexicon: import("../db").Lexicon;
|
|
191
191
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
192
192
|
token: Token;
|
|
@@ -218,7 +218,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
218
218
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
219
219
|
account_device: import("../db").AccountDevice;
|
|
220
220
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
221
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
221
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>, import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
222
222
|
lexicon: import("../db").Lexicon;
|
|
223
223
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
224
224
|
token: Token;
|
|
@@ -250,7 +250,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
250
250
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
251
251
|
account_device: import("../db").AccountDevice;
|
|
252
252
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
253
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
253
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
254
254
|
lexicon: import("../db").Lexicon;
|
|
255
255
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
256
256
|
token: Token;
|
|
@@ -282,7 +282,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
282
282
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
283
283
|
account_device: import("../db").AccountDevice;
|
|
284
284
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
285
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
285
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>>>, import("kysely/dist/cjs/util/type-utils").MergePartial<import("kysely/dist/cjs/util/type-utils").MergePartial<import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
286
286
|
lexicon: import("../db").Lexicon;
|
|
287
287
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
288
288
|
token: Token;
|
|
@@ -314,7 +314,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
314
314
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
315
315
|
account_device: import("../db").AccountDevice;
|
|
316
316
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
317
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
317
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
318
318
|
lexicon: import("../db").Lexicon;
|
|
319
319
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
320
320
|
token: Token;
|
|
@@ -346,7 +346,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
346
346
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
347
347
|
account_device: import("../db").AccountDevice;
|
|
348
348
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
349
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
349
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>, import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
350
350
|
lexicon: import("../db").Lexicon;
|
|
351
351
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
352
352
|
token: Token;
|
|
@@ -378,7 +378,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
378
378
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
379
379
|
account_device: import("../db").AccountDevice;
|
|
380
380
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
381
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
381
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
382
382
|
lexicon: import("../db").Lexicon;
|
|
383
383
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
384
384
|
token: Token;
|
|
@@ -410,7 +410,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
410
410
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
411
411
|
account_device: import("../db").AccountDevice;
|
|
412
412
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
413
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
413
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>>, import("kysely/dist/cjs/util/type-utils").MergePartial<import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
414
414
|
lexicon: import("../db").Lexicon;
|
|
415
415
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
416
416
|
token: Token;
|
|
@@ -442,7 +442,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
442
442
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
443
443
|
account_device: import("../db").AccountDevice;
|
|
444
444
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
445
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
445
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
446
446
|
lexicon: import("../db").Lexicon;
|
|
447
447
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
448
448
|
token: Token;
|
|
@@ -474,7 +474,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
474
474
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
475
475
|
account_device: import("../db").AccountDevice;
|
|
476
476
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
477
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
477
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>, import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
478
478
|
lexicon: import("../db").Lexicon;
|
|
479
479
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
480
480
|
token: Token;
|
|
@@ -506,7 +506,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
506
506
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
507
507
|
account_device: import("../db").AccountDevice;
|
|
508
508
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
509
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
509
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
510
510
|
lexicon: import("../db").Lexicon;
|
|
511
511
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
512
512
|
token: Token;
|
|
@@ -538,7 +538,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
538
538
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
539
539
|
account_device: import("../db").AccountDevice;
|
|
540
540
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
541
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
541
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>>>>, import("kysely/dist/cjs/util/type-utils").MergePartial<import("kysely/dist/cjs/util/type-utils").MergePartial<import("kysely/dist/cjs/util/type-utils").MergePartial<import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
542
542
|
lexicon: import("../db").Lexicon;
|
|
543
543
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
544
544
|
token: Token;
|
|
@@ -570,7 +570,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
570
570
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
571
571
|
account_device: import("../db").AccountDevice;
|
|
572
572
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
573
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
573
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
574
574
|
lexicon: import("../db").Lexicon;
|
|
575
575
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
576
576
|
token: Token;
|
|
@@ -602,7 +602,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
602
602
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
603
603
|
account_device: import("../db").AccountDevice;
|
|
604
604
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
605
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
605
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>, import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
606
606
|
lexicon: import("../db").Lexicon;
|
|
607
607
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
608
608
|
token: Token;
|
|
@@ -634,7 +634,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
634
634
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
635
635
|
account_device: import("../db").AccountDevice;
|
|
636
636
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
637
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
637
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
638
638
|
lexicon: import("../db").Lexicon;
|
|
639
639
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
640
640
|
token: Token;
|
|
@@ -666,7 +666,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
666
666
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
667
667
|
account_device: import("../db").AccountDevice;
|
|
668
668
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
669
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
669
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>>, import("kysely/dist/cjs/util/type-utils").MergePartial<import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
670
670
|
lexicon: import("../db").Lexicon;
|
|
671
671
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
672
672
|
token: Token;
|
|
@@ -698,7 +698,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
698
698
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
699
699
|
account_device: import("../db").AccountDevice;
|
|
700
700
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
701
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
701
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
702
702
|
lexicon: import("../db").Lexicon;
|
|
703
703
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
704
704
|
token: Token;
|
|
@@ -730,7 +730,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
730
730
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
731
731
|
account_device: import("../db").AccountDevice;
|
|
732
732
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
733
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
733
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>, import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
734
734
|
lexicon: import("../db").Lexicon;
|
|
735
735
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
736
736
|
token: Token;
|
|
@@ -762,7 +762,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
762
762
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
763
763
|
account_device: import("../db").AccountDevice;
|
|
764
764
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
765
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
765
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
766
766
|
lexicon: import("../db").Lexicon;
|
|
767
767
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
768
768
|
token: Token;
|
|
@@ -794,7 +794,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
794
794
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
795
795
|
account_device: import("../db").AccountDevice;
|
|
796
796
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
797
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
797
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>>>, import("kysely/dist/cjs/util/type-utils").MergePartial<import("kysely/dist/cjs/util/type-utils").MergePartial<import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
798
798
|
lexicon: import("../db").Lexicon;
|
|
799
799
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
800
800
|
token: Token;
|
|
@@ -826,7 +826,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
826
826
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
827
827
|
account_device: import("../db").AccountDevice;
|
|
828
828
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
829
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
829
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
830
830
|
lexicon: import("../db").Lexicon;
|
|
831
831
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
832
832
|
token: Token;
|
|
@@ -858,7 +858,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
858
858
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
859
859
|
account_device: import("../db").AccountDevice;
|
|
860
860
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
861
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
861
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>, import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
862
862
|
lexicon: import("../db").Lexicon;
|
|
863
863
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
864
864
|
token: Token;
|
|
@@ -890,7 +890,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
890
890
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
891
891
|
account_device: import("../db").AccountDevice;
|
|
892
892
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
893
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
893
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
894
894
|
lexicon: import("../db").Lexicon;
|
|
895
895
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
896
896
|
token: Token;
|
|
@@ -922,7 +922,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
922
922
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
923
923
|
account_device: import("../db").AccountDevice;
|
|
924
924
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
925
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
925
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>>, import("kysely/dist/cjs/util/type-utils").MergePartial<import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
926
926
|
lexicon: import("../db").Lexicon;
|
|
927
927
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
928
928
|
token: Token;
|
|
@@ -954,7 +954,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
954
954
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
955
955
|
account_device: import("../db").AccountDevice;
|
|
956
956
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
957
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
957
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
958
958
|
lexicon: import("../db").Lexicon;
|
|
959
959
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
960
960
|
token: Token;
|
|
@@ -986,7 +986,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
986
986
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
987
987
|
account_device: import("../db").AccountDevice;
|
|
988
988
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
989
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
989
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>, import("kysely/dist/cjs/util/type-utils").MergePartial<Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
990
990
|
lexicon: import("../db").Lexicon;
|
|
991
991
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
992
992
|
token: Token;
|
|
@@ -1018,7 +1018,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
1018
1018
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
1019
1019
|
account_device: import("../db").AccountDevice;
|
|
1020
1020
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
1021
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
1021
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">, Partial<Omit<{}, never>> & Partial<Omit<Partial<Omit<{}, never>>, never>> & import("kysely").Selection<{
|
|
1022
1022
|
lexicon: import("../db").Lexicon;
|
|
1023
1023
|
account: import("kysely/dist/cjs/util/type-utils").Nullable<import("../db").Account>;
|
|
1024
1024
|
token: Token;
|
|
@@ -1050,7 +1050,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
1050
1050
|
used_refresh_token: import("../db").UsedRefreshToken;
|
|
1051
1051
|
account_device: import("../db").AccountDevice;
|
|
1052
1052
|
authorized_client: import("../db/schema/authorized-client").AuthorizedClient;
|
|
1053
|
-
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.
|
|
1053
|
+
}, "account" | "token" | "actor", "token.did" | "token.code" | "token.id" | "token.createdAt" | "token.expiresAt" | "token.updatedAt" | "token.scope" | "token.details" | "token.deviceId" | "token.clientId" | "token.clientAuth" | "token.parameters" | "token.tokenId" | "token.currentRefreshToken">>>>>>>;
|
|
1054
1054
|
export declare const removeByDidQB: (db: AccountDb, did: string) => import("kysely").DeleteQueryBuilder<import("kysely/dist/cjs/parser/table-parser").From<import("../db").DatabaseSchema, "token">, "token", import("kysely").DeleteResult>;
|
|
1055
1055
|
export declare const rotateQB: (db: AccountDb, id: number, newTokenId: TokenId, newRefreshToken: RefreshToken, newData: NewTokenData) => import("kysely").UpdateQueryBuilder<import("kysely/dist/cjs/parser/table-parser").From<import("../db").DatabaseSchema, "token">, "token", "token", import("kysely").UpdateResult>;
|
|
1056
1056
|
export declare const removeQB: (db: AccountDb, tokenId: TokenId) => import("kysely").DeleteQueryBuilder<import("kysely/dist/cjs/parser/table-parser").From<import("../db").DatabaseSchema, "token">, "token", import("kysely").DeleteResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/blob/transactor.ts"],"names":[],"mappings":"AAGA,OAAO,MAAM,MAAM,aAAa,CAAA;AAGhC,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAQtC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAqB,SAAS,EAAiB,MAAM,eAAe,CAAA;AAC3E,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"transactor.d.ts","sourceRoot":"","sources":["../../../src/actor-store/blob/transactor.ts"],"names":[],"mappings":"AAGA,OAAO,MAAM,MAAM,aAAa,CAAA;AAGhC,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAQtC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAqB,SAAS,EAAiB,MAAM,eAAe,CAAA;AAC3E,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAA;AAEvE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,OAAO,EAAqB,MAAM,OAAO,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,GAAG,CAAA;IACR,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,qBAAa,cAAe,SAAQ,UAAU;IAEnC,EAAE,EAAE,OAAO;IACX,SAAS,EAAE,SAAS;IACpB,eAAe,EAAE,eAAe;gBAFhC,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe;IAKnC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC;IAevD,wBAAwB,CAC5B,iBAAiB,EAAE,MAAM,EACzB,UAAU,EAAE,MAAM,CAAC,QAAQ,GAC1B,OAAO,CAAC,YAAY,CAAC;IAmBlB,mBAAmB,CAAC,QAAQ,EAAE,YAAY;IA8B1C,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE;IAuCtD,wBAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU;IA+BvD,uBAAuB,CAC3B,MAAM,EAAE,aAAa,EAAE,EACvB,aAAa,CAAC,EAAE,OAAO;IAyDnB,0BAA0B,CAC9B,IAAI,EAAE,eAAe,EACrB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC;IAiDV,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxD,aAAa,CAAC,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;CAU5E;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,GAAG,EAAE,GAAG,CAAA;gBACI,GAAG,EAAE,GAAG;CAIrB"}
|
|
@@ -1,38 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/* eslint-disable import/no-deprecated */
|
|
3
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
-
if (k2 === undefined) k2 = k;
|
|
5
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
-
}
|
|
9
|
-
Object.defineProperty(o, k2, desc);
|
|
10
|
-
}) : (function(o, m, k, k2) {
|
|
11
|
-
if (k2 === undefined) k2 = k;
|
|
12
|
-
o[k2] = m[k];
|
|
13
|
-
}));
|
|
14
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
-
}) : function(o, v) {
|
|
17
|
-
o["default"] = v;
|
|
18
|
-
});
|
|
19
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
-
var ownKeys = function(o) {
|
|
21
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
-
var ar = [];
|
|
23
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
-
return ar;
|
|
25
|
-
};
|
|
26
|
-
return ownKeys(o);
|
|
27
|
-
};
|
|
28
|
-
return function (mod) {
|
|
29
|
-
if (mod && mod.__esModule) return mod;
|
|
30
|
-
var result = {};
|
|
31
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
-
__setModuleDefault(result, mod);
|
|
33
|
-
return result;
|
|
34
|
-
};
|
|
35
|
-
})();
|
|
36
3
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
4
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
5
|
};
|
|
@@ -47,7 +14,6 @@ const common_1 = require("@atproto/common");
|
|
|
47
14
|
const lexicon_1 = require("@atproto/lexicon");
|
|
48
15
|
const repo_1 = require("@atproto/repo");
|
|
49
16
|
const xrpc_server_1 = require("@atproto/xrpc-server");
|
|
50
|
-
const img = __importStar(require("../../image"));
|
|
51
17
|
const logger_1 = require("../../logger");
|
|
52
18
|
const reader_1 = require("./reader");
|
|
53
19
|
class BlobTransactor extends reader_1.BlobReader {
|
|
@@ -86,11 +52,10 @@ class BlobTransactor extends reader_1.BlobReader {
|
|
|
86
52
|
}
|
|
87
53
|
}
|
|
88
54
|
async uploadBlobAndGetMetadata(userSuggestedMime, blobStream) {
|
|
89
|
-
const [tempKey, size, sha256,
|
|
55
|
+
const [tempKey, size, sha256, sniffedMime] = await Promise.all([
|
|
90
56
|
this.blobstore.putTemp((0, common_1.cloneStream)(blobStream)),
|
|
91
57
|
(0, common_1.streamSize)((0, common_1.cloneStream)(blobStream)),
|
|
92
58
|
sha256Stream((0, common_1.cloneStream)(blobStream)),
|
|
93
|
-
img.maybeGetInfo((0, common_1.cloneStream)(blobStream)),
|
|
94
59
|
mimeTypeFromStream((0, common_1.cloneStream)(blobStream)),
|
|
95
60
|
]);
|
|
96
61
|
const cid = (0, common_1.sha256RawToCid)(sha256);
|
|
@@ -100,12 +65,10 @@ class BlobTransactor extends reader_1.BlobReader {
|
|
|
100
65
|
size,
|
|
101
66
|
cid,
|
|
102
67
|
mimeType,
|
|
103
|
-
width: imgInfo?.width ?? null,
|
|
104
|
-
height: imgInfo?.height ?? null,
|
|
105
68
|
};
|
|
106
69
|
}
|
|
107
70
|
async trackUntetheredBlob(metadata) {
|
|
108
|
-
const { tempKey, size, cid, mimeType
|
|
71
|
+
const { tempKey, size, cid, mimeType } = metadata;
|
|
109
72
|
const found = await this.db.db
|
|
110
73
|
.selectFrom('blob')
|
|
111
74
|
.selectAll()
|
|
@@ -121,8 +84,6 @@ class BlobTransactor extends reader_1.BlobReader {
|
|
|
121
84
|
mimeType,
|
|
122
85
|
size,
|
|
123
86
|
tempKey,
|
|
124
|
-
width,
|
|
125
|
-
height,
|
|
126
87
|
createdAt: new Date().toISOString(),
|
|
127
88
|
})
|
|
128
89
|
.onConflict((oc) => oc
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactor.js","sourceRoot":"","sources":["../../../src/actor-store/blob/transactor.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-deprecated */\n\nimport crypto from 'node:crypto'\nimport stream from 'node:stream'\nimport bytes from 'bytes'\nimport { fromStream as fileTypeFromStream } from 'file-type'\nimport { CID } from 'multiformats/cid'\nimport PQueue from 'p-queue'\nimport {\n SECOND,\n cloneStream,\n sha256RawToCid,\n streamSize,\n} from '@atproto/common'\nimport { BlobRef } from '@atproto/lexicon'\nimport { BlobNotFoundError, BlobStore, WriteOpAction } from '@atproto/repo'\nimport { AtUri } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { BackgroundQueue } from '../../background'\nimport * as img from '../../image'\nimport { StatusAttr } from '../../lexicon/types/com/atproto/admin/defs'\nimport { blobStoreLogger as log } from '../../logger'\nimport { PreparedBlobRef, PreparedWrite } from '../../repo/types'\nimport { ActorDb, Blob as BlobTable } from '../db'\nimport { BlobReader } from './reader'\n\nexport type BlobMetadata = {\n tempKey: string\n size: number\n cid: CID\n mimeType: string\n width: number | null\n height: number | null\n}\n\nexport class BlobTransactor extends BlobReader {\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n public backgroundQueue: BackgroundQueue,\n ) {\n super(db, blobstore)\n }\n\n async insertBlobs(recordUri: string, blobs: Iterable<BlobRef>) {\n const values = Array.from(blobs, (cid) => ({\n recordUri,\n blobCid: cid.ref.toString(),\n }))\n\n if (values.length) {\n await this.db.db\n .insertInto('record_blob')\n .values(values)\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n }\n\n async uploadBlobAndGetMetadata(\n userSuggestedMime: string,\n blobStream: stream.Readable,\n ): Promise<BlobMetadata> {\n const [tempKey, size, sha256, imgInfo, sniffedMime] = await Promise.all([\n this.blobstore.putTemp(cloneStream(blobStream)),\n streamSize(cloneStream(blobStream)),\n sha256Stream(cloneStream(blobStream)),\n img.maybeGetInfo(cloneStream(blobStream)),\n mimeTypeFromStream(cloneStream(blobStream)),\n ])\n\n const cid = sha256RawToCid(sha256)\n const mimeType = sniffedMime || userSuggestedMime\n\n return {\n tempKey,\n size,\n cid,\n mimeType,\n width: imgInfo?.width ?? null,\n height: imgInfo?.height ?? null,\n }\n }\n\n async trackUntetheredBlob(metadata: BlobMetadata) {\n const { tempKey, size, cid, mimeType, width, height } = metadata\n const found = await this.db.db\n .selectFrom('blob')\n .selectAll()\n .where('cid', '=', cid.toString())\n .executeTakeFirst()\n if (found?.takedownRef) {\n throw new InvalidRequestError('Blob has been takendown, cannot re-upload')\n }\n\n await this.db.db\n .insertInto('blob')\n .values({\n cid: cid.toString(),\n mimeType,\n size,\n tempKey,\n width,\n height,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) =>\n oc\n .column('cid')\n .doUpdateSet({ tempKey })\n .where('blob.tempKey', 'is not', null),\n )\n .execute()\n return new BlobRef(cid, mimeType, size)\n }\n\n async processWriteBlobs(rev: string, writes: PreparedWrite[]) {\n await this.deleteDereferencedBlobs(writes)\n\n const ac = new AbortController()\n\n // Limit the number of parallel requests made to the BlobStore by using a\n // a queue with concurrency management.\n type Task = () => Promise<void>\n const tasks: Task[] = []\n\n for (const write of writes) {\n if (isCreate(write) || isUpdate(write)) {\n for (const blob of write.blobs) {\n tasks.push(async () => {\n if (ac.signal.aborted) return\n await this.associateBlob(blob, write.uri)\n await this.verifyBlobAndMakePermanent(blob, ac.signal)\n })\n }\n }\n }\n\n try {\n const queue = new PQueue({\n concurrency: 20,\n // The blob store should already limit the time of every operation. We\n // add a timeout here as an extra precaution.\n timeout: 60 * SECOND,\n throwOnTimeout: true,\n })\n\n // Will reject as soon as any task fails, causing the \"finally\" block\n // below to run, aborting every other pending tasks.\n await queue.addAll(tasks)\n } finally {\n ac.abort()\n }\n }\n\n async updateBlobTakedownStatus(cid: CID, takedown: StatusAttr) {\n const takedownRef = takedown.applied\n ? takedown.ref ?? new Date().toISOString()\n : null\n await this.db.db\n .updateTable('blob')\n .set({ takedownRef })\n .where('cid', '=', cid.toString())\n .executeTakeFirst()\n\n try {\n // @NOTE find a way to not perform i/o operations during the transaction\n // (typically by using a state in the \"blob\" table, and another process to\n // handle the actual i/o)\n if (takedown.applied) {\n await this.blobstore.quarantine(cid)\n } else {\n await this.blobstore.unquarantine(cid)\n }\n } catch (err) {\n if (!(err instanceof BlobNotFoundError)) {\n log.error(\n { err, cid: cid.toString() },\n 'could not update blob takedown status',\n )\n\n throw err\n }\n }\n }\n\n async deleteDereferencedBlobs(\n writes: PreparedWrite[],\n skipBlobStore?: boolean,\n ) {\n const deletes = writes.filter(isDelete)\n const updates = writes.filter(isUpdate)\n const uris = [...deletes, ...updates].map((w) => w.uri.toString())\n if (uris.length === 0) return\n\n const deletedRepoBlobs = await this.db.db\n .deleteFrom('record_blob')\n .where('recordUri', 'in', uris)\n .returning('blobCid')\n .execute()\n if (deletedRepoBlobs.length === 0) return\n\n const deletedRepoBlobCids = deletedRepoBlobs.map((row) => row.blobCid)\n const duplicateCids = await this.db.db\n .selectFrom('record_blob')\n .where('blobCid', 'in', deletedRepoBlobCids)\n .select('blobCid')\n .execute()\n\n const newBlobCids = writes\n .filter((w) => isUpdate(w) || isCreate(w))\n .flatMap((w) => w.blobs.map((b) => b.cid.toString()))\n\n const cidsToKeep = [\n ...newBlobCids,\n ...duplicateCids.map((row) => row.blobCid),\n ]\n\n const cidsToDelete = deletedRepoBlobCids.filter(\n (cid) => !cidsToKeep.includes(cid),\n )\n if (cidsToDelete.length === 0) return\n\n await this.db.db\n .deleteFrom('blob')\n .where('cid', 'in', cidsToDelete)\n .execute()\n\n if (!skipBlobStore) {\n this.db.onCommit(() => {\n this.backgroundQueue.add(async () => {\n try {\n const cids = cidsToDelete.map((cid) => CID.parse(cid))\n await this.blobstore.deleteMany(cids)\n } catch (err) {\n log.error(\n { err, cids: cidsToDelete },\n 'could not delete blobs from blobstore',\n )\n }\n })\n })\n }\n }\n\n async verifyBlobAndMakePermanent(\n blob: PreparedBlobRef,\n signal?: AbortSignal,\n ): Promise<void> {\n const found = await this.db.db\n .selectFrom('blob')\n .select(['tempKey', 'size', 'mimeType'])\n .where('cid', '=', blob.cid.toString())\n .where('takedownRef', 'is', null)\n .executeTakeFirst()\n\n signal?.throwIfAborted()\n\n if (!found) {\n throw new InvalidRequestError(\n `Could not find blob: ${blob.cid.toString()}`,\n 'BlobNotFound',\n )\n }\n\n if (found.tempKey) {\n verifyBlob(blob, found)\n\n // @NOTE it is less than ideal to perform async (i/o) operations during a\n // transaction. Especially since there have been instances of the actor-db\n // being locked, requiring to kick the processes.\n\n // The better solution would be to update the blob state in the database\n // (e.g. \"makeItPermanent\") and to process those updates outside of the\n // transaction.\n\n await this.blobstore\n .makePermanent(found.tempKey, blob.cid)\n .catch((err) => {\n log.error(\n { err, cid: blob.cid.toString() },\n 'could not make blob permanent',\n )\n\n throw err\n })\n\n signal?.throwIfAborted()\n\n await this.db.db\n .updateTable('blob')\n .set({ tempKey: null })\n .where('tempKey', '=', found.tempKey)\n .execute()\n }\n }\n\n async insertBlobMetadata(blob: PreparedBlobRef): Promise<void> {\n await this.db.db\n .insertInto('blob')\n .values({\n cid: blob.cid.toString(),\n mimeType: blob.mimeType,\n size: blob.size,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n\n async associateBlob(blob: PreparedBlobRef, recordUri: AtUri): Promise<void> {\n await this.db.db\n .insertInto('record_blob')\n .values({\n blobCid: blob.cid.toString(),\n recordUri: recordUri.toString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n}\n\nexport class CidNotFound extends Error {\n cid: CID\n constructor(cid: CID) {\n super(`cid not found: ${cid.toString()}`)\n this.cid = cid\n }\n}\n\nasync function sha256Stream(toHash: stream.Readable): Promise<Uint8Array> {\n const hash = crypto.createHash('sha256')\n try {\n for await (const chunk of toHash) {\n hash.write(chunk)\n }\n } catch (err) {\n hash.end()\n throw err\n }\n hash.end()\n return hash.read()\n}\n\nasync function mimeTypeFromStream(\n blobStream: stream.Readable,\n): Promise<string | undefined> {\n const fileType = await fileTypeFromStream(blobStream)\n blobStream.destroy()\n return fileType?.mime\n}\n\nfunction acceptedMime(mime: string, accepted: string[]): boolean {\n if (accepted.includes('*/*')) return true\n const globs = accepted.filter((a) => a.endsWith('/*'))\n for (const glob of globs) {\n const [start] = glob.split('/')\n if (mime.startsWith(`${start}/`)) {\n return true\n }\n }\n return accepted.includes(mime)\n}\n\nfunction verifyBlob(\n blob: PreparedBlobRef,\n found: Pick<BlobTable, 'size' | 'mimeType'>,\n) {\n const throwInvalid = (msg: string, errName = 'InvalidBlob') => {\n throw new InvalidRequestError(msg, errName)\n }\n if (blob.constraints.maxSize && found.size > blob.constraints.maxSize) {\n throwInvalid(\n `This file is too large. It is ${bytes.format(\n found.size,\n )} but the maximum size is ${bytes.format(blob.constraints.maxSize)}.`,\n 'BlobTooLarge',\n )\n }\n if (blob.mimeType !== found.mimeType) {\n throwInvalid(\n `Referenced Mimetype does not match stored blob. Expected: ${found.mimeType}, Got: ${blob.mimeType}`,\n 'InvalidMimeType',\n )\n }\n if (\n blob.constraints.accept &&\n !acceptedMime(blob.mimeType, blob.constraints.accept)\n ) {\n throwInvalid(\n `Wrong type of file. It is ${blob.mimeType} but it must match ${blob.constraints.accept}.`,\n 'InvalidMimeType',\n )\n }\n}\n\nfunction isCreate(write: PreparedWrite) {\n return write.action === WriteOpAction.Create\n}\nfunction isUpdate(write: PreparedWrite) {\n return write.action === WriteOpAction.Update\n}\nfunction isDelete(write: PreparedWrite) {\n return write.action === WriteOpAction.Delete\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transactor.js","sourceRoot":"","sources":["../../../src/actor-store/blob/transactor.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-deprecated */\n\nimport crypto from 'node:crypto'\nimport stream from 'node:stream'\nimport bytes from 'bytes'\nimport { fromStream as fileTypeFromStream } from 'file-type'\nimport { CID } from 'multiformats/cid'\nimport PQueue from 'p-queue'\nimport {\n SECOND,\n cloneStream,\n sha256RawToCid,\n streamSize,\n} from '@atproto/common'\nimport { BlobRef } from '@atproto/lexicon'\nimport { BlobNotFoundError, BlobStore, WriteOpAction } from '@atproto/repo'\nimport { AtUri } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { BackgroundQueue } from '../../background'\nimport { StatusAttr } from '../../lexicon/types/com/atproto/admin/defs'\nimport { blobStoreLogger as log } from '../../logger'\nimport { PreparedBlobRef, PreparedWrite } from '../../repo/types'\nimport { ActorDb, Blob as BlobTable } from '../db'\nimport { BlobReader } from './reader'\n\nexport type BlobMetadata = {\n tempKey: string\n size: number\n cid: CID\n mimeType: string\n}\n\nexport class BlobTransactor extends BlobReader {\n constructor(\n public db: ActorDb,\n public blobstore: BlobStore,\n public backgroundQueue: BackgroundQueue,\n ) {\n super(db, blobstore)\n }\n\n async insertBlobs(recordUri: string, blobs: Iterable<BlobRef>) {\n const values = Array.from(blobs, (cid) => ({\n recordUri,\n blobCid: cid.ref.toString(),\n }))\n\n if (values.length) {\n await this.db.db\n .insertInto('record_blob')\n .values(values)\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n }\n\n async uploadBlobAndGetMetadata(\n userSuggestedMime: string,\n blobStream: stream.Readable,\n ): Promise<BlobMetadata> {\n const [tempKey, size, sha256, sniffedMime] = await Promise.all([\n this.blobstore.putTemp(cloneStream(blobStream)),\n streamSize(cloneStream(blobStream)),\n sha256Stream(cloneStream(blobStream)),\n mimeTypeFromStream(cloneStream(blobStream)),\n ])\n\n const cid = sha256RawToCid(sha256)\n const mimeType = sniffedMime || userSuggestedMime\n\n return {\n tempKey,\n size,\n cid,\n mimeType,\n }\n }\n\n async trackUntetheredBlob(metadata: BlobMetadata) {\n const { tempKey, size, cid, mimeType } = metadata\n const found = await this.db.db\n .selectFrom('blob')\n .selectAll()\n .where('cid', '=', cid.toString())\n .executeTakeFirst()\n if (found?.takedownRef) {\n throw new InvalidRequestError('Blob has been takendown, cannot re-upload')\n }\n\n await this.db.db\n .insertInto('blob')\n .values({\n cid: cid.toString(),\n mimeType,\n size,\n tempKey,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) =>\n oc\n .column('cid')\n .doUpdateSet({ tempKey })\n .where('blob.tempKey', 'is not', null),\n )\n .execute()\n return new BlobRef(cid, mimeType, size)\n }\n\n async processWriteBlobs(rev: string, writes: PreparedWrite[]) {\n await this.deleteDereferencedBlobs(writes)\n\n const ac = new AbortController()\n\n // Limit the number of parallel requests made to the BlobStore by using a\n // a queue with concurrency management.\n type Task = () => Promise<void>\n const tasks: Task[] = []\n\n for (const write of writes) {\n if (isCreate(write) || isUpdate(write)) {\n for (const blob of write.blobs) {\n tasks.push(async () => {\n if (ac.signal.aborted) return\n await this.associateBlob(blob, write.uri)\n await this.verifyBlobAndMakePermanent(blob, ac.signal)\n })\n }\n }\n }\n\n try {\n const queue = new PQueue({\n concurrency: 20,\n // The blob store should already limit the time of every operation. We\n // add a timeout here as an extra precaution.\n timeout: 60 * SECOND,\n throwOnTimeout: true,\n })\n\n // Will reject as soon as any task fails, causing the \"finally\" block\n // below to run, aborting every other pending tasks.\n await queue.addAll(tasks)\n } finally {\n ac.abort()\n }\n }\n\n async updateBlobTakedownStatus(cid: CID, takedown: StatusAttr) {\n const takedownRef = takedown.applied\n ? takedown.ref ?? new Date().toISOString()\n : null\n await this.db.db\n .updateTable('blob')\n .set({ takedownRef })\n .where('cid', '=', cid.toString())\n .executeTakeFirst()\n\n try {\n // @NOTE find a way to not perform i/o operations during the transaction\n // (typically by using a state in the \"blob\" table, and another process to\n // handle the actual i/o)\n if (takedown.applied) {\n await this.blobstore.quarantine(cid)\n } else {\n await this.blobstore.unquarantine(cid)\n }\n } catch (err) {\n if (!(err instanceof BlobNotFoundError)) {\n log.error(\n { err, cid: cid.toString() },\n 'could not update blob takedown status',\n )\n\n throw err\n }\n }\n }\n\n async deleteDereferencedBlobs(\n writes: PreparedWrite[],\n skipBlobStore?: boolean,\n ) {\n const deletes = writes.filter(isDelete)\n const updates = writes.filter(isUpdate)\n const uris = [...deletes, ...updates].map((w) => w.uri.toString())\n if (uris.length === 0) return\n\n const deletedRepoBlobs = await this.db.db\n .deleteFrom('record_blob')\n .where('recordUri', 'in', uris)\n .returning('blobCid')\n .execute()\n if (deletedRepoBlobs.length === 0) return\n\n const deletedRepoBlobCids = deletedRepoBlobs.map((row) => row.blobCid)\n const duplicateCids = await this.db.db\n .selectFrom('record_blob')\n .where('blobCid', 'in', deletedRepoBlobCids)\n .select('blobCid')\n .execute()\n\n const newBlobCids = writes\n .filter((w) => isUpdate(w) || isCreate(w))\n .flatMap((w) => w.blobs.map((b) => b.cid.toString()))\n\n const cidsToKeep = [\n ...newBlobCids,\n ...duplicateCids.map((row) => row.blobCid),\n ]\n\n const cidsToDelete = deletedRepoBlobCids.filter(\n (cid) => !cidsToKeep.includes(cid),\n )\n if (cidsToDelete.length === 0) return\n\n await this.db.db\n .deleteFrom('blob')\n .where('cid', 'in', cidsToDelete)\n .execute()\n\n if (!skipBlobStore) {\n this.db.onCommit(() => {\n this.backgroundQueue.add(async () => {\n try {\n const cids = cidsToDelete.map((cid) => CID.parse(cid))\n await this.blobstore.deleteMany(cids)\n } catch (err) {\n log.error(\n { err, cids: cidsToDelete },\n 'could not delete blobs from blobstore',\n )\n }\n })\n })\n }\n }\n\n async verifyBlobAndMakePermanent(\n blob: PreparedBlobRef,\n signal?: AbortSignal,\n ): Promise<void> {\n const found = await this.db.db\n .selectFrom('blob')\n .select(['tempKey', 'size', 'mimeType'])\n .where('cid', '=', blob.cid.toString())\n .where('takedownRef', 'is', null)\n .executeTakeFirst()\n\n signal?.throwIfAborted()\n\n if (!found) {\n throw new InvalidRequestError(\n `Could not find blob: ${blob.cid.toString()}`,\n 'BlobNotFound',\n )\n }\n\n if (found.tempKey) {\n verifyBlob(blob, found)\n\n // @NOTE it is less than ideal to perform async (i/o) operations during a\n // transaction. Especially since there have been instances of the actor-db\n // being locked, requiring to kick the processes.\n\n // The better solution would be to update the blob state in the database\n // (e.g. \"makeItPermanent\") and to process those updates outside of the\n // transaction.\n\n await this.blobstore\n .makePermanent(found.tempKey, blob.cid)\n .catch((err) => {\n log.error(\n { err, cid: blob.cid.toString() },\n 'could not make blob permanent',\n )\n\n throw err\n })\n\n signal?.throwIfAborted()\n\n await this.db.db\n .updateTable('blob')\n .set({ tempKey: null })\n .where('tempKey', '=', found.tempKey)\n .execute()\n }\n }\n\n async insertBlobMetadata(blob: PreparedBlobRef): Promise<void> {\n await this.db.db\n .insertInto('blob')\n .values({\n cid: blob.cid.toString(),\n mimeType: blob.mimeType,\n size: blob.size,\n createdAt: new Date().toISOString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n\n async associateBlob(blob: PreparedBlobRef, recordUri: AtUri): Promise<void> {\n await this.db.db\n .insertInto('record_blob')\n .values({\n blobCid: blob.cid.toString(),\n recordUri: recordUri.toString(),\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n}\n\nexport class CidNotFound extends Error {\n cid: CID\n constructor(cid: CID) {\n super(`cid not found: ${cid.toString()}`)\n this.cid = cid\n }\n}\n\nasync function sha256Stream(toHash: stream.Readable): Promise<Uint8Array> {\n const hash = crypto.createHash('sha256')\n try {\n for await (const chunk of toHash) {\n hash.write(chunk)\n }\n } catch (err) {\n hash.end()\n throw err\n }\n hash.end()\n return hash.read()\n}\n\nasync function mimeTypeFromStream(\n blobStream: stream.Readable,\n): Promise<string | undefined> {\n const fileType = await fileTypeFromStream(blobStream)\n blobStream.destroy()\n return fileType?.mime\n}\n\nfunction acceptedMime(mime: string, accepted: string[]): boolean {\n if (accepted.includes('*/*')) return true\n const globs = accepted.filter((a) => a.endsWith('/*'))\n for (const glob of globs) {\n const [start] = glob.split('/')\n if (mime.startsWith(`${start}/`)) {\n return true\n }\n }\n return accepted.includes(mime)\n}\n\nfunction verifyBlob(\n blob: PreparedBlobRef,\n found: Pick<BlobTable, 'size' | 'mimeType'>,\n) {\n const throwInvalid = (msg: string, errName = 'InvalidBlob') => {\n throw new InvalidRequestError(msg, errName)\n }\n if (blob.constraints.maxSize && found.size > blob.constraints.maxSize) {\n throwInvalid(\n `This file is too large. It is ${bytes.format(\n found.size,\n )} but the maximum size is ${bytes.format(blob.constraints.maxSize)}.`,\n 'BlobTooLarge',\n )\n }\n if (blob.mimeType !== found.mimeType) {\n throwInvalid(\n `Referenced Mimetype does not match stored blob. Expected: ${found.mimeType}, Got: ${blob.mimeType}`,\n 'InvalidMimeType',\n )\n }\n if (\n blob.constraints.accept &&\n !acceptedMime(blob.mimeType, blob.constraints.accept)\n ) {\n throwInvalid(\n `Wrong type of file. It is ${blob.mimeType} but it must match ${blob.constraints.accept}.`,\n 'InvalidMimeType',\n )\n }\n}\n\nfunction isCreate(write: PreparedWrite) {\n return write.action === WriteOpAction.Create\n}\nfunction isUpdate(write: PreparedWrite) {\n return write.action === WriteOpAction.Update\n}\nfunction isDelete(write: PreparedWrite) {\n return write.action === WriteOpAction.Delete\n}\n"]}
|