tigerbeetle-node 0.11.13 → 0.12.1

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 (147) hide show
  1. package/README.md +5 -10
  2. package/dist/bin/aarch64-linux-gnu/client.node +0 -0
  3. package/dist/bin/aarch64-linux-musl/client.node +0 -0
  4. package/dist/bin/aarch64-macos/client.node +0 -0
  5. package/dist/bin/x86_64-linux-gnu/client.node +0 -0
  6. package/dist/bin/x86_64-linux-musl/client.node +0 -0
  7. package/dist/bin/x86_64-macos/client.node +0 -0
  8. package/dist/index.js +33 -1
  9. package/dist/index.js.map +1 -1
  10. package/package-lock.json +66 -0
  11. package/package.json +6 -16
  12. package/src/index.ts +56 -1
  13. package/src/node.zig +9 -9
  14. package/dist/.client.node.sha256 +0 -1
  15. package/scripts/build_lib.sh +0 -61
  16. package/scripts/download_node_headers.sh +0 -32
  17. package/src/tigerbeetle/scripts/benchmark.bat +0 -55
  18. package/src/tigerbeetle/scripts/benchmark.sh +0 -66
  19. package/src/tigerbeetle/scripts/confirm_image.sh +0 -44
  20. package/src/tigerbeetle/scripts/fail_on_diff.sh +0 -9
  21. package/src/tigerbeetle/scripts/fuzz_loop.sh +0 -15
  22. package/src/tigerbeetle/scripts/fuzz_loop_hash_log.sh +0 -12
  23. package/src/tigerbeetle/scripts/fuzz_unique_errors.sh +0 -7
  24. package/src/tigerbeetle/scripts/install.bat +0 -7
  25. package/src/tigerbeetle/scripts/install.sh +0 -21
  26. package/src/tigerbeetle/scripts/install_zig.bat +0 -113
  27. package/src/tigerbeetle/scripts/install_zig.sh +0 -90
  28. package/src/tigerbeetle/scripts/lint.zig +0 -199
  29. package/src/tigerbeetle/scripts/pre-commit.sh +0 -9
  30. package/src/tigerbeetle/scripts/scripts/benchmark.bat +0 -55
  31. package/src/tigerbeetle/scripts/scripts/benchmark.sh +0 -66
  32. package/src/tigerbeetle/scripts/scripts/confirm_image.sh +0 -44
  33. package/src/tigerbeetle/scripts/scripts/fail_on_diff.sh +0 -9
  34. package/src/tigerbeetle/scripts/scripts/fuzz_loop.sh +0 -15
  35. package/src/tigerbeetle/scripts/scripts/fuzz_loop_hash_log.sh +0 -12
  36. package/src/tigerbeetle/scripts/scripts/fuzz_unique_errors.sh +0 -7
  37. package/src/tigerbeetle/scripts/scripts/install.bat +0 -7
  38. package/src/tigerbeetle/scripts/scripts/install.sh +0 -21
  39. package/src/tigerbeetle/scripts/scripts/install_zig.bat +0 -113
  40. package/src/tigerbeetle/scripts/scripts/install_zig.sh +0 -90
  41. package/src/tigerbeetle/scripts/scripts/lint.zig +0 -199
  42. package/src/tigerbeetle/scripts/scripts/pre-commit.sh +0 -9
  43. package/src/tigerbeetle/scripts/scripts/shellcheck.sh +0 -5
  44. package/src/tigerbeetle/scripts/scripts/tests_on_alpine.sh +0 -10
  45. package/src/tigerbeetle/scripts/scripts/tests_on_ubuntu.sh +0 -14
  46. package/src/tigerbeetle/scripts/scripts/upgrade_ubuntu_kernel.sh +0 -48
  47. package/src/tigerbeetle/scripts/scripts/validate_docs.sh +0 -23
  48. package/src/tigerbeetle/scripts/scripts/vr_state_enumerate +0 -46
  49. package/src/tigerbeetle/scripts/shellcheck.sh +0 -5
  50. package/src/tigerbeetle/scripts/tests_on_alpine.sh +0 -10
  51. package/src/tigerbeetle/scripts/tests_on_ubuntu.sh +0 -14
  52. package/src/tigerbeetle/scripts/upgrade_ubuntu_kernel.sh +0 -48
  53. package/src/tigerbeetle/scripts/validate_docs.sh +0 -23
  54. package/src/tigerbeetle/scripts/vr_state_enumerate +0 -46
  55. package/src/tigerbeetle/src/benchmark.zig +0 -336
  56. package/src/tigerbeetle/src/config.zig +0 -233
  57. package/src/tigerbeetle/src/constants.zig +0 -428
  58. package/src/tigerbeetle/src/ewah.zig +0 -286
  59. package/src/tigerbeetle/src/ewah_benchmark.zig +0 -120
  60. package/src/tigerbeetle/src/ewah_fuzz.zig +0 -130
  61. package/src/tigerbeetle/src/fifo.zig +0 -120
  62. package/src/tigerbeetle/src/io/benchmark.zig +0 -213
  63. package/src/tigerbeetle/src/io/darwin.zig +0 -814
  64. package/src/tigerbeetle/src/io/linux.zig +0 -1071
  65. package/src/tigerbeetle/src/io/test.zig +0 -643
  66. package/src/tigerbeetle/src/io/windows.zig +0 -1183
  67. package/src/tigerbeetle/src/io.zig +0 -34
  68. package/src/tigerbeetle/src/iops.zig +0 -107
  69. package/src/tigerbeetle/src/lsm/README.md +0 -308
  70. package/src/tigerbeetle/src/lsm/binary_search.zig +0 -341
  71. package/src/tigerbeetle/src/lsm/bloom_filter.zig +0 -125
  72. package/src/tigerbeetle/src/lsm/compaction.zig +0 -603
  73. package/src/tigerbeetle/src/lsm/composite_key.zig +0 -77
  74. package/src/tigerbeetle/src/lsm/direction.zig +0 -11
  75. package/src/tigerbeetle/src/lsm/eytzinger.zig +0 -587
  76. package/src/tigerbeetle/src/lsm/eytzinger_benchmark.zig +0 -330
  77. package/src/tigerbeetle/src/lsm/forest.zig +0 -205
  78. package/src/tigerbeetle/src/lsm/forest_fuzz.zig +0 -450
  79. package/src/tigerbeetle/src/lsm/grid.zig +0 -573
  80. package/src/tigerbeetle/src/lsm/groove.zig +0 -1036
  81. package/src/tigerbeetle/src/lsm/k_way_merge.zig +0 -474
  82. package/src/tigerbeetle/src/lsm/level_iterator.zig +0 -332
  83. package/src/tigerbeetle/src/lsm/manifest.zig +0 -617
  84. package/src/tigerbeetle/src/lsm/manifest_level.zig +0 -878
  85. package/src/tigerbeetle/src/lsm/manifest_log.zig +0 -789
  86. package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +0 -691
  87. package/src/tigerbeetle/src/lsm/merge_iterator.zig +0 -106
  88. package/src/tigerbeetle/src/lsm/node_pool.zig +0 -235
  89. package/src/tigerbeetle/src/lsm/posted_groove.zig +0 -381
  90. package/src/tigerbeetle/src/lsm/segmented_array.zig +0 -1329
  91. package/src/tigerbeetle/src/lsm/segmented_array_benchmark.zig +0 -148
  92. package/src/tigerbeetle/src/lsm/segmented_array_fuzz.zig +0 -9
  93. package/src/tigerbeetle/src/lsm/set_associative_cache.zig +0 -850
  94. package/src/tigerbeetle/src/lsm/table.zig +0 -1009
  95. package/src/tigerbeetle/src/lsm/table_immutable.zig +0 -192
  96. package/src/tigerbeetle/src/lsm/table_iterator.zig +0 -340
  97. package/src/tigerbeetle/src/lsm/table_mutable.zig +0 -203
  98. package/src/tigerbeetle/src/lsm/test.zig +0 -439
  99. package/src/tigerbeetle/src/lsm/tree.zig +0 -1169
  100. package/src/tigerbeetle/src/lsm/tree_fuzz.zig +0 -479
  101. package/src/tigerbeetle/src/message_bus.zig +0 -1013
  102. package/src/tigerbeetle/src/message_pool.zig +0 -156
  103. package/src/tigerbeetle/src/ring_buffer.zig +0 -399
  104. package/src/tigerbeetle/src/simulator.zig +0 -580
  105. package/src/tigerbeetle/src/state_machine/auditor.zig +0 -578
  106. package/src/tigerbeetle/src/state_machine/workload.zig +0 -883
  107. package/src/tigerbeetle/src/state_machine.zig +0 -2099
  108. package/src/tigerbeetle/src/static_allocator.zig +0 -65
  109. package/src/tigerbeetle/src/stdx.zig +0 -171
  110. package/src/tigerbeetle/src/storage.zig +0 -393
  111. package/src/tigerbeetle/src/testing/cluster/message_bus.zig +0 -82
  112. package/src/tigerbeetle/src/testing/cluster/network.zig +0 -237
  113. package/src/tigerbeetle/src/testing/cluster/state_checker.zig +0 -169
  114. package/src/tigerbeetle/src/testing/cluster/storage_checker.zig +0 -202
  115. package/src/tigerbeetle/src/testing/cluster.zig +0 -444
  116. package/src/tigerbeetle/src/testing/fuzz.zig +0 -140
  117. package/src/tigerbeetle/src/testing/hash_log.zig +0 -66
  118. package/src/tigerbeetle/src/testing/id.zig +0 -99
  119. package/src/tigerbeetle/src/testing/packet_simulator.zig +0 -374
  120. package/src/tigerbeetle/src/testing/priority_queue.zig +0 -645
  121. package/src/tigerbeetle/src/testing/reply_sequence.zig +0 -139
  122. package/src/tigerbeetle/src/testing/state_machine.zig +0 -250
  123. package/src/tigerbeetle/src/testing/storage.zig +0 -757
  124. package/src/tigerbeetle/src/testing/table.zig +0 -247
  125. package/src/tigerbeetle/src/testing/time.zig +0 -84
  126. package/src/tigerbeetle/src/tigerbeetle.zig +0 -227
  127. package/src/tigerbeetle/src/time.zig +0 -112
  128. package/src/tigerbeetle/src/tracer.zig +0 -529
  129. package/src/tigerbeetle/src/unit_tests.zig +0 -40
  130. package/src/tigerbeetle/src/vopr.zig +0 -495
  131. package/src/tigerbeetle/src/vsr/README.md +0 -209
  132. package/src/tigerbeetle/src/vsr/client.zig +0 -544
  133. package/src/tigerbeetle/src/vsr/clock.zig +0 -855
  134. package/src/tigerbeetle/src/vsr/journal.zig +0 -2415
  135. package/src/tigerbeetle/src/vsr/journal_format_fuzz.zig +0 -111
  136. package/src/tigerbeetle/src/vsr/marzullo.zig +0 -309
  137. package/src/tigerbeetle/src/vsr/replica.zig +0 -6616
  138. package/src/tigerbeetle/src/vsr/replica_format.zig +0 -219
  139. package/src/tigerbeetle/src/vsr/superblock.zig +0 -1631
  140. package/src/tigerbeetle/src/vsr/superblock_client_table.zig +0 -256
  141. package/src/tigerbeetle/src/vsr/superblock_free_set.zig +0 -929
  142. package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +0 -334
  143. package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +0 -390
  144. package/src/tigerbeetle/src/vsr/superblock_manifest.zig +0 -615
  145. package/src/tigerbeetle/src/vsr/superblock_quorums.zig +0 -394
  146. package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +0 -314
  147. package/src/tigerbeetle/src/vsr.zig +0 -1425
