mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
6d1170f06c
Co-authored-by: Mark Stacey <markjstacey@gmail.com> Co-authored-by: ricky <ricky.miller@gmail.com> Co-authored-by: Elliot Winkler <elliot.winkler@gmail.com> Co-authored-by: legobeat <109787230+legobeat@users.noreply.github.com> Co-authored-by: legobt <6wbvkn0j@anonaddy.me> Co-authored-by: Pedro Figueiredo <pedro.figueiredo@consensys.net>
1861 lines
58 KiB
Diff
1861 lines
58 KiB
Diff
diff --git a/src/Bytes.ts b/src/Bytes.ts
|
|
deleted file mode 100644
|
|
index a5f9f7d4facaf06bd2dc9deedb85cd331c9e75a0..0000000000000000000000000000000000000000
|
|
--- a/src/Bytes.ts
|
|
+++ /dev/null
|
|
@@ -1,34 +0,0 @@
|
|
-import { decodeToDataItem, DataItem } from './lib';
|
|
-import { RegistryItem } from './RegistryItem';
|
|
-import { RegistryTypes } from './RegistryType';
|
|
-
|
|
-export class Bytes extends RegistryItem {
|
|
- getRegistryType = () => {
|
|
- return RegistryTypes.BYTES;
|
|
- };
|
|
-
|
|
- constructor(private bytes: Buffer) {
|
|
- super();
|
|
- }
|
|
-
|
|
- getData = () => this.bytes;
|
|
-
|
|
- toDataItem = () => {
|
|
- return new DataItem(this.bytes);
|
|
- };
|
|
-
|
|
- public static fromDataItem = (dataItem: DataItem) => {
|
|
- const bytes = dataItem.getData();
|
|
- if (!bytes) {
|
|
- throw new Error(
|
|
- `#[ur-registry][Bytes][fn.fromDataItem]: decoded [dataItem][#data] is undefined: ${dataItem}`,
|
|
- );
|
|
- }
|
|
- return new Bytes(bytes);
|
|
- };
|
|
-
|
|
- public static fromCBOR = (_cborPayload: Buffer) => {
|
|
- const dataItem = decodeToDataItem(_cborPayload);
|
|
- return Bytes.fromDataItem(dataItem);
|
|
- };
|
|
-}
|
|
diff --git a/src/CryptoAccount.ts b/src/CryptoAccount.ts
|
|
deleted file mode 100644
|
|
index e6efeeb44a0b23428d172bd5aee99621d7469d19..0000000000000000000000000000000000000000
|
|
--- a/src/CryptoAccount.ts
|
|
+++ /dev/null
|
|
@@ -1,58 +0,0 @@
|
|
-import { CryptoOutput } from '.';
|
|
-import { decodeToDataItem, DataItem } from './lib';
|
|
-import { RegistryItem } from './RegistryItem';
|
|
-import { RegistryTypes } from './RegistryType';
|
|
-import { DataItemMap } from './types';
|
|
-
|
|
-enum Keys {
|
|
- masterFingerprint = 1,
|
|
- outputDescriptors,
|
|
-}
|
|
-
|
|
-export class CryptoAccount extends RegistryItem {
|
|
- getRegistryType = () => {
|
|
- return RegistryTypes.CRYPTO_ACCOUNT;
|
|
- };
|
|
-
|
|
- constructor(
|
|
- private masterFingerprint: Buffer,
|
|
- private outputDescriptors: CryptoOutput[],
|
|
- ) {
|
|
- super();
|
|
- }
|
|
-
|
|
- public getMasterFingerprint = () => this.masterFingerprint;
|
|
- public getOutputDescriptors = () => this.outputDescriptors;
|
|
-
|
|
- public toDataItem = () => {
|
|
- const map: DataItemMap = {};
|
|
- if (this.masterFingerprint) {
|
|
- map[Keys.masterFingerprint] = this.masterFingerprint.readUInt32BE(0);
|
|
- }
|
|
- if (this.outputDescriptors) {
|
|
- map[Keys.outputDescriptors] = this.outputDescriptors.map((item) =>
|
|
- item.toDataItem(),
|
|
- );
|
|
- }
|
|
- return new DataItem(map);
|
|
- };
|
|
-
|
|
- public static fromDataItem = (dataItem: DataItem) => {
|
|
- const map = dataItem.getData();
|
|
- const masterFingerprint = Buffer.alloc(4);
|
|
- const _masterFingerprint = map[Keys.masterFingerprint];
|
|
- if (_masterFingerprint) {
|
|
- masterFingerprint.writeUInt32BE(_masterFingerprint, 0);
|
|
- }
|
|
- const outputDescriptors = map[Keys.outputDescriptors] as DataItem[];
|
|
- const cryptoOutputs = outputDescriptors.map((item) =>
|
|
- CryptoOutput.fromDataItem(item),
|
|
- );
|
|
- return new CryptoAccount(masterFingerprint, cryptoOutputs);
|
|
- };
|
|
-
|
|
- public static fromCBOR = (_cborPayload: Buffer) => {
|
|
- const dataItem = decodeToDataItem(_cborPayload);
|
|
- return CryptoAccount.fromDataItem(dataItem);
|
|
- };
|
|
-}
|
|
diff --git a/src/CryptoCoinInfo.ts b/src/CryptoCoinInfo.ts
|
|
deleted file mode 100644
|
|
index 843b50cb0551def4be3ba8293f34ab94063c85a7..0000000000000000000000000000000000000000
|
|
--- a/src/CryptoCoinInfo.ts
|
|
+++ /dev/null
|
|
@@ -1,59 +0,0 @@
|
|
-import { decodeToDataItem, DataItem } from './lib';
|
|
-import { RegistryItem } from './RegistryItem';
|
|
-import { RegistryTypes } from './RegistryType';
|
|
-import { DataItemMap } from './types';
|
|
-
|
|
-enum Keys {
|
|
- type = '1',
|
|
- network = '2',
|
|
-}
|
|
-
|
|
-export enum Type {
|
|
- bitcoin = 0,
|
|
-}
|
|
-
|
|
-export enum Network {
|
|
- mainnet,
|
|
- testnet,
|
|
-}
|
|
-
|
|
-export class CryptoCoinInfo extends RegistryItem {
|
|
- getRegistryType = () => {
|
|
- return RegistryTypes.CRYPTO_COIN_INFO;
|
|
- };
|
|
-
|
|
- constructor(private type?: Type, private network?: Network) {
|
|
- super();
|
|
- }
|
|
-
|
|
- public getType = () => {
|
|
- return this.type || Type.bitcoin;
|
|
- };
|
|
-
|
|
- public getNetwork = () => {
|
|
- return this.network || Network.mainnet;
|
|
- };
|
|
-
|
|
- public toDataItem = () => {
|
|
- const map: DataItemMap = {};
|
|
- if (this.type) {
|
|
- map[Keys.type] = this.type;
|
|
- }
|
|
- if (this.network) {
|
|
- map[Keys.network] = this.network;
|
|
- }
|
|
- return new DataItem(map);
|
|
- };
|
|
-
|
|
- public static fromDataItem = (dataItem: DataItem) => {
|
|
- const map = dataItem.getData();
|
|
- const type = map[Keys.type];
|
|
- const network = map[Keys.network];
|
|
- return new CryptoCoinInfo(type, network);
|
|
- };
|
|
-
|
|
- public static fromCBOR = (_cborPayload: Buffer) => {
|
|
- const dataItem = decodeToDataItem(_cborPayload);
|
|
- return CryptoCoinInfo.fromDataItem(dataItem);
|
|
- };
|
|
-}
|
|
diff --git a/src/CryptoECKey.ts b/src/CryptoECKey.ts
|
|
deleted file mode 100644
|
|
index 54c3c4b0aabe13bdaff7821dd8524a6a789ed008..0000000000000000000000000000000000000000
|
|
--- a/src/CryptoECKey.ts
|
|
+++ /dev/null
|
|
@@ -1,68 +0,0 @@
|
|
-import { decodeToDataItem, DataItem } from './lib';
|
|
-import { RegistryItem } from './RegistryItem';
|
|
-import { RegistryTypes } from './RegistryType';
|
|
-import { DataItemMap, ICryptoKey } from './types';
|
|
-
|
|
-enum Keys {
|
|
- curve = 1,
|
|
- private,
|
|
- data,
|
|
-}
|
|
-
|
|
-export class CryptoECKey extends RegistryItem implements ICryptoKey {
|
|
- private data: Buffer;
|
|
- private curve: number | undefined;
|
|
- private privateKey: boolean | undefined;
|
|
- constructor(args: { data: Buffer; curve?: number; privateKey?: boolean }) {
|
|
- super();
|
|
- this.data = args.data;
|
|
- this.curve = args.curve;
|
|
- this.privateKey = args.privateKey || undefined;
|
|
- }
|
|
-
|
|
- isECKey = () => {
|
|
- return true;
|
|
- };
|
|
-
|
|
- public getCurve = () => this.curve || 0;
|
|
- public isPrivateKey = () => this.privateKey || false;
|
|
- public getData = () => this.data;
|
|
-
|
|
- getRegistryType = () => {
|
|
- return RegistryTypes.CRYPTO_ECKEY;
|
|
- };
|
|
-
|
|
- toDataItem = () => {
|
|
- const map: DataItemMap = {};
|
|
- if (this.curve) {
|
|
- map[Keys.curve] = this.curve;
|
|
- }
|
|
- if (this.privateKey !== undefined) {
|
|
- map[Keys.private] = this.privateKey;
|
|
- }
|
|
- map[Keys.data] = this.data;
|
|
- return new DataItem(map);
|
|
- };
|
|
-
|
|
- getOutputDescriptorContent = () => {
|
|
- return this.data.toString('hex');
|
|
- }
|
|
-
|
|
- static fromDataItem = (dataItem: DataItem) => {
|
|
- const map = dataItem.getData();
|
|
- const curve = map[Keys.curve];
|
|
- const privateKey = map[Keys.private];
|
|
- const data = map[Keys.data];
|
|
- if (!data) {
|
|
- throw new Error(
|
|
- `#[ur-registry][CryptoECKey][fn.fromDataItem]: decoded [dataItem][#data.data] is undefined: ${dataItem}`,
|
|
- );
|
|
- }
|
|
- return new CryptoECKey({ data, curve, privateKey });
|
|
- };
|
|
-
|
|
- public static fromCBOR = (_cborPayload: Buffer) => {
|
|
- const dataItem = decodeToDataItem(_cborPayload);
|
|
- return CryptoECKey.fromDataItem(dataItem);
|
|
- };
|
|
-}
|
|
diff --git a/src/CryptoHDKey.ts b/src/CryptoHDKey.ts
|
|
deleted file mode 100644
|
|
index 8fc2a82970fd2f639cb3912940c328308ec4ea2c..0000000000000000000000000000000000000000
|
|
--- a/src/CryptoHDKey.ts
|
|
+++ /dev/null
|
|
@@ -1,237 +0,0 @@
|
|
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
-// @ts-ignore
|
|
-import { encode } from 'bs58check';
|
|
-import { CryptoCoinInfo } from './CryptoCoinInfo';
|
|
-import { CryptoKeypath } from './CryptoKeypath';
|
|
-import { decodeToDataItem, DataItem } from './lib';
|
|
-import { RegistryItem } from './RegistryItem';
|
|
-import { RegistryTypes } from './RegistryType';
|
|
-import { DataItemMap, ICryptoKey } from './types';
|
|
-import { PathComponent } from './PathComponent';
|
|
-
|
|
-enum Keys {
|
|
- is_master = 1,
|
|
- is_private,
|
|
- key_data,
|
|
- chain_code,
|
|
- use_info,
|
|
- origin,
|
|
- children,
|
|
- parent_fingerprint,
|
|
- name,
|
|
- note,
|
|
-}
|
|
-
|
|
-type MasterKeyProps = {
|
|
- isMaster: true;
|
|
- key: Buffer;
|
|
- chainCode: Buffer;
|
|
-};
|
|
-
|
|
-type DeriveKeyProps = {
|
|
- isMaster: false;
|
|
- isPrivateKey?: boolean;
|
|
- key: Buffer;
|
|
- chainCode?: Buffer;
|
|
- useInfo?: CryptoCoinInfo;
|
|
- origin?: CryptoKeypath;
|
|
- children?: CryptoKeypath;
|
|
- parentFingerprint?: Buffer;
|
|
- name?: string;
|
|
- note?: string;
|
|
-};
|
|
-
|
|
-export class CryptoHDKey extends RegistryItem implements ICryptoKey {
|
|
- private master?: boolean;
|
|
- private privateKey?: boolean;
|
|
- private key?: Buffer;
|
|
- private chainCode?: Buffer;
|
|
- private useInfo?: CryptoCoinInfo;
|
|
- private origin?: CryptoKeypath;
|
|
- private children?: CryptoKeypath;
|
|
- private parentFingerprint?: Buffer;
|
|
- private name?: string;
|
|
- private note?: string;
|
|
-
|
|
- isECKey = () => {
|
|
- return false;
|
|
- };
|
|
-
|
|
- public getKey = () => this.key;
|
|
- public getChainCode = () => this.chainCode;
|
|
- public isMaster = () => this.master;
|
|
- public isPrivateKey = () => !!this.privateKey;
|
|
- public getUseInfo = () => this.useInfo;
|
|
- public getOrigin = () => this.origin;
|
|
- public getChildren = () => this.children;
|
|
- public getParentFingerprint = () => this.parentFingerprint;
|
|
- public getName = () => this.name;
|
|
- public getNote = () => this.note;
|
|
- public getBip32Key = () => {
|
|
- let version: Buffer;
|
|
- let depth: number;
|
|
- let index = 0;
|
|
- let parentFingerprint: Buffer = Buffer.alloc(4).fill(0);
|
|
- if (this.isMaster()) {
|
|
- // version bytes defined on https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#serialization-format
|
|
- version = Buffer.from('0488ADE4', 'hex');
|
|
- depth = 0;
|
|
- index = 0;
|
|
- } else {
|
|
- depth = this.getOrigin()?.getComponents().length || this.getOrigin()?.getDepth() as number;
|
|
- const paths = this.getOrigin()?.getComponents() as PathComponent[];
|
|
- const lastPath = paths[paths.length - 1];
|
|
- if (lastPath) {
|
|
- index = lastPath.isHardened() ? lastPath.getIndex()! + 0x80000000 : lastPath.getIndex()!;
|
|
- if (this.getParentFingerprint()) {
|
|
- parentFingerprint = this.getParentFingerprint() as Buffer;
|
|
- }
|
|
- }
|
|
- if (this.isPrivateKey()) {
|
|
- version = Buffer.from('0488ADE4', 'hex');
|
|
- } else {
|
|
- version = Buffer.from('0488B21E', 'hex');
|
|
- }
|
|
- }
|
|
- const depthBuffer = Buffer.alloc(1);
|
|
- depthBuffer.writeUInt8(depth, 0);
|
|
- const indexBuffer = Buffer.alloc(4);
|
|
- indexBuffer.writeUInt32BE(index, 0);
|
|
- const chainCode = this.getChainCode();
|
|
- const key = this.getKey();
|
|
- return encode(Buffer.concat([version, depthBuffer, parentFingerprint, indexBuffer, chainCode as Buffer, key as Buffer]));
|
|
- };
|
|
-
|
|
- public getRegistryType = () => {
|
|
- return RegistryTypes.CRYPTO_HDKEY;
|
|
- };
|
|
-
|
|
- public getOutputDescriptorContent = () => {
|
|
- let result = '';
|
|
- if (this.getOrigin()) {
|
|
- if (this.getOrigin()?.getSourceFingerprint() && this.getOrigin()?.getPath()) {
|
|
- result += `${this.getOrigin()?.getSourceFingerprint()?.toString('hex')}/${this.getOrigin()?.getPath()}`;
|
|
- }
|
|
- }
|
|
- result += this.getBip32Key();
|
|
- if (this.getChildren()) {
|
|
- if (this.getChildren()?.getPath()) {
|
|
- result += `/${this.getChildren()?.getPath()}`;
|
|
- }
|
|
- }
|
|
- return result;
|
|
- };
|
|
-
|
|
- constructor(args: DeriveKeyProps | MasterKeyProps) {
|
|
- super();
|
|
- if (args.isMaster) {
|
|
- this.setupMasterKey(args);
|
|
- } else {
|
|
- this.setupDeriveKey(args as DeriveKeyProps);
|
|
- }
|
|
- }
|
|
-
|
|
- private setupMasterKey = (args: MasterKeyProps) => {
|
|
- this.master = true;
|
|
- this.key = args.key;
|
|
- this.chainCode = args.chainCode;
|
|
- };
|
|
-
|
|
- private setupDeriveKey = (args: DeriveKeyProps) => {
|
|
- this.master = false;
|
|
- this.privateKey = args.isPrivateKey;
|
|
- this.key = args.key;
|
|
- this.chainCode = args.chainCode;
|
|
- this.useInfo = args.useInfo;
|
|
- this.origin = args.origin;
|
|
- this.children = args.children;
|
|
- this.parentFingerprint = args.parentFingerprint;
|
|
- this.name = args.name;
|
|
- this.note = args.note;
|
|
- };
|
|
-
|
|
- public toDataItem = () => {
|
|
- const map: DataItemMap = {};
|
|
- if (this.master) {
|
|
- map[Keys.is_master] = true;
|
|
- map[Keys.key_data] = this.key;
|
|
- map[Keys.chain_code] = this.chainCode;
|
|
- } else {
|
|
- if (this.privateKey !== undefined) {
|
|
- map[Keys.is_private] = this.privateKey;
|
|
- }
|
|
- map[Keys.key_data] = this.key;
|
|
- if (this.chainCode) {
|
|
- map[Keys.chain_code] = this.chainCode;
|
|
- }
|
|
- if (this.useInfo) {
|
|
- const useInfo = this.useInfo.toDataItem();
|
|
- useInfo.setTag(this.useInfo.getRegistryType().getTag());
|
|
- map[Keys.use_info] = useInfo;
|
|
- }
|
|
- if (this.origin) {
|
|
- const origin = this.origin.toDataItem();
|
|
- origin.setTag(this.origin.getRegistryType().getTag());
|
|
- map[Keys.origin] = origin;
|
|
- }
|
|
- if (this.children) {
|
|
- const children = this.children.toDataItem();
|
|
- children.setTag(this.children.getRegistryType().getTag());
|
|
- map[Keys.children] = children;
|
|
- }
|
|
- if (this.parentFingerprint) {
|
|
- map[Keys.parent_fingerprint] = this.parentFingerprint.readUInt32BE(0);
|
|
- }
|
|
- if (this.name !== undefined) {
|
|
- map[Keys.name] = this.name;
|
|
- }
|
|
- if (this.note !== undefined) {
|
|
- map[Keys.note] = this.note;
|
|
- }
|
|
- }
|
|
- return new DataItem(map);
|
|
- };
|
|
-
|
|
- public static fromDataItem = (dataItem: DataItem) => {
|
|
- const map = dataItem.getData();
|
|
- const isMaster = !!map[Keys.is_master];
|
|
- const isPrivateKey = map[Keys.is_private];
|
|
- const key = map[Keys.key_data];
|
|
- const chainCode = map[Keys.chain_code];
|
|
- const useInfo = map[Keys.use_info]
|
|
- ? CryptoCoinInfo.fromDataItem(map[Keys.use_info])
|
|
- : undefined;
|
|
- const origin = map[Keys.origin]
|
|
- ? CryptoKeypath.fromDataItem(map[Keys.origin])
|
|
- : undefined;
|
|
- const children = map[Keys.children]
|
|
- ? CryptoKeypath.fromDataItem(map[Keys.children])
|
|
- : undefined;
|
|
- const _parentFingerprint = map[Keys.parent_fingerprint];
|
|
- let parentFingerprint: Buffer | undefined = undefined;
|
|
- if (_parentFingerprint) {
|
|
- parentFingerprint = Buffer.alloc(4);
|
|
- parentFingerprint.writeUInt32BE(_parentFingerprint, 0);
|
|
- }
|
|
- const name = map[Keys.name];
|
|
- const note = map[Keys.note];
|
|
-
|
|
- return new CryptoHDKey({
|
|
- isMaster,
|
|
- isPrivateKey,
|
|
- key,
|
|
- chainCode,
|
|
- useInfo,
|
|
- origin,
|
|
- children,
|
|
- parentFingerprint,
|
|
- name,
|
|
- note,
|
|
- });
|
|
- };
|
|
-
|
|
- public static fromCBOR = (_cborPayload: Buffer) => {
|
|
- const dataItem = decodeToDataItem(_cborPayload);
|
|
- return CryptoHDKey.fromDataItem(dataItem);
|
|
- };
|
|
-}
|
|
diff --git a/src/CryptoOutput.ts b/src/CryptoOutput.ts
|
|
deleted file mode 100644
|
|
index 90abf6f108c05315ee2b255465dd39c90ee0f459..0000000000000000000000000000000000000000
|
|
--- a/src/CryptoOutput.ts
|
|
+++ /dev/null
|
|
@@ -1,127 +0,0 @@
|
|
-import { CryptoECKey } from './CryptoECKey';
|
|
-import { CryptoHDKey } from './CryptoHDKey';
|
|
-import { decodeToDataItem, DataItem } from './lib';
|
|
-import { MultiKey } from './MultiKey';
|
|
-import { RegistryItem } from './RegistryItem';
|
|
-import { RegistryTypes } from './RegistryType';
|
|
-import { ScriptExpression, ScriptExpressions } from './ScriptExpression';
|
|
-
|
|
-export class CryptoOutput extends RegistryItem {
|
|
- public getRegistryType = () => {
|
|
- return RegistryTypes.CRYPTO_OUTPUT;
|
|
- };
|
|
-
|
|
- constructor(
|
|
- private scriptExpressions: ScriptExpression[],
|
|
- private cryptoKey: CryptoHDKey | CryptoECKey | MultiKey,
|
|
- ) {
|
|
- super();
|
|
- }
|
|
-
|
|
- public getCryptoKey = () => this.cryptoKey;
|
|
- public getHDKey = () => {
|
|
- if (this.cryptoKey instanceof CryptoHDKey) {
|
|
- return this.cryptoKey as CryptoHDKey;
|
|
- } else {
|
|
- return undefined;
|
|
- }
|
|
- };
|
|
- public getECKey = () => {
|
|
- if (this.cryptoKey instanceof CryptoECKey) {
|
|
- return this.cryptoKey as CryptoECKey;
|
|
- } else {
|
|
- return undefined;
|
|
- }
|
|
- };
|
|
-
|
|
- public getMultiKey = () => {
|
|
- if (this.cryptoKey instanceof MultiKey) {
|
|
- return this.cryptoKey as MultiKey;
|
|
- } else {
|
|
- return undefined;
|
|
- }
|
|
- };
|
|
-
|
|
- public getScriptExpressions = () => this.scriptExpressions;
|
|
-
|
|
- private _toOutputDescriptor = (seIndex: number): string => {
|
|
- if (seIndex >= this.scriptExpressions.length) {
|
|
- return this.cryptoKey.getOutputDescriptorContent();
|
|
- } else {
|
|
- return `${this.scriptExpressions[seIndex].getExpression()}(${this._toOutputDescriptor(seIndex + 1)})`;
|
|
- }
|
|
- };
|
|
-
|
|
- public toString = () => {
|
|
- return this._toOutputDescriptor(0);
|
|
- };
|
|
-
|
|
- toDataItem = () => {
|
|
- let dataItem = this.cryptoKey.toDataItem();
|
|
- if (
|
|
- this.cryptoKey instanceof CryptoECKey ||
|
|
- this.cryptoKey instanceof CryptoHDKey
|
|
- ) {
|
|
- dataItem.setTag(this.cryptoKey.getRegistryType().getTag());
|
|
- }
|
|
-
|
|
- const clonedSe = [...this.scriptExpressions];
|
|
-
|
|
- clonedSe.reverse().forEach((se) => {
|
|
- const tagValue = se.getTag();
|
|
- if (dataItem.getTag() === undefined) {
|
|
- dataItem.setTag(tagValue);
|
|
- } else {
|
|
- dataItem = new DataItem(dataItem, tagValue);
|
|
- }
|
|
- });
|
|
-
|
|
- return dataItem;
|
|
- };
|
|
-
|
|
- public static fromDataItem = (dataItem: DataItem) => {
|
|
- const scriptExpressions: ScriptExpression[] = [];
|
|
- let _dataItem = dataItem;
|
|
- // eslint-disable-next-line no-constant-condition
|
|
- while (true) {
|
|
- let _tag = _dataItem.getTag();
|
|
- const se = ScriptExpression.fromTag(_tag as number);
|
|
- if (se) {
|
|
- scriptExpressions.push(se);
|
|
- if (_dataItem.getData() instanceof DataItem) {
|
|
- _dataItem = _dataItem.getData();
|
|
- _tag = _dataItem.getTag();
|
|
- } else {
|
|
- break;
|
|
- }
|
|
- } else {
|
|
- break;
|
|
- }
|
|
- }
|
|
- const seLength = scriptExpressions.length;
|
|
- const isMultiKey =
|
|
- seLength > 0 &&
|
|
- (scriptExpressions[seLength - 1].getExpression() ===
|
|
- ScriptExpressions.MULTISIG.getExpression() ||
|
|
- scriptExpressions[seLength - 1].getExpression() ===
|
|
- ScriptExpressions.SORTED_MULTISIG.getExpression());
|
|
- //TODO: judge is multi key by scriptExpressions
|
|
- if (isMultiKey) {
|
|
- const multiKey = MultiKey.fromDataItem(_dataItem);
|
|
- return new CryptoOutput(scriptExpressions, multiKey);
|
|
- }
|
|
-
|
|
- if (_dataItem.getTag() === RegistryTypes.CRYPTO_HDKEY.getTag()) {
|
|
- const cryptoHDKey = CryptoHDKey.fromDataItem(_dataItem);
|
|
- return new CryptoOutput(scriptExpressions, cryptoHDKey);
|
|
- } else {
|
|
- const cryptoECKey = CryptoECKey.fromDataItem(_dataItem);
|
|
- return new CryptoOutput(scriptExpressions, cryptoECKey);
|
|
- }
|
|
- };
|
|
-
|
|
- public static fromCBOR = (_cborPayload: Buffer) => {
|
|
- const dataItem = decodeToDataItem(_cborPayload);
|
|
- return CryptoOutput.fromDataItem(dataItem);
|
|
- };
|
|
-}
|
|
diff --git a/src/CryptoPSBT.ts b/src/CryptoPSBT.ts
|
|
deleted file mode 100644
|
|
index 626b647098f04039755a1396511076ce2a0112a4..0000000000000000000000000000000000000000
|
|
--- a/src/CryptoPSBT.ts
|
|
+++ /dev/null
|
|
@@ -1,32 +0,0 @@
|
|
-import { decodeToDataItem, DataItem } from './lib';
|
|
-import { RegistryItem } from './RegistryItem';
|
|
-import { RegistryTypes } from './RegistryType';
|
|
-
|
|
-export class CryptoPSBT extends RegistryItem {
|
|
- getRegistryType = () => RegistryTypes.CRYPTO_PSBT;
|
|
-
|
|
- constructor(private psbt: Buffer) {
|
|
- super();
|
|
- }
|
|
-
|
|
- public getPSBT = () => this.psbt;
|
|
-
|
|
- public toDataItem = () => {
|
|
- return new DataItem(this.psbt);
|
|
- };
|
|
-
|
|
- public static fromDataItem = (dataItem: DataItem) => {
|
|
- const psbt = dataItem.getData();
|
|
- if (!psbt) {
|
|
- throw new Error(
|
|
- `#[ur-registry][CryptoPSBT][fn.fromDataItem]: decoded [dataItem][#data] is undefined: ${dataItem}`,
|
|
- );
|
|
- }
|
|
- return new CryptoPSBT(psbt);
|
|
- };
|
|
-
|
|
- public static fromCBOR = (_cborPayload: Buffer) => {
|
|
- const dataItem = decodeToDataItem(_cborPayload);
|
|
- return CryptoPSBT.fromDataItem(dataItem);
|
|
- };
|
|
-}
|
|
diff --git a/src/Decoder/index.ts b/src/Decoder/index.ts
|
|
deleted file mode 100644
|
|
index 5d7e3fe5aaef44fae3c39ac002bd2add9278a201..0000000000000000000000000000000000000000
|
|
--- a/src/Decoder/index.ts
|
|
+++ /dev/null
|
|
@@ -1,41 +0,0 @@
|
|
-import { URDecoder } from '@ngraveio/bc-ur';
|
|
-import {
|
|
- Bytes,
|
|
- CryptoAccount,
|
|
- CryptoCoinInfo,
|
|
- CryptoECKey,
|
|
- CryptoHDKey,
|
|
- CryptoKeypath,
|
|
- CryptoOutput,
|
|
- CryptoPSBT,
|
|
-} from '..';
|
|
-import { RegistryTypes } from '../RegistryType';
|
|
-import { UnknownURTypeError } from '../errors';
|
|
-
|
|
-export class URRegistryDecoder extends URDecoder {
|
|
- public resultRegistryType = () => {
|
|
- const ur = this.resultUR();
|
|
- switch (ur.type) {
|
|
- case RegistryTypes.BYTES.getType():
|
|
- return Bytes.fromCBOR(ur.cbor);
|
|
- case RegistryTypes.CRYPTO_HDKEY.getType():
|
|
- return CryptoHDKey.fromCBOR(ur.cbor);
|
|
- case RegistryTypes.CRYPTO_KEYPATH.getType():
|
|
- return CryptoKeypath.fromCBOR(ur.cbor);
|
|
- case RegistryTypes.CRYPTO_COIN_INFO.getType():
|
|
- return CryptoCoinInfo.fromCBOR(ur.cbor);
|
|
- case RegistryTypes.CRYPTO_ECKEY.getType():
|
|
- return CryptoECKey.fromCBOR(ur.cbor);
|
|
- case RegistryTypes.CRYPTO_OUTPUT.getType():
|
|
- return CryptoOutput.fromCBOR(ur.cbor);
|
|
- case RegistryTypes.CRYPTO_PSBT.getType():
|
|
- return CryptoPSBT.fromCBOR(ur.cbor);
|
|
- case RegistryTypes.CRYPTO_ACCOUNT.getType():
|
|
- return CryptoAccount.fromCBOR(ur.cbor);
|
|
- default:
|
|
- throw new UnknownURTypeError(
|
|
- `#[ur-registry][Decoder][fn.resultRegistryType]: registry type ${ur.type} is not supported now`,
|
|
- );
|
|
- }
|
|
- };
|
|
-}
|
|
diff --git a/src/MultiKey.ts b/src/MultiKey.ts
|
|
deleted file mode 100644
|
|
index ced19dc364fae1ad5b9147710cdb2195e17b4582..0000000000000000000000000000000000000000
|
|
--- a/src/MultiKey.ts
|
|
+++ /dev/null
|
|
@@ -1,60 +0,0 @@
|
|
-import { CryptoECKey } from './CryptoECKey';
|
|
-import { CryptoHDKey } from './CryptoHDKey';
|
|
-import { DataItem } from './lib/DataItem';
|
|
-import { RegistryItem } from './RegistryItem';
|
|
-import { RegistryType, RegistryTypes } from './RegistryType';
|
|
-import { DataItemMap } from './types';
|
|
-
|
|
-enum Keys {
|
|
- threshold = 1,
|
|
- keys,
|
|
-}
|
|
-
|
|
-export class MultiKey extends RegistryItem {
|
|
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
- // @ts-ignore
|
|
- getRegistryType: () => RegistryType;
|
|
-
|
|
- constructor(
|
|
- private threshold: number,
|
|
- private keys: (CryptoECKey | CryptoHDKey)[],
|
|
- ) {
|
|
- super();
|
|
- }
|
|
-
|
|
- getThreshold = () => this.threshold;
|
|
- getKeys = () => this.keys;
|
|
-
|
|
- toDataItem = () => {
|
|
- const map: DataItemMap = {};
|
|
- map[Keys.threshold] = this.threshold;
|
|
- const keys: DataItem[] = this.keys.map((k) => {
|
|
- const dataItem = k.toDataItem();
|
|
- dataItem.setTag(k.getRegistryType().getTag());
|
|
- return dataItem;
|
|
- });
|
|
- map[Keys.keys] = keys;
|
|
- return new DataItem(map);
|
|
- };
|
|
-
|
|
- getOutputDescriptorContent = () => {
|
|
- return [this.getThreshold(),
|
|
- this.keys.map(k => k.getOutputDescriptorContent()).join(','),
|
|
- ].join(',');
|
|
- };
|
|
-
|
|
- static fromDataItem = (dataItem: DataItem) => {
|
|
- const map = dataItem.getData();
|
|
- const threshold = map[Keys.threshold];
|
|
- const _keys = map[Keys.keys] as DataItem[];
|
|
- const keys: (CryptoECKey | CryptoHDKey)[] = [];
|
|
- _keys.forEach((k) => {
|
|
- if (k.getTag() === RegistryTypes.CRYPTO_HDKEY.getTag()) {
|
|
- keys.push(CryptoHDKey.fromDataItem(k));
|
|
- } else if (k.getTag() === RegistryTypes.CRYPTO_ECKEY.getTag()) {
|
|
- keys.push(CryptoECKey.fromDataItem(k));
|
|
- }
|
|
- });
|
|
- return new MultiKey(threshold, keys);
|
|
- };
|
|
-}
|
|
diff --git a/src/PathComponent.ts b/src/PathComponent.ts
|
|
deleted file mode 100644
|
|
index d41cb067e383f29986a7d84bc88b0e4b7b71fb0b..0000000000000000000000000000000000000000
|
|
--- a/src/PathComponent.ts
|
|
+++ /dev/null
|
|
@@ -1,28 +0,0 @@
|
|
-export class PathComponent {
|
|
- public static readonly HARDENED_BIT = 0x80000000;
|
|
-
|
|
- private index?: number;
|
|
- private wildcard: boolean;
|
|
- private hardened: boolean;
|
|
-
|
|
- constructor(args: { index?: number; hardened: boolean }) {
|
|
- this.index = args.index;
|
|
- this.hardened = args.hardened;
|
|
-
|
|
- if (this.index !== undefined) {
|
|
- this.wildcard = false;
|
|
- } else {
|
|
- this.wildcard = true;
|
|
- }
|
|
-
|
|
- if (this.index && (this.index & PathComponent.HARDENED_BIT) !== 0) {
|
|
- throw new Error(
|
|
- `#[ur-registry][PathComponent][fn.constructor]: Invalid index ${this.index} - most significant bit cannot be set`,
|
|
- );
|
|
- }
|
|
- }
|
|
-
|
|
- public getIndex = () => this.index;
|
|
- public isWildcard = () => this.wildcard;
|
|
- public isHardened = () => this.hardened;
|
|
-}
|
|
diff --git a/src/RegistryItem.ts b/src/RegistryItem.ts
|
|
deleted file mode 100644
|
|
index 99139f7001b596add08be3332526264c39693279..0000000000000000000000000000000000000000
|
|
--- a/src/RegistryItem.ts
|
|
+++ /dev/null
|
|
@@ -1,35 +0,0 @@
|
|
-import { UR, UREncoder } from '@ngraveio/bc-ur';
|
|
-import { encodeDataItem, DataItem } from './lib';
|
|
-import { RegistryType } from './RegistryType';
|
|
-
|
|
-export abstract class RegistryItem {
|
|
- abstract getRegistryType: () => RegistryType;
|
|
- abstract toDataItem: () => DataItem;
|
|
- public toCBOR = () => {
|
|
- if (this.toDataItem() === undefined) {
|
|
- throw new Error(
|
|
- `#[ur-registry][RegistryItem][fn.toCBOR]: registry ${this.getRegistryType()}'s method toDataItem returns undefined`,
|
|
- );
|
|
- }
|
|
- return encodeDataItem(this.toDataItem());
|
|
- };
|
|
-
|
|
- public toUR = () => {
|
|
- return new UR(this.toCBOR(), this.getRegistryType().getType());
|
|
- };
|
|
-
|
|
- public toUREncoder = (
|
|
- maxFragmentLength?: number,
|
|
- firstSeqNum?: number,
|
|
- minFragmentLength?: number,
|
|
- ) => {
|
|
- const ur = this.toUR();
|
|
- const urEncoder = new UREncoder(
|
|
- ur,
|
|
- maxFragmentLength,
|
|
- firstSeqNum,
|
|
- minFragmentLength,
|
|
- );
|
|
- return urEncoder;
|
|
- };
|
|
-}
|
|
diff --git a/src/RegistryType.ts b/src/RegistryType.ts
|
|
deleted file mode 100644
|
|
index 64637bca3626b0db586563d5dcffd44f61e39520..0000000000000000000000000000000000000000
|
|
--- a/src/RegistryType.ts
|
|
+++ /dev/null
|
|
@@ -1,20 +0,0 @@
|
|
-// cbor registry types: https://github.com/BlockchainCommons/Research/blob/master/papers/bcr-2020-006-urtypes.md
|
|
-// Map<name, tag>
|
|
-
|
|
-export class RegistryType {
|
|
- constructor(private type: string, private tag?: number) {}
|
|
- getTag = () => this.tag;
|
|
- getType = () => this.type;
|
|
-}
|
|
-
|
|
-export const RegistryTypes = {
|
|
- UUID: new RegistryType('uuid', 37),
|
|
- BYTES: new RegistryType('bytes', undefined),
|
|
- CRYPTO_HDKEY: new RegistryType('crypto-hdkey', 303),
|
|
- CRYPTO_KEYPATH: new RegistryType('crypto-keypath', 304),
|
|
- CRYPTO_COIN_INFO: new RegistryType('crypto-coin-info', 305),
|
|
- CRYPTO_ECKEY: new RegistryType('crypto-eckey', 306),
|
|
- CRYPTO_OUTPUT: new RegistryType('crypto-output', 308),
|
|
- CRYPTO_PSBT: new RegistryType('crypto-psbt', 310),
|
|
- CRYPTO_ACCOUNT: new RegistryType('crypto-account', 311),
|
|
-};
|
|
diff --git a/src/ScriptExpression.ts b/src/ScriptExpression.ts
|
|
deleted file mode 100644
|
|
index 8fbf0db679040337a5d9e6af8c8ecf734faa00d5..0000000000000000000000000000000000000000
|
|
--- a/src/ScriptExpression.ts
|
|
+++ /dev/null
|
|
@@ -1,26 +0,0 @@
|
|
-export class ScriptExpression {
|
|
- constructor(private tag: number, private expression: string) {}
|
|
-
|
|
- public getTag = () => this.tag;
|
|
- public getExpression = () => this.expression;
|
|
-
|
|
- public static fromTag = (tag: number) => {
|
|
- const se = Object.values(ScriptExpressions).find(
|
|
- (se) => se.getTag() === tag,
|
|
- );
|
|
- return se;
|
|
- };
|
|
-}
|
|
-
|
|
-export const ScriptExpressions = {
|
|
- SCRIPT_HASH: new ScriptExpression(400, 'sh'),
|
|
- WITNESS_SCRIPT_HASH: new ScriptExpression(401, 'wsh'),
|
|
- PUBLIC_KEY: new ScriptExpression(402, 'pk'),
|
|
- PUBLIC_KEY_HASH: new ScriptExpression(403, 'pkh'),
|
|
- WITNESS_PUBLIC_KEY_HASH: new ScriptExpression(404, 'wpkh'),
|
|
- COMBO: new ScriptExpression(405, 'combo'),
|
|
- MULTISIG: new ScriptExpression(406, 'multi'),
|
|
- SORTED_MULTISIG: new ScriptExpression(407, 'sortedmulti'),
|
|
- ADDRESS: new ScriptExpression(307, 'addr'),
|
|
- RAW_SCRIPT: new ScriptExpression(408, 'raw'),
|
|
-};
|
|
diff --git a/src/index.ts b/src/index.ts
|
|
deleted file mode 100644
|
|
index bb07bc8c2a62c2c0afc28bce0f8c4d968b7c93ee..0000000000000000000000000000000000000000
|
|
--- a/src/index.ts
|
|
+++ /dev/null
|
|
@@ -1,110 +0,0 @@
|
|
-import './patchCBOR';
|
|
-
|
|
-import { CryptoHDKey } from './CryptoHDKey';
|
|
-import { CryptoKeypath } from './CryptoKeypath';
|
|
-import {
|
|
- CryptoCoinInfo,
|
|
- Type as CryptoCoinInfoType,
|
|
- Network as CryptoCoinInfoNetwork,
|
|
-} from './CryptoCoinInfo';
|
|
-import { CryptoECKey } from './CryptoECKey';
|
|
-import { Bytes } from './Bytes';
|
|
-import { CryptoOutput } from './CryptoOutput';
|
|
-import { CryptoPSBT } from './CryptoPSBT';
|
|
-import { CryptoAccount } from './CryptoAccount';
|
|
-import { URRegistryDecoder } from './Decoder';
|
|
-
|
|
-import { MultiKey } from './MultiKey';
|
|
-
|
|
-import { ScriptExpressions } from './ScriptExpression';
|
|
-import { PathComponent } from './PathComponent';
|
|
-
|
|
-import { RegistryItem } from './RegistryItem';
|
|
-import { RegistryTypes, RegistryType } from './RegistryType';
|
|
-
|
|
-import {
|
|
- addReader,
|
|
- addSemanticDecode,
|
|
- addSemanticEncode,
|
|
- addWriter,
|
|
- decodeToDataItem,
|
|
- encodeDataItem,
|
|
-} from './lib';
|
|
-
|
|
-export { DataItem } from './lib';
|
|
-
|
|
-import { patchTags } from './utils';
|
|
-
|
|
-const URlib = {
|
|
- URRegistryDecoder,
|
|
- Bytes,
|
|
- CryptoAccount,
|
|
- CryptoHDKey,
|
|
- CryptoKeypath,
|
|
- CryptoCoinInfo,
|
|
- CryptoCoinInfoType,
|
|
- CryptoCoinInfoNetwork,
|
|
- CryptoECKey,
|
|
- CryptoOutput,
|
|
- CryptoPSBT,
|
|
- MultiKey,
|
|
- ScriptExpressions,
|
|
- PathComponent,
|
|
-};
|
|
-
|
|
-const cbor = {
|
|
- addReader,
|
|
- addSemanticDecode,
|
|
- addSemanticEncode,
|
|
- addWriter,
|
|
- patchTags,
|
|
-};
|
|
-
|
|
-const extend = {
|
|
- RegistryTypes,
|
|
- RegistryItem,
|
|
- RegistryType,
|
|
-
|
|
- decodeToDataItem,
|
|
- encodeDataItem,
|
|
-
|
|
- cbor,
|
|
-};
|
|
-
|
|
-export {
|
|
- URRegistryDecoder,
|
|
- Bytes,
|
|
- CryptoAccount,
|
|
- CryptoHDKey,
|
|
- CryptoKeypath,
|
|
- CryptoCoinInfo,
|
|
- CryptoCoinInfoType,
|
|
- CryptoCoinInfoNetwork,
|
|
- CryptoECKey,
|
|
- CryptoOutput,
|
|
- CryptoPSBT,
|
|
- MultiKey,
|
|
- ScriptExpressions,
|
|
- PathComponent,
|
|
- extend,
|
|
-};
|
|
-
|
|
-export * from './errors';
|
|
-export * from './Decoder';
|
|
-export * from './lib';
|
|
-export * from './CryptoAccount'
|
|
-export * from './CryptoPSBT'
|
|
-export * from './CryptoHDKey'
|
|
-export * from './CryptoOutput'
|
|
-export * from './CryptoCoinInfo'
|
|
-export * from './CryptoECKey'
|
|
-export * from './MultiKey'
|
|
-export * from './CryptoKeypath'
|
|
-export * from './patchCBOR'
|
|
-export * from './PathComponent'
|
|
-export * from './RegistryItem'
|
|
-export * from './RegistryType'
|
|
-export * from './types'
|
|
-export * from './utils'
|
|
-
|
|
-export default URlib;
|
|
diff --git a/src/lib/DataItem.ts b/src/lib/DataItem.ts
|
|
deleted file mode 100644
|
|
index 9727f7eb100756076732b137402e22efad73727c..0000000000000000000000000000000000000000
|
|
--- a/src/lib/DataItem.ts
|
|
+++ /dev/null
|
|
@@ -1,25 +0,0 @@
|
|
-export class DataItem {
|
|
- private tag?: number;
|
|
- private data: any;
|
|
-
|
|
- constructor(data: any, tag?: number) {
|
|
- this.data = data;
|
|
- this.tag = tag;
|
|
- }
|
|
-
|
|
- public setTag = (tag?: number) => {
|
|
- this.tag = tag;
|
|
- };
|
|
-
|
|
- public clearTag = () => {
|
|
- this.tag = undefined;
|
|
- };
|
|
-
|
|
- public getTag = () => {
|
|
- return this.tag;
|
|
- };
|
|
-
|
|
- public getData = () => {
|
|
- return this.data;
|
|
- };
|
|
-}
|
|
diff --git a/src/lib/cbor-sync.d.ts b/src/lib/cbor-sync.d.ts
|
|
deleted file mode 100644
|
|
index 6374ba78fb23af2b8773820250e1183ed36c978e..0000000000000000000000000000000000000000
|
|
--- a/src/lib/cbor-sync.d.ts
|
|
+++ /dev/null
|
|
@@ -1,36 +0,0 @@
|
|
-export namespace config {
|
|
- const useToJSON: boolean;
|
|
-}
|
|
-export function addWriter(format: any, writerFunction: any): void;
|
|
-export function addReader(format: any, readerFunction: any): void;
|
|
-export function encode(data: any, format: any): any;
|
|
-export function encodeDataItem(data: any, format?: any): any;
|
|
-export function decode(data: any, format: any): any;
|
|
-export function decodeToDataItem(data: any, format?: any): import("./DataItem").DataItem;
|
|
-export function addSemanticEncode(tag: any, fn: any): {
|
|
- config: {
|
|
- useToJSON: boolean;
|
|
- };
|
|
- addWriter: (format: any, writerFunction: any) => void;
|
|
- addReader: (format: any, readerFunction: any) => void;
|
|
- encode: (data: any, format: any) => any;
|
|
- encodeDataItem: (data: any, format: any) => any;
|
|
- decode: (data: any, format: any) => any;
|
|
- decodeToDataItem: (data: any, format: any) => import("./DataItem").DataItem;
|
|
- addSemanticEncode: (tag: any, fn: any) => any;
|
|
- addSemanticDecode: (tag: any, fn: any) => any;
|
|
-};
|
|
-export function addSemanticDecode(tag: any, fn: any): {
|
|
- config: {
|
|
- useToJSON: boolean;
|
|
- };
|
|
- addWriter: (format: any, writerFunction: any) => void;
|
|
- addReader: (format: any, readerFunction: any) => void;
|
|
- encode: (data: any, format: any) => any;
|
|
- encodeDataItem: (data: any, format: any) => any;
|
|
- decode: (data: any, format: any) => any;
|
|
- decodeToDataItem: (data: any, format: any) => import("./DataItem").DataItem;
|
|
- addSemanticEncode: (tag: any, fn: any) => any;
|
|
- addSemanticDecode: (tag: any, fn: any) => any;
|
|
-};
|
|
-//# sourceMappingURL=cbor-sync.d.ts.map
|
|
diff --git a/src/lib/cbor-sync.js b/src/lib/cbor-sync.js
|
|
deleted file mode 100644
|
|
index df8db9040ddb2fffed53bc980181097b97cab8d6..0000000000000000000000000000000000000000
|
|
--- a/src/lib/cbor-sync.js
|
|
+++ /dev/null
|
|
@@ -1,693 +0,0 @@
|
|
-(function (global, factory) {
|
|
- if (typeof define === 'function' && define.amd) {
|
|
- define([], factory);
|
|
- } else if (typeof module !== 'undefined' && module.exports) {
|
|
- module.exports = factory();
|
|
- } else {
|
|
- global.CBOR = factory();
|
|
- }
|
|
-})(this, function () {
|
|
- const { DataItem } = require('./DataItem');
|
|
- var CBOR = (function () {
|
|
- function BinaryHex(hex) {
|
|
- this.$hex = hex;
|
|
- }
|
|
- BinaryHex.prototype = {
|
|
- length: function () {
|
|
- return this.$hex.length / 2;
|
|
- },
|
|
- toString: function (format) {
|
|
- if (!format || format === 'hex' || format === 16) return this.$hex;
|
|
- if (format === 'utf-8') {
|
|
- var encoded = '';
|
|
- for (var i = 0; i < this.$hex.length; i += 2) {
|
|
- encoded += '%' + this.$hex.substring(i, i + 2);
|
|
- }
|
|
- return decodeURIComponent(encoded);
|
|
- }
|
|
- if (format === 'latin') {
|
|
- var encoded = [];
|
|
- for (var i = 0; i < this.$hex.length; i += 2) {
|
|
- encoded.push(parseInt(this.$hex.substring(i, i + 2), 16));
|
|
- }
|
|
- return String.fromCharCode.apply(String, encoded);
|
|
- }
|
|
- throw new Error('Unrecognised format: ' + format);
|
|
- },
|
|
- };
|
|
- BinaryHex.fromLatinString = function (latinString) {
|
|
- var hex = '';
|
|
- for (var i = 0; i < latinString.length; i++) {
|
|
- var pair = latinString.charCodeAt(i).toString(16);
|
|
- if (pair.length === 1) pair = '0' + pair;
|
|
- hex += pair;
|
|
- }
|
|
- return new BinaryHex(hex);
|
|
- };
|
|
- BinaryHex.fromUtf8String = function (utf8String) {
|
|
- var encoded = encodeURIComponent(utf8String);
|
|
- var hex = '';
|
|
- for (var i = 0; i < encoded.length; i++) {
|
|
- if (encoded.charAt(i) === '%') {
|
|
- hex += encoded.substring(i + 1, i + 3);
|
|
- i += 2;
|
|
- } else {
|
|
- var hexPair = encoded.charCodeAt(i).toString(16);
|
|
- if (hexPair.length < 2) hexPair = '0' + hexPair;
|
|
- hex += hexPair;
|
|
- }
|
|
- }
|
|
- return new BinaryHex(hex);
|
|
- };
|
|
-
|
|
- var semanticEncoders = [];
|
|
- var semanticDecoders = {};
|
|
-
|
|
- var notImplemented = function (label) {
|
|
- return function () {
|
|
- throw new Error(label + ' not implemented');
|
|
- };
|
|
- };
|
|
-
|
|
- function Reader() {}
|
|
- Reader.prototype = {
|
|
- peekByte: notImplemented('peekByte'),
|
|
- readByte: notImplemented('readByte'),
|
|
- readChunk: notImplemented('readChunk'),
|
|
- readFloat16: function () {
|
|
- var half = this.readUint16();
|
|
- var exponent = (half & 0x7fff) >> 10;
|
|
- var mantissa = half & 0x3ff;
|
|
- var negative = half & 0x8000;
|
|
- if (exponent === 0x1f) {
|
|
- if (mantissa === 0) {
|
|
- return negative ? -Infinity : Infinity;
|
|
- }
|
|
- return NaN;
|
|
- }
|
|
- var magnitude = exponent
|
|
- ? Math.pow(2, exponent - 25) * (1024 + mantissa)
|
|
- : Math.pow(2, -24) * mantissa;
|
|
- return negative ? -magnitude : magnitude;
|
|
- },
|
|
- readFloat32: function () {
|
|
- var intValue = this.readUint32();
|
|
- var exponent = (intValue & 0x7fffffff) >> 23;
|
|
- var mantissa = intValue & 0x7fffff;
|
|
- var negative = intValue & 0x80000000;
|
|
- if (exponent === 0xff) {
|
|
- if (mantissa === 0) {
|
|
- return negative ? -Infinity : Infinity;
|
|
- }
|
|
- return NaN;
|
|
- }
|
|
- var magnitude = exponent
|
|
- ? Math.pow(2, exponent - 23 - 127) * (8388608 + mantissa)
|
|
- : Math.pow(2, -23 - 126) * mantissa;
|
|
- return negative ? -magnitude : magnitude;
|
|
- },
|
|
- readFloat64: function () {
|
|
- var int1 = this.readUint32(),
|
|
- int2 = this.readUint32();
|
|
- var exponent = (int1 >> 20) & 0x7ff;
|
|
- var mantissa = (int1 & 0xfffff) * 4294967296 + int2;
|
|
- var negative = int1 & 0x80000000;
|
|
- if (exponent === 0x7ff) {
|
|
- if (mantissa === 0) {
|
|
- return negative ? -Infinity : Infinity;
|
|
- }
|
|
- return NaN;
|
|
- }
|
|
- var magnitude = exponent
|
|
- ? Math.pow(2, exponent - 52 - 1023) * (4503599627370496 + mantissa)
|
|
- : Math.pow(2, -52 - 1022) * mantissa;
|
|
- return negative ? -magnitude : magnitude;
|
|
- },
|
|
- readUint16: function () {
|
|
- return this.readByte() * 256 + this.readByte();
|
|
- },
|
|
- readUint32: function () {
|
|
- return this.readUint16() * 65536 + this.readUint16();
|
|
- },
|
|
- readUint64: function () {
|
|
- return this.readUint32() * 4294967296 + this.readUint32();
|
|
- },
|
|
- };
|
|
- function Writer() {}
|
|
- Writer.prototype = {
|
|
- writeByte: notImplemented('writeByte'),
|
|
- result: notImplemented('result'),
|
|
- writeFloat16: notImplemented('writeFloat16'),
|
|
- writeFloat32: notImplemented('writeFloat32'),
|
|
- writeFloat64: notImplemented('writeFloat64'),
|
|
- writeUint16: function (value) {
|
|
- this.writeByte((value >> 8) & 0xff);
|
|
- this.writeByte(value & 0xff);
|
|
- },
|
|
- writeUint32: function (value) {
|
|
- this.writeUint16((value >> 16) & 0xffff);
|
|
- this.writeUint16(value & 0xffff);
|
|
- },
|
|
- writeUint64: function (value) {
|
|
- if (value >= 9007199254740992 || value <= -9007199254740992) {
|
|
- throw new Error(
|
|
- 'Cannot encode Uint64 of: ' +
|
|
- value +
|
|
- ' magnitude to big (floating point errors)',
|
|
- );
|
|
- }
|
|
- this.writeUint32(Math.floor(value / 4294967296));
|
|
- this.writeUint32(value % 4294967296);
|
|
- },
|
|
- writeString: notImplemented('writeString'),
|
|
- canWriteBinary: function (chunk) {
|
|
- return false;
|
|
- },
|
|
- writeBinary: notImplemented('writeChunk'),
|
|
- };
|
|
-
|
|
- function readHeaderRaw(reader) {
|
|
- var firstByte = reader.readByte();
|
|
- var majorType = firstByte >> 5,
|
|
- value = firstByte & 0x1f;
|
|
- return { type: majorType, value: value };
|
|
- }
|
|
-
|
|
- function valueFromHeader(header, reader) {
|
|
- var value = header.value;
|
|
- if (value < 24) {
|
|
- return value;
|
|
- } else if (value == 24) {
|
|
- return reader.readByte();
|
|
- } else if (value == 25) {
|
|
- return reader.readUint16();
|
|
- } else if (value == 26) {
|
|
- return reader.readUint32();
|
|
- } else if (value == 27) {
|
|
- return reader.readUint64();
|
|
- } else if (value == 31) {
|
|
- // special value for non-terminating arrays/objects
|
|
- return null;
|
|
- }
|
|
- notImplemented('Additional info: ' + value)();
|
|
- }
|
|
-
|
|
- function writeHeaderRaw(type, value, writer) {
|
|
- writer.writeByte((type << 5) | value);
|
|
- }
|
|
-
|
|
- function writeHeader(type, value, writer) {
|
|
- var firstByte = type << 5;
|
|
- if (value < 24) {
|
|
- writer.writeByte(firstByte | value);
|
|
- } else if (value < 256) {
|
|
- writer.writeByte(firstByte | 24);
|
|
- writer.writeByte(value);
|
|
- } else if (value < 65536) {
|
|
- writer.writeByte(firstByte | 25);
|
|
- writer.writeUint16(value);
|
|
- } else if (value < 4294967296) {
|
|
- writer.writeByte(firstByte | 26);
|
|
- writer.writeUint32(value);
|
|
- } else {
|
|
- writer.writeByte(firstByte | 27);
|
|
- writer.writeUint64(value);
|
|
- }
|
|
- }
|
|
-
|
|
- var stopCode = new Error(); // Just a unique object, that won't compare strictly equal to anything else
|
|
-
|
|
- function decodeReader(reader) {
|
|
- var header = readHeaderRaw(reader);
|
|
- switch (header.type) {
|
|
- case 0:
|
|
- return valueFromHeader(header, reader);
|
|
- case 1:
|
|
- return -1 - valueFromHeader(header, reader);
|
|
- case 2:
|
|
- return reader.readChunk(valueFromHeader(header, reader));
|
|
- case 3:
|
|
- var buffer = reader.readChunk(valueFromHeader(header, reader));
|
|
- return buffer.toString('utf-8');
|
|
- case 4:
|
|
- case 5:
|
|
- var arrayLength = valueFromHeader(header, reader);
|
|
- var result = [];
|
|
- if (arrayLength !== null) {
|
|
- if (header.type === 5) {
|
|
- arrayLength *= 2;
|
|
- }
|
|
- for (var i = 0; i < arrayLength; i++) {
|
|
- result[i] = decodeReader(reader);
|
|
- }
|
|
- } else {
|
|
- var item;
|
|
- while ((item = decodeReader(reader)) !== stopCode) {
|
|
- result.push(item);
|
|
- }
|
|
- }
|
|
- if (header.type === 5) {
|
|
- var objResult = {};
|
|
- for (var i = 0; i < result.length; i += 2) {
|
|
- objResult[result[i]] = result[i + 1];
|
|
- }
|
|
- return objResult;
|
|
- } else {
|
|
- return result;
|
|
- }
|
|
- case 6:
|
|
- var tag = valueFromHeader(header, reader);
|
|
- var decoder = semanticDecoders[tag];
|
|
- var result = decodeReader(reader);
|
|
- return decoder ? decoder(result) : result;
|
|
- case 7:
|
|
- if (header.value === 25) {
|
|
- return reader.readFloat16();
|
|
- } else if (header.value === 26) {
|
|
- return reader.readFloat32();
|
|
- } else if (header.value === 27) {
|
|
- return reader.readFloat64();
|
|
- }
|
|
- switch (valueFromHeader(header, reader)) {
|
|
- case 20:
|
|
- return false;
|
|
- case 21:
|
|
- return true;
|
|
- case 22:
|
|
- return null;
|
|
- case 23:
|
|
- return undefined;
|
|
- case null:
|
|
- return stopCode;
|
|
- default:
|
|
- throw new Error('Unknown fixed value: ' + header.value);
|
|
- }
|
|
- default:
|
|
- throw new Error('Unsupported header: ' + JSON.stringify(header));
|
|
- }
|
|
- throw new Error('not implemented yet');
|
|
- }
|
|
-
|
|
- function encodeWriter(data, writer) {
|
|
- for (var i = 0; i < semanticEncoders.length; i++) {
|
|
- var replacement = semanticEncoders[i].fn(data);
|
|
- if (replacement !== undefined) {
|
|
- writeHeader(6, semanticEncoders[i].tag, writer);
|
|
- return encodeWriter(replacement, writer);
|
|
- }
|
|
- }
|
|
-
|
|
- if (data && typeof data.toCBOR === 'function') {
|
|
- data = data.toCBOR();
|
|
- }
|
|
-
|
|
- if (data === false) {
|
|
- writeHeader(7, 20, writer);
|
|
- } else if (data === true) {
|
|
- writeHeader(7, 21, writer);
|
|
- } else if (data === null) {
|
|
- writeHeader(7, 22, writer);
|
|
- } else if (data === undefined) {
|
|
- writeHeader(7, 23, writer);
|
|
- } else if (typeof data === 'number') {
|
|
- if (
|
|
- Math.floor(data) === data &&
|
|
- data < 9007199254740992 &&
|
|
- data > -9007199254740992
|
|
- ) {
|
|
- // Integer
|
|
- if (data < 0) {
|
|
- writeHeader(1, -1 - data, writer);
|
|
- } else {
|
|
- writeHeader(0, data, writer);
|
|
- }
|
|
- } else {
|
|
- writeHeaderRaw(7, 27, writer);
|
|
- writer.writeFloat64(data);
|
|
- }
|
|
- } else if (typeof data === 'string') {
|
|
- writer.writeString(data, function (length) {
|
|
- writeHeader(3, length, writer);
|
|
- });
|
|
- } else if (writer.canWriteBinary(data)) {
|
|
- writer.writeBinary(data, function (length) {
|
|
- writeHeader(2, length, writer);
|
|
- });
|
|
- } else if (typeof data === 'object') {
|
|
- if (api.config.useToJSON && typeof data.toJSON === 'function') {
|
|
- data = data.toJSON();
|
|
- }
|
|
- if (Array.isArray(data)) {
|
|
- writeHeader(4, data.length, writer);
|
|
- for (var i = 0; i < data.length; i++) {
|
|
- encodeWriter(data[i], writer);
|
|
- }
|
|
- } else {
|
|
- var keys = Object.keys(data);
|
|
- writeHeader(5, keys.length, writer);
|
|
- for (var i = 0; i < keys.length; i++) {
|
|
- const number = parseInt(keys[i]);
|
|
- if (isNaN(number)) {
|
|
- encodeWriter(keys[i], writer);
|
|
- encodeWriter(data[keys[i]], writer);
|
|
- } else {
|
|
- encodeWriter(number, writer);
|
|
- encodeWriter(data[keys[i]], writer);
|
|
- }
|
|
- }
|
|
- }
|
|
- } else {
|
|
- throw new Error('CBOR encoding not supported: ' + data);
|
|
- }
|
|
- }
|
|
-
|
|
- var readerFunctions = [];
|
|
- var writerFunctions = [];
|
|
-
|
|
- var api = {
|
|
- config: {
|
|
- useToJSON: true,
|
|
- },
|
|
- addWriter: function (format, writerFunction) {
|
|
- if (typeof format === 'string') {
|
|
- writerFunctions.push(function (f) {
|
|
- if (format === f) return writerFunction(f);
|
|
- });
|
|
- } else {
|
|
- writerFunctions.push(format);
|
|
- }
|
|
- },
|
|
- addReader: function (format, readerFunction) {
|
|
- if (typeof format === 'string') {
|
|
- readerFunctions.push(function (data, f) {
|
|
- if (format === f) return readerFunction(data, f);
|
|
- });
|
|
- } else {
|
|
- readerFunctions.push(format);
|
|
- }
|
|
- },
|
|
- encode: function (data, format) {
|
|
- for (var i = 0; i < writerFunctions.length; i++) {
|
|
- var func = writerFunctions[i];
|
|
- var writer = func(format);
|
|
- if (writer) {
|
|
- encodeWriter(data, writer);
|
|
- return writer.result();
|
|
- }
|
|
- }
|
|
- throw new Error('Unsupported output format: ' + format);
|
|
- },
|
|
- // DataItem: {getData: () => any}
|
|
- encodeDataItem: function (data, format) {
|
|
- for (var i = 0; i < writerFunctions.length; i++) {
|
|
- var func = writerFunctions[i];
|
|
- var writer = func(format);
|
|
- if (writer) {
|
|
- if (data.getTag() !== undefined) {
|
|
- encodeWriter(data, writer);
|
|
- return writer.result();
|
|
- } else {
|
|
- encodeWriter(data.getData(), writer);
|
|
- return writer.result();
|
|
- }
|
|
- }
|
|
- }
|
|
- throw new Error('Unsupported output format: ' + format);
|
|
- },
|
|
- decode: function (data, format) {
|
|
- for (var i = 0; i < readerFunctions.length; i++) {
|
|
- var func = readerFunctions[i];
|
|
- var reader = func(data, format);
|
|
- if (reader) {
|
|
- return decodeReader(reader);
|
|
- }
|
|
- }
|
|
- throw new Error('Unsupported input format: ' + format);
|
|
- },
|
|
- decodeToDataItem: function (data, format) {
|
|
- for (var i = 0; i < readerFunctions.length; i++) {
|
|
- var func = readerFunctions[i];
|
|
- var reader = func(data, format);
|
|
- if (reader) {
|
|
- const result = decodeReader(reader);
|
|
- if (result instanceof DataItem) {
|
|
- return result;
|
|
- } else {
|
|
- return new DataItem(result);
|
|
- }
|
|
- }
|
|
- }
|
|
- throw new Error('Unsupported input format: ' + format);
|
|
- },
|
|
- addSemanticEncode: function (tag, fn) {
|
|
- if (typeof tag !== 'number' || tag % 1 !== 0 || tag < 0) {
|
|
- throw new Error('Tag must be a positive integer');
|
|
- }
|
|
- semanticEncoders.push({ tag: tag, fn: fn });
|
|
- return this;
|
|
- },
|
|
- addSemanticDecode: function (tag, fn) {
|
|
- if (typeof tag !== 'number' || tag % 1 !== 0 || tag < 0) {
|
|
- throw new Error('Tag must be a positive integer');
|
|
- }
|
|
- semanticDecoders[tag] = fn;
|
|
- return this;
|
|
- },
|
|
- };
|
|
-
|
|
- /** Node.js Buffers **/
|
|
- function BufferReader(buffer) {
|
|
- this.buffer = buffer;
|
|
- this.pos = 0;
|
|
- }
|
|
- BufferReader.prototype = Object.create(Reader.prototype);
|
|
- BufferReader.prototype.peekByte = function () {
|
|
- return this.buffer[this.pos];
|
|
- };
|
|
- BufferReader.prototype.readByte = function () {
|
|
- return this.buffer[this.pos++];
|
|
- };
|
|
- BufferReader.prototype.readUint16 = function () {
|
|
- var result = this.buffer.readUInt16BE(this.pos);
|
|
- this.pos += 2;
|
|
- return result;
|
|
- };
|
|
- BufferReader.prototype.readUint32 = function () {
|
|
- var result = this.buffer.readUInt32BE(this.pos);
|
|
- this.pos += 4;
|
|
- return result;
|
|
- };
|
|
- BufferReader.prototype.readFloat32 = function () {
|
|
- var result = this.buffer.readFloatBE(this.pos);
|
|
- this.pos += 4;
|
|
- return result;
|
|
- };
|
|
- BufferReader.prototype.readFloat64 = function () {
|
|
- var result = this.buffer.readDoubleBE(this.pos);
|
|
- this.pos += 8;
|
|
- return result;
|
|
- };
|
|
- BufferReader.prototype.readChunk = function (length) {
|
|
- var result = Buffer.alloc(length);
|
|
- this.buffer.copy(result, 0, this.pos, (this.pos += length));
|
|
- return result;
|
|
- };
|
|
-
|
|
- function BufferWriter(stringFormat) {
|
|
- this.byteLength = 0;
|
|
- this.defaultBufferLength = 16384; // 16k
|
|
- this.latestBuffer = Buffer.alloc(this.defaultBufferLength);
|
|
- this.latestBufferOffset = 0;
|
|
- this.completeBuffers = [];
|
|
- this.stringFormat = stringFormat;
|
|
- }
|
|
- BufferWriter.prototype = Object.create(Writer.prototype);
|
|
- BufferWriter.prototype.writeByte = function (value) {
|
|
- this.latestBuffer[this.latestBufferOffset++] = value;
|
|
- if (this.latestBufferOffset >= this.latestBuffer.length) {
|
|
- this.completeBuffers.push(this.latestBuffer);
|
|
- this.latestBuffer = Buffer.alloc(this.defaultBufferLength);
|
|
- this.latestBufferOffset = 0;
|
|
- }
|
|
- this.byteLength++;
|
|
- };
|
|
- BufferWriter.prototype.writeFloat32 = function (value) {
|
|
- var buffer = Buffer.alloc(4);
|
|
- buffer.writeFloatBE(value, 0);
|
|
- this.writeBuffer(buffer);
|
|
- };
|
|
- BufferWriter.prototype.writeFloat64 = function (value) {
|
|
- var buffer = Buffer.alloc(8);
|
|
- buffer.writeDoubleBE(value, 0);
|
|
- this.writeBuffer(buffer);
|
|
- };
|
|
- BufferWriter.prototype.writeString = function (string, lengthFunc) {
|
|
- var buffer = Buffer.from(string, 'utf-8');
|
|
- lengthFunc(buffer.length);
|
|
- this.writeBuffer(buffer);
|
|
- };
|
|
- BufferWriter.prototype.canWriteBinary = function (data) {
|
|
- return data instanceof Buffer;
|
|
- };
|
|
- BufferWriter.prototype.writeBinary = function (buffer, lengthFunc) {
|
|
- lengthFunc(buffer.length);
|
|
- this.writeBuffer(buffer);
|
|
- };
|
|
- BufferWriter.prototype.writeBuffer = function (chunk) {
|
|
- if (!(chunk instanceof Buffer))
|
|
- throw new TypeError('BufferWriter only accepts Buffers');
|
|
- if (!this.latestBufferOffset) {
|
|
- this.completeBuffers.push(chunk);
|
|
- } else if (
|
|
- this.latestBuffer.length - this.latestBufferOffset >=
|
|
- chunk.length
|
|
- ) {
|
|
- chunk.copy(this.latestBuffer, this.latestBufferOffset);
|
|
- this.latestBufferOffset += chunk.length;
|
|
- if (this.latestBufferOffset >= this.latestBuffer.length) {
|
|
- this.completeBuffers.push(this.latestBuffer);
|
|
- this.latestBuffer = Buffer.alloc(this.defaultBufferLength);
|
|
- this.latestBufferOffset = 0;
|
|
- }
|
|
- } else {
|
|
- this.completeBuffers.push(
|
|
- this.latestBuffer.slice(0, this.latestBufferOffset),
|
|
- );
|
|
- this.completeBuffers.push(chunk);
|
|
- this.latestBuffer = Buffer.alloc(this.defaultBufferLength);
|
|
- this.latestBufferOffset = 0;
|
|
- }
|
|
- this.byteLength += chunk.length;
|
|
- };
|
|
- BufferWriter.prototype.result = function () {
|
|
- // Copies them all into a single Buffer
|
|
- var result = Buffer.alloc(this.byteLength);
|
|
- var offset = 0;
|
|
- for (var i = 0; i < this.completeBuffers.length; i++) {
|
|
- var buffer = this.completeBuffers[i];
|
|
- buffer.copy(result, offset, 0, buffer.length);
|
|
- offset += buffer.length;
|
|
- }
|
|
- if (this.latestBufferOffset) {
|
|
- this.latestBuffer.copy(result, offset, 0, this.latestBufferOffset);
|
|
- }
|
|
-
|
|
- if (this.stringFormat) return result.toString(this.stringFormat);
|
|
- return result;
|
|
- };
|
|
-
|
|
- if (typeof Buffer === 'function') {
|
|
- api.addReader(function (data, format) {
|
|
- if (data instanceof Buffer) {
|
|
- return new BufferReader(data);
|
|
- }
|
|
- if (format === 'hex' || format === 'base64') {
|
|
- var buffer = Buffer.from(data, format);
|
|
- return new BufferReader(buffer);
|
|
- }
|
|
- });
|
|
- api.addWriter(function (format) {
|
|
- if (!format || format === 'buffer') {
|
|
- return new BufferWriter();
|
|
- } else if (format === 'hex' || format === 'base64') {
|
|
- return new BufferWriter(format);
|
|
- }
|
|
- });
|
|
- }
|
|
-
|
|
- /** Hex-encoding (and Latin1) for browser **/
|
|
- function HexReader(hex) {
|
|
- this.hex = hex;
|
|
- this.pos = 0;
|
|
- }
|
|
- HexReader.prototype = Object.create(Reader.prototype);
|
|
- HexReader.prototype.peekByte = function () {
|
|
- var pair = this.hex.substring(this.pos, 2);
|
|
- return parseInt(pair, 16);
|
|
- };
|
|
- HexReader.prototype.readByte = function () {
|
|
- var pair = this.hex.substring(this.pos, this.pos + 2);
|
|
- this.pos += 2;
|
|
- return parseInt(pair, 16);
|
|
- };
|
|
- HexReader.prototype.readChunk = function (length) {
|
|
- var hex = this.hex.substring(this.pos, this.pos + length * 2);
|
|
- this.pos += length * 2;
|
|
- if (typeof Buffer === 'function') return Buffer.from(hex, 'hex');
|
|
- return new BinaryHex(hex);
|
|
- };
|
|
-
|
|
- function HexWriter(finalFormat) {
|
|
- this.$hex = '';
|
|
- this.finalFormat = finalFormat || 'hex';
|
|
- }
|
|
- HexWriter.prototype = Object.create(Writer.prototype);
|
|
- HexWriter.prototype.writeByte = function (value) {
|
|
- if (value < 0 || value > 255)
|
|
- throw new Error('Byte value out of range: ' + value);
|
|
- var hex = value.toString(16);
|
|
- if (hex.length == 1) {
|
|
- hex = '0' + hex;
|
|
- }
|
|
- this.$hex += hex;
|
|
- };
|
|
- HexWriter.prototype.canWriteBinary = function (chunk) {
|
|
- return (
|
|
- chunk instanceof BinaryHex ||
|
|
- (typeof Buffer === 'function' && chunk instanceof Buffer)
|
|
- );
|
|
- };
|
|
- HexWriter.prototype.writeBinary = function (chunk, lengthFunction) {
|
|
- if (chunk instanceof BinaryHex) {
|
|
- lengthFunction(chunk.length());
|
|
- this.$hex += chunk.$hex;
|
|
- } else if (typeof Buffer === 'function' && chunk instanceof Buffer) {
|
|
- lengthFunction(chunk.length);
|
|
- this.$hex += chunk.toString('hex');
|
|
- } else {
|
|
- throw new TypeError('HexWriter only accepts BinaryHex or Buffers');
|
|
- }
|
|
- };
|
|
- HexWriter.prototype.result = function () {
|
|
- if (this.finalFormat === 'buffer' && typeof Buffer === 'function') {
|
|
- return Buffer.from(this.$hex, 'hex');
|
|
- }
|
|
- return new BinaryHex(this.$hex).toString(this.finalFormat);
|
|
- };
|
|
- HexWriter.prototype.writeString = function (string, lengthFunction) {
|
|
- var buffer = BinaryHex.fromUtf8String(string);
|
|
- lengthFunction(buffer.length());
|
|
- this.$hex += buffer.$hex;
|
|
- };
|
|
-
|
|
- api.addReader(function (data, format) {
|
|
- if (data instanceof BinaryHex || data.$hex) {
|
|
- return new HexReader(data.$hex);
|
|
- }
|
|
- if (format === 'hex') {
|
|
- return new HexReader(data);
|
|
- }
|
|
- });
|
|
- api.addWriter(function (format) {
|
|
- if (format === 'hex') {
|
|
- return new HexWriter();
|
|
- }
|
|
- });
|
|
-
|
|
- return api;
|
|
- })();
|
|
-
|
|
- CBOR.addSemanticEncode(0, function (data) {
|
|
- if (data instanceof Date) {
|
|
- return data.toISOString();
|
|
- }
|
|
- })
|
|
- .addSemanticDecode(0, function (isoString) {
|
|
- return new Date(isoString);
|
|
- })
|
|
- .addSemanticDecode(1, function (isoString) {
|
|
- return new Date(isoString);
|
|
- });
|
|
-
|
|
- return CBOR;
|
|
-});
|
|
diff --git a/src/lib/index.ts b/src/lib/index.ts
|
|
deleted file mode 100644
|
|
index deb01562dbf2ce9ea2da105c3271ad6ae573b6f6..0000000000000000000000000000000000000000
|
|
--- a/src/lib/index.ts
|
|
+++ /dev/null
|
|
@@ -1,9 +0,0 @@
|
|
-export {
|
|
- encodeDataItem,
|
|
- decodeToDataItem,
|
|
- addSemanticDecode,
|
|
- addSemanticEncode,
|
|
- addReader,
|
|
- addWriter,
|
|
-} from './cbor-sync';
|
|
-export { DataItem } from './DataItem';
|
|
diff --git a/src/patchCBOR.ts b/src/patchCBOR.ts
|
|
deleted file mode 100644
|
|
index 218e912870e98872677bb1b167c9ab67a18fbb00..0000000000000000000000000000000000000000
|
|
--- a/src/patchCBOR.ts
|
|
+++ /dev/null
|
|
@@ -1,11 +0,0 @@
|
|
-import { patchTags } from './utils';
|
|
-import { RegistryTypes } from './RegistryType';
|
|
-import { ScriptExpressions } from './ScriptExpression';
|
|
-
|
|
-const registryTags = Object.values(RegistryTypes)
|
|
- .filter((r) => !!r.getTag())
|
|
- .map((r) => r.getTag());
|
|
-const scriptExpressionTags = Object.values(ScriptExpressions).map((se) =>
|
|
- se.getTag(),
|
|
-);
|
|
-patchTags(registryTags.concat(scriptExpressionTags) as number[]);
|
|
diff --git a/src/types.ts b/src/types.ts
|
|
deleted file mode 100644
|
|
index 29aa370267a20a0b50f01604c014d52145194b00..0000000000000000000000000000000000000000
|
|
--- a/src/types.ts
|
|
+++ /dev/null
|
|
@@ -1,6 +0,0 @@
|
|
-export interface ICryptoKey {
|
|
- isECKey: () => boolean;
|
|
- getOutputDescriptorContent: () => string;
|
|
-}
|
|
-
|
|
-export type DataItemMap = Record<string, any>;
|
|
diff --git a/src/utils.ts b/src/utils.ts
|
|
deleted file mode 100644
|
|
index e38112bfad6326399f71526ac1de00384c47fd49..0000000000000000000000000000000000000000
|
|
--- a/src/utils.ts
|
|
+++ /dev/null
|
|
@@ -1,19 +0,0 @@
|
|
-import { addSemanticDecode, addSemanticEncode, DataItem } from './lib';
|
|
-
|
|
-const alreadyPatchedTag: number[] = [];
|
|
-export const patchTags = (tags: number[]): void => {
|
|
- tags.forEach((tag) => {
|
|
- if (alreadyPatchedTag.find((i) => i === tag)) return;
|
|
- addSemanticEncode(tag, (data: any) => {
|
|
- if (data instanceof DataItem) {
|
|
- if (data.getTag() === tag) {
|
|
- return data.getData();
|
|
- }
|
|
- }
|
|
- });
|
|
- addSemanticDecode(tag, (data: any) => {
|
|
- return new DataItem(data, tag);
|
|
- });
|
|
- alreadyPatchedTag.push(tag);
|
|
- });
|
|
-};
|