Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Node.js 10.18 or later is required, matching the engines field in the package's package.json.
npm install thrift
You can compile IDL sources for Node.js with the following command:
thrift --gen js:node thrift_file
Here is a Cassandra example:
var thrift = require('thrift'), Cassandra = require('./gen-nodejs/Cassandra') ttypes = require('./gen-nodejs/cassandra_types'); var connection = thrift.createConnection("localhost", 9160), client = thrift.createClient(Cassandra, connection); connection.on('error', function(err) { console.error(err); }); client.get_slice("Keyspace", "key", new ttypes.ColumnParent({column_family: "ExampleCF"}), new ttypes.SlicePredicate({slice_range: new ttypes.SliceRange({start: '', finish: ''})}), ttypes.ConsistencyLevel.ONE, function(err, data) { if (err) { // handle err } else { // data == [ttypes.ColumnOrSuperColumn, ...] } connection.end(); });
Since JavaScript represents all numbers as doubles, int64 values cannot be accurately represented naturally. By default, both the protocol layer (TBinaryProtocol.readI64() etc.) and generated struct fields surface int64 values as broofa/node-int64 Thrift.Int64 objects. See BigInt mode below for the opt-in alternative — which changes only the generated-code field type and keeps the protocol layer unchanged.
js:bigint, opt-in)Native BigInt has been available since Node 10.4, so every supported runtime can use it. Pass bigint alongside node in the generator option list to emit BigInt-aware code instead of node-int64:
thrift --gen js:node MyService.thrift # default — node-int64 output thrift --gen js:node,bigint MyService.thrift # opt-in — native BigInt output
When the bigint flag is set, code generated by --gen js:node (and the ts, es6, esm variants):
bigint literals (e.g. 42n, 9223372036854775807n) for int64 constants instead of new Int64(42).require('node-int64') / import Int64 from 'node-int64' preamble.bigint in .d.ts files instead of Int64.readI64() calls with thrift.toBigInt(...) so deserialized fields land in the generated struct as bigint, and writeI64(...) calls with thrift.fromBigInt(...) so consumers can pass plain bigint values into their structs.The flag is only meaningful when node is in the option list; passing bigint to plain --gen js (browser JS) is silently ignored.
TBinaryProtocol itself is unchanged — readI64 still returns a Thrift.Int64 and writeI64 still expects one. The BigInt boundary lives entirely in the JS layer, in the two helpers exported from the thrift package:
const thrift = require("thrift"); const big = thrift.toBigInt(prot.readI64()); // Int64 -> bigint prot.writeI64(thrift.fromBigInt(big)); // bigint -> Int64
thrift.fromBigInt wraps values to the signed 64-bit range (BigInt.asIntN(64, ...)) and accepts bigint, decimal-string, or number input. Existing code that imports Thrift.Int64 or calls prot.readI64() directly keeps working with no changes.
Several example clients and servers are included in the thrift/lib/nodejs/examples folder and the cross language tutorial thrift/tutorial/nodejs folder.
You can use code generated with js:node on browsers with Webpack. Here is an example.
thrift --gen js:node,ts,es6,with_ns
import * as thrift from 'thrift'; import { MyServiceClient } from '../gen-nodejs/MyService'; let host = window.location.hostname; let port = 443; let opts = { transport: thrift.TBufferedTransport, protocol: thrift.TJSONProtocol, headers: { 'Content-Type': 'application/vnd.apache.thrift.json', }, https: true, path: '/url/path', useCORS: true, }; let connection = thrift.createXHRConnection(host, port, opts); let thriftClient = thrift.createXHRClient(MyServiceClient, connection); connection.on('error', (err) => { console.error(err); }); thriftClient.myService(param) .then((result) => { console.log(result); }) .catch((err) => { .... });
Bundlers, like webpack, will use thrift/browser.js by default because of the "browser": "./lib/nodejs/lib/thrift/browser.js" field in package.json.
import thrift from 'thrift'; import { MyServiceClient } from '../gen-nodejs/MyService'; const host = window.location.hostname; const port = 9090; const opts = { transport: thrift.TBufferedTransport, protocol: thrift.TBinaryProtocol } const connection = thrift.createWSConnection(host, port, opts); connection.open(); const thriftClient = thrift.createWSClient(MyServiceClient, connection); connection.on('error', (err) => { console.error(err); }); thriftClient.myService(param) .then((result) => { console.log(result); }) .catch((err) => { .... });