From e4bf1d1e7e03e11aee1a5f106a15cc4e48ed4f74 Mon Sep 17 00:00:00 2001 From: xan.lol Date: Sun, 31 May 2026 02:09:07 +0000 Subject: [PATCH] chore: oops add back missing patches for native oauth and drop nounset from build number env scripts to prevent failure and AppBskyEmbedRecord + AppBskyFeedDefs in cloudflare worker --- functions/profile/[handleOrDID]/post/[rkey].ts | 6 ++---- patches/@atproto__oauth-client@0.6.1.patch | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pnpm-lock.yaml | 21 ++++++--------------- pnpm-workspace.yaml | 2 ++ scripts/useBuildNumberEnv.sh | 1 - scripts/useBuildNumberEnvWithBump.sh | 1 - src/screens/Login/AuthCallback.native.tsx | 15 +++++++++++++++ 7 file(s) changed, 107 insertion(s)(+), 21 deletion(s)(-) diff --git a/functions/profile/[handleOrDID]/post/[rkey].ts b/functions/profile/[handleOrDID]/post/[rkey].ts --- a/functions/profile/[handleOrDID]/post/[rkey].ts +++ b/functions/profile/[handleOrDID]/post/[rkey].ts @@ -8,8 +8,6 @@ AtpAgent, type Facet, RichText, } from '@atproto/api' -import {isViewRecord} from '@atproto/api/dist/client/types/app/bsky/embed/record' -import {isThreadViewPost} from '@atproto/api/dist/client/types/app/bsky/feed/defs' import {html, renderHandleString} from '../../[handleOrDID].ts' @@ -79,7 +77,7 @@ AppBskyEmbedRecordWithMedia.isView(embed) ) { // no idea why this is needed lol const record = embed.record.record ?? embed.record - if (isViewRecord(record)) { + if (AppBskyEmbedRecord.isViewRecord(record)) { const quote = `↘️ quoting ${renderHandleString(record.author)}:\n\n${ record.value.text }` @@ -95,7 +93,7 @@ } } // prepend reply header - if (isThreadViewPost(postView.parent)) { + if (AppBskyFeedDefs.isThreadViewPost(postView.parent)) { const header = `↩️ reply to ${renderHandleString( postView.parent.post.author, )}:` diff --git a/patches/@atproto__oauth-client@0.6.1.patch b/patches/@atproto__oauth-client@0.6.1.patch new file mode 100644 --- /dev/null +++ b/patches/@atproto__oauth-client@0.6.1.patch @@ -0,0 +1,82 @@ +diff --git a/dist/index.js b/dist/index.js +index 7b40a89..4b8d430 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -1,4 +1,21 @@ + "use strict"; ++// polyfill throwIfAborted which seems to be missing in react-native, but ky ++// uses it ++// ++// Fun fact, AbortSignal here is just a react-native polyfill, too: ++// https://github.com/facebook/react-native/blob/838d26d7b534133e75c7fa673dfc849b0e64c9d3/packages/react-native/Libraries/Core/setUpXHR.js#L38 ++// ++// Unfortunately it doesn't have a `reason` ++// ++// ref: https://github.com/tjmehta/fast-abort-controller/blob/42588908035d1512f90e7299a2c70dfb708f9620/src/FastAbortSignal.ts#L39 ++if (!AbortSignal.prototype.throwIfAborted) { ++ AbortSignal.prototype.throwIfAborted = function() { ++ if (this.aborted) { ++ throw new Error('Aborted') ++ } ++ } ++} ++ + var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); +@@ -15,7 +32,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) { + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.FetchResponseError = exports.FetchRequestError = exports.FetchError = void 0; +-require("core-js/modules/es.symbol.dispose"); ++if (typeof Symbol.dispose === 'undefined') { ++ Symbol.dispose = Symbol('Symbol.dispose'); ++} + __exportStar(require("@atproto-labs/did-resolver"), exports); + var fetch_1 = require("@atproto-labs/fetch"); + Object.defineProperty(exports, "FetchError", { enumerable: true, get: function () { return fetch_1.FetchError; } }); +diff --git a/dist/oauth-server-agent.js b/dist/oauth-server-agent.js +index 239cb0e..e98b656 100644 +--- a/dist/oauth-server-agent.js ++++ b/dist/oauth-server-agent.js +@@ -169,10 +169,16 @@ class OAuthServerAgent { + * @returns The user's PDS URL (the resource server for the user) + */ + async verifyIssuer(sub) { ++ const AbortSignal_timeout = (delay) => { ++ const controller = new AbortController(); ++ const timeout = setTimeout(() => controller.abort(), delay); ++ return controller.signal; ++ }; ++ + const resolved = await this.oauthResolver.resolveFromIdentity(sub, { + noCache: true, + allowStale: false, +- signal: AbortSignal.timeout(10e3), ++ signal: AbortSignal_timeout(10e3), + }); + if (this.issuer !== resolved.metadata.issuer) { + // Best case scenario; the user switched PDS. Worst case scenario; a bad +diff --git a/dist/session-getter.js b/dist/session-getter.js +index 5d41957..f279a0c 100644 +--- a/dist/session-getter.js ++++ b/dist/session-getter.js +@@ -237,11 +237,17 @@ class SessionGetter extends simple_store_1.CachedGetter { + */ + async get(sub, options) { + const session = await this.runtime.usingLock(`@atproto-oauth-client-${sub}`, async () => { ++ const AbortSignal_timeout = (delay) => { ++ const controller = new AbortController(); ++ const timeout = setTimeout(() => controller.abort(), delay); ++ return controller.signal; ++ }; ++ + const env_1 = { stack: [], error: void 0, hasError: false }; + try { + // Make sure, even if there is no signal in the options, that the + // request will be cancelled after at most 30 seconds. +- const signal = AbortSignal.timeout(30e3); ++ const signal = AbortSignal_timeout(30e3); + const abortController = __addDisposableResource(env_1, (0, util_js_1.combineSignals)([options?.signal, signal]), false); + return await super.get(sub, { + ...options, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -213,11 +213,13 @@ react-native-reanimated: 3.19.1 psl: 1.9.0 '@types/psl': 1.1.1 react-native-screens: 4.24.0 + react-native-mmkv: npm:@bsky.app/react-native-mmkv@2.12.5 patchedDependencies: '@assembless/react-native-material-you@1.0.0-beta.4': 5e11139d0752d31a4f18fcf87fc0b5e8fe983595a877c701b417759fe2381329 '@atproto/api@0.20.6': 7b87c0d95ceabbf1625d301494ddf87842f201173a7f930982b7e4d798ba845d '@atproto/oauth-client-expo@0.0.10': f8902abcb765e516772a64b5357604582849baf36120814fb11e348d7dd33989 + '@atproto/oauth-client@0.6.1': 07eb9c1dce2d9b9ebf8462cdc04d1f7c8b7beb33c941911b61d5d165acc438e4 '@discord/bottom-sheet@4.6.1': 253965341bfbc8e63630dfca511c5d0e0878900e5fe414b2278bd322fc215e2a '@sentry/react-native@7.0.1': dbede5c74e6268ce7825591280da0a8208e010f4d89b8d9c786954942f587ba8 expo-glass-effect@55.0.8: 6c9fa5b104e53b87df4e17b320acb3b94d12ac90c0101190045dd620681efff0 @@ -8782,12 +8784,6 @@ react: '*' react-native: '*' react-native-reanimated: 3.19.1 - react-native-mmkv@3.3.3: - resolution: {integrity: sha512-GMsfOmNzx0p5+CtrCFRVtpOOMYNJXuksBVARSQrCFaZwjUyHJdQzcN900GGaFFNTxw2fs8s5Xje//RDKj9+PZA==} - peerDependencies: - react: '*' - react-native: '*' - react-native-pager-view@6.8.0: resolution: {integrity: sha512-/wgFV8nB4TLnQ6j9e3TvNrHbPF5TINMZHaXt86GOV0NSJNMVGkWguniJVKrYLm85LL8KVhRkgdh43Rdu7PvW1A==} peerDependencies: @@ -10444,25 +10440,25 @@ '@atproto-labs/simple-store': 0.3.0 '@atproto/did': 0.3.0 '@atproto/jwk': 0.6.0 '@atproto/jwk-webcrypto': 0.2.0 - '@atproto/oauth-client': 0.6.1 + '@atproto/oauth-client': 0.6.1(patch_hash=07eb9c1dce2d9b9ebf8462cdc04d1f7c8b7beb33c941911b61d5d165acc438e4) '@atproto/oauth-types': 0.6.3 core-js: 3.49.0 '@atproto/oauth-client-expo@0.0.10(patch_hash=f8902abcb765e516772a64b5357604582849baf36120814fb11e348d7dd33989)(expo@54.0.34(@babel/core@7.25.2)(react-native-webview@13.16.1(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0)': dependencies: '@atproto-labs/simple-store': 0.3.0 - '@atproto/oauth-client': 0.6.1 + '@atproto/oauth-client': 0.6.1(patch_hash=07eb9c1dce2d9b9ebf8462cdc04d1f7c8b7beb33c941911b61d5d165acc438e4) '@atproto/oauth-client-browser': 0.3.42 core-js: 3.49.0 expo: 54.0.34(@babel/core@7.25.2)(react-native-webview@13.16.1(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0) expo-web-browser: 15.0.11(expo@54.0.34(@babel/core@7.25.2)(react-native-webview@13.16.1(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0)) react-native: 0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0) - react-native-mmkv: 3.3.3(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0) + react-native-mmkv: '@bsky.app/react-native-mmkv@2.12.5(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0)' react-native-url-polyfill: 3.0.0(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0)) transitivePeerDependencies: - react - '@atproto/oauth-client@0.6.1': + '@atproto/oauth-client@0.6.1(patch_hash=07eb9c1dce2d9b9ebf8462cdc04d1f7c8b7beb33c941911b61d5d165acc438e4)': dependencies: '@atproto-labs/did-resolver': 0.2.6 '@atproto-labs/fetch': 0.2.3 @@ -19468,11 +19464,6 @@ react: 19.1.0 react-native: 0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0) react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0) react-native-reanimated: 3.19.1(patch_hash=97a1967f37a4213fbab59e1fd59a1bf859b5efc79af5e1b528a47fe488e6c5d6)(@babel/core@7.25.2)(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0) - - react-native-mmkv@3.3.3(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0): - dependencies: - react: 19.1.0 - react-native: 0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0) react-native-pager-view@6.8.0(patch_hash=0979d6fe1e2fa43b2784cc0b5e0ff0117d53b53423e85ee5855eefdc41a00108)(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.25.2)(@types/react@19.2.15)(react@19.1.0))(react@19.1.0): dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -13,6 +13,7 @@ 'react-native-reanimated': '3.19.1' 'psl': '1.9.0' '@types/psl': '1.1.1' 'react-native-screens': '4.24.0' + 'react-native-mmkv': 'npm:@bsky.app/react-native-mmkv@2.12.5' allowBuilds: '@sentry/cli': true '@swc/core': true @@ -23,6 +24,7 @@ 'unrs-resolver': true patchedDependencies: '@assembless/react-native-material-you@1.0.0-beta.4': patches/@assembless__react-native-material-you@1.0.0-beta.4.patch '@atproto/api@0.20.6': patches/@atproto__api@0.20.6.patch + '@atproto/oauth-client@0.6.1': patches/@atproto__oauth-client@0.6.1.patch '@atproto/oauth-client-expo@0.0.10': patches/@atproto__oauth-client-expo@0.0.10.patch '@discord/bottom-sheet@4.6.1': patches/@discord__bottom-sheet@4.6.1.patch 'expo-glass-effect@55.0.8': patches/expo-glass-effect@55.0.8.patch diff --git a/scripts/useBuildNumberEnv.sh b/scripts/useBuildNumberEnv.sh --- a/scripts/useBuildNumberEnv.sh +++ b/scripts/useBuildNumberEnv.sh @@ -1,7 +1,6 @@ #!/usr/bin/env bash set -o errexit set -o pipefail -set -o nounset outputIos=$(eas build:version:get -p ios) outputAndroid=$(eas build:version:get -p android) diff --git a/scripts/useBuildNumberEnvWithBump.sh b/scripts/useBuildNumberEnvWithBump.sh --- a/scripts/useBuildNumberEnvWithBump.sh +++ b/scripts/useBuildNumberEnvWithBump.sh @@ -1,7 +1,6 @@ #!/usr/bin/env bash set -o errexit set -o pipefail -set -o nounset outputIos=$(eas build:version:get -p ios) outputAndroid=$(eas build:version:get -p android) diff --git a/src/screens/Login/AuthCallback.native.tsx b/src/screens/Login/AuthCallback.native.tsx new file mode 100644 --- /dev/null +++ b/src/screens/Login/AuthCallback.native.tsx @@ -0,0 +1,15 @@ +import {useEffect} from 'react' +import {useNavigation} from '@react-navigation/native' + +import {type NavigationProp} from '#/lib/routes/types' + +export function AuthCallback() { + const navigation = useNavigation() + + useEffect(() => { + // Web OAuth callback route — not used on native. + navigation.replace('Home') + }, [navigation]) + + return null +} -- tangled.sh