package/README.md CHANGED
@@ -172,7 +172,7 @@ not necessarily the same as the order of IDs in the
172
172
  request. You can refer to the ID field in the response to
173
173
  distinguish accounts.
174
174
 
175
- In this example, transfer `137` exists while transfer `138` does not.
175
+ In this example, account `137` exists while account `138` does not.
176
176
 
177
177
  ```javascript
178
178
  const accounts = await client.lookupAccounts([137n, 138n]);
@@ -446,8 +446,10 @@ const errors = await client.createTransfers(batch);
446
446
  ### On Linux and macOS
447
447
 
448
448
  ```console
449
- $ git clone https://github.com/tigerbeetledb/tigerbeetle
449
+ $ rm -rf tigerbeetle
450
+ $ git clone https://github.com/${GITHUB_REPOSITY:-tigerbeetledb/tigerbeetle}
450
451
  $ cd tigerbeetle
452
+ $ git checkout $GIT_SHA # Optional
451
453
  $ ./scripts/install_zig.sh
452
454
  $ cd src/clients/node
453
455
  $ npm install --include dev
@@ -456,12 +458,5 @@ $ npm pack
456
458
 
457
459
  ### On Windows
458
460
 
459
- ```console
460
- $ git clone https://github.com/tigerbeetledb/tigerbeetle
461
- $ cd tigerbeetle
462
- $ ./scripts/install_zig.bat
463
- $ npm install --include dev # NOTE! This does not work at the moment (on Windows).
464
- $ cd src/clients/node
465
- $ npm pack
466
- ```
461
+ Unsupported.
467
462
 
