@fintekkers/ledger-models 0.4.42 → 0.4.44

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 (254) hide show
  1. package/node/fintekkers/models/portfolio/portfolio_pb.d.ts +7 -15
  2. package/node/fintekkers/models/portfolio/portfolio_pb.js +35 -132
  3. package/node/fintekkers/models/position/position_filter_pb.d.ts +7 -15
  4. package/node/fintekkers/models/position/position_filter_pb.js +35 -132
  5. package/node/fintekkers/models/position/position_pb.d.ts +7 -15
  6. package/node/fintekkers/models/position/position_pb.js +35 -132
  7. package/node/fintekkers/models/price/price_pb.d.ts +7 -15
  8. package/node/fintekkers/models/price/price_pb.js +35 -132
  9. package/node/fintekkers/models/security/bond/issuance_pb.d.ts +7 -15
  10. package/node/fintekkers/models/security/bond/issuance_pb.js +35 -132
  11. package/node/fintekkers/models/security/identifier/identifier_pb.d.ts +7 -15
  12. package/node/fintekkers/models/security/identifier/identifier_pb.js +35 -132
  13. package/node/fintekkers/models/security/index_composition_pb.d.ts +7 -15
  14. package/node/fintekkers/models/security/index_composition_pb.js +35 -132
  15. package/node/fintekkers/models/security/security_pb.d.ts +7 -15
  16. package/node/fintekkers/models/security/security_pb.js +35 -132
  17. package/node/fintekkers/models/security/security_pb.test.js +4 -8
  18. package/node/fintekkers/models/security/security_pb.test.js.map +1 -1
  19. package/node/fintekkers/models/security/security_pb.test.ts +4 -5
  20. package/node/fintekkers/models/security/tenor_pb.d.ts +7 -15
  21. package/node/fintekkers/models/security/tenor_pb.js +35 -132
  22. package/node/fintekkers/models/strategy/strategy_allocation_pb.d.ts +7 -15
  23. package/node/fintekkers/models/strategy/strategy_allocation_pb.js +35 -132
  24. package/node/fintekkers/models/strategy/strategy_pb.d.ts +7 -15
  25. package/node/fintekkers/models/strategy/strategy_pb.js +35 -132
  26. package/node/fintekkers/models/transaction/transaction_pb.d.ts +7 -15
  27. package/node/fintekkers/models/transaction/transaction_pb.js +35 -132
  28. package/node/fintekkers/models/util/api/api_key_pb.d.ts +7 -15
  29. package/node/fintekkers/models/util/api/api_key_pb.js +35 -132
  30. package/node/fintekkers/models/util/date_range_pb.d.ts +7 -15
  31. package/node/fintekkers/models/util/date_range_pb.js +35 -132
  32. package/node/fintekkers/models/util/decimal_value_pb.d.ts +0 -5
  33. package/node/fintekkers/models/util/decimal_value_pb.js +0 -30
  34. package/node/fintekkers/models/util/lock/node_partition_pb.d.ts +7 -15
  35. package/node/fintekkers/models/util/lock/node_partition_pb.js +35 -132
  36. package/node/fintekkers/models/util/lock/node_state_pb.d.ts +7 -15
  37. package/node/fintekkers/models/util/lock/node_state_pb.js +35 -132
  38. package/node/fintekkers/models/util/object_type_pb.d.ts +0 -3
  39. package/node/fintekkers/models/util/object_type_pb.js +0 -28
  40. package/node/fintekkers/models/util/version_grpc_pb.js +1 -0
  41. package/node/fintekkers/models/util/version_pb.d.ts +33 -0
  42. package/node/fintekkers/models/util/version_pb.js +236 -0
  43. package/node/fintekkers/requests/index_composition/create_index_composition_request_pb.d.ts +13 -30
  44. package/node/fintekkers/requests/index_composition/create_index_composition_request_pb.js +68 -264
  45. package/node/fintekkers/requests/index_composition/get_index_composition_request_pb.d.ts +13 -30
  46. package/node/fintekkers/requests/index_composition/get_index_composition_request_pb.js +68 -264
  47. package/node/fintekkers/requests/portfolio/create_portfolio_request_pb.d.ts +7 -15
  48. package/node/fintekkers/requests/portfolio/create_portfolio_request_pb.js +35 -132
  49. package/node/fintekkers/requests/portfolio/create_portfolio_response_pb.d.ts +7 -15
  50. package/node/fintekkers/requests/portfolio/create_portfolio_response_pb.js +35 -132
  51. package/node/fintekkers/requests/portfolio/query_portfolio_request_pb.d.ts +7 -15
  52. package/node/fintekkers/requests/portfolio/query_portfolio_request_pb.js +35 -132
  53. package/node/fintekkers/requests/portfolio/query_portfolio_response_pb.d.ts +7 -15
  54. package/node/fintekkers/requests/portfolio/query_portfolio_response_pb.js +35 -132
  55. package/node/fintekkers/requests/position/query_position_request_pb.d.ts +7 -15
  56. package/node/fintekkers/requests/position/query_position_request_pb.js +35 -132
  57. package/node/fintekkers/requests/position/query_position_response_pb.d.ts +7 -15
  58. package/node/fintekkers/requests/position/query_position_response_pb.js +35 -132
  59. package/node/fintekkers/requests/price/create_price_request_pb.d.ts +7 -15
  60. package/node/fintekkers/requests/price/create_price_request_pb.js +35 -132
  61. package/node/fintekkers/requests/price/create_price_response_pb.d.ts +7 -15
  62. package/node/fintekkers/requests/price/create_price_response_pb.js +35 -132
  63. package/node/fintekkers/requests/price/query_price_request_pb.d.ts +7 -15
  64. package/node/fintekkers/requests/price/query_price_request_pb.js +35 -132
  65. package/node/fintekkers/requests/price/query_price_response_pb.d.ts +7 -15
  66. package/node/fintekkers/requests/price/query_price_response_pb.js +35 -132
  67. package/node/fintekkers/requests/security/create_security_request_pb.d.ts +7 -15
  68. package/node/fintekkers/requests/security/create_security_request_pb.js +35 -132
  69. package/node/fintekkers/requests/security/create_security_response_pb.d.ts +7 -15
  70. package/node/fintekkers/requests/security/create_security_response_pb.js +35 -132
  71. package/node/fintekkers/requests/security/get_field_values_request_pb.d.ts +7 -15
  72. package/node/fintekkers/requests/security/get_field_values_request_pb.js +35 -132
  73. package/node/fintekkers/requests/security/get_field_values_response_pb.d.ts +7 -15
  74. package/node/fintekkers/requests/security/get_field_values_response_pb.js +35 -132
  75. package/node/fintekkers/requests/security/get_fields_response_pb.d.ts +7 -15
  76. package/node/fintekkers/requests/security/get_fields_response_pb.js +35 -132
  77. package/node/fintekkers/requests/security/query_security_request_pb.d.ts +7 -15
  78. package/node/fintekkers/requests/security/query_security_request_pb.js +35 -132
  79. package/node/fintekkers/requests/security/query_security_response_pb.d.ts +7 -15
  80. package/node/fintekkers/requests/security/query_security_response_pb.js +35 -132
  81. package/node/fintekkers/requests/transaction/create_transaction_request_pb.d.ts +7 -15
  82. package/node/fintekkers/requests/transaction/create_transaction_request_pb.js +35 -132
  83. package/node/fintekkers/requests/transaction/create_transaction_response_pb.d.ts +7 -15
  84. package/node/fintekkers/requests/transaction/create_transaction_response_pb.js +35 -132
  85. package/node/fintekkers/requests/transaction/query_transaction_request_pb.d.ts +7 -15
  86. package/node/fintekkers/requests/transaction/query_transaction_request_pb.js +35 -132
  87. package/node/fintekkers/requests/transaction/query_transaction_response_pb.d.ts +7 -15
  88. package/node/fintekkers/requests/transaction/query_transaction_response_pb.js +35 -132
  89. package/node/fintekkers/requests/util/delete_request_pb.d.ts +13 -30
  90. package/node/fintekkers/requests/util/delete_request_pb.js +68 -264
  91. package/node/fintekkers/requests/util/lock/lock_request_pb.d.ts +7 -15
  92. package/node/fintekkers/requests/util/lock/lock_request_pb.js +35 -132
  93. package/node/fintekkers/requests/util/lock/lock_response_pb.d.ts +7 -15
  94. package/node/fintekkers/requests/util/lock/lock_response_pb.js +35 -132
  95. package/node/fintekkers/requests/valuation/curve_request_pb.d.ts +7 -15
  96. package/node/fintekkers/requests/valuation/curve_request_pb.js +35 -132
  97. package/node/fintekkers/requests/valuation/curve_response_pb.d.ts +19 -15
  98. package/node/fintekkers/requests/valuation/curve_response_pb.js +138 -133
  99. package/node/fintekkers/requests/valuation/product_inputs.test.js +10 -17
  100. package/node/fintekkers/requests/valuation/product_inputs.test.js.map +1 -1
  101. package/node/fintekkers/requests/valuation/product_inputs.test.ts +10 -16
  102. package/node/fintekkers/requests/valuation/valuation_request_pb.d.ts +7 -15
  103. package/node/fintekkers/requests/valuation/valuation_request_pb.js +35 -132
  104. package/node/fintekkers/requests/valuation/valuation_response_pb.d.ts +7 -15
  105. package/node/fintekkers/requests/valuation/valuation_response_pb.js +35 -132
  106. package/node/wrappers/models/portfolio/portfolio.test.js +0 -2
  107. package/node/wrappers/models/portfolio/portfolio.test.js.map +1 -1
  108. package/node/wrappers/models/portfolio/portfolio.test.ts +0 -2
  109. package/node/wrappers/models/portfolio-price-transaction.lazy-hydrate.test.js +2 -3
  110. package/node/wrappers/models/portfolio-price-transaction.lazy-hydrate.test.js.map +1 -1
  111. package/node/wrappers/models/portfolio-price-transaction.lazy-hydrate.test.ts +2 -2
  112. package/node/wrappers/models/position/position.test.js +5 -6
  113. package/node/wrappers/models/position/position.test.js.map +1 -1
  114. package/node/wrappers/models/position/position.test.ts +5 -4
  115. package/node/wrappers/models/position/positionfilter.js +1 -1
  116. package/node/wrappers/models/position/positionfilter.js.map +1 -1
  117. package/node/wrappers/models/position/positionfilter.test.js +4 -2
  118. package/node/wrappers/models/position/positionfilter.test.js.map +1 -1
  119. package/node/wrappers/models/position/positionfilter.test.ts +3 -2
  120. package/node/wrappers/models/position/positionfilter.ts +1 -1
  121. package/node/wrappers/models/price/Price.cash.test.js +4 -5
  122. package/node/wrappers/models/price/Price.cash.test.js.map +1 -1
  123. package/node/wrappers/models/price/Price.cash.test.ts +2 -3
  124. package/node/wrappers/models/price/Price.js +2 -2
  125. package/node/wrappers/models/price/Price.js.map +1 -1
  126. package/node/wrappers/models/price/Price.test.js +4 -2
  127. package/node/wrappers/models/price/Price.test.js.map +1 -1
  128. package/node/wrappers/models/price/Price.test.ts +4 -2
  129. package/node/wrappers/models/price/Price.ts +2 -2
  130. package/node/wrappers/models/price/price_rules.test.js +9 -4
  131. package/node/wrappers/models/price/price_rules.test.js.map +1 -1
  132. package/node/wrappers/models/price/price_rules.test.ts +9 -4
  133. package/node/wrappers/models/security/BondSecurity.priceScale.test.js +2 -4
  134. package/node/wrappers/models/security/BondSecurity.priceScale.test.js.map +1 -1
  135. package/node/wrappers/models/security/BondSecurity.priceScale.test.ts +2 -3
  136. package/node/wrappers/models/security/BondSecurity.test.js +7 -13
  137. package/node/wrappers/models/security/BondSecurity.test.js.map +1 -1
  138. package/node/wrappers/models/security/BondSecurity.test.ts +7 -12
  139. package/node/wrappers/models/security/IndexSecurity.test.js +0 -8
  140. package/node/wrappers/models/security/IndexSecurity.test.js.map +1 -1
  141. package/node/wrappers/models/security/IndexSecurity.test.ts +0 -8
  142. package/node/wrappers/models/security/Issuance.test.js +6 -6
  143. package/node/wrappers/models/security/Issuance.test.js.map +1 -1
  144. package/node/wrappers/models/security/Issuance.test.ts +6 -5
  145. package/node/wrappers/models/security/MortgageBackedSecurity.fromPricerInputs.test.js +13 -14
  146. package/node/wrappers/models/security/MortgageBackedSecurity.fromPricerInputs.test.js.map +1 -1
  147. package/node/wrappers/models/security/MortgageBackedSecurity.fromPricerInputs.test.ts +13 -12
  148. package/node/wrappers/models/security/security-roundtrip.test.js +9 -21
  149. package/node/wrappers/models/security/security-roundtrip.test.js.map +1 -1
  150. package/node/wrappers/models/security/security-roundtrip.test.ts +9 -20
  151. package/node/wrappers/models/security/security.identifiers.test.js +0 -2
  152. package/node/wrappers/models/security/security.identifiers.test.js.map +1 -1
  153. package/node/wrappers/models/security/security.identifiers.test.ts +0 -2
  154. package/node/wrappers/models/security/security.tbillCoupon.test.js +3 -2
  155. package/node/wrappers/models/security/security.tbillCoupon.test.js.map +1 -1
  156. package/node/wrappers/models/security/security.tbillCoupon.test.ts +3 -2
  157. package/node/wrappers/models/security/security.test.js +14 -14
  158. package/node/wrappers/models/security/security.test.js.map +1 -1
  159. package/node/wrappers/models/security/security.test.ts +14 -13
  160. package/node/wrappers/models/transaction/transaction.derived.test.js +3 -9
  161. package/node/wrappers/models/transaction/transaction.derived.test.js.map +1 -1
  162. package/node/wrappers/models/transaction/transaction.derived.test.ts +3 -8
  163. package/node/wrappers/models/transaction/transaction.js +2 -2
  164. package/node/wrappers/models/transaction/transaction.js.map +1 -1
  165. package/node/wrappers/models/transaction/transaction.test.js +3 -3
  166. package/node/wrappers/models/transaction/transaction.test.js.map +1 -1
  167. package/node/wrappers/models/transaction/transaction.test.ts +3 -2
  168. package/node/wrappers/models/transaction/transaction.ts +2 -2
  169. package/node/wrappers/models/transaction/transaction_constructor.test.js +6 -9
  170. package/node/wrappers/models/transaction/transaction_constructor.test.js.map +1 -1
  171. package/node/wrappers/models/transaction/transaction_constructor.test.ts +6 -7
  172. package/node/wrappers/models/transaction/transaction_price_defaults.test.js +2 -10
  173. package/node/wrappers/models/transaction/transaction_price_defaults.test.js.map +1 -1
  174. package/node/wrappers/models/transaction/transaction_price_defaults.test.ts +2 -9
  175. package/node/wrappers/models/transaction/transaction_security_defaults.test.js +0 -6
  176. package/node/wrappers/models/transaction/transaction_security_defaults.test.js.map +1 -1
  177. package/node/wrappers/models/transaction/transaction_security_defaults.test.ts +0 -6
  178. package/node/wrappers/models/utils/date.test.js +0 -2
  179. package/node/wrappers/models/utils/date.test.js.map +1 -1
  180. package/node/wrappers/models/utils/date.test.ts +0 -2
  181. package/node/wrappers/models/utils/datetime.test.js +0 -2
  182. package/node/wrappers/models/utils/datetime.test.js.map +1 -1
  183. package/node/wrappers/models/utils/datetime.test.ts +0 -2
  184. package/node/wrappers/models/utils/decimal.d.ts +9 -28
  185. package/node/wrappers/models/utils/decimal.js +13 -52
  186. package/node/wrappers/models/utils/decimal.js.map +1 -1
  187. package/node/wrappers/models/utils/decimal.test.js +12 -68
  188. package/node/wrappers/models/utils/decimal.test.js.map +1 -1
  189. package/node/wrappers/models/utils/decimal.test.ts +14 -76
  190. package/node/wrappers/models/utils/decimal.ts +12 -60
  191. package/node/wrappers/models/utils/serialization.test.js +0 -4
  192. package/node/wrappers/models/utils/serialization.test.js.map +1 -1
  193. package/node/wrappers/models/utils/serialization.test.ts +0 -4
  194. package/node/wrappers/requests/position/QueryPositionRequest.js +1 -1
  195. package/node/wrappers/requests/position/QueryPositionRequest.js.map +1 -1
  196. package/node/wrappers/requests/position/QueryPositionRequest.ts +1 -1
  197. package/node/wrappers/requests/query-paging.test.js +4 -28
  198. package/node/wrappers/requests/query-paging.test.js.map +1 -1
  199. package/node/wrappers/requests/query-paging.test.ts +3 -36
  200. package/node/wrappers/services/portfolio-service/PortfolioService.js +3 -3
  201. package/node/wrappers/services/portfolio-service/PortfolioService.js.map +1 -1
  202. package/node/wrappers/services/portfolio-service/PortfolioService.ts +3 -3
  203. package/node/wrappers/services/portfolio-service/portfolioService.test.js +0 -2
  204. package/node/wrappers/services/portfolio-service/portfolioService.test.js.map +1 -1
  205. package/node/wrappers/services/portfolio-service/portfolioService.test.ts +0 -2
  206. package/node/wrappers/services/price-service/PriceService.js +3 -3
  207. package/node/wrappers/services/price-service/PriceService.js.map +1 -1
  208. package/node/wrappers/services/price-service/PriceService.ts +3 -3
  209. package/node/wrappers/services/price-service/price-wrapper.test.js +2 -6
  210. package/node/wrappers/services/price-service/price-wrapper.test.js.map +1 -1
  211. package/node/wrappers/services/price-service/price-wrapper.test.ts +2 -6
  212. package/node/wrappers/services/price-service/price.test.js +8 -17
  213. package/node/wrappers/services/price-service/price.test.js.map +1 -1
  214. package/node/wrappers/services/price-service/price.test.ts +8 -14
  215. package/node/wrappers/services/searchWithSecurities.test.js +2 -7
  216. package/node/wrappers/services/searchWithSecurities.test.js.map +1 -1
  217. package/node/wrappers/services/searchWithSecurities.test.ts +2 -6
  218. package/node/wrappers/services/security-service/SecurityService.js +3 -3
  219. package/node/wrappers/services/security-service/SecurityService.js.map +1 -1
  220. package/node/wrappers/services/security-service/SecurityService.ts +3 -3
  221. package/node/wrappers/services/security-service/security.test.js +3 -7
  222. package/node/wrappers/services/security-service/security.test.js.map +1 -1
  223. package/node/wrappers/services/security-service/security.test.ts +3 -6
  224. package/node/wrappers/services/transaction-service/TransactionService.js +3 -3
  225. package/node/wrappers/services/transaction-service/TransactionService.js.map +1 -1
  226. package/node/wrappers/services/transaction-service/TransactionService.ts +3 -3
  227. package/node/wrappers/services/transaction-service/transaction.test.js +3 -8
  228. package/node/wrappers/services/transaction-service/transaction.test.js.map +1 -1
  229. package/node/wrappers/services/transaction-service/transaction.test.ts +3 -6
  230. package/node/wrappers/util/link-resolver.js +3 -3
  231. package/node/wrappers/util/link-resolver.js.map +1 -1
  232. package/node/wrappers/util/link-resolver.test.js +4 -13
  233. package/node/wrappers/util/link-resolver.test.js.map +1 -1
  234. package/node/wrappers/util/link-resolver.test.ts +4 -12
  235. package/node/wrappers/util/link-resolver.ts +3 -3
  236. package/node/wrappers/util/object-types.d.ts +21 -47
  237. package/node/wrappers/util/object-types.js +19 -178
  238. package/node/wrappers/util/object-types.js.map +1 -1
  239. package/node/wrappers/util/object-types.test.js +50 -151
  240. package/node/wrappers/util/object-types.test.js.map +1 -1
  241. package/node/wrappers/util/object-types.test.ts +55 -170
  242. package/node/wrappers/util/object-types.ts +28 -182
  243. package/package.json +1 -1
  244. package/node/wrappers/models/position/position.test copy.js +0 -107
  245. package/node/wrappers/models/position/position.test copy.js.map +0 -1
  246. package/node/wrappers/models/utils/decimal.legacy.test.d.ts +0 -1
  247. package/node/wrappers/models/utils/decimal.legacy.test.js +0 -174
  248. package/node/wrappers/models/utils/decimal.legacy.test.js.map +0 -1
  249. package/node/wrappers/models/utils/decimal.legacy.test.ts +0 -158
  250. package/node/wrappers/models/utils/decimal.typings.test.d.ts +0 -1
  251. package/node/wrappers/models/utils/decimal.typings.test.js +0 -39
  252. package/node/wrappers/models/utils/decimal.typings.test.js.map +0 -1
  253. package/node/wrappers/models/utils/decimal.typings.test.ts +0 -16
  254. package/node/wrappers/util/object-type-legacy.json +0 -21
