@zlink-systems/zlink 0.17.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +198 -0
  3. package/README.typedoc.md +56 -0
  4. package/THIRD_PARTY_NOTICES.md +84 -0
  5. package/binding.gyp +27 -0
  6. package/dist/index.d.mts +3 -0
  7. package/dist/index.d.ts +24 -0
  8. package/dist/index.js +117 -0
  9. package/dist/index.mjs +4 -0
  10. package/dist/zlink/contracts/core/buffer_like.d.ts +2 -0
  11. package/dist/zlink/contracts/core/buffer_like.js +3 -0
  12. package/dist/zlink/contracts/core/context.d.ts +103 -0
  13. package/dist/zlink/contracts/core/context.js +11 -0
  14. package/dist/zlink/contracts/core/index.d.ts +3 -0
  15. package/dist/zlink/contracts/core/index.js +20 -0
  16. package/dist/zlink/contracts/core/routing_id.d.ts +28 -0
  17. package/dist/zlink/contracts/core/routing_id.js +120 -0
  18. package/dist/zlink/contracts/errors/errors.d.ts +44 -0
  19. package/dist/zlink/contracts/errors/errors.js +89 -0
  20. package/dist/zlink/contracts/errors/index.d.ts +2 -0
  21. package/dist/zlink/contracts/errors/index.js +29 -0
  22. package/dist/zlink/contracts/errors/results.d.ts +106 -0
  23. package/dist/zlink/contracts/errors/results.js +102 -0
  24. package/dist/zlink/contracts/eventing/index.d.ts +3 -0
  25. package/dist/zlink/contracts/eventing/index.js +20 -0
  26. package/dist/zlink/contracts/eventing/monitor.d.ts +157 -0
  27. package/dist/zlink/contracts/eventing/monitor.js +82 -0
  28. package/dist/zlink/contracts/eventing/poller.d.ts +76 -0
  29. package/dist/zlink/contracts/eventing/poller.js +3 -0
  30. package/dist/zlink/contracts/eventing/timer.d.ts +38 -0
  31. package/dist/zlink/contracts/eventing/timer.js +3 -0
  32. package/dist/zlink/contracts/index.d.ts +5 -0
  33. package/dist/zlink/contracts/index.js +22 -0
  34. package/dist/zlink/contracts/messaging/handlers.d.ts +5 -0
  35. package/dist/zlink/contracts/messaging/handlers.js +3 -0
  36. package/dist/zlink/contracts/messaging/index.d.ts +8 -0
  37. package/dist/zlink/contracts/messaging/index.js +15 -0
  38. package/dist/zlink/contracts/messaging/message.d.ts +68 -0
  39. package/dist/zlink/contracts/messaging/message.js +280 -0
  40. package/dist/zlink/contracts/messaging/message_parts_envelope.d.ts +14 -0
  41. package/dist/zlink/contracts/messaging/message_parts_envelope.js +56 -0
  42. package/dist/zlink/contracts/messaging/operations.d.ts +54 -0
  43. package/dist/zlink/contracts/messaging/operations.js +3 -0
  44. package/dist/zlink/contracts/messaging/received.d.ts +41 -0
  45. package/dist/zlink/contracts/messaging/received.js +130 -0
  46. package/dist/zlink/contracts/messaging/stream_packet.d.ts +14 -0
  47. package/dist/zlink/contracts/messaging/stream_packet.js +33 -0
  48. package/dist/zlink/contracts/messaging/subscription_event.d.ts +12 -0
  49. package/dist/zlink/contracts/messaging/subscription_event.js +20 -0
  50. package/dist/zlink/contracts/messaging/topic_message.d.ts +14 -0
  51. package/dist/zlink/contracts/messaging/topic_message.js +36 -0
  52. package/dist/zlink/contracts/sockets/dealer_socket.d.ts +29 -0
  53. package/dist/zlink/contracts/sockets/dealer_socket.js +3 -0
  54. package/dist/zlink/contracts/sockets/index.d.ts +10 -0
  55. package/dist/zlink/contracts/sockets/index.js +15 -0
  56. package/dist/zlink/contracts/sockets/pair_socket.d.ts +20 -0
  57. package/dist/zlink/contracts/sockets/pair_socket.js +3 -0
  58. package/dist/zlink/contracts/sockets/pubsub_sockets.d.ts +40 -0
  59. package/dist/zlink/contracts/sockets/pubsub_sockets.js +3 -0
  60. package/dist/zlink/contracts/sockets/router_socket.d.ts +32 -0
  61. package/dist/zlink/contracts/sockets/router_socket.js +3 -0
  62. package/dist/zlink/contracts/sockets/socket.d.ts +58 -0
  63. package/dist/zlink/contracts/sockets/socket.js +3 -0
  64. package/dist/zlink/contracts/sockets/socket_constants.d.ts +88 -0
  65. package/dist/zlink/contracts/sockets/socket_constants.js +67 -0
  66. package/dist/zlink/contracts/sockets/socket_options.d.ts +105 -0
  67. package/dist/zlink/contracts/sockets/socket_options.js +3 -0
  68. package/dist/zlink/contracts/sockets/stream_socket.d.ts +31 -0
  69. package/dist/zlink/contracts/sockets/stream_socket.js +3 -0
  70. package/dist/zlink/runtime/buffers/message_conversion.d.ts +6 -0
  71. package/dist/zlink/runtime/buffers/message_conversion.js +49 -0
  72. package/dist/zlink/runtime/core/context.d.ts +43 -0
  73. package/dist/zlink/runtime/core/context.js +150 -0
  74. package/dist/zlink/runtime/core/context_options.d.ts +19 -0
  75. package/dist/zlink/runtime/core/context_options.js +23 -0
  76. package/dist/zlink/runtime/core/routing_id.d.ts +3 -0
  77. package/dist/zlink/runtime/core/routing_id.js +30 -0
  78. package/dist/zlink/runtime/core/routing_id_conversion.d.ts +2 -0
  79. package/dist/zlink/runtime/core/routing_id_conversion.js +11 -0
  80. package/dist/zlink/runtime/core/runtime_info.d.ts +8 -0
  81. package/dist/zlink/runtime/core/runtime_info.js +39 -0
  82. package/dist/zlink/runtime/errors/error_mapping.d.ts +4 -0
  83. package/dist/zlink/runtime/errors/error_mapping.js +132 -0
  84. package/dist/zlink/runtime/errors/error_state.d.ts +1 -0
  85. package/dist/zlink/runtime/errors/error_state.js +15 -0
  86. package/dist/zlink/runtime/errors/native_errors.d.ts +16 -0
  87. package/dist/zlink/runtime/errors/native_errors.js +86 -0
  88. package/dist/zlink/runtime/eventing/counters.d.ts +16 -0
  89. package/dist/zlink/runtime/eventing/counters.js +33 -0
  90. package/dist/zlink/runtime/eventing/index.d.ts +6 -0
  91. package/dist/zlink/runtime/eventing/index.js +22 -0
  92. package/dist/zlink/runtime/eventing/monitor_event_state.d.ts +3 -0
  93. package/dist/zlink/runtime/eventing/monitor_event_state.js +19 -0
  94. package/dist/zlink/runtime/eventing/monitor_raw.d.ts +50 -0
  95. package/dist/zlink/runtime/eventing/monitor_raw.js +3 -0
  96. package/dist/zlink/runtime/eventing/monitor_socket.d.ts +9 -0
  97. package/dist/zlink/runtime/eventing/monitor_socket.js +39 -0
  98. package/dist/zlink/runtime/eventing/monitor_status.d.ts +3 -0
  99. package/dist/zlink/runtime/eventing/monitor_status.js +52 -0
  100. package/dist/zlink/runtime/eventing/poll_events.d.ts +20 -0
  101. package/dist/zlink/runtime/eventing/poll_events.js +92 -0
  102. package/dist/zlink/runtime/eventing/poller.d.ts +34 -0
  103. package/dist/zlink/runtime/eventing/poller.js +275 -0
  104. package/dist/zlink/runtime/eventing/thread.d.ts +6 -0
  105. package/dist/zlink/runtime/eventing/thread.js +52 -0
  106. package/dist/zlink/runtime/eventing/timer.d.ts +8 -0
  107. package/dist/zlink/runtime/eventing/timer.js +45 -0
  108. package/dist/zlink/runtime/handles/native_handle.d.ts +7 -0
  109. package/dist/zlink/runtime/handles/native_handle.js +24 -0
  110. package/dist/zlink/runtime/messaging/completion_owner.d.ts +86 -0
  111. package/dist/zlink/runtime/messaging/completion_owner.js +570 -0
  112. package/dist/zlink/runtime/messaging/message_materializer.d.ts +36 -0
  113. package/dist/zlink/runtime/messaging/message_materializer.js +199 -0
  114. package/dist/zlink/runtime/messaging/message_parts_state.d.ts +4 -0
  115. package/dist/zlink/runtime/messaging/message_parts_state.js +20 -0
  116. package/dist/zlink/runtime/messaging/message_snapshot.d.ts +13 -0
  117. package/dist/zlink/runtime/messaging/message_snapshot.js +42 -0
  118. package/dist/zlink/runtime/messaging/received_operations.d.ts +5 -0
  119. package/dist/zlink/runtime/messaging/received_operations.js +46 -0
  120. package/dist/zlink/runtime/messaging/received_state.d.ts +13 -0
  121. package/dist/zlink/runtime/messaging/received_state.js +29 -0
  122. package/dist/zlink/runtime/messaging/request_executor.d.ts +2 -0
  123. package/dist/zlink/runtime/messaging/request_executor.js +8 -0
  124. package/dist/zlink/runtime/messaging/send_operation_base.d.ts +13 -0
  125. package/dist/zlink/runtime/messaging/send_operation_base.js +52 -0
  126. package/dist/zlink/runtime/messaging/subscription_event_state.d.ts +4 -0
  127. package/dist/zlink/runtime/messaging/subscription_event_state.js +17 -0
  128. package/dist/zlink/runtime/messaging/topic_message_state.d.ts +11 -0
  129. package/dist/zlink/runtime/messaging/topic_message_state.js +75 -0
  130. package/dist/zlink/runtime/native/binding.d.ts +6 -0
  131. package/dist/zlink/runtime/native/binding.js +3 -0
  132. package/dist/zlink/runtime/native/binding_context.d.ts +14 -0
  133. package/dist/zlink/runtime/native/binding_context.js +3 -0
  134. package/dist/zlink/runtime/native/binding_core.d.ts +21 -0
  135. package/dist/zlink/runtime/native/binding_core.js +3 -0
  136. package/dist/zlink/runtime/native/binding_eventing.d.ts +40 -0
  137. package/dist/zlink/runtime/native/binding_eventing.js +3 -0
  138. package/dist/zlink/runtime/native/binding_socket.d.ts +52 -0
  139. package/dist/zlink/runtime/native/binding_socket.js +3 -0
  140. package/dist/zlink/runtime/native/binding_types.d.ts +8 -0
  141. package/dist/zlink/runtime/native/binding_types.js +3 -0
  142. package/dist/zlink/runtime/native/native.d.ts +2 -0
  143. package/dist/zlink/runtime/native/native.js +40 -0
  144. package/dist/zlink/runtime/native/native_load_paths.d.ts +16 -0
  145. package/dist/zlink/runtime/native/native_load_paths.js +165 -0
  146. package/dist/zlink/runtime/options/byte_values.d.ts +3 -0
  147. package/dist/zlink/runtime/options/byte_values.js +27 -0
  148. package/dist/zlink/runtime/options/option_mapping.d.ts +72 -0
  149. package/dist/zlink/runtime/options/option_mapping.js +41 -0
  150. package/dist/zlink/runtime/options/validation.d.ts +1 -0
  151. package/dist/zlink/runtime/options/validation.js +17 -0
  152. package/dist/zlink/runtime/public_bridge.d.ts +6 -0
  153. package/dist/zlink/runtime/public_bridge.js +23 -0
  154. package/dist/zlink/runtime/sockets/dealer_socket.d.ts +16 -0
  155. package/dist/zlink/runtime/sockets/dealer_socket.js +56 -0
  156. package/dist/zlink/runtime/sockets/index.d.ts +19 -0
  157. package/dist/zlink/runtime/sockets/index.js +27 -0
  158. package/dist/zlink/runtime/sockets/pair_socket.d.ts +7 -0
  159. package/dist/zlink/runtime/sockets/pair_socket.js +12 -0
  160. package/dist/zlink/runtime/sockets/pub_socket.d.ts +7 -0
  161. package/dist/zlink/runtime/sockets/pub_socket.js +12 -0
  162. package/dist/zlink/runtime/sockets/router_socket.d.ts +19 -0
  163. package/dist/zlink/runtime/sockets/router_socket.js +70 -0
  164. package/dist/zlink/runtime/sockets/socket_base.d.ts +21 -0
  165. package/dist/zlink/runtime/sockets/socket_base.js +102 -0
  166. package/dist/zlink/runtime/sockets/socket_operation_builders.d.ts +38 -0
  167. package/dist/zlink/runtime/sockets/socket_operation_builders.js +93 -0
  168. package/dist/zlink/runtime/sockets/socket_operations.d.ts +40 -0
  169. package/dist/zlink/runtime/sockets/socket_operations.js +177 -0
  170. package/dist/zlink/runtime/sockets/socket_options.d.ts +104 -0
  171. package/dist/zlink/runtime/sockets/socket_options.js +259 -0
  172. package/dist/zlink/runtime/sockets/socket_submit_errors.d.ts +3 -0
  173. package/dist/zlink/runtime/sockets/socket_submit_errors.js +13 -0
  174. package/dist/zlink/runtime/sockets/stream_socket.d.ts +15 -0
  175. package/dist/zlink/runtime/sockets/stream_socket.js +93 -0
  176. package/dist/zlink/runtime/sockets/sub_socket.d.ts +7 -0
  177. package/dist/zlink/runtime/sockets/sub_socket.js +12 -0
  178. package/dist/zlink/runtime/sockets/xpub_socket.d.ts +10 -0
  179. package/dist/zlink/runtime/sockets/xpub_socket.js +39 -0
  180. package/dist/zlink/runtime/sockets/xsub_socket.d.ts +7 -0
  181. package/dist/zlink/runtime/sockets/xsub_socket.js +12 -0
  182. package/native/src/addon.cc +11 -0
  183. package/native/src/addon_common_api.h +57 -0
  184. package/native/src/addon_core.cc +3974 -0
  185. package/native/src/addon_core_api.h +110 -0
  186. package/native/src/addon_core_options.cc +119 -0
  187. package/native/src/addon_core_options.h +9 -0
  188. package/native/src/addon_exports.cc +151 -0
  189. package/native/src/addon_exports.h +7 -0
  190. package/native/src/addon_message_parts.h +67 -0
  191. package/native/src/addon_message_values.h +345 -0
  192. package/native/src/addon_monitor_status_values.h +71 -0
  193. package/native/src/addon_submit_results.h +30 -0
  194. package/package.json +74 -0
  195. package/prebuilds/linux-x64/libzlink.so.0.17.3 +0 -0
  196. package/prebuilds/linux-x64/zlink.node +0 -0
  197. package/provenance/core-package-provenance.json +73 -0
  198. package/scripts/install.js +37 -0
  199. package/scripts/resolve_core.js +86 -0
