Skip to content

Commit c6a3984

Browse files
JustinFengmicwallace
authored andcommitted
chore: 🎸 extract interface to separate file to allow lite engine to be isolated
1 parent 85751e2 commit c6a3984

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+393
-351
lines changed

‎javascript/engine-js/package.json‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@
1111
"main": "./dist/lib.commonjs/index.js",
1212
"module": "./dist/lib.esm/index.js",
1313
"types": "./dist/lib.esm/index.d.ts",
14+
"exports": {
15+
".": {
16+
"import": "./dist/lib.esm/index.js",
17+
"require": "./dist/lib.commonjs/index.js"
18+
},
19+
"./lite": {
20+
"import": "./dist/lib.esm/index.lite.js",
21+
"require": "./dist/lib.commonjs/index.lite.js"
22+
}
23+
},
1424
"scripts": {
1525
"build": "tsc && tsc -p tsconfig-commonjs.json && npm run copy-sdk",
1626
"copy-sdk": "copyfiles -u 1 ./src/view/sdk/* ./dist/lib.esm && copyfiles copyfiles -u 1 ./src/view/sdk/* ./dist/lib.commonjs",

‎javascript/engine-js/src/Engine.ts‎

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,26 @@
1-
import {Repo} from "./repo/Repo";
2-
import {FullTokenScript, TokenScript} from "./TokenScript";
3-
import {IWalletAdapter} from "./wallet/IWalletAdapter";
4-
import {ITokenDiscoveryAdapter} from "./tokens/ITokenDiscoveryAdapter";
5-
import {IViewBinding} from "./view/IViewBinding";
61
import {AttestationManager} from "./attestation/AttestationManager";
72
import {IAttestationStorageAdapter} from "./attestation/IAttestationStorageAdapter";
3+
import {IEngineConfig, ITokenScriptEngine, ScriptSourceType} from "./IEngine";
4+
import {Repo} from "./repo/Repo";
5+
import {ScriptInfo} from "./repo/sources/SourceInterface";
6+
import {ITokenDiscoveryAdapter} from "./tokens/ITokenDiscoveryAdapter";
7+
import {TokenScript} from "./TokenScript";
88
import {AttestationDefinition} from "./tokenScript/attestation/AttestationDefinition";
9-
import {TrustedKey} from "./security/TrustedKeyResolver";
109
import {ILocalStorageAdapter} from "./view/data/ILocalStorageAdapter";
11-
import {ITxValidationInfo} from "./security/TransactionValidator";
12-
import {ScriptInfo} from "./repo/sources/SourceInterface";
13-
14-
export interface IEngineConfig {
15-
ipfsGateway?: string
16-
noLocalStorage?: boolean
17-
trustedKeys?: TrustedKey[], // Define signing keys which are always valid
18-
txValidationCallback?: (txInfo: ITxValidationInfo) => boolean|Promise<boolean>;
19-
}
10+
import {IViewBinding} from "./view/IViewBinding";
11+
import {IWalletAdapter} from "./wallet/IWalletAdapter";
2012

2113
const DEFAULT_CONFIG: IEngineConfig = {
2214
ipfsGateway: "https://smart-token-labs-demo-server.mypinata.cloud/ipfs/",
2315
noLocalStorage: false,
2416
trustedKeys: []
2517
};
2618

27-
export enum ScriptSourceType {
28-
SCRIPT_REGISTRY = "registry",
29-
SCRIPT_URI = "scriptUri",
30-
URL = "url",
31-
UNKNOWN = "unknown",
32-
}
33-
34-
export interface TokenScriptEngine {
35-
getWalletAdapter: () => Promise<IWalletAdapter>;
36-
readonly config?: IEngineConfig;
37-
38-
processIpfsUrl(uri: string): string;
39-
getScriptUris(chain: string | number, contractAddr: string): Promise<string[] | null>;
40-
getTokenScriptFromUrl(url: string): Promise<TokenScript>;
41-
loadTokenScript(xml: string): Promise<TokenScript>;
42-
43-
resolveAllScripts(tsPath: string, forceReload?: boolean): Promise<ScriptInfo[]>;
44-
45-
// Only for FullTokenScriptEngine
46-
getTokenDiscoveryAdapter?: () => Promise<ITokenDiscoveryAdapter>;
47-
getAttestationStorageAdapter?: () => IAttestationStorageAdapter;
48-
getLocalStorageAdapter?: () => ILocalStorageAdapter;
49-
getAttestationManager(): AttestationManager;
50-
signPersonalMessage(data: string): Promise<string>;
51-
}
52-
5319
/**
5420
* Engine.ts is the top level component for the TokenScript engine, it can be used to create a new TokenScript instance
5521
* via the repo, URL or directly from XML source
5622
*/
57-
export class FullTokenScriptEngine implements TokenScriptEngine {
23+
export class TokenScriptEngine implements ITokenScriptEngine {
5824

5925
private repo: Repo = new Repo(this);
6026
private attestationManager?: AttestationManager;
@@ -219,7 +185,7 @@ export class FullTokenScriptEngine implements TokenScriptEngine {
219185
}
220186
let tokenXml = parser.parseFromString(xml,"text/xml");
221187

222-
return new FullTokenScript(this, tokenXml, xml, source, sourceId, sourceUrl, scriptInfo, viewBinding);
188+
return new TokenScript(this, tokenXml, xml, source, sourceId, sourceUrl, scriptInfo, viewBinding);
223189
} catch (e){
224190
throw new Error("Failed to parse tokenscript definition: " + e.message);
225191
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { AttestationManager } from './attestation/AttestationManager';
2+
import { IAttestationStorageAdapter } from './attestation/IAttestationStorageAdapter';
3+
import { ScriptInfo } from './repo/sources/SourceInterface';
4+
import { ITxValidationInfo } from './security/TransactionValidator';
5+
import { TrustedKey } from './security/TrustedKeyResolver';
6+
import { ITokenDiscoveryAdapter } from './tokens/ITokenDiscoveryAdapter';
7+
import { ITokenScript } from './ITokenScript';
8+
import { ILocalStorageAdapter } from './view/data/ILocalStorageAdapter';
9+
import { IWalletAdapter } from './wallet/IWalletAdapter';
10+
11+
export interface IEngineConfig {
12+
ipfsGateway?: string;
13+
noLocalStorage?: boolean;
14+
trustedKeys?: TrustedKey[]; // Define signing keys which are always valid
15+
txValidationCallback?: (txInfo: ITxValidationInfo) => boolean | Promise<boolean>;
16+
}
17+
18+
export enum ScriptSourceType {
19+
SCRIPT_REGISTRY = 'registry',
20+
SCRIPT_URI = 'scriptUri',
21+
URL = 'url',
22+
UNKNOWN = 'unknown',
23+
}
24+
25+
export interface ITokenScriptEngine {
26+
getWalletAdapter: () => Promise<IWalletAdapter>;
27+
readonly config?: IEngineConfig;
28+
29+
processIpfsUrl(uri: string): string;
30+
getScriptUris(chain: string | number, contractAddr: string): Promise<string[] | null>;
31+
getTokenScriptFromUrl(url: string): Promise<ITokenScript>;
32+
loadTokenScript(xml: string): Promise<ITokenScript>;
33+
34+
resolveAllScripts(tsPath: string, forceReload?: boolean): Promise<ScriptInfo[]>;
35+
36+
// Only for full TokenScriptEngine
37+
getTokenDiscoveryAdapter?: () => Promise<ITokenDiscoveryAdapter>;
38+
getAttestationStorageAdapter?: () => IAttestationStorageAdapter;
39+
getLocalStorageAdapter?: () => ILocalStorageAdapter;
40+
getAttestationManager(): AttestationManager;
41+
signPersonalMessage(data: string): Promise<string>;
42+
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import {ITokenScriptEngine, ScriptSourceType} from './IEngine';
2+
import {SecurityInfo} from './security/SecurityInfo';
3+
import {TransactionValidator} from './security/TransactionValidator';
4+
import {ITokenCollection} from './tokens/ITokenCollection';
5+
import {ITokenContextData} from './tokens/ITokenContextData';
6+
import {ITokenDiscoveryAdapter} from './tokens/ITokenDiscoveryAdapter';
7+
import {AttestationDefinitions} from './tokenScript/attestation/AttestationDefinitions';
8+
import {Attributes} from './tokenScript/Attributes';
9+
import {Card} from './tokenScript/Card';
10+
import {Cards} from './tokenScript/Cards';
11+
import {Contracts} from './tokenScript/Contracts';
12+
import {Meta} from './tokenScript/Meta';
13+
import {Origin} from './tokenScript/Origin';
14+
import {Selections} from './tokenScript/selection/Selections';
15+
import {Transaction} from './tokenScript/Transaction';
16+
import {IViewBinding} from './view/IViewBinding';
17+
import {ViewController} from './view/ViewController';
18+
import {ViewStyles} from './view/ViewStyles';
19+
20+
import {ScriptInfo} from './repo/sources/SourceInterface';
21+
22+
export interface ITokenContext extends ITokenCollection {
23+
originId: string;
24+
selectedTokenIndex?: number; // TODO: Deprecate selectedTokenIndex
25+
selectedTokenId?: string;
26+
}
27+
28+
export interface ITokenIdContext {
29+
originId: string;
30+
chainId: number;
31+
selectedTokenId?: string;
32+
}
33+
34+
export interface TokenScriptEvents {
35+
TOKENS_UPDATED: TokensUpdatedEventArgs;
36+
TOKENS_LOADING: void;
37+
TX_STATUS: ITransactionStatus;
38+
}
39+
40+
export interface TokensUpdatedEventArgs {
41+
tokens: TokenMetadataMap;
42+
}
43+
44+
export type EventHandler = (data: any) => Promise<void> | void;
45+
46+
export type TokenMetadataMap = { [contractName: string]: ITokenCollection };
47+
48+
export interface ITransactionStatus {
49+
status: 'started' | 'aborted' | 'submitted' | 'confirmed' | 'completed' | 'error';
50+
txNumber?: string;
51+
txLink?: string;
52+
txRecord?: any;
53+
message?: string;
54+
error?: any;
55+
}
56+
57+
export interface ITransactionListener {
58+
(data: ITransactionStatus): void | Promise<void>;
59+
}
60+
61+
export interface SourceInfo {
62+
tsId: string;
63+
source: ScriptSourceType;
64+
sourceUrl: string;
65+
scriptInfo: ScriptInfo;
66+
}
67+
68+
export interface ITokenScript {
69+
readonly viewStyles: ViewStyles;
70+
readonly transactionValidator: TransactionValidator;
71+
readonly tokenDef: XMLDocument;
72+
readonly xmlStr: string;
73+
74+
getEngine(): ITokenScriptEngine;
75+
getName(): string | null;
76+
getXmlString(): string;
77+
getSourceInfo(): SourceInfo;
78+
getLabel(pluralQty?: number): string;
79+
getMetadata(): Meta;
80+
getOrigins(): { [originName: string]: Origin };
81+
getContracts(): Contracts;
82+
getCards(): Cards;
83+
getAttributes(): Attributes;
84+
getAttestationDefinitions(): AttestationDefinitions;
85+
getSelections(): Selections;
86+
getCurrentTokenContext(): ITokenContext | undefined;
87+
getTokenContextData(tokenIdContext?: ITokenIdContext): Promise<ITokenContextData>;
88+
getSecurityInfo(): SecurityInfo;
89+
getViewContent(name: string): HTMLCollection | null;
90+
emitEvent<K extends keyof TokenScriptEvents>(eventName: K, data: TokenScriptEvents[K]): void;
91+
on<
92+
T extends keyof TokenScriptEvents, // <- T points to a key
93+
R extends (data: TokenScriptEvents[T]) => Promise<void> | void, // <- R points to the type of that key
94+
>(
95+
eventType: T,
96+
callback: R,
97+
id?: string,
98+
): void;
99+
off<
100+
T extends keyof TokenScriptEvents, // <- T points to a key
101+
>(
102+
eventType: T,
103+
id?: string,
104+
): void;
105+
getAsnModuleDefinition(name: string): Element | null;
106+
executeTransaction(transaction: Transaction, listener?: ITransactionListener, waitForConfirmation?: boolean): Promise<any | false>;
107+
108+
// Only for full TokenScript
109+
getViewController(viewBinding?: IViewBinding): ViewController;
110+
hasViewBinding(): boolean;
111+
getViewBinding(): IViewBinding;
112+
setViewBinding(viewBinding: IViewBinding): void;
113+
showOrExecuteTokenCard(card: Card, transactionListener?: ITransactionListener): Promise<void>;
114+
getTokenMetadata(reloadFromAdapter?: boolean, bypassCache?: boolean, alwaysFireEvent?: boolean): Promise<TokenMetadataMap>;
115+
setTokenMetadata(tokenMetadata: ITokenCollection[]): void;
116+
resolveTokenMetadata(reload: boolean): Promise<ITokenCollection[]>;
117+
setCurrentTokenContext(contractName: string, tokenIndex?: number | null, tokenId?: string | null): void;
118+
unsetTokenContext(): void;
119+
getTokenOriginData(): ITokenCollection[];
120+
setTokenDiscoveryAdapter(adapter: ITokenDiscoveryAdapter): void;
121+
}

‎javascript/engine-js/src/LiteEngine.ts‎

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1+
import { IEngineConfig, ITokenScriptEngine, ScriptSourceType } from './IEngine';
2+
import { LiteTokenScript } from './LiteTokenScript';
13
import { Repo } from './repo/Repo';
2-
import { IWalletAdapter } from './wallet/IWalletAdapter';
34
import { ScriptInfo } from './repo/sources/SourceInterface';
4-
import { IEngineConfig, ScriptSourceType, TokenScriptEngine } from './Engine';
5-
import { LiteTokenScript } from './LiteTokenScript';
6-
import { ITokenDiscoveryAdapter } from './tokens/ITokenDiscoveryAdapter';
7-
import { ILocalStorageAdapter } from './view/data/ILocalStorageAdapter';
8-
import { IAttestationStorageAdapter } from './attestation/IAttestationStorageAdapter';
9-
import { AttestationManager } from './attestation/AttestationManager';
5+
import { IWalletAdapter } from './wallet/IWalletAdapter';
106

117
const DEFAULT_CONFIG: IEngineConfig = {
128
ipfsGateway: 'https://smart-token-labs-demo-server.mypinata.cloud/ipfs/',
@@ -18,7 +14,7 @@ const DEFAULT_CONFIG: IEngineConfig = {
1814
* Engine.ts is the top level component for the TokenScript engine, it can be used to create a new TokenScript instance
1915
* via the repo, URL or directly from XML source
2016
*/
21-
export class LiteTokenScriptEngine implements TokenScriptEngine {
17+
export class LiteTokenScriptEngine implements ITokenScriptEngine {
2218
private repo: Repo = new Repo(this);
2319

2420
// TODO: Should we pass in a function or a constructor, dunno
@@ -95,14 +91,8 @@ export class LiteTokenScriptEngine implements TokenScriptEngine {
9591
*/
9692
private async initializeTokenScriptObject(xml: string, source: ScriptSourceType, sourceId: string, sourceUrl?: string, scriptInfo?: ScriptInfo) {
9793
try {
98-
let parser;
99-
if (typeof window === 'undefined') {
100-
const { JSDOM } = await import('jsdom');
101-
const jsdom = new JSDOM();
102-
parser = new jsdom.window.DOMParser();
103-
} else {
104-
parser = new DOMParser();
105-
}
94+
// Only support browser env for token-kit usage for now
95+
const parser = new DOMParser();
10696
let tokenXml = parser.parseFromString(xml, 'text/xml');
10797

10898
return new LiteTokenScript(this, tokenXml, xml, source, sourceId, sourceUrl, scriptInfo);
@@ -183,16 +173,16 @@ export class LiteTokenScriptEngine implements TokenScriptEngine {
183173
}
184174

185175
// Not implemented for LiteTokenScriptEngine
186-
public getTokenDiscoveryAdapter: () => Promise<ITokenDiscoveryAdapter> = () => {
176+
public getTokenDiscoveryAdapter: () => Promise<any> = () => {
187177
throw new Error('LiteTokenScriptEngine does not support the operation');
188178
};
189-
public getAttestationStorageAdapter: () => IAttestationStorageAdapter = () => {
179+
public getAttestationStorageAdapter: () => any = () => {
190180
throw new Error('LiteTokenScriptEngine does not support the operation');
191181
};
192-
public getLocalStorageAdapter: () => ILocalStorageAdapter = () => {
182+
public getLocalStorageAdapter: () => any = () => {
193183
throw new Error('LiteTokenScriptEngine does not support the operation');
194184
};
195-
public getAttestationManager(): AttestationManager {
185+
public getAttestationManager(): any {
196186
throw new Error('LiteTokenScriptEngine does not support the operation');
197187
}
198188
}

0 commit comments

Comments
 (0)