@@ -1,11 +1,11 @@
1
- // Compact object type and version (LM-297): writers set both forms, readers
2
- // translate the strings-only form. Rows come from the shared fixture
3
- // test-fixtures/object-type-legacy.json, which Java, Python and Rust also load.
1
+ // Object type and version (LM-297, LM-318): `stamp` writes object_type = 1
2
+ // and version = 2 (0.0.1), and bytes from earlier releases are not readable.
4
3
  import * as fs from 'fs';
5
4
  import * as path from 'path';
6
5
  import { Decimal } from 'decimal.js';
7
6
 
8
7
  import { ObjectTypeProto } from '../../fintekkers/models/util/object_type_pb';
8
+ import { VersionProto } from '../../fintekkers/models/util/version_pb';
9
9
  import { SecurityProto } from '../../fintekkers/models/security/security_pb';
10
10
  import { PriceProto } from '../../fintekkers/models/price/price_pb';
11
11
  import { TransactionProto } from '../../fintekkers/models/transaction/transaction_pb';
@@ -34,146 +34,43 @@ import { SecurityService } from '../services/security-service/SecurityService';
34
34
  import { TransactionService } from '../services/transaction-service/TransactionService';
35
35
  import { PortfolioService } from '../services/portfolio-service/PortfolioService';
