diff --git a/src/api.ts b/src/api.ts index 0f6e7b5..92c2e95 100644 --- a/src/api.ts +++ b/src/api.ts @@ -22,10 +22,12 @@ declare global { } } -export let appView = new BlueskyAPI('api.bsky.app'); +let appViewHost = 'api.bsky.app'; + +export let appView = new BlueskyAPI(appViewHost); export let blueAPI = new BluefeedsAPI('blue.mackuba.eu'); export let constellationAPI = new ConstellationAPI('constellation.microcosm.blue'); -export let accountAPI = new AuthenticatedAPI(); +export let accountAPI = new AuthenticatedAPI({ proxiedAppView: appViewHost }); export let api: BlueskyAPI; export function setAPI() { diff --git a/src/api/authenticated_api.ts b/src/api/authenticated_api.ts index a104128..6fd43f3 100644 --- a/src/api/authenticated_api.ts +++ b/src/api/authenticated_api.ts @@ -1,8 +1,10 @@ import { BlueskyAPI, type TimelineFetchOptions } from "./bluesky_api"; -import { AuthError } from './minisky.js'; +import { AuthError, type MiniskyRequestOptions } from './minisky.js'; import { Post } from '../models/posts.js'; import { atURI, feedPostTime } from '../utils.js'; +const proxyHeaderName = 'atproto-proxy'; + /** * Stores user's access tokens and data in local storage after they log in. */ @@ -26,12 +28,31 @@ class LocalStorageConfig { export class AuthenticatedAPI extends BlueskyAPI { override user: json; + proxiedAppView: string; - constructor() { + constructor(options: { proxiedAppView: string }) { let config = new LocalStorageConfig(); let pds: string | null = config.user.pdsEndpoint || null; super(pds, config); this.user = config.user; + this.proxiedAppView = options.proxiedAppView; + } + + get appViewProxyHeader(): string { + return `did:web:${this.proxiedAppView}#bsky_appview`; + } + + override async getRequest(method: string, params?: json | null, options: MiniskyRequestOptions = {}): Promise { + if (this.isLoggedIn && !method.startsWith('com.atproto.')) { + options = options ?? {}; + options.headers = options.headers ?? {}; + + if (!options.headers[proxyHeaderName]) { + options.headers[proxyHeaderName] = this.appViewProxyHeader; + } + } + + return super.getRequest(method, params, options); } async getCurrentUserAvatar(): Promise {