package/dist/index.js CHANGED
@@ -1,7 +1,39 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createClient = exports.Operation = exports.CreateTransferError = exports.TransferFlags = exports.CreateAccountError = exports.AccountFlags = void 0;
4
- const binding = require('./client.node');
4
+ function getBinding() {
5
+ const { arch, platform } = process;
6
+ const archMap = {
7
+ "arm64": "aarch64",
8
+ "x64": "x86_64"
9
+ };
10
+ const platformMap = {
11
+ "linux": "linux",
12
+ "darwin": "macos"
13
+ };
14
+ if (!(arch in archMap)) {
15
+ throw new Error(`Unsupported arch: ${arch}`);
16
+ }
17
+ if (!(platform in platformMap)) {
18
+ throw new Error(`Unsupported platform: ${platform}`);
19
+ }
20
+ let extra = '';
21
+ const fs = require('fs');
22
+ const path = require('path');
23
+ if (platform === 'linux') {
24
+ extra = '-gnu';
25
+ for (const file of fs.readdirSync("/proc/self/map_files/")) {
26
+ const realPath = fs.readlinkSync(path.join("/proc/self/map_files/", file));
27
+ if (realPath.includes('musl')) {
28
+ extra = '-musl';
29
+ break;
30
+ }
31
+ }
32
+ }
33
+ const filename = `./bin/${archMap[arch]}-${platformMap[platform]}${extra}/client.node`;
34
+ return require(filename);
35
+ }
36
+ const binding = getBinding();
5
37
  var AccountFlags;