36
36
 
37
- interface FixtureCase {
38
- name: string;
39
- source: string;
40
- message: string;
41
- object_class: string;
42
- version: string;
43
- bytes: string;
44
- expect: { object_type: keyof typeof ObjectTypeProto; version: number[]; warns: boolean };
45
- }
46
-
47
- const REPO_ROOT = path.resolve(__dirname, '../../../..');
48
- const CASES: FixtureCase[] = JSON.parse(
49
- fs.readFileSync(path.join(REPO_ROOT, 'test-fixtures', 'object-type-legacy.json'), 'utf8')).cases;
50
- const COMPACT_NUMBERS: Record<string, number> = {
51
- object_type: 1001, version_major: 1002, version_minor: 1003, version_patch: 1004,
52
- };
53
-
54
- type MessageClass = { deserializeBinary(bytes: Uint8Array): ObjectTyped & { serializeBinary(): Uint8Array } };
55
-
56
- /** Generated message classes by proto full name: the package is the directory under node/. */
57
- function messageClasses(): Map<string, MessageClass> {
58
- const root = path.resolve(__dirname, '../../fintekkers');
59
- const classes = new Map<string, MessageClass>();
60
- const walk = (dir: string): void => {
61
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
62
- const full = path.join(dir, entry.name);
63
- if (entry.isDirectory()) {
64
- walk(full);
65
- } else if (entry.name.endsWith('_pb.js')) {
66
- const pkg = path.relative(path.dirname(root), dir).split(path.sep).join('.');
67
- // eslint-disable-next-line @typescript-eslint/no-var-requires
68
- for (const [name, cls] of Object.entries(require(full))) {
69
- classes.set(`${pkg}.${name}`, cls as MessageClass);
70
- }
71
- }
72
- }
73
- };
74
- walk(root);
75
- return classes;
76
- }
77
-
78
- const CLASSES = messageClasses();
79
-
80
- function decode(c: FixtureCase) {
81
- const cls = CLASSES.get(c.message);
82
- if (!cls) throw new Error(`no generated class for ${c.message}`);
83
- return cls.deserializeBinary(Buffer.from(c.bytes, 'base64'));
84
- }
85
-
86
- /** Field numbers present at the top level of an encoded message. */
87
- function topLevelFieldNumbers(data: Uint8Array): number[] {
88
- const numbers: number[] = [];
89
- let i = 0;
90
- const varint = (): number => {
91
- let result = 0;
92
- let scale = 1;
93
- for (;;) {
94
- const b = data[i++];
95
- result += (b & 0x7f) * scale;
96
- scale *= 128;
97
- if (!(b & 0x80)) return result;
98
- }
99
- };
100
- while (i < data.length) {
101
- const key = varint();
102
- numbers.push(Math.floor(key / 8));
103
- const wireType = key % 8;
104
- if (wireType === 0) varint();
105
- else if (wireType === 1) i += 8;
106
- else if (wireType === 2) {
107
- const length = varint();
108
- i += length;
109
- }
110
- else if (wireType === 5) i += 4;
111
- else throw new Error(`unexpected wire type ${wireType}`);
112
- }
113
- return numbers;
114
- }
115
-
116
- let warn: jest.SpyInstance;
117
-
118
- beforeEach(() => {
119
- objectTypes.resetWarningsForTests();
120
- warn = jest.spyOn(console, 'warn').mockImplementation(() => undefined);
121
- });
122
-
123
- afterEach(() => {
124
- warn.mockRestore();
125
- objectTypes.resetWarningsForTests();
37
+ // A PriceProto written by ledger-models v0.4.33: object_class / version
38
+ // strings in fields 1 and 2.
39
+ const OLD_PRICE = path.resolve(__dirname, '../../../../ledger-models-protos/fixtures/legacy_v0433/price.bin');
40
+
41
+ // ---- stamp round-trips (metric 2) ----
42
+
43
+ test('a stamped price round-trips type and version', () => {
44
+ const price = objectTypes.stamp(new PriceProto(), ObjectTypeProto.OBJECT_TYPE_PRICE);
45
+ const bytes = price.serializeBinary();
46
+ // Exactly field 1 (varint 11) and field 2 ({patch: 1}): nothing at the
47
+ // removed 1001-1004.
48
+ expect(Array.from(bytes)).toEqual([0x08, 11, 0x12, 0x02, 0x18, 0x01]);
49
+
50
+ const reread = PriceProto.deserializeBinary(bytes);
51
+ expect(objectTypes.readType(reread)).toBe(ObjectTypeProto.OBJECT_TYPE_PRICE);
52
+ expect(objectTypes.readVersion(reread)).toEqual([0, 0, 1]);
53
+ const version = reread.getVersion() as VersionProto;
54
+ expect([version.getMajor(), version.getMinor(), version.getPatch()]).toEqual([0, 0, 1]);
55
+ // Nothing unknown kept on re-serialising.
56
+ expect(Array.from(reread.serializeBinary())).toEqual(Array.from(bytes));
126
57
  });
127
58
 
128
- const fallbackWarnings = (): number => warn.mock.calls.filter((args) => String(args[0]).includes('(LM-297)')).length;
129
-
130
- // ---- Loading the old form translates it (metric 3) ----
131
-
132
- describe.each(CASES.map((c) => [c.name, c] as const))('fixture row %s', (_name, c) => {
133
- test('decodes to the expected type and version', () => {
134
- const message = decode(c);
135
- expect(objectTypes.readType(message)).toBe(ObjectTypeProto[c.expect.object_type]);
136
- expect(objectTypes.readVersion(message)).toEqual(c.expect.version);
137
- expect(fallbackWarnings()).toBe(c.expect.warns ? 1 : 0);
138
- });
139
-
140
- test('re-serialises with the compact fields once upgraded', () => {
141
- const data = objectTypes.upgrade(decode(c)).serializeBinary();
142
- const expected: Record<string, number> = {
143
- object_type: ObjectTypeProto[c.expect.object_type],
144
- version_major: c.expect.version[0],
145
- version_minor: c.expect.version[1],
146
- version_patch: c.expect.version[2],
147
- };
148
- const present = topLevelFieldNumbers(data);
149
- for (const [name, number] of Object.entries(COMPACT_NUMBERS)) {
150
- expect([name, present.includes(number)]).toEqual([name, expected[name] !== 0]);
151
- }
152
- const reread = CLASSES.get(c.message)!.deserializeBinary(data);
153
- expect([reread.getObjectType(), reread.getVersionMajor(), reread.getVersionMinor(), reread.getVersionPatch()])
154
- .toEqual([expected.object_type, expected.version_major, expected.version_minor, expected.version_patch]);
155
- expect([reread.getObjectClass(), reread.getVersion()]).toEqual([c.object_class, c.version]);
156
- });
59
+ test('an unstamped message reads as unknown and absent', () => {
60
+ const price = PriceProto.deserializeBinary(new PriceProto().serializeBinary());
61
+ expect(objectTypes.readType(price)).toBe(ObjectTypeProto.OBJECT_TYPE_UNKNOWN);
62
+ expect(objectTypes.readVersion(price)).toBeUndefined();
157
63
  });
158
64
 
159
- // ---- Reading the strings is deprecated (metric 4) ----
160
-
161
- test('three strings-only decodes of one type warn once', () => {
162
- const c = CASES.find((row) => row.name === 'js-PositionFilterProto')!;
163
- for (let i = 0; i < 3; i++) {
164
- objectTypes.upgrade(decode(c));
165
- }
166
- expect(fallbackWarnings()).toBe(1);
167
- });
65
+ // ---- Old bytes are not readable (metric 3) ----
168
66
 
169
- test('the new form does not warn', () => {
170
- const message = objectTypes.stamp(new PriceProto(), ObjectTypeProto.OBJECT_TYPE_PRICE, 'Price', '0.0.1');
171
- objectTypes.readType(message);
172
- objectTypes.readVersion(message);
173
- expect(fallbackWarnings()).toBe(0);
67
+ test('bytes from v0.4.33 are not readable', () => {
68
+ // Field 2 held the string "0.0.1", which does not parse as a VersionProto.
69
+ const old = new Uint8Array(fs.readFileSync(OLD_PRICE));
70
+ expect(() => PriceProto.deserializeBinary(old)).toThrow();
174
71
  });
175
72
 
176
- // ---- Writers set both forms (metric 2) ----
73
+ // ---- Every library writer stamps the new form (metric 2) ----
177
74
 
178
75
  /** A service with its gRPC client swapped for one that records each request. */
179
76
  function capturingService<S extends object>(cls: { prototype: S }, response: () => unknown): { service: S; requests: ObjectTyped[] } {
@@ -226,7 +123,7 @@ async function linkResolverRequests(): Promise<ObjectTyped[]> {
226
123
  return requests;
227
124
  }
228
125
 
229
- type Writer = [string, () => Promise<ObjectTyped>, ObjectTypeProto, string, string];
126
+ type Writer = [string, () => Promise<ObjectTyped>, ObjectTypeProto];
230
127
 
231
128
  async function lastRequest<S extends object>(cls: { prototype: S }, call: (service: S) => Promise<unknown>): Promise<ObjectTyped> {
232
129
  const { service, requests } = capturingService(cls, () => new SummaryProto());
@@ -236,41 +133,41 @@ async function lastRequest<S extends object>(cls: { prototype: S }, call: (servi
236
133
 
237
134
  const LIBRARY_WRITERS: Writer[] = [
238
135
  ['Price.fromSimple', async () => Price.fromSimple(UUID.random().toString(), 1, new Date()).proto,
239
- ObjectTypeProto.OBJECT_TYPE_PRICE, 'Price', '0.0.1'],
136
+ ObjectTypeProto.OBJECT_TYPE_PRICE],
240
137
  ['Price.create', async () => Price.create(new Decimal(1), security(), ZonedDateTime.now()).proto,
241
- ObjectTypeProto.OBJECT_TYPE_PRICE, 'Price', '0.0.1'],
138
+ ObjectTypeProto.OBJECT_TYPE_PRICE],
242
139
  ['PositionFilter.toProto', async () => filter().toProto(),
243
- ObjectTypeProto.OBJECT_TYPE_POSITION_FILTER, 'PositionFilter', '0.0.1'],
140
+ ObjectTypeProto.OBJECT_TYPE_POSITION_FILTER],
244
141
  ['QueryPositionRequest.toProto', async () => new QueryPositionRequest(
245
142
  filter(), PositionTypeProto.TRANSACTION, PositionViewProto.DEFAULT_VIEW, [], [], ZonedDateTime.now()).toProto(),
246
- ObjectTypeProto.OBJECT_TYPE_QUERY_POSITION_REQUEST, '', '1.0.0'],
143
+ ObjectTypeProto.OBJECT_TYPE_QUERY_POSITION_REQUEST],
247
144
  ['Transaction', async () => transaction().proto,
248
- ObjectTypeProto.OBJECT_TYPE_TRANSACTION, 'Transaction', '0.0.1'],
145
+ ObjectTypeProto.OBJECT_TYPE_TRANSACTION],
249
146
  ['Transaction strategy allocation', async () => transaction().proto.getStrategyAllocation()!,
250
- ObjectTypeProto.OBJECT_TYPE_STRATEGY_ALLOCATION, 'StrategyAllocation', '0.0.1'],
147
+ ObjectTypeProto.OBJECT_TYPE_STRATEGY_ALLOCATION],
251
148
  ['PriceService.validateCreateOrUpdate', () => lastRequest(PriceService, (s) => s.validateCreateOrUpdate(new PriceProto())),
252
- ObjectTypeProto.OBJECT_TYPE_CREATE_PRICE_REQUEST, 'PriceRequest', '0.0.1'],
149
+ ObjectTypeProto.OBJECT_TYPE_CREATE_PRICE_REQUEST],
253
150
  ['PriceService.search', () => lastRequest(PriceService, (s) => s.search(asOf, filter())),
254
- ObjectTypeProto.OBJECT_TYPE_QUERY_PRICE_REQUEST, 'PriceRequest', '0.0.1'],
151
+ ObjectTypeProto.OBJECT_TYPE_QUERY_PRICE_REQUEST],
255
152
  ['SecurityService.validateCreateSecurity', () => lastRequest(SecurityService, (s) => s.validateCreateSecurity(new SecurityProto())),
256
- ObjectTypeProto.OBJECT_TYPE_CREATE_SECURITY_REQUEST, 'SecurityRequest', '0.0.1'],
153
+ ObjectTypeProto.OBJECT_TYPE_CREATE_SECURITY_REQUEST],
257
154
  ['SecurityService.searchSecurity', () => lastRequest(SecurityService, (s) => s.searchSecurity(asOf, filter())),
258
- ObjectTypeProto.OBJECT_TYPE_QUERY_SECURITY_REQUEST, 'SecurityRequest', '0.0.1'],
155
+ ObjectTypeProto.OBJECT_TYPE_QUERY_SECURITY_REQUEST],
259
156
  ['TransactionService.validateCreateTransaction', () => lastRequest(TransactionService,
260
157
  (s) => s.validateCreateTransaction({ proto: new TransactionProto() } as Transaction)),
261
- ObjectTypeProto.OBJECT_TYPE_CREATE_TRANSACTION_REQUEST, 'TransactionRequest', '0.0.1'],
158
+ ObjectTypeProto.OBJECT_TYPE_CREATE_TRANSACTION_REQUEST],
262
159
  ['TransactionService.searchTransaction', () => lastRequest(TransactionService, (s) => s.searchTransaction(asOf, filter())),
263
- ObjectTypeProto.OBJECT_TYPE_QUERY_TRANSACTION_REQUEST, 'SecurityRequest', '0.0.1'],
160
+ ObjectTypeProto.OBJECT_TYPE_QUERY_TRANSACTION_REQUEST],
264
161
  ['PortfolioService.validateCreatePortfolio', () => lastRequest(PortfolioService, (s) => s.validateCreatePortfolio(new PortfolioProto())),
265
- ObjectTypeProto.OBJECT_TYPE_CREATE_PORTFOLIO_REQUEST, 'PortfolioRequest', '0.0.1'],
162
+ ObjectTypeProto.OBJECT_TYPE_CREATE_PORTFOLIO_REQUEST],
266
163
  ['PortfolioService.searchPortfolio', () => lastRequest(PortfolioService, (s) => s.searchPortfolio(asOf, filter())),
267
- ObjectTypeProto.OBJECT_TYPE_QUERY_PORTFOLIO_REQUEST, 'PortfolioRequest', '0.0.1'],
164
+ ObjectTypeProto.OBJECT_TYPE_QUERY_PORTFOLIO_REQUEST],
268
165
  ['LinkResolver securities', async () => (await linkResolverRequests())[0],
269
- ObjectTypeProto.OBJECT_TYPE_QUERY_SECURITY_REQUEST, 'SecurityRequest', '0.0.1'],
166
+ ObjectTypeProto.OBJECT_TYPE_QUERY_SECURITY_REQUEST],
270
167
  ['LinkResolver portfolios', async () => (await linkResolverRequests())[1],
271
- ObjectTypeProto.OBJECT_TYPE_QUERY_PORTFOLIO_REQUEST, 'PortfolioRequest', '0.0.1'],
168
+ ObjectTypeProto.OBJECT_TYPE_QUERY_PORTFOLIO_REQUEST],
272
169
  ['LinkResolver transactions', async () => (await linkResolverRequests())[2],
273
- ObjectTypeProto.OBJECT_TYPE_QUERY_TRANSACTION_REQUEST, 'TransactionRequest', '0.0.1'],
170
+ ObjectTypeProto.OBJECT_TYPE_QUERY_TRANSACTION_REQUEST],
274
171
  ];
