Skip to content

Commit 61bb045

Browse files
committed
feat: Implement TLink API request proxy
1 parent 7238940 commit 61bb045

File tree

9 files changed

+90
-5
lines changed

9 files changed

+90
-5
lines changed

javascript/card-sdk/src/index.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
ITokenData,
77
ITokenScriptSDK,
88
ITransactionListener,
9-
ITransactionStatus,
9+
ITransactionStatus, TLinkRequest,
1010
TokenScriptEvents,
1111
TXOptions
1212
} from "./types";
@@ -206,6 +206,17 @@ class TokenScriptSDK implements ITokenScriptSDK {
206206
},
207207
}
208208

209+
public readonly tlink = {
210+
request: async (request: TLinkRequest) => {
211+
try {
212+
const res = await this.engineAdapter.request<any>(RequestFromView.TLINK_REQUEST, request, true) as any;
213+
return res.result;
214+
} catch (e) {
215+
throw e;
216+
}
217+
}
218+
}
219+
209220
/**
210221
* Emit a TokenScript engine event to the user-agent
211222
* @param eventType

javascript/card-sdk/src/messaging/IEngineAdapter.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ export enum RequestFromView {
2020
EXEC_TRANSACTION = "execTransaction",
2121
REFRESH_TOKENS = "refreshTokens",
2222
SHOW_TX_TOAST = "showTransactionToast",
23-
SHOW_TOAST = "showToast"
23+
SHOW_TOAST = "showToast",
24+
TLINK_REQUEST = "tlinkRequest"
2425
}
2526

2627
export interface IEngineAdapter {

javascript/card-sdk/src/types/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ export interface TokenScriptEvents {
3838
TRANSACTION_EVENT: ITransactionStatus
3939
}
4040

41+
export interface TLinkRequest {
42+
method: string,
43+
payload: Object
44+
}
45+
4146
export interface ITokenScriptSDK {
4247
engineAdapter: IEngineAdapter;
4348
instanceData: IInstanceData;
@@ -66,6 +71,9 @@ export interface ITokenScriptSDK {
6671
getContractInfo: (name: string, chain?: number) => {chain: number, address: string, abi: any}
6772
getContractInstance: (name: string, chain?: number) => Contract
6873
}
74+
tlink: {
75+
request: (request: TLinkRequest) => void
76+
}
6977
env: {[key: string]: string}
7078
emitEvent: <
7179
T extends keyof TokenScriptEvents, // <- T points to a key

javascript/engine-js/src/Engine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {AttestationDefinition} from "./tokenScript/attestation/AttestationDefini
99
import {ILocalStorageAdapter} from "./view/data/ILocalStorageAdapter";
1010
import {IViewBinding} from "./view/IViewBinding";
1111
import {IWalletAdapter} from "./wallet/IWalletAdapter";
12+
import {ITlinkAdapter} from "./tlink/ITlinkAdapter";
1213

1314
/**
1415
* Engine.ts is the top level component for the TokenScript engine, it can be used to create a new TokenScript instance

javascript/engine-js/src/IEngine.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ import { ITokenDiscoveryAdapter } from './tokens/ITokenDiscoveryAdapter';
77
import { ITokenScript } from './ITokenScript';
88
import { ILocalStorageAdapter } from './view/data/ILocalStorageAdapter';
99
import { IWalletAdapter } from './wallet/IWalletAdapter';
10+
import {ITlinkAdapter} from "./tlink/ITlinkAdapter";
1011

1112
export interface IEngineConfig {
1213
ipfsGateway?: string;
1314
noLocalStorage?: boolean;
1415
trustedKeys?: TrustedKey[]; // Define signing keys which are always valid
1516
txValidationCallback?: (txInfo: ITxValidationInfo) => boolean | Promise<boolean>;
1617
viewerOrigin?: string;
18+
tlinkRequestAdapter?: ITlinkAdapter;
1719
}
1820

1921
export enum ScriptSourceType {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
export interface TLinkRequest {
3+
uid: string,
4+
method: string,
5+
payload: Object
6+
}
7+
8+
export type ITlinkAdapter = (request: TLinkRequest) => Promise<any>;

javascript/engine-js/src/view/ViewController.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {RpcRequest, RpcResponse} from "../wallet/IWalletAdapter";
55
import {LocalStorageProxy, LocalStorageRequest} from "./data/LocalStorageProxy";
66
import {IViewBinding} from "./IViewBinding";
77
import {TokenViewData} from "./TokenViewData";
8+
import {TLinkRequest} from "../tlink/ITlinkAdapter";
9+
import {TokenScriptEngine} from "../Engine";
810

911
export enum ViewEvent {
1012
TOKENS_UPDATED = "tokensUpdated",
@@ -27,7 +29,8 @@ export enum RequestFromView {
2729
EXEC_TRANSACTION = "execTransaction",
2830
REFRESH_TOKENS = "refreshTokens",
2931
SHOW_TX_TOAST = "showTransactionToast",
30-
SHOW_TOAST = "showToast"
32+
SHOW_TOAST = "showToast",
33+
TLINK_REQUEST = "tlinkRequest"
3134
}
3235

3336
export type TXTrigger = "refreshTokens"|"invalidateAttributes";
@@ -314,6 +317,10 @@ export class ViewController {
314317
await this.updateCardData(params.id);
315318
break;
316319

320+
case RequestFromView.TLINK_REQUEST:
321+
await this.tlinkRequest({method: params.method, payload: params.payload, uid: params.id});
322+
break;
323+
317324
default:
318325
throw new Error("TokenScript view API method: " + method + " is not implemented.");
319326
}
@@ -340,6 +347,21 @@ export class ViewController {
340347
this.viewAdapter.showLoader(false);
341348
}
342349

350+
private async tlinkRequest(request: TLinkRequest){
351+
try {
352+
if (!this.tokenScript.getEngine().config.tlinkRequestAdapter)
353+
throw new Error("TLink adapter not available");
354+
355+
const res = await this.tokenScript.getEngine().config.tlinkRequestAdapter(request);
356+
357+
this.dispatchViewEvent(ViewEvent.EXECUTE_CALLBACK, {error: null, result: res.response}, request.uid);
358+
359+
} catch (e){
360+
console.error(e);
361+
this.dispatchViewEvent(ViewEvent.EXECUTE_CALLBACK, {error: e.message, result: null}, request.uid);
362+
}
363+
}
364+
343365
/**
344366
*
345367
* @param request

javascript/engine-js/src/view/sdk/v1.txt

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

javascript/tokenscript-viewer/src/components/app/app.tsx

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {dbProvider} from "../../providers/databaseProvider";
1515
import {showToastNotification} from "../viewers/util/showToast";
1616
import {LocalStorageAdapter} from "../../integration/localStorageAdapter";
1717
import {StaticProviders} from "../wallet/Web3WalletProvider";
18+
import {TLinkRequest} from "../../../../engine-js/src/tlink/ITlinkAdapter";
1819

1920
export type TokenScriptSource = "resolve" | "file" | "url";
2021

@@ -135,7 +136,38 @@ export class AppRoot {
135136
return true;
136137
//return this.confirmTxPopover.confirmTransaction(txInfo);
137138
},
138-
viewerOrigin: this.viewerType.indexOf("tlink") === 0 ? "*" : document.location.origin
139+
viewerOrigin: this.viewerType.indexOf("tlink") === 0 ? "*" : document.location.origin,
140+
tlinkRequestAdapter: (data: TLinkRequest) => {
141+
142+
if (this.viewerType.indexOf("tlink") === -1)
143+
throw new Error("Tlink adapter is not available in this context");
144+
145+
console.log("TLink request: ", data);
146+
147+
return new Promise((resolve, reject) => {
148+
const messageHandler = (event) => {
149+
const response = event.data
150+
if (
151+
response.type === 'TLINK_API_RESPONSE' &&
152+
response.data?.method === data.method &&
153+
response.data?.uid === data.uid
154+
) {
155+
window.removeEventListener('message', messageHandler)
156+
console.log("response from TLink adapter: ", response);
157+
resolve(response.data)
158+
}
159+
}
160+
161+
window.addEventListener('message', messageHandler)
162+
163+
window.parent.postMessage({ type: 'TLINK_API_REQUEST', data }, '*')
164+
165+
setTimeout(() => {
166+
window.removeEventListener('message', messageHandler)
167+
reject(new Error('Message timeout'))
168+
}, 5000)
169+
})
170+
}
139171
}
140172
);
141173

0 commit comments

Comments
 (0)