@ankhorage/expo-runtime 3.1.0 → 3.2.0

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.
Files changed (111) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +2 -1
  3. package/dist/createExpoRuntimeRegistry.d.ts.map +1 -1
  4. package/dist/createExpoRuntimeRegistry.js +5 -0
  5. package/dist/createExpoRuntimeRegistry.js.map +1 -1
  6. package/dist/expoRuntimePlanningMetadata.d.ts +9 -1
  7. package/dist/expoRuntimePlanningMetadata.d.ts.map +1 -1
  8. package/dist/expoRuntimePlanningMetadata.js +8 -0
  9. package/dist/expoRuntimePlanningMetadata.js.map +1 -1
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/reader/ExpoReaderSurfaceAdapter.d.ts +4 -0
  15. package/dist/reader/ExpoReaderSurfaceAdapter.d.ts.map +1 -0
  16. package/dist/reader/ExpoReaderSurfaceAdapter.js +102 -0
  17. package/dist/reader/ExpoReaderSurfaceAdapter.js.map +1 -0
  18. package/dist/reader/ReaderDocumentError.d.ts +6 -0
  19. package/dist/reader/ReaderDocumentError.d.ts.map +1 -0
  20. package/dist/reader/ReaderDocumentError.js +9 -0
  21. package/dist/reader/ReaderDocumentError.js.map +1 -0
  22. package/dist/reader/ReaderViewport.d.ts +4 -0
  23. package/dist/reader/ReaderViewport.d.ts.map +1 -0
  24. package/dist/reader/ReaderViewport.js +212 -0
  25. package/dist/reader/ReaderViewport.js.map +1 -0
  26. package/dist/reader/drivers/EpubReaderDriver.d.ts +20 -0
  27. package/dist/reader/drivers/EpubReaderDriver.d.ts.map +1 -0
  28. package/dist/reader/drivers/EpubReaderDriver.js +259 -0
  29. package/dist/reader/drivers/EpubReaderDriver.js.map +1 -0
  30. package/dist/reader/drivers/PdfReaderDriver.d.ts +18 -0
  31. package/dist/reader/drivers/PdfReaderDriver.d.ts.map +1 -0
  32. package/dist/reader/drivers/PdfReaderDriver.js +198 -0
  33. package/dist/reader/drivers/PdfReaderDriver.js.map +1 -0
  34. package/dist/reader/epub/EpubArchive.d.ts +11 -0
  35. package/dist/reader/epub/EpubArchive.d.ts.map +1 -0
  36. package/dist/reader/epub/EpubArchive.js +65 -0
  37. package/dist/reader/epub/EpubArchive.js.map +1 -0
  38. package/dist/reader/epub/EpubArchiveFetcher.d.ts +11 -0
  39. package/dist/reader/epub/EpubArchiveFetcher.d.ts.map +1 -0
  40. package/dist/reader/epub/EpubArchiveFetcher.js +44 -0
  41. package/dist/reader/epub/EpubArchiveFetcher.js.map +1 -0
  42. package/dist/reader/epub/mediaTypes.d.ts +3 -0
  43. package/dist/reader/epub/mediaTypes.d.ts.map +1 -0
  44. package/dist/reader/epub/mediaTypes.js +26 -0
  45. package/dist/reader/epub/mediaTypes.js.map +1 -0
  46. package/dist/reader/epub/parseEpubPackage.d.ts +22 -0
  47. package/dist/reader/epub/parseEpubPackage.d.ts.map +1 -0
  48. package/dist/reader/epub/parseEpubPackage.js +98 -0
  49. package/dist/reader/epub/parseEpubPackage.js.map +1 -0
  50. package/dist/reader/epub/path.d.ts +4 -0
  51. package/dist/reader/epub/path.d.ts.map +1 -0
  52. package/dist/reader/epub/path.js +28 -0
  53. package/dist/reader/epub/path.js.map +1 -0
  54. package/dist/reader/epub/sanitizeEpubDocument.d.ts +3 -0
  55. package/dist/reader/epub/sanitizeEpubDocument.d.ts.map +1 -0
  56. package/dist/reader/epub/sanitizeEpubDocument.js +90 -0
  57. package/dist/reader/epub/sanitizeEpubDocument.js.map +1 -0
  58. package/dist/reader/loadReaderSourceAsync.d.ts +2 -0
  59. package/dist/reader/loadReaderSourceAsync.d.ts.map +1 -0
  60. package/dist/reader/loadReaderSourceAsync.js +49 -0
  61. package/dist/reader/loadReaderSourceAsync.js.map +1 -0
  62. package/dist/reader/navigation/resolveReaderKeyboardIntent.d.ts +9 -0
  63. package/dist/reader/navigation/resolveReaderKeyboardIntent.d.ts.map +1 -0
  64. package/dist/reader/navigation/resolveReaderKeyboardIntent.js +19 -0
  65. package/dist/reader/navigation/resolveReaderKeyboardIntent.js.map +1 -0
  66. package/dist/reader/navigation/resolveReaderNavigationIntent.d.ts +11 -0
  67. package/dist/reader/navigation/resolveReaderNavigationIntent.d.ts.map +1 -0
  68. package/dist/reader/navigation/resolveReaderNavigationIntent.js +16 -0
  69. package/dist/reader/navigation/resolveReaderNavigationIntent.js.map +1 -0
  70. package/dist/reader/readerViewportPresentation.d.ts +4 -0
  71. package/dist/reader/readerViewportPresentation.d.ts.map +1 -0
  72. package/dist/reader/readerViewportPresentation.js +26 -0
  73. package/dist/reader/readerViewportPresentation.js.map +1 -0
  74. package/dist/reader/types.d.ts +57 -0
  75. package/dist/reader/types.d.ts.map +1 -0
  76. package/dist/reader/types.js +2 -0
  77. package/dist/reader/types.js.map +1 -0
  78. package/dist/reader/validateEpubArchiveEntriesAsync.d.ts +3 -0
  79. package/dist/reader/validateEpubArchiveEntriesAsync.d.ts.map +1 -0
  80. package/dist/reader/validateEpubArchiveEntriesAsync.js +48 -0
  81. package/dist/reader/validateEpubArchiveEntriesAsync.js.map +1 -0
  82. package/package.json +27 -5
  83. package/src/createExpoRuntimeRegistry.test.tsx +9 -1
  84. package/src/createExpoRuntimeRegistry.tsx +7 -1
  85. package/src/expoRuntimePlanningMetadata.ts +9 -1
  86. package/src/index.ts +1 -0
  87. package/src/reader/ExpoReaderSurfaceAdapter.tsx +170 -0
  88. package/src/reader/ReaderDocumentError.ts +11 -0
  89. package/src/reader/ReaderViewport.tsx +319 -0
  90. package/src/reader/drivers/EpubReaderDriver.ts +309 -0
  91. package/src/reader/drivers/PdfReaderDriver.ts +253 -0
  92. package/src/reader/epub/EpubArchive.ts +83 -0
  93. package/src/reader/epub/EpubArchiveFetcher.ts +58 -0
  94. package/src/reader/epub/mediaTypes.ts +16 -0
  95. package/src/reader/epub/parseEpubPackage.test.ts +116 -0
  96. package/src/reader/epub/parseEpubPackage.ts +152 -0
  97. package/src/reader/epub/path.test.ts +22 -0
  98. package/src/reader/epub/path.ts +26 -0
  99. package/src/reader/epub/sanitizeEpubDocument.ts +121 -0
  100. package/src/reader/loadReaderSourceAsync.test.ts +52 -0
  101. package/src/reader/loadReaderSourceAsync.ts +59 -0
  102. package/src/reader/navigation/resolveReaderKeyboardIntent.test.ts +38 -0
  103. package/src/reader/navigation/resolveReaderKeyboardIntent.ts +20 -0
  104. package/src/reader/navigation/resolveReaderNavigationIntent.test.ts +48 -0
  105. package/src/reader/navigation/resolveReaderNavigationIntent.ts +23 -0
  106. package/src/reader/readerViewportPresentation.ts +28 -0
  107. package/src/reader/rendererPackages.test.ts +24 -0
  108. package/src/reader/types.ts +61 -0
  109. package/src/reader/validateEpubArchiveEntriesAsync.test.ts +142 -0
  110. package/src/reader/validateEpubArchiveEntriesAsync.ts +73 -0
  111. package/src/resolveExpoRuntimePlan.test.ts +36 -0
