@papyrus-sdk/engine-native 0.1.2 → 0.1.3
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/android/src/main/java/com/papyrus/engine/PapyrusNativeEngineModule.java +37 -13
- package/android/src/main/java/com/papyrus/engine/PapyrusNativeEngineModule.kt +34 -13
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -451,12 +451,25 @@ public class PapyrusNativeEngineModule extends ReactContextBaseJavaModule {
|
|
|
451
451
|
return copyFromContentUri(Uri.parse(uriString), context);
|
|
452
452
|
}
|
|
453
453
|
|
|
454
|
-
if (uriString.startsWith("file://")) {
|
|
455
|
-
return new File(Uri.parse(uriString).getPath());
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
454
|
+
if (uriString.startsWith("file://")) {
|
|
455
|
+
return new File(Uri.parse(uriString).getPath());
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
if (uriString.startsWith("res://")) {
|
|
459
|
+
String resourceName = uriString.substring("res://".length());
|
|
460
|
+
File resourceFile = copyFromRawResource(resourceName, context);
|
|
461
|
+
if (resourceFile != null) {
|
|
462
|
+
return resourceFile;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
File resourceFile = copyFromRawResource(uriString, context);
|
|
467
|
+
if (resourceFile != null) {
|
|
468
|
+
return resourceFile;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
return new File(uriString);
|
|
472
|
+
}
|
|
460
473
|
|
|
461
474
|
if (source.hasKey("data") && source.getType("data") == ReadableType.Array) {
|
|
462
475
|
ReadableArray array = source.getArray("data");
|
|
@@ -494,13 +507,24 @@ public class PapyrusNativeEngineModule extends ReactContextBaseJavaModule {
|
|
|
494
507
|
return out;
|
|
495
508
|
}
|
|
496
509
|
|
|
497
|
-
private static File copyFromAsset(String assetPath, Context context) throws IOException {
|
|
498
|
-
InputStream inputStream = context.getAssets().open(assetPath);
|
|
499
|
-
File out = createTempFile(context);
|
|
500
|
-
writeStreamToFile(inputStream, out);
|
|
501
|
-
return out;
|
|
502
|
-
}
|
|
503
|
-
|
|
510
|
+
private static File copyFromAsset(String assetPath, Context context) throws IOException {
|
|
511
|
+
InputStream inputStream = context.getAssets().open(assetPath);
|
|
512
|
+
File out = createTempFile(context);
|
|
513
|
+
writeStreamToFile(inputStream, out);
|
|
514
|
+
return out;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
private static File copyFromRawResource(String resourceName, Context context) throws IOException {
|
|
518
|
+
int resId = context.getResources().getIdentifier(resourceName, "raw", context.getPackageName());
|
|
519
|
+
if (resId == 0) {
|
|
520
|
+
return null;
|
|
521
|
+
}
|
|
522
|
+
InputStream inputStream = context.getResources().openRawResource(resId);
|
|
523
|
+
File out = createTempFile(context);
|
|
524
|
+
writeStreamToFile(inputStream, out);
|
|
525
|
+
return out;
|
|
526
|
+
}
|
|
527
|
+
|
|
504
528
|
private static File writeBytesToCache(byte[] bytes, Context context) throws IOException {
|
|
505
529
|
File out = createTempFile(context);
|
|
506
530
|
FileOutputStream fos = new FileOutputStream(out);
|
|
@@ -437,12 +437,25 @@ class PapyrusNativeEngineModule : Module() {
|
|
|
437
437
|
return copyFromContentUri(Uri.parse(uriValue), context)
|
|
438
438
|
}
|
|
439
439
|
|
|
440
|
-
if (uriValue.startsWith("file://")) {
|
|
441
|
-
return File(Uri.parse(uriValue).path ?: return null)
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
440
|
+
if (uriValue.startsWith("file://")) {
|
|
441
|
+
return File(Uri.parse(uriValue).path ?: return null)
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
if (uriValue.startsWith("res://")) {
|
|
445
|
+
val resourceName = uriValue.substring("res://".length)
|
|
446
|
+
val resourceId = context.resources.getIdentifier(resourceName, "raw", context.packageName)
|
|
447
|
+
if (resourceId != 0) {
|
|
448
|
+
return copyFromRawResource(resourceId, context)
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
val resourceId = context.resources.getIdentifier(uriValue, "raw", context.packageName)
|
|
453
|
+
if (resourceId != 0) {
|
|
454
|
+
return copyFromRawResource(resourceId, context)
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
return File(uriValue)
|
|
458
|
+
}
|
|
446
459
|
|
|
447
460
|
val dataValue = source["data"]
|
|
448
461
|
if (dataValue != null) {
|
|
@@ -500,13 +513,21 @@ class PapyrusNativeEngineModule : Module() {
|
|
|
500
513
|
}
|
|
501
514
|
|
|
502
515
|
@Throws(IOException::class)
|
|
503
|
-
private fun copyFromAsset(assetPath: String, context: Context): File {
|
|
504
|
-
val inputStream = context.assets.open(assetPath)
|
|
505
|
-
val out = createTempFile(context)
|
|
506
|
-
writeStreamToFile(inputStream, out)
|
|
507
|
-
return out
|
|
508
|
-
}
|
|
509
|
-
|
|
516
|
+
private fun copyFromAsset(assetPath: String, context: Context): File {
|
|
517
|
+
val inputStream = context.assets.open(assetPath)
|
|
518
|
+
val out = createTempFile(context)
|
|
519
|
+
writeStreamToFile(inputStream, out)
|
|
520
|
+
return out
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
@Throws(IOException::class)
|
|
524
|
+
private fun copyFromRawResource(resourceId: Int, context: Context): File {
|
|
525
|
+
val inputStream = context.resources.openRawResource(resourceId)
|
|
526
|
+
val out = createTempFile(context)
|
|
527
|
+
writeStreamToFile(inputStream, out)
|
|
528
|
+
return out
|
|
529
|
+
}
|
|
530
|
+
|
|
510
531
|
@Throws(IOException::class)
|
|
511
532
|
private fun writeBytesToCache(bytes: ByteArray, context: Context): File {
|
|
512
533
|
val out = createTempFile(context)
|
package/dist/index.js
CHANGED
|
@@ -281,11 +281,21 @@ var normalizeNativeDestination = (dest) => {
|
|
|
281
281
|
}
|
|
282
282
|
return null;
|
|
283
283
|
};
|
|
284
|
+
var resolveNativeModule = () => {
|
|
285
|
+
const expoModule = requireOptionalNativeModule(MODULE_NAME);
|
|
286
|
+
if (expoModule) return expoModule;
|
|
287
|
+
const rnModule = import_react_native3.NativeModules[MODULE_NAME];
|
|
288
|
+
return rnModule ?? null;
|
|
289
|
+
};
|
|
284
290
|
var resolvePapyrusPageView = () => {
|
|
285
291
|
try {
|
|
286
292
|
return requireNativeViewManager("PapyrusPageView");
|
|
287
293
|
} catch {
|
|
288
|
-
|
|
294
|
+
try {
|
|
295
|
+
return (0, import_react_native3.requireNativeComponent)("PapyrusPageView");
|
|
296
|
+
} catch {
|
|
297
|
+
return import_react_native3.View;
|
|
298
|
+
}
|
|
289
299
|
}
|
|
290
300
|
};
|
|
291
301
|
var PapyrusPageView = resolvePapyrusPageView();
|
|
@@ -298,7 +308,7 @@ var NativeDocumentEngine = class extends import_core.BaseDocumentEngine {
|
|
|
298
308
|
this.currentPage = 1;
|
|
299
309
|
this.zoom = 1;
|
|
300
310
|
this.rotation = 0;
|
|
301
|
-
this.nativeModule =
|
|
311
|
+
this.nativeModule = resolveNativeModule();
|
|
302
312
|
this.engineId = this.nativeModule?.createEngine ? this.nativeModule.createEngine() : "default";
|
|
303
313
|
}
|
|
304
314
|
async load(input) {
|
|
@@ -401,6 +411,9 @@ var NativeDocumentEngine = class extends import_core.BaseDocumentEngine {
|
|
|
401
411
|
this.nativeModule?.destroyEngine?.(this.engineId);
|
|
402
412
|
}
|
|
403
413
|
assertNativeModule() {
|
|
414
|
+
if (!this.nativeModule) {
|
|
415
|
+
this.nativeModule = resolveNativeModule();
|
|
416
|
+
}
|
|
404
417
|
if (!this.nativeModule) {
|
|
405
418
|
throw new Error(
|
|
406
419
|
`[Papyrus] Native module "${MODULE_NAME}" not found. Use a dev client or a native build (Expo Go is not supported).`
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts","../../../node_modules/expo-modules-core/src/ensureNativeModulesAreInstalled.ts","../../../node_modules/expo-modules-core/src/web/index.ts","../../../node_modules/expo-modules-core/src/NativeModulesProxy.ts","../../../node_modules/expo-modules-core/src/errors/CodedError.ts","../../../node_modules/expo-modules-core/src/Platform.ts","../../../node_modules/expo-modules-core/src/environment/browser.ts","../../../node_modules/expo-modules-core/src/errors/UnavailabilityError.ts","../../../node_modules/expo-modules-core/src/NativeViewManagerAdapter.tsx","../../../node_modules/expo-modules-core/src/sweet/NativeErrorManager.ts","../../../node_modules/expo-modules-core/src/sweet/setUpErrorManager.fx.ts","../../../node_modules/expo-modules-core/src/requireNativeModule.ts"],"sourcesContent":["import type { ComponentType, RefAttributes } from 'react';\nimport { View, type ViewProps } from 'react-native';\r\nimport { requireNativeViewManager, requireOptionalNativeModule } from 'expo-modules-core';\r\nimport { BaseDocumentEngine, papyrusEvents } from '@papyrus-sdk/core';\r\nimport {\r\n DocumentLoadInput,\r\n DocumentLoadRequest,\r\n DocumentEngine,\r\n DocumentSource,\r\n DocumentType,\r\n PageDestination,\r\n PapyrusEventType,\r\n RenderTargetType,\r\n TextItem,\r\n OutlineItem,\r\n FileLike,\r\n SearchResult,\r\n TextSelection,\r\n} from '@papyrus-sdk/types';\r\n\r\nconst MODULE_NAME = 'PapyrusNativeEngine';\r\n\r\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\nconst BASE64_LOOKUP = (() => {\r\n const table = new Uint8Array(256);\r\n table.fill(255);\r\n for (let i = 0; i < BASE64_CHARS.length; i += 1) {\r\n table[BASE64_CHARS.charCodeAt(i)] = i;\r\n }\r\n return table;\r\n})();\r\n\r\nconst parseDataUri = (value: string): { mime: string; isBase64: boolean; data: string } | null => {\r\n const match = /^data:([^;,]+)?(;base64)?,(.*)$/.exec(value);\r\n if (!match) return null;\r\n return {\r\n mime: match[1] ?? '',\r\n isBase64: Boolean(match[2]),\r\n data: match[3] ?? '',\r\n };\r\n};\r\n\r\nconst looksLikeUri = (value: string): boolean =>\r\n value.startsWith('http://') ||\r\n value.startsWith('https://') ||\r\n value.startsWith('/') ||\r\n value.startsWith('./') ||\r\n value.startsWith('../') ||\r\n value.startsWith('file://');\r\n\r\nconst isLikelyBase64 = (value: string): boolean => {\r\n if (looksLikeUri(value)) return false;\r\n if (value.includes('.')) return false;\r\n if (value.length < 16) return false;\r\n return /^[A-Za-z0-9+/=]+$/.test(value);\r\n};\r\n\r\nconst isHttpUri = (value: string): boolean =>\r\n value.startsWith('http://') || value.startsWith('https://');\r\n\r\nconst decodeBase64 = (value: string): Uint8Array => {\r\n const clean = value.replace(/[^A-Za-z0-9+/=]/g, '');\r\n const padding = clean.endsWith('==') ? 2 : clean.endsWith('=') ? 1 : 0;\r\n const outputLength = Math.max(0, (clean.length * 3) / 4 - padding);\r\n const output = new Uint8Array(outputLength);\r\n\r\n let buffer = 0;\r\n let bits = 0;\r\n let index = 0;\r\n\r\n for (let i = 0; i < clean.length; i += 1) {\r\n const charCode = clean.charCodeAt(i);\r\n if (charCode === 61) break;\r\n const valueIndex = BASE64_LOOKUP[charCode];\r\n if (valueIndex === 255) continue;\r\n buffer = (buffer << 6) | valueIndex;\r\n bits += 6;\r\n if (bits >= 8) {\r\n bits -= 8;\r\n output[index++] = (buffer >> bits) & 0xff;\r\n }\r\n }\r\n return output;\r\n};\r\n\r\nconst encodeBase64 = (bytes: Uint8Array): string => {\r\n let output = '';\r\n let buffer = 0;\r\n let bits = 0;\r\n\r\n for (let i = 0; i < bytes.length; i += 1) {\r\n buffer = (buffer << 8) | bytes[i];\r\n bits += 8;\r\n while (bits >= 6) {\r\n bits -= 6;\r\n output += BASE64_CHARS[(buffer >> bits) & 0x3f];\r\n }\r\n }\r\n\r\n if (bits > 0) {\r\n output += BASE64_CHARS[(buffer << (6 - bits)) & 0x3f];\r\n }\r\n\r\n const remainder = bytes.length % 3;\r\n if (remainder === 1) return `${output}==`;\r\n if (remainder === 2) return `${output}=`;\r\n return output;\r\n};\r\n\r\nconst isLoadRequest = (input: DocumentLoadInput): input is DocumentLoadRequest =>\r\n typeof input === 'object' && input !== null && 'source' in input && 'type' in input;\r\n\r\nconst normalizeLoadInput = (input: DocumentLoadInput): { source: DocumentSource; type?: DocumentType } =>\r\n isLoadRequest(input) ? { source: input.source, type: input.type } : { source: input };\r\n\r\nconst inferDocumentType = (source: DocumentSource): DocumentType => {\r\n if (typeof source === 'string') {\r\n const dataUri = parseDataUri(source);\r\n if (dataUri?.mime) {\r\n const mime = dataUri.mime.toLowerCase();\r\n if (mime.includes('epub')) return 'epub';\r\n if (mime.includes('text')) return 'text';\r\n if (mime.includes('pdf')) return 'pdf';\r\n }\r\n\r\n const clean = source.split('?')[0].split('#')[0];\r\n const ext = clean.includes('.') ? clean.split('.').pop()?.toLowerCase() : undefined;\r\n if (ext === 'epub') return 'epub';\r\n if (ext === 'txt') return 'text';\r\n if (ext === 'pdf') return 'pdf';\r\n return 'pdf';\r\n }\r\n\r\n if (typeof source === 'object' && source !== null && 'uri' in source) {\r\n const uri = source.uri;\r\n const clean = uri.split('?')[0].split('#')[0];\r\n const ext = clean.includes('.') ? clean.split('.').pop()?.toLowerCase() : undefined;\r\n if (ext === 'epub') return 'epub';\r\n if (ext === 'txt') return 'text';\r\n if (ext === 'pdf') return 'pdf';\r\n }\r\n\r\n return 'pdf';\r\n};\r\n\r\ntype NativeDocumentSource = {\r\n uri?: string;\r\n data?: Uint8Array;\r\n};\r\n\r\ntype NativePageDestination = {\r\n kind: 'pageIndex' | 'pageNumber' | 'named';\r\n value: number | string;\r\n};\r\n\r\nconst normalizeNativeDestination = (dest: PageDestination): NativePageDestination | null => {\r\n if (!dest) return null;\r\n if (typeof dest === 'string') {\r\n return { kind: 'named', value: dest };\r\n }\r\n\r\n if (dest.kind === 'pageIndex' || dest.kind === 'pageNumber' || dest.kind === 'named') {\r\n return { kind: dest.kind, value: dest.value };\r\n }\r\n\r\n return null;\r\n};\r\n\r\ntype NativeEngineModule = {\r\n createEngine?: () => string;\r\n destroyEngine?: (engineId: string) => void;\r\n load?: (engineId: string, source: NativeDocumentSource) => Promise<{ pageCount?: number } | void>;\r\n getPageCount?: (engineId: string) => number;\r\n renderPage?: (engineId: string, pageIndex: number, target: number, scale: number, zoom: number, rotation: number) => void;\r\n renderTextLayer?: (engineId: string, pageIndex: number, target: number, scale: number, zoom: number, rotation: number) => void;\r\n getTextContent?: (engineId: string, pageIndex: number) => Promise<TextItem[]>;\r\n getPageDimensions?: (engineId: string, pageIndex: number) => Promise<{ width: number; height: number }>;\r\n searchText?: (engineId: string, query: string) => Promise<SearchResult[]>;\r\n selectText?: (engineId: string, pageIndex: number, x: number, y: number, width: number, height: number) => Promise<TextSelection | null>;\r\n getOutline?: (engineId: string) => Promise<OutlineItem[]>;\r\n getPageIndex?: (engineId: string, dest: NativePageDestination) => Promise<number | null>;\r\n};\r\n\r\nexport type PapyrusPageViewProps = ViewProps & {\n engineId?: string;\n};\n\ntype PapyrusPageViewComponent = ComponentType<PapyrusPageViewProps & RefAttributes<View>>;\n\nconst resolvePapyrusPageView = (): PapyrusPageViewComponent => {\n try {\n return requireNativeViewManager<PapyrusPageViewProps>('PapyrusPageView') as PapyrusPageViewComponent;\n } catch {\n return View as PapyrusPageViewComponent;\n }\n};\n\r\nexport const PapyrusPageView = resolvePapyrusPageView();\r\n\r\nexport class NativeDocumentEngine extends BaseDocumentEngine {\r\n private nativeModule: NativeEngineModule | null = null;\r\n private engineId: string = 'default';\r\n private pageCount: number = 0;\r\n private currentPage: number = 1;\r\n private zoom: number = 1.0;\r\n private rotation: number = 0;\r\n\r\n constructor() {\r\n super();\r\n this.nativeModule = requireOptionalNativeModule<NativeEngineModule>(MODULE_NAME);\r\n this.engineId = this.nativeModule?.createEngine ? this.nativeModule.createEngine() : 'default';\r\n }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n const { source, type } = normalizeLoadInput(input);\r\n if (type && type !== 'pdf') {\r\n throw new Error(`[NativeDocumentEngine] Tipo de documento não suportado: ${type}`);\r\n }\r\n\r\n const native = this.assertNativeModule();\r\n const normalized = await this.normalizeSource(source);\r\n const result = native.load ? await native.load(this.engineId, normalized) : undefined;\r\n\r\n if (result && typeof result.pageCount === 'number') {\r\n this.pageCount = result.pageCount;\r\n } else if (native.getPageCount) {\r\n this.pageCount = native.getPageCount(this.engineId);\r\n } else {\r\n this.pageCount = 0;\r\n }\r\n\r\n this.currentPage = 1;\r\n }\r\n\r\n getPageCount(): number {\r\n return this.pageCount;\r\n }\r\n\r\n getCurrentPage(): number {\r\n return this.currentPage;\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (page >= 1 && page <= this.pageCount) {\r\n this.currentPage = page;\r\n }\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.zoom = Math.max(0.1, Math.min(5.0, zoom));\r\n }\r\n\r\n getZoom(): number {\r\n return this.zoom;\r\n }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n if (direction === 'clockwise') {\r\n this.rotation = (this.rotation + 90) % 360;\r\n } else {\r\n this.rotation = (this.rotation - 90) % 360;\r\n if (this.rotation < 0) this.rotation += 360;\r\n }\r\n }\r\n\r\n getRotation(): number {\r\n return this.rotation;\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n const native = this.assertNativeModule();\r\n if (!native.renderPage) return;\r\n const viewTag = this.toNativeViewTag(target);\r\n if (viewTag === null) return;\r\n native.renderPage(this.engineId, pageIndex, viewTag, scale, this.zoom, this.rotation);\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, target: any, scale: number): Promise<void> {\r\n const native = this.assertNativeModule();\r\n if (!native.renderTextLayer) return;\r\n const viewTag = this.toNativeViewTag(target);\r\n if (viewTag === null) return;\r\n native.renderTextLayer(this.engineId, pageIndex, viewTag, scale, this.zoom, this.rotation);\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n const native = this.assertNativeModule();\r\n if (!native.getTextContent) return [];\r\n return native.getTextContent(this.engineId, pageIndex);\r\n }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n const native = this.assertNativeModule();\r\n if (!native.getPageDimensions) return { width: 0, height: 0 };\r\n return native.getPageDimensions(this.engineId, pageIndex);\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n const native = this.assertNativeModule();\r\n if (!native.selectText) return null;\r\n return native.selectText(this.engineId, pageIndex, rect.x, rect.y, rect.width, rect.height);\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n const native = this.assertNativeModule();\r\n if (!native.getOutline) return [];\r\n return native.getOutline(this.engineId);\r\n }\r\n\r\n async searchText(query: string): Promise<SearchResult[]> {\r\n const native = this.assertNativeModule();\r\n if (!native.searchText) return [];\r\n return native.searchText(this.engineId, query);\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n if (!dest) return null;\r\n if (typeof dest !== 'string') {\r\n if (dest.kind === 'pageIndex') return dest.value;\r\n if (dest.kind === 'pageNumber') return Math.max(0, dest.value - 1);\r\n }\r\n\r\n const native = this.assertNativeModule();\r\n if (!native.getPageIndex) return null;\r\n const normalized = normalizeNativeDestination(dest);\r\n if (!normalized || normalized.kind !== 'named') return null;\r\n return native.getPageIndex(this.engineId, normalized);\r\n }\r\n\r\n destroy(): void {\r\n this.nativeModule?.destroyEngine?.(this.engineId);\r\n }\r\n\r\n private assertNativeModule(): NativeEngineModule {\r\n if (!this.nativeModule) {\r\n throw new Error(\r\n `[Papyrus] Native module \"${MODULE_NAME}\" not found. Use a dev client or a native build (Expo Go is not supported).`\r\n );\r\n }\r\n return this.nativeModule;\r\n }\r\n\r\n private async normalizeSource(source: DocumentSource): Promise<NativeDocumentSource> {\r\n if (typeof source === 'string') {\r\n const dataUri = parseDataUri(source);\r\n if (dataUri?.isBase64) {\r\n return { data: decodeBase64(dataUri.data) };\r\n }\r\n if (looksLikeUri(source)) return { uri: source };\r\n if (isLikelyBase64(source)) return { data: decodeBase64(source) };\r\n return { uri: source };\r\n }\r\n if (this.isUriSource(source)) return { uri: source.uri };\r\n if (this.isDataSource(source)) {\r\n const data = source.data instanceof Uint8Array ? source.data : new Uint8Array(source.data);\r\n return { data };\r\n }\r\n if (this.isFileLike(source)) {\r\n const buffer = await source.arrayBuffer();\r\n return { data: new Uint8Array(buffer) };\r\n }\r\n if (source instanceof ArrayBuffer) return { data: new Uint8Array(source) };\r\n if (source instanceof Uint8Array) return { data: source };\r\n return { data: new Uint8Array(source as ArrayBuffer) };\r\n }\r\n\r\n private isUriSource(source: DocumentSource): source is { uri: string } {\r\n return typeof source === 'object' && source !== null && 'uri' in source;\r\n }\r\n\r\n private isDataSource(source: DocumentSource): source is { data: ArrayBuffer | Uint8Array } {\r\n return typeof source === 'object' && source !== null && 'data' in source;\r\n }\r\n\r\n private isFileLike(source: DocumentSource): source is FileLike {\r\n return typeof source === 'object' && source !== null && typeof (source as FileLike).arrayBuffer === 'function';\r\n }\r\n\r\n private toNativeViewTag(target: any): number | null {\r\n if (typeof target === 'number') return target;\r\n if (target?.nativeTag && typeof target.nativeTag === 'number') return target.nativeTag;\r\n return null;\r\n }\r\n}\r\n\r\ntype WebViewBridge = {\r\n postMessage: (message: string) => void;\r\n};\r\n\r\ntype WebViewResponseMessage = {\r\n type: 'response';\r\n id: string;\r\n ok: boolean;\r\n data?: any;\r\n error?: string;\r\n};\r\n\r\ntype WebViewEventMessage = {\r\n type: 'event';\r\n name: string;\r\n payload?: any;\r\n};\r\n\r\ntype WebViewStateMessage = {\r\n type: 'state';\r\n payload: {\r\n pageCount?: number;\r\n currentPage?: number;\r\n zoom?: number;\r\n outline?: OutlineItem[];\r\n };\r\n};\r\n\r\ntype WebViewReadyMessage = {\r\n type: 'ready';\r\n};\r\n\r\ntype WebViewRuntimeMessage =\r\n | WebViewResponseMessage\r\n | WebViewEventMessage\r\n | WebViewStateMessage\r\n | WebViewReadyMessage;\r\n\r\ntype WebViewSourcePayload =\r\n | { kind: 'uri'; uri: string }\r\n | { kind: 'base64'; data: string; mime?: string }\r\n | { kind: 'text'; text: string };\r\n\r\nexport class WebViewDocumentEngine extends BaseDocumentEngine {\r\n private bridge: WebViewBridge | null = null;\r\n private ready = false;\r\n private requestId = 0;\r\n private pending = new Map<string, { resolve: (data: any) => void; reject: (error: Error) => void }>();\r\n private bridgeResolvers: Array<(bridge: WebViewBridge) => void> = [];\r\n private readyResolvers: Array<() => void> = [];\r\n private pageCount = 0;\r\n private currentPage = 1;\r\n private zoom = 1.0;\r\n private rotation = 0;\r\n private outline: OutlineItem[] = [];\r\n\r\n getRenderTargetType(): 'webview' {\r\n return 'webview';\r\n }\r\n\r\n attachBridge(bridge: WebViewBridge): void {\r\n this.bridge = bridge;\r\n this.bridgeResolvers.forEach((resolve) => resolve(bridge));\r\n this.bridgeResolvers = [];\r\n }\r\n\r\n handleMessage(raw: string): void {\r\n let message: WebViewRuntimeMessage | null = null;\r\n try {\r\n message = JSON.parse(raw) as WebViewRuntimeMessage;\r\n } catch {\r\n return;\r\n }\r\n\r\n if (!message) return;\r\n\r\n if (message.type === 'ready') {\r\n this.ready = true;\r\n this.readyResolvers.forEach((resolve) => resolve());\r\n this.readyResolvers = [];\r\n return;\r\n }\r\n\r\n if (message.type === 'response') {\r\n const pending = this.pending.get(message.id);\r\n if (!pending) return;\r\n this.pending.delete(message.id);\r\n if (message.ok) {\r\n pending.resolve(message.data);\r\n } else {\r\n pending.reject(new Error(message.error ?? '[Papyrus] WebView runtime error'));\r\n }\r\n return;\r\n }\r\n\r\n if (message.type === 'state') {\r\n if (typeof message.payload.pageCount === 'number') this.pageCount = message.payload.pageCount;\r\n if (typeof message.payload.currentPage === 'number') this.currentPage = message.payload.currentPage;\r\n if (typeof message.payload.zoom === 'number') this.zoom = message.payload.zoom;\r\n if (Array.isArray(message.payload.outline)) this.outline = message.payload.outline;\r\n return;\r\n }\r\n\r\n if (message.type === 'event') {\r\n const payload = message.payload ?? {};\r\n if (message.name === 'RUNTIME_LOG') {\r\n if (__DEV__) {\r\n const text = typeof payload?.message === 'string' ? payload.message : JSON.stringify(payload);\r\n console.log('[Papyrus WebView runtime]', text);\r\n }\r\n return;\r\n }\r\n if (message.name === 'RUNTIME_ERROR') {\n const errorMessage = typeof payload?.message === 'string' ? payload.message : '';\n if (errorMessage.includes('ResizeObserver loop')) {\n return;\n }\n if (__DEV__) {\n console.warn('[Papyrus WebView runtime]', payload);\n }\n return;\n }\n if (message.name === PapyrusEventType.TEXT_SELECTED) {\r\n papyrusEvents.emit(PapyrusEventType.TEXT_SELECTED, payload);\r\n } else if (message.name === PapyrusEventType.SEARCH_TRIGGERED) {\r\n papyrusEvents.emit(PapyrusEventType.SEARCH_TRIGGERED, payload);\r\n } else if (message.name === PapyrusEventType.DOCUMENT_LOADED) {\r\n if (typeof payload.pageCount === 'number') {\r\n this.pageCount = payload.pageCount;\r\n }\r\n papyrusEvents.emit(PapyrusEventType.DOCUMENT_LOADED, payload);\r\n }\r\n return;\r\n }\r\n\r\n if (__DEV__) {\r\n console.warn('[Papyrus WebView] Unknown message', message);\r\n }\r\n }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n const { source, type } = normalizeLoadInput(input);\r\n const resolvedType = type ?? inferDocumentType(source);\r\n if (resolvedType === 'pdf') {\r\n throw new Error('[WebViewDocumentEngine] Use o NativeDocumentEngine para PDFs no mobile.');\r\n }\r\n\r\n const payloadSource = await this.normalizeRuntimeSource(resolvedType, source);\r\n const response = await this.request<{ pageCount?: number; outline?: OutlineItem[] }>('load', {\r\n type: resolvedType,\r\n source: payloadSource,\r\n });\r\n\r\n if (typeof response?.pageCount === 'number') this.pageCount = response.pageCount;\r\n if (Array.isArray(response?.outline)) this.outline = response.outline;\r\n this.currentPage = 1;\r\n }\r\n\r\n getPageCount(): number {\r\n return this.pageCount;\r\n }\r\n\r\n getCurrentPage(): number {\r\n return this.currentPage;\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (page < 1) return;\r\n this.currentPage = page;\r\n void this.request('go-to-page', { page });\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.zoom = Math.max(0.5, Math.min(4.0, zoom));\r\n void this.request('set-zoom', { zoom: this.zoom });\r\n }\r\n\r\n getZoom(): number {\r\n return this.zoom;\r\n }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n if (direction === 'clockwise') {\r\n this.rotation = (this.rotation + 90) % 360;\r\n } else {\r\n this.rotation = (this.rotation - 90) % 360;\r\n if (this.rotation < 0) this.rotation += 360;\r\n }\r\n void this.request('set-rotation', { rotation: this.rotation });\r\n }\r\n\r\n getRotation(): number {\r\n return this.rotation;\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n void pageIndex;\r\n void target;\r\n void scale;\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void> {\r\n void pageIndex;\r\n void container;\r\n void scale;\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n return await this.request<TextItem[]>('get-text-content', { pageIndex });\r\n }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n return await this.request<{ width: number; height: number }>('get-page-dimensions', { pageIndex });\r\n }\r\n\r\n async searchText(query: string): Promise<SearchResult[]> {\r\n return await this.request<SearchResult[]>('search-text', { query });\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n return await this.request<TextSelection | null>('select-text', { pageIndex, rect });\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n if (this.outline.length > 0) return this.outline;\r\n return await this.request<OutlineItem[]>('get-outline');\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n if (!dest) return null;\r\n if (typeof dest !== 'string') {\r\n if (dest.kind === 'pageIndex') return dest.value;\r\n if (dest.kind === 'pageNumber') return Math.max(0, dest.value - 1);\r\n if (dest.kind === 'href') {\r\n return await this.request<number | null>('get-page-index', { dest: dest.value });\r\n }\r\n return null;\r\n }\r\n return await this.request<number | null>('get-page-index', { dest });\r\n }\r\n\r\n destroy(): void {\r\n this.pending.forEach(({ reject }) => reject(new Error('[Papyrus] WebView engine destroyed')));\r\n this.pending.clear();\r\n this.bridge = null;\r\n this.ready = false;\r\n }\r\n\r\n private async ensureBridge(): Promise<WebViewBridge> {\r\n if (this.bridge) return this.bridge;\r\n return new Promise((resolve) => {\r\n this.bridgeResolvers.push(resolve);\r\n });\r\n }\r\n\r\n private async ensureReady(): Promise<void> {\r\n if (this.ready) return;\r\n return new Promise((resolve) => {\r\n this.readyResolvers.push(resolve);\r\n });\r\n }\r\n\r\n private async request<T = any>(kind: string, payload?: any): Promise<T> {\r\n const bridge = await this.ensureBridge();\r\n await this.ensureReady();\r\n const id = `${Date.now()}-${this.requestId++}`;\r\n return new Promise<T>((resolve, reject) => {\r\n const timeoutMs = kind === 'load' ? 30000 : 8000;\r\n const timeoutId = setTimeout(() => {\r\n this.pending.delete(id);\r\n reject(new Error(`[Papyrus] WebView response timeout: ${kind}`));\r\n }, timeoutMs);\r\n this.pending.set(id, {\r\n resolve: (data) => {\r\n clearTimeout(timeoutId);\r\n resolve(data);\r\n },\r\n reject: (error) => {\r\n clearTimeout(timeoutId);\r\n reject(error);\r\n },\r\n });\r\n bridge.postMessage(JSON.stringify({ id, kind, payload }));\r\n });\r\n }\r\n\r\n private async normalizeRuntimeSource(type: DocumentType, source: DocumentSource): Promise<WebViewSourcePayload> {\r\n if (typeof source === 'string') {\r\n const dataUri = parseDataUri(source);\r\n if (dataUri) {\r\n if (dataUri.isBase64) {\r\n return { kind: 'base64', data: dataUri.data, mime: dataUri.mime || undefined };\r\n }\r\n const text = decodeURIComponent(dataUri.data);\r\n return { kind: 'text', text };\r\n }\r\n\r\n if (looksLikeUri(source)) {\r\n if (isHttpUri(source)) {\r\n const fetched = await this.fetchRemoteSource(type, source);\r\n if (fetched) return fetched;\r\n }\r\n return { kind: 'uri', uri: source };\r\n }\r\n\r\n if (isLikelyBase64(source)) {\r\n return { kind: 'base64', data: source };\r\n }\r\n\r\n if (type === 'text') {\r\n return { kind: 'text', text: source };\r\n }\r\n\r\n return { kind: 'uri', uri: source };\r\n }\r\n\r\n if (this.isUriSource(source)) {\r\n const uri = source.uri;\r\n if (isHttpUri(uri)) {\r\n const fetched = await this.fetchRemoteSource(type, uri);\r\n if (fetched) return fetched;\r\n }\r\n return { kind: 'uri', uri };\r\n }\r\n if (this.isDataSource(source)) {\r\n const bytes = source.data instanceof Uint8Array ? source.data : new Uint8Array(source.data);\r\n return { kind: 'base64', data: encodeBase64(bytes) };\r\n }\r\n if (this.isFileLike(source)) {\r\n const buffer = await source.arrayBuffer();\r\n return { kind: 'base64', data: encodeBase64(new Uint8Array(buffer)) };\r\n }\r\n if (source instanceof ArrayBuffer || source instanceof Uint8Array) {\r\n const bytes = source instanceof Uint8Array ? source : new Uint8Array(source);\r\n return { kind: 'base64', data: encodeBase64(bytes) };\r\n }\r\n\r\n return { kind: 'base64', data: encodeBase64(new Uint8Array(source as ArrayBuffer)) };\r\n }\r\n\r\n private async fetchRemoteSource(type: DocumentType, uri: string): Promise<WebViewSourcePayload | null> {\r\n try {\r\n const response = await fetch(uri);\r\n if (!response.ok) return null;\r\n if (type === 'text') {\r\n const text = await response.text();\r\n return { kind: 'text', text };\r\n }\r\n if (type === 'epub') {\r\n const buffer = await this.readResponseBuffer(response);\r\n return { kind: 'base64', data: encodeBase64(new Uint8Array(buffer)) };\r\n }\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private async readResponseBuffer(response: Response): Promise<ArrayBuffer> {\r\n try {\r\n return await response.arrayBuffer();\r\n } catch {\r\n const blob = await response.blob();\r\n return await new Promise<ArrayBuffer>((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onerror = () => reject(new Error('[Papyrus] Failed to read response blob'));\r\n reader.onload = () => resolve(reader.result as ArrayBuffer);\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n }\r\n }\r\n\r\n private isUriSource(source: DocumentSource): source is { uri: string } {\r\n return typeof source === 'object' && source !== null && 'uri' in source;\r\n }\r\n\r\n private isDataSource(source: DocumentSource): source is { data: ArrayBuffer | Uint8Array } {\r\n return typeof source === 'object' && source !== null && 'data' in source;\r\n }\r\n\r\n private isFileLike(source: DocumentSource): source is FileLike {\r\n return typeof source === 'object' && source !== null && typeof (source as FileLike).arrayBuffer === 'function';\r\n }\r\n}\r\n\r\nexport class MobileDocumentEngine extends BaseDocumentEngine {\r\n private pdfEngine: NativeDocumentEngine;\r\n private webEngine: WebViewDocumentEngine;\r\n private activeEngine: DocumentEngine;\r\n\r\n constructor() {\r\n super();\r\n this.pdfEngine = new NativeDocumentEngine();\r\n this.webEngine = new WebViewDocumentEngine();\r\n this.activeEngine = this.pdfEngine;\r\n }\r\n\r\n getRenderTargetType(): RenderTargetType {\r\n return this.activeEngine.getRenderTargetType?.() ?? 'canvas';\r\n }\r\n\r\n attachWebView(bridge: WebViewBridge): void {\r\n this.webEngine.attachBridge(bridge);\r\n }\r\n\r\n handleWebViewMessage(data: string): void {\r\n this.webEngine.handleMessage(data);\r\n }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n const { source, type } = normalizeLoadInput(input);\r\n const resolvedType = type ?? inferDocumentType(source);\r\n this.activeEngine = resolvedType === 'pdf' ? this.pdfEngine : this.webEngine;\r\n await this.activeEngine.load({ type: resolvedType, source });\r\n }\r\n\r\n getPageCount(): number {\r\n return this.activeEngine.getPageCount();\r\n }\r\n\r\n getCurrentPage(): number {\r\n return this.activeEngine.getCurrentPage();\r\n }\r\n\r\n goToPage(page: number): void {\r\n this.activeEngine.goToPage(page);\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.activeEngine.setZoom(zoom);\r\n }\r\n\r\n getZoom(): number {\r\n return this.activeEngine.getZoom();\r\n }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n this.activeEngine.rotate(direction);\r\n }\r\n\r\n getRotation(): number {\r\n return this.activeEngine.getRotation();\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n await this.activeEngine.renderPage(pageIndex, target, scale);\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void> {\r\n await this.activeEngine.renderTextLayer(pageIndex, container, scale);\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n return await this.activeEngine.getTextContent(pageIndex);\r\n }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n return await this.activeEngine.getPageDimensions(pageIndex);\r\n }\r\n\r\n async searchText(query: string): Promise<SearchResult[]> {\r\n if (typeof this.activeEngine.searchText === 'function') {\r\n return await this.activeEngine.searchText(query);\r\n }\r\n return [];\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n if (typeof this.activeEngine.selectText === 'function') {\r\n return await this.activeEngine.selectText(pageIndex, rect);\r\n }\r\n return null;\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n return await this.activeEngine.getOutline();\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n return await this.activeEngine.getPageIndex(dest);\r\n }\r\n\r\n destroy(): void {\r\n this.pdfEngine.destroy();\r\n this.webEngine.destroy();\r\n }\r\n}\r\n","import { NativeModules, Platform } from 'react-native';\n\nimport { registerWebGlobals } from './web/index';\n\n/**\n * Ensures that the native modules are installed in the current runtime.\n * Otherwise, it synchronously calls a native function that installs them.\n */\nexport function ensureNativeModulesAreInstalled(): void {\n if (globalThis.expo) {\n return;\n }\n try {\n if (Platform.OS === 'web') {\n // Requiring web folder sets up the `globalThis.expo` object.\n registerWebGlobals();\n } else {\n // TODO: ExpoModulesCore shouldn't be optional here,\n // but to keep backwards compatibility let's just ignore it in SDK 50.\n // In most cases the modules were already installed from the native side.\n NativeModules.ExpoModulesCore?.installModules();\n }\n } catch (error) {\n console.error(`Unable to install Expo modules: ${error}`);\n }\n}\n","export function registerWebGlobals() {}\n","import type { ProxyNativeModule } from './NativeModulesProxy.types';\n\n// We default to an empty object shim wherever we don't have an environment-specific implementation\n\n/**\n * @deprecated `NativeModulesProxy` is deprecated and might be removed in the future releases.\n * Use `requireNativeModule` or `requireOptionalNativeModule` instead.\n */\nexport default {} as { [moduleName: string]: ProxyNativeModule };\n","/**\n * A general error class that should be used for all errors in Expo modules.\n * Guarantees a `code` field that can be used to differentiate between different\n * types of errors without further subclassing Error.\n */\nexport class CodedError extends Error {\n code: string;\n info?: any;\n\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n","import { PlatformOSType, Platform as ReactNativePlatform } from 'react-native';\n\nimport {\n isDOMAvailable,\n canUseEventListeners,\n canUseViewport,\n isAsyncDebugging,\n} from './environment/browser';\n\nexport type PlatformSelectOSType = PlatformOSType | 'native' | 'electron' | 'default';\n\nexport type PlatformSelect = <T>(specifics: { [platform in PlatformSelectOSType]?: T }) => T;\n\nif (__DEV__ && typeof process.env.EXPO_OS === 'undefined') {\n console.warn(\n `The global process.env.EXPO_OS is not defined. This should be inlined by babel-preset-expo during transformation.`\n );\n}\n\nconst nativeSelect =\n typeof window !== 'undefined'\n ? ReactNativePlatform.select\n : // process.env.EXPO_OS is injected by `babel-preset-expo` and available in both client and `react-server` environments.\n // Opt to use the env var when possible, and fallback to the React Native Platform module when it's not (arbitrary bundlers and transformers).\n function select<T>(specifics: { [platform in PlatformSelectOSType]?: T }): T | undefined {\n if (!process.env.EXPO_OS) return undefined;\n if (specifics.hasOwnProperty(process.env.EXPO_OS)) {\n return specifics[process.env.EXPO_OS]!;\n } else if (process.env.EXPO_OS !== 'web' && specifics.hasOwnProperty('native')) {\n return specifics.native!;\n } else if (specifics.hasOwnProperty('default')) {\n return specifics.default!;\n }\n // do nothing...\n return undefined;\n };\n\nconst Platform = {\n /**\n * Denotes the currently running platform.\n * Can be one of ios, android, web.\n */\n OS: process.env.EXPO_OS || ReactNativePlatform.OS,\n /**\n * Returns the value with the matching platform.\n * Object keys can be any of ios, android, native, web, default.\n *\n * @ios ios, native, default\n * @android android, native, default\n * @web web, default\n */\n select: nativeSelect as PlatformSelect,\n /**\n * Denotes if the DOM API is available in the current environment.\n * The DOM is not available in native React runtimes and Node.js.\n */\n isDOMAvailable,\n /**\n * Denotes if the current environment can attach event listeners\n * to the window. This will return false in native React\n * runtimes and Node.js.\n */\n canUseEventListeners,\n /**\n * Denotes if the current environment can inspect properties of the\n * screen on which the current window is being rendered. This will\n * return false in native React runtimes and Node.js.\n */\n canUseViewport,\n /**\n * If the JavaScript is being executed in a remote JavaScript environment.\n * When `true`, synchronous native invocations cannot be executed.\n */\n isAsyncDebugging,\n};\n\nexport default Platform;\n","declare const global: any;\n\n// In standard node environments there is no DOM API\nexport const isDOMAvailable = false;\nexport const canUseEventListeners = false;\nexport const canUseViewport = false;\n\nexport let isAsyncDebugging: boolean = false;\n\nif (__DEV__) {\n // These native globals are injected by native React runtimes and not standard browsers\n // we can use them to determine if the JS is being executed in Chrome.\n isAsyncDebugging =\n !global.nativeExtensions && !global.nativeCallSyncHook && !global.RN$Bridgeless;\n}\n","import { CodedError } from './CodedError';\nimport Platform from '../Platform';\n\n/**\n * A class for errors to be thrown when a property is accessed which is\n * unavailable, unsupported, or not currently implemented on the running\n * platform.\n */\nexport class UnavailabilityError extends CodedError {\n constructor(moduleName: string, propertyName: string) {\n super(\n 'ERR_UNAVAILABLE',\n `The method or property ${moduleName}.${propertyName} is not available on ${Platform.OS}, are you sure you've linked all the native dependencies properly?`\n );\n }\n}\n","import React from 'react';\n\nimport { UnavailabilityError } from './errors/UnavailabilityError';\n\n/**\n * A drop-in replacement for `requireNativeComponent`.\n */\nexport function requireNativeViewManager<P = any>(viewName: string): React.ComponentType<P> {\n throw new UnavailabilityError('expo-modules-core', 'requireNativeViewManager');\n}\n","import NativeModulesProxy from '../NativeModulesProxy';\nexport default NativeModulesProxy.ExpoModulesCoreErrorManager;\n","import NativeErrorManager from './NativeErrorManager';\nimport Platform from '../Platform';\nimport { CodedError } from '../errors/CodedError';\n\nif (__DEV__ && Platform.OS === 'android' && NativeErrorManager) {\n const onNewException = 'ExpoModulesCoreErrorManager.onNewException';\n const onNewWarning = 'ExpoModulesCoreErrorManager.onNewWarning';\n\n NativeErrorManager.addListener(onNewException, ({ message }: { message: string }) => {\n console.error(message);\n });\n\n NativeErrorManager.addListener(onNewWarning, ({ message }: { message: string }) => {\n console.warn(message);\n });\n}\n\n// We have to export `CodedError` via global object to use in later in the C++ code.\nglobalThis.ExpoModulesCore_CodedError = CodedError;\n","import NativeModulesProxy from './NativeModulesProxy';\nimport { ensureNativeModulesAreInstalled } from './ensureNativeModulesAreInstalled';\n\n/**\n * Imports the native module registered with given name. In the first place it tries to load\n * the module installed through the JSI host object and then falls back to the bridge proxy module.\n * Notice that the modules loaded from the proxy may not support some features like synchronous functions.\n *\n * @param moduleName Name of the requested native module.\n * @returns Object representing the native module.\n * @throws Error when there is no native module with given name.\n */\nexport function requireNativeModule<ModuleType = any>(moduleName: string): ModuleType {\n const nativeModule = requireOptionalNativeModule<ModuleType>(moduleName);\n\n if (!nativeModule) {\n throw new Error(`Cannot find native module '${moduleName}'`);\n }\n return nativeModule;\n}\n\n/**\n * Imports the native module registered with the given name. The same as `requireNativeModule`,\n * but returns `null` when the module cannot be found instead of throwing an error.\n *\n * @param moduleName Name of the requested native module.\n * @returns Object representing the native module or `null` when it cannot be found.\n */\nexport function requireOptionalNativeModule<ModuleType = any>(\n moduleName: string\n): ModuleType | null {\n ensureNativeModulesAreInstalled();\n\n return globalThis.expo?.modules?.[moduleName] ?? NativeModulesProxy[moduleName] ?? null;\n}\n"],"mappings":"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","names":["import_react_native","import_react_native","ReactNativePlatform","Platform"]}
|
|
1
|
+
{"version":3,"sources":["../index.ts","../../../node_modules/expo-modules-core/src/ensureNativeModulesAreInstalled.ts","../../../node_modules/expo-modules-core/src/web/index.ts","../../../node_modules/expo-modules-core/src/NativeModulesProxy.ts","../../../node_modules/expo-modules-core/src/errors/CodedError.ts","../../../node_modules/expo-modules-core/src/Platform.ts","../../../node_modules/expo-modules-core/src/environment/browser.ts","../../../node_modules/expo-modules-core/src/errors/UnavailabilityError.ts","../../../node_modules/expo-modules-core/src/NativeViewManagerAdapter.tsx","../../../node_modules/expo-modules-core/src/sweet/NativeErrorManager.ts","../../../node_modules/expo-modules-core/src/sweet/setUpErrorManager.fx.ts","../../../node_modules/expo-modules-core/src/requireNativeModule.ts"],"sourcesContent":["import type { ComponentType, RefAttributes } from 'react';\nimport { NativeModules, requireNativeComponent, View, type ViewProps } from 'react-native';\nimport { requireNativeViewManager, requireOptionalNativeModule } from 'expo-modules-core';\nimport { BaseDocumentEngine, papyrusEvents } from '@papyrus-sdk/core';\r\nimport {\r\n DocumentLoadInput,\r\n DocumentLoadRequest,\r\n DocumentEngine,\r\n DocumentSource,\r\n DocumentType,\r\n PageDestination,\r\n PapyrusEventType,\r\n RenderTargetType,\r\n TextItem,\r\n OutlineItem,\r\n FileLike,\r\n SearchResult,\r\n TextSelection,\r\n} from '@papyrus-sdk/types';\r\n\r\nconst MODULE_NAME = 'PapyrusNativeEngine';\r\n\r\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\nconst BASE64_LOOKUP = (() => {\r\n const table = new Uint8Array(256);\r\n table.fill(255);\r\n for (let i = 0; i < BASE64_CHARS.length; i += 1) {\r\n table[BASE64_CHARS.charCodeAt(i)] = i;\r\n }\r\n return table;\r\n})();\r\n\r\nconst parseDataUri = (value: string): { mime: string; isBase64: boolean; data: string } | null => {\r\n const match = /^data:([^;,]+)?(;base64)?,(.*)$/.exec(value);\r\n if (!match) return null;\r\n return {\r\n mime: match[1] ?? '',\r\n isBase64: Boolean(match[2]),\r\n data: match[3] ?? '',\r\n };\r\n};\r\n\r\nconst looksLikeUri = (value: string): boolean =>\r\n value.startsWith('http://') ||\r\n value.startsWith('https://') ||\r\n value.startsWith('/') ||\r\n value.startsWith('./') ||\r\n value.startsWith('../') ||\r\n value.startsWith('file://');\r\n\r\nconst isLikelyBase64 = (value: string): boolean => {\r\n if (looksLikeUri(value)) return false;\r\n if (value.includes('.')) return false;\r\n if (value.length < 16) return false;\r\n return /^[A-Za-z0-9+/=]+$/.test(value);\r\n};\r\n\r\nconst isHttpUri = (value: string): boolean =>\r\n value.startsWith('http://') || value.startsWith('https://');\r\n\r\nconst decodeBase64 = (value: string): Uint8Array => {\r\n const clean = value.replace(/[^A-Za-z0-9+/=]/g, '');\r\n const padding = clean.endsWith('==') ? 2 : clean.endsWith('=') ? 1 : 0;\r\n const outputLength = Math.max(0, (clean.length * 3) / 4 - padding);\r\n const output = new Uint8Array(outputLength);\r\n\r\n let buffer = 0;\r\n let bits = 0;\r\n let index = 0;\r\n\r\n for (let i = 0; i < clean.length; i += 1) {\r\n const charCode = clean.charCodeAt(i);\r\n if (charCode === 61) break;\r\n const valueIndex = BASE64_LOOKUP[charCode];\r\n if (valueIndex === 255) continue;\r\n buffer = (buffer << 6) | valueIndex;\r\n bits += 6;\r\n if (bits >= 8) {\r\n bits -= 8;\r\n output[index++] = (buffer >> bits) & 0xff;\r\n }\r\n }\r\n return output;\r\n};\r\n\r\nconst encodeBase64 = (bytes: Uint8Array): string => {\r\n let output = '';\r\n let buffer = 0;\r\n let bits = 0;\r\n\r\n for (let i = 0; i < bytes.length; i += 1) {\r\n buffer = (buffer << 8) | bytes[i];\r\n bits += 8;\r\n while (bits >= 6) {\r\n bits -= 6;\r\n output += BASE64_CHARS[(buffer >> bits) & 0x3f];\r\n }\r\n }\r\n\r\n if (bits > 0) {\r\n output += BASE64_CHARS[(buffer << (6 - bits)) & 0x3f];\r\n }\r\n\r\n const remainder = bytes.length % 3;\r\n if (remainder === 1) return `${output}==`;\r\n if (remainder === 2) return `${output}=`;\r\n return output;\r\n};\r\n\r\nconst isLoadRequest = (input: DocumentLoadInput): input is DocumentLoadRequest =>\r\n typeof input === 'object' && input !== null && 'source' in input && 'type' in input;\r\n\r\nconst normalizeLoadInput = (input: DocumentLoadInput): { source: DocumentSource; type?: DocumentType } =>\r\n isLoadRequest(input) ? { source: input.source, type: input.type } : { source: input };\r\n\r\nconst inferDocumentType = (source: DocumentSource): DocumentType => {\r\n if (typeof source === 'string') {\r\n const dataUri = parseDataUri(source);\r\n if (dataUri?.mime) {\r\n const mime = dataUri.mime.toLowerCase();\r\n if (mime.includes('epub')) return 'epub';\r\n if (mime.includes('text')) return 'text';\r\n if (mime.includes('pdf')) return 'pdf';\r\n }\r\n\r\n const clean = source.split('?')[0].split('#')[0];\r\n const ext = clean.includes('.') ? clean.split('.').pop()?.toLowerCase() : undefined;\r\n if (ext === 'epub') return 'epub';\r\n if (ext === 'txt') return 'text';\r\n if (ext === 'pdf') return 'pdf';\r\n return 'pdf';\r\n }\r\n\r\n if (typeof source === 'object' && source !== null && 'uri' in source) {\r\n const uri = source.uri;\r\n const clean = uri.split('?')[0].split('#')[0];\r\n const ext = clean.includes('.') ? clean.split('.').pop()?.toLowerCase() : undefined;\r\n if (ext === 'epub') return 'epub';\r\n if (ext === 'txt') return 'text';\r\n if (ext === 'pdf') return 'pdf';\r\n }\r\n\r\n return 'pdf';\r\n};\r\n\r\ntype NativeDocumentSource = {\r\n uri?: string;\r\n data?: Uint8Array;\r\n};\r\n\r\ntype NativePageDestination = {\r\n kind: 'pageIndex' | 'pageNumber' | 'named';\r\n value: number | string;\r\n};\r\n\r\nconst normalizeNativeDestination = (dest: PageDestination): NativePageDestination | null => {\r\n if (!dest) return null;\r\n if (typeof dest === 'string') {\r\n return { kind: 'named', value: dest };\r\n }\r\n\r\n if (dest.kind === 'pageIndex' || dest.kind === 'pageNumber' || dest.kind === 'named') {\r\n return { kind: dest.kind, value: dest.value };\r\n }\r\n\r\n return null;\r\n};\r\n\r\ntype NativeEngineModule = {\r\n createEngine?: () => string;\r\n destroyEngine?: (engineId: string) => void;\r\n load?: (engineId: string, source: NativeDocumentSource) => Promise<{ pageCount?: number } | void>;\r\n getPageCount?: (engineId: string) => number;\r\n renderPage?: (engineId: string, pageIndex: number, target: number, scale: number, zoom: number, rotation: number) => void;\r\n renderTextLayer?: (engineId: string, pageIndex: number, target: number, scale: number, zoom: number, rotation: number) => void;\r\n getTextContent?: (engineId: string, pageIndex: number) => Promise<TextItem[]>;\r\n getPageDimensions?: (engineId: string, pageIndex: number) => Promise<{ width: number; height: number }>;\r\n searchText?: (engineId: string, query: string) => Promise<SearchResult[]>;\r\n selectText?: (engineId: string, pageIndex: number, x: number, y: number, width: number, height: number) => Promise<TextSelection | null>;\r\n getOutline?: (engineId: string) => Promise<OutlineItem[]>;\r\n getPageIndex?: (engineId: string, dest: NativePageDestination) => Promise<number | null>;\r\n};\r\n\r\nexport type PapyrusPageViewProps = ViewProps & {\n engineId?: string;\n};\n\ntype PapyrusPageViewComponent = ComponentType<PapyrusPageViewProps & RefAttributes<View>>;\n\nconst resolveNativeModule = (): NativeEngineModule | null => {\n const expoModule = requireOptionalNativeModule<NativeEngineModule>(MODULE_NAME);\n if (expoModule) return expoModule;\n const rnModule = (NativeModules as Record<string, NativeEngineModule | undefined>)[MODULE_NAME];\n return rnModule ?? null;\n};\n\nconst resolvePapyrusPageView = (): PapyrusPageViewComponent => {\n try {\n return requireNativeViewManager<PapyrusPageViewProps>('PapyrusPageView') as PapyrusPageViewComponent;\n } catch {\n try {\n return requireNativeComponent<PapyrusPageViewProps>('PapyrusPageView') as PapyrusPageViewComponent;\n } catch {\n return View as PapyrusPageViewComponent;\n }\n }\n};\n\r\nexport const PapyrusPageView = resolvePapyrusPageView();\r\n\r\nexport class NativeDocumentEngine extends BaseDocumentEngine {\r\n private nativeModule: NativeEngineModule | null = null;\r\n private engineId: string = 'default';\r\n private pageCount: number = 0;\r\n private currentPage: number = 1;\r\n private zoom: number = 1.0;\r\n private rotation: number = 0;\r\n\r\n constructor() {\n super();\n this.nativeModule = resolveNativeModule();\n this.engineId = this.nativeModule?.createEngine ? this.nativeModule.createEngine() : 'default';\n }\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n const { source, type } = normalizeLoadInput(input);\r\n if (type && type !== 'pdf') {\r\n throw new Error(`[NativeDocumentEngine] Tipo de documento não suportado: ${type}`);\r\n }\r\n\r\n const native = this.assertNativeModule();\r\n const normalized = await this.normalizeSource(source);\r\n const result = native.load ? await native.load(this.engineId, normalized) : undefined;\r\n\r\n if (result && typeof result.pageCount === 'number') {\r\n this.pageCount = result.pageCount;\r\n } else if (native.getPageCount) {\r\n this.pageCount = native.getPageCount(this.engineId);\r\n } else {\r\n this.pageCount = 0;\r\n }\r\n\r\n this.currentPage = 1;\r\n }\r\n\r\n getPageCount(): number {\r\n return this.pageCount;\r\n }\r\n\r\n getCurrentPage(): number {\r\n return this.currentPage;\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (page >= 1 && page <= this.pageCount) {\r\n this.currentPage = page;\r\n }\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.zoom = Math.max(0.1, Math.min(5.0, zoom));\r\n }\r\n\r\n getZoom(): number {\r\n return this.zoom;\r\n }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n if (direction === 'clockwise') {\r\n this.rotation = (this.rotation + 90) % 360;\r\n } else {\r\n this.rotation = (this.rotation - 90) % 360;\r\n if (this.rotation < 0) this.rotation += 360;\r\n }\r\n }\r\n\r\n getRotation(): number {\r\n return this.rotation;\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n const native = this.assertNativeModule();\r\n if (!native.renderPage) return;\r\n const viewTag = this.toNativeViewTag(target);\r\n if (viewTag === null) return;\r\n native.renderPage(this.engineId, pageIndex, viewTag, scale, this.zoom, this.rotation);\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, target: any, scale: number): Promise<void> {\r\n const native = this.assertNativeModule();\r\n if (!native.renderTextLayer) return;\r\n const viewTag = this.toNativeViewTag(target);\r\n if (viewTag === null) return;\r\n native.renderTextLayer(this.engineId, pageIndex, viewTag, scale, this.zoom, this.rotation);\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n const native = this.assertNativeModule();\r\n if (!native.getTextContent) return [];\r\n return native.getTextContent(this.engineId, pageIndex);\r\n }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n const native = this.assertNativeModule();\r\n if (!native.getPageDimensions) return { width: 0, height: 0 };\r\n return native.getPageDimensions(this.engineId, pageIndex);\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n const native = this.assertNativeModule();\r\n if (!native.selectText) return null;\r\n return native.selectText(this.engineId, pageIndex, rect.x, rect.y, rect.width, rect.height);\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n const native = this.assertNativeModule();\r\n if (!native.getOutline) return [];\r\n return native.getOutline(this.engineId);\r\n }\r\n\r\n async searchText(query: string): Promise<SearchResult[]> {\r\n const native = this.assertNativeModule();\r\n if (!native.searchText) return [];\r\n return native.searchText(this.engineId, query);\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n if (!dest) return null;\r\n if (typeof dest !== 'string') {\r\n if (dest.kind === 'pageIndex') return dest.value;\r\n if (dest.kind === 'pageNumber') return Math.max(0, dest.value - 1);\r\n }\r\n\r\n const native = this.assertNativeModule();\r\n if (!native.getPageIndex) return null;\r\n const normalized = normalizeNativeDestination(dest);\r\n if (!normalized || normalized.kind !== 'named') return null;\r\n return native.getPageIndex(this.engineId, normalized);\r\n }\r\n\r\n destroy(): void {\r\n this.nativeModule?.destroyEngine?.(this.engineId);\r\n }\r\n\r\n private assertNativeModule(): NativeEngineModule {\n if (!this.nativeModule) {\n this.nativeModule = resolveNativeModule();\n }\n if (!this.nativeModule) {\n throw new Error(\n `[Papyrus] Native module \"${MODULE_NAME}\" not found. Use a dev client or a native build (Expo Go is not supported).`\n );\n }\n return this.nativeModule;\r\n }\r\n\r\n private async normalizeSource(source: DocumentSource): Promise<NativeDocumentSource> {\r\n if (typeof source === 'string') {\r\n const dataUri = parseDataUri(source);\r\n if (dataUri?.isBase64) {\r\n return { data: decodeBase64(dataUri.data) };\r\n }\r\n if (looksLikeUri(source)) return { uri: source };\r\n if (isLikelyBase64(source)) return { data: decodeBase64(source) };\r\n return { uri: source };\r\n }\r\n if (this.isUriSource(source)) return { uri: source.uri };\r\n if (this.isDataSource(source)) {\r\n const data = source.data instanceof Uint8Array ? source.data : new Uint8Array(source.data);\r\n return { data };\r\n }\r\n if (this.isFileLike(source)) {\r\n const buffer = await source.arrayBuffer();\r\n return { data: new Uint8Array(buffer) };\r\n }\r\n if (source instanceof ArrayBuffer) return { data: new Uint8Array(source) };\r\n if (source instanceof Uint8Array) return { data: source };\r\n return { data: new Uint8Array(source as ArrayBuffer) };\r\n }\r\n\r\n private isUriSource(source: DocumentSource): source is { uri: string } {\r\n return typeof source === 'object' && source !== null && 'uri' in source;\r\n }\r\n\r\n private isDataSource(source: DocumentSource): source is { data: ArrayBuffer | Uint8Array } {\r\n return typeof source === 'object' && source !== null && 'data' in source;\r\n }\r\n\r\n private isFileLike(source: DocumentSource): source is FileLike {\r\n return typeof source === 'object' && source !== null && typeof (source as FileLike).arrayBuffer === 'function';\r\n }\r\n\r\n private toNativeViewTag(target: any): number | null {\r\n if (typeof target === 'number') return target;\r\n if (target?.nativeTag && typeof target.nativeTag === 'number') return target.nativeTag;\r\n return null;\r\n }\r\n}\r\n\r\ntype WebViewBridge = {\r\n postMessage: (message: string) => void;\r\n};\r\n\r\ntype WebViewResponseMessage = {\r\n type: 'response';\r\n id: string;\r\n ok: boolean;\r\n data?: any;\r\n error?: string;\r\n};\r\n\r\ntype WebViewEventMessage = {\r\n type: 'event';\r\n name: string;\r\n payload?: any;\r\n};\r\n\r\ntype WebViewStateMessage = {\r\n type: 'state';\r\n payload: {\r\n pageCount?: number;\r\n currentPage?: number;\r\n zoom?: number;\r\n outline?: OutlineItem[];\r\n };\r\n};\r\n\r\ntype WebViewReadyMessage = {\r\n type: 'ready';\r\n};\r\n\r\ntype WebViewRuntimeMessage =\r\n | WebViewResponseMessage\r\n | WebViewEventMessage\r\n | WebViewStateMessage\r\n | WebViewReadyMessage;\r\n\r\ntype WebViewSourcePayload =\r\n | { kind: 'uri'; uri: string }\r\n | { kind: 'base64'; data: string; mime?: string }\r\n | { kind: 'text'; text: string };\r\n\r\nexport class WebViewDocumentEngine extends BaseDocumentEngine {\r\n private bridge: WebViewBridge | null = null;\r\n private ready = false;\r\n private requestId = 0;\r\n private pending = new Map<string, { resolve: (data: any) => void; reject: (error: Error) => void }>();\r\n private bridgeResolvers: Array<(bridge: WebViewBridge) => void> = [];\r\n private readyResolvers: Array<() => void> = [];\r\n private pageCount = 0;\r\n private currentPage = 1;\r\n private zoom = 1.0;\r\n private rotation = 0;\r\n private outline: OutlineItem[] = [];\r\n\r\n getRenderTargetType(): 'webview' {\r\n return 'webview';\r\n }\r\n\r\n attachBridge(bridge: WebViewBridge): void {\r\n this.bridge = bridge;\r\n this.bridgeResolvers.forEach((resolve) => resolve(bridge));\r\n this.bridgeResolvers = [];\r\n }\r\n\r\n handleMessage(raw: string): void {\r\n let message: WebViewRuntimeMessage | null = null;\r\n try {\r\n message = JSON.parse(raw) as WebViewRuntimeMessage;\r\n } catch {\r\n return;\r\n }\r\n\r\n if (!message) return;\r\n\r\n if (message.type === 'ready') {\r\n this.ready = true;\r\n this.readyResolvers.forEach((resolve) => resolve());\r\n this.readyResolvers = [];\r\n return;\r\n }\r\n\r\n if (message.type === 'response') {\r\n const pending = this.pending.get(message.id);\r\n if (!pending) return;\r\n this.pending.delete(message.id);\r\n if (message.ok) {\r\n pending.resolve(message.data);\r\n } else {\r\n pending.reject(new Error(message.error ?? '[Papyrus] WebView runtime error'));\r\n }\r\n return;\r\n }\r\n\r\n if (message.type === 'state') {\r\n if (typeof message.payload.pageCount === 'number') this.pageCount = message.payload.pageCount;\r\n if (typeof message.payload.currentPage === 'number') this.currentPage = message.payload.currentPage;\r\n if (typeof message.payload.zoom === 'number') this.zoom = message.payload.zoom;\r\n if (Array.isArray(message.payload.outline)) this.outline = message.payload.outline;\r\n return;\r\n }\r\n\r\n if (message.type === 'event') {\r\n const payload = message.payload ?? {};\r\n if (message.name === 'RUNTIME_LOG') {\r\n if (__DEV__) {\r\n const text = typeof payload?.message === 'string' ? payload.message : JSON.stringify(payload);\r\n console.log('[Papyrus WebView runtime]', text);\r\n }\r\n return;\r\n }\r\n if (message.name === 'RUNTIME_ERROR') {\n const errorMessage = typeof payload?.message === 'string' ? payload.message : '';\n if (errorMessage.includes('ResizeObserver loop')) {\n return;\n }\n if (__DEV__) {\n console.warn('[Papyrus WebView runtime]', payload);\n }\n return;\n }\n if (message.name === PapyrusEventType.TEXT_SELECTED) {\r\n papyrusEvents.emit(PapyrusEventType.TEXT_SELECTED, payload);\r\n } else if (message.name === PapyrusEventType.SEARCH_TRIGGERED) {\r\n papyrusEvents.emit(PapyrusEventType.SEARCH_TRIGGERED, payload);\r\n } else if (message.name === PapyrusEventType.DOCUMENT_LOADED) {\r\n if (typeof payload.pageCount === 'number') {\r\n this.pageCount = payload.pageCount;\r\n }\r\n papyrusEvents.emit(PapyrusEventType.DOCUMENT_LOADED, payload);\r\n }\r\n return;\r\n }\r\n\r\n if (__DEV__) {\r\n console.warn('[Papyrus WebView] Unknown message', message);\r\n }\r\n }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n const { source, type } = normalizeLoadInput(input);\r\n const resolvedType = type ?? inferDocumentType(source);\r\n if (resolvedType === 'pdf') {\r\n throw new Error('[WebViewDocumentEngine] Use o NativeDocumentEngine para PDFs no mobile.');\r\n }\r\n\r\n const payloadSource = await this.normalizeRuntimeSource(resolvedType, source);\r\n const response = await this.request<{ pageCount?: number; outline?: OutlineItem[] }>('load', {\r\n type: resolvedType,\r\n source: payloadSource,\r\n });\r\n\r\n if (typeof response?.pageCount === 'number') this.pageCount = response.pageCount;\r\n if (Array.isArray(response?.outline)) this.outline = response.outline;\r\n this.currentPage = 1;\r\n }\r\n\r\n getPageCount(): number {\r\n return this.pageCount;\r\n }\r\n\r\n getCurrentPage(): number {\r\n return this.currentPage;\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (page < 1) return;\r\n this.currentPage = page;\r\n void this.request('go-to-page', { page });\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.zoom = Math.max(0.5, Math.min(4.0, zoom));\r\n void this.request('set-zoom', { zoom: this.zoom });\r\n }\r\n\r\n getZoom(): number {\r\n return this.zoom;\r\n }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n if (direction === 'clockwise') {\r\n this.rotation = (this.rotation + 90) % 360;\r\n } else {\r\n this.rotation = (this.rotation - 90) % 360;\r\n if (this.rotation < 0) this.rotation += 360;\r\n }\r\n void this.request('set-rotation', { rotation: this.rotation });\r\n }\r\n\r\n getRotation(): number {\r\n return this.rotation;\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n void pageIndex;\r\n void target;\r\n void scale;\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void> {\r\n void pageIndex;\r\n void container;\r\n void scale;\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n return await this.request<TextItem[]>('get-text-content', { pageIndex });\r\n }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n return await this.request<{ width: number; height: number }>('get-page-dimensions', { pageIndex });\r\n }\r\n\r\n async searchText(query: string): Promise<SearchResult[]> {\r\n return await this.request<SearchResult[]>('search-text', { query });\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n return await this.request<TextSelection | null>('select-text', { pageIndex, rect });\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n if (this.outline.length > 0) return this.outline;\r\n return await this.request<OutlineItem[]>('get-outline');\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n if (!dest) return null;\r\n if (typeof dest !== 'string') {\r\n if (dest.kind === 'pageIndex') return dest.value;\r\n if (dest.kind === 'pageNumber') return Math.max(0, dest.value - 1);\r\n if (dest.kind === 'href') {\r\n return await this.request<number | null>('get-page-index', { dest: dest.value });\r\n }\r\n return null;\r\n }\r\n return await this.request<number | null>('get-page-index', { dest });\r\n }\r\n\r\n destroy(): void {\r\n this.pending.forEach(({ reject }) => reject(new Error('[Papyrus] WebView engine destroyed')));\r\n this.pending.clear();\r\n this.bridge = null;\r\n this.ready = false;\r\n }\r\n\r\n private async ensureBridge(): Promise<WebViewBridge> {\r\n if (this.bridge) return this.bridge;\r\n return new Promise((resolve) => {\r\n this.bridgeResolvers.push(resolve);\r\n });\r\n }\r\n\r\n private async ensureReady(): Promise<void> {\r\n if (this.ready) return;\r\n return new Promise((resolve) => {\r\n this.readyResolvers.push(resolve);\r\n });\r\n }\r\n\r\n private async request<T = any>(kind: string, payload?: any): Promise<T> {\r\n const bridge = await this.ensureBridge();\r\n await this.ensureReady();\r\n const id = `${Date.now()}-${this.requestId++}`;\r\n return new Promise<T>((resolve, reject) => {\r\n const timeoutMs = kind === 'load' ? 30000 : 8000;\r\n const timeoutId = setTimeout(() => {\r\n this.pending.delete(id);\r\n reject(new Error(`[Papyrus] WebView response timeout: ${kind}`));\r\n }, timeoutMs);\r\n this.pending.set(id, {\r\n resolve: (data) => {\r\n clearTimeout(timeoutId);\r\n resolve(data);\r\n },\r\n reject: (error) => {\r\n clearTimeout(timeoutId);\r\n reject(error);\r\n },\r\n });\r\n bridge.postMessage(JSON.stringify({ id, kind, payload }));\r\n });\r\n }\r\n\r\n private async normalizeRuntimeSource(type: DocumentType, source: DocumentSource): Promise<WebViewSourcePayload> {\r\n if (typeof source === 'string') {\r\n const dataUri = parseDataUri(source);\r\n if (dataUri) {\r\n if (dataUri.isBase64) {\r\n return { kind: 'base64', data: dataUri.data, mime: dataUri.mime || undefined };\r\n }\r\n const text = decodeURIComponent(dataUri.data);\r\n return { kind: 'text', text };\r\n }\r\n\r\n if (looksLikeUri(source)) {\r\n if (isHttpUri(source)) {\r\n const fetched = await this.fetchRemoteSource(type, source);\r\n if (fetched) return fetched;\r\n }\r\n return { kind: 'uri', uri: source };\r\n }\r\n\r\n if (isLikelyBase64(source)) {\r\n return { kind: 'base64', data: source };\r\n }\r\n\r\n if (type === 'text') {\r\n return { kind: 'text', text: source };\r\n }\r\n\r\n return { kind: 'uri', uri: source };\r\n }\r\n\r\n if (this.isUriSource(source)) {\r\n const uri = source.uri;\r\n if (isHttpUri(uri)) {\r\n const fetched = await this.fetchRemoteSource(type, uri);\r\n if (fetched) return fetched;\r\n }\r\n return { kind: 'uri', uri };\r\n }\r\n if (this.isDataSource(source)) {\r\n const bytes = source.data instanceof Uint8Array ? source.data : new Uint8Array(source.data);\r\n return { kind: 'base64', data: encodeBase64(bytes) };\r\n }\r\n if (this.isFileLike(source)) {\r\n const buffer = await source.arrayBuffer();\r\n return { kind: 'base64', data: encodeBase64(new Uint8Array(buffer)) };\r\n }\r\n if (source instanceof ArrayBuffer || source instanceof Uint8Array) {\r\n const bytes = source instanceof Uint8Array ? source : new Uint8Array(source);\r\n return { kind: 'base64', data: encodeBase64(bytes) };\r\n }\r\n\r\n return { kind: 'base64', data: encodeBase64(new Uint8Array(source as ArrayBuffer)) };\r\n }\r\n\r\n private async fetchRemoteSource(type: DocumentType, uri: string): Promise<WebViewSourcePayload | null> {\r\n try {\r\n const response = await fetch(uri);\r\n if (!response.ok) return null;\r\n if (type === 'text') {\r\n const text = await response.text();\r\n return { kind: 'text', text };\r\n }\r\n if (type === 'epub') {\r\n const buffer = await this.readResponseBuffer(response);\r\n return { kind: 'base64', data: encodeBase64(new Uint8Array(buffer)) };\r\n }\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private async readResponseBuffer(response: Response): Promise<ArrayBuffer> {\r\n try {\r\n return await response.arrayBuffer();\r\n } catch {\r\n const blob = await response.blob();\r\n return await new Promise<ArrayBuffer>((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onerror = () => reject(new Error('[Papyrus] Failed to read response blob'));\r\n reader.onload = () => resolve(reader.result as ArrayBuffer);\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n }\r\n }\r\n\r\n private isUriSource(source: DocumentSource): source is { uri: string } {\r\n return typeof source === 'object' && source !== null && 'uri' in source;\r\n }\r\n\r\n private isDataSource(source: DocumentSource): source is { data: ArrayBuffer | Uint8Array } {\r\n return typeof source === 'object' && source !== null && 'data' in source;\r\n }\r\n\r\n private isFileLike(source: DocumentSource): source is FileLike {\r\n return typeof source === 'object' && source !== null && typeof (source as FileLike).arrayBuffer === 'function';\r\n }\r\n}\r\n\r\nexport class MobileDocumentEngine extends BaseDocumentEngine {\r\n private pdfEngine: NativeDocumentEngine;\r\n private webEngine: WebViewDocumentEngine;\r\n private activeEngine: DocumentEngine;\r\n\r\n constructor() {\r\n super();\r\n this.pdfEngine = new NativeDocumentEngine();\r\n this.webEngine = new WebViewDocumentEngine();\r\n this.activeEngine = this.pdfEngine;\r\n }\r\n\r\n getRenderTargetType(): RenderTargetType {\r\n return this.activeEngine.getRenderTargetType?.() ?? 'canvas';\r\n }\r\n\r\n attachWebView(bridge: WebViewBridge): void {\r\n this.webEngine.attachBridge(bridge);\r\n }\r\n\r\n handleWebViewMessage(data: string): void {\r\n this.webEngine.handleMessage(data);\r\n }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n const { source, type } = normalizeLoadInput(input);\r\n const resolvedType = type ?? inferDocumentType(source);\r\n this.activeEngine = resolvedType === 'pdf' ? this.pdfEngine : this.webEngine;\r\n await this.activeEngine.load({ type: resolvedType, source });\r\n }\r\n\r\n getPageCount(): number {\r\n return this.activeEngine.getPageCount();\r\n }\r\n\r\n getCurrentPage(): number {\r\n return this.activeEngine.getCurrentPage();\r\n }\r\n\r\n goToPage(page: number): void {\r\n this.activeEngine.goToPage(page);\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.activeEngine.setZoom(zoom);\r\n }\r\n\r\n getZoom(): number {\r\n return this.activeEngine.getZoom();\r\n }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n this.activeEngine.rotate(direction);\r\n }\r\n\r\n getRotation(): number {\r\n return this.activeEngine.getRotation();\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n await this.activeEngine.renderPage(pageIndex, target, scale);\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void> {\r\n await this.activeEngine.renderTextLayer(pageIndex, container, scale);\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n return await this.activeEngine.getTextContent(pageIndex);\r\n }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n return await this.activeEngine.getPageDimensions(pageIndex);\r\n }\r\n\r\n async searchText(query: string): Promise<SearchResult[]> {\r\n if (typeof this.activeEngine.searchText === 'function') {\r\n return await this.activeEngine.searchText(query);\r\n }\r\n return [];\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n if (typeof this.activeEngine.selectText === 'function') {\r\n return await this.activeEngine.selectText(pageIndex, rect);\r\n }\r\n return null;\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n return await this.activeEngine.getOutline();\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n return await this.activeEngine.getPageIndex(dest);\r\n }\r\n\r\n destroy(): void {\r\n this.pdfEngine.destroy();\r\n this.webEngine.destroy();\r\n }\r\n}\r\n","import { NativeModules, Platform } from 'react-native';\n\nimport { registerWebGlobals } from './web/index';\n\n/**\n * Ensures that the native modules are installed in the current runtime.\n * Otherwise, it synchronously calls a native function that installs them.\n */\nexport function ensureNativeModulesAreInstalled(): void {\n if (globalThis.expo) {\n return;\n }\n try {\n if (Platform.OS === 'web') {\n // Requiring web folder sets up the `globalThis.expo` object.\n registerWebGlobals();\n } else {\n // TODO: ExpoModulesCore shouldn't be optional here,\n // but to keep backwards compatibility let's just ignore it in SDK 50.\n // In most cases the modules were already installed from the native side.\n NativeModules.ExpoModulesCore?.installModules();\n }\n } catch (error) {\n console.error(`Unable to install Expo modules: ${error}`);\n }\n}\n","export function registerWebGlobals() {}\n","import type { ProxyNativeModule } from './NativeModulesProxy.types';\n\n// We default to an empty object shim wherever we don't have an environment-specific implementation\n\n/**\n * @deprecated `NativeModulesProxy` is deprecated and might be removed in the future releases.\n * Use `requireNativeModule` or `requireOptionalNativeModule` instead.\n */\nexport default {} as { [moduleName: string]: ProxyNativeModule };\n","/**\n * A general error class that should be used for all errors in Expo modules.\n * Guarantees a `code` field that can be used to differentiate between different\n * types of errors without further subclassing Error.\n */\nexport class CodedError extends Error {\n code: string;\n info?: any;\n\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n","import { PlatformOSType, Platform as ReactNativePlatform } from 'react-native';\n\nimport {\n isDOMAvailable,\n canUseEventListeners,\n canUseViewport,\n isAsyncDebugging,\n} from './environment/browser';\n\nexport type PlatformSelectOSType = PlatformOSType | 'native' | 'electron' | 'default';\n\nexport type PlatformSelect = <T>(specifics: { [platform in PlatformSelectOSType]?: T }) => T;\n\nif (__DEV__ && typeof process.env.EXPO_OS === 'undefined') {\n console.warn(\n `The global process.env.EXPO_OS is not defined. This should be inlined by babel-preset-expo during transformation.`\n );\n}\n\nconst nativeSelect =\n typeof window !== 'undefined'\n ? ReactNativePlatform.select\n : // process.env.EXPO_OS is injected by `babel-preset-expo` and available in both client and `react-server` environments.\n // Opt to use the env var when possible, and fallback to the React Native Platform module when it's not (arbitrary bundlers and transformers).\n function select<T>(specifics: { [platform in PlatformSelectOSType]?: T }): T | undefined {\n if (!process.env.EXPO_OS) return undefined;\n if (specifics.hasOwnProperty(process.env.EXPO_OS)) {\n return specifics[process.env.EXPO_OS]!;\n } else if (process.env.EXPO_OS !== 'web' && specifics.hasOwnProperty('native')) {\n return specifics.native!;\n } else if (specifics.hasOwnProperty('default')) {\n return specifics.default!;\n }\n // do nothing...\n return undefined;\n };\n\nconst Platform = {\n /**\n * Denotes the currently running platform.\n * Can be one of ios, android, web.\n */\n OS: process.env.EXPO_OS || ReactNativePlatform.OS,\n /**\n * Returns the value with the matching platform.\n * Object keys can be any of ios, android, native, web, default.\n *\n * @ios ios, native, default\n * @android android, native, default\n * @web web, default\n */\n select: nativeSelect as PlatformSelect,\n /**\n * Denotes if the DOM API is available in the current environment.\n * The DOM is not available in native React runtimes and Node.js.\n */\n isDOMAvailable,\n /**\n * Denotes if the current environment can attach event listeners\n * to the window. This will return false in native React\n * runtimes and Node.js.\n */\n canUseEventListeners,\n /**\n * Denotes if the current environment can inspect properties of the\n * screen on which the current window is being rendered. This will\n * return false in native React runtimes and Node.js.\n */\n canUseViewport,\n /**\n * If the JavaScript is being executed in a remote JavaScript environment.\n * When `true`, synchronous native invocations cannot be executed.\n */\n isAsyncDebugging,\n};\n\nexport default Platform;\n","declare const global: any;\n\n// In standard node environments there is no DOM API\nexport const isDOMAvailable = false;\nexport const canUseEventListeners = false;\nexport const canUseViewport = false;\n\nexport let isAsyncDebugging: boolean = false;\n\nif (__DEV__) {\n // These native globals are injected by native React runtimes and not standard browsers\n // we can use them to determine if the JS is being executed in Chrome.\n isAsyncDebugging =\n !global.nativeExtensions && !global.nativeCallSyncHook && !global.RN$Bridgeless;\n}\n","import { CodedError } from './CodedError';\nimport Platform from '../Platform';\n\n/**\n * A class for errors to be thrown when a property is accessed which is\n * unavailable, unsupported, or not currently implemented on the running\n * platform.\n */\nexport class UnavailabilityError extends CodedError {\n constructor(moduleName: string, propertyName: string) {\n super(\n 'ERR_UNAVAILABLE',\n `The method or property ${moduleName}.${propertyName} is not available on ${Platform.OS}, are you sure you've linked all the native dependencies properly?`\n );\n }\n}\n","import React from 'react';\n\nimport { UnavailabilityError } from './errors/UnavailabilityError';\n\n/**\n * A drop-in replacement for `requireNativeComponent`.\n */\nexport function requireNativeViewManager<P = any>(viewName: string): React.ComponentType<P> {\n throw new UnavailabilityError('expo-modules-core', 'requireNativeViewManager');\n}\n","import NativeModulesProxy from '../NativeModulesProxy';\nexport default NativeModulesProxy.ExpoModulesCoreErrorManager;\n","import NativeErrorManager from './NativeErrorManager';\nimport Platform from '../Platform';\nimport { CodedError } from '../errors/CodedError';\n\nif (__DEV__ && Platform.OS === 'android' && NativeErrorManager) {\n const onNewException = 'ExpoModulesCoreErrorManager.onNewException';\n const onNewWarning = 'ExpoModulesCoreErrorManager.onNewWarning';\n\n NativeErrorManager.addListener(onNewException, ({ message }: { message: string }) => {\n console.error(message);\n });\n\n NativeErrorManager.addListener(onNewWarning, ({ message }: { message: string }) => {\n console.warn(message);\n });\n}\n\n// We have to export `CodedError` via global object to use in later in the C++ code.\nglobalThis.ExpoModulesCore_CodedError = CodedError;\n","import NativeModulesProxy from './NativeModulesProxy';\nimport { ensureNativeModulesAreInstalled } from './ensureNativeModulesAreInstalled';\n\n/**\n * Imports the native module registered with given name. In the first place it tries to load\n * the module installed through the JSI host object and then falls back to the bridge proxy module.\n * Notice that the modules loaded from the proxy may not support some features like synchronous functions.\n *\n * @param moduleName Name of the requested native module.\n * @returns Object representing the native module.\n * @throws Error when there is no native module with given name.\n */\nexport function requireNativeModule<ModuleType = any>(moduleName: string): ModuleType {\n const nativeModule = requireOptionalNativeModule<ModuleType>(moduleName);\n\n if (!nativeModule) {\n throw new Error(`Cannot find native module '${moduleName}'`);\n }\n return nativeModule;\n}\n\n/**\n * Imports the native module registered with the given name. The same as `requireNativeModule`,\n * but returns `null` when the module cannot be found instead of throwing an error.\n *\n * @param moduleName Name of the requested native module.\n * @returns Object representing the native module or `null` when it cannot be found.\n */\nexport function requireOptionalNativeModule<ModuleType = any>(\n moduleName: string\n): ModuleType | null {\n ensureNativeModulesAreInstalled();\n\n return globalThis.expo?.modules?.[moduleName] ?? NativeModulesProxy[moduleName] ?? null;\n}\n"],"mappings":"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","names":["import_react_native","import_react_native","ReactNativePlatform","Platform"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// index.ts
|
|
2
|
-
import { View } from "react-native";
|
|
2
|
+
import { NativeModules as NativeModules2, requireNativeComponent, View } from "react-native";
|
|
3
3
|
|
|
4
4
|
// ../../node_modules/expo-modules-core/src/ensureNativeModulesAreInstalled.ts
|
|
5
5
|
import { NativeModules, Platform } from "react-native";
|
|
@@ -257,11 +257,21 @@ var normalizeNativeDestination = (dest) => {
|
|
|
257
257
|
}
|
|
258
258
|
return null;
|
|
259
259
|
};
|
|
260
|
+
var resolveNativeModule = () => {
|
|
261
|
+
const expoModule = requireOptionalNativeModule(MODULE_NAME);
|
|
262
|
+
if (expoModule) return expoModule;
|
|
263
|
+
const rnModule = NativeModules2[MODULE_NAME];
|
|
264
|
+
return rnModule ?? null;
|
|
265
|
+
};
|
|
260
266
|
var resolvePapyrusPageView = () => {
|
|
261
267
|
try {
|
|
262
268
|
return requireNativeViewManager("PapyrusPageView");
|
|
263
269
|
} catch {
|
|
264
|
-
|
|
270
|
+
try {
|
|
271
|
+
return requireNativeComponent("PapyrusPageView");
|
|
272
|
+
} catch {
|
|
273
|
+
return View;
|
|
274
|
+
}
|
|
265
275
|
}
|
|
266
276
|
};
|
|
267
277
|
var PapyrusPageView = resolvePapyrusPageView();
|
|
@@ -274,7 +284,7 @@ var NativeDocumentEngine = class extends BaseDocumentEngine {
|
|
|
274
284
|
this.currentPage = 1;
|
|
275
285
|
this.zoom = 1;
|
|
276
286
|
this.rotation = 0;
|
|
277
|
-
this.nativeModule =
|
|
287
|
+
this.nativeModule = resolveNativeModule();
|
|
278
288
|
this.engineId = this.nativeModule?.createEngine ? this.nativeModule.createEngine() : "default";
|
|
279
289
|
}
|
|
280
290
|
async load(input) {
|
|
@@ -377,6 +387,9 @@ var NativeDocumentEngine = class extends BaseDocumentEngine {
|
|
|
377
387
|
this.nativeModule?.destroyEngine?.(this.engineId);
|
|
378
388
|
}
|
|
379
389
|
assertNativeModule() {
|
|
390
|
+
if (!this.nativeModule) {
|
|
391
|
+
this.nativeModule = resolveNativeModule();
|
|
392
|
+
}
|
|
380
393
|
if (!this.nativeModule) {
|
|
381
394
|
throw new Error(
|
|
382
395
|
`[Papyrus] Native module "${MODULE_NAME}" not found. Use a dev client or a native build (Expo Go is not supported).`
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts","../../../node_modules/expo-modules-core/src/ensureNativeModulesAreInstalled.ts","../../../node_modules/expo-modules-core/src/web/index.ts","../../../node_modules/expo-modules-core/src/NativeModulesProxy.ts","../../../node_modules/expo-modules-core/src/errors/CodedError.ts","../../../node_modules/expo-modules-core/src/Platform.ts","../../../node_modules/expo-modules-core/src/environment/browser.ts","../../../node_modules/expo-modules-core/src/errors/UnavailabilityError.ts","../../../node_modules/expo-modules-core/src/NativeViewManagerAdapter.tsx","../../../node_modules/expo-modules-core/src/sweet/NativeErrorManager.ts","../../../node_modules/expo-modules-core/src/sweet/setUpErrorManager.fx.ts","../../../node_modules/expo-modules-core/src/requireNativeModule.ts"],"sourcesContent":["import type { ComponentType, RefAttributes } from 'react';\nimport { View, type ViewProps } from 'react-native';\r\nimport { requireNativeViewManager, requireOptionalNativeModule } from 'expo-modules-core';\r\nimport { BaseDocumentEngine, papyrusEvents } from '@papyrus-sdk/core';\r\nimport {\r\n DocumentLoadInput,\r\n DocumentLoadRequest,\r\n DocumentEngine,\r\n DocumentSource,\r\n DocumentType,\r\n PageDestination,\r\n PapyrusEventType,\r\n RenderTargetType,\r\n TextItem,\r\n OutlineItem,\r\n FileLike,\r\n SearchResult,\r\n TextSelection,\r\n} from '@papyrus-sdk/types';\r\n\r\nconst MODULE_NAME = 'PapyrusNativeEngine';\r\n\r\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\nconst BASE64_LOOKUP = (() => {\r\n const table = new Uint8Array(256);\r\n table.fill(255);\r\n for (let i = 0; i < BASE64_CHARS.length; i += 1) {\r\n table[BASE64_CHARS.charCodeAt(i)] = i;\r\n }\r\n return table;\r\n})();\r\n\r\nconst parseDataUri = (value: string): { mime: string; isBase64: boolean; data: string } | null => {\r\n const match = /^data:([^;,]+)?(;base64)?,(.*)$/.exec(value);\r\n if (!match) return null;\r\n return {\r\n mime: match[1] ?? '',\r\n isBase64: Boolean(match[2]),\r\n data: match[3] ?? '',\r\n };\r\n};\r\n\r\nconst looksLikeUri = (value: string): boolean =>\r\n value.startsWith('http://') ||\r\n value.startsWith('https://') ||\r\n value.startsWith('/') ||\r\n value.startsWith('./') ||\r\n value.startsWith('../') ||\r\n value.startsWith('file://');\r\n\r\nconst isLikelyBase64 = (value: string): boolean => {\r\n if (looksLikeUri(value)) return false;\r\n if (value.includes('.')) return false;\r\n if (value.length < 16) return false;\r\n return /^[A-Za-z0-9+/=]+$/.test(value);\r\n};\r\n\r\nconst isHttpUri = (value: string): boolean =>\r\n value.startsWith('http://') || value.startsWith('https://');\r\n\r\nconst decodeBase64 = (value: string): Uint8Array => {\r\n const clean = value.replace(/[^A-Za-z0-9+/=]/g, '');\r\n const padding = clean.endsWith('==') ? 2 : clean.endsWith('=') ? 1 : 0;\r\n const outputLength = Math.max(0, (clean.length * 3) / 4 - padding);\r\n const output = new Uint8Array(outputLength);\r\n\r\n let buffer = 0;\r\n let bits = 0;\r\n let index = 0;\r\n\r\n for (let i = 0; i < clean.length; i += 1) {\r\n const charCode = clean.charCodeAt(i);\r\n if (charCode === 61) break;\r\n const valueIndex = BASE64_LOOKUP[charCode];\r\n if (valueIndex === 255) continue;\r\n buffer = (buffer << 6) | valueIndex;\r\n bits += 6;\r\n if (bits >= 8) {\r\n bits -= 8;\r\n output[index++] = (buffer >> bits) & 0xff;\r\n }\r\n }\r\n return output;\r\n};\r\n\r\nconst encodeBase64 = (bytes: Uint8Array): string => {\r\n let output = '';\r\n let buffer = 0;\r\n let bits = 0;\r\n\r\n for (let i = 0; i < bytes.length; i += 1) {\r\n buffer = (buffer << 8) | bytes[i];\r\n bits += 8;\r\n while (bits >= 6) {\r\n bits -= 6;\r\n output += BASE64_CHARS[(buffer >> bits) & 0x3f];\r\n }\r\n }\r\n\r\n if (bits > 0) {\r\n output += BASE64_CHARS[(buffer << (6 - bits)) & 0x3f];\r\n }\r\n\r\n const remainder = bytes.length % 3;\r\n if (remainder === 1) return `${output}==`;\r\n if (remainder === 2) return `${output}=`;\r\n return output;\r\n};\r\n\r\nconst isLoadRequest = (input: DocumentLoadInput): input is DocumentLoadRequest =>\r\n typeof input === 'object' && input !== null && 'source' in input && 'type' in input;\r\n\r\nconst normalizeLoadInput = (input: DocumentLoadInput): { source: DocumentSource; type?: DocumentType } =>\r\n isLoadRequest(input) ? { source: input.source, type: input.type } : { source: input };\r\n\r\nconst inferDocumentType = (source: DocumentSource): DocumentType => {\r\n if (typeof source === 'string') {\r\n const dataUri = parseDataUri(source);\r\n if (dataUri?.mime) {\r\n const mime = dataUri.mime.toLowerCase();\r\n if (mime.includes('epub')) return 'epub';\r\n if (mime.includes('text')) return 'text';\r\n if (mime.includes('pdf')) return 'pdf';\r\n }\r\n\r\n const clean = source.split('?')[0].split('#')[0];\r\n const ext = clean.includes('.') ? clean.split('.').pop()?.toLowerCase() : undefined;\r\n if (ext === 'epub') return 'epub';\r\n if (ext === 'txt') return 'text';\r\n if (ext === 'pdf') return 'pdf';\r\n return 'pdf';\r\n }\r\n\r\n if (typeof source === 'object' && source !== null && 'uri' in source) {\r\n const uri = source.uri;\r\n const clean = uri.split('?')[0].split('#')[0];\r\n const ext = clean.includes('.') ? clean.split('.').pop()?.toLowerCase() : undefined;\r\n if (ext === 'epub') return 'epub';\r\n if (ext === 'txt') return 'text';\r\n if (ext === 'pdf') return 'pdf';\r\n }\r\n\r\n return 'pdf';\r\n};\r\n\r\ntype NativeDocumentSource = {\r\n uri?: string;\r\n data?: Uint8Array;\r\n};\r\n\r\ntype NativePageDestination = {\r\n kind: 'pageIndex' | 'pageNumber' | 'named';\r\n value: number | string;\r\n};\r\n\r\nconst normalizeNativeDestination = (dest: PageDestination): NativePageDestination | null => {\r\n if (!dest) return null;\r\n if (typeof dest === 'string') {\r\n return { kind: 'named', value: dest };\r\n }\r\n\r\n if (dest.kind === 'pageIndex' || dest.kind === 'pageNumber' || dest.kind === 'named') {\r\n return { kind: dest.kind, value: dest.value };\r\n }\r\n\r\n return null;\r\n};\r\n\r\ntype NativeEngineModule = {\r\n createEngine?: () => string;\r\n destroyEngine?: (engineId: string) => void;\r\n load?: (engineId: string, source: NativeDocumentSource) => Promise<{ pageCount?: number } | void>;\r\n getPageCount?: (engineId: string) => number;\r\n renderPage?: (engineId: string, pageIndex: number, target: number, scale: number, zoom: number, rotation: number) => void;\r\n renderTextLayer?: (engineId: string, pageIndex: number, target: number, scale: number, zoom: number, rotation: number) => void;\r\n getTextContent?: (engineId: string, pageIndex: number) => Promise<TextItem[]>;\r\n getPageDimensions?: (engineId: string, pageIndex: number) => Promise<{ width: number; height: number }>;\r\n searchText?: (engineId: string, query: string) => Promise<SearchResult[]>;\r\n selectText?: (engineId: string, pageIndex: number, x: number, y: number, width: number, height: number) => Promise<TextSelection | null>;\r\n getOutline?: (engineId: string) => Promise<OutlineItem[]>;\r\n getPageIndex?: (engineId: string, dest: NativePageDestination) => Promise<number | null>;\r\n};\r\n\r\nexport type PapyrusPageViewProps = ViewProps & {\n engineId?: string;\n};\n\ntype PapyrusPageViewComponent = ComponentType<PapyrusPageViewProps & RefAttributes<View>>;\n\nconst resolvePapyrusPageView = (): PapyrusPageViewComponent => {\n try {\n return requireNativeViewManager<PapyrusPageViewProps>('PapyrusPageView') as PapyrusPageViewComponent;\n } catch {\n return View as PapyrusPageViewComponent;\n }\n};\n\r\nexport const PapyrusPageView = resolvePapyrusPageView();\r\n\r\nexport class NativeDocumentEngine extends BaseDocumentEngine {\r\n private nativeModule: NativeEngineModule | null = null;\r\n private engineId: string = 'default';\r\n private pageCount: number = 0;\r\n private currentPage: number = 1;\r\n private zoom: number = 1.0;\r\n private rotation: number = 0;\r\n\r\n constructor() {\r\n super();\r\n this.nativeModule = requireOptionalNativeModule<NativeEngineModule>(MODULE_NAME);\r\n this.engineId = this.nativeModule?.createEngine ? this.nativeModule.createEngine() : 'default';\r\n }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n const { source, type } = normalizeLoadInput(input);\r\n if (type && type !== 'pdf') {\r\n throw new Error(`[NativeDocumentEngine] Tipo de documento não suportado: ${type}`);\r\n }\r\n\r\n const native = this.assertNativeModule();\r\n const normalized = await this.normalizeSource(source);\r\n const result = native.load ? await native.load(this.engineId, normalized) : undefined;\r\n\r\n if (result && typeof result.pageCount === 'number') {\r\n this.pageCount = result.pageCount;\r\n } else if (native.getPageCount) {\r\n this.pageCount = native.getPageCount(this.engineId);\r\n } else {\r\n this.pageCount = 0;\r\n }\r\n\r\n this.currentPage = 1;\r\n }\r\n\r\n getPageCount(): number {\r\n return this.pageCount;\r\n }\r\n\r\n getCurrentPage(): number {\r\n return this.currentPage;\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (page >= 1 && page <= this.pageCount) {\r\n this.currentPage = page;\r\n }\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.zoom = Math.max(0.1, Math.min(5.0, zoom));\r\n }\r\n\r\n getZoom(): number {\r\n return this.zoom;\r\n }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n if (direction === 'clockwise') {\r\n this.rotation = (this.rotation + 90) % 360;\r\n } else {\r\n this.rotation = (this.rotation - 90) % 360;\r\n if (this.rotation < 0) this.rotation += 360;\r\n }\r\n }\r\n\r\n getRotation(): number {\r\n return this.rotation;\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n const native = this.assertNativeModule();\r\n if (!native.renderPage) return;\r\n const viewTag = this.toNativeViewTag(target);\r\n if (viewTag === null) return;\r\n native.renderPage(this.engineId, pageIndex, viewTag, scale, this.zoom, this.rotation);\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, target: any, scale: number): Promise<void> {\r\n const native = this.assertNativeModule();\r\n if (!native.renderTextLayer) return;\r\n const viewTag = this.toNativeViewTag(target);\r\n if (viewTag === null) return;\r\n native.renderTextLayer(this.engineId, pageIndex, viewTag, scale, this.zoom, this.rotation);\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n const native = this.assertNativeModule();\r\n if (!native.getTextContent) return [];\r\n return native.getTextContent(this.engineId, pageIndex);\r\n }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n const native = this.assertNativeModule();\r\n if (!native.getPageDimensions) return { width: 0, height: 0 };\r\n return native.getPageDimensions(this.engineId, pageIndex);\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n const native = this.assertNativeModule();\r\n if (!native.selectText) return null;\r\n return native.selectText(this.engineId, pageIndex, rect.x, rect.y, rect.width, rect.height);\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n const native = this.assertNativeModule();\r\n if (!native.getOutline) return [];\r\n return native.getOutline(this.engineId);\r\n }\r\n\r\n async searchText(query: string): Promise<SearchResult[]> {\r\n const native = this.assertNativeModule();\r\n if (!native.searchText) return [];\r\n return native.searchText(this.engineId, query);\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n if (!dest) return null;\r\n if (typeof dest !== 'string') {\r\n if (dest.kind === 'pageIndex') return dest.value;\r\n if (dest.kind === 'pageNumber') return Math.max(0, dest.value - 1);\r\n }\r\n\r\n const native = this.assertNativeModule();\r\n if (!native.getPageIndex) return null;\r\n const normalized = normalizeNativeDestination(dest);\r\n if (!normalized || normalized.kind !== 'named') return null;\r\n return native.getPageIndex(this.engineId, normalized);\r\n }\r\n\r\n destroy(): void {\r\n this.nativeModule?.destroyEngine?.(this.engineId);\r\n }\r\n\r\n private assertNativeModule(): NativeEngineModule {\r\n if (!this.nativeModule) {\r\n throw new Error(\r\n `[Papyrus] Native module \"${MODULE_NAME}\" not found. Use a dev client or a native build (Expo Go is not supported).`\r\n );\r\n }\r\n return this.nativeModule;\r\n }\r\n\r\n private async normalizeSource(source: DocumentSource): Promise<NativeDocumentSource> {\r\n if (typeof source === 'string') {\r\n const dataUri = parseDataUri(source);\r\n if (dataUri?.isBase64) {\r\n return { data: decodeBase64(dataUri.data) };\r\n }\r\n if (looksLikeUri(source)) return { uri: source };\r\n if (isLikelyBase64(source)) return { data: decodeBase64(source) };\r\n return { uri: source };\r\n }\r\n if (this.isUriSource(source)) return { uri: source.uri };\r\n if (this.isDataSource(source)) {\r\n const data = source.data instanceof Uint8Array ? source.data : new Uint8Array(source.data);\r\n return { data };\r\n }\r\n if (this.isFileLike(source)) {\r\n const buffer = await source.arrayBuffer();\r\n return { data: new Uint8Array(buffer) };\r\n }\r\n if (source instanceof ArrayBuffer) return { data: new Uint8Array(source) };\r\n if (source instanceof Uint8Array) return { data: source };\r\n return { data: new Uint8Array(source as ArrayBuffer) };\r\n }\r\n\r\n private isUriSource(source: DocumentSource): source is { uri: string } {\r\n return typeof source === 'object' && source !== null && 'uri' in source;\r\n }\r\n\r\n private isDataSource(source: DocumentSource): source is { data: ArrayBuffer | Uint8Array } {\r\n return typeof source === 'object' && source !== null && 'data' in source;\r\n }\r\n\r\n private isFileLike(source: DocumentSource): source is FileLike {\r\n return typeof source === 'object' && source !== null && typeof (source as FileLike).arrayBuffer === 'function';\r\n }\r\n\r\n private toNativeViewTag(target: any): number | null {\r\n if (typeof target === 'number') return target;\r\n if (target?.nativeTag && typeof target.nativeTag === 'number') return target.nativeTag;\r\n return null;\r\n }\r\n}\r\n\r\ntype WebViewBridge = {\r\n postMessage: (message: string) => void;\r\n};\r\n\r\ntype WebViewResponseMessage = {\r\n type: 'response';\r\n id: string;\r\n ok: boolean;\r\n data?: any;\r\n error?: string;\r\n};\r\n\r\ntype WebViewEventMessage = {\r\n type: 'event';\r\n name: string;\r\n payload?: any;\r\n};\r\n\r\ntype WebViewStateMessage = {\r\n type: 'state';\r\n payload: {\r\n pageCount?: number;\r\n currentPage?: number;\r\n zoom?: number;\r\n outline?: OutlineItem[];\r\n };\r\n};\r\n\r\ntype WebViewReadyMessage = {\r\n type: 'ready';\r\n};\r\n\r\ntype WebViewRuntimeMessage =\r\n | WebViewResponseMessage\r\n | WebViewEventMessage\r\n | WebViewStateMessage\r\n | WebViewReadyMessage;\r\n\r\ntype WebViewSourcePayload =\r\n | { kind: 'uri'; uri: string }\r\n | { kind: 'base64'; data: string; mime?: string }\r\n | { kind: 'text'; text: string };\r\n\r\nexport class WebViewDocumentEngine extends BaseDocumentEngine {\r\n private bridge: WebViewBridge | null = null;\r\n private ready = false;\r\n private requestId = 0;\r\n private pending = new Map<string, { resolve: (data: any) => void; reject: (error: Error) => void }>();\r\n private bridgeResolvers: Array<(bridge: WebViewBridge) => void> = [];\r\n private readyResolvers: Array<() => void> = [];\r\n private pageCount = 0;\r\n private currentPage = 1;\r\n private zoom = 1.0;\r\n private rotation = 0;\r\n private outline: OutlineItem[] = [];\r\n\r\n getRenderTargetType(): 'webview' {\r\n return 'webview';\r\n }\r\n\r\n attachBridge(bridge: WebViewBridge): void {\r\n this.bridge = bridge;\r\n this.bridgeResolvers.forEach((resolve) => resolve(bridge));\r\n this.bridgeResolvers = [];\r\n }\r\n\r\n handleMessage(raw: string): void {\r\n let message: WebViewRuntimeMessage | null = null;\r\n try {\r\n message = JSON.parse(raw) as WebViewRuntimeMessage;\r\n } catch {\r\n return;\r\n }\r\n\r\n if (!message) return;\r\n\r\n if (message.type === 'ready') {\r\n this.ready = true;\r\n this.readyResolvers.forEach((resolve) => resolve());\r\n this.readyResolvers = [];\r\n return;\r\n }\r\n\r\n if (message.type === 'response') {\r\n const pending = this.pending.get(message.id);\r\n if (!pending) return;\r\n this.pending.delete(message.id);\r\n if (message.ok) {\r\n pending.resolve(message.data);\r\n } else {\r\n pending.reject(new Error(message.error ?? '[Papyrus] WebView runtime error'));\r\n }\r\n return;\r\n }\r\n\r\n if (message.type === 'state') {\r\n if (typeof message.payload.pageCount === 'number') this.pageCount = message.payload.pageCount;\r\n if (typeof message.payload.currentPage === 'number') this.currentPage = message.payload.currentPage;\r\n if (typeof message.payload.zoom === 'number') this.zoom = message.payload.zoom;\r\n if (Array.isArray(message.payload.outline)) this.outline = message.payload.outline;\r\n return;\r\n }\r\n\r\n if (message.type === 'event') {\r\n const payload = message.payload ?? {};\r\n if (message.name === 'RUNTIME_LOG') {\r\n if (__DEV__) {\r\n const text = typeof payload?.message === 'string' ? payload.message : JSON.stringify(payload);\r\n console.log('[Papyrus WebView runtime]', text);\r\n }\r\n return;\r\n }\r\n if (message.name === 'RUNTIME_ERROR') {\n const errorMessage = typeof payload?.message === 'string' ? payload.message : '';\n if (errorMessage.includes('ResizeObserver loop')) {\n return;\n }\n if (__DEV__) {\n console.warn('[Papyrus WebView runtime]', payload);\n }\n return;\n }\n if (message.name === PapyrusEventType.TEXT_SELECTED) {\r\n papyrusEvents.emit(PapyrusEventType.TEXT_SELECTED, payload);\r\n } else if (message.name === PapyrusEventType.SEARCH_TRIGGERED) {\r\n papyrusEvents.emit(PapyrusEventType.SEARCH_TRIGGERED, payload);\r\n } else if (message.name === PapyrusEventType.DOCUMENT_LOADED) {\r\n if (typeof payload.pageCount === 'number') {\r\n this.pageCount = payload.pageCount;\r\n }\r\n papyrusEvents.emit(PapyrusEventType.DOCUMENT_LOADED, payload);\r\n }\r\n return;\r\n }\r\n\r\n if (__DEV__) {\r\n console.warn('[Papyrus WebView] Unknown message', message);\r\n }\r\n }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n const { source, type } = normalizeLoadInput(input);\r\n const resolvedType = type ?? inferDocumentType(source);\r\n if (resolvedType === 'pdf') {\r\n throw new Error('[WebViewDocumentEngine] Use o NativeDocumentEngine para PDFs no mobile.');\r\n }\r\n\r\n const payloadSource = await this.normalizeRuntimeSource(resolvedType, source);\r\n const response = await this.request<{ pageCount?: number; outline?: OutlineItem[] }>('load', {\r\n type: resolvedType,\r\n source: payloadSource,\r\n });\r\n\r\n if (typeof response?.pageCount === 'number') this.pageCount = response.pageCount;\r\n if (Array.isArray(response?.outline)) this.outline = response.outline;\r\n this.currentPage = 1;\r\n }\r\n\r\n getPageCount(): number {\r\n return this.pageCount;\r\n }\r\n\r\n getCurrentPage(): number {\r\n return this.currentPage;\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (page < 1) return;\r\n this.currentPage = page;\r\n void this.request('go-to-page', { page });\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.zoom = Math.max(0.5, Math.min(4.0, zoom));\r\n void this.request('set-zoom', { zoom: this.zoom });\r\n }\r\n\r\n getZoom(): number {\r\n return this.zoom;\r\n }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n if (direction === 'clockwise') {\r\n this.rotation = (this.rotation + 90) % 360;\r\n } else {\r\n this.rotation = (this.rotation - 90) % 360;\r\n if (this.rotation < 0) this.rotation += 360;\r\n }\r\n void this.request('set-rotation', { rotation: this.rotation });\r\n }\r\n\r\n getRotation(): number {\r\n return this.rotation;\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n void pageIndex;\r\n void target;\r\n void scale;\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void> {\r\n void pageIndex;\r\n void container;\r\n void scale;\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n return await this.request<TextItem[]>('get-text-content', { pageIndex });\r\n }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n return await this.request<{ width: number; height: number }>('get-page-dimensions', { pageIndex });\r\n }\r\n\r\n async searchText(query: string): Promise<SearchResult[]> {\r\n return await this.request<SearchResult[]>('search-text', { query });\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n return await this.request<TextSelection | null>('select-text', { pageIndex, rect });\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n if (this.outline.length > 0) return this.outline;\r\n return await this.request<OutlineItem[]>('get-outline');\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n if (!dest) return null;\r\n if (typeof dest !== 'string') {\r\n if (dest.kind === 'pageIndex') return dest.value;\r\n if (dest.kind === 'pageNumber') return Math.max(0, dest.value - 1);\r\n if (dest.kind === 'href') {\r\n return await this.request<number | null>('get-page-index', { dest: dest.value });\r\n }\r\n return null;\r\n }\r\n return await this.request<number | null>('get-page-index', { dest });\r\n }\r\n\r\n destroy(): void {\r\n this.pending.forEach(({ reject }) => reject(new Error('[Papyrus] WebView engine destroyed')));\r\n this.pending.clear();\r\n this.bridge = null;\r\n this.ready = false;\r\n }\r\n\r\n private async ensureBridge(): Promise<WebViewBridge> {\r\n if (this.bridge) return this.bridge;\r\n return new Promise((resolve) => {\r\n this.bridgeResolvers.push(resolve);\r\n });\r\n }\r\n\r\n private async ensureReady(): Promise<void> {\r\n if (this.ready) return;\r\n return new Promise((resolve) => {\r\n this.readyResolvers.push(resolve);\r\n });\r\n }\r\n\r\n private async request<T = any>(kind: string, payload?: any): Promise<T> {\r\n const bridge = await this.ensureBridge();\r\n await this.ensureReady();\r\n const id = `${Date.now()}-${this.requestId++}`;\r\n return new Promise<T>((resolve, reject) => {\r\n const timeoutMs = kind === 'load' ? 30000 : 8000;\r\n const timeoutId = setTimeout(() => {\r\n this.pending.delete(id);\r\n reject(new Error(`[Papyrus] WebView response timeout: ${kind}`));\r\n }, timeoutMs);\r\n this.pending.set(id, {\r\n resolve: (data) => {\r\n clearTimeout(timeoutId);\r\n resolve(data);\r\n },\r\n reject: (error) => {\r\n clearTimeout(timeoutId);\r\n reject(error);\r\n },\r\n });\r\n bridge.postMessage(JSON.stringify({ id, kind, payload }));\r\n });\r\n }\r\n\r\n private async normalizeRuntimeSource(type: DocumentType, source: DocumentSource): Promise<WebViewSourcePayload> {\r\n if (typeof source === 'string') {\r\n const dataUri = parseDataUri(source);\r\n if (dataUri) {\r\n if (dataUri.isBase64) {\r\n return { kind: 'base64', data: dataUri.data, mime: dataUri.mime || undefined };\r\n }\r\n const text = decodeURIComponent(dataUri.data);\r\n return { kind: 'text', text };\r\n }\r\n\r\n if (looksLikeUri(source)) {\r\n if (isHttpUri(source)) {\r\n const fetched = await this.fetchRemoteSource(type, source);\r\n if (fetched) return fetched;\r\n }\r\n return { kind: 'uri', uri: source };\r\n }\r\n\r\n if (isLikelyBase64(source)) {\r\n return { kind: 'base64', data: source };\r\n }\r\n\r\n if (type === 'text') {\r\n return { kind: 'text', text: source };\r\n }\r\n\r\n return { kind: 'uri', uri: source };\r\n }\r\n\r\n if (this.isUriSource(source)) {\r\n const uri = source.uri;\r\n if (isHttpUri(uri)) {\r\n const fetched = await this.fetchRemoteSource(type, uri);\r\n if (fetched) return fetched;\r\n }\r\n return { kind: 'uri', uri };\r\n }\r\n if (this.isDataSource(source)) {\r\n const bytes = source.data instanceof Uint8Array ? source.data : new Uint8Array(source.data);\r\n return { kind: 'base64', data: encodeBase64(bytes) };\r\n }\r\n if (this.isFileLike(source)) {\r\n const buffer = await source.arrayBuffer();\r\n return { kind: 'base64', data: encodeBase64(new Uint8Array(buffer)) };\r\n }\r\n if (source instanceof ArrayBuffer || source instanceof Uint8Array) {\r\n const bytes = source instanceof Uint8Array ? source : new Uint8Array(source);\r\n return { kind: 'base64', data: encodeBase64(bytes) };\r\n }\r\n\r\n return { kind: 'base64', data: encodeBase64(new Uint8Array(source as ArrayBuffer)) };\r\n }\r\n\r\n private async fetchRemoteSource(type: DocumentType, uri: string): Promise<WebViewSourcePayload | null> {\r\n try {\r\n const response = await fetch(uri);\r\n if (!response.ok) return null;\r\n if (type === 'text') {\r\n const text = await response.text();\r\n return { kind: 'text', text };\r\n }\r\n if (type === 'epub') {\r\n const buffer = await this.readResponseBuffer(response);\r\n return { kind: 'base64', data: encodeBase64(new Uint8Array(buffer)) };\r\n }\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private async readResponseBuffer(response: Response): Promise<ArrayBuffer> {\r\n try {\r\n return await response.arrayBuffer();\r\n } catch {\r\n const blob = await response.blob();\r\n return await new Promise<ArrayBuffer>((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onerror = () => reject(new Error('[Papyrus] Failed to read response blob'));\r\n reader.onload = () => resolve(reader.result as ArrayBuffer);\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n }\r\n }\r\n\r\n private isUriSource(source: DocumentSource): source is { uri: string } {\r\n return typeof source === 'object' && source !== null && 'uri' in source;\r\n }\r\n\r\n private isDataSource(source: DocumentSource): source is { data: ArrayBuffer | Uint8Array } {\r\n return typeof source === 'object' && source !== null && 'data' in source;\r\n }\r\n\r\n private isFileLike(source: DocumentSource): source is FileLike {\r\n return typeof source === 'object' && source !== null && typeof (source as FileLike).arrayBuffer === 'function';\r\n }\r\n}\r\n\r\nexport class MobileDocumentEngine extends BaseDocumentEngine {\r\n private pdfEngine: NativeDocumentEngine;\r\n private webEngine: WebViewDocumentEngine;\r\n private activeEngine: DocumentEngine;\r\n\r\n constructor() {\r\n super();\r\n this.pdfEngine = new NativeDocumentEngine();\r\n this.webEngine = new WebViewDocumentEngine();\r\n this.activeEngine = this.pdfEngine;\r\n }\r\n\r\n getRenderTargetType(): RenderTargetType {\r\n return this.activeEngine.getRenderTargetType?.() ?? 'canvas';\r\n }\r\n\r\n attachWebView(bridge: WebViewBridge): void {\r\n this.webEngine.attachBridge(bridge);\r\n }\r\n\r\n handleWebViewMessage(data: string): void {\r\n this.webEngine.handleMessage(data);\r\n }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n const { source, type } = normalizeLoadInput(input);\r\n const resolvedType = type ?? inferDocumentType(source);\r\n this.activeEngine = resolvedType === 'pdf' ? this.pdfEngine : this.webEngine;\r\n await this.activeEngine.load({ type: resolvedType, source });\r\n }\r\n\r\n getPageCount(): number {\r\n return this.activeEngine.getPageCount();\r\n }\r\n\r\n getCurrentPage(): number {\r\n return this.activeEngine.getCurrentPage();\r\n }\r\n\r\n goToPage(page: number): void {\r\n this.activeEngine.goToPage(page);\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.activeEngine.setZoom(zoom);\r\n }\r\n\r\n getZoom(): number {\r\n return this.activeEngine.getZoom();\r\n }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n this.activeEngine.rotate(direction);\r\n }\r\n\r\n getRotation(): number {\r\n return this.activeEngine.getRotation();\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n await this.activeEngine.renderPage(pageIndex, target, scale);\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void> {\r\n await this.activeEngine.renderTextLayer(pageIndex, container, scale);\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n return await this.activeEngine.getTextContent(pageIndex);\r\n }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n return await this.activeEngine.getPageDimensions(pageIndex);\r\n }\r\n\r\n async searchText(query: string): Promise<SearchResult[]> {\r\n if (typeof this.activeEngine.searchText === 'function') {\r\n return await this.activeEngine.searchText(query);\r\n }\r\n return [];\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n if (typeof this.activeEngine.selectText === 'function') {\r\n return await this.activeEngine.selectText(pageIndex, rect);\r\n }\r\n return null;\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n return await this.activeEngine.getOutline();\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n return await this.activeEngine.getPageIndex(dest);\r\n }\r\n\r\n destroy(): void {\r\n this.pdfEngine.destroy();\r\n this.webEngine.destroy();\r\n }\r\n}\r\n","import { NativeModules, Platform } from 'react-native';\n\nimport { registerWebGlobals } from './web/index';\n\n/**\n * Ensures that the native modules are installed in the current runtime.\n * Otherwise, it synchronously calls a native function that installs them.\n */\nexport function ensureNativeModulesAreInstalled(): void {\n if (globalThis.expo) {\n return;\n }\n try {\n if (Platform.OS === 'web') {\n // Requiring web folder sets up the `globalThis.expo` object.\n registerWebGlobals();\n } else {\n // TODO: ExpoModulesCore shouldn't be optional here,\n // but to keep backwards compatibility let's just ignore it in SDK 50.\n // In most cases the modules were already installed from the native side.\n NativeModules.ExpoModulesCore?.installModules();\n }\n } catch (error) {\n console.error(`Unable to install Expo modules: ${error}`);\n }\n}\n","export function registerWebGlobals() {}\n","import type { ProxyNativeModule } from './NativeModulesProxy.types';\n\n// We default to an empty object shim wherever we don't have an environment-specific implementation\n\n/**\n * @deprecated `NativeModulesProxy` is deprecated and might be removed in the future releases.\n * Use `requireNativeModule` or `requireOptionalNativeModule` instead.\n */\nexport default {} as { [moduleName: string]: ProxyNativeModule };\n","/**\n * A general error class that should be used for all errors in Expo modules.\n * Guarantees a `code` field that can be used to differentiate between different\n * types of errors without further subclassing Error.\n */\nexport class CodedError extends Error {\n code: string;\n info?: any;\n\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n","import { PlatformOSType, Platform as ReactNativePlatform } from 'react-native';\n\nimport {\n isDOMAvailable,\n canUseEventListeners,\n canUseViewport,\n isAsyncDebugging,\n} from './environment/browser';\n\nexport type PlatformSelectOSType = PlatformOSType | 'native' | 'electron' | 'default';\n\nexport type PlatformSelect = <T>(specifics: { [platform in PlatformSelectOSType]?: T }) => T;\n\nif (__DEV__ && typeof process.env.EXPO_OS === 'undefined') {\n console.warn(\n `The global process.env.EXPO_OS is not defined. This should be inlined by babel-preset-expo during transformation.`\n );\n}\n\nconst nativeSelect =\n typeof window !== 'undefined'\n ? ReactNativePlatform.select\n : // process.env.EXPO_OS is injected by `babel-preset-expo` and available in both client and `react-server` environments.\n // Opt to use the env var when possible, and fallback to the React Native Platform module when it's not (arbitrary bundlers and transformers).\n function select<T>(specifics: { [platform in PlatformSelectOSType]?: T }): T | undefined {\n if (!process.env.EXPO_OS) return undefined;\n if (specifics.hasOwnProperty(process.env.EXPO_OS)) {\n return specifics[process.env.EXPO_OS]!;\n } else if (process.env.EXPO_OS !== 'web' && specifics.hasOwnProperty('native')) {\n return specifics.native!;\n } else if (specifics.hasOwnProperty('default')) {\n return specifics.default!;\n }\n // do nothing...\n return undefined;\n };\n\nconst Platform = {\n /**\n * Denotes the currently running platform.\n * Can be one of ios, android, web.\n */\n OS: process.env.EXPO_OS || ReactNativePlatform.OS,\n /**\n * Returns the value with the matching platform.\n * Object keys can be any of ios, android, native, web, default.\n *\n * @ios ios, native, default\n * @android android, native, default\n * @web web, default\n */\n select: nativeSelect as PlatformSelect,\n /**\n * Denotes if the DOM API is available in the current environment.\n * The DOM is not available in native React runtimes and Node.js.\n */\n isDOMAvailable,\n /**\n * Denotes if the current environment can attach event listeners\n * to the window. This will return false in native React\n * runtimes and Node.js.\n */\n canUseEventListeners,\n /**\n * Denotes if the current environment can inspect properties of the\n * screen on which the current window is being rendered. This will\n * return false in native React runtimes and Node.js.\n */\n canUseViewport,\n /**\n * If the JavaScript is being executed in a remote JavaScript environment.\n * When `true`, synchronous native invocations cannot be executed.\n */\n isAsyncDebugging,\n};\n\nexport default Platform;\n","declare const global: any;\n\n// In standard node environments there is no DOM API\nexport const isDOMAvailable = false;\nexport const canUseEventListeners = false;\nexport const canUseViewport = false;\n\nexport let isAsyncDebugging: boolean = false;\n\nif (__DEV__) {\n // These native globals are injected by native React runtimes and not standard browsers\n // we can use them to determine if the JS is being executed in Chrome.\n isAsyncDebugging =\n !global.nativeExtensions && !global.nativeCallSyncHook && !global.RN$Bridgeless;\n}\n","import { CodedError } from './CodedError';\nimport Platform from '../Platform';\n\n/**\n * A class for errors to be thrown when a property is accessed which is\n * unavailable, unsupported, or not currently implemented on the running\n * platform.\n */\nexport class UnavailabilityError extends CodedError {\n constructor(moduleName: string, propertyName: string) {\n super(\n 'ERR_UNAVAILABLE',\n `The method or property ${moduleName}.${propertyName} is not available on ${Platform.OS}, are you sure you've linked all the native dependencies properly?`\n );\n }\n}\n","import React from 'react';\n\nimport { UnavailabilityError } from './errors/UnavailabilityError';\n\n/**\n * A drop-in replacement for `requireNativeComponent`.\n */\nexport function requireNativeViewManager<P = any>(viewName: string): React.ComponentType<P> {\n throw new UnavailabilityError('expo-modules-core', 'requireNativeViewManager');\n}\n","import NativeModulesProxy from '../NativeModulesProxy';\nexport default NativeModulesProxy.ExpoModulesCoreErrorManager;\n","import NativeErrorManager from './NativeErrorManager';\nimport Platform from '../Platform';\nimport { CodedError } from '../errors/CodedError';\n\nif (__DEV__ && Platform.OS === 'android' && NativeErrorManager) {\n const onNewException = 'ExpoModulesCoreErrorManager.onNewException';\n const onNewWarning = 'ExpoModulesCoreErrorManager.onNewWarning';\n\n NativeErrorManager.addListener(onNewException, ({ message }: { message: string }) => {\n console.error(message);\n });\n\n NativeErrorManager.addListener(onNewWarning, ({ message }: { message: string }) => {\n console.warn(message);\n });\n}\n\n// We have to export `CodedError` via global object to use in later in the C++ code.\nglobalThis.ExpoModulesCore_CodedError = CodedError;\n","import NativeModulesProxy from './NativeModulesProxy';\nimport { ensureNativeModulesAreInstalled } from './ensureNativeModulesAreInstalled';\n\n/**\n * Imports the native module registered with given name. In the first place it tries to load\n * the module installed through the JSI host object and then falls back to the bridge proxy module.\n * Notice that the modules loaded from the proxy may not support some features like synchronous functions.\n *\n * @param moduleName Name of the requested native module.\n * @returns Object representing the native module.\n * @throws Error when there is no native module with given name.\n */\nexport function requireNativeModule<ModuleType = any>(moduleName: string): ModuleType {\n const nativeModule = requireOptionalNativeModule<ModuleType>(moduleName);\n\n if (!nativeModule) {\n throw new Error(`Cannot find native module '${moduleName}'`);\n }\n return nativeModule;\n}\n\n/**\n * Imports the native module registered with the given name. The same as `requireNativeModule`,\n * but returns `null` when the module cannot be found instead of throwing an error.\n *\n * @param moduleName Name of the requested native module.\n * @returns Object representing the native module or `null` when it cannot be found.\n */\nexport function requireOptionalNativeModule<ModuleType = any>(\n moduleName: string\n): ModuleType | null {\n ensureNativeModulesAreInstalled();\n\n return globalThis.expo?.modules?.[moduleName] ?? NativeModulesProxy[moduleName] ?? null;\n}\n"],"mappings":"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","names":["Platform"]}
|
|
1
|
+
{"version":3,"sources":["../index.ts","../../../node_modules/expo-modules-core/src/ensureNativeModulesAreInstalled.ts","../../../node_modules/expo-modules-core/src/web/index.ts","../../../node_modules/expo-modules-core/src/NativeModulesProxy.ts","../../../node_modules/expo-modules-core/src/errors/CodedError.ts","../../../node_modules/expo-modules-core/src/Platform.ts","../../../node_modules/expo-modules-core/src/environment/browser.ts","../../../node_modules/expo-modules-core/src/errors/UnavailabilityError.ts","../../../node_modules/expo-modules-core/src/NativeViewManagerAdapter.tsx","../../../node_modules/expo-modules-core/src/sweet/NativeErrorManager.ts","../../../node_modules/expo-modules-core/src/sweet/setUpErrorManager.fx.ts","../../../node_modules/expo-modules-core/src/requireNativeModule.ts"],"sourcesContent":["import type { ComponentType, RefAttributes } from 'react';\nimport { NativeModules, requireNativeComponent, View, type ViewProps } from 'react-native';\nimport { requireNativeViewManager, requireOptionalNativeModule } from 'expo-modules-core';\nimport { BaseDocumentEngine, papyrusEvents } from '@papyrus-sdk/core';\r\nimport {\r\n DocumentLoadInput,\r\n DocumentLoadRequest,\r\n DocumentEngine,\r\n DocumentSource,\r\n DocumentType,\r\n PageDestination,\r\n PapyrusEventType,\r\n RenderTargetType,\r\n TextItem,\r\n OutlineItem,\r\n FileLike,\r\n SearchResult,\r\n TextSelection,\r\n} from '@papyrus-sdk/types';\r\n\r\nconst MODULE_NAME = 'PapyrusNativeEngine';\r\n\r\nconst BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\nconst BASE64_LOOKUP = (() => {\r\n const table = new Uint8Array(256);\r\n table.fill(255);\r\n for (let i = 0; i < BASE64_CHARS.length; i += 1) {\r\n table[BASE64_CHARS.charCodeAt(i)] = i;\r\n }\r\n return table;\r\n})();\r\n\r\nconst parseDataUri = (value: string): { mime: string; isBase64: boolean; data: string } | null => {\r\n const match = /^data:([^;,]+)?(;base64)?,(.*)$/.exec(value);\r\n if (!match) return null;\r\n return {\r\n mime: match[1] ?? '',\r\n isBase64: Boolean(match[2]),\r\n data: match[3] ?? '',\r\n };\r\n};\r\n\r\nconst looksLikeUri = (value: string): boolean =>\r\n value.startsWith('http://') ||\r\n value.startsWith('https://') ||\r\n value.startsWith('/') ||\r\n value.startsWith('./') ||\r\n value.startsWith('../') ||\r\n value.startsWith('file://');\r\n\r\nconst isLikelyBase64 = (value: string): boolean => {\r\n if (looksLikeUri(value)) return false;\r\n if (value.includes('.')) return false;\r\n if (value.length < 16) return false;\r\n return /^[A-Za-z0-9+/=]+$/.test(value);\r\n};\r\n\r\nconst isHttpUri = (value: string): boolean =>\r\n value.startsWith('http://') || value.startsWith('https://');\r\n\r\nconst decodeBase64 = (value: string): Uint8Array => {\r\n const clean = value.replace(/[^A-Za-z0-9+/=]/g, '');\r\n const padding = clean.endsWith('==') ? 2 : clean.endsWith('=') ? 1 : 0;\r\n const outputLength = Math.max(0, (clean.length * 3) / 4 - padding);\r\n const output = new Uint8Array(outputLength);\r\n\r\n let buffer = 0;\r\n let bits = 0;\r\n let index = 0;\r\n\r\n for (let i = 0; i < clean.length; i += 1) {\r\n const charCode = clean.charCodeAt(i);\r\n if (charCode === 61) break;\r\n const valueIndex = BASE64_LOOKUP[charCode];\r\n if (valueIndex === 255) continue;\r\n buffer = (buffer << 6) | valueIndex;\r\n bits += 6;\r\n if (bits >= 8) {\r\n bits -= 8;\r\n output[index++] = (buffer >> bits) & 0xff;\r\n }\r\n }\r\n return output;\r\n};\r\n\r\nconst encodeBase64 = (bytes: Uint8Array): string => {\r\n let output = '';\r\n let buffer = 0;\r\n let bits = 0;\r\n\r\n for (let i = 0; i < bytes.length; i += 1) {\r\n buffer = (buffer << 8) | bytes[i];\r\n bits += 8;\r\n while (bits >= 6) {\r\n bits -= 6;\r\n output += BASE64_CHARS[(buffer >> bits) & 0x3f];\r\n }\r\n }\r\n\r\n if (bits > 0) {\r\n output += BASE64_CHARS[(buffer << (6 - bits)) & 0x3f];\r\n }\r\n\r\n const remainder = bytes.length % 3;\r\n if (remainder === 1) return `${output}==`;\r\n if (remainder === 2) return `${output}=`;\r\n return output;\r\n};\r\n\r\nconst isLoadRequest = (input: DocumentLoadInput): input is DocumentLoadRequest =>\r\n typeof input === 'object' && input !== null && 'source' in input && 'type' in input;\r\n\r\nconst normalizeLoadInput = (input: DocumentLoadInput): { source: DocumentSource; type?: DocumentType } =>\r\n isLoadRequest(input) ? { source: input.source, type: input.type } : { source: input };\r\n\r\nconst inferDocumentType = (source: DocumentSource): DocumentType => {\r\n if (typeof source === 'string') {\r\n const dataUri = parseDataUri(source);\r\n if (dataUri?.mime) {\r\n const mime = dataUri.mime.toLowerCase();\r\n if (mime.includes('epub')) return 'epub';\r\n if (mime.includes('text')) return 'text';\r\n if (mime.includes('pdf')) return 'pdf';\r\n }\r\n\r\n const clean = source.split('?')[0].split('#')[0];\r\n const ext = clean.includes('.') ? clean.split('.').pop()?.toLowerCase() : undefined;\r\n if (ext === 'epub') return 'epub';\r\n if (ext === 'txt') return 'text';\r\n if (ext === 'pdf') return 'pdf';\r\n return 'pdf';\r\n }\r\n\r\n if (typeof source === 'object' && source !== null && 'uri' in source) {\r\n const uri = source.uri;\r\n const clean = uri.split('?')[0].split('#')[0];\r\n const ext = clean.includes('.') ? clean.split('.').pop()?.toLowerCase() : undefined;\r\n if (ext === 'epub') return 'epub';\r\n if (ext === 'txt') return 'text';\r\n if (ext === 'pdf') return 'pdf';\r\n }\r\n\r\n return 'pdf';\r\n};\r\n\r\ntype NativeDocumentSource = {\r\n uri?: string;\r\n data?: Uint8Array;\r\n};\r\n\r\ntype NativePageDestination = {\r\n kind: 'pageIndex' | 'pageNumber' | 'named';\r\n value: number | string;\r\n};\r\n\r\nconst normalizeNativeDestination = (dest: PageDestination): NativePageDestination | null => {\r\n if (!dest) return null;\r\n if (typeof dest === 'string') {\r\n return { kind: 'named', value: dest };\r\n }\r\n\r\n if (dest.kind === 'pageIndex' || dest.kind === 'pageNumber' || dest.kind === 'named') {\r\n return { kind: dest.kind, value: dest.value };\r\n }\r\n\r\n return null;\r\n};\r\n\r\ntype NativeEngineModule = {\r\n createEngine?: () => string;\r\n destroyEngine?: (engineId: string) => void;\r\n load?: (engineId: string, source: NativeDocumentSource) => Promise<{ pageCount?: number } | void>;\r\n getPageCount?: (engineId: string) => number;\r\n renderPage?: (engineId: string, pageIndex: number, target: number, scale: number, zoom: number, rotation: number) => void;\r\n renderTextLayer?: (engineId: string, pageIndex: number, target: number, scale: number, zoom: number, rotation: number) => void;\r\n getTextContent?: (engineId: string, pageIndex: number) => Promise<TextItem[]>;\r\n getPageDimensions?: (engineId: string, pageIndex: number) => Promise<{ width: number; height: number }>;\r\n searchText?: (engineId: string, query: string) => Promise<SearchResult[]>;\r\n selectText?: (engineId: string, pageIndex: number, x: number, y: number, width: number, height: number) => Promise<TextSelection | null>;\r\n getOutline?: (engineId: string) => Promise<OutlineItem[]>;\r\n getPageIndex?: (engineId: string, dest: NativePageDestination) => Promise<number | null>;\r\n};\r\n\r\nexport type PapyrusPageViewProps = ViewProps & {\n engineId?: string;\n};\n\ntype PapyrusPageViewComponent = ComponentType<PapyrusPageViewProps & RefAttributes<View>>;\n\nconst resolveNativeModule = (): NativeEngineModule | null => {\n const expoModule = requireOptionalNativeModule<NativeEngineModule>(MODULE_NAME);\n if (expoModule) return expoModule;\n const rnModule = (NativeModules as Record<string, NativeEngineModule | undefined>)[MODULE_NAME];\n return rnModule ?? null;\n};\n\nconst resolvePapyrusPageView = (): PapyrusPageViewComponent => {\n try {\n return requireNativeViewManager<PapyrusPageViewProps>('PapyrusPageView') as PapyrusPageViewComponent;\n } catch {\n try {\n return requireNativeComponent<PapyrusPageViewProps>('PapyrusPageView') as PapyrusPageViewComponent;\n } catch {\n return View as PapyrusPageViewComponent;\n }\n }\n};\n\r\nexport const PapyrusPageView = resolvePapyrusPageView();\r\n\r\nexport class NativeDocumentEngine extends BaseDocumentEngine {\r\n private nativeModule: NativeEngineModule | null = null;\r\n private engineId: string = 'default';\r\n private pageCount: number = 0;\r\n private currentPage: number = 1;\r\n private zoom: number = 1.0;\r\n private rotation: number = 0;\r\n\r\n constructor() {\n super();\n this.nativeModule = resolveNativeModule();\n this.engineId = this.nativeModule?.createEngine ? this.nativeModule.createEngine() : 'default';\n }\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n const { source, type } = normalizeLoadInput(input);\r\n if (type && type !== 'pdf') {\r\n throw new Error(`[NativeDocumentEngine] Tipo de documento não suportado: ${type}`);\r\n }\r\n\r\n const native = this.assertNativeModule();\r\n const normalized = await this.normalizeSource(source);\r\n const result = native.load ? await native.load(this.engineId, normalized) : undefined;\r\n\r\n if (result && typeof result.pageCount === 'number') {\r\n this.pageCount = result.pageCount;\r\n } else if (native.getPageCount) {\r\n this.pageCount = native.getPageCount(this.engineId);\r\n } else {\r\n this.pageCount = 0;\r\n }\r\n\r\n this.currentPage = 1;\r\n }\r\n\r\n getPageCount(): number {\r\n return this.pageCount;\r\n }\r\n\r\n getCurrentPage(): number {\r\n return this.currentPage;\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (page >= 1 && page <= this.pageCount) {\r\n this.currentPage = page;\r\n }\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.zoom = Math.max(0.1, Math.min(5.0, zoom));\r\n }\r\n\r\n getZoom(): number {\r\n return this.zoom;\r\n }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n if (direction === 'clockwise') {\r\n this.rotation = (this.rotation + 90) % 360;\r\n } else {\r\n this.rotation = (this.rotation - 90) % 360;\r\n if (this.rotation < 0) this.rotation += 360;\r\n }\r\n }\r\n\r\n getRotation(): number {\r\n return this.rotation;\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n const native = this.assertNativeModule();\r\n if (!native.renderPage) return;\r\n const viewTag = this.toNativeViewTag(target);\r\n if (viewTag === null) return;\r\n native.renderPage(this.engineId, pageIndex, viewTag, scale, this.zoom, this.rotation);\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, target: any, scale: number): Promise<void> {\r\n const native = this.assertNativeModule();\r\n if (!native.renderTextLayer) return;\r\n const viewTag = this.toNativeViewTag(target);\r\n if (viewTag === null) return;\r\n native.renderTextLayer(this.engineId, pageIndex, viewTag, scale, this.zoom, this.rotation);\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n const native = this.assertNativeModule();\r\n if (!native.getTextContent) return [];\r\n return native.getTextContent(this.engineId, pageIndex);\r\n }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n const native = this.assertNativeModule();\r\n if (!native.getPageDimensions) return { width: 0, height: 0 };\r\n return native.getPageDimensions(this.engineId, pageIndex);\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n const native = this.assertNativeModule();\r\n if (!native.selectText) return null;\r\n return native.selectText(this.engineId, pageIndex, rect.x, rect.y, rect.width, rect.height);\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n const native = this.assertNativeModule();\r\n if (!native.getOutline) return [];\r\n return native.getOutline(this.engineId);\r\n }\r\n\r\n async searchText(query: string): Promise<SearchResult[]> {\r\n const native = this.assertNativeModule();\r\n if (!native.searchText) return [];\r\n return native.searchText(this.engineId, query);\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n if (!dest) return null;\r\n if (typeof dest !== 'string') {\r\n if (dest.kind === 'pageIndex') return dest.value;\r\n if (dest.kind === 'pageNumber') return Math.max(0, dest.value - 1);\r\n }\r\n\r\n const native = this.assertNativeModule();\r\n if (!native.getPageIndex) return null;\r\n const normalized = normalizeNativeDestination(dest);\r\n if (!normalized || normalized.kind !== 'named') return null;\r\n return native.getPageIndex(this.engineId, normalized);\r\n }\r\n\r\n destroy(): void {\r\n this.nativeModule?.destroyEngine?.(this.engineId);\r\n }\r\n\r\n private assertNativeModule(): NativeEngineModule {\n if (!this.nativeModule) {\n this.nativeModule = resolveNativeModule();\n }\n if (!this.nativeModule) {\n throw new Error(\n `[Papyrus] Native module \"${MODULE_NAME}\" not found. Use a dev client or a native build (Expo Go is not supported).`\n );\n }\n return this.nativeModule;\r\n }\r\n\r\n private async normalizeSource(source: DocumentSource): Promise<NativeDocumentSource> {\r\n if (typeof source === 'string') {\r\n const dataUri = parseDataUri(source);\r\n if (dataUri?.isBase64) {\r\n return { data: decodeBase64(dataUri.data) };\r\n }\r\n if (looksLikeUri(source)) return { uri: source };\r\n if (isLikelyBase64(source)) return { data: decodeBase64(source) };\r\n return { uri: source };\r\n }\r\n if (this.isUriSource(source)) return { uri: source.uri };\r\n if (this.isDataSource(source)) {\r\n const data = source.data instanceof Uint8Array ? source.data : new Uint8Array(source.data);\r\n return { data };\r\n }\r\n if (this.isFileLike(source)) {\r\n const buffer = await source.arrayBuffer();\r\n return { data: new Uint8Array(buffer) };\r\n }\r\n if (source instanceof ArrayBuffer) return { data: new Uint8Array(source) };\r\n if (source instanceof Uint8Array) return { data: source };\r\n return { data: new Uint8Array(source as ArrayBuffer) };\r\n }\r\n\r\n private isUriSource(source: DocumentSource): source is { uri: string } {\r\n return typeof source === 'object' && source !== null && 'uri' in source;\r\n }\r\n\r\n private isDataSource(source: DocumentSource): source is { data: ArrayBuffer | Uint8Array } {\r\n return typeof source === 'object' && source !== null && 'data' in source;\r\n }\r\n\r\n private isFileLike(source: DocumentSource): source is FileLike {\r\n return typeof source === 'object' && source !== null && typeof (source as FileLike).arrayBuffer === 'function';\r\n }\r\n\r\n private toNativeViewTag(target: any): number | null {\r\n if (typeof target === 'number') return target;\r\n if (target?.nativeTag && typeof target.nativeTag === 'number') return target.nativeTag;\r\n return null;\r\n }\r\n}\r\n\r\ntype WebViewBridge = {\r\n postMessage: (message: string) => void;\r\n};\r\n\r\ntype WebViewResponseMessage = {\r\n type: 'response';\r\n id: string;\r\n ok: boolean;\r\n data?: any;\r\n error?: string;\r\n};\r\n\r\ntype WebViewEventMessage = {\r\n type: 'event';\r\n name: string;\r\n payload?: any;\r\n};\r\n\r\ntype WebViewStateMessage = {\r\n type: 'state';\r\n payload: {\r\n pageCount?: number;\r\n currentPage?: number;\r\n zoom?: number;\r\n outline?: OutlineItem[];\r\n };\r\n};\r\n\r\ntype WebViewReadyMessage = {\r\n type: 'ready';\r\n};\r\n\r\ntype WebViewRuntimeMessage =\r\n | WebViewResponseMessage\r\n | WebViewEventMessage\r\n | WebViewStateMessage\r\n | WebViewReadyMessage;\r\n\r\ntype WebViewSourcePayload =\r\n | { kind: 'uri'; uri: string }\r\n | { kind: 'base64'; data: string; mime?: string }\r\n | { kind: 'text'; text: string };\r\n\r\nexport class WebViewDocumentEngine extends BaseDocumentEngine {\r\n private bridge: WebViewBridge | null = null;\r\n private ready = false;\r\n private requestId = 0;\r\n private pending = new Map<string, { resolve: (data: any) => void; reject: (error: Error) => void }>();\r\n private bridgeResolvers: Array<(bridge: WebViewBridge) => void> = [];\r\n private readyResolvers: Array<() => void> = [];\r\n private pageCount = 0;\r\n private currentPage = 1;\r\n private zoom = 1.0;\r\n private rotation = 0;\r\n private outline: OutlineItem[] = [];\r\n\r\n getRenderTargetType(): 'webview' {\r\n return 'webview';\r\n }\r\n\r\n attachBridge(bridge: WebViewBridge): void {\r\n this.bridge = bridge;\r\n this.bridgeResolvers.forEach((resolve) => resolve(bridge));\r\n this.bridgeResolvers = [];\r\n }\r\n\r\n handleMessage(raw: string): void {\r\n let message: WebViewRuntimeMessage | null = null;\r\n try {\r\n message = JSON.parse(raw) as WebViewRuntimeMessage;\r\n } catch {\r\n return;\r\n }\r\n\r\n if (!message) return;\r\n\r\n if (message.type === 'ready') {\r\n this.ready = true;\r\n this.readyResolvers.forEach((resolve) => resolve());\r\n this.readyResolvers = [];\r\n return;\r\n }\r\n\r\n if (message.type === 'response') {\r\n const pending = this.pending.get(message.id);\r\n if (!pending) return;\r\n this.pending.delete(message.id);\r\n if (message.ok) {\r\n pending.resolve(message.data);\r\n } else {\r\n pending.reject(new Error(message.error ?? '[Papyrus] WebView runtime error'));\r\n }\r\n return;\r\n }\r\n\r\n if (message.type === 'state') {\r\n if (typeof message.payload.pageCount === 'number') this.pageCount = message.payload.pageCount;\r\n if (typeof message.payload.currentPage === 'number') this.currentPage = message.payload.currentPage;\r\n if (typeof message.payload.zoom === 'number') this.zoom = message.payload.zoom;\r\n if (Array.isArray(message.payload.outline)) this.outline = message.payload.outline;\r\n return;\r\n }\r\n\r\n if (message.type === 'event') {\r\n const payload = message.payload ?? {};\r\n if (message.name === 'RUNTIME_LOG') {\r\n if (__DEV__) {\r\n const text = typeof payload?.message === 'string' ? payload.message : JSON.stringify(payload);\r\n console.log('[Papyrus WebView runtime]', text);\r\n }\r\n return;\r\n }\r\n if (message.name === 'RUNTIME_ERROR') {\n const errorMessage = typeof payload?.message === 'string' ? payload.message : '';\n if (errorMessage.includes('ResizeObserver loop')) {\n return;\n }\n if (__DEV__) {\n console.warn('[Papyrus WebView runtime]', payload);\n }\n return;\n }\n if (message.name === PapyrusEventType.TEXT_SELECTED) {\r\n papyrusEvents.emit(PapyrusEventType.TEXT_SELECTED, payload);\r\n } else if (message.name === PapyrusEventType.SEARCH_TRIGGERED) {\r\n papyrusEvents.emit(PapyrusEventType.SEARCH_TRIGGERED, payload);\r\n } else if (message.name === PapyrusEventType.DOCUMENT_LOADED) {\r\n if (typeof payload.pageCount === 'number') {\r\n this.pageCount = payload.pageCount;\r\n }\r\n papyrusEvents.emit(PapyrusEventType.DOCUMENT_LOADED, payload);\r\n }\r\n return;\r\n }\r\n\r\n if (__DEV__) {\r\n console.warn('[Papyrus WebView] Unknown message', message);\r\n }\r\n }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n const { source, type } = normalizeLoadInput(input);\r\n const resolvedType = type ?? inferDocumentType(source);\r\n if (resolvedType === 'pdf') {\r\n throw new Error('[WebViewDocumentEngine] Use o NativeDocumentEngine para PDFs no mobile.');\r\n }\r\n\r\n const payloadSource = await this.normalizeRuntimeSource(resolvedType, source);\r\n const response = await this.request<{ pageCount?: number; outline?: OutlineItem[] }>('load', {\r\n type: resolvedType,\r\n source: payloadSource,\r\n });\r\n\r\n if (typeof response?.pageCount === 'number') this.pageCount = response.pageCount;\r\n if (Array.isArray(response?.outline)) this.outline = response.outline;\r\n this.currentPage = 1;\r\n }\r\n\r\n getPageCount(): number {\r\n return this.pageCount;\r\n }\r\n\r\n getCurrentPage(): number {\r\n return this.currentPage;\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (page < 1) return;\r\n this.currentPage = page;\r\n void this.request('go-to-page', { page });\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.zoom = Math.max(0.5, Math.min(4.0, zoom));\r\n void this.request('set-zoom', { zoom: this.zoom });\r\n }\r\n\r\n getZoom(): number {\r\n return this.zoom;\r\n }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n if (direction === 'clockwise') {\r\n this.rotation = (this.rotation + 90) % 360;\r\n } else {\r\n this.rotation = (this.rotation - 90) % 360;\r\n if (this.rotation < 0) this.rotation += 360;\r\n }\r\n void this.request('set-rotation', { rotation: this.rotation });\r\n }\r\n\r\n getRotation(): number {\r\n return this.rotation;\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n void pageIndex;\r\n void target;\r\n void scale;\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void> {\r\n void pageIndex;\r\n void container;\r\n void scale;\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n return await this.request<TextItem[]>('get-text-content', { pageIndex });\r\n }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n return await this.request<{ width: number; height: number }>('get-page-dimensions', { pageIndex });\r\n }\r\n\r\n async searchText(query: string): Promise<SearchResult[]> {\r\n return await this.request<SearchResult[]>('search-text', { query });\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n return await this.request<TextSelection | null>('select-text', { pageIndex, rect });\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n if (this.outline.length > 0) return this.outline;\r\n return await this.request<OutlineItem[]>('get-outline');\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n if (!dest) return null;\r\n if (typeof dest !== 'string') {\r\n if (dest.kind === 'pageIndex') return dest.value;\r\n if (dest.kind === 'pageNumber') return Math.max(0, dest.value - 1);\r\n if (dest.kind === 'href') {\r\n return await this.request<number | null>('get-page-index', { dest: dest.value });\r\n }\r\n return null;\r\n }\r\n return await this.request<number | null>('get-page-index', { dest });\r\n }\r\n\r\n destroy(): void {\r\n this.pending.forEach(({ reject }) => reject(new Error('[Papyrus] WebView engine destroyed')));\r\n this.pending.clear();\r\n this.bridge = null;\r\n this.ready = false;\r\n }\r\n\r\n private async ensureBridge(): Promise<WebViewBridge> {\r\n if (this.bridge) return this.bridge;\r\n return new Promise((resolve) => {\r\n this.bridgeResolvers.push(resolve);\r\n });\r\n }\r\n\r\n private async ensureReady(): Promise<void> {\r\n if (this.ready) return;\r\n return new Promise((resolve) => {\r\n this.readyResolvers.push(resolve);\r\n });\r\n }\r\n\r\n private async request<T = any>(kind: string, payload?: any): Promise<T> {\r\n const bridge = await this.ensureBridge();\r\n await this.ensureReady();\r\n const id = `${Date.now()}-${this.requestId++}`;\r\n return new Promise<T>((resolve, reject) => {\r\n const timeoutMs = kind === 'load' ? 30000 : 8000;\r\n const timeoutId = setTimeout(() => {\r\n this.pending.delete(id);\r\n reject(new Error(`[Papyrus] WebView response timeout: ${kind}`));\r\n }, timeoutMs);\r\n this.pending.set(id, {\r\n resolve: (data) => {\r\n clearTimeout(timeoutId);\r\n resolve(data);\r\n },\r\n reject: (error) => {\r\n clearTimeout(timeoutId);\r\n reject(error);\r\n },\r\n });\r\n bridge.postMessage(JSON.stringify({ id, kind, payload }));\r\n });\r\n }\r\n\r\n private async normalizeRuntimeSource(type: DocumentType, source: DocumentSource): Promise<WebViewSourcePayload> {\r\n if (typeof source === 'string') {\r\n const dataUri = parseDataUri(source);\r\n if (dataUri) {\r\n if (dataUri.isBase64) {\r\n return { kind: 'base64', data: dataUri.data, mime: dataUri.mime || undefined };\r\n }\r\n const text = decodeURIComponent(dataUri.data);\r\n return { kind: 'text', text };\r\n }\r\n\r\n if (looksLikeUri(source)) {\r\n if (isHttpUri(source)) {\r\n const fetched = await this.fetchRemoteSource(type, source);\r\n if (fetched) return fetched;\r\n }\r\n return { kind: 'uri', uri: source };\r\n }\r\n\r\n if (isLikelyBase64(source)) {\r\n return { kind: 'base64', data: source };\r\n }\r\n\r\n if (type === 'text') {\r\n return { kind: 'text', text: source };\r\n }\r\n\r\n return { kind: 'uri', uri: source };\r\n }\r\n\r\n if (this.isUriSource(source)) {\r\n const uri = source.uri;\r\n if (isHttpUri(uri)) {\r\n const fetched = await this.fetchRemoteSource(type, uri);\r\n if (fetched) return fetched;\r\n }\r\n return { kind: 'uri', uri };\r\n }\r\n if (this.isDataSource(source)) {\r\n const bytes = source.data instanceof Uint8Array ? source.data : new Uint8Array(source.data);\r\n return { kind: 'base64', data: encodeBase64(bytes) };\r\n }\r\n if (this.isFileLike(source)) {\r\n const buffer = await source.arrayBuffer();\r\n return { kind: 'base64', data: encodeBase64(new Uint8Array(buffer)) };\r\n }\r\n if (source instanceof ArrayBuffer || source instanceof Uint8Array) {\r\n const bytes = source instanceof Uint8Array ? source : new Uint8Array(source);\r\n return { kind: 'base64', data: encodeBase64(bytes) };\r\n }\r\n\r\n return { kind: 'base64', data: encodeBase64(new Uint8Array(source as ArrayBuffer)) };\r\n }\r\n\r\n private async fetchRemoteSource(type: DocumentType, uri: string): Promise<WebViewSourcePayload | null> {\r\n try {\r\n const response = await fetch(uri);\r\n if (!response.ok) return null;\r\n if (type === 'text') {\r\n const text = await response.text();\r\n return { kind: 'text', text };\r\n }\r\n if (type === 'epub') {\r\n const buffer = await this.readResponseBuffer(response);\r\n return { kind: 'base64', data: encodeBase64(new Uint8Array(buffer)) };\r\n }\r\n return null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private async readResponseBuffer(response: Response): Promise<ArrayBuffer> {\r\n try {\r\n return await response.arrayBuffer();\r\n } catch {\r\n const blob = await response.blob();\r\n return await new Promise<ArrayBuffer>((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onerror = () => reject(new Error('[Papyrus] Failed to read response blob'));\r\n reader.onload = () => resolve(reader.result as ArrayBuffer);\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n }\r\n }\r\n\r\n private isUriSource(source: DocumentSource): source is { uri: string } {\r\n return typeof source === 'object' && source !== null && 'uri' in source;\r\n }\r\n\r\n private isDataSource(source: DocumentSource): source is { data: ArrayBuffer | Uint8Array } {\r\n return typeof source === 'object' && source !== null && 'data' in source;\r\n }\r\n\r\n private isFileLike(source: DocumentSource): source is FileLike {\r\n return typeof source === 'object' && source !== null && typeof (source as FileLike).arrayBuffer === 'function';\r\n }\r\n}\r\n\r\nexport class MobileDocumentEngine extends BaseDocumentEngine {\r\n private pdfEngine: NativeDocumentEngine;\r\n private webEngine: WebViewDocumentEngine;\r\n private activeEngine: DocumentEngine;\r\n\r\n constructor() {\r\n super();\r\n this.pdfEngine = new NativeDocumentEngine();\r\n this.webEngine = new WebViewDocumentEngine();\r\n this.activeEngine = this.pdfEngine;\r\n }\r\n\r\n getRenderTargetType(): RenderTargetType {\r\n return this.activeEngine.getRenderTargetType?.() ?? 'canvas';\r\n }\r\n\r\n attachWebView(bridge: WebViewBridge): void {\r\n this.webEngine.attachBridge(bridge);\r\n }\r\n\r\n handleWebViewMessage(data: string): void {\r\n this.webEngine.handleMessage(data);\r\n }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n const { source, type } = normalizeLoadInput(input);\r\n const resolvedType = type ?? inferDocumentType(source);\r\n this.activeEngine = resolvedType === 'pdf' ? this.pdfEngine : this.webEngine;\r\n await this.activeEngine.load({ type: resolvedType, source });\r\n }\r\n\r\n getPageCount(): number {\r\n return this.activeEngine.getPageCount();\r\n }\r\n\r\n getCurrentPage(): number {\r\n return this.activeEngine.getCurrentPage();\r\n }\r\n\r\n goToPage(page: number): void {\r\n this.activeEngine.goToPage(page);\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.activeEngine.setZoom(zoom);\r\n }\r\n\r\n getZoom(): number {\r\n return this.activeEngine.getZoom();\r\n }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n this.activeEngine.rotate(direction);\r\n }\r\n\r\n getRotation(): number {\r\n return this.activeEngine.getRotation();\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n await this.activeEngine.renderPage(pageIndex, target, scale);\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void> {\r\n await this.activeEngine.renderTextLayer(pageIndex, container, scale);\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n return await this.activeEngine.getTextContent(pageIndex);\r\n }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n return await this.activeEngine.getPageDimensions(pageIndex);\r\n }\r\n\r\n async searchText(query: string): Promise<SearchResult[]> {\r\n if (typeof this.activeEngine.searchText === 'function') {\r\n return await this.activeEngine.searchText(query);\r\n }\r\n return [];\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n if (typeof this.activeEngine.selectText === 'function') {\r\n return await this.activeEngine.selectText(pageIndex, rect);\r\n }\r\n return null;\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n return await this.activeEngine.getOutline();\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n return await this.activeEngine.getPageIndex(dest);\r\n }\r\n\r\n destroy(): void {\r\n this.pdfEngine.destroy();\r\n this.webEngine.destroy();\r\n }\r\n}\r\n","import { NativeModules, Platform } from 'react-native';\n\nimport { registerWebGlobals } from './web/index';\n\n/**\n * Ensures that the native modules are installed in the current runtime.\n * Otherwise, it synchronously calls a native function that installs them.\n */\nexport function ensureNativeModulesAreInstalled(): void {\n if (globalThis.expo) {\n return;\n }\n try {\n if (Platform.OS === 'web') {\n // Requiring web folder sets up the `globalThis.expo` object.\n registerWebGlobals();\n } else {\n // TODO: ExpoModulesCore shouldn't be optional here,\n // but to keep backwards compatibility let's just ignore it in SDK 50.\n // In most cases the modules were already installed from the native side.\n NativeModules.ExpoModulesCore?.installModules();\n }\n } catch (error) {\n console.error(`Unable to install Expo modules: ${error}`);\n }\n}\n","export function registerWebGlobals() {}\n","import type { ProxyNativeModule } from './NativeModulesProxy.types';\n\n// We default to an empty object shim wherever we don't have an environment-specific implementation\n\n/**\n * @deprecated `NativeModulesProxy` is deprecated and might be removed in the future releases.\n * Use `requireNativeModule` or `requireOptionalNativeModule` instead.\n */\nexport default {} as { [moduleName: string]: ProxyNativeModule };\n","/**\n * A general error class that should be used for all errors in Expo modules.\n * Guarantees a `code` field that can be used to differentiate between different\n * types of errors without further subclassing Error.\n */\nexport class CodedError extends Error {\n code: string;\n info?: any;\n\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n","import { PlatformOSType, Platform as ReactNativePlatform } from 'react-native';\n\nimport {\n isDOMAvailable,\n canUseEventListeners,\n canUseViewport,\n isAsyncDebugging,\n} from './environment/browser';\n\nexport type PlatformSelectOSType = PlatformOSType | 'native' | 'electron' | 'default';\n\nexport type PlatformSelect = <T>(specifics: { [platform in PlatformSelectOSType]?: T }) => T;\n\nif (__DEV__ && typeof process.env.EXPO_OS === 'undefined') {\n console.warn(\n `The global process.env.EXPO_OS is not defined. This should be inlined by babel-preset-expo during transformation.`\n );\n}\n\nconst nativeSelect =\n typeof window !== 'undefined'\n ? ReactNativePlatform.select\n : // process.env.EXPO_OS is injected by `babel-preset-expo` and available in both client and `react-server` environments.\n // Opt to use the env var when possible, and fallback to the React Native Platform module when it's not (arbitrary bundlers and transformers).\n function select<T>(specifics: { [platform in PlatformSelectOSType]?: T }): T | undefined {\n if (!process.env.EXPO_OS) return undefined;\n if (specifics.hasOwnProperty(process.env.EXPO_OS)) {\n return specifics[process.env.EXPO_OS]!;\n } else if (process.env.EXPO_OS !== 'web' && specifics.hasOwnProperty('native')) {\n return specifics.native!;\n } else if (specifics.hasOwnProperty('default')) {\n return specifics.default!;\n }\n // do nothing...\n return undefined;\n };\n\nconst Platform = {\n /**\n * Denotes the currently running platform.\n * Can be one of ios, android, web.\n */\n OS: process.env.EXPO_OS || ReactNativePlatform.OS,\n /**\n * Returns the value with the matching platform.\n * Object keys can be any of ios, android, native, web, default.\n *\n * @ios ios, native, default\n * @android android, native, default\n * @web web, default\n */\n select: nativeSelect as PlatformSelect,\n /**\n * Denotes if the DOM API is available in the current environment.\n * The DOM is not available in native React runtimes and Node.js.\n */\n isDOMAvailable,\n /**\n * Denotes if the current environment can attach event listeners\n * to the window. This will return false in native React\n * runtimes and Node.js.\n */\n canUseEventListeners,\n /**\n * Denotes if the current environment can inspect properties of the\n * screen on which the current window is being rendered. This will\n * return false in native React runtimes and Node.js.\n */\n canUseViewport,\n /**\n * If the JavaScript is being executed in a remote JavaScript environment.\n * When `true`, synchronous native invocations cannot be executed.\n */\n isAsyncDebugging,\n};\n\nexport default Platform;\n","declare const global: any;\n\n// In standard node environments there is no DOM API\nexport const isDOMAvailable = false;\nexport const canUseEventListeners = false;\nexport const canUseViewport = false;\n\nexport let isAsyncDebugging: boolean = false;\n\nif (__DEV__) {\n // These native globals are injected by native React runtimes and not standard browsers\n // we can use them to determine if the JS is being executed in Chrome.\n isAsyncDebugging =\n !global.nativeExtensions && !global.nativeCallSyncHook && !global.RN$Bridgeless;\n}\n","import { CodedError } from './CodedError';\nimport Platform from '../Platform';\n\n/**\n * A class for errors to be thrown when a property is accessed which is\n * unavailable, unsupported, or not currently implemented on the running\n * platform.\n */\nexport class UnavailabilityError extends CodedError {\n constructor(moduleName: string, propertyName: string) {\n super(\n 'ERR_UNAVAILABLE',\n `The method or property ${moduleName}.${propertyName} is not available on ${Platform.OS}, are you sure you've linked all the native dependencies properly?`\n );\n }\n}\n","import React from 'react';\n\nimport { UnavailabilityError } from './errors/UnavailabilityError';\n\n/**\n * A drop-in replacement for `requireNativeComponent`.\n */\nexport function requireNativeViewManager<P = any>(viewName: string): React.ComponentType<P> {\n throw new UnavailabilityError('expo-modules-core', 'requireNativeViewManager');\n}\n","import NativeModulesProxy from '../NativeModulesProxy';\nexport default NativeModulesProxy.ExpoModulesCoreErrorManager;\n","import NativeErrorManager from './NativeErrorManager';\nimport Platform from '../Platform';\nimport { CodedError } from '../errors/CodedError';\n\nif (__DEV__ && Platform.OS === 'android' && NativeErrorManager) {\n const onNewException = 'ExpoModulesCoreErrorManager.onNewException';\n const onNewWarning = 'ExpoModulesCoreErrorManager.onNewWarning';\n\n NativeErrorManager.addListener(onNewException, ({ message }: { message: string }) => {\n console.error(message);\n });\n\n NativeErrorManager.addListener(onNewWarning, ({ message }: { message: string }) => {\n console.warn(message);\n });\n}\n\n// We have to export `CodedError` via global object to use in later in the C++ code.\nglobalThis.ExpoModulesCore_CodedError = CodedError;\n","import NativeModulesProxy from './NativeModulesProxy';\nimport { ensureNativeModulesAreInstalled } from './ensureNativeModulesAreInstalled';\n\n/**\n * Imports the native module registered with given name. In the first place it tries to load\n * the module installed through the JSI host object and then falls back to the bridge proxy module.\n * Notice that the modules loaded from the proxy may not support some features like synchronous functions.\n *\n * @param moduleName Name of the requested native module.\n * @returns Object representing the native module.\n * @throws Error when there is no native module with given name.\n */\nexport function requireNativeModule<ModuleType = any>(moduleName: string): ModuleType {\n const nativeModule = requireOptionalNativeModule<ModuleType>(moduleName);\n\n if (!nativeModule) {\n throw new Error(`Cannot find native module '${moduleName}'`);\n }\n return nativeModule;\n}\n\n/**\n * Imports the native module registered with the given name. The same as `requireNativeModule`,\n * but returns `null` when the module cannot be found instead of throwing an error.\n *\n * @param moduleName Name of the requested native module.\n * @returns Object representing the native module or `null` when it cannot be found.\n */\nexport function requireOptionalNativeModule<ModuleType = any>(\n moduleName: string\n): ModuleType | null {\n ensureNativeModulesAreInstalled();\n\n return globalThis.expo?.modules?.[moduleName] ?? NativeModulesProxy[moduleName] ?? null;\n}\n"],"mappings":"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","names":["NativeModules","Platform","NativeModules"]}
|