@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
JavaScript
;
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