6
38
  (function (AccountFlags) {
7
39
  AccountFlags[AccountFlags["linked"] = 1] = "linked";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const binding: Binding = require('./client.node')\ninterface Binding {\n init: (args: BindingInitArgs) => Context\n request: (context: Context, operation: Operation, batch: Event[], result: ResultCallback) => void\n raw_request: (context: Context, operation: Operation, raw_batch: Buffer, result: ResultCallback) => void\n tick: (context: Context) => void,\n deinit: (context: Context) => void,\n tick_ms: number\n}\n\ninterface BindingInitArgs {\n cluster_id: number, // u32\n replica_addresses: Buffer,\n}\n\nexport interface InitArgs {\n cluster_id: number, // u32\n replica_addresses: Array<string | number>,\n}\n\nexport type Context = object\n\nexport type Account = {\n id: bigint // u128\n user_data: bigint // u128\n reserved: Buffer // [48]u8\n ledger: number // u32, ledger of value\n code: number // u16, A chart of accounts code describing the type of account (e.g. clearing, settlement)\n flags: number // u16\n debits_pending: bigint // u64\n debits_posted: bigint // u64\n credits_pending: bigint // u64\n credits_posted: bigint // u64\n timestamp: bigint // u64, Set this to 0n - the actual value will be set by TigerBeetle server\n}\n\nexport enum AccountFlags {\n linked = (1 << 0),\n debits_must_not_exceed_credits = (1 << 1),\n credits_must_not_exceed_debits = (1 << 2)\n}\n\nexport enum CreateAccountError {\n // ok = 0 (No Error)\n linked_event_failed = 1,\n linked_event_chain_open,\n timestamp_must_be_zero,\n\n reserved_flag,\n reserved_field,\n\n id_must_not_be_zero,\n id_must_not_be_int_max,\n ledger_must_not_be_zero,\n code_must_not_be_zero,\n debits_pending_must_be_zero,\n debits_posted_must_be_zero,\n credits_pending_must_be_zero,\n credits_posted_must_be_zero,\n\n mutually_exclusive_flags,\n\n exists_with_different_flags,\n exists_with_different_user_data,\n exists_with_different_ledger,\n exists_with_different_code,\n exists,\n}\n\nexport type CreateAccountsError = {\n index: number,\n code: CreateAccountError,\n}\n\nexport type Transfer = {\n id: bigint, // u128\n debit_account_id: bigint, // u128\n credit_account_id: bigint, // u128\n user_data: bigint, // u128\n reserved: bigint, // u128\n pending_id: bigint, // u128\n timeout: bigint, // u64, In nanoseconds.\n ledger: number // u32, The ledger of value.\n code: number, // u16, A user-defined accounting code to describe the type of transfer (e.g. settlement).\n flags: number, // u16\n amount: bigint, // u64,\n timestamp: bigint, // u64, Set this to 0n - the timestamp will be set by TigerBeetle.\n}\n\nexport enum TransferFlags {\n linked = (1 << 0),\n pending = (1 << 1),\n post_pending_transfer = (1 << 2),\n void_pending_transfer = (1 << 3)\n}\n\nexport enum CreateTransferError {\n // ok = 0 (No Error)\n linked_event_failed = 1,\n linked_event_chain_open,\n timestamp_must_be_zero,\n\n reserved_flag,\n reserved_field,\n\n id_must_not_be_zero,\n id_must_not_be_int_max,\n debit_account_id_must_not_be_zero,\n debit_account_id_must_not_be_int_max,\n credit_account_id_must_not_be_zero,\n credit_account_id_must_not_be_int_max,\n accounts_must_be_different,\n\n pending_id_must_be_zero,\n\n ledger_must_not_be_zero,\n code_must_not_be_zero,\n amount_must_not_be_zero,\n\n debit_account_not_found,\n credit_account_not_found,\n\n accounts_must_have_the_same_ledger,\n transfer_must_have_the_same_ledger_as_accounts,\n\n exists_with_different_flags,\n exists_with_different_debit_account_id,\n exists_with_different_credit_account_id,\n exists_with_different_user_data,\n exists_with_different_pending_id,\n exists_with_different_timeout,\n exists_with_different_code,\n exists_with_different_amount,\n exists,\n\n overflows_debits_pending,\n overflows_credits_pending,\n overflows_debits_posted,\n overflows_credits_posted,\n overflows_debits,\n overflows_credits,\n overflows_timeout,\n\n exceeds_credits,\n exceeds_debits,\n\n cannot_post_and_void_pending_transfer,\n pending_transfer_cannot_post_or_void_another,\n timeout_reserved_for_pending_transfer,\n\n pending_id_must_not_be_zero,\n pending_id_must_not_be_int_max,\n pending_id_must_be_different,\n\n pending_transfer_not_found,\n pending_transfer_not_pending,\n\n pending_transfer_has_different_debit_account_id,\n pending_transfer_has_different_credit_account_id,\n pending_transfer_has_different_ledger,\n pending_transfer_has_different_code,\n\n exceeds_pending_transfer_amount,\n pending_transfer_has_different_amount,\n\n pending_transfer_already_posted,\n pending_transfer_already_voided,\n\n pending_transfer_expired,\n}\n\nexport type CreateTransfersError = {\n index: number,\n code: CreateTransferError,\n}\n\nexport type AccountID = bigint // u128\nexport type TransferID = bigint // u128\n\nexport type Event = Account | Transfer | AccountID | TransferID\nexport type Result = CreateAccountsError | CreateTransfersError | Account | Transfer\nexport type ResultCallback = (error: undefined | Error, results: Result[]) => void\n\nexport enum Operation {\n CREATE_ACCOUNT = 3,\n CREATE_TRANSFER,\n ACCOUNT_LOOKUP,\n TRANSFER_LOOKUP\n}\n\nexport interface Client {\n createAccounts: (batch: Account[]) => Promise<CreateAccountsError[]>\n createTransfers: (batch: Transfer[]) => Promise<CreateTransfersError[]>\n lookupAccounts: (batch: AccountID[]) => Promise<Account[]>\n lookupTransfers: (batch: TransferID[]) => Promise<Transfer[]>\n request: (operation: Operation, batch: Event[], callback: ResultCallback) => void\n rawRequest: (operation: Operation, rawBatch: Buffer, callback: ResultCallback) => void\n destroy: () => void\n}\n\nlet _args: InitArgs | undefined = undefined\nconst isSameArgs = (args: InitArgs): boolean => {\n if (typeof _args === 'undefined') {\n return false\n }\n\n if (_args.replica_addresses.length !== args.replica_addresses.length) {\n return false\n }\n\n let isSameReplicas = true\n args.replica_addresses.forEach((entry, index) => {\n if (_args?.replica_addresses[index] !== entry) {\n isSameReplicas = false\n }\n })\n\n return args.cluster_id === _args.cluster_id && isSameReplicas\n}\n\nlet _client: Client | undefined = undefined\nlet _interval: NodeJS.Timeout | undefined = undefined\n// Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\nlet _pinged = false\n// TODO: allow creation of clients if the arguments are different. Will require changes in node.zig as well.\nexport function createClient (args: InitArgs): Client {\n const duplicateArgs = isSameArgs(args)\n if (!duplicateArgs && typeof _client !== 'undefined'){\n throw new Error('Client has already been initialized with different arguments.')\n }\n\n if (duplicateArgs && typeof _client !== 'undefined'){\n throw new Error('Client has already been initialized with the same arguments.')\n }\n\n _args = Object.assign({}, { ...args })\n const context = binding.init({\n ...args,\n replica_addresses: Buffer.from(args.replica_addresses.join(','))\n })\n\n const request = (operation: Operation, batch: Event[], callback: ResultCallback) => {\n binding.request(context, operation, batch, callback)\n }\n\n const rawRequest = (operation: Operation, rawBatch: Buffer, callback: ResultCallback) => {\n binding.raw_request(context, operation, rawBatch, callback)\n }\n\n const createAccounts = async (batch: Account[]): Promise<CreateAccountsError[]> => {\n // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\n if (!_pinged) {\n await new Promise<void>(resolve => {\n setTimeout(() => {\n _pinged = true\n resolve()\n }, 600)\n })\n }\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: CreateAccountsError[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.CREATE_ACCOUNT, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const createTransfers = async (batch: Transfer[]): Promise<CreateTransfersError[]> => {\n // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\n if (!_pinged) {\n await new Promise<void>(resolve => {\n setTimeout(() => {\n _pinged = true\n resolve()\n }, 600)\n })\n }\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: CreateTransfersError[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.CREATE_TRANSFER, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const lookupAccounts = async (batch: AccountID[]): Promise<Account[]> => {\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: Account[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.ACCOUNT_LOOKUP, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const lookupTransfers = async (batch: TransferID[]): Promise<Transfer[]> => {\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: Transfer[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.TRANSFER_LOOKUP, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const destroy = (): void => {\n binding.deinit(context)\n if (_interval){\n clearInterval(_interval)\n }\n _client = undefined\n }\n\n _client = {\n createAccounts,\n createTransfers,\n lookupAccounts,\n lookupTransfers,\n request,\n rawRequest,\n destroy\n }\n\n _interval = setInterval(() => {\n binding.tick(context)\n }, binding.tick_ms)\n\n return _client\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["function getBinding (): Binding {\n const { arch, platform } = process\n\n const archMap = {\n \"arm64\": \"aarch64\",\n \"x64\": \"x86_64\"\n }\n\n const platformMap = {\n \"linux\": \"linux\",\n \"darwin\": \"macos\"\n }\n\n if (! (arch in archMap)) {\n throw new Error(`Unsupported arch: ${arch}`)\n }\n\n if (! (platform in platformMap)) {\n throw new Error(`Unsupported platform: ${platform}`)\n }\n\n let extra = ''\n\n /**\n * We need to detect during runtime which libc we're running on to load the correct NAPI.\n * binary.\n *\n * Rationale: The /proc/self/map_files/ subdirectory contains entries corresponding to\n * memory-mapped files loaded by Node.\n * https://man7.org/linux/man-pages/man5/proc.5.html: We detect a musl-based distro by\n * checking if any library contains the name \"musl\".\n *\n * Prior art: https://github.com/xerial/sqlite-jdbc/issues/623\n */\n\n const fs = require('fs')\n const path = require('path')\n\n if (platform === 'linux') {\n extra = '-gnu'\n\n for (const file of fs.readdirSync(\"/proc/self/map_files/\")) {\n const realPath = fs.readlinkSync(path.join(\"/proc/self/map_files/\", file))\n if (realPath.includes('musl')) {\n extra = '-musl'\n break\n }\n }\n }\n\n const filename = `./bin/${archMap[arch]}-${platformMap[platform]}${extra}/client.node`\n return require(filename)\n}\n\nconst binding = getBinding()\n\ninterface Binding {\n init: (args: BindingInitArgs) => Context\n request: (context: Context, operation: Operation, batch: Event[], result: ResultCallback) => void\n raw_request: (context: Context, operation: Operation, raw_batch: Buffer, result: ResultCallback) => void\n tick: (context: Context) => void,\n deinit: (context: Context) => void,\n tick_ms: number\n}\n\ninterface BindingInitArgs {\n cluster_id: number, // u32\n replica_addresses: Buffer,\n}\n\nexport interface InitArgs {\n cluster_id: number, // u32\n replica_addresses: Array<string | number>,\n}\n\nexport type Context = object\n\nexport type Account = {\n id: bigint // u128\n user_data: bigint // u128\n reserved: Buffer // [48]u8\n ledger: number // u32, ledger of value\n code: number // u16, A chart of accounts code describing the type of account (e.g. clearing, settlement)\n flags: number // u16\n debits_pending: bigint // u64\n debits_posted: bigint // u64\n credits_pending: bigint // u64\n credits_posted: bigint // u64\n timestamp: bigint // u64, Set this to 0n - the actual value will be set by TigerBeetle server\n}\n\nexport enum AccountFlags {\n linked = (1 << 0),\n debits_must_not_exceed_credits = (1 << 1),\n credits_must_not_exceed_debits = (1 << 2)\n}\n\nexport enum CreateAccountError {\n // ok = 0 (No Error)\n linked_event_failed = 1,\n linked_event_chain_open,\n timestamp_must_be_zero,\n\n reserved_flag,\n reserved_field,\n\n id_must_not_be_zero,\n id_must_not_be_int_max,\n ledger_must_not_be_zero,\n code_must_not_be_zero,\n debits_pending_must_be_zero,\n debits_posted_must_be_zero,\n credits_pending_must_be_zero,\n credits_posted_must_be_zero,\n\n mutually_exclusive_flags,\n\n exists_with_different_flags,\n exists_with_different_user_data,\n exists_with_different_ledger,\n exists_with_different_code,\n exists,\n}\n\nexport type CreateAccountsError = {\n index: number,\n code: CreateAccountError,\n}\n\nexport type Transfer = {\n id: bigint, // u128\n debit_account_id: bigint, // u128\n credit_account_id: bigint, // u128\n user_data: bigint, // u128\n reserved: bigint, // u128\n pending_id: bigint, // u128\n timeout: bigint, // u64, In nanoseconds.\n ledger: number // u32, The ledger of value.\n code: number, // u16, A user-defined accounting code to describe the type of transfer (e.g. settlement).\n flags: number, // u16\n amount: bigint, // u64,\n timestamp: bigint, // u64, Set this to 0n - the timestamp will be set by TigerBeetle.\n}\n\nexport enum TransferFlags {\n linked = (1 << 0),\n pending = (1 << 1),\n post_pending_transfer = (1 << 2),\n void_pending_transfer = (1 << 3)\n}\n\nexport enum CreateTransferError {\n // ok = 0 (No Error)\n linked_event_failed = 1,\n linked_event_chain_open,\n timestamp_must_be_zero,\n\n reserved_flag,\n reserved_field,\n\n id_must_not_be_zero,\n id_must_not_be_int_max,\n debit_account_id_must_not_be_zero,\n debit_account_id_must_not_be_int_max,\n credit_account_id_must_not_be_zero,\n credit_account_id_must_not_be_int_max,\n accounts_must_be_different,\n\n pending_id_must_be_zero,\n\n ledger_must_not_be_zero,\n code_must_not_be_zero,\n amount_must_not_be_zero,\n\n debit_account_not_found,\n credit_account_not_found,\n\n accounts_must_have_the_same_ledger,\n transfer_must_have_the_same_ledger_as_accounts,\n\n exists_with_different_flags,\n exists_with_different_debit_account_id,\n exists_with_different_credit_account_id,\n exists_with_different_user_data,\n exists_with_different_pending_id,\n exists_with_different_timeout,\n exists_with_different_code,\n exists_with_different_amount,\n exists,\n\n overflows_debits_pending,\n overflows_credits_pending,\n overflows_debits_posted,\n overflows_credits_posted,\n overflows_debits,\n overflows_credits,\n overflows_timeout,\n\n exceeds_credits,\n exceeds_debits,\n\n cannot_post_and_void_pending_transfer,\n pending_transfer_cannot_post_or_void_another,\n timeout_reserved_for_pending_transfer,\n\n pending_id_must_not_be_zero,\n pending_id_must_not_be_int_max,\n pending_id_must_be_different,\n\n pending_transfer_not_found,\n pending_transfer_not_pending,\n\n pending_transfer_has_different_debit_account_id,\n pending_transfer_has_different_credit_account_id,\n pending_transfer_has_different_ledger,\n pending_transfer_has_different_code,\n\n exceeds_pending_transfer_amount,\n pending_transfer_has_different_amount,\n\n pending_transfer_already_posted,\n pending_transfer_already_voided,\n\n pending_transfer_expired,\n}\n\nexport type CreateTransfersError = {\n index: number,\n code: CreateTransferError,\n}\n\nexport type AccountID = bigint // u128\nexport type TransferID = bigint // u128\n\nexport type Event = Account | Transfer | AccountID | TransferID\nexport type Result = CreateAccountsError | CreateTransfersError | Account | Transfer\nexport type ResultCallback = (error: undefined | Error, results: Result[]) => void\n\nexport enum Operation {\n CREATE_ACCOUNT = 3,\n CREATE_TRANSFER,\n ACCOUNT_LOOKUP,\n TRANSFER_LOOKUP\n}\n\nexport interface Client {\n createAccounts: (batch: Account[]) => Promise<CreateAccountsError[]>\n createTransfers: (batch: Transfer[]) => Promise<CreateTransfersError[]>\n lookupAccounts: (batch: AccountID[]) => Promise<Account[]>\n lookupTransfers: (batch: TransferID[]) => Promise<Transfer[]>\n request: (operation: Operation, batch: Event[], callback: ResultCallback) => void\n rawRequest: (operation: Operation, rawBatch: Buffer, callback: ResultCallback) => void\n destroy: () => void\n}\n\nlet _args: InitArgs | undefined = undefined\nconst isSameArgs = (args: InitArgs): boolean => {\n if (typeof _args === 'undefined') {\n return false\n }\n\n if (_args.replica_addresses.length !== args.replica_addresses.length) {\n return false\n }\n\n let isSameReplicas = true\n args.replica_addresses.forEach((entry, index) => {\n if (_args?.replica_addresses[index] !== entry) {\n isSameReplicas = false\n }\n })\n\n return args.cluster_id === _args.cluster_id && isSameReplicas\n}\n\nlet _client: Client | undefined = undefined\nlet _interval: NodeJS.Timeout | undefined = undefined\n// Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\nlet _pinged = false\n// TODO: allow creation of clients if the arguments are different. Will require changes in node.zig as well.\nexport function createClient (args: InitArgs): Client {\n const duplicateArgs = isSameArgs(args)\n if (!duplicateArgs && typeof _client !== 'undefined'){\n throw new Error('Client has already been initialized with different arguments.')\n }\n\n if (duplicateArgs && typeof _client !== 'undefined'){\n throw new Error('Client has already been initialized with the same arguments.')\n }\n\n _args = Object.assign({}, { ...args })\n const context = binding.init({\n ...args,\n replica_addresses: Buffer.from(args.replica_addresses.join(','))\n })\n\n const request = (operation: Operation, batch: Event[], callback: ResultCallback) => {\n binding.request(context, operation, batch, callback)\n }\n\n const rawRequest = (operation: Operation, rawBatch: Buffer, callback: ResultCallback) => {\n binding.raw_request(context, operation, rawBatch, callback)\n }\n\n const createAccounts = async (batch: Account[]): Promise<CreateAccountsError[]> => {\n // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\n if (!_pinged) {\n await new Promise<void>(resolve => {\n setTimeout(() => {\n _pinged = true\n resolve()\n }, 600)\n })\n }\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: CreateAccountsError[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.CREATE_ACCOUNT, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const createTransfers = async (batch: Transfer[]): Promise<CreateTransfersError[]> => {\n // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\n if (!_pinged) {\n await new Promise<void>(resolve => {\n setTimeout(() => {\n _pinged = true\n resolve()\n }, 600)\n })\n }\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: CreateTransfersError[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.CREATE_TRANSFER, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const lookupAccounts = async (batch: AccountID[]): Promise<Account[]> => {\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: Account[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.ACCOUNT_LOOKUP, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const lookupTransfers = async (batch: TransferID[]): Promise<Transfer[]> => {\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: Transfer[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.TRANSFER_LOOKUP, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const destroy = (): void => {\n binding.deinit(context)\n if (_interval){\n clearInterval(_interval)\n }\n _client = undefined\n }\n\n _client = {\n createAccounts,\n createTransfers,\n lookupAccounts,\n lookupTransfers,\n request,\n rawRequest,\n destroy\n }\n\n _interval = setInterval(() => {\n binding.tick(context)\n }, binding.tick_ms)\n\n return _client\n}\n"]}
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "tigerbeetle-node",
3
+ "version": "0.12.0",
4
+ "lockfileVersion": 2,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "tigerbeetle-node",
9
+ "version": "0.12.0",
10
+ "license": "Apache-2.0",
11
+ "devDependencies": {
12
+ "@types/node": "^14.14.41",
13
+ "node-api-headers": "^0.0.2",
14
+ "typescript": "^4.0.2"
15
+ },
16
+ "engines": {
17
+ "node": ">=14.0.0"
18
+ }
19
+ },
20
+ "node_modules/@types/node": {
21
+ "version": "14.18.10",
22
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz",
23
+ "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==",
24
+ "dev": true
25
+ },
26
+ "node_modules/node-api-headers": {
27
+ "version": "0.0.2",
28
+ "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-0.0.2.tgz",
29
+ "integrity": "sha512-YsjmaKGPDkmhoNKIpkChtCsPVaRE0a274IdERKnuc/E8K1UJdBZ4/mvI006OijlQZHCfpRNOH3dfHQs92se8gg==",
30
+ "dev": true
31
+ },
32
+ "node_modules/typescript": {
33
+ "version": "4.5.5",
34
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
35
+ "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
36
+ "dev": true,
37
+ "bin": {
38
+ "tsc": "bin/tsc",
39
+ "tsserver": "bin/tsserver"
40
+ },
41
+ "engines": {
42
+ "node": ">=4.2.0"
43
+ }
44
+ }
45
+ },
46
+ "dependencies": {
47
+ "@types/node": {
48
+ "version": "14.18.10",
49
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz",
50
+ "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==",
51
+ "dev": true
52
+ },
53
+ "node-api-headers": {
54
+ "version": "0.0.2",
55
+ "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-0.0.2.tgz",
56
+ "integrity": "sha512-YsjmaKGPDkmhoNKIpkChtCsPVaRE0a274IdERKnuc/E8K1UJdBZ4/mvI006OijlQZHCfpRNOH3dfHQs92se8gg==",
57
+ "dev": true
58
+ },
59
+ "typescript": {
60
+ "version": "4.5.5",
61
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
62
+ "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
63
+ "dev": true
64
+ }
65
+ }
66
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tigerbeetle-node",
3
- "version": "0.11.13",
3
+ "version": "0.12.1",
4
4
  "description": "TigerBeetle Node.js client",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -14,19 +14,10 @@
14
14
  "LICENSE",
15
15
  "README.md",
16
16
  "dist",
17
- "dist/.client.node.sha256",
18
- "!dist/client.node",
17
+ "src",
18
+ "!src/zig-cache",
19
19
  "package.json",
20
20
  "package-lock.json",
21
- "scripts/download_node_headers.sh",
22
- "scripts/build_lib.sh",
23
- "src/c.zig",
24
- "src/benchmark.ts",
25
- "src/index.ts",
26
- "src/node.zig",
27
- "src/test.ts",
28
- "src/tigerbeetle",
29
- "src/translate.zig",
30
21
  "tsconfig.json"
31
22
  ],
