phantasma-sdk-ts 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -10,6 +10,8 @@ class PhantasmaLink {
|
|
|
10
10
|
//Construct The Link
|
|
11
11
|
constructor(dappID, logging = true) {
|
|
12
12
|
this.lastSocketErrorMessage = null;
|
|
13
|
+
this.socketTransport = null;
|
|
14
|
+
this.socketOpen = false;
|
|
13
15
|
this.requestID = 0;
|
|
14
16
|
//Message Logging
|
|
15
17
|
this.onMessage = (msg) => {
|
|
@@ -36,6 +38,19 @@ class PhantasmaLink {
|
|
|
36
38
|
this.onLogin = function (succ) { }; //Does Nothing for Now
|
|
37
39
|
this.onError = function (message) { }; //Does Nothing for Now
|
|
38
40
|
}
|
|
41
|
+
// Preserve wallet-side failure details whenever the transport provides them.
|
|
42
|
+
describeFailure(result, fallback) {
|
|
43
|
+
if (typeof result === 'string' && result.length > 0) {
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
if (result && typeof result.error === 'string' && result.error.length > 0) {
|
|
47
|
+
return result.error;
|
|
48
|
+
}
|
|
49
|
+
if (result && typeof result.message === 'string' && result.message.length > 0) {
|
|
50
|
+
return result.message;
|
|
51
|
+
}
|
|
52
|
+
return fallback;
|
|
53
|
+
}
|
|
39
54
|
//Connect To Wallet
|
|
40
55
|
login(onLoginCallback, onErrorCallback, version = 4, platform = 'phantasma', providerHint = 'poltergeist') {
|
|
41
56
|
this.providerHint = providerHint;
|
|
@@ -363,12 +378,19 @@ class PhantasmaLink {
|
|
|
363
378
|
if (this.socket) {
|
|
364
379
|
this.socket.close();
|
|
365
380
|
}
|
|
381
|
+
const useInjectedSocket =
|
|
382
|
+
// @ts-ignore
|
|
383
|
+
!!window.PhantasmaLinkSocket && this.providerHint !== 'poltergeist';
|
|
384
|
+
this.socketTransport = useInjectedSocket ? 'injected' : 'websocket';
|
|
385
|
+
this.socketOpen = false;
|
|
386
|
+
this.onMessage(useInjectedSocket
|
|
387
|
+
? 'Using injected PhantasmaLinkSocket transport'
|
|
388
|
+
: `Using raw WebSocket transport: ${path}`);
|
|
366
389
|
//@ts-ignore
|
|
367
|
-
this.socket =
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
: new WebSocket(path);
|
|
390
|
+
this.socket = useInjectedSocket
|
|
391
|
+
? // @ts-ignore
|
|
392
|
+
new PhantasmaLinkSocket()
|
|
393
|
+
: new WebSocket(path);
|
|
372
394
|
this.requestCallback = null;
|
|
373
395
|
this.lastSocketErrorMessage = null;
|
|
374
396
|
this.token = null;
|
|
@@ -379,6 +401,7 @@ class PhantasmaLink {
|
|
|
379
401
|
let that = this;
|
|
380
402
|
//Once Socket Opened
|
|
381
403
|
this.socket.onopen = function (e) {
|
|
404
|
+
that.socketOpen = true;
|
|
382
405
|
that.onMessage('Connection established, authorizing dapp in wallet...');
|
|
383
406
|
if (isResume) {
|
|
384
407
|
that.fetchWallet(undefined, undefined);
|
|
@@ -405,7 +428,7 @@ class PhantasmaLink {
|
|
|
405
428
|
});
|
|
406
429
|
}
|
|
407
430
|
else {
|
|
408
|
-
that.onError('Authorization failed...');
|
|
431
|
+
that.onError(that.describeFailure(result, 'Authorization failed...'));
|
|
409
432
|
that.disconnect('Auth Failure');
|
|
410
433
|
}
|
|
411
434
|
});
|
|
@@ -428,8 +451,9 @@ class PhantasmaLink {
|
|
|
428
451
|
that.onError('Could not obtain account info... Make sure you have an account currently logged in');
|
|
429
452
|
that.disconnect(true);
|
|
430
453
|
break;
|
|
431
|
-
case 'A previouus request is still pending'
|
|
432
|
-
|
|
454
|
+
case 'A previouus request is still pending':
|
|
455
|
+
case 'A previous request is still pending':
|
|
456
|
+
that.onError(that.describeFailure(obj, 'You have a pending action in your wallet'));
|
|
433
457
|
break;
|
|
434
458
|
case 'user rejected':
|
|
435
459
|
that.onError('Transaction cancelled by user in ' + that.wallet);
|
|
@@ -455,6 +479,7 @@ class PhantasmaLink {
|
|
|
455
479
|
};
|
|
456
480
|
//Cleanup After Socket Closes
|
|
457
481
|
this.socket.onclose = function (event) {
|
|
482
|
+
that.socketOpen = false;
|
|
458
483
|
const reason = event.reason && event.reason.length > 0
|
|
459
484
|
? event.reason
|
|
460
485
|
: that.lastSocketErrorMessage || (event.wasClean ? 'Wallet connection closed' : 'Connection terminated unexpectedly');
|
|
@@ -505,8 +530,11 @@ class PhantasmaLink {
|
|
|
505
530
|
this.requestCallback = callback;
|
|
506
531
|
const socket = this.socket;
|
|
507
532
|
const openState = typeof WebSocket !== 'undefined' && typeof WebSocket.OPEN === 'number' ? WebSocket.OPEN : 1;
|
|
508
|
-
const
|
|
509
|
-
|
|
533
|
+
const hasSend = socket && typeof socket.send === 'function';
|
|
534
|
+
const hasReadyState = socket && typeof socket.readyState === 'number';
|
|
535
|
+
const isSocketOpen = hasSend &&
|
|
536
|
+
(hasReadyState ? socket.readyState === openState : this.socketOpen);
|
|
537
|
+
if (!socket || !hasSend || !isSocketOpen) {
|
|
510
538
|
this.handleSocketFailure('Wallet connection is closed. Please reconnect to your wallet.');
|
|
511
539
|
return;
|
|
512
540
|
}
|
|
@@ -540,6 +568,7 @@ class PhantasmaLink {
|
|
|
540
568
|
//Disconnect The Wallet Connection Socket
|
|
541
569
|
disconnect(triggered) {
|
|
542
570
|
this.onMessage('Disconnecting Phantasma Link: ' + triggered);
|
|
571
|
+
this.socketOpen = false;
|
|
543
572
|
if (this.socket)
|
|
544
573
|
this.socket.close();
|
|
545
574
|
}
|
|
@@ -7,6 +7,8 @@ export class PhantasmaLink {
|
|
|
7
7
|
//Construct The Link
|
|
8
8
|
constructor(dappID, logging = true) {
|
|
9
9
|
this.lastSocketErrorMessage = null;
|
|
10
|
+
this.socketTransport = null;
|
|
11
|
+
this.socketOpen = false;
|
|
10
12
|
this.requestID = 0;
|
|
11
13
|
//Message Logging
|
|
12
14
|
this.onMessage = (msg) => {
|
|
@@ -33,6 +35,19 @@ export class PhantasmaLink {
|
|
|
33
35
|
this.onLogin = function (succ) { }; //Does Nothing for Now
|
|
34
36
|
this.onError = function (message) { }; //Does Nothing for Now
|
|
35
37
|
}
|
|
38
|
+
// Preserve wallet-side failure details whenever the transport provides them.
|
|
39
|
+
describeFailure(result, fallback) {
|
|
40
|
+
if (typeof result === 'string' && result.length > 0) {
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
if (result && typeof result.error === 'string' && result.error.length > 0) {
|
|
44
|
+
return result.error;
|
|
45
|
+
}
|
|
46
|
+
if (result && typeof result.message === 'string' && result.message.length > 0) {
|
|
47
|
+
return result.message;
|
|
48
|
+
}
|
|
49
|
+
return fallback;
|
|
50
|
+
}
|
|
36
51
|
//Connect To Wallet
|
|
37
52
|
login(onLoginCallback, onErrorCallback, version = 4, platform = 'phantasma', providerHint = 'poltergeist') {
|
|
38
53
|
this.providerHint = providerHint;
|
|
@@ -360,12 +375,19 @@ export class PhantasmaLink {
|
|
|
360
375
|
if (this.socket) {
|
|
361
376
|
this.socket.close();
|
|
362
377
|
}
|
|
378
|
+
const useInjectedSocket =
|
|
379
|
+
// @ts-ignore
|
|
380
|
+
!!window.PhantasmaLinkSocket && this.providerHint !== 'poltergeist';
|
|
381
|
+
this.socketTransport = useInjectedSocket ? 'injected' : 'websocket';
|
|
382
|
+
this.socketOpen = false;
|
|
383
|
+
this.onMessage(useInjectedSocket
|
|
384
|
+
? 'Using injected PhantasmaLinkSocket transport'
|
|
385
|
+
: `Using raw WebSocket transport: ${path}`);
|
|
363
386
|
//@ts-ignore
|
|
364
|
-
this.socket =
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
: new WebSocket(path);
|
|
387
|
+
this.socket = useInjectedSocket
|
|
388
|
+
? // @ts-ignore
|
|
389
|
+
new PhantasmaLinkSocket()
|
|
390
|
+
: new WebSocket(path);
|
|
369
391
|
this.requestCallback = null;
|
|
370
392
|
this.lastSocketErrorMessage = null;
|
|
371
393
|
this.token = null;
|
|
@@ -376,6 +398,7 @@ export class PhantasmaLink {
|
|
|
376
398
|
let that = this;
|
|
377
399
|
//Once Socket Opened
|
|
378
400
|
this.socket.onopen = function (e) {
|
|
401
|
+
that.socketOpen = true;
|
|
379
402
|
that.onMessage('Connection established, authorizing dapp in wallet...');
|
|
380
403
|
if (isResume) {
|
|
381
404
|
that.fetchWallet(undefined, undefined);
|
|
@@ -402,7 +425,7 @@ export class PhantasmaLink {
|
|
|
402
425
|
});
|
|
403
426
|
}
|
|
404
427
|
else {
|
|
405
|
-
that.onError('Authorization failed...');
|
|
428
|
+
that.onError(that.describeFailure(result, 'Authorization failed...'));
|
|
406
429
|
that.disconnect('Auth Failure');
|
|
407
430
|
}
|
|
408
431
|
});
|
|
@@ -425,8 +448,9 @@ export class PhantasmaLink {
|
|
|
425
448
|
that.onError('Could not obtain account info... Make sure you have an account currently logged in');
|
|
426
449
|
that.disconnect(true);
|
|
427
450
|
break;
|
|
428
|
-
case 'A previouus request is still pending'
|
|
429
|
-
|
|
451
|
+
case 'A previouus request is still pending':
|
|
452
|
+
case 'A previous request is still pending':
|
|
453
|
+
that.onError(that.describeFailure(obj, 'You have a pending action in your wallet'));
|
|
430
454
|
break;
|
|
431
455
|
case 'user rejected':
|
|
432
456
|
that.onError('Transaction cancelled by user in ' + that.wallet);
|
|
@@ -452,6 +476,7 @@ export class PhantasmaLink {
|
|
|
452
476
|
};
|
|
453
477
|
//Cleanup After Socket Closes
|
|
454
478
|
this.socket.onclose = function (event) {
|
|
479
|
+
that.socketOpen = false;
|
|
455
480
|
const reason = event.reason && event.reason.length > 0
|
|
456
481
|
? event.reason
|
|
457
482
|
: that.lastSocketErrorMessage || (event.wasClean ? 'Wallet connection closed' : 'Connection terminated unexpectedly');
|
|
@@ -502,8 +527,11 @@ export class PhantasmaLink {
|
|
|
502
527
|
this.requestCallback = callback;
|
|
503
528
|
const socket = this.socket;
|
|
504
529
|
const openState = typeof WebSocket !== 'undefined' && typeof WebSocket.OPEN === 'number' ? WebSocket.OPEN : 1;
|
|
505
|
-
const
|
|
506
|
-
|
|
530
|
+
const hasSend = socket && typeof socket.send === 'function';
|
|
531
|
+
const hasReadyState = socket && typeof socket.readyState === 'number';
|
|
532
|
+
const isSocketOpen = hasSend &&
|
|
533
|
+
(hasReadyState ? socket.readyState === openState : this.socketOpen);
|
|
534
|
+
if (!socket || !hasSend || !isSocketOpen) {
|
|
507
535
|
this.handleSocketFailure('Wallet connection is closed. Please reconnect to your wallet.');
|
|
508
536
|
return;
|
|
509
537
|
}
|
|
@@ -537,6 +565,7 @@ export class PhantasmaLink {
|
|
|
537
565
|
//Disconnect The Wallet Connection Socket
|
|
538
566
|
disconnect(triggered) {
|
|
539
567
|
this.onMessage('Disconnecting Phantasma Link: ' + triggered);
|
|
568
|
+
this.socketOpen = false;
|
|
540
569
|
if (this.socket)
|
|
541
570
|
this.socket.close();
|
|
542
571
|
}
|
|
@@ -10,6 +10,8 @@ export declare class PhantasmaLink {
|
|
|
10
10
|
socket: any;
|
|
11
11
|
requestCallback: any;
|
|
12
12
|
private lastSocketErrorMessage;
|
|
13
|
+
socketTransport: 'websocket' | 'injected' | null;
|
|
14
|
+
socketOpen: boolean;
|
|
13
15
|
token: any;
|
|
14
16
|
requestID: number;
|
|
15
17
|
account: IAccount;
|
|
@@ -21,6 +23,7 @@ export declare class PhantasmaLink {
|
|
|
21
23
|
platform: string;
|
|
22
24
|
constructor(dappID: any, logging?: boolean);
|
|
23
25
|
onMessage: (msg: string) => void;
|
|
26
|
+
private describeFailure;
|
|
24
27
|
login(onLoginCallback: (success: boolean) => void, onErrorCallback: (message: string) => void, version?: number, platform?: string, providerHint?: string): void;
|
|
25
28
|
invokeScript(script: string, callback: (message: string) => void): void;
|
|
26
29
|
signTx(script: any, payload: string | null, callback: (arg0: string) => void, onErrorCallback: () => void, pow?: ProofOfWork, signature?: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phantasmaLink.d.ts","sourceRoot":"","sources":["../../../../src/core/link/phantasmaLink.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"phantasmaLink.d.ts","sourceRoot":"","sources":["../../../../src/core/link/phantasmaLink.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAK5D,qBAAa,aAAa;IAExB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7B,YAAY,EAAE,GAAG,CAAC;IAClB,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,GAAG,CAAC;IACZ,eAAe,EAAE,GAAG,CAAC;IACrB,OAAO,CAAC,sBAAsB,CAAuB;IACrD,eAAe,EAAE,WAAW,GAAG,UAAU,GAAG,IAAI,CAAQ;IACxD,UAAU,EAAE,OAAO,CAAS;IAC5B,KAAK,EAAE,GAAG,CAAC;IACX,SAAS,EAAE,MAAM,CAAK;IACtB,OAAO,EAAE,QAAQ,CAAC;IAClB,MAAM,EAAE,GAAG,CAAC;IACZ,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;gBAGL,MAAM,EAAE,GAAG,EAAE,OAAO,GAAE,OAAc;IAuBhD,SAAS,QAAS,MAAM,UAItB;IAGF,OAAO,CAAC,eAAe;IAiBvB,KAAK,CACH,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,EAC3C,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAC1C,OAAO,GAAE,MAAU,EACnB,QAAQ,GAAE,MAAoB,EAC9B,YAAY,GAAE,MAAsB;IAYtC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAgChE,MAAM,CACJ,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAChC,eAAe,EAAE,MAAM,IAAI,EAC3B,GAAG,cAAmB,EACtB,SAAS,SAAY;IAqEvB,wBAAwB,CACtB,KAAK,EAAE,KAAK,EACZ,QAAQ,GAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAe,EAC1C,eAAe,GAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,IAAe;IAoDxD,eAAe,CACb,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAClC,eAAe,EAAE,MAAM,IAAI,EAC3B,SAAS,GAAE,MAAkB;IAqC/B,QAAQ,CACN,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAClC,eAAe,EAAE,MAAM,IAAI,EAC3B,SAAS,GAAE,MAAkB;IAqC/B,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAAE,eAAe,EAAE,MAAM,IAAI;IAmBvE,WAAW,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,EAAE,eAAe,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI;IAqBpF,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,EAAE,eAAe,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI;IAmBlF,gBAAgB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,EAAE,eAAe,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI;IAqB1F,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EACnC,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAC1C,SAAS,GAAE,MAAkB;IAsC/B,YAAY,CAAC,QAAQ,GAAE,OAAe;IAuJtC,oBAAoB;IAQpB,MAAM,CAAC,KAAK,EAAE,GAAG;IAMjB,KAAK;IAKL,IAAI,MAAM,CAAC,IAAI,KAAA,EAEd;IAED,IAAI,MAAM,QAET;IAGD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI;IAqC3D,OAAO,CAAC,mBAAmB;IAe3B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAMlD,OAAO,CAAC,iBAAiB;CAK1B"}
|