You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Buğra Gedik (JIRA)" <ji...@apache.org> on 2018/12/12 07:29:00 UTC
[jira] [Comment Edited] (THRIFT-4675) JS code generators not
handling int64 type properly for constants and for TypeScript type mappings
[ https://issues.apache.org/jira/browse/THRIFT-4675?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16718555#comment-16718555 ]
Buğra Gedik edited comment on THRIFT-4675 at 12/12/18 7:28 AM:
---------------------------------------------------------------
[~jking3] While working on this, we've discovered that the existing Thrift library has a bug in its JSON protocol implementation for JS. When an Int64 type is present, it serializes it to JSON by truncating to 58-bit (what can fit in a double). This is due to the use of JSON.parse/format. We've seen this problem a few times before, so we know how to fix it. To fix it, we'll need a small library (json-int64). Since node-int64 is already an external dependency, we are thinking that we should make json-int64 an external dependency as well. We'll be publishing that library to npm. Do we have your blessing?
was (Author: bgedik):
[~jking3] While working on this, we've discovered that the existing Thrift library has a bug in its JSON protocol. When an Int64 type is present, it serializes it to JSON by truncating to 58-bit (what can fit in a double). This is due to the use of JSON.parse/format. We've seen this problem a few times before, so we know how to fix it. To fix it, we'll need a small library (json-int64). Since node-int64 is already an external dependency, we are thinking that we should make json-int64 an external dependency as well. We'll be publishing that library to npm. Do we have your blessing?
> JS code generators not handling int64 type properly for constants and for TypeScript type mappings
> --------------------------------------------------------------------------------------------------
>
> Key: THRIFT-4675
> URL: https://issues.apache.org/jira/browse/THRIFT-4675
> Project: Thrift
> Issue Type: Bug
> Components: JavaScript - Compiler
> Affects Versions: 0.11.0
> Reporter: Buğra Gedik
> Priority: Major
>
> The code generated for JS constants involving the {{int64}} Thrift type do not rely on the {{Int64}} JS type (from the {{node-int64}} package Thrift uses for handling 64-bit integers).
> For example, consider the following Thrift constant definitions:
> {code}
> const i64 MAX_INT64 = 9223372036854775807
> const i64 SMALL_INT64 = 15
> {code}
> This results in generating the following code:
> For node.js:
> {code}
> ttypes.MAX_INT64 = 9223372036854775807;
> ttypes.SMALL_INT64 = 15;
> {code}
> For the browser:
> {code}
> MAX_INT64 = 9223372036854775807;
> SMALL_INT64 = 15;
> {code}
> Since the JS {{number}} type cannot natively represent integers that do not fit into a double precision floating point, this will result in lost precision for certain values. E.g., printing {{MAX_INT64}} would produce {{922337203685477}}*{{6000}}*.
> The correct output should be (showing for node.js):
> {code}
> ttypes.MAX_INT64 = new Int64(''7FFFFFFFFFFFFFFF'');
> ttypes.SMALL_INT64 = new Int64(15);
> {code}
> Besides this, none of the Typescript type bindings ({{.d.ts}} files) contain the types for int64 types. This includes constants, types, and service method parameters.
> Note that fixing this may break some of the existing code. In my mind, this is how it should work by default, but I don't know the policy in Thrift regarding backward compatibility. It could also be added as an option.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)