32
23
  "engines": {
@@ -35,12 +26,10 @@
35
26
  "scripts": {
36
27
  "benchmark": "./scripts/benchmark.sh",
37
28
  "test": "node dist/test",
38
- "postinstall": "npm run download_node_headers && npm run build_lib",
39
- "download_node_headers": "sh ./scripts/download_node_headers.sh",
40
29
  "build": "npm run build_tsc && npm run build_lib",
41
30
  "build_tsc": "./node_modules/typescript/bin/tsc",
42
- "build_lib": "sh ./scripts/build_lib.sh",
43
- "prepack": "npm run build",
31
+ "build_lib": "node scripts/windows_generate_node_lib.js && cd ../../.. && zig/zig build node_client -Drelease-safe",
32
+ "prepack": "npm run build && find dist/bin -name '*.o' -delete && for path in dist/bin/*; do mv ${path}/libtb_nodeclient.* ${path}/client.node; done",
44
33
  "clean": "rm -rf build dist node_modules src/zig-cache zig"
45
34
  },
46
35
  "author": "TigerBeetle, Inc",
@@ -53,6 +42,7 @@
53
42
  ],
54
43
  "devDependencies": {
55
44
  "@types/node": "^14.14.41",
45
+ "node-api-headers": "^0.0.2",
56
46
  "typescript": "^4.0.2"
57
47
  }