275
172
 
276
173
  function transaction(): Transaction {
@@ -286,22 +183,10 @@ function transaction(): Transaction {
286
183
  });
287
184
  }
288
185
 
289
- test.each(LIBRARY_WRITERS)('%s sets strings and compact fields that agree', async (_name, build, type, objectClass, version) => {
186
+ test.each(LIBRARY_WRITERS)('%s stamps the type and schema version', async (_name, build, type) => {
290
187
  const message = await build();
291
188
 
292
- expect([message.getObjectClass(), message.getVersion()]).toEqual([objectClass, version]);
293
- // The message's own type. Some JS writers put a query request's string on the
294
- // create request too; the string still sits on one enum value.
295
- expect(message.getObjectType()).toBe(type);
296
- if (objectClass) {
297
- expect(objectTypes.fromLegacy(objectClass)).not.toBe(ObjectTypeProto.OBJECT_TYPE_UNKNOWN);
298
- }
299
- expect([message.getVersionMajor(), message.getVersionMinor(), message.getVersionPatch()])
300
- .toEqual(objectTypes.parseVersion(version));
301
- expect(objectTypes.readVersion(message)).toEqual(objectTypes.parseVersion(version));
302
- expect(fallbackWarnings()).toBe(0);
303
- });
304
-
305
- test('stamp rejects a malformed version', () => {
306
- expect(() => objectTypes.stamp(new PriceProto(), ObjectTypeProto.OBJECT_TYPE_PRICE, 'Price', '1.2')).toThrow();
189
+ expect(objectTypes.readType(message)).toBe(type);
190
+ expect(objectTypes.readVersion(message)).toEqual(objectTypes.SCHEMA_VERSION);
191
+ expect(objectTypes.SCHEMA_VERSION).toEqual([0, 0, 1]);
307
192
  });
@@ -1,207 +1,53 @@
1
1
  /**
2
- * Compact object type and version (LM-297), stage 1: write both forms, read the new one.
2
+ * Object type and version (LM-297, LM-318).
3
3
  *
4
- * Every message with `string object_class = 1` and `string version = 2` also
5
- * carries `ObjectTypeProto object_type = 1001` and `uint32 version_major /
6
- * version_minor / version_patch = 1002-1004`. Writers call `stamp`, which sets
7
- * the strings and the new fields. Readers call `readType` / `readVersion` (or
8
- * `upgrade`), which use the new fields and fall back to the deprecated strings,
9
- * logging one `console.warn` per distinct pair of strings. A fallback never
10
- * throws: an unknown object_class gives OBJECT_TYPE_UNKNOWN and a malformed
11
- * version gives 0.0.0. Empty strings are the proto3 default and fall back
12
- * silently.
13
- *
14
- * google-protobuf cannot read the `(legacy_object_class)` options at runtime,
15
- * so the string map comes from object-type-legacy.json, generated by
16
- * scripts/gen-object-type-legacy-map.py. See docs/adr/compact_object_type_and_version.md.
4
+ * Every message that names its type carries `ObjectTypeProto object_type = 1`
5
+ * and `VersionProto version = 2`. Writers call `stamp`, which sets the type and
6
+ * `SCHEMA_VERSION`. Readers call `readType` / `readVersion`. The old
7
+ * `object_class` / `version` strings were replaced in place by LM-318: bytes
8
+ * written before it are not readable. See
9
+ * docs/adr/compact_object_type_and_version.md.
17
10
  */
18
11
  import { ObjectTypeProto } from '../../fintekkers/models/util/object_type_pb';
19
- import legacyMirror from './object-type-legacy.json';
12
+ import { VersionProto } from '../../fintekkers/models/util/version_pb';
20
13
 
21
- /** Any generated message that carries object_class / version and their compact form. */
14
+ /** Any generated message that carries object_type and version. */
22
15
  export interface ObjectTyped {
23
- getObjectClass(): string;
24
- setObjectClass(value: string): unknown;
25
- getVersion(): string;
26
- setVersion(value: string): unknown;
27
16
  getObjectType(): ObjectTypeProto;
28
17
  setObjectType(value: ObjectTypeProto): unknown;
29
- getVersionMajor(): number;
30
- setVersionMajor(value: number): unknown;
31
- getVersionMinor(): number;
32
- setVersionMinor(value: number): unknown;
33
- getVersionPatch(): number;
34
- setVersionPatch(value: number): unknown;
18
+ hasVersion(): boolean;
19
+ getVersion(): VersionProto | undefined;
20
+ setVersion(value?: VersionProto): unknown;
35
21
  }
36
22
 
37
23
  /** [major, minor, patch], each a uint32. */
38
24
  export type Version = [number, number, number];
39
25
 
40
- const UINT32_MAX = 0xffffffff;
41
- const VERSION_PATTERN = /^[0-9]+\.[0-9]+\.[0-9]+$/;
42
-
43
- function buildLegacyMap(): Map<string, ObjectTypeProto> {
44
- const map = new Map<string, ObjectTypeProto>();
45
- for (const [legacy, name] of Object.entries(legacyMirror.legacy_object_class)) {
46
- if (!Object.prototype.hasOwnProperty.call(ObjectTypeProto, name)) {
47
- throw new Error(`object-type-legacy.json names ${name}, which ObjectTypeProto lacks: regenerate it`);
48
- }
49
- map.set(legacy, ObjectTypeProto[name as keyof typeof ObjectTypeProto]);
50
- }
51
- return map;
52
- }
53
-
54
- const LEGACY = buildLegacyMap();
55
- const warned = new Set<string>();
56
- const UNKNOWN_NAME = Object.keys(ObjectTypeProto)
57
- .find((name) => ObjectTypeProto[name as keyof typeof ObjectTypeProto] === ObjectTypeProto.OBJECT_TYPE_UNKNOWN) as string;
58
- const PREFIX = UNKNOWN_NAME.slice(0, -'UNKNOWN'.length);
59
- const CAMEL_BOUNDARY = /(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/g;
60
- const ownTypes = new WeakMap<object, ObjectTypeProto>();
61
-
62
- /** The ObjectTypeProto value an object_class string stands for, or OBJECT_TYPE_UNKNOWN. */
63
- export function fromLegacy(objectClass: string): ObjectTypeProto {
64
- return LEGACY.get(objectClass) ?? ObjectTypeProto.OBJECT_TYPE_UNKNOWN;
65
- }
66
-
67
- /**
68
- * The ObjectTypeProto value named for a message type, or OBJECT_TYPE_UNKNOWN.
69
- * Uses the enum's naming rule: `QuerySecurityRequestProto` ->
70
- * OBJECT_TYPE_QUERY_SECURITY_REQUEST.
71
- */
72
- export function ownType(messageName: string): ObjectTypeProto {
73
- const base = messageName.endsWith('Proto') ? messageName.slice(0, -'Proto'.length) : messageName;
74
- const name = PREFIX + base.replace(CAMEL_BOUNDARY, '_').toUpperCase();
75
- return Object.prototype.hasOwnProperty.call(ObjectTypeProto, name)
76
- ? ObjectTypeProto[name as keyof typeof ObjectTypeProto]
77
- : ObjectTypeProto.OBJECT_TYPE_UNKNOWN;
78
- }
79
-
80
- /**
81
- * The generated class name of `message`. google-protobuf's classes are
82
- * anonymous functions, but each generated module exports its classes under
83
- * the global `proto` namespace by full name, so search that.
84
- */
85
- function messageName(ctor: object, namespace: unknown, depth = 0): string | undefined {
86
- if (typeof namespace !== 'object' || namespace === null || depth > 8) return undefined;
87
- for (const [key, value] of Object.entries(namespace)) {
88
- if (value === ctor) return key;
89
- const found = messageName(ctor, value, depth + 1);
90
- if (found !== undefined) return found;
91
- }
92
- return undefined;
93
- }
94
-
95
- function ownTypeOf(message: ObjectTyped): ObjectTypeProto {
96
- const ctor = message.constructor;
97
- let type = ownTypes.get(ctor);
98
- if (type === undefined) {
99
- const name = messageName(ctor, (globalThis as { proto?: unknown }).proto);
100
- type = name === undefined ? ObjectTypeProto.OBJECT_TYPE_UNKNOWN : ownType(name);
101
- ownTypes.set(ctor, type);
102
- }
103
- return type;
104
- }
105
-
106
- /** '1.2.3' -> [1, 2, 3]; null unless exactly three decimal uint32 parts. */
107
- export function parseVersion(version: string): Version | null {
108
- if (!VERSION_PATTERN.test(version)) return null;
109
- const parts = version.split('.').map(Number);
110
- if (parts.some((p) => p > UINT32_MAX)) return null;
111
- return [parts[0], parts[1], parts[2]];
112
- }
26
+ /** The schema version `stamp` writes. Not the library release. */
27
+ export const SCHEMA_VERSION: Version = [0, 0, 1];
113
28
 
114
29
  /**
115
- * Sets object_class / version and their compact form on `message`; returns it.
116
- * `objectType` is the message's own ObjectTypeProto value. `version` must be
117
- * empty or three uint32 parts.
30
+ * Sets object_type and version (`SCHEMA_VERSION`) on `message`; returns it.
31
+ * `objectType` is the message's own ObjectTypeProto value.
118
32
  */
119
- export function stamp<T extends ObjectTyped>(message: T, objectType: ObjectTypeProto, objectClass: string, version: string): T {
120
- const parts = version ? parseVersion(version) : [0, 0, 0];
121
- if (parts === null) {
122
- throw new Error(`version must be MAJOR.MINOR.PATCH, got '${version}'`);
123
- }
124
- message.setObjectClass(objectClass);
125
- message.setVersion(version);
33
+ export function stamp<T extends ObjectTyped>(message: T, objectType: ObjectTypeProto): T {
34
+ const [major, minor, patch] = SCHEMA_VERSION;
126
35
  message.setObjectType(objectType);
127
- setCompactVersion(message, parts as Version);
36
+ message.setVersion(new VersionProto().setMajor(major).setMinor(minor).setPatch(patch));
128
37
  return message;
129
38
  }
130
39
 
131
- function setCompactVersion(message: ObjectTyped, [major, minor, patch]: Version): void {
132
- message.setVersionMajor(major);
133
- message.setVersionMinor(minor);
134
- message.setVersionPatch(patch);
135
- }
136
-
137
- function compactVersion(message: ObjectTyped): Version {
138
- return [message.getVersionMajor(), message.getVersionMinor(), message.getVersionPatch()];
139
- }
140
-
141
- function decode(message: ObjectTyped): { objectType: ObjectTypeProto; version: Version } {
142
- const objectClass = message.getObjectClass();
143
- const versionString = message.getVersion();
144
- let objectType = message.getObjectType();
145
- let version = compactVersion(message);
146
- const problems: string[] = [];
147
- let usedStrings = false;
148
-
149
- if (objectType === ObjectTypeProto.OBJECT_TYPE_UNKNOWN && objectClass) {
150
- usedStrings = true;
151
- objectType = fromLegacy(objectClass);
152
- if (objectType === ObjectTypeProto.OBJECT_TYPE_UNKNOWN) {
153
- problems.push(' (unknown object_class, using OBJECT_TYPE_UNKNOWN)');
154
- } else {
155
- // Some strings were written on more than one message type (e.g.
156
- // 'SecurityRequest' on the create and query requests): the message's
157
- // own type wins over the value the string sits on.
158
- const own = ownTypeOf(message);
159
- if (own !== ObjectTypeProto.OBJECT_TYPE_UNKNOWN) objectType = own;
160
- }
161
- }
162
- if (version.every((p) => p === 0) && versionString) {
163
- usedStrings = true;
164
- const parsed = parseVersion(versionString);
165
- if (parsed === null) {
166
- problems.push(' (malformed version, using 0.0.0)');
167
- } else {
168
- version = parsed;
169
- }
170
- }
171
-
172
- const key = `${objectClass}\u0000${versionString}`;
173
- if (usedStrings && !warned.has(key)) {
174
- warned.add(key);
175
- console.warn(
176
- `${message.constructor.name} read from deprecated strings object_class='${objectClass}' ` +
177
- `version='${versionString}'${problems.join('')}; re-save it to write object_type and ` +
178
- 'version_major/minor/patch (LM-297)');
179
- }
180
- return { objectType, version };
181
- }
182
-
183
- /** The message's ObjectTypeProto value: object_type, else the object_class string. */
184
- export function readType(message: ObjectTyped): ObjectTypeProto {
185
- return decode(message).objectType;
186
- }
187
-
188
- /** The message's [major, minor, patch]: the compact fields, else the version string. */
189
- export function readVersion(message: ObjectTyped): Version {
190
- return decode(message).version;
191
- }
192
-
193
40
  /**
194
- * Fills the compact fields from the strings where they are unset; returns `message`.
195
- * The strings are kept, so re-serialising writes both forms.
41
+ * The message's ObjectTypeProto value; OBJECT_TYPE_UNKNOWN when unset. A value
42
+ * added after this build is returned as its number.
196
43
  */
197
- export function upgrade<T extends ObjectTyped>(message: T): T {
198
- const { objectType, version } = decode(message);
199
- message.setObjectType(objectType);
200
- setCompactVersion(message, version);
201
- return message;
44
+ export function readType(message: ObjectTyped): ObjectTypeProto {
45
+ return message.getObjectType();
202
46
  }
203
47
 
204
- /** Forgets which strings have warned. Tests only. */
205
- export function resetWarningsForTests(): void {
206
- warned.clear();
48
+ /** The message's [major, minor, patch], or undefined when version is absent. */
49
+ export function readVersion(message: ObjectTyped): Version | undefined {
50
+ const version = message.getVersion();
51
+ if (!message.hasVersion() || version === undefined) return undefined;
52
+ return [version.getMajor(), version.getMinor(), version.getPatch()];
207
53
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fintekkers/ledger-models",
3
3
  "todo": "Replace the version with build script version number",
4
- "version": "0.4.42",
4
+ "version": "0.4.44",
5
5
  "description": "ledger model protos ",
6
6
  "authors": [
7
7
  "David Doherty",
@@ -1,107 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- var uuid_1 = require("../utils/uuid");
40
- var any_pb_1 = require("google-protobuf/google/protobuf/any_pb");
41
- var decimal_value_pb_1 = require("../../../fintekkers/models/util/decimal_value_pb");
42
- var position_pb_1 = require("../../../fintekkers/models/position/position_pb");
43
- var position_util_pb_1 = require("../../../fintekkers/models/position/position_util_pb");
44
- var field_pb_1 = require("../../../fintekkers/models/position/field_pb");
45
- var measure_pb_1 = require("../../../fintekkers/models/position/measure_pb");
46
- var security_pb_1 = require("../../../fintekkers/models/security/security_pb");
47
- var portfolio_pb_1 = require("../../../fintekkers/models/portfolio/portfolio_pb");
48
- var position_1 = require("./position");
49
- var date_1 = require("../utils/date");
50
- var position_status_pb_1 = require("../../../fintekkers/models/position/position_status_pb");
51
- test('test the position wrapper', function () { return __awaiter(void 0, void 0, void 0, function () {
52
- var isTrue;
53
- return __generator(this, function (_a) {
54
- switch (_a.label) {
55
- case 0: return [4 /*yield*/, testSerialization()];
56
- case 1:
57
- isTrue = _a.sent();
58
- expect(isTrue).toBe(true);
59
- return [2 /*return*/];
60
- }
61
- });
62
- }); });
63
- function testSerialization() {
64
- return __awaiter(this, void 0, void 0, function () {
65
- var fields, security, portfolio, tradeDate, productType, id, measure, measureValue, tradeDatePacked, idPacked, positionProto, position, tradeDatePosition, securityPosition, portfolioPosition, positionID;
66
- return __generator(this, function (_a) {
67
- fields = [field_pb_1.FieldProto.ID, field_pb_1.FieldProto.TRADE_DATE, field_pb_1.FieldProto.PRODUCT_TYPE, field_pb_1.FieldProto.PORTFOLIO, field_pb_1.FieldProto.SECURITY];
68
- security = new security_pb_1.SecurityProto().setAssetClass("Test");
69
- portfolio = new portfolio_pb_1.PortfolioProto().setPortfolioName("Test portfolio");
70
- tradeDate = date_1.LocalDate.today().toDate();
71
- productType = "Test product type";
72
- id = new uuid_1.UUID(uuid_1.UUID.random().toBytes());
73
- measure = measure_pb_1.MeasureProto.DIRECTED_QUANTITY;
74
- measureValue = new decimal_value_pb_1.DecimalValueProto().setArbitraryPrecisionValue("1.0");
75
- tradeDatePacked = new any_pb_1.Any();
76
- tradeDatePacked.setTypeUrl("Doesn't matter");
77
- tradeDatePacked.setValue(date_1.LocalDate.from(tradeDate).toProto().serializeBinary());
78
- idPacked = new any_pb_1.Any();
79
- idPacked.setTypeUrl("Doesn't matter");
80
- idPacked.setValue(id.toUUIDProto().serializeBinary());
81
- positionProto = new position_pb_1.PositionProto();
82
- positionProto.setFieldsList([
83
- new position_util_pb_1.FieldMapEntry().setField(field_pb_1.FieldProto.TRADE_DATE).setFieldValuePacked(tradeDatePacked),
84
- new position_util_pb_1.FieldMapEntry().setField(field_pb_1.FieldProto.SECURITY).setFieldValuePacked(security),
85
- new position_util_pb_1.FieldMapEntry().setField(field_pb_1.FieldProto.PORTFOLIO).setFieldValuePacked(portfolio),
86
- new position_util_pb_1.FieldMapEntry().setField(field_pb_1.FieldProto.POSITION_STATUS).setEnumValue(position_status_pb_1.PositionStatusProto.EXECUTED),
87
- new position_util_pb_1.FieldMapEntry().setField(field_pb_1.FieldProto.PRODUCT_TYPE).setStringValue(productType),
88
- new position_util_pb_1.FieldMapEntry().setField(field_pb_1.FieldProto.ID).setFieldValuePacked(idPacked),
89
- ]);
90
- position = new position_1.Position(positionProto);
91
- tradeDatePosition = position.getFieldValue(field_pb_1.FieldProto.TRADE_DATE);
92
- expect(tradeDate.getFullYear()).toBe(tradeDatePosition.getFullYear());
93
- expect(tradeDate.getMonth()).toBe(tradeDatePosition.getMonth());
94
- expect(tradeDate.getDay()).toBe(tradeDatePosition.getDay());
95
- securityPosition = position.getFieldValue(field_pb_1.FieldProto.SECURITY);
96
- expect(securityPosition.getAssetClass()).toBe(security.getAssetClass());
97
- portfolioPosition = position.getFieldValue(field_pb_1.FieldProto.PORTFOLIO);
98
- expect(portfolioPosition.getPortfolioName()).toBe(portfolio.getPortfolioName());
99
- expect(position.getFieldValue(field_pb_1.FieldProto.PRODUCT_TYPE)).toBe(productType);
100
- positionID = position.getFieldValue(field_pb_1.FieldProto.ID);
101
- expect(positionID.toString()).toBe(id.toString());
102
- expect(position.getFieldValue(field_pb_1.FieldProto.POSITION_STATUS)).toBe(position_status_pb_1.PositionStatusProto.EXECUTED);
103
- return [2 /*return*/, true];
104
- });
105
- });
106
- }
107
- //# sourceMappingURL=position.test%20copy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"position.test copy.js","sourceRoot":"","sources":["position.test copy.ts"],"names":[],"mappings":"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"}