@delali/narsil-react-native 0.0.0-stage → 0.3.1-next.146

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 (186) hide show
  1. package/LICENSE +201 -0
  2. package/NarsilReactNative.podspec +57 -0
  3. package/README.md +46 -2
  4. package/android/CMakeLists.txt +48 -0
  5. package/android/build.gradle +151 -0
  6. package/android/gradle.properties +5 -0
  7. package/android/src/main/AndroidManifest.xml +2 -0
  8. package/android/src/main/cpp/AndroidEnvironment.cpp +44 -0
  9. package/android/src/main/cpp/AndroidEnvironment.hpp +11 -0
  10. package/android/src/main/cpp/cpp-adapter.cpp +11 -0
  11. package/android/src/main/java/com/margelo/nitro/narsil/NarsilAndroidEnvironment.kt +29 -0
  12. package/android/src/main/java/com/margelo/nitro/narsil/NarsilReactNativePackage.kt +22 -0
  13. package/app.plugin.js +25 -0
  14. package/cpp/AttachedField.cpp +234 -0
  15. package/cpp/AttachedField.hpp +61 -0
  16. package/cpp/Compression.cpp +113 -0
  17. package/cpp/Compression.hpp +16 -0
  18. package/cpp/GraphHeldAlone.cpp +29 -0
  19. package/cpp/GraphHeldAlone.hpp +25 -0
  20. package/cpp/HostMemory.cpp +123 -0
  21. package/cpp/HostMemory.hpp +53 -0
  22. package/cpp/HybridNarsilCoreImpl.cpp +390 -0
  23. package/cpp/HybridNarsilCoreImpl.hpp +68 -0
  24. package/cpp/HybridNarsilFilesImpl.cpp +245 -0
  25. package/cpp/HybridNarsilFilesImpl.hpp +34 -0
  26. package/cpp/HybridNarsilHostImpl.cpp +126 -0
  27. package/cpp/HybridNarsilHostImpl.hpp +42 -0
  28. package/cpp/NativeAtomics.cpp +110 -0
  29. package/cpp/NativeAtomics.hpp +11 -0
  30. package/cpp/ProcessInfo.cpp +83 -0
  31. package/cpp/ProcessInfo.hpp +11 -0
  32. package/cpp/ThreadPriority.cpp +77 -0
  33. package/cpp/ThreadPriority.hpp +8 -0
  34. package/cpp/WorkletRuntimeDispatcher.cpp +61 -0
  35. package/cpp/WorkletRuntimeDispatcher.hpp +9 -0
  36. package/cpp/core/include/narsil_core.h +208 -0
  37. package/cpp/core/src/connect.c +213 -0
  38. package/cpp/core/src/distance.c +103 -0
  39. package/cpp/core/src/files.c +99 -0
  40. package/cpp/core/src/heap.c +84 -0
  41. package/cpp/core/src/internal.h +284 -0
  42. package/cpp/core/src/kernels_code.c +209 -0
  43. package/cpp/core/src/kernels_float.c +197 -0
  44. package/cpp/core/src/kernels_pair.c +133 -0
  45. package/cpp/core/src/last_links.c +145 -0
  46. package/cpp/core/src/links.c +195 -0
  47. package/cpp/core/src/locks.c +168 -0
  48. package/cpp/core/src/nearest_links.c +147 -0
  49. package/cpp/core/src/place.c +215 -0
  50. package/cpp/core/src/quantize.c +226 -0
  51. package/cpp/core/src/records.c +97 -0
  52. package/cpp/core/src/remove.c +205 -0
  53. package/cpp/core/src/vectors.c +139 -0
  54. package/cpp/core/src/walk.c +231 -0
  55. package/cpp/core/src/workspace.c +167 -0
  56. package/ios/PrivacyInfo.xcprivacy +23 -0
  57. package/lib/client.d.ts +19 -0
  58. package/lib/client.js +41 -0
  59. package/lib/constants.d.ts +9 -0
  60. package/lib/constants.js +9 -0
  61. package/lib/engine/byte-files.d.ts +5 -0
  62. package/lib/engine/byte-files.js +97 -0
  63. package/lib/engine/core.d.ts +3 -0
  64. package/lib/engine/core.js +113 -0
  65. package/lib/engine/files.d.ts +3 -0
  66. package/lib/engine/files.js +188 -0
  67. package/lib/engine/host.d.ts +13 -0
  68. package/lib/engine/host.js +102 -0
  69. package/lib/engine/install.d.ts +4 -0
  70. package/lib/engine/install.js +29 -0
  71. package/lib/engine/native-error.d.ts +1 -0
  72. package/lib/engine/native-error.js +12 -0
  73. package/lib/engine/stand-ins/atomics.d.ts +5 -0
  74. package/lib/engine/stand-ins/atomics.js +236 -0
  75. package/lib/engine/stand-ins/crypto.d.ts +2 -0
  76. package/lib/engine/stand-ins/crypto.js +65 -0
  77. package/lib/engine/stand-ins/process.d.ts +2 -0
  78. package/lib/engine/stand-ins/process.js +22 -0
  79. package/lib/engine/stand-ins/streams.d.ts +1 -0
  80. package/lib/engine/stand-ins/streams.js +31 -0
  81. package/lib/engine/stand-ins/structured-clone.d.ts +1 -0
  82. package/lib/engine/stand-ins/structured-clone.js +121 -0
  83. package/lib/engine/streamed.d.ts +6 -0
  84. package/lib/engine/streamed.js +29 -0
  85. package/lib/engine/transfer.d.ts +3 -0
  86. package/lib/engine/transfer.js +77 -0
  87. package/lib/errors.d.ts +25 -0
  88. package/lib/errors.js +59 -0
  89. package/lib/index.d.ts +3 -0
  90. package/lib/index.js +2 -0
  91. package/lib/methods.d.ts +5 -0
  92. package/lib/methods.js +47 -0
  93. package/lib/native-objects.d.ts +2 -0
  94. package/lib/native-objects.js +24 -0
  95. package/lib/specs/core.nitro.d.ts +79 -0
  96. package/lib/specs/core.nitro.js +1 -0
  97. package/lib/specs/files.nitro.d.ts +36 -0
  98. package/lib/specs/files.nitro.js +1 -0
  99. package/lib/specs/host.nitro.d.ts +24 -0
  100. package/lib/specs/host.nitro.js +1 -0
  101. package/lib/transferred.d.ts +15 -0
  102. package/lib/transferred.js +6 -0
  103. package/lib/types.d.ts +136 -0
  104. package/lib/types.js +1 -0
  105. package/lib/worklets/app-turns.d.ts +1 -0
  106. package/lib/worklets/app-turns.js +44 -0
  107. package/lib/worklets/client.d.ts +30 -0
  108. package/lib/worklets/client.js +144 -0
  109. package/lib/worklets/index.d.ts +4 -0
  110. package/lib/worklets/index.js +2 -0
  111. package/lib/worklets/instances.d.ts +15 -0
  112. package/lib/worklets/instances.js +194 -0
  113. package/lib/worklets/json-part.d.ts +1 -0
  114. package/lib/worklets/json-part.js +42 -0
  115. package/lib/worklets/runtime.d.ts +25 -0
  116. package/lib/worklets/runtime.js +80 -0
  117. package/lib/worklets/transfer-queue.d.ts +7 -0
  118. package/lib/worklets/transfer-queue.js +79 -0
  119. package/lib/worklets/types.d.ts +26 -0
  120. package/lib/worklets/types.js +1 -0
  121. package/nitro.json +32 -0
  122. package/nitrogen/generated/.gitattributes +1 -0
  123. package/nitrogen/generated/android/NarsilReactNative+autolinking.cmake +85 -0
  124. package/nitrogen/generated/android/NarsilReactNative+autolinking.gradle +27 -0
  125. package/nitrogen/generated/android/NarsilReactNativeOnLoad.cpp +69 -0
  126. package/nitrogen/generated/android/NarsilReactNativeOnLoad.hpp +34 -0
  127. package/nitrogen/generated/android/kotlin/com/margelo/nitro/narsil/NarsilReactNativeOnLoad.kt +35 -0
  128. package/nitrogen/generated/ios/NarsilReactNative+autolinking.rb +62 -0
  129. package/nitrogen/generated/ios/NarsilReactNative-Swift-Cxx-Bridge.cpp +17 -0
  130. package/nitrogen/generated/ios/NarsilReactNative-Swift-Cxx-Bridge.hpp +27 -0
  131. package/nitrogen/generated/ios/NarsilReactNative-Swift-Cxx-Umbrella.hpp +38 -0
  132. package/nitrogen/generated/ios/NarsilReactNativeAutolinking.mm +55 -0
  133. package/nitrogen/generated/ios/NarsilReactNativeAutolinking.swift +16 -0
  134. package/nitrogen/generated/shared/c++/DirectoryEntry.hpp +91 -0
  135. package/nitrogen/generated/shared/c++/FileStatus.hpp +103 -0
  136. package/nitrogen/generated/shared/c++/GraphMemory.hpp +120 -0
  137. package/nitrogen/generated/shared/c++/HybridNarsilAttachedGraphSpec.cpp +21 -0
  138. package/nitrogen/generated/shared/c++/HybridNarsilAttachedGraphSpec.hpp +62 -0
  139. package/nitrogen/generated/shared/c++/HybridNarsilAttachedStoreSpec.cpp +21 -0
  140. package/nitrogen/generated/shared/c++/HybridNarsilAttachedStoreSpec.hpp +62 -0
  141. package/nitrogen/generated/shared/c++/HybridNarsilCoreSpec.cpp +35 -0
  142. package/nitrogen/generated/shared/c++/HybridNarsilCoreSpec.hpp +100 -0
  143. package/nitrogen/generated/shared/c++/HybridNarsilFilesSpec.cpp +37 -0
  144. package/nitrogen/generated/shared/c++/HybridNarsilFilesSpec.hpp +86 -0
  145. package/nitrogen/generated/shared/c++/HybridNarsilHostSpec.cpp +34 -0
  146. package/nitrogen/generated/shared/c++/HybridNarsilHostSpec.hpp +78 -0
  147. package/nitrogen/generated/shared/c++/MemoryView.hpp +91 -0
  148. package/nitrogen/generated/shared/c++/NativeConnectOutcome.hpp +87 -0
  149. package/nitrogen/generated/shared/c++/NativeScores.hpp +87 -0
  150. package/nitrogen/generated/shared/c++/NativeSearchHits.hpp +91 -0
  151. package/nitrogen/generated/shared/c++/ProcessMemory.hpp +87 -0
  152. package/nitrogen/generated/shared/c++/StoreMemory.hpp +142 -0
  153. package/package.json +87 -3
  154. package/react-native.config.js +8 -0
  155. package/src/client.ts +44 -0
  156. package/src/constants.ts +9 -0
  157. package/src/engine/byte-files.ts +99 -0
  158. package/src/engine/core.ts +162 -0
  159. package/src/engine/files.ts +186 -0
  160. package/src/engine/host.ts +111 -0
  161. package/src/engine/install.ts +31 -0
  162. package/src/engine/native-error.ts +10 -0
  163. package/src/engine/stand-ins/atomics.ts +288 -0
  164. package/src/engine/stand-ins/crypto.ts +81 -0
  165. package/src/engine/stand-ins/process.ts +30 -0
  166. package/src/engine/stand-ins/streams.ts +45 -0
  167. package/src/engine/stand-ins/structured-clone.ts +118 -0
  168. package/src/engine/streamed.ts +40 -0
  169. package/src/engine/transfer.ts +72 -0
  170. package/src/errors.ts +73 -0
  171. package/src/index.ts +3 -0
  172. package/src/methods.ts +52 -0
  173. package/src/native-objects.ts +30 -0
  174. package/src/specs/core.nitro.ts +140 -0
  175. package/src/specs/files.nitro.ts +42 -0
  176. package/src/specs/host.nitro.ts +30 -0
  177. package/src/transferred.ts +18 -0
  178. package/src/types.ts +164 -0
  179. package/src/worklets/app-turns.ts +48 -0
  180. package/src/worklets/client.ts +165 -0
  181. package/src/worklets/index.ts +4 -0
  182. package/src/worklets/instances.ts +231 -0
  183. package/src/worklets/json-part.ts +38 -0
  184. package/src/worklets/runtime.ts +190 -0
  185. package/src/worklets/transfer-queue.ts +98 -0
  186. package/src/worklets/types.ts +37 -0
