UNPKG

@ngraveio/bc-ur-multi-layer-sync

Version:

Provides BC-UR types for syncing multiple coins and accounts from cold wallets to watch only wallets.

116 lines 5.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CryptoPortfolioMetadata = void 0; const bc_ur_registry_1 = require("@keystonehq/bc-ur-registry"); const RegistryType_1 = require("./RegistryType"); const LanguageCodes_1 = require("./LanguageCodes"); const { RegistryTypes, decodeToDataItem } = bc_ur_registry_1.extend; /** CDDL * * metadata = { * ? sync_id: bytes .size 16 ; Generated by the hardware wallet to identify * the device * ? language: language_code, ; Indicates the selected language selected * on the hardware wallet * ? fw_version: string, ; Firmware version of the hardware wallet * ? device: string ; Indicates the device name * * tstr => any ; Extendable new metadata * } * * sync_id = 1 * language = 2 * fw_version = 3 * device = 4 * * language_code = string ; following [ISO 639-1] Code (e.g. "en" for English, * "fr" for French, "nl" for Dutch and "es" for Spanish * */ var Keys; (function (Keys) { Keys[Keys["syncId"] = 1] = "syncId"; Keys[Keys["language"] = 2] = "language"; Keys[Keys["firmwareVersion"] = 3] = "firmwareVersion"; Keys[Keys["device"] = 4] = "device"; })(Keys || (Keys = {})); class CryptoPortfolioMetadata extends bc_ur_registry_1.RegistryItem { constructor(metadata = {}) { super(); this.metadata = metadata; //private metadata: ICryptoPortfolioMetadata; this.getRegistryType = () => RegistryType_1.ExtendedRegistryTypes.CRYPTO_SYNC_METADATA; this.getSyncId = () => { // should pad the left of the buffer with 0 if smaller than 16 if (this.metadata.syncId) { return Buffer.concat([ Buffer.alloc(16 - this.metadata.syncId.length), this.metadata.syncId, ]); } }; this.getLanguageCode = () => this.metadata.languageCode; this.getFirmwareVersion = () => this.metadata.firmwareVersion; this.getDevice = () => this.metadata.device; this.getData = () => { const clone = { ...this.metadata }; // Remove undefined values Object.keys(clone).forEach(key => clone[key] === undefined && delete clone[key]); return clone; }; this.toDataItem = () => { // Lets create an empty map let map = {}; let padRemovedSyncId = this.metadata.syncId; // Remove starting zeros from sync id buffer while (padRemovedSyncId && padRemovedSyncId[0] === 0) { padRemovedSyncId = padRemovedSyncId.slice(1); } // Add all known types to the map with integer keys if (this.metadata.syncId) map[Keys.syncId] = padRemovedSyncId; if (this.metadata.languageCode) map[Keys.language] = this.metadata.languageCode; if (this.metadata.firmwareVersion) map[Keys.firmwareVersion] = this.metadata.firmwareVersion; if (this.metadata.device) map[Keys.device] = this.metadata.device; // Add all unknown types to the map with string keys // Clone the metadata object and remove all known types const unknownTypes = { ...this.metadata }; delete unknownTypes.syncId; delete unknownTypes.languageCode; delete unknownTypes.firmwareVersion; delete unknownTypes.device; // Add all unknown types to the map map = { ...map, ...unknownTypes }; return new bc_ur_registry_1.DataItem(map); }; // If language code is incorrect, throw error if (metadata.languageCode && !LanguageCodes_1.languages[metadata.languageCode]) { throw new Error("Invalid language code"); } // sync id buffer size must be maximum 16 otherwise throw error if (metadata.syncId && metadata.syncId.length > 16) { throw new Error("Sync id buffer size must be maximum 16"); } // TODO: make firmware version valid SemVer } } exports.CryptoPortfolioMetadata = CryptoPortfolioMetadata; CryptoPortfolioMetadata.fromDataItem = (dataItem) => { const map = dataItem.getData(); const syncId = map[Keys.syncId] || map['syncId']; const languageCode = map[Keys.language] || map['language']; const firmwareVersion = map[Keys.firmwareVersion] || map['firmwareVersion']; const device = map[Keys.device] || map['device']; // Remove all known types from the map for (const key of Object.keys(Keys)) { delete map[key]; } return new CryptoPortfolioMetadata({ ...map, syncId, languageCode, firmwareVersion, device }); }; CryptoPortfolioMetadata.fromCBOR = (_cborPayload) => { const dataItem = decodeToDataItem(_cborPayload); return CryptoPortfolioMetadata.fromDataItem(dataItem); }; //# sourceMappingURL=CryptoPortfolioMetadata.js.map