@candypoets/nipworker 0.96.3 → 0.96.5

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 (180) hide show
  1. package/README.md +206 -73
  2. package/crates/native-ffi/README.md +14 -151
  3. package/crates/native-ffi/ios/README.md +4 -50
  4. package/crates/native-ffi/react-native/README.md +8 -7
  5. package/crates/native-ffi/react-native/android/build.gradle +1 -0
  6. package/crates/native-ffi/react-native/android/src/main/cpp/NipworkerByteRuntime.cpp +348 -0
  7. package/crates/native-ffi/react-native/android/src/main/java/com/candypoets/nipworker/reactnative/NipworkerHooks.kt +292 -0
  8. package/crates/native-ffi/react-native/android/src/main/java/com/candypoets/nipworker/reactnative/NipworkerReactNativeModule.kt +283 -89
  9. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/AddressPointer.java +75 -0
  10. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ArticleBlock.java +102 -0
  11. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ArticleBlockType.java +23 -0
  12. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ArticleEntity.java +80 -0
  13. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ArticleInline.java +85 -0
  14. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ArticleInlineType.java +24 -0
  15. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/BadgeAwardRecipient.java +61 -0
  16. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/BufferFull.java +52 -0
  17. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/CacheInput.java +16 -0
  18. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/CacheInputMessage.java +57 -0
  19. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/CacheRequest.java +84 -0
  20. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/CacheResponse.java +67 -0
  21. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/CashuData.java +55 -0
  22. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ChatLimiterPipeConfig.java +74 -0
  23. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/CodeData.java +61 -0
  24. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ConnectionStatus.java +68 -0
  25. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Contact.java +70 -0
  26. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ContentBlock.java +70 -0
  27. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ContentData.java +23 -0
  28. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Coordinate.java +75 -0
  29. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/CountResponse.java +60 -0
  30. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/CounterPipeConfig.java +67 -0
  31. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/DLEQProof.java +69 -0
  32. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Emoji.java +62 -0
  33. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/EmojiData.java +68 -0
  34. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Eoce.java +55 -0
  35. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/EventPointer.java +74 -0
  36. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/GetPublicKey.java +43 -0
  37. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/HTLCWitness.java +64 -0
  38. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/HashtagData.java +55 -0
  39. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/HistoryTag.java +74 -0
  40. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ImageData.java +67 -0
  41. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ImetaTag.java +100 -0
  42. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind0Parsed.java +168 -0
  43. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind10002Parsed.java +59 -0
  44. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind10019Parsed.java +73 -0
  45. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind1018Parsed.java +79 -0
  46. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind1068Parsed.java +107 -0
  47. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind1111Parsed.java +159 -0
  48. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind1311Parsed.java +91 -0
  49. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind17375Parsed.java +74 -0
  50. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind17Parsed.java +81 -0
  51. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind1Parsed.java +109 -0
  52. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind20Parsed.java +107 -0
  53. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind22Parsed.java +111 -0
  54. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind30023Parsed.java +113 -0
  55. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind3Parsed.java +59 -0
  56. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind4Parsed.java +78 -0
  57. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind6Parsed.java +53 -0
  58. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind7374Parsed.java +66 -0
  59. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind7375Parsed.java +79 -0
  60. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind7376Parsed.java +100 -0
  61. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind7Parsed.java +81 -0
  62. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind8Parsed.java +78 -0
  63. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind9321Parsed.java +117 -0
  64. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Kind9735Parsed.java +119 -0
  65. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/KindFilterPipeConfig.java +60 -0
  66. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/LinkPreviewData.java +73 -0
  67. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ListParsed.java +123 -0
  68. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/LiveActivityRef.java +72 -0
  69. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/LiveChatParticipant.java +61 -0
  70. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/LiveChatThreadRef.java +61 -0
  71. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/MainContent.java +20 -0
  72. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/MainMessage.java +57 -0
  73. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/MediaGroupData.java +58 -0
  74. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/MediaItem.java +58 -0
  75. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Message.java +24 -0
  76. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/MessageType.java +19 -0
  77. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/MintInfo.java +65 -0
  78. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/MintProofs.java +66 -0
  79. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/MuteFilterPipeConfig.java +84 -0
  80. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Nip07.java +43 -0
  81. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Nip46Bunker.java +61 -0
  82. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Nip46QR.java +61 -0
  83. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/NostrData.java +81 -0
  84. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/NostrEvent.java +95 -0
  85. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/NpubLimiterKey.java +15 -0
  86. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/NpubLimiterPipeConfig.java +64 -0
  87. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/P2PKWitness.java +57 -0
  88. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ParsePipeConfig.java +43 -0
  89. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ParsedData.java +39 -0
  90. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ParsedDataUnion.java +35 -0
  91. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ParsedEvent.java +108 -0
  92. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Pipe.java +57 -0
  93. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/PipeConfig.java +23 -0
  94. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/PipelineConfig.java +59 -0
  95. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/PollOption.java +62 -0
  96. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/PollType.java +15 -0
  97. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/PreGenericParsed.java +213 -0
  98. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/PreParticipant.java +73 -0
  99. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/PreRefEvent.java +67 -0
  100. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/PrivateKey.java +55 -0
  101. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ProfilePointer.java +64 -0
  102. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Proof.java +90 -0
  103. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ProofVerificationPipeConfig.java +52 -0
  104. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Pubkey.java +55 -0
  105. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Publish.java +80 -0
  106. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Raw.java +55 -0
  107. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ReactionType.java +17 -0
  108. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/RelayInfo.java +63 -0
  109. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Request.java +134 -0
  110. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/SaveToDbPipeConfig.java +43 -0
  111. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/SerializeEventsPipeConfig.java +55 -0
  112. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/SetSigner.java +57 -0
  113. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/SignEvent.java +54 -0
  114. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/SignedEvent.java +54 -0
  115. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/SignerOp.java +19 -0
  116. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/SignerRequest.java +80 -0
  117. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/SignerResponse.java +64 -0
  118. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/SignerType.java +18 -0
  119. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/StringVec.java +57 -0
  120. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Subscribe.java +72 -0
  121. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/SubscribeKind.java +19 -0
  122. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/SubscriptionConfig.java +95 -0
  123. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Tag.java +64 -0
  124. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Template.java +74 -0
  125. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Unsubscribe.java +55 -0
  126. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ValidProofs.java +59 -0
  127. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/VideoData.java +67 -0
  128. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/VideoVariant.java +102 -0
  129. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/Witness.java +17 -0
  130. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/WitnessString.java +54 -0
  131. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/WorkerMessage.java +74 -0
  132. package/crates/native-ffi/react-native/android/src/main/java/nostr/fb/ZapRequest.java +83 -0
  133. package/crates/native-ffi/react-native/ios/NipworkerReactNativeModule.h +18 -0
  134. package/crates/native-ffi/react-native/ios/NipworkerReactNativeModule.mm +263 -8
  135. package/dist/EngineManager.d.ts +1 -0
  136. package/dist/EngineManager.d.ts.map +1 -1
  137. package/dist/EngineManager.js +143 -137
  138. package/dist/NostrManager.d.ts +1 -0
  139. package/dist/NostrManager.d.ts.map +1 -1
  140. package/dist/NostrManager.js +49 -44
  141. package/dist/connections/index.js +87 -87
  142. package/dist/engine/index.js +119 -119
  143. package/dist/engine.d.ts.map +1 -1
  144. package/dist/hooks.d.ts +1 -1
  145. package/dist/hooks.d.ts.map +1 -1
  146. package/dist/hooks.js +27 -26
  147. package/dist/index.d.ts +1 -1
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/legacy.d.ts.map +1 -1
  150. package/dist/lib/ArrayBufferReader.d.ts +2 -1
  151. package/dist/lib/ArrayBufferReader.d.ts.map +1 -1
  152. package/dist/lib/BaseBackend.d.ts +5 -3
  153. package/dist/lib/BaseBackend.d.ts.map +1 -1
  154. package/dist/manager.d.ts +2 -6
  155. package/dist/manager.d.ts.map +1 -1
  156. package/dist/manager.js +10 -28
  157. package/dist/react-native.d.ts +33 -4
  158. package/dist/react-native.d.ts.map +1 -1
  159. package/dist/react-native.js +400 -122
  160. package/dist/scheduleMicrotask.js +58 -50
  161. package/package.json +13 -11
  162. package/swift/Package.swift +36 -0
  163. package/swift/README.md +438 -0
  164. package/swift/Sources/NipworkerSwift/ArrayBufferReader.swift +136 -0
  165. package/swift/Sources/NipworkerSwift/AuthSession.swift +24 -0
  166. package/swift/Sources/NipworkerSwift/FFI.swift +94 -0
  167. package/swift/Sources/NipworkerSwift/FlatBufferHelpers.swift +273 -0
  168. package/swift/Sources/NipworkerSwift/Generated/message_generated.swift +6530 -0
  169. package/swift/Sources/NipworkerSwift/Hooks.swift +300 -0
  170. package/swift/Sources/NipworkerSwift/Models.swift +156 -0
  171. package/swift/Sources/NipworkerSwift/NostrManager.swift +594 -0
  172. package/swift/Sources/NipworkerSwift/PublishTracker.swift +40 -0
  173. package/swift/Sources/NipworkerSwift/Subscription.swift +44 -0
  174. package/swift/Sources/NipworkerSwift/WorkerMessageView.swift +145 -0
  175. package/dist/NativeBackend.d.ts +0 -53
  176. package/dist/NativeBackend.d.ts.map +0 -1
  177. package/dist/NativeBackend.js +0 -464
  178. package/dist/native.d.ts +0 -29
  179. package/dist/native.d.ts.map +0 -1
  180. package/dist/native.js +0 -273
