@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
@@ -4,15 +4,220 @@ import android.content.Context
4
4
  import com.facebook.react.bridge.Arguments
5
5
  import com.facebook.react.bridge.ReadableArray
6
6
  import com.facebook.react.bridge.ReactApplicationContext
7
+ import com.facebook.react.bridge.ReactContextBaseJavaModule
7
8
  import com.facebook.react.bridge.ReactMethod
8
9
  import com.facebook.react.module.annotations.ReactModule
9
10
  import com.facebook.react.modules.core.DeviceEventManagerModule
11
+ import com.facebook.react.turbomodule.core.interfaces.TurboModule
12
+ import java.nio.ByteBuffer
13
+ import java.nio.ByteOrder
10
14
  import java.util.concurrent.atomic.AtomicLong
15
+ import nostr.fb.WorkerMessage
16
+
17
+ typealias NipworkerRuntimeListener = (ByteArray) -> Unit
18
+
19
+ object NipworkerRuntime {
20
+ private const val STORAGE_NAME = "nipworker_storage"
21
+ private val nextUserdata = AtomicLong(1L)
22
+ private val listeners = LinkedHashSet<NipworkerRuntimeListener>()
23
+ private val keyedListeners = LinkedHashMap<String, LinkedHashSet<NipworkerRuntimeListener>>()
24
+
25
+ @Volatile
26
+ private var sharedHandle: Long = 0L
27
+
28
+ @Volatile
29
+ private var sharedUserdata: Long = 0L
30
+
31
+ val handle: Long
32
+ get() = sharedHandle
33
+
34
+ fun addListener(listener: NipworkerRuntimeListener): () -> Unit {
35
+ synchronized(this) {
36
+ listeners.add(listener)
37
+ }
38
+ return {
39
+ synchronized(this) {
40
+ listeners.remove(listener)
41
+ }
42
+ }
43
+ }
44
+
45
+ fun addListener(id: String, listener: NipworkerRuntimeListener): () -> Unit {
46
+ synchronized(this) {
47
+ keyedListeners.getOrPut(id) { LinkedHashSet() }.add(listener)
48
+ }
49
+ return {
50
+ synchronized(this) {
51
+ val listenersForId = keyedListeners[id]
52
+ if (listenersForId != null) {
53
+ listenersForId.remove(listener)
54
+ if (listenersForId.isEmpty()) {
55
+ keyedListeners.remove(id)
56
+ }
57
+ }
58
+ }
59
+ }
60
+ }
61
+
62
+ fun init(context: Context, defaultRelays: ReadableArray? = null, indexerRelays: ReadableArray? = null): Long {
63
+ synchronized(this) {
64
+ if (sharedHandle == 0L) {
65
+ sharedUserdata = nextUserdata.getAndIncrement()
66
+ val cacheDir = context.filesDir.resolve("nipworker")
67
+ sharedHandle = NipworkerReactNativeModule.nipworkerInitWithConfig(
68
+ sharedUserdata,
69
+ cacheDir.absolutePath,
70
+ readableArrayToCsv(defaultRelays),
71
+ readableArrayToCsv(indexerRelays)
72
+ )
73
+ }
74
+ return sharedHandle
75
+ }
76
+ }
77
+
78
+ fun handleMessage(bytes: ByteArray) {
79
+ val handle = sharedHandle
80
+ if (handle != 0L) {
81
+ NipworkerReactNativeModule.nipworkerHandleMessage(handle, bytes)
82
+ }
83
+ }
84
+
85
+ fun subscribe(message: ByteArray, subId: String): ByteBuffer? {
86
+ val handle = sharedHandle
87
+ if (handle == 0L) return null
88
+ retainSubscriptionBuffer(subId)?.let { return it }
89
+ return NipworkerReactNativeModule.nativeSubscribeMessage(handle, message, subId)
90
+ }
91
+
92
+ fun publish(message: ByteArray, publishId: String): ByteBuffer? {
93
+ val handle = sharedHandle
94
+ return if (handle == 0L) null else NipworkerReactNativeModule.nativePublishMessage(handle, message, publishId)
95
+ }
96
+
97
+ fun setPrivateKey(secret: String) {
98
+ val handle = sharedHandle
99
+ if (handle != 0L) {
100
+ NipworkerReactNativeModule.nipworkerSetPrivateKey(handle, secret)
101
+ }
102
+ }
103
+
104
+ fun wake() {
105
+ val handle = sharedHandle
106
+ if (handle != 0L) {
107
+ NipworkerReactNativeModule.nipworkerWake(handle)
108
+ }
109
+ }
110
+
111
+ fun registerSubscription(subId: String, bufferSize: Int): Boolean {
112
+ val handle = sharedHandle
113
+ return handle != 0L && NipworkerReactNativeModule.nativeRegisterSubscription(handle, subId, bufferSize)
114
+ }
115
+
116
+ fun registerPublishBuffer(publishId: String, bufferSize: Int): Boolean {
117
+ val handle = sharedHandle
118
+ return handle != 0L && NipworkerReactNativeModule.nativeRegisterPublishBuffer(handle, publishId, bufferSize)
119
+ }
120
+
121
+ fun retainSubscription(subId: String): Boolean {
122
+ val handle = sharedHandle
123
+ return handle != 0L && NipworkerReactNativeModule.nativeRetainSubscription(handle, subId)
124
+ }
125
+
126
+ fun retainSubscriptionBuffer(subId: String): ByteBuffer? {
127
+ val handle = sharedHandle
128
+ if (handle == 0L || !NipworkerReactNativeModule.nativeRetainSubscription(handle, subId)) {
129
+ return null
130
+ }
131
+ return NipworkerReactNativeModule.nativeGetSubscriptionBuffer(handle, subId)
132
+ ?: run {
133
+ NipworkerReactNativeModule.nativeReleaseSubscription(handle, subId)
134
+ null
135
+ }
136
+ }
137
+
138
+ fun releaseSubscription(subId: String) {
139
+ val handle = sharedHandle
140
+ if (handle != 0L) {
141
+ NipworkerReactNativeModule.nativeReleaseSubscription(handle, subId)
142
+ }
143
+ }
144
+
145
+ fun subscriptionBuffer(subId: String): ByteBuffer? {
146
+ val handle = sharedHandle
147
+ return if (handle == 0L) null else NipworkerReactNativeModule.nativeGetSubscriptionBuffer(handle, subId)
148
+ }
149
+
150
+ fun deinit() {
151
+ synchronized(this) {
152
+ if (sharedHandle != 0L) {
153
+ NipworkerReactNativeModule.nipworkerDeinit(sharedHandle)
154
+ sharedHandle = 0L
155
+ sharedUserdata = 0L
156
+ }
157
+ listeners.clear()
158
+ keyedListeners.clear()
159
+ }
160
+ }
161
+
162
+ internal fun dispatch(data: ByteArray) {
163
+ val subId = readSubId(data)
164
+ val (globalSnapshot, keyedSnapshot) = synchronized(this) {
165
+ listeners.toList() to if (subId == null) {
166
+ emptyList<NipworkerRuntimeListener>()
167
+ } else {
168
+ keyedListeners[subId].orEmpty().toList()
169
+ }
170
+ }
171
+ for (listener in globalSnapshot) {
172
+ listener(data)
173
+ }
174
+ for (listener in keyedSnapshot) {
175
+ listener(data)
176
+ }
177
+ }
178
+
179
+ private fun readSubId(data: ByteArray): String? {
180
+ decodeRouteWakeFrame(data)?.let { return it }
181
+ return runCatching {
182
+ val buffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN)
183
+ WorkerMessage.getRootAsWorkerMessage(buffer).subId()
184
+ }.getOrNull()
185
+ }
186
+
187
+ private fun decodeRouteWakeFrame(data: ByteArray): String? {
188
+ if (data.size < 8) return null
189
+ if (
190
+ data[0] != 0x4e.toByte() ||
191
+ data[1] != 0x57.toByte() ||
192
+ data[2] != 0x52.toByte() ||
193
+ data[3] != 0x31.toByte()
194
+ ) {
195
+ return null
196
+ }
197
+ val subIdLength = ByteBuffer.wrap(data, 4, 4).order(ByteOrder.LITTLE_ENDIAN).int
198
+ if (subIdLength <= 0 || subIdLength != data.size - 8) return null
199
+ return data.decodeToString(8, data.size)
200
+ }
201
+
202
+ private fun readableArrayToCsv(values: ReadableArray?): String {
203
+ if (values == null) {
204
+ return ""
205
+ }
206
+ val relays = mutableListOf<String>()
207
+ for (i in 0 until values.size()) {
208
+ val relay = values.getString(i)?.trim()
209
+ if (!relay.isNullOrEmpty() && !relay.contains(",")) {
210
+ relays.add(relay)
211
+ }
212
+ }
213
+ return relays.joinToString(",")
214
+ }
215
+ }
11
216
 