@@ -0,0 +1,190 @@
1
+ import type { BoxedHybridObject } from 'react-native-nitro-modules'
2
+ import { createWorkletRuntime, scheduleOnRuntime, type WorkletRuntime } from 'react-native-worklets'
3
+ import { ENGINE_RUNTIME_NAME } from '../constants'
4
+ import {
5
+ adoptAppThreadPriorityOn,
6
+ installWorkletDispatcherOn,
7
+ type NativeObjects,
8
+ threadPriorityOf,
9
+ } from '../engine/host'
10
+ import { installEngineHost } from '../engine/install'
11
+ import type { EngineMethod } from '../methods'
12
+ import type { NarsilCore } from '../specs/core.nitro'
13
+ import type { NarsilFiles } from '../specs/files.nitro'
14
+ import type { NarsilHost } from '../specs/host.nitro'
15
+ import type { CallOutcome } from '../transferred'
16
+ import {
17
+ callOnEngine,
18
+ dropCallParts,
19
+ listenOnEngine,
20
+ openOnEngine,
21
+ recordEngineStartFailure,
22
+ stageCallPart,
23
+ stageCallPartText,
24
+ } from './instances'
25
+ import type { EngineSetup, WorkletNarsilConfig } from './types'
26
+
27
+ type Settle = (callId: number, outcome: CallOutcome) => void
28
+ type DeliverEvent = (instanceId: number, event: string, payload: unknown) => void
29
+
30
+ export interface BoxedNativeObjects {
31
+ host: BoxedHybridObject<NarsilHost>
32
+ files: BoxedHybridObject<NarsilFiles>
33
+ core: BoxedHybridObject<NarsilCore>
34
+ }
35
+
36
+ let engineRuntime: WorkletRuntime | null = null
37
+
38
+ export async function boxNativeObjects(natives: NativeObjects): Promise<BoxedNativeObjects> {
39
+ const { NitroModules } = await import('react-native-nitro-modules')
40
+ return {
41
+ host: NitroModules.box(natives.host),
42
+ files: NitroModules.box(natives.files),
43
+ core: NitroModules.box(natives.core),
44
+ }
45
+ }
46
+
47
+ export function startEngineRuntime({ host, files, core }: BoxedNativeObjects): WorkletRuntime {
48
+ if (engineRuntime !== null) return engineRuntime
49
+ const appThreadPriority = threadPriorityOf(host.unbox())
50
+ const runtime = createWorkletRuntime({
51
+ name: ENGINE_RUNTIME_NAME,
52
+ initializer: () => {
53
+ 'worklet'
54
+ try {
55
+ const nativeHost = host.unbox()
56
+ const nativeThreads = installWorkletDispatcherOn(nativeHost)
57
+ installEngineHost({ host: nativeHost, files: files.unbox(), core: core.unbox() }, nativeThreads)
58
+ } catch (error) {
59
+ recordEngineStartFailure(error)
60
+ }
61
+ },
62
+ })
63
+ if (appThreadPriority !== null) {
64
+ scheduleOnRuntime(
65
+ runtime,
66
+ (priority: number) => {
67
+ 'worklet'
68
+ try {
69
+ adoptAppThreadPriorityOn(host.unbox(), priority)
70
+ } catch {}
71
+ },
72
+ appThreadPriority,
73
+ )
74
+ }
75
+ engineRuntime = runtime
76
+ return runtime
77
+ }
78
+
79
+ export function sendOpen(
80
+ runtime: WorkletRuntime,
81
+ callId: number,
82
+ settle: Settle,
83
+ config: WorkletNarsilConfig,
84
+ setup: EngineSetup | undefined,
85
+ ): void {
86
+ scheduleOnRuntime(
87
+ runtime,
88
+ (id: number, deliver: Settle, settings: WorkletNarsilConfig, prepare: EngineSetup | undefined) => {
89
+ 'worklet'
90
+ openOnEngine(id, deliver, settings, prepare)
91
+ },
92
+ callId,
93
+ settle,
94
+ config,
95
+ setup,
96
+ )
97
+ }
98
+
99
+ export function sendCall(
100
+ runtime: WorkletRuntime,
101
+ callId: number,
102
+ settle: Settle,
103
+ instanceId: number,
104
+ method: EngineMethod,
105
+ args: readonly unknown[],
106
+ partedArgs: readonly number[],
107
+ ): void {
108
+ scheduleOnRuntime(
109
+ runtime,
110
+ (
111
+ id: number,
112
+ deliver: Settle,
113
+ instance: number,
114
+ name: EngineMethod,
115
+ values: readonly unknown[],
116
+ parted: readonly number[],
117
+ ) => {
118
+ 'worklet'
119
+ callOnEngine(id, deliver, instance, name, values, parted)
120
+ },
121
+ callId,
122
+ settle,
123
+ instanceId,
124
+ method,
125
+ args,
126
+ partedArgs,
127
+ )
128
+ }
129
+
130
+ export function sendCallPart(
131
+ runtime: WorkletRuntime,
132
+ callId: number,
133
+ argIndex: number,
134
+ items: readonly unknown[],
135
+ ): void {
136
+ scheduleOnRuntime(
137
+ runtime,
138
+ (id: number, index: number, part: readonly unknown[]) => {
139
+ 'worklet'
140
+ stageCallPart(id, index, part)
141
+ },
142
+ callId,
143
+ argIndex,
144
+ items,
145
+ )
146
+ }
147
+
148
+ export function sendCallPartText(runtime: WorkletRuntime, callId: number, argIndex: number, text: string): void {
149
+ scheduleOnRuntime(
150
+ runtime,
151
+ (id: number, index: number, part: string) => {
152
+ 'worklet'
153
+ stageCallPartText(id, index, part)
154
+ },
155
+ callId,
156
+ argIndex,
157
+ text,
158
+ )
159
+ }
160
+
161
+ export function sendDropCallParts(runtime: WorkletRuntime, callId: number): void {
162
+ scheduleOnRuntime(
163
+ runtime,
164
+ (id: number) => {
165
+ 'worklet'
166
+ dropCallParts(id)
167
+ },
168
+ callId,
169
+ )
170
+ }
171
+
172
+ export function sendListen(
173
+ runtime: WorkletRuntime,
174
+ instanceId: number,
175
+ event: string,
176
+ deliver: DeliverEvent,
177
+ listening: boolean,
178
+ ): void {
179
+ scheduleOnRuntime(
180
+ runtime,
181
+ (instance: number, name: string, forward: DeliverEvent, on: boolean) => {
182
+ 'worklet'
183
+ listenOnEngine(instance, name as Parameters<typeof listenOnEngine>[1], forward, on)
184
+ },
185
+ instanceId,
186
+ event,
187
+ deliver,
188
+ listening,
189
+ )
190
+ }
@@ -0,0 +1,98 @@
1
+ import {
2
+ WORKLET_TRANSFER_FIRST_PART_ITEMS,
3
+ WORKLET_TRANSFER_LARGEST_PART_ITEMS,
4
+ WORKLET_TRANSFER_PART_TARGET_MS,
5
+ WORKLET_TRANSFER_TURN_BUDGET_MS,
6
+ } from '../constants'
7
+ import { afterAppTurn } from './app-turns'
8
+
9
+ interface Transfer {
10
+ sendNextStep(): boolean
11
+ fail(error: unknown): void
12
+ }
13
+
14
+ export interface CallSends {
15
+ sendPart(argIndex: number, items: readonly unknown[]): void
16
+ sendCall(args: readonly unknown[], partedArgs: readonly number[]): void
17
+ dropParts(): void
18
+ fail(error: unknown): void
19
+ }
20
+
21
+ const waiting: Transfer[] = []
22
+ let sending = false
23
+
24
+ function sendWaiting(): void {
25
+ sending = true
26
+ const turnStarted = performance.now()
27
+ while (waiting.length > 0) {
28
+ const transfer = waiting[0]
29
+ let finished: boolean
30
+ try {
31
+ finished = transfer.sendNextStep()
32
+ } catch (error) {
33
+ finished = true
34
+ transfer.fail(error)
35
+ }
36
+ if (finished) waiting.shift()
37
+ if (waiting.length > 0 && performance.now() - turnStarted >= WORKLET_TRANSFER_TURN_BUDGET_MS) {
38
+ afterAppTurn(sendWaiting)
39
+ return
40
+ }
41
+ }
42
+ sending = false
43
+ }
44
+
45
+ function enqueue(transfer: Transfer): void {
46
+ waiting.push(transfer)
47
+ if (!sending) sendWaiting()
48
+ }
49
+
50
+ function nextPartItems(sentItems: number, elapsedMs: number): number {
51
+ const perItemMs = elapsedMs / sentItems
52
+ if (perItemMs <= 0) return WORKLET_TRANSFER_LARGEST_PART_ITEMS
53
+ const fitting = Math.floor(WORKLET_TRANSFER_PART_TARGET_MS / perItemMs)
54
+ return Math.min(WORKLET_TRANSFER_LARGEST_PART_ITEMS, Math.max(1, fitting))
55
+ }
56
+
57
+ export function enqueueCall(args: readonly unknown[], sends: CallSends): void {
58
+ const partedArgs: number[] = []
59
+ for (const [index, value] of args.entries()) {
60
+ if (Array.isArray(value) && value.length > WORKLET_TRANSFER_FIRST_PART_ITEMS) partedArgs.push(index)
61
+ }
62
+ let argPosition = 0
63
+ let offset = 0
64
+ let partItems = WORKLET_TRANSFER_FIRST_PART_ITEMS
65
+ let sentAnyPart = false
66
+
67
+ function sendNextStep(): boolean {
68
+ const argIndex = partedArgs[argPosition]
69
+ if (argIndex === undefined) {
70
+ const remaining = args.map((value, index) => (partedArgs.includes(index) ? null : value))
71
+ sends.sendCall(remaining, partedArgs)
72
+ return true
73
+ }
74
+ const items = args[argIndex] as readonly unknown[]
75
+ const part = items.slice(offset, offset + partItems)
76
+ const started = performance.now()
77
+ sends.sendPart(argIndex, part)
78
+ sentAnyPart = true
79
+ partItems = nextPartItems(part.length, performance.now() - started)
80
+ offset += part.length
81
+ if (offset >= items.length) {
82
+ argPosition += 1
83
+ offset = 0
84
+ }
85
+ return false
86
+ }
87
+
88
+ function fail(error: unknown): void {
89
+ if (sentAnyPart) {
90
+ try {
91
+ sends.dropParts()
92
+ } catch {}
93
+ }
94
+ sends.fail(error)
95
+ }
96
+
97
+ enqueue({ sendNextStep, fail })
98
+ }
@@ -0,0 +1,37 @@
1
+ import type { DurabilityConfig, NarsilConfig } from '@delali/narsil'
2
+
3
+ /**
4
+ * The engine settings that an app passes to the engine on its own Worklets
5
+ * runtime. Each value has to cross to that runtime as data, so the settings
6
+ * that hold a function, such as an embedding adapter or a plugin, go in an
7
+ * {@link EngineSetup} worklet instead.
8
+ *
9
+ * `durability` defaults to a write-ahead log in a `narsil` directory inside
10
+ * the app's private storage, and `null` keeps the index in memory alone. A
11
+ * relative `directory` resolves against that private storage.
12
+ *
13
+ * @public
14
+ */
15
+ export type WorkletNarsilConfig = Omit<
16
+ NarsilConfig,
17
+ | 'persistence'
18
+ | 'invalidation'
19
+ | 'plugins'
20
+ | 'idGenerator'
21
+ | 'embedding'
22
+ | 'embeddingAdapters'
23
+ | 'rerankAdapters'
24
+ | 'events'
25
+ | 'durability'
26
+ > & { durability?: DurabilityConfig | null }
27
+
28
+ /**
29
+ * A worklet that runs on the engine's runtime before the engine starts, and
30
+ * returns the settings that hold functions, such as `embeddingAdapters`,
31
+ * `plugins`, or `idGenerator`. Its values override the matching values of
32
+ * {@link WorkletNarsilConfig}. Mark the function with the `'worklet'`
33
+ * directive, and register a language or a tokenizer inside it.
34
+ *
35
+ * @public
36
+ */
37
+ export type EngineSetup = () => Partial<NarsilConfig> | Promise<Partial<NarsilConfig>>