mirror of
https://github.com/stablyai/orca.git
synced 2026-10-30 16:47:34 +00:00
* feat(mobile): decode page-bundle download windows natively Each 384 KiB window of the page-bundle download cost about 200-300 ms of Hermes JS time (tweetnacl secretbox open, fflate gunzip, a base64 re-encode check and the TextDecoder polyfill), which kept the JS thread busy for the whole download. The phone now opens v2 frames with react-native-libsodium (secretbox open and strict base64) and decodes ranges with a local Expo module, orca-bundle-window-codec (bounded gunzip via system zlib on iOS and java.util.zip.Inflater on Android, plus strict UTF-8). The shared v2 session takes these as optional primitives; the desktop keeps tweetnacl. If any native piece is missing or fails a known-answer probe, the phone keeps today's JS path, with the base64 re-encode replaced by an O(1) canonical check. * refactor(mobile): name the native decode for every inbound frame, not just bundle windows The native secretbox, base64 and UTF-8 primitives decode every inbound v2 frame on the phone, so the files and the Expo module are renamed for what they cover (paired-e2ee-native-*, orca-gzip-utf8-codec). A throw from the native UTF-8 decode now falls back to TextDecoder, since the frame is already open and its counter advanced. * test(mobile): pin the TextDecoder fallback when native UTF-8 throws * fix(mobile): hand the native decode to the transport from the app entry The transport modules are reached by shared, desktop and e2e code. Importing the native bindings there pulled expo-modules-core into the e2e typecheck, whose global types make NODE_ENV required and broke ~20 e2e files. The app entry now provides the bindings; without them the transport runs the JS path. * fix(mobile): a native-codec lookup before the app provides bindings does not pin the JS path
18 lines
526 B
Swift
18 lines
526 B
Swift
import ExpoModulesCore
|
|
|
|
// Synchronous on purpose: each call is a few ms per window, and only a sync call reads its
|
|
// Uint8Array argument without a thread hop.
|
|
public class OrcaGzipUtf8CodecModule: Module {
|
|
public func definition() -> ModuleDefinition {
|
|
Name("OrcaGzipUtf8Codec")
|
|
|
|
Function("gunzip") { (input: Data, outputLimit: Int) throws -> Data in
|
|
try gunzipBounded(input, outputLimit: outputLimit)
|
|
}
|
|
|
|
Function("decodeUtf8") { (input: Data) -> String? in
|
|
decodeStrictUtf8(input)
|
|
}
|
|
}
|
|
}
|