58
48
  }
package/src/index.ts CHANGED
@@ -1,4 +1,59 @@
1
- const binding: Binding = require('./client.node')
1
+ function getBinding (): Binding {
2
+ const { arch, platform } = process
3
+
4
+ const archMap = {
5
+ "arm64": "aarch64",
6
+ "x64": "x86_64"
7
+ }
8
+
9
+ const platformMap = {
10
+ "linux": "linux",
11
+ "darwin": "macos"
12
+ }
13
+
14
+ if (! (arch in archMap)) {
15
+ throw new Error(`Unsupported arch: ${arch}`)
16
+ }
17
+
18
+ if (! (platform in platformMap)) {
19
+ throw new Error(`Unsupported platform: ${platform}`)
20
+ }
21
+
22
+ let extra = ''
23
+
24
+ /**
25
+ * We need to detect during runtime which libc we're running on to load the correct NAPI.
26
+ * binary.
27
+ *
28
+ * Rationale: The /proc/self/map_files/ subdirectory contains entries corresponding to
29
+ * memory-mapped files loaded by Node.
30
+ * https://man7.org/linux/man-pages/man5/proc.5.html: We detect a musl-based distro by
31
+ * checking if any library contains the name "musl".
32
+ *
33
+ * Prior art: https://github.com/xerial/sqlite-jdbc/issues/623
34
+ */
35
+
36
+ const fs = require('fs')
37
+ const path = require('path')
38
+
39
+ if (platform === 'linux') {
40
+ extra = '-gnu'
41
+
42
+ for (const file of fs.readdirSync("/proc/self/map_files/")) {
43
+ const realPath = fs.readlinkSync(path.join("/proc/self/map_files/", file))
44
+ if (realPath.includes('musl')) {
45
+ extra = '-musl'
46
+ break
47
+ }
48
+ }
49
+ }
50
+
51
+ const filename = `./bin/${archMap[arch]}-${platformMap[platform]}${extra}/client.node`
52
+ return require(filename)
53
+ }
54
+
55
+ const binding = getBinding()
56
+
2
57
  interface Binding {
3
58
  init: (args: BindingInitArgs) => Context
4
59
  request: (context: Context, operation: Operation, batch: Event[], result: ResultCallback) => void
package/src/node.zig CHANGED
@@ -3,7 +3,7 @@ const assert = std.debug.assert;
3
3
 
4
4
  const c = @import("c.zig");
5
5
  const translate = @import("translate.zig");
6
- const tb = @import("tigerbeetle/src/tigerbeetle.zig");
6
+ const tb = @import("../../../tigerbeetle.zig");
7
7
 
8
8
  const Account = tb.Account;
9
9
  const AccountFlags = tb.AccountFlags;
@@ -12,25 +12,25 @@ const TransferFlags = tb.TransferFlags;
12
12
  const CreateAccountsResult = tb.CreateAccountsResult;
13
13
  const CreateTransfersResult = tb.CreateTransfersResult;
14
14
 
15
- const Storage = @import("tigerbeetle/src/storage.zig").Storage;
16
- const StateMachine = @import("tigerbeetle/src/state_machine.zig").StateMachineType(Storage, .{
15
+ const Storage = @import("../../../storage.zig").Storage;
16
+ const StateMachine = @import("../../../state_machine.zig").StateMachineType(Storage, .{
17
17
  .message_body_size_max = constants.message_body_size_max,
18
18
  .lsm_batch_multiple = constants.lsm_batch_multiple,
19
19
  });
20
20
  const Operation = StateMachine.Operation;
21
- const MessageBus = @import("tigerbeetle/src/message_bus.zig").MessageBusClient;
22
- const MessagePool = @import("tigerbeetle/src/message_pool.zig").MessagePool;
23
- const IO = @import("tigerbeetle/src/io.zig").IO;
24
- const constants = @import("tigerbeetle/src/constants.zig");
21
+ const MessageBus = @import("../../../message_bus.zig").MessageBusClient;
22
+ const MessagePool = @import("../../../message_pool.zig").MessagePool;
23
+ const IO = @import("../../../io.zig").IO;
24
+ const constants = @import("../../../constants.zig");
25
25
 
26
- const vsr = @import("tigerbeetle/src/vsr.zig");
26
+ const vsr = @import("../../../vsr.zig");
27
27
  const Header = vsr.Header;
28
28
  const Client = vsr.Client(StateMachine, MessageBus);
29
29
 
30
30
  // TODO(jamii)
31
31
  // This is a hack used to work around the absence of tigerbeetle_build_options.
32
32
  // This should be removed once the node client is built using `zig build`.
33
- pub const tracer_backend: @import("tigerbeetle/src/config.zig").TracerBackend = .none;
33
+ pub const tracer_backend: @import("../../../config.zig").TracerBackend = .none;
34
34
 
35
35
  // Since this is running in application space, log only critical messages to reduce noise.
36
36
  pub const log_level: std.log.Level = .err;
@@ -1 +0,0 @@
1
- dc919aef39f18dc4a76aea2029dd29963d9b7139459558b2d6691c68a80d622c dist/client.node
@@ -1,61 +0,0 @@
1
- #!/usr/bin/env sh
2
-
3
- set -e
4
-
5
- # This is a bit hacky. If the script is run inside tigerbeetle's repository,
6
- # copy sources over, so that we can package them into an npm package.
7
- #
8
- # If the script is run inside user's node_modules, do nothing, as we assume
9
- # the sources are already there.
10
- if [ -f "../../tigerbeetle.zig" ] && [ -d "../../clients/node" ]; then
11
- rm -rf ./src/tigerbeetle/src
12
- mkdir -p ./src/tigerbeetle/src
13
- cp -r ../../../scripts/ ./src/tigerbeetle/scripts/
14
- cp ../../*.zig ./src/tigerbeetle/src/
15
- for dir in io lsm testing vsr state_machine; do
16
- cp -r ../../$dir ./src/tigerbeetle/src/$dir
17
- done
18
- fi
19
-
20
- if ! [ -f "./zig/zig" ]; then
21
- ./src/tigerbeetle/scripts/install_zig.sh
22
- fi
23
-
24
- # macOS 13 Ventura is not supported on Zig 0.9.x.
25
- # Overriding -target is one workaround Andrew suggests.
26
- # https://github.com/ziglang/zig/issues/10478#issuecomment-1294313967
27
- target=""
28
- if [ "$(./zig/zig targets | grep triple |cut -d '"' -f 4 | cut -d '.' -f 1,2 | cut -d '-' -f 2)" = "macos.13" ]; then
29
- target="-target native-macos.11"
30
- fi
31
-
32
- # Zig picks musl libc on RHEL instead of glibc, incorrectly
33
- # https://github.com/ziglang/zig/issues/12156
34
- if [ -f "/etc/redhat-release" ]; then
35
- if ! grep Fedora /etc/redhat-release; then
36
- target="-target native-native-gnu"
37
- fi
38
- fi
39
-
40
- if [ "$target" = "" ]; then
41
- echo "Building default target"
42
- else
43
- echo "Building for '$target'"
44
- fi
45
-
46
- mkdir -p ./dist
47
-
48
- # Need to do string eval-ing because of shellcheck's strict string
49
- # interpolation rules.
50
- cmd="./zig/zig build-lib \
51
- --global-cache-dir ./zig/global-cache \
52
- -mcpu=baseline \
53
- -OReleaseSafe \
54
- -dynamic \
55
- -lc \
56
- -isystem build/node-$(node --version)/include/node \
57
- -fallow-shlib-undefined \
58
- -femit-bin=dist/client.node \
59
- $target src/node.zig"
60
-
61
- eval "$cmd"
@@ -1,32 +0,0 @@
1
- #!/usr/bin/env sh
2
-
3
- set -e
4
-
5
- # Ask node for headers
6
- HEADERS_URL=$(node -p 'process.release.headersUrl')
7
-
8
- # Work out the filename from the URL, as well as the directory without the ".tar.gz" file extension:
9
- rm -rf ./build
10
- mkdir build
11
- HEADERS_TARBALL=./build/$(basename "$HEADERS_URL")
12
-
13
- # Download, making sure we download to the same output document, without wget adding "-1" etc. if the file was previously partially downloaded:
14
- echo "Downloading $HEADERS_URL..."
15
- if command -v wget; then
16
- # -4 forces `wget` to connect to ipv4 addresses, as ipv6 fails to resolve on certain distros.
17
- # Only A records (for ipv4) are used in DNS:
18
- ipv4="-4"
19
- # But Alpine doesn't support this argument
20
- if [ -f /etc/alpine-release ]; then
21
- ipv4=""
22
- fi
23
-
24
- wget $ipv4 --output-document="$HEADERS_TARBALL" "$HEADERS_URL"
25
- else
26
- curl --output "$HEADERS_TARBALL" "$HEADERS_URL"
27
- fi
28
-
29
- # Extract and then remove the downloaded tarball:
30
- echo "Extracting $HEADERS_TARBALL..."
31
- tar -xf "$HEADERS_TARBALL" -C ./build
32
- rm "$HEADERS_TARBALL"
@@ -1,55 +0,0 @@
1
- @echo off
2
- setlocal enabledelayedexpansion
3
-
4
- REM Install Zig if it does not already exist:
5
- if not exist "zig" (
6
- call .\scripts\install_zig.bat
7
- )
8
-
9
- if "%~1" equ ":main" (
10
- shift /1
11
- goto main
12
- )
13
-
14
- cmd /d /c "%~f0" :main %*
15
- set ZIG_RESULT=%ERRORLEVEL%
16
- taskkill /F /IM tigerbeetle.exe >nul
17
-
18
- if !ZIG_RESULT! equ 0 (
19
- del /f benchmark.log
20
- ) else (
21
- echo.
22
- echo Error running benchmark, here are more details
23
- type benchmark.log
24
- )
25
-
26
- echo.
27
- exit /b
28
-
29
- :main
30
- zig\zig.exe build install -Drelease-safe
31
-
32
- for /l %%i in (0, 1, 0) do (
33
- echo Initializing replica %%i
34
- set ZIG_FILE=.\0_%%i.tigerbeetle.benchmark
35
- if exist "!ZIG_FILE!" DEL /F "!ZIG_FILE!"
36
- .\tigerbeetle.exe format --cluster=0 --replica=%%i !ZIG_FILE! > benchmark.log 2>&1
37
- )
38
-
39
- for /l %%i in (0, 1, 0) do (
40
- echo Starting replica %%i
41
- set ZIG_FILE=.\0_%%i.tigerbeetle.benchmark
42
- start /B "tigerbeetle_%%i" .\tigerbeetle.exe start --addresses=3001 !ZIG_FILE! > benchmark.log 2>&1
43
- )
44
-
45
- echo.
46
- echo Benchmarking...
47
-
48
- set ARGS=
49
- for %%a in (%*) do (
50
- if not "%%a"==":main" (
51
- SET ARGS=!ARGS! %%a
52
- )
53
- )
54
- zig\zig.exe build benchmark -Drelease-safe -- %ARGS%
55
- exit /b %errorlevel%
@@ -1,66 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -eEuo pipefail
3
-
4
- # Number of replicas to benchmark
5
- REPLICAS=${REPLICAS:-0}
6
-
7
- # Install Zig if it does not already exist:
8
- if [ ! -d "zig" ]; then
9
- scripts/install_zig.sh
10
- fi
11
-
12
- COLOR_RED='\033[1;31m'
13
- COLOR_END='\033[0m'
14
-
15
- zig/zig build install -Drelease-safe
16
-
17
- function onerror {
18
- if [ "$?" == "0" ]; then
19
- rm benchmark.log
20
- else
21
- echo -e "${COLOR_RED}"
22
- echo "Error running benchmark, here are more details (from benchmark.log):"
23
- echo -e "${COLOR_END}"
24
- cat benchmark.log
25
- fi
26
-
27
- for I in $REPLICAS
28
- do
29
- echo "Stopping replica $I..."
30
- done
31
- kill %1
32
- }
33
- trap onerror EXIT
34
-
35
- for I in $REPLICAS
36
- do
37
- echo "Formatting replica $I..."
38
-
39
- # Be careful to use a benchmark-specific filename so that we don't erase a real data file:
40
- FILE="./0_${I}.tigerbeetle.benchmark"
41
- if [ -f "$FILE" ]; then
42
- rm "$FILE"
43
- fi
44
-
45
- ./tigerbeetle format --cluster=0 --replica="$I" "$FILE" > benchmark.log 2>&1
46
- done
47
-
48
- for I in $REPLICAS
49
- do
50
- echo "Starting replica $I..."
51
- FILE="./0_${I}.tigerbeetle.benchmark"
52
- ./tigerbeetle start --addresses=3001 "$FILE" >> benchmark.log 2>&1 &
53
- done
54
-
55
- echo ""
56
- echo "Benchmarking..."
57
- zig/zig build benchmark -Drelease-safe -- "$@"
58
- echo ""
59
-
60
- for I in $REPLICAS
61
- do
62
- FILE="./0_${I}.tigerbeetle.benchmark"
63
- if [ -f "$FILE" ]; then
64
- rm "$FILE"
65
- fi
66
- done