@@ -0,0 +1,73 @@
1
+ import type { Entry } from '@zip.js/zip.js';
2
+ import { Uint8ArrayWriter } from '@zip.js/zip.js';
3
+
4
+ const MAX_COMPRESSION_RATIO = 100;
5
+ const MAX_ENTRY_COUNT = 10_000;
6
+ const MAX_ENTRY_UNCOMPRESSED_BYTES = 64 * 1024 * 1024;
7
+ const MAX_TOTAL_UNCOMPRESSED_BYTES = 512 * 1024 * 1024;
8
+
9
+ export async function validateEpubArchiveEntriesAsync(
10
+ entries: readonly Entry[],
11
+ signal?: AbortSignal,
12
+ ): Promise<void> {
13
+ if (entries.length > MAX_ENTRY_COUNT) {
14
+ throw new Error(`EPUB archive exceeds the ${MAX_ENTRY_COUNT}-entry limit.`);
15
+ }
16
+
17
+ let totalUncompressedBytes = 0;
18
+
19
+ for (const entry of entries) {
20
+ validateDeclaredSizes(entry);
21
+
22
+ if (entry.directory) {
23
+ continue;
24
+ }
25
+
26
+ if (entry.uncompressedSize > MAX_ENTRY_UNCOMPRESSED_BYTES) {
27
+ throw new Error(
28
+ `EPUB archive entry "${entry.filename}" exceeds the ${MAX_ENTRY_UNCOMPRESSED_BYTES}-byte uncompressed limit.`,
29
+ );
30
+ }
31
+
32
+ if (
33
+ entry.uncompressedSize > 0 &&
34
+ (entry.compressedSize === 0 ||
35
+ entry.uncompressedSize > entry.compressedSize * MAX_COMPRESSION_RATIO)
36
+ ) {
37
+ throw new Error(
38
+ `EPUB archive entry "${entry.filename}" exceeds the ${MAX_COMPRESSION_RATIO}:1 compression-ratio limit.`,
39
+ );
40
+ }
41
+
42
+ if (totalUncompressedBytes > MAX_TOTAL_UNCOMPRESSED_BYTES - entry.uncompressedSize) {
43
+ throw new Error(
44
+ `EPUB archive exceeds the ${MAX_TOTAL_UNCOMPRESSED_BYTES}-byte aggregate uncompressed limit.`,
45
+ );
46
+ }
47
+
48
+ totalUncompressedBytes += entry.uncompressedSize;
49
+ }
50
+
51
+ for (const entry of entries) {
52
+ if (entry.directory) {
53
+ continue;
54
+ }
55
+
56
+ await entry.getData(new Uint8ArrayWriter(), {
57
+ checkOverlappingEntryOnly: true,
58
+ signal,
59
+ strictness: 'strict',
60
+ });
61
+ }
62
+ }
63
+
64
+ function validateDeclaredSizes(entry: Entry): void {
65
+ if (
66
+ !Number.isSafeInteger(entry.compressedSize) ||
67
+ entry.compressedSize < 0 ||
68
+ !Number.isSafeInteger(entry.uncompressedSize) ||
69
+ entry.uncompressedSize < 0
70
+ ) {
71
+ throw new Error(`EPUB archive entry "${entry.filename}" declares invalid sizes.`);
72
+ }
73
+ }
@@ -97,6 +97,42 @@ describe('resolveExpoRuntimePlan barcode capability', () => {
97
97
  });
