@atproto/bsky 0.0.61 → 0.0.63
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 +14 -0
- package/dist/api/app/bsky/graph/muteThread.d.ts +4 -0
- package/dist/api/app/bsky/graph/muteThread.d.ts.map +1 -0
- package/dist/api/app/bsky/graph/muteThread.js +19 -0
- package/dist/api/app/bsky/graph/muteThread.js.map +1 -0
- package/dist/api/app/bsky/graph/unmuteThread.d.ts +4 -0
- package/dist/api/app/bsky/graph/unmuteThread.d.ts.map +1 -0
- package/dist/api/app/bsky/graph/unmuteThread.js +19 -0
- package/dist/api/app/bsky/graph/unmuteThread.js.map +1 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +4 -0
- package/dist/api/index.js.map +1 -1
- package/dist/data-plane/bsync/index.d.ts.map +1 -1
- package/dist/data-plane/bsync/index.js +41 -15
- package/dist/data-plane/bsync/index.js.map +1 -1
- package/dist/data-plane/server/db/database-schema.d.ts +2 -1
- package/dist/data-plane/server/db/database-schema.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/20240606T171229898Z-thread-mutes.d.ts +4 -0
- package/dist/data-plane/server/db/migrations/20240606T171229898Z-thread-mutes.d.ts.map +1 -0
- package/dist/data-plane/server/db/migrations/20240606T171229898Z-thread-mutes.js +18 -0
- package/dist/data-plane/server/db/migrations/20240606T171229898Z-thread-mutes.js.map +1 -0
- package/dist/data-plane/server/db/migrations/index.d.ts +1 -0
- package/dist/data-plane/server/db/migrations/index.d.ts.map +1 -1
- package/dist/data-plane/server/db/migrations/index.js +2 -1
- package/dist/data-plane/server/db/migrations/index.js.map +1 -1
- package/dist/data-plane/server/db/tables/thread-mute.d.ts +10 -0
- package/dist/data-plane/server/db/tables/thread-mute.d.ts.map +1 -0
- package/dist/data-plane/server/db/tables/thread-mute.js +5 -0
- package/dist/data-plane/server/db/tables/thread-mute.js.map +1 -0
- package/dist/data-plane/server/indexing/processor.d.ts +2 -0
- package/dist/data-plane/server/indexing/processor.d.ts.map +1 -1
- package/dist/data-plane/server/indexing/processor.js +28 -1
- package/dist/data-plane/server/indexing/processor.js.map +1 -1
- package/dist/data-plane/server/routes/mutes.d.ts.map +1 -1
- package/dist/data-plane/server/routes/mutes.js +16 -0
- package/dist/data-plane/server/routes/mutes.js.map +1 -1
- package/dist/data-plane/server/util.d.ts +6 -6
- package/dist/hydration/feed.d.ts +6 -1
- package/dist/hydration/feed.d.ts.map +1 -1
- package/dist/hydration/feed.js +16 -2
- package/dist/hydration/feed.js.map +1 -1
- package/dist/hydration/hydrator.d.ts.map +1 -1
- package/dist/hydration/hydrator.js +13 -6
- package/dist/hydration/hydrator.js.map +1 -1
- package/dist/hydration/util.d.ts +1 -1
- package/dist/hydration/util.d.ts.map +1 -1
- package/dist/hydration/util.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 +51 -0
- package/dist/lexicon/lexicons.d.ts.map +1 -1
- package/dist/lexicon/lexicons.js +51 -0
- package/dist/lexicon/lexicons.js.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/defs.d.ts +1 -0
- package/dist/lexicon/types/app/bsky/feed/defs.d.ts.map +1 -1
- package/dist/lexicon/types/app/bsky/feed/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/muteThread.d.ts +29 -0
- package/dist/lexicon/types/app/bsky/graph/muteThread.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/graph/muteThread.js +3 -0
- package/dist/lexicon/types/app/bsky/graph/muteThread.js.map +1 -0
- package/dist/lexicon/types/app/bsky/graph/unmuteThread.d.ts +29 -0
- package/dist/lexicon/types/app/bsky/graph/unmuteThread.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/graph/unmuteThread.js +3 -0
- package/dist/lexicon/types/app/bsky/graph/unmuteThread.js.map +1 -0
- package/dist/logger.d.ts +2 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +77 -63
- package/dist/logger.js.map +1 -1
- package/dist/proto/bsky_connect.d.ts +39 -1
- package/dist/proto/bsky_connect.d.ts.map +1 -1
- package/dist/proto/bsky_connect.js +38 -0
- package/dist/proto/bsky_connect.js.map +1 -1
- package/dist/proto/bsky_pb.d.ts +136 -0
- package/dist/proto/bsky_pb.d.ts.map +1 -1
- package/dist/proto/bsky_pb.js +430 -3
- package/dist/proto/bsky_pb.js.map +1 -1
- package/dist/views/index.d.ts.map +1 -1
- package/dist/views/index.js +1 -0
- package/dist/views/index.js.map +1 -1
- package/package.json +5 -5
- package/proto/bsky.proto +41 -0
- package/src/api/app/bsky/graph/muteThread.ts +18 -0
- package/src/api/app/bsky/graph/unmuteThread.ts +18 -0
- package/src/api/index.ts +4 -0
- package/src/data-plane/bsync/index.ts +39 -15
- package/src/data-plane/server/db/database-schema.ts +2 -0
- package/src/data-plane/server/db/migrations/20240606T171229898Z-thread-mutes.ts +15 -0
- package/src/data-plane/server/db/migrations/index.ts +1 -0
- package/src/data-plane/server/db/tables/thread-mute.ts +9 -0
- package/src/data-plane/server/indexing/processor.ts +29 -1
- package/src/data-plane/server/routes/mutes.ts +17 -0
- package/src/hydration/feed.ts +23 -3
- package/src/hydration/hydrator.ts +14 -6
- package/src/hydration/util.ts +1 -3
- package/src/lexicon/index.ts +24 -0
- package/src/lexicon/lexicons.ts +52 -0
- package/src/lexicon/types/app/bsky/feed/defs.ts +1 -0
- package/src/lexicon/types/app/bsky/graph/muteThread.ts +38 -0
- package/src/lexicon/types/app/bsky/graph/unmuteThread.ts +38 -0
- package/src/logger.ts +81 -38
- package/src/proto/bsky_connect.ts +46 -0
- package/src/proto/bsky_pb.ts +465 -0
- package/src/views/index.ts +1 -0
- package/tests/__snapshots__/feed-generation.test.ts.snap +38 -12
- package/tests/data-plane/__snapshots__/indexing.test.ts.snap +27 -9
- package/tests/data-plane/thread-mutes.test.ts +140 -0
- package/tests/views/__snapshots__/author-feed.test.ts.snap +62 -17
- package/tests/views/__snapshots__/block-lists.test.ts.snap +7 -2
- package/tests/views/__snapshots__/blocks.test.ts.snap +13 -4
- package/tests/views/__snapshots__/list-feed.test.ts.snap +23 -6
- package/tests/views/__snapshots__/mute-lists.test.ts.snap +10 -3
- package/tests/views/__snapshots__/mutes.test.ts.snap +9 -3
- package/tests/views/__snapshots__/posts.test.ts.snap +16 -5
- package/tests/views/__snapshots__/thread.test.ts.snap +53 -14
- package/tests/views/__snapshots__/timeline.test.ts.snap +213 -64
- package/tests/views/threadgating.test.ts +19 -19
package/src/hydration/util.ts
CHANGED
|
@@ -67,9 +67,7 @@ export const parseRecordBytes = <T>(
|
|
|
67
67
|
return parseJsonBytes(bytes) as T
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
export const parseJsonBytes = (
|
|
71
|
-
bytes: Uint8Array | undefined,
|
|
72
|
-
): JSON | undefined => {
|
|
70
|
+
export const parseJsonBytes = (bytes: Uint8Array | undefined): unknown => {
|
|
73
71
|
if (!bytes || bytes.byteLength === 0) return
|
|
74
72
|
const parsed = JSON.parse(ui8.toString(bytes, 'utf8'))
|
|
75
73
|
return parsed ?? undefined
|
package/src/lexicon/index.ts
CHANGED
|
@@ -120,8 +120,10 @@ import * as AppBskyGraphGetRelationships from './types/app/bsky/graph/getRelatio
|
|
|
120
120
|
import * as AppBskyGraphGetSuggestedFollowsByActor from './types/app/bsky/graph/getSuggestedFollowsByActor'
|
|
121
121
|
import * as AppBskyGraphMuteActor from './types/app/bsky/graph/muteActor'
|
|
122
122
|
import * as AppBskyGraphMuteActorList from './types/app/bsky/graph/muteActorList'
|
|
123
|
+
import * as AppBskyGraphMuteThread from './types/app/bsky/graph/muteThread'
|
|
123
124
|
import * as AppBskyGraphUnmuteActor from './types/app/bsky/graph/unmuteActor'
|
|
124
125
|
import * as AppBskyGraphUnmuteActorList from './types/app/bsky/graph/unmuteActorList'
|
|
126
|
+
import * as AppBskyGraphUnmuteThread from './types/app/bsky/graph/unmuteThread'
|
|
125
127
|
import * as AppBskyLabelerGetServices from './types/app/bsky/labeler/getServices'
|
|
126
128
|
import * as AppBskyNotificationGetUnreadCount from './types/app/bsky/notification/getUnreadCount'
|
|
127
129
|
import * as AppBskyNotificationListNotifications from './types/app/bsky/notification/listNotifications'
|
|
@@ -1584,6 +1586,17 @@ export class AppBskyGraphNS {
|
|
|
1584
1586
|
return this._server.xrpc.method(nsid, cfg)
|
|
1585
1587
|
}
|
|
1586
1588
|
|
|
1589
|
+
muteThread<AV extends AuthVerifier>(
|
|
1590
|
+
cfg: ConfigOf<
|
|
1591
|
+
AV,
|
|
1592
|
+
AppBskyGraphMuteThread.Handler<ExtractAuth<AV>>,
|
|
1593
|
+
AppBskyGraphMuteThread.HandlerReqCtx<ExtractAuth<AV>>
|
|
1594
|
+
>,
|
|
1595
|
+
) {
|
|
1596
|
+
const nsid = 'app.bsky.graph.muteThread' // @ts-ignore
|
|
1597
|
+
return this._server.xrpc.method(nsid, cfg)
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1587
1600
|
unmuteActor<AV extends AuthVerifier>(
|
|
1588
1601
|
cfg: ConfigOf<
|
|
1589
1602
|
AV,
|
|
@@ -1605,6 +1618,17 @@ export class AppBskyGraphNS {
|
|
|
1605
1618
|
const nsid = 'app.bsky.graph.unmuteActorList' // @ts-ignore
|
|
1606
1619
|
return this._server.xrpc.method(nsid, cfg)
|
|
1607
1620
|
}
|
|
1621
|
+
|
|
1622
|
+
unmuteThread<AV extends AuthVerifier>(
|
|
1623
|
+
cfg: ConfigOf<
|
|
1624
|
+
AV,
|
|
1625
|
+
AppBskyGraphUnmuteThread.Handler<ExtractAuth<AV>>,
|
|
1626
|
+
AppBskyGraphUnmuteThread.HandlerReqCtx<ExtractAuth<AV>>
|
|
1627
|
+
>,
|
|
1628
|
+
) {
|
|
1629
|
+
const nsid = 'app.bsky.graph.unmuteThread' // @ts-ignore
|
|
1630
|
+
return this._server.xrpc.method(nsid, cfg)
|
|
1631
|
+
}
|
|
1608
1632
|
}
|
|
1609
1633
|
|
|
1610
1634
|
export class AppBskyLabelerNS {
|
package/src/lexicon/lexicons.ts
CHANGED
|
@@ -5102,6 +5102,9 @@ export const schemaDict = {
|
|
|
5102
5102
|
type: 'string',
|
|
5103
5103
|
format: 'at-uri',
|
|
5104
5104
|
},
|
|
5105
|
+
threadMuted: {
|
|
5106
|
+
type: 'boolean',
|
|
5107
|
+
},
|
|
5105
5108
|
replyDisabled: {
|
|
5106
5109
|
type: 'boolean',
|
|
5107
5110
|
},
|
|
@@ -7675,6 +7678,30 @@ export const schemaDict = {
|
|
|
7675
7678
|
},
|
|
7676
7679
|
},
|
|
7677
7680
|
},
|
|
7681
|
+
AppBskyGraphMuteThread: {
|
|
7682
|
+
lexicon: 1,
|
|
7683
|
+
id: 'app.bsky.graph.muteThread',
|
|
7684
|
+
defs: {
|
|
7685
|
+
main: {
|
|
7686
|
+
type: 'procedure',
|
|
7687
|
+
description:
|
|
7688
|
+
'Mutes a thread preventing notifications from the thread and any of its children. Mutes are private in Bluesky. Requires auth.',
|
|
7689
|
+
input: {
|
|
7690
|
+
encoding: 'application/json',
|
|
7691
|
+
schema: {
|
|
7692
|
+
type: 'object',
|
|
7693
|
+
required: ['root'],
|
|
7694
|
+
properties: {
|
|
7695
|
+
root: {
|
|
7696
|
+
type: 'string',
|
|
7697
|
+
format: 'at-uri',
|
|
7698
|
+
},
|
|
7699
|
+
},
|
|
7700
|
+
},
|
|
7701
|
+
},
|
|
7702
|
+
},
|
|
7703
|
+
},
|
|
7704
|
+
},
|
|
7678
7705
|
AppBskyGraphUnmuteActor: {
|
|
7679
7706
|
lexicon: 1,
|
|
7680
7707
|
id: 'app.bsky.graph.unmuteActor',
|
|
@@ -7721,6 +7748,29 @@ export const schemaDict = {
|
|
|
7721
7748
|
},
|
|
7722
7749
|
},
|
|
7723
7750
|
},
|
|
7751
|
+
AppBskyGraphUnmuteThread: {
|
|
7752
|
+
lexicon: 1,
|
|
7753
|
+
id: 'app.bsky.graph.unmuteThread',
|
|
7754
|
+
defs: {
|
|
7755
|
+
main: {
|
|
7756
|
+
type: 'procedure',
|
|
7757
|
+
description: 'Unmutes the specified thread. Requires auth.',
|
|
7758
|
+
input: {
|
|
7759
|
+
encoding: 'application/json',
|
|
7760
|
+
schema: {
|
|
7761
|
+
type: 'object',
|
|
7762
|
+
required: ['root'],
|
|
7763
|
+
properties: {
|
|
7764
|
+
root: {
|
|
7765
|
+
type: 'string',
|
|
7766
|
+
format: 'at-uri',
|
|
7767
|
+
},
|
|
7768
|
+
},
|
|
7769
|
+
},
|
|
7770
|
+
},
|
|
7771
|
+
},
|
|
7772
|
+
},
|
|
7773
|
+
},
|
|
7724
7774
|
AppBskyLabelerDefs: {
|
|
7725
7775
|
lexicon: 1,
|
|
7726
7776
|
id: 'app.bsky.labeler.defs',
|
|
@@ -9613,8 +9663,10 @@ export const ids = {
|
|
|
9613
9663
|
AppBskyGraphListitem: 'app.bsky.graph.listitem',
|
|
9614
9664
|
AppBskyGraphMuteActor: 'app.bsky.graph.muteActor',
|
|
9615
9665
|
AppBskyGraphMuteActorList: 'app.bsky.graph.muteActorList',
|
|
9666
|
+
AppBskyGraphMuteThread: 'app.bsky.graph.muteThread',
|
|
9616
9667
|
AppBskyGraphUnmuteActor: 'app.bsky.graph.unmuteActor',
|
|
9617
9668
|
AppBskyGraphUnmuteActorList: 'app.bsky.graph.unmuteActorList',
|
|
9669
|
+
AppBskyGraphUnmuteThread: 'app.bsky.graph.unmuteThread',
|
|
9618
9670
|
AppBskyLabelerDefs: 'app.bsky.labeler.defs',
|
|
9619
9671
|
AppBskyLabelerGetServices: 'app.bsky.labeler.getServices',
|
|
9620
9672
|
AppBskyLabelerService: 'app.bsky.labeler.service',
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GENERATED CODE - DO NOT MODIFY
|
|
3
|
+
*/
|
|
4
|
+
import express from 'express'
|
|
5
|
+
import { ValidationResult, BlobRef } from '@atproto/lexicon'
|
|
6
|
+
import { lexicons } from '../../../../lexicons'
|
|
7
|
+
import { isObj, hasProp } from '../../../../util'
|
|
8
|
+
import { CID } from 'multiformats/cid'
|
|
9
|
+
import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server'
|
|
10
|
+
|
|
11
|
+
export interface QueryParams {}
|
|
12
|
+
|
|
13
|
+
export interface InputSchema {
|
|
14
|
+
root: string
|
|
15
|
+
[k: string]: unknown
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface HandlerInput {
|
|
19
|
+
encoding: 'application/json'
|
|
20
|
+
body: InputSchema
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface HandlerError {
|
|
24
|
+
status: number
|
|
25
|
+
message?: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type HandlerOutput = HandlerError | void
|
|
29
|
+
export type HandlerReqCtx<HA extends HandlerAuth = never> = {
|
|
30
|
+
auth: HA
|
|
31
|
+
params: QueryParams
|
|
32
|
+
input: HandlerInput
|
|
33
|
+
req: express.Request
|
|
34
|
+
res: express.Response
|
|
35
|
+
}
|
|
36
|
+
export type Handler<HA extends HandlerAuth = never> = (
|
|
37
|
+
ctx: HandlerReqCtx<HA>,
|
|
38
|
+
) => Promise<HandlerOutput> | HandlerOutput
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GENERATED CODE - DO NOT MODIFY
|
|
3
|
+
*/
|
|
4
|
+
import express from 'express'
|
|
5
|
+
import { ValidationResult, BlobRef } from '@atproto/lexicon'
|
|
6
|
+
import { lexicons } from '../../../../lexicons'
|
|
7
|
+
import { isObj, hasProp } from '../../../../util'
|
|
8
|
+
import { CID } from 'multiformats/cid'
|
|
9
|
+
import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server'
|
|
10
|
+
|
|
11
|
+
export interface QueryParams {}
|
|
12
|
+
|
|
13
|
+
export interface InputSchema {
|
|
14
|
+
root: string
|
|
15
|
+
[k: string]: unknown
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface HandlerInput {
|
|
19
|
+
encoding: 'application/json'
|
|
20
|
+
body: InputSchema
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface HandlerError {
|
|
24
|
+
status: number
|
|
25
|
+
message?: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type HandlerOutput = HandlerError | void
|
|
29
|
+
export type HandlerReqCtx<HA extends HandlerAuth = never> = {
|
|
30
|
+
auth: HA
|
|
31
|
+
params: QueryParams
|
|
32
|
+
input: HandlerInput
|
|
33
|
+
req: express.Request
|
|
34
|
+
res: express.Response
|
|
35
|
+
}
|
|
36
|
+
export type Handler<HA extends HandlerAuth = never> = (
|
|
37
|
+
ctx: HandlerReqCtx<HA>,
|
|
38
|
+
) => Promise<HandlerOutput> | HandlerOutput
|
package/src/logger.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { stdSerializers } from 'pino'
|
|
2
2
|
import pinoHttp from 'pino-http'
|
|
3
|
-
import * as jose from 'jose'
|
|
4
3
|
import { subsystemLogger } from '@atproto/common'
|
|
5
|
-
import { parseBasicAuth } from './auth-verifier'
|
|
6
4
|
|
|
7
5
|
export const dbLogger: ReturnType<typeof subsystemLogger> =
|
|
8
6
|
subsystemLogger('bsky:db')
|
|
@@ -20,40 +18,85 @@ export const httpLogger: ReturnType<typeof subsystemLogger> =
|
|
|
20
18
|
export const loggerMiddleware = pinoHttp({
|
|
21
19
|
logger: httpLogger,
|
|
22
20
|
serializers: {
|
|
23
|
-
err:
|
|
24
|
-
|
|
25
|
-
code: err?.code,
|
|
26
|
-
message: err?.message,
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
req: (req) => {
|
|
30
|
-
const serialized = pino.stdSerializers.req(req)
|
|
31
|
-
const authHeader = serialized.headers.authorization || ''
|
|
32
|
-
let auth: string | undefined = undefined
|
|
33
|
-
if (authHeader.startsWith('Bearer ')) {
|
|
34
|
-
const token = authHeader.slice('Bearer '.length)
|
|
35
|
-
const { iss } = jose.decodeJwt(token)
|
|
36
|
-
if (iss) {
|
|
37
|
-
auth = 'Bearer ' + iss
|
|
38
|
-
} else {
|
|
39
|
-
auth = 'Bearer Invalid'
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
if (authHeader.startsWith('Basic ')) {
|
|
43
|
-
const parsed = parseBasicAuth(authHeader)
|
|
44
|
-
if (!parsed) {
|
|
45
|
-
auth = 'Basic Invalid'
|
|
46
|
-
} else {
|
|
47
|
-
auth = 'Basic ' + parsed.username
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return {
|
|
51
|
-
...serialized,
|
|
52
|
-
headers: {
|
|
53
|
-
...serialized.headers,
|
|
54
|
-
authorization: auth,
|
|
55
|
-
},
|
|
56
|
-
}
|
|
57
|
-
},
|
|
21
|
+
err: errSerializer,
|
|
22
|
+
req: reqSerializer,
|
|
58
23
|
},
|
|
59
24
|
})
|
|
25
|
+
|
|
26
|
+
function errSerializer(err: any) {
|
|
27
|
+
return {
|
|
28
|
+
code: err?.code,
|
|
29
|
+
message: err?.message,
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function reqSerializer(req: any) {
|
|
34
|
+
const serialized = stdSerializers.req(req)
|
|
35
|
+
serialized.headers = obfuscateHeaders(serialized.headers)
|
|
36
|
+
return serialized
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function obfuscateHeaders(headers: Record<string, string>) {
|
|
40
|
+
const obfuscatedHeaders: Record<string, string> = {}
|
|
41
|
+
for (const key in headers) {
|
|
42
|
+
if (key.toLowerCase() === 'authorization') {
|
|
43
|
+
obfuscatedHeaders[key] = obfuscateAuthHeader(headers[key])
|
|
44
|
+
} else if (key.toLowerCase() === 'dpop') {
|
|
45
|
+
obfuscatedHeaders[key] = obfuscateJws(headers[key]) || 'Invalid'
|
|
46
|
+
} else {
|
|
47
|
+
obfuscatedHeaders[key] = headers[key]
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return obfuscatedHeaders
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function obfuscateAuthHeader(authHeader: string): string {
|
|
54
|
+
// This is a hot path (runs on every request). Avoid using split() or regex.
|
|
55
|
+
|
|
56
|
+
const spaceIdx = authHeader.indexOf(' ')
|
|
57
|
+
if (spaceIdx === -1) return 'Invalid'
|
|
58
|
+
|
|
59
|
+
const type = authHeader.slice(0, spaceIdx)
|
|
60
|
+
switch (type.toLowerCase()) {
|
|
61
|
+
case 'bearer':
|
|
62
|
+
return `${type} ${obfuscateBearer(authHeader.slice(spaceIdx + 1))}`
|
|
63
|
+
case 'dpop':
|
|
64
|
+
return `${type} ${obfuscateJws(authHeader.slice(spaceIdx + 1)) || 'Invalid'}`
|
|
65
|
+
case 'basic':
|
|
66
|
+
return `${type} ${obfuscateBasic(authHeader.slice(spaceIdx + 1)) || 'Invalid'}`
|
|
67
|
+
default:
|
|
68
|
+
return `Invalid`
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function obfuscateBasic(token: string): null | string {
|
|
73
|
+
if (!token) return null
|
|
74
|
+
const buffer = Buffer.from(token, 'base64')
|
|
75
|
+
if (!buffer.length) return null // Buffer.from will silently ignore invalid base64 chars
|
|
76
|
+
const authHeader = buffer.toString('utf8')
|
|
77
|
+
const colIdx = authHeader.indexOf(':')
|
|
78
|
+
if (colIdx === -1) return null
|
|
79
|
+
const username = authHeader.slice(0, colIdx)
|
|
80
|
+
return `${username}:***`
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function obfuscateBearer(token: string): string {
|
|
84
|
+
return obfuscateJws(token) || obfuscateToken(token)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function obfuscateToken(token: string): string {
|
|
88
|
+
return token ? '***' : ''
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function obfuscateJws(token: string): null | string {
|
|
92
|
+
const firstDot = token.indexOf('.')
|
|
93
|
+
if (firstDot === -1) return null
|
|
94
|
+
|
|
95
|
+
const secondDot = token.indexOf('.', firstDot + 1)
|
|
96
|
+
if (secondDot === -1) return null
|
|
97
|
+
|
|
98
|
+
if (token.indexOf('.', secondDot + 1) !== -1) return null
|
|
99
|
+
|
|
100
|
+
// Strip the signature
|
|
101
|
+
return token.slice(0, secondDot) + '.obfuscated'
|
|
102
|
+
}
|
|
@@ -8,14 +8,20 @@ import {
|
|
|
8
8
|
ClearActorMutelistSubscriptionsResponse,
|
|
9
9
|
ClearActorMutesRequest,
|
|
10
10
|
ClearActorMutesResponse,
|
|
11
|
+
ClearThreadMutesRequest,
|
|
12
|
+
ClearThreadMutesResponse,
|
|
11
13
|
CreateActorMutelistSubscriptionRequest,
|
|
12
14
|
CreateActorMutelistSubscriptionResponse,
|
|
13
15
|
CreateActorMuteRequest,
|
|
14
16
|
CreateActorMuteResponse,
|
|
17
|
+
CreateThreadMuteRequest,
|
|
18
|
+
CreateThreadMuteResponse,
|
|
15
19
|
DeleteActorMutelistSubscriptionRequest,
|
|
16
20
|
DeleteActorMutelistSubscriptionResponse,
|
|
17
21
|
DeleteActorMuteRequest,
|
|
18
22
|
DeleteActorMuteResponse,
|
|
23
|
+
DeleteThreadMuteRequest,
|
|
24
|
+
DeleteThreadMuteResponse,
|
|
19
25
|
GetActorChatDeclarationRecordsRequest,
|
|
20
26
|
GetActorChatDeclarationRecordsResponse,
|
|
21
27
|
GetActorFeedsRequest,
|
|
@@ -140,6 +146,8 @@ import {
|
|
|
140
146
|
GetSuggestedFeedsResponse,
|
|
141
147
|
GetThreadGateRecordsRequest,
|
|
142
148
|
GetThreadGateRecordsResponse,
|
|
149
|
+
GetThreadMutesOnSubjectsRequest,
|
|
150
|
+
GetThreadMutesOnSubjectsResponse,
|
|
143
151
|
GetThreadRequest,
|
|
144
152
|
GetThreadResponse,
|
|
145
153
|
GetTimelineRequest,
|
|
@@ -545,6 +553,17 @@ export const Service = {
|
|
|
545
553
|
O: GetMutelistSubscriptionsResponse,
|
|
546
554
|
kind: MethodKind.Unary,
|
|
547
555
|
},
|
|
556
|
+
/**
|
|
557
|
+
* Thread Mutes
|
|
558
|
+
*
|
|
559
|
+
* @generated from rpc bsky.Service.GetThreadMutesOnSubjects
|
|
560
|
+
*/
|
|
561
|
+
getThreadMutesOnSubjects: {
|
|
562
|
+
name: 'GetThreadMutesOnSubjects',
|
|
563
|
+
I: GetThreadMutesOnSubjectsRequest,
|
|
564
|
+
O: GetThreadMutesOnSubjectsResponse,
|
|
565
|
+
kind: MethodKind.Unary,
|
|
566
|
+
},
|
|
548
567
|
/**
|
|
549
568
|
* Blocks
|
|
550
569
|
*
|
|
@@ -984,5 +1003,32 @@ export const Service = {
|
|
|
984
1003
|
O: ClearActorMutelistSubscriptionsResponse,
|
|
985
1004
|
kind: MethodKind.Unary,
|
|
986
1005
|
},
|
|
1006
|
+
/**
|
|
1007
|
+
* @generated from rpc bsky.Service.CreateThreadMute
|
|
1008
|
+
*/
|
|
1009
|
+
createThreadMute: {
|
|
1010
|
+
name: 'CreateThreadMute',
|
|
1011
|
+
I: CreateThreadMuteRequest,
|
|
1012
|
+
O: CreateThreadMuteResponse,
|
|
1013
|
+
kind: MethodKind.Unary,
|
|
1014
|
+
},
|
|
1015
|
+
/**
|
|
1016
|
+
* @generated from rpc bsky.Service.DeleteThreadMute
|
|
1017
|
+
*/
|
|
1018
|
+
deleteThreadMute: {
|
|
1019
|
+
name: 'DeleteThreadMute',
|
|
1020
|
+
I: DeleteThreadMuteRequest,
|
|
1021
|
+
O: DeleteThreadMuteResponse,
|
|
1022
|
+
kind: MethodKind.Unary,
|
|
1023
|
+
},
|
|
1024
|
+
/**
|
|
1025
|
+
* @generated from rpc bsky.Service.ClearThreadMutes
|
|
1026
|
+
*/
|
|
1027
|
+
clearThreadMutes: {
|
|
1028
|
+
name: 'ClearThreadMutes',
|
|
1029
|
+
I: ClearThreadMutesRequest,
|
|
1030
|
+
O: ClearThreadMutesResponse,
|
|
1031
|
+
kind: MethodKind.Unary,
|
|
1032
|
+
},
|
|
987
1033
|
},
|
|
988
1034
|
} as const
|