@@ -24,14 +24,25 @@ void* nipworker_init(void (*callback)(void* userdata, const uint8_t* ptr, size_t
24
24
  void* nipworker_init_with_storage_path(void (*callback)(void* userdata, const uint8_t* ptr, size_t len), void* userdata, const char* storage_path);
25
25
  void* nipworker_init_with_config(void (*callback)(void* userdata, const uint8_t* ptr, size_t len), void* userdata, const char* storage_path, const char* default_relays, const char* indexer_relays);
26
26
  void nipworker_handle_message(void* handle, const uint8_t* ptr, size_t len);
27
+ bool nipworker_subscribe_message(void* handle, const uint8_t* ptr, size_t len);
28
+ bool nipworker_publish_message(void* handle, const uint8_t* ptr, size_t len);
27
29
  void nipworker_set_private_key(void* handle, const char* ptr);
28
30
  void nipworker_wake(void* handle);
29
31
  void nipworker_deinit(void* handle);
30
32
  void nipworker_free_bytes(uint8_t* ptr, size_t len);
33
+ bool nipworker_register_subscription(void* handle, const char* sub_id, size_t buffer_size);
34
+ bool nipworker_register_publish_buffer(void* handle, const char* publish_id, size_t buffer_size);
35
+ bool nipworker_retain_subscription(void* handle, const char* sub_id);
36
+ void nipworker_release_subscription(void* handle, const char* sub_id);
37
+ uint8_t* nipworker_subscription_buffer_ptr(void* handle, const char* sub_id);
38
+ size_t nipworker_subscription_buffer_len(void* handle, const char* sub_id);
39
+ void nipworker_cleanup_subscriptions(void* handle);
31
40
  }
32
41
 
33
42
  static NSString * const NipworkerEventName = @"NipworkerEvent";
34
43
  static NSString * const NipworkerStoragePrefix = @"nipworker.";
44
+ NSNotificationName const NipworkerRuntimeDataNotification = @"NipworkerRuntimeDataNotification";
45
+ NSString * const NipworkerRuntimeDataKey = @"data";
35
46
  static std::mutex NipworkerQueuedPacketsMutex;
36
47
  static std::vector<std::vector<uint8_t>> NipworkerQueuedPackets;
37
48
  static std::atomic_bool NipworkerByteRuntimeInstalled(false);
@@ -109,6 +120,10 @@ static NSString* NipworkerStorageDirectory(void) {
109
120
  return [dirURL path];
110
121
  }
111
122
 
123
+ void *nipworker_react_native_shared_handle(void) {
124
+ return NipworkerGetEngineHandleDefault(NULL);
125
+ }
126
+
112
127
  static void NipworkerNotifyQueuedPacket(void) {
113
128
  dispatch_async(dispatch_get_main_queue(), ^{
114
129
  NSArray<NipworkerReactNativeModule*>* listeners = nil;
@@ -140,6 +155,23 @@ private:
140
155
  std::vector<uint8_t> bytes_;
141
156
  };
142
157
 
158
+ class NipworkerExternalMutableBuffer final : public facebook::jsi::MutableBuffer {
159
+ public:
160
+ NipworkerExternalMutableBuffer(uint8_t* ptr, size_t len) : ptr_(ptr), len_(len) {}
161
+
162
+ size_t size() const override {
163
+ return len_;
164
+ }
165
+
166
+ uint8_t* data() override {
167
+ return ptr_;
168
+ }
169
+
170
+ private:
171
+ uint8_t* ptr_;
172
+ size_t len_;
173
+ };
174
+
143
175
  static void NipworkerInstallByteRuntime(facebook::jsi::Runtime& runtime, void* engineHandle) {
144
176
  facebook::jsi::Object byteRuntime(runtime);
145
177
  byteRuntime.setProperty(
@@ -201,6 +233,190 @@ static void NipworkerInstallByteRuntime(facebook::jsi::Runtime& runtime, void* e
201
233
  }
202
234
  )
203
235
  );
236
+ byteRuntime.setProperty(
237
+ runtime,
238
+ "registerSubscription",
239
+ facebook::jsi::Function::createFromHostFunction(
240
+ runtime,
241
+ facebook::jsi::PropNameID::forAscii(runtime, "registerSubscription"),
242
+ 2,
243
+ [engineHandle](facebook::jsi::Runtime& runtime, const facebook::jsi::Value&, const facebook::jsi::Value* args, size_t count) {
244
+ if (count < 2 || !args[0].isString() || !args[1].isNumber()) {
245
+ return facebook::jsi::Value(false);
246
+ }
247
+ std::string subId = args[0].asString(runtime).utf8(runtime);
248
+ auto bufferSize = static_cast<size_t>(args[1].asNumber());
249
+ return facebook::jsi::Value(nipworker_register_subscription(engineHandle, subId.c_str(), bufferSize));
250
+ }
251
+ )
252
+ );
253
+ byteRuntime.setProperty(
254
+ runtime,
255
+ "registerPublishBuffer",
256
+ facebook::jsi::Function::createFromHostFunction(
257
+ runtime,
258
+ facebook::jsi::PropNameID::forAscii(runtime, "registerPublishBuffer"),
259
+ 2,
260
+ [engineHandle](facebook::jsi::Runtime& runtime, const facebook::jsi::Value&, const facebook::jsi::Value* args, size_t count) {
261
+ if (count < 2 || !args[0].isString() || !args[1].isNumber()) {
262
+ return facebook::jsi::Value(false);
263
+ }
264
+ std::string publishId = args[0].asString(runtime).utf8(runtime);
265
+ auto bufferSize = static_cast<size_t>(args[1].asNumber());
266
+ return facebook::jsi::Value(nipworker_register_publish_buffer(engineHandle, publishId.c_str(), bufferSize));
267
+ }
268
+ )
269
+ );
270
+ byteRuntime.setProperty(
271
+ runtime,
272
+ "subscribe",
273
+ facebook::jsi::Function::createFromHostFunction(
274
+ runtime,
275
+ facebook::jsi::PropNameID::forAscii(runtime, "subscribe"),
276
+ 2,
277
+ [engineHandle](facebook::jsi::Runtime& runtime, const facebook::jsi::Value&, const facebook::jsi::Value* args, size_t count) {
278
+ if (count < 2 || !args[0].isObject() || !args[0].asObject(runtime).isArrayBuffer(runtime) || !args[1].isString()) {
279
+ return facebook::jsi::Value::undefined();
280
+ }
281
+ facebook::jsi::ArrayBuffer message = args[0].asObject(runtime).getArrayBuffer(runtime);
282
+ std::string subId = args[1].asString(runtime).utf8(runtime);
283
+ if (!nipworker_subscribe_message(engineHandle, message.data(runtime), message.size(runtime))) {
284
+ return facebook::jsi::Value::undefined();
285
+ }
286
+ uint8_t* ptr = nipworker_subscription_buffer_ptr(engineHandle, subId.c_str());
287
+ size_t len = nipworker_subscription_buffer_len(engineHandle, subId.c_str());
288
+ if (!ptr || len == 0) {
289
+ return facebook::jsi::Value::undefined();
290
+ }
291
+ auto nativeBuffer = std::make_shared<NipworkerExternalMutableBuffer>(ptr, len);
292
+ facebook::jsi::ArrayBuffer buffer(runtime, std::move(nativeBuffer));
293
+ return facebook::jsi::Value(runtime, std::move(buffer));
294
+ }
295
+ )
296
+ );
297
+ byteRuntime.setProperty(
298
+ runtime,
299
+ "publish",
300
+ facebook::jsi::Function::createFromHostFunction(
301
+ runtime,
302
+ facebook::jsi::PropNameID::forAscii(runtime, "publish"),
303
+ 2,
304
+ [engineHandle](facebook::jsi::Runtime& runtime, const facebook::jsi::Value&, const facebook::jsi::Value* args, size_t count) {
305
+ if (count < 2 || !args[0].isObject() || !args[0].asObject(runtime).isArrayBuffer(runtime) || !args[1].isString()) {
306
+ return facebook::jsi::Value::undefined();
307
+ }
308
+ facebook::jsi::ArrayBuffer message = args[0].asObject(runtime).getArrayBuffer(runtime);
309
+ std::string publishId = args[1].asString(runtime).utf8(runtime);
310
+ if (!nipworker_publish_message(engineHandle, message.data(runtime), message.size(runtime))) {
311
+ return facebook::jsi::Value::undefined();
312
+ }
313
+ uint8_t* ptr = nipworker_subscription_buffer_ptr(engineHandle, publishId.c_str());
314
+ size_t len = nipworker_subscription_buffer_len(engineHandle, publishId.c_str());
315
+ if (!ptr || len == 0) {
316
+ return facebook::jsi::Value::undefined();
317
+ }
318
+ auto nativeBuffer = std::make_shared<NipworkerExternalMutableBuffer>(ptr, len);
319
+ facebook::jsi::ArrayBuffer buffer(runtime, std::move(nativeBuffer));
320
+ return facebook::jsi::Value(runtime, std::move(buffer));
321
+ }
322
+ )
323
+ );
324
+ byteRuntime.setProperty(
325
+ runtime,
326
+ "retainSubscription",
327
+ facebook::jsi::Function::createFromHostFunction(
328
+ runtime,
329
+ facebook::jsi::PropNameID::forAscii(runtime, "retainSubscription"),
330
+ 1,
331
+ [engineHandle](facebook::jsi::Runtime& runtime, const facebook::jsi::Value&, const facebook::jsi::Value* args, size_t count) {
332
+ if (count < 1 || !args[0].isString()) {
333
+ return facebook::jsi::Value(false);
334
+ }
335
+ std::string subId = args[0].asString(runtime).utf8(runtime);
336
+ return facebook::jsi::Value(nipworker_retain_subscription(engineHandle, subId.c_str()));
337
+ }
338
+ )
339
+ );
340
+ byteRuntime.setProperty(
341
+ runtime,
342
+ "retainSubscriptionBuffer",
343
+ facebook::jsi::Function::createFromHostFunction(
344
+ runtime,
345
+ facebook::jsi::PropNameID::forAscii(runtime, "retainSubscriptionBuffer"),
346
+ 1,
347
+ [engineHandle](facebook::jsi::Runtime& runtime, const facebook::jsi::Value&, const facebook::jsi::Value* args, size_t count) {
348
+ if (count < 1 || !args[0].isString()) {
349
+ return facebook::jsi::Value::undefined();
350
+ }
351
+ std::string subId = args[0].asString(runtime).utf8(runtime);
352
+ if (!nipworker_retain_subscription(engineHandle, subId.c_str())) {
353
+ return facebook::jsi::Value::undefined();
354
+ }
355
+ uint8_t* ptr = nipworker_subscription_buffer_ptr(engineHandle, subId.c_str());
356
+ size_t len = nipworker_subscription_buffer_len(engineHandle, subId.c_str());
357
+ if (!ptr || len == 0) {
358
+ nipworker_release_subscription(engineHandle, subId.c_str());
359
+ return facebook::jsi::Value::undefined();
360
+ }
361
+ auto nativeBuffer = std::make_shared<NipworkerExternalMutableBuffer>(ptr, len);
362
+ facebook::jsi::ArrayBuffer buffer(runtime, std::move(nativeBuffer));
363
+ return facebook::jsi::Value(runtime, std::move(buffer));
364
+ }
365
+ )
366
+ );
367
+ byteRuntime.setProperty(
368
+ runtime,
369
+ "releaseSubscription",
370
+ facebook::jsi::Function::createFromHostFunction(
371
+ runtime,
372
+ facebook::jsi::PropNameID::forAscii(runtime, "releaseSubscription"),
373
+ 1,
374
+ [engineHandle](facebook::jsi::Runtime& runtime, const facebook::jsi::Value&, const facebook::jsi::Value* args, size_t count) {
375
+ if (count < 1 || !args[0].isString()) {
376
+ return facebook::jsi::Value::undefined();
377
+ }
378
+ std::string subId = args[0].asString(runtime).utf8(runtime);
379
+ nipworker_release_subscription(engineHandle, subId.c_str());
380
+ return facebook::jsi::Value::undefined();
381
+ }
382
+ )
383
+ );
384
+ byteRuntime.setProperty(
385
+ runtime,
386
+ "getSubscriptionBuffer",
387
+ facebook::jsi::Function::createFromHostFunction(
388
+ runtime,
389
+ facebook::jsi::PropNameID::forAscii(runtime, "getSubscriptionBuffer"),
390
+ 1,
391
+ [engineHandle](facebook::jsi::Runtime& runtime, const facebook::jsi::Value&, const facebook::jsi::Value* args, size_t count) {
392
+ if (count < 1 || !args[0].isString()) {
393
+ return facebook::jsi::Value::undefined();
394
+ }
395
+ std::string subId = args[0].asString(runtime).utf8(runtime);
396
+ uint8_t* ptr = nipworker_subscription_buffer_ptr(engineHandle, subId.c_str());
397
+ size_t len = nipworker_subscription_buffer_len(engineHandle, subId.c_str());
398
+ if (!ptr || len == 0) {
399
+ return facebook::jsi::Value::undefined();
400
+ }
401
+ auto nativeBuffer = std::make_shared<NipworkerExternalMutableBuffer>(ptr, len);
402
+ facebook::jsi::ArrayBuffer buffer(runtime, std::move(nativeBuffer));
403
+ return facebook::jsi::Value(runtime, std::move(buffer));
404
+ }
405
+ )
406
+ );
407
+ byteRuntime.setProperty(
408
+ runtime,
409
+ "cleanupSubscriptions",
410
+ facebook::jsi::Function::createFromHostFunction(
411
+ runtime,
412
+ facebook::jsi::PropNameID::forAscii(runtime, "cleanupSubscriptions"),
413
+ 0,
414
+ [engineHandle](facebook::jsi::Runtime&, const facebook::jsi::Value&, const facebook::jsi::Value*, size_t) {
415
+ nipworker_cleanup_subscriptions(engineHandle);
416
+ return facebook::jsi::Value::undefined();
417
+ }
418
+ )
419
+ );
204
420
  byteRuntime.setProperty(
205
421
  runtime,
206
422
  "deinit",
@@ -246,6 +462,12 @@ static void NipworkerReactNativeCallbackForwarder(void* userdata, const uint8_t*
246
462
  NSData* data = [NSData dataWithBytes:ptr length:len];
247
463
  nipworker_free_bytes((uint8_t*)ptr, len);
248
464
 
465
+ dispatch_async(dispatch_get_main_queue(), ^{
466
+ [[NSNotificationCenter defaultCenter] postNotificationName:NipworkerRuntimeDataNotification
467
+ object:nil
468
+ userInfo:@{ NipworkerRuntimeDataKey: data }];
469
+ });
470
+
249
471
  if (module.byteRuntimeInstalled || NipworkerByteRuntimeInstalled.load()) {
250
472
  NipworkerQueuePacket((const uint8_t*)data.bytes, data.length);
251
473
  NipworkerNotifyQueuedPacket();
@@ -267,6 +489,41 @@ static void NipworkerReactNativeCallbackForwarder(void* userdata, const uint8_t*
267
489
  });
268
490
  }
269
491
 
492
+ @implementation NipworkerRuntime
493
+
494
+ + (void *)sharedHandle {
495
+ return NipworkerGetEngineHandleDefault(NULL);
496
+ }
497
+
498
+ + (void *)sharedHandleWithDefaultRelays:(NSArray<NSString *> *)defaultRelays
499
+ indexerRelays:(NSArray<NSString *> *)indexerRelays
500
+ userdata:(void *)userdata {
501
+ return NipworkerGetEngineHandle(userdata, defaultRelays, indexerRelays);
502
+ }
503
+
504
+ + (void)handleMessage:(NSData *)data {
505
+ void* handle = NipworkerGetEngineHandleDefault(NULL);
506
+ if (handle && data.length > 0) {
507
+ nipworker_handle_message(handle, (const uint8_t*)data.bytes, data.length);
508
+ }
509
+ }
510
+
511
+ + (void)setPrivateKey:(NSString *)secret {
512
+ void* handle = NipworkerGetEngineHandleDefault(NULL);
513
+ if (handle && secret) {
514
+ nipworker_set_private_key(handle, [secret UTF8String]);
515
+ }
516
+ }
517
+
518
+ + (void)wake {
519
+ void* handle = NipworkerGetEngineHandleDefault(NULL);
520
+ if (handle) {
521
+ nipworker_wake(handle);
522
+ }
523
+ }
524
+
525
+ @end
526
+
270
527
  @implementation NipworkerReactNativeModule
271
528
 
272
529
  RCT_EXPORT_MODULE(NipworkerReactNativeModule)
@@ -314,7 +571,9 @@ RCT_EXPORT_MODULE(NipworkerReactNativeModule)
314
571
  }
315
572
 
316
573
  RCT_EXPORT_METHOD(initEngine:(NSArray<NSString *> *)defaultRelays indexerRelays:(NSArray<NSString *> *)indexerRelays) {
317
- self.engineHandle = NipworkerGetEngineHandle((__bridge void*)self, defaultRelays, indexerRelays);
574
+ self.engineHandle = [NipworkerRuntime sharedHandleWithDefaultRelays:defaultRelays
575
+ indexerRelays:indexerRelays
576
+ userdata:(__bridge void*)self];
318
577
  }
319
578
 
320
579
  RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(installByteRuntime) {
@@ -349,20 +608,16 @@ RCT_EXPORT_METHOD(handleMessage:(NSArray<NSNumber *> *)bytes) {
349
608
  for (NSUInteger i = 0; i < bytes.count; i++) {
350
609
  rawBytes[i] = (uint8_t)(bytes[i].unsignedCharValue);
351
610
  }
352
- nipworker_handle_message(self.engineHandle, (const uint8_t*)data.bytes, data.length);
611
+ [NipworkerRuntime handleMessage:data];
353
612
  }
354
613
  }
355
614
 
356
615
  RCT_EXPORT_METHOD(setPrivateKey:(NSString *)secret) {
357
- if (self.engineHandle && secret) {
358
- nipworker_set_private_key(self.engineHandle, [secret UTF8String]);
359
- }
616
+ [NipworkerRuntime setPrivateKey:secret];
360
617
  }
361
618
 
362
619
  RCT_EXPORT_METHOD(wake) {
363
- if (self.engineHandle) {
364
- nipworker_wake(self.engineHandle);
365
- }
620
+ [NipworkerRuntime wake];
366
621
  }
367
622
 
368
623
  RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getStorageItem:(NSString *)key) {
@@ -11,6 +11,7 @@ export declare class EngineManager extends BaseBackend {
11
11
  private worker;
12
12
  private enginePort;
13
13
  private _signCB;
14
+ private lastWakeAt;
14
15
  constructor(_config?: NostrManagerConfig);
15
16
  private setupVisibilityTracking;
16
17
  protected onLogout(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"EngineManager.d.ts","sourceRoot":"","sources":["../src/EngineManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAuB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA8B7D;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC7C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,OAAO,CAA8B;gBAEjC,OAAO,GAAE,kBAAuB;IAwK5C,OAAO,CAAC,uBAAuB;IA6B/B,SAAS,CAAC,QAAQ,IAAI,IAAI;IAI1B,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,mBAAmB;IAwC3B,SAAS,CACR,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,kBAAkB,GACzB,WAAW;IAgEd,OAAO,CACN,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,UAAU,EACjB,aAAa,GAAE,MAAM,EAAO,EAC5B,gBAAgB,CAAC,EAAE,MAAM,EAAE,GACzB,WAAW;IAyBd,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAuDvF,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI;IAgB/D,YAAY;IAQZ,OAAO,IAAI,IAAI;CAiBf"}
1
+ {"version":3,"file":"EngineManager.d.ts","sourceRoot":"","sources":["../src/EngineManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAuB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA8B7D;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC7C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,UAAU,CAAK;gBAEX,OAAO,GAAE,kBAAuB;IAwK5C,OAAO,CAAC,uBAAuB;IA0C/B,SAAS,CAAC,QAAQ,IAAI,IAAI;IAI1B,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,mBAAmB;IAwC3B,SAAS,CACR,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,kBAAkB,GACzB,WAAW;IAgEd,OAAO,CACN,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,UAAU,EACjB,aAAa,GAAE,MAAM,EAAO,EAC5B,gBAAgB,CAAC,EAAE,MAAM,EAAE,GACzB,WAAW;IAyBd,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAuDvF,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI;IAgB/D,YAAY;IAQZ,OAAO,IAAI,IAAI;CAiBf"}