12
217
  @ReactModule(name = NipworkerReactNativeModule.NAME)
13
218
  class NipworkerReactNativeModule(
14
219
  private val reactContext: ReactApplicationContext
15
- ) : NativeNipworkerReactNativeSpec(reactContext) {
220
+ ) : ReactContextBaseJavaModule(reactContext), TurboModule {
16
221
  companion object {
17
222
  const val NAME = "NipworkerReactNativeModule"
18
223
  private const val EVENT_NAME = "NipworkerEvent"
@@ -23,38 +228,9 @@ class NipworkerReactNativeModule(
23
228
  System.loadLibrary("nipworker_react_native")
24
229
  }
25
230
 
26
- private val nextUserdata = AtomicLong(1L)
27
-
28
- @Volatile
29
- private var sharedHandle: Long = 0L
30
-
31
- @Volatile
32
- private var sharedUserdata: Long = 0L
33
-
34
- @Volatile
35
- private var activeModule: NipworkerReactNativeModule? = null
36
-
37
231
  @JvmStatic
38
232
  fun onNativeData(userdata: Long, data: ByteArray) {
39
- val module = activeModule ?: return
40
- if (nativeIsByteRuntimeInstalled() && nativeQueueData(data)) {
41
- val payload = Arguments.createMap().apply {
42
- putInt("v", 1)
43
- putString("encoding", "queued")
44
- }
45
- module.emitData(payload)
46
- return
47
- }
48
- val bytes = Arguments.createArray()
49
- for (byte in data) {
50
- bytes.pushInt(byte.toInt() and 0xff)
51
- }
52
- val payload = Arguments.createMap().apply {
53
- putInt("v", 1)
54
- putString("encoding", "bytes")
55
- putArray("data", bytes)
56
- }
57
- module.emitData(payload)
233
+ NipworkerRuntime.dispatch(data)
58
234
  }
59
235
 
60
236
  @JvmStatic
@@ -94,8 +270,33 @@ class NipworkerReactNativeModule(
94
270
 
95
271
  @JvmStatic
96
272
  external fun nativeQueueData(bytes: ByteArray): Boolean
273
+
274
+ @JvmStatic
275
+ external fun nativeSubscribeMessage(handle: Long, bytes: ByteArray, subId: String): ByteBuffer?
276
+
277
+ @JvmStatic
278
+ external fun nativePublishMessage(handle: Long, bytes: ByteArray, publishId: String): ByteBuffer?
279
+
280
+ @JvmStatic
281
+ external fun nativeRegisterSubscription(handle: Long, subId: String, bufferSize: Int): Boolean
282
+
283
+ @JvmStatic
284
+ external fun nativeRegisterPublishBuffer(handle: Long, publishId: String, bufferSize: Int): Boolean
285
+
286
+ @JvmStatic
287
+ external fun nativeRetainSubscription(handle: Long, subId: String): Boolean
288
+
289
+ @JvmStatic
290
+ external fun nativeReleaseSubscription(handle: Long, subId: String)
291
+
292
+ @JvmStatic
293
+ external fun nativeGetSubscriptionBuffer(handle: Long, subId: String): ByteBuffer?
97
294
  }
98
295
 
296
+ private var removeRuntimeListener: (() -> Unit)? = null
297
+
298
+ override fun getName(): String = NAME
299
+
99
300
  private val storage by lazy {
100
301
  reactContext.getSharedPreferences(STORAGE_NAME, Context.MODE_PRIVATE)
101
302
  }
@@ -110,102 +311,95 @@ class NipworkerReactNativeModule(
110
311
  // Required by NativeEventEmitter on Android legacy paths.
111
312
  }
112
313
 
113
- private fun readableArrayToCsv(values: ReadableArray?): String {
114
- if (values == null) {
115
- return ""
116
- }
117
- val relays = mutableListOf<String>()
118
- for (i in 0 until values.size()) {
119
- val relay = values.getString(i)?.trim()
120
- if (!relay.isNullOrEmpty() && !relay.contains(",")) {
121
- relays.add(relay)
122
- }
123
- }
124
- return relays.joinToString(",")
314
+ @ReactMethod
315
+ fun initEngine(defaultRelays: ReadableArray, indexerRelays: ReadableArray) {
316
+ ensureRuntimeListener()
317
+ NipworkerRuntime.init(reactContext, defaultRelays, indexerRelays)
125
318
  }
126
319
 
127
- override fun initEngine(defaultRelays: ReadableArray, indexerRelays: ReadableArray) {
128
- activeModule = this
129
- if (sharedHandle == 0L) {
130
- sharedUserdata = nextUserdata.getAndIncrement()
131
- val cacheDir = reactContext.filesDir.resolve("nipworker")
132
- sharedHandle = nipworkerInitWithConfig(
133
- sharedUserdata,
134
- cacheDir.absolutePath,
135
- readableArrayToCsv(defaultRelays),
136
- readableArrayToCsv(indexerRelays)
137
- )
320
+ private fun ensureRuntimeListener() {
321
+ if (removeRuntimeListener == null) {
322
+ removeRuntimeListener = NipworkerRuntime.addListener { data ->
323
+ emitRuntimeData(data)
324
+ }
138
325
  }
139
326
  }
140
327
 
141
328
  @ReactMethod(isBlockingSynchronousMethod = true)
142
- override fun installByteRuntime(): Boolean {
329
+ fun installByteRuntime(): Boolean {
143
330
  initEngine(Arguments.createArray(), Arguments.createArray())
144
331
  val runtimePtr = reactContext.javaScriptContextHolder?.get() ?: 0L
145
- if (runtimePtr == 0L || sharedHandle == 0L) {
332
+ val handle = NipworkerRuntime.handle
333
+ if (runtimePtr == 0L || handle == 0L) {
146
334
  return false
147
335
  }
148
- return nativeInstallByteRuntime(runtimePtr, sharedHandle)
336
+ return nativeInstallByteRuntime(runtimePtr, handle)
149
337
  }
150
338
 
151
339
  @ReactMethod
152
- override fun handleMessage(bytes: ReadableArray) {
153
- if (sharedHandle != 0L) {
154
- val data = ByteArray(bytes.size())
155
- for (i in 0 until bytes.size()) {
156
- data[i] = (bytes.getInt(i) and 0xff).toByte()
157
- }
158
- nipworkerHandleMessage(sharedHandle, data)
340
+ fun handleMessage(bytes: ReadableArray) {
341
+ val data = ByteArray(bytes.size())
342
+ for (i in 0 until bytes.size()) {
343
+ data[i] = (bytes.getInt(i) and 0xff).toByte()
159
344
  }
345
+ NipworkerRuntime.handleMessage(data)
160
346
  }
161
347
 
162
348
  @ReactMethod
163
- override fun wake() {
164
- if (sharedHandle != 0L) {
165
- nipworkerWake(sharedHandle)
166
- }
349
+ fun wake() {
350
+ NipworkerRuntime.wake()
167
351
  }
168
352
 
169
353
  @ReactMethod
170
- override fun setPrivateKey(secret: String) {
171
- if (sharedHandle != 0L) {
172
- nipworkerSetPrivateKey(sharedHandle, secret)
173
- }
354
+ fun setPrivateKey(secret: String) {
355
+ NipworkerRuntime.setPrivateKey(secret)
174
356
  }
175
357
 
176
358
  @ReactMethod(isBlockingSynchronousMethod = true)
177
- override fun getStorageItem(key: String): String? {
359
+ fun getStorageItem(key: String): String? {
178
360
  return storage.getString(key, null)
179
361
  }
180
362
 
181
363
  @ReactMethod(isBlockingSynchronousMethod = true)
182
- override fun setStorageItem(key: String, value: String): Boolean {
364
+ fun setStorageItem(key: String, value: String): Boolean {
183
365
  return storage.edit().putString(key, value).commit()
184
366
  }
185
367
 
186
368
  @ReactMethod(isBlockingSynchronousMethod = true)
187
- override fun removeStorageItem(key: String): Boolean {
369
+ fun removeStorageItem(key: String): Boolean {
188
370
  return storage.edit().remove(key).commit()
189
371
  }
190
372
 
191
- override fun deinitEngine() {
192
- if (sharedHandle != 0L) {
193
- nipworkerDeinit(sharedHandle)
194
- sharedHandle = 0L
195
- sharedUserdata = 0L
373
+ @ReactMethod
374
+ fun deinitEngine() {
375
+ removeRuntimeListener?.invoke()
376
+ removeRuntimeListener = null
377
+ }
378
+
379
+ private fun emitRuntimeData(data: ByteArray) {
380
+ if (nativeIsByteRuntimeInstalled() && nativeQueueData(data)) {
381
+ val payload = Arguments.createMap().apply {
382
+ putInt("v", 1)
383
+ putString("encoding", "queued")
384
+ }
385
+ emitData(payload)
386
+ return
196
387
  }
197
- if (activeModule === this) {
198
- activeModule = null
388
+ val bytes = Arguments.createArray()
389
+ for (byte in data) {
390
+ bytes.pushInt(byte.toInt() and 0xff)
199
391
  }
392
+ val payload = Arguments.createMap().apply {
393
+ putInt("v", 1)
394
+ putString("encoding", "bytes")
395
+ putArray("data", bytes)
396
+ }
397
+ emitData(payload)
200
398
  }
201
399
 
202
400
  private fun emitData(payload: com.facebook.react.bridge.WritableMap) {
203
- try {
204
- emitOnData(payload)
205
- } catch (_: Throwable) {
206
- reactContext
207
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
208
- .emit(EVENT_NAME, payload)
209
- }
401
+ reactContext
402
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
403
+ .emit(EVENT_NAME, payload)
210
404
  }
211
405
  }
@@ -0,0 +1,75 @@
1
+ // automatically generated by the FlatBuffers compiler, do not modify
2
+
3
+ package nostr.fb;
4
+
5
+ import com.google.flatbuffers.BaseVector;
6
+ import com.google.flatbuffers.BooleanVector;
7
+ import com.google.flatbuffers.ByteVector;
8
+ import com.google.flatbuffers.Constants;
9
+ import com.google.flatbuffers.DoubleVector;
10
+ import com.google.flatbuffers.FlatBufferBuilder;
11
+ import com.google.flatbuffers.FloatVector;
12
+ import com.google.flatbuffers.IntVector;
13
+ import com.google.flatbuffers.LongVector;
14
+ import com.google.flatbuffers.ShortVector;
15
+ import com.google.flatbuffers.StringVector;
16
+ import com.google.flatbuffers.Struct;
17
+ import com.google.flatbuffers.UnionVector;
18
+ import java.nio.ByteBuffer;
19
+ import java.nio.ByteOrder;
20
+
21
+ @SuppressWarnings("unused")
22
+ public final class AddressPointer extends com.google.flatbuffers.Table {
23
+ public static void ValidateVersion() { Constants.FLATBUFFERS_25_2_10(); }
24
+ public static AddressPointer getRootAsAddressPointer(ByteBuffer _bb) { return getRootAsAddressPointer(_bb, new AddressPointer()); }
25
+ public static AddressPointer getRootAsAddressPointer(ByteBuffer _bb, AddressPointer obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
26
+ public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
27
+ public AddressPointer __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
28
+
29
+ public long kind() { int o = __offset(4); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
30
+ public String pubkey() { int o = __offset(6); return o != 0 ? __string(o + bb_pos) : null; }
31
+ public ByteBuffer pubkeyAsByteBuffer() { return __vector_as_bytebuffer(6, 1); }
32
+ public ByteBuffer pubkeyInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 6, 1); }
33
+ public String d() { int o = __offset(8); return o != 0 ? __string(o + bb_pos) : null; }
34
+ public ByteBuffer dAsByteBuffer() { return __vector_as_bytebuffer(8, 1); }
35
+ public ByteBuffer dInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 8, 1); }
36
+ public String relays(int j) { int o = __offset(10); return o != 0 ? __string(__vector(o) + j * 4) : null; }
37
+ public int relaysLength() { int o = __offset(10); return o != 0 ? __vector_len(o) : 0; }
38
+ public StringVector relaysVector() { return relaysVector(new StringVector()); }
39
+ public StringVector relaysVector(StringVector obj) { int o = __offset(10); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
40
+
41
+ public static int createAddressPointer(FlatBufferBuilder builder,
42
+ long kind,
43
+ int pubkeyOffset,
44
+ int dOffset,
45
+ int relaysOffset) {
46
+ builder.startTable(4);
47
+ AddressPointer.addKind(builder, kind);
48
+ AddressPointer.addRelays(builder, relaysOffset);
49
+ AddressPointer.addD(builder, dOffset);
50
+ AddressPointer.addPubkey(builder, pubkeyOffset);
51
+ return AddressPointer.endAddressPointer(builder);
52
+ }
53
+
54
+ public static void startAddressPointer(FlatBufferBuilder builder) { builder.startTable(4); }
55
+ public static void addKind(FlatBufferBuilder builder, long kind) { builder.addLong(0, kind, 0L); }
56
+ public static void addPubkey(FlatBufferBuilder builder, int pubkeyOffset) { builder.addOffset(1, pubkeyOffset, 0); }
57
+ public static void addD(FlatBufferBuilder builder, int dOffset) { builder.addOffset(2, dOffset, 0); }
58
+ public static void addRelays(FlatBufferBuilder builder, int relaysOffset) { builder.addOffset(3, relaysOffset, 0); }
59
+ public static int createRelaysVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }
60
+ public static void startRelaysVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
61
+ public static int endAddressPointer(FlatBufferBuilder builder) {
62
+ int o = builder.endTable();
63
+ builder.required(o, 6); // pubkey
64
+ builder.required(o, 8); // d
65
+ return o;
66
+ }
67
+
68
+ public static final class Vector extends BaseVector {
69
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
70
+
71
+ public AddressPointer get(int j) { return get(new AddressPointer(), j); }
72
+ public AddressPointer get(AddressPointer obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
73
+ }
74
+ }
75
+
@@ -0,0 +1,102 @@
1
+ // automatically generated by the FlatBuffers compiler, do not modify
2
+
3
+ package nostr.fb;
4
+
5
+ import com.google.flatbuffers.BaseVector;
6
+ import com.google.flatbuffers.BooleanVector;
7
+ import com.google.flatbuffers.ByteVector;
8
+ import com.google.flatbuffers.Constants;
9
+ import com.google.flatbuffers.DoubleVector;
10
+ import com.google.flatbuffers.FlatBufferBuilder;
11
+ import com.google.flatbuffers.FloatVector;
12
+ import com.google.flatbuffers.IntVector;
13
+ import com.google.flatbuffers.LongVector;
14
+ import com.google.flatbuffers.ShortVector;
15
+ import com.google.flatbuffers.StringVector;
16
+ import com.google.flatbuffers.Struct;
17
+ import com.google.flatbuffers.UnionVector;
18
+ import java.nio.ByteBuffer;
19
+ import java.nio.ByteOrder;
20
+
21
+ @SuppressWarnings("unused")
22
+ public final class ArticleBlock extends com.google.flatbuffers.Table {
23
+ public static void ValidateVersion() { Constants.FLATBUFFERS_25_2_10(); }
24
+ public static ArticleBlock getRootAsArticleBlock(ByteBuffer _bb) { return getRootAsArticleBlock(_bb, new ArticleBlock()); }
25
+ public static ArticleBlock getRootAsArticleBlock(ByteBuffer _bb, ArticleBlock obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
26
+ public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
27
+ public ArticleBlock __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
28
+
29
+ public byte type() { int o = __offset(4); return o != 0 ? bb.get(o + bb_pos) : 0; }
30
+ public String text() { int o = __offset(6); return o != 0 ? __string(o + bb_pos) : null; }
31
+ public ByteBuffer textAsByteBuffer() { return __vector_as_bytebuffer(6, 1); }
32
+ public ByteBuffer textInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 6, 1); }
33
+ public String url() { int o = __offset(8); return o != 0 ? __string(o + bb_pos) : null; }
34
+ public ByteBuffer urlAsByteBuffer() { return __vector_as_bytebuffer(8, 1); }
35
+ public ByteBuffer urlInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 8, 1); }
36
+ public String language() { int o = __offset(10); return o != 0 ? __string(o + bb_pos) : null; }
37
+ public ByteBuffer languageAsByteBuffer() { return __vector_as_bytebuffer(10, 1); }
38
+ public ByteBuffer languageInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 10, 1); }
39
+ public int depth() { int o = __offset(12); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 0; }
40
+ public boolean ordered() { int o = __offset(14); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }
41
+ public long start() { int o = __offset(16); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
42
+ public nostr.fb.ArticleInline inlines(int j) { return inlines(new nostr.fb.ArticleInline(), j); }
43
+ public nostr.fb.ArticleInline inlines(nostr.fb.ArticleInline obj, int j) { int o = __offset(18); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }
44
+ public int inlinesLength() { int o = __offset(18); return o != 0 ? __vector_len(o) : 0; }
45
+ public nostr.fb.ArticleInline.Vector inlinesVector() { return inlinesVector(new nostr.fb.ArticleInline.Vector()); }
46
+ public nostr.fb.ArticleInline.Vector inlinesVector(nostr.fb.ArticleInline.Vector obj) { int o = __offset(18); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
47
+ public nostr.fb.ArticleBlock children(int j) { return children(new nostr.fb.ArticleBlock(), j); }
48
+ public nostr.fb.ArticleBlock children(nostr.fb.ArticleBlock obj, int j) { int o = __offset(20); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }
49
+ public int childrenLength() { int o = __offset(20); return o != 0 ? __vector_len(o) : 0; }
50
+ public nostr.fb.ArticleBlock.Vector childrenVector() { return childrenVector(new nostr.fb.ArticleBlock.Vector()); }
51
+ public nostr.fb.ArticleBlock.Vector childrenVector(nostr.fb.ArticleBlock.Vector obj) { int o = __offset(20); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
52
+
53
+ public static int createArticleBlock(FlatBufferBuilder builder,
54
+ byte type,
55
+ int textOffset,
56
+ int urlOffset,
57
+ int languageOffset,
58
+ int depth,
59
+ boolean ordered,
60
+ long start,
61
+ int inlinesOffset,
62
+ int childrenOffset) {
63
+ builder.startTable(9);
64
+ ArticleBlock.addStart(builder, start);
65
+ ArticleBlock.addChildren(builder, childrenOffset);
66
+ ArticleBlock.addInlines(builder, inlinesOffset);
67
+ ArticleBlock.addLanguage(builder, languageOffset);
68
+ ArticleBlock.addUrl(builder, urlOffset);
69
+ ArticleBlock.addText(builder, textOffset);
70
+ ArticleBlock.addOrdered(builder, ordered);
71
+ ArticleBlock.addDepth(builder, depth);
72
+ ArticleBlock.addType(builder, type);
73
+ return ArticleBlock.endArticleBlock(builder);
74
+ }
75
+
76
+ public static void startArticleBlock(FlatBufferBuilder builder) { builder.startTable(9); }
77
+ public static void addType(FlatBufferBuilder builder, byte type) { builder.addByte(0, type, 0); }
78
+ public static void addText(FlatBufferBuilder builder, int textOffset) { builder.addOffset(1, textOffset, 0); }
79
+ public static void addUrl(FlatBufferBuilder builder, int urlOffset) { builder.addOffset(2, urlOffset, 0); }
80
+ public static void addLanguage(FlatBufferBuilder builder, int languageOffset) { builder.addOffset(3, languageOffset, 0); }
81
+ public static void addDepth(FlatBufferBuilder builder, int depth) { builder.addByte(4, (byte) depth, (byte) 0); }
82
+ public static void addOrdered(FlatBufferBuilder builder, boolean ordered) { builder.addBoolean(5, ordered, false); }
83
+ public static void addStart(FlatBufferBuilder builder, long start) { builder.addLong(6, start, 0L); }
84
+ public static void addInlines(FlatBufferBuilder builder, int inlinesOffset) { builder.addOffset(7, inlinesOffset, 0); }
85
+ public static int createInlinesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }
86
+ public static void startInlinesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
87
+ public static void addChildren(FlatBufferBuilder builder, int childrenOffset) { builder.addOffset(8, childrenOffset, 0); }
88
+ public static int createChildrenVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }
89
+ public static void startChildrenVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
90
+ public static int endArticleBlock(FlatBufferBuilder builder) {
91
+ int o = builder.endTable();
92
+ return o;
93
+ }
94
+
95
+ public static final class Vector extends BaseVector {
96
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
97
+
98
+ public ArticleBlock get(int j) { return get(new ArticleBlock(), j); }
99
+ public ArticleBlock get(ArticleBlock obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
100
+ }
101
+ }
102
+
@@ -0,0 +1,23 @@
1
+ // automatically generated by the FlatBuffers compiler, do not modify
2
+
3
+ package nostr.fb;
4
+
5
+ @SuppressWarnings("unused")
6
+ public final class ArticleBlockType {
7
+ private ArticleBlockType() { }
8
+ public static final byte Paragraph = 0;
9
+ public static final byte Heading = 1;
10
+ public static final byte Blockquote = 2;
11
+ public static final byte List = 3;
12
+ public static final byte ListItem = 4;
13
+ public static final byte CodeBlock = 5;
14
+ public static final byte Image = 6;
15
+ public static final byte Video = 7;
16
+ public static final byte ThematicBreak = 8;
17
+ public static final byte Html = 9;
18
+
19
+ public static final String[] names = { "Paragraph", "Heading", "Blockquote", "List", "ListItem", "CodeBlock", "Image", "Video", "ThematicBreak", "Html", };
20
+
21
+ public static String name(int e) { return names[e]; }
22
+ }
23
+