@@ -0,0 +1,345 @@
1
+ /* SPDX-License-Identifier: MPL-2.0 */
2
+
3
+ #pragma once
4
+
5
+ #include "addon_common_api.h"
6
+
7
+ #include <atomic>
8
+ #include <cstring>
9
+ #include <new>
10
+ #include <vector>
11
+
12
+ // A Message owns this frame. Its Buffer is only a JavaScript view of the
13
+ // zlink_msg_t storage; it is never the owning payload allocation.
14
+ struct native_message_frame_t
15
+ {
16
+ native_message_frame_t () : references (1) {}
17
+ zlink_msg_t message;
18
+ std::atomic<uint32_t> references;
19
+ };
20
+
21
+ struct native_message_frame_handle_t
22
+ {
23
+ explicit native_message_frame_handle_t (native_message_frame_t *frame_) : frame (frame_) {}
24
+ native_message_frame_t *frame;
25
+ };
26
+
27
+ class native_message_frame_pool_t
28
+ {
29
+ public:
30
+ native_message_frame_pool_t () { frames_.reserve (64); }
31
+
32
+ ~native_message_frame_pool_t ()
33
+ {
34
+ for (size_t index = 0; index < frames_.size (); ++index)
35
+ delete frames_[index];
36
+ }
37
+
38
+ native_message_frame_t *acquire ()
39
+ {
40
+ if (frames_.empty ())
41
+ return new (std::nothrow) native_message_frame_t ();
42
+ native_message_frame_t *frame = frames_.back ();
43
+ frames_.pop_back ();
44
+ frame->references.store (1, std::memory_order_relaxed);
45
+ return frame;
46
+ }
47
+
48
+ void recycle (native_message_frame_t *frame)
49
+ {
50
+ // Routed single-part receive creates one frame per message. N-API
51
+ // receive and finalizers run on the owning JS thread, so a bounded
52
+ // thread-local reserve removes allocator traffic without a lock.
53
+ if (frames_.size () < 64) {
54
+ frames_.push_back (frame);
55
+ return;
56
+ }
57
+ delete frame;
58
+ }
59
+
60
+ private:
61
+ std::vector<native_message_frame_t *> frames_;
62
+ };
63
+
64
+ inline native_message_frame_pool_t &native_message_frame_pool ()
65
+ {
66
+ static thread_local native_message_frame_pool_t pool;
67
+ return pool;
68
+ }
69
+
70
+ inline native_message_frame_t *acquire_native_message_frame ()
71
+ {
72
+ return native_message_frame_pool ().acquire ();
73
+ }
74
+
75
+ inline void recycle_native_message_frame (native_message_frame_t *frame)
76
+ {
77
+ native_message_frame_pool ().recycle (frame);
78
+ }
79
+
80
+ inline void retain_native_message_frame (native_message_frame_t *frame)
81
+ {
82
+ frame->references.fetch_add (1, std::memory_order_relaxed);
83
+ }
84
+
85
+ inline void release_native_message_frame (native_message_frame_t *frame)
86
+ {
87
+ if (!frame || frame->references.fetch_sub (1, std::memory_order_acq_rel) != 1)
88
+ return;
89
+ zlink_msg_close (&frame->message);
90
+ recycle_native_message_frame (frame);
91
+ }
92
+
93
+ inline native_message_frame_t *get_native_message_frame (napi_env env, napi_value value,
94
+ const char *error_message)
95
+ {
96
+ native_message_frame_handle_t *handle = NULL;
97
+ if (napi_get_value_external (env, value, reinterpret_cast<void **> (&handle)) != napi_ok
98
+ || !handle || !handle->frame) {
99
+ napi_throw_type_error (env, NULL, error_message);
100
+ return NULL;
101
+ }
102
+ return handle->frame;
103
+ }
104
+
105
+ inline void finalize_native_message_frame (napi_env env, void *data, void *hint)
106
+ {
107
+ (void) env;
108
+ (void) hint;
109
+ native_message_frame_handle_t *handle =
110
+ static_cast<native_message_frame_handle_t *> (data);
111
+ if (!handle)
112
+ return;
113
+ release_native_message_frame (handle->frame);
114
+ delete handle;
115
+ }
116
+
117
+ inline void finalize_native_message_buffer (napi_env env, void *data, void *hint)
118
+ {
119
+ (void) env;
120
+ (void) data;
121
+ release_native_message_frame (static_cast<native_message_frame_t *> (hint));
122
+ }
123
+
124
+ inline napi_value create_native_message_data_buffer (napi_env env, native_message_frame_t *frame)
125
+ {
126
+ napi_value data;
127
+ retain_native_message_frame (frame);
128
+ const napi_status status = napi_create_external_buffer (
129
+ env, zlink_msg_size (&frame->message), zlink_msg_data (&frame->message),
130
+ finalize_native_message_buffer, frame, &data);
131
+ if (status != napi_ok) {
132
+ release_native_message_frame (frame);
133
+ napi_throw_error (env, NULL, "native message buffer creation failed");
134
+ return NULL;
135
+ }
136
+ return data;
137
+ }
138
+
139
+ inline napi_value create_native_message_frame_handle (napi_env env, native_message_frame_t *frame)
140
+ {
141
+ native_message_frame_handle_t *handle =
142
+ new (std::nothrow) native_message_frame_handle_t (frame);
143
+ if (!handle) {
144
+ napi_throw_error (env, NULL, "native message frame handle allocation failed");
145
+ return NULL;
146
+ }
147
+ napi_value native_message;
148
+ retain_native_message_frame (frame);
149
+ const napi_status status = napi_create_external (
150
+ env, handle, finalize_native_message_frame, NULL, &native_message);
151
+ if (status != napi_ok) {
152
+ release_native_message_frame (frame);
153
+ delete handle;
154
+ napi_throw_error (env, NULL, "native message frame creation failed");
155
+ return NULL;
156
+ }
157
+ return native_message;
158
+ }
159
+
160
+ inline napi_value create_native_message_value (napi_env env, native_message_frame_t *frame,
161
+ bool include_data = true)
162
+ {
163
+ napi_value data = NULL;
164
+ if (include_data) {
165
+ data = create_native_message_data_buffer (env, frame);
166
+ if (!data) {
167
+ release_native_message_frame (frame);
168
+ return NULL;
169
+ }
170
+ }
171
+ napi_value native_message = create_native_message_frame_handle (env, frame);
172
+ if (!native_message) {
173
+ release_native_message_frame (frame);
174
+ return NULL;
175
+ }
176
+
177
+ napi_value out;
178
+ napi_create_object (env, &out);
179
+ if (include_data)
180
+ napi_set_named_property (env, out, "data", data);
181
+ napi_set_named_property (env, out, "nativeMessage", native_message);
182
+ release_native_message_frame (frame);
183
+ return out;
184
+ }
185
+
186
+ inline napi_value move_message_to_native_value (napi_env env, zlink_msg_t *source)
187
+ {
188
+ native_message_frame_t *frame = acquire_native_message_frame ();
189
+ if (!frame) {
190
+ napi_throw_error (env, NULL, "native message frame allocation failed");
191
+ return NULL;
192
+ }
193
+ if (zlink_msg_init (&frame->message) != 0) {
194
+ recycle_native_message_frame (frame);
195
+ return throw_last_error (env, "native message frame init failed");
196
+ }
197
+ if (zlink_msg_move (&frame->message, source) != 0) {
198
+ zlink_msg_close (&frame->message);
199
+ recycle_native_message_frame (frame);
200
+ return throw_last_error (env, "native message frame move failed");
201
+ }
202
+ return create_native_message_value (env, frame);
203
+ }
204
+
205
+ inline napi_value move_message_to_native_frame_value (napi_env env, zlink_msg_t *source)
206
+ {
207
+ native_message_frame_t *frame = acquire_native_message_frame ();
208
+ if (!frame) {
209
+ napi_throw_error (env, NULL, "native message frame allocation failed");
210
+ return NULL;
211
+ }
212
+ if (zlink_msg_init (&frame->message) != 0) {
213
+ recycle_native_message_frame (frame);
214
+ return throw_last_error (env, "native message frame init failed");
215
+ }
216
+ if (zlink_msg_move (&frame->message, source) != 0) {
217
+ zlink_msg_close (&frame->message);
218
+ recycle_native_message_frame (frame);
219
+ return throw_last_error (env, "native message frame move failed");
220
+ }
221
+ napi_value native_message = create_native_message_frame_handle (env, frame);
222
+ release_native_message_frame (frame);
223
+ return native_message;
224
+ }
225
+
226
+ inline napi_value create_buffer_copy_or_empty (napi_env env, const void *data, size_t len)
227
+ {
228
+ napi_value out = NULL;
229
+ const napi_status status =
230
+ napi_create_buffer_copy (env, len, len == 0 ? NULL : data, NULL, &out);
231
+ if (status != napi_ok) {
232
+ napi_throw_error (env, NULL, "message buffer allocation failed");
233
+ return NULL;
234
+ }
235
+ return out;
236
+ }
237
+
238
+ // Receive materialization copies payload bytes into a JS-owned Buffer.
239
+ inline napi_value create_received_message_buffer (napi_env env, zlink_msg_t *msg)
240
+ {
241
+ return create_buffer_copy_or_empty (env, zlink_msg_data (msg), zlink_msg_size (msg));
242
+ }
243
+
244
+ inline napi_value create_routing_id_value (napi_env env, const zlink_routing_id_t &rid)
245
+ {
246
+ if (rid.size == 0) {
247
+ napi_value none;
248
+ napi_get_null (env, &none);
249
+ return none;
250
+ }
251
+ return create_buffer_copy_or_empty (env, rid.data, rid.size);
252
+ }
253
+
254
+ inline napi_value create_routing_id_value_reusing (
255
+ napi_env env, const zlink_routing_id_t &rid, napi_value candidate)
256
+ {
257
+ if (candidate != NULL && rid.size > 0) {
258
+ bool is_buffer = false;
259
+ if (napi_is_buffer (env, candidate, &is_buffer) == napi_ok && is_buffer) {
260
+ void *data = NULL;
261
+ size_t size = 0;
262
+ if (napi_get_buffer_info (env, candidate, &data, &size) == napi_ok
263
+ && size == rid.size
264
+ && std::memcmp (data, rid.data, size) == 0) {
265
+ // HOT PATH: stable routed peers repeat the same small identity
266
+ // on every receive. Reuse the caller-held Buffer after byte
267
+ // validation instead of allocating and copying it again.
268
+ return candidate;
269
+ }
270
+ }
271
+ }
272
+ return create_routing_id_value (env, rid);
273
+ }
274
+
275
+ enum message_snapshot_flags_t
276
+ {
277
+ MESSAGE_SNAPSHOT_DEFAULT = 0,
278
+ MESSAGE_SNAPSHOT_ALWAYS_REF_COUNT = 1 << 0,
279
+ MESSAGE_SNAPSHOT_ALWAYS_PROPERTIES = 1 << 1
280
+ };
281
+
282
+ // The Core raw API exposes no message property API, so the binding derives its
283
+ // synthetic routed identity properties itself and avoids repeated native
284
+ // property probes on every data-only receive.
285
+ inline napi_value create_message_properties_snapshot (napi_env env,
286
+ const zlink_routing_id_t *routing_id,
287
+ zlink_msg_t *msg,
288
+ bool force)
289
+ {
290
+ (void) msg;
291
+ const bool has_routing_id_bytes = routing_id && routing_id->size > 0;
292
+
293
+ if (!has_routing_id_bytes && !force)
294
+ return NULL;
295
+
296
+ napi_value props;
297
+ napi_create_object (env, &props);
298
+
299
+ if (has_routing_id_bytes) {
300
+ napi_value out;
301
+ napi_create_string_utf8 (env, reinterpret_cast<const char *> (routing_id->data),
302
+ routing_id->size, &out);
303
+ napi_set_named_property (env, props, "Routing-Id", out);
304
+ napi_set_named_property (env, props, "Identity", out);
305
+ }
306
+
307
+ return props;
308
+ }
309
+
310
+ inline napi_value create_message_snapshot_value (napi_env env,
311
+ const zlink_routing_id_t *routing_id,
312
+ zlink_msg_t *msg,
313
+ int flags = MESSAGE_SNAPSHOT_DEFAULT)
314
+ {
315
+ napi_value obj;
316
+ napi_create_object (env, &obj);
317
+
318
+ // A freshly received message is solely owned by the binding, so its
319
+ // reference count is always 1 on the receive path and the "refCount" field
320
+ // is omitted. Only query the library when a caller explicitly asks for the
321
+ // count to be surfaced by an explicit diagnostic path.
322
+ int refcnt = 1;
323
+ if (flags & MESSAGE_SNAPSHOT_ALWAYS_REF_COUNT) {
324
+ zlink_config_result_t refcnt_err = ZLINK_CONFIG_OK;
325
+ refcnt = zlink_msg_refcnt (msg, &refcnt_err);
326
+ if (refcnt_err != ZLINK_CONFIG_OK)
327
+ return throw_last_error (env, "message refcnt failed");
328
+ }
329
+
330
+ napi_value data = create_received_message_buffer (env, msg);
331
+ if (!data)
332
+ return NULL;
333
+
334
+ napi_set_named_property (env, obj, "data", data);
335
+ if (refcnt != 1 || (flags & MESSAGE_SNAPSHOT_ALWAYS_REF_COUNT)) {
336
+ napi_value ref_count;
337
+ napi_create_int32 (env, refcnt, &ref_count);
338
+ napi_set_named_property (env, obj, "refCount", ref_count);
339
+ }
340
+ napi_value props = create_message_properties_snapshot (
341
+ env, routing_id, msg, (flags & MESSAGE_SNAPSHOT_ALWAYS_PROPERTIES) != 0);
342
+ if (props)
343
+ napi_set_named_property (env, obj, "properties", props);
344
+ return obj;
345
+ }
@@ -0,0 +1,71 @@
1
+ /* SPDX-License-Identifier: MPL-2.0 */
2
+
3
+ #pragma once
4
+
5
+ #include "addon_common_api.h"
6
+
7
+ inline napi_value create_monitor_status_value (napi_env env,
8
+ const zlink_monitor_status_t &snapshot)
9
+ {
10
+ napi_value obj;
11
+ napi_create_object (env, &obj);
12
+ set_uint32_property (env, obj, "abiVersion", snapshot.abi_version);
13
+ set_uint32_property (env, obj, "structSize", snapshot.struct_size);
14
+ set_uint32_property (env, obj, "sourceKind", static_cast<uint32_t> (snapshot.source_kind));
15
+ set_uint32_property (env, obj, "stateFlags", snapshot.state_flags);
16
+ set_uint32_property (env, obj, "detailFlags", snapshot.detail_flags);
17
+ set_uint64_bigint_property (env, obj, "sndPendingMsgs", snapshot.snd_pending_msgs);
18
+ set_uint64_bigint_property (env, obj, "rcvPendingMsgs", snapshot.rcv_pending_msgs);
19
+ set_uint64_bigint_property (env, obj, "sndPendingBytes", snapshot.snd_pending_bytes);
20
+ set_uint64_bigint_property (env, obj, "rcvPendingBytes", snapshot.rcv_pending_bytes);
21
+ napi_value auto_hwm_enabled;
22
+ napi_get_boolean (env, snapshot.auto_hwm_enabled != 0, &auto_hwm_enabled);
23
+ napi_set_named_property (env, obj, "autoHwmEnabled", auto_hwm_enabled);
24
+ set_uint32_property (env, obj, "autoHwmProfile", snapshot.auto_hwm_profile);
25
+ set_uint32_property (env, obj, "autoHwmRole", snapshot.auto_hwm_role);
26
+ set_uint32_property (env, obj, "autoHwmPolicyClass", snapshot.auto_hwm_policy_class);
27
+ set_uint64_bigint_property (env, obj, "autoHwmPlannedSndHwmBytes",
28
+ snapshot.auto_hwm_planned_sndhwm_bytes);
29
+ set_uint64_bigint_property (env, obj, "autoHwmPlannedRcvHwmBytes",
30
+ snapshot.auto_hwm_planned_rcvhwm_bytes);
31
+ set_uint64_bigint_property (env, obj, "autoHwmAppliedSndHwmBytes",
32
+ snapshot.auto_hwm_applied_sndhwm_bytes);
33
+ set_uint64_bigint_property (env, obj, "autoHwmAppliedRcvHwmBytes",
34
+ snapshot.auto_hwm_applied_rcvhwm_bytes);
35
+ set_int64_property (env, obj, "autoHwmEffectiveSndBuf", snapshot.auto_hwm_effective_sndbuf);
36
+ set_int64_property (env, obj, "autoHwmEffectiveRcvBuf", snapshot.auto_hwm_effective_rcvbuf);
37
+ set_uint64_bigint_property (env, obj, "autoHwmLastRecalcMs",
38
+ snapshot.auto_hwm_last_recalc_ms);
39
+ set_uint32_property (env, obj, "autoHwmLastRecalcReason", snapshot.auto_hwm_last_recalc_reason);
40
+ set_uint32_property (env, obj, "autoHwmSendBlockedRatioPpm",
41
+ snapshot.auto_hwm_send_blocked_ratio_ppm);
42
+ set_uint64_bigint_property (env, obj, "autoHwmDeferredSndHwmBytes",
43
+ snapshot.auto_hwm_deferred_sndhwm_bytes);
44
+ set_uint64_bigint_property (env, obj, "autoHwmDeferredRcvHwmBytes",
45
+ snapshot.auto_hwm_deferred_rcvhwm_bytes);
46
+ napi_value deferred_snd_valid;
47
+ napi_get_boolean (env, snapshot.auto_hwm_deferred_sndhwm_valid != 0, &deferred_snd_valid);
48
+ napi_set_named_property (env, obj, "autoHwmDeferredSndHwmValid", deferred_snd_valid);
49
+ napi_value deferred_rcv_valid;
50
+ napi_get_boolean (env, snapshot.auto_hwm_deferred_rcvhwm_valid != 0, &deferred_rcv_valid);
51
+ napi_set_named_property (env, obj, "autoHwmDeferredRcvHwmValid", deferred_rcv_valid);
52
+ set_uint64_bigint_property (env, obj, "sndBytesInFlight", snapshot.snd_bytes_in_flight);
53
+ set_uint64_bigint_property (env, obj, "rcvBytesInFlight", snapshot.rcv_bytes_in_flight);
54
+ set_uint64_bigint_property (env, obj, "minimumCoreMessageChargeBytes",
55
+ snapshot.minimum_core_message_charge_bytes);
56
+ set_uint64_bigint_property (env, obj, "oversizeMessageAdmissionCount",
57
+ snapshot.oversize_message_admission_count);
58
+ set_uint64_bigint_property (env, obj, "oversizeMessageAdmissionMaxBytes",
59
+ snapshot.oversize_message_admission_max_bytes);
60
+ set_uint64_bigint_property (env, obj, "flowPausedConnections",
61
+ snapshot.flow_paused_connections);
62
+ set_uint64_bigint_property (env, obj, "flowPauseAppliedTotal",
63
+ snapshot.flow_pause_applied_total);
64
+ set_uint64_bigint_property (env, obj, "flowResumeAppliedTotal",
65
+ snapshot.flow_resume_applied_total);
66
+ set_uint64_bigint_property (env, obj, "flowStateStaleTotal",
67
+ snapshot.flow_state_stale_total);
68
+ set_uint64_bigint_property (env, obj, "flowPauseDurationMs",
69
+ snapshot.flow_pause_duration_ms);
70
+ return obj;
71
+ }
@@ -0,0 +1,30 @@
1
+ /* SPDX-License-Identifier: MPL-2.0 */
2
+
3
+ #pragma once
4
+
5
+ #include "addon_common_api.h"
6
+
7
+ #include <errno.h>
8
+
9
+ inline int preserve_try_send_result (int result)
10
+ {
11
+ if (result >= ZLINK_SUBMIT_OK)
12
+ return result;
13
+
14
+ switch (zlink_errno ()) {
15
+ case EAGAIN:
16
+ return ZLINK_SUBMIT_BACKPRESSURED;
17
+ #ifdef ENOTCONN
18
+ case ENOTCONN:
19
+ #endif
20
+ #ifdef EHOSTUNREACH
21
+ case EHOSTUNREACH:
22
+ #endif
23
+ #ifdef ETIMEDOUT
24
+ case ETIMEDOUT:
25
+ #endif
26
+ return ZLINK_SUBMIT_NOT_CONNECTED;
27
+ default:
28
+ return -1;
29
+ }
30
+ }
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@zlink-systems/zlink",
3
+ "version": "0.17.3",
4
+ "description": "zlink Node.js bindings \u2014 high-performance async messaging library",
5
+ "license": "MPL-2.0",
6
+ "author": "Zlink Systems",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/zlink-systems/zlink.git",
10
+ "directory": "bindings/node"
11
+ },
12
+ "homepage": "https://zlink.systems/",
13
+ "bugs": {
14
+ "url": "https://github.com/zlink-systems/zlink/issues"
15
+ },
16
+ "publishConfig": {
17
+ "access": "public",
18
+ "provenance": true
19
+ },
20
+ "engines": {
21
+ "node": ">=22"
22
+ },
23
+ "main": "dist/index.js",
24
+ "module": "dist/index.mjs",
25
+ "types": "dist/index.d.ts",
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.mjs",
30
+ "require": "./dist/index.js"
31
+ }
32
+ },
33
+ "files": [
34
+ "dist/**/*",
35
+ "prebuilds/**/zlink.node",
36
+ "prebuilds/linux-*/libzlink.so.*.*.*",
37
+ "prebuilds/darwin-*/*.dylib",
38
+ "prebuilds/win32-*/*.dll",
39
+ "provenance/core-package-provenance.json",
40
+ "native/src/**/*",
41
+ "scripts/install.js",
42
+ "scripts/resolve_core.js",
43
+ "binding.gyp",
44
+ "README.md",
45
+ "LICENSE",
46
+ "THIRD_PARTY_NOTICES.md"
47
+ ],
48
+ "gypfile": true,
49
+ "scripts": {
50
+ "install": "node scripts/install.js",
51
+ "clean": "node scripts/clean.js",
52
+ "build": "npm run clean && npm run build:incremental",
53
+ "build:incremental": "tsc -p tsconfig.json && node scripts/generate_esm_wrapper.js && tsc -p tsconfig.tools.json && node scripts/link_dist_tools.js",
54
+ "verify:prebuilds": "node scripts/verify_prebuilds.js",
55
+ "rebuild-native": "./scripts/rebuild_native.sh",
56
+ "perf:single": "./perf/single/run_benchmarks.sh",
57
+ "perf:multi": "./perf/multi/run_benchmarks.sh",
58
+ "perf": "./perf/run_benchmarks.sh",
59
+ "typecheck": "tsc -p tsconfig.typecheck.json",
60
+ "typecheck:src-review": "tsc -p tsconfig.src-review.json",
61
+ "prepare": "npm run build",
62
+ "pretest": "npm run build && npm run typecheck && npm run rebuild-native",
63
+ "test": "./tests/run_tests.sh",
64
+ "presamples": "npm run build && npm run rebuild-native",
65
+ "samples": "./samples/run_samples.sh"
66
+ },
67
+ "dependencies": {
68
+ "@types/node": "^22.15.30"
69
+ },
70
+ "devDependencies": {
71
+ "node-gyp": "^12.4.0",
72
+ "typescript": "^5.8.3"
73
+ }
74
+ }
Binary file
@@ -0,0 +1,73 @@
1
+ {
2
+ "schema": 1,
3
+ "package": "zlink-core",
4
+ "version": "0.17.3",
5
+ "abiMajor": 0,
6
+ "runtime": {
7
+ "path": "lib/libzlink.so.0.17.3",
8
+ "sha256": "dc518b5fde5b6fba348612774cb5d0976a9867890604430ba737b0b3bb565d40",
9
+ "soname": "libzlink.so.0"
10
+ },
11
+ "source": {
12
+ "revision": "0761c1d4d06cec7fb207178e12fc28e5f2557c97",
13
+ "dirty": false
14
+ },
15
+ "release": {
16
+ "tag": "core/v0.17.3",
17
+ "checksumsSha256": "c92058fba62fb9087a3a4220f0f9bc12816b5fcfe31c05edbea6929bcf023ed8"
18
+ },
19
+ "files": [
20
+ {
21
+ "path": "include/zlink_enum.h",
22
+ "sha256": "a7d0fec0f0c6a35cd21d8a25adda44d4ec2ab4bcd66854fbd9271c6445ee3e22"
23
+ },
24
+ {
25
+ "path": "include/zlink_errno.h",
26
+ "sha256": "aad14ff78cd7a890b660163387290070ab60b6bcea9c6627ceb64094013b3faa"
27
+ },
28
+ {
29
+ "path": "include/zlink.h",
30
+ "sha256": "2f01c667960154f79c0e2c5c10a7bba72b129d025230b0c3efb951456cd420ea"
31
+ },
32
+ {
33
+ "path": "include/zlink/common.h",
34
+ "sha256": "8adb46869a3fb570e7a46a9c415f2dedb15fee1e2b3cfb640959f38876444ef4"
35
+ },
36
+ {
37
+ "path": "include/zlink/core/api.h",
38
+ "sha256": "8a6cd736ab2bd477edd5d8845445c844682a2783b5e10b313aab5c5b76c560f1"
39
+ },
40
+ {
41
+ "path": "include/zlink/eventing/api.h",
42
+ "sha256": "c2444588975fafd996c5154e2f06a48d6b2bae4dbd7af5e4a08cb3c593684341"
43
+ },
44
+ {
45
+ "path": "include/zlink/message/api.h",
46
+ "sha256": "2bccce404fcda4da6d20c82e74c33993453f3a4fd4b2b1aa1578f6e32b0ba525"
47
+ },
48
+ {
49
+ "path": "include/zlink/socket/api.h",
50
+ "sha256": "257ea1f9af25f402087f8052750131030fb89273b12944713ef0a50eded89dad"
51
+ },
52
+ {
53
+ "path": "lib/cmake/zlink/zlinkConfig.cmake",
54
+ "sha256": "b462641e7111910a0b0ed581c060e7846b2de6879683cfe9cc976171d7b1ba41"
55
+ },
56
+ {
57
+ "path": "lib/cmake/zlink/zlinkConfigVersion.cmake",
58
+ "sha256": "755d8eef89428cfba9d3077400112f93666f9a59f93c01e61aed6dc730529ed8"
59
+ },
60
+ {
61
+ "path": "lib/libzlink.so.0.17.3",
62
+ "sha256": "dc518b5fde5b6fba348612774cb5d0976a9867890604430ba737b0b3bb565d40"
63
+ },
64
+ {
65
+ "path": "share/zlink/release-checksums.txt",
66
+ "sha256": "c92058fba62fb9087a3a4220f0f9bc12816b5fcfe31c05edbea6929bcf023ed8"
67
+ },
68
+ {
69
+ "path": "share/zlink/release-provenance.txt",
70
+ "sha256": "c1e9373a9f7d65eefac89cd27685b3358c0147b9a7eb0b7a8bd7d8a841765a96"
71
+ }
72
+ ]
73
+ }
@@ -0,0 +1,37 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+
3
+ 'use strict';
4
+
5
+ const fs = require('node:fs');
6
+ const path = require('node:path');
7
+ const { spawnSync } = require('node:child_process');
8
+
9
+ const packageRoot = path.resolve(__dirname, '..');
10
+ const prebuiltAddon = path.join(
11
+ packageRoot,
12
+ 'prebuilds',
13
+ `${process.platform}-${process.arch}`,
14
+ 'zlink.node'
15
+ );
16
+
17
+ if (process.env.ZLINK_SKIP_NATIVE_INSTALL === '1') {
18
+ process.exit(0);
19
+ }
20
+
21
+ // Published packages carry platform prebuilds. A source checkout may not, so
22
+ // retain node-gyp as the development fallback without rebuilding consumers.
23
+ if (fs.existsSync(prebuiltAddon)) {
24
+ process.exit(0);
25
+ }
26
+
27
+ const nodeGyp = process.platform === 'win32' ? 'node-gyp.cmd' : 'node-gyp';
28
+ const result = spawnSync(nodeGyp, ['rebuild'], {
29
+ cwd: packageRoot,
30
+ stdio: 'inherit',
31
+ shell: process.platform === 'win32'
32
+ });
33
+
34
+ if (result.error) {
35
+ throw result.error;
36
+ }
37
+ process.exit(result.status === null ? 1 : result.status);