98
98
  });
99
99
 
100
+ describe('resolveExpoRuntimePlan ebook reader capability', () => {
101
+ test('selects the reader adapter and exact renderer packages without permissions', () => {
102
+ const plan = resolveExpoRuntimePlan(
103
+ withFirstScreenRequirements({ capabilities: [{ capability: 'ebookReader' }] }),
104
+ );
105
+
106
+ expect(plan.permissions).toEqual([]);
107
+ expect(plan.impliedPermissions).toEqual([]);
108
+ expect(plan.providers).toEqual([]);
109
+ expect(plan.nativeConfig.plugins).toEqual([]);
110
+ expect(plan.runtimeAdapters).toEqual(['ExpoReaderSurfaceAdapter']);
111
+ expect(plan.dependencies.map(({ name, version }) => ({ name, version }))).toEqual([
112
+ {
113
+ name: '@ankhorage/expo-runtime',
114
+ version: GENERATED_RUNTIME_DEPENDENCY_VERSIONS['@ankhorage/expo-runtime'],
115
+ },
116
+ {
117
+ name: '@readium/navigator',
118
+ version: GENERATED_RUNTIME_DEPENDENCY_VERSIONS['@readium/navigator'],
119
+ },
120
+ {
121
+ name: '@readium/shared',
122
+ version: GENERATED_RUNTIME_DEPENDENCY_VERSIONS['@readium/shared'],
123
+ },
124
+ {
125
+ name: '@zip.js/zip.js',
126
+ version: GENERATED_RUNTIME_DEPENDENCY_VERSIONS['@zip.js/zip.js'],
127
+ },
128
+ {
129
+ name: 'pdfjs-dist',
130
+ version: GENERATED_RUNTIME_DEPENDENCY_VERSIONS['pdfjs-dist'],
131
+ },
132
+ ]);
133
+ });
134
+ });
135
+
100
136
  describe('resolveExpoRuntimePlan Expo 57 plugin coverage', () => {
101
137
  test('keeps microphone-only native configuration free of background audio behavior', () => {
102
138
  const plan = resolveExpoRuntimePlan(