@0xsequence/provider 0.40.3 → 0.40.4
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.
- package/dist/0xsequence-provider.cjs.dev.js +259 -1
- package/dist/0xsequence-provider.cjs.prod.js +259 -1
- package/dist/0xsequence-provider.esm.js +258 -2
- package/dist/declarations/src/transports/index.d.ts +1 -0
- package/dist/declarations/src/transports/unreal-transport/index.d.ts +2 -0
- package/dist/declarations/src/transports/unreal-transport/overridelogs.d.ts +4 -0
- package/dist/declarations/src/transports/unreal-transport/unreal-message-handler.d.ts +14 -0
- package/dist/declarations/src/transports/unreal-transport/unreal-message-provider.d.ts +15 -0
- package/dist/declarations/src/wallet.d.ts +3 -0
- package/package.json +8 -8
- package/src/transports/index.ts +1 -0
- package/src/transports/unreal-transport/index.ts +2 -0
- package/src/transports/unreal-transport/overridelogs.ts +36 -0
- package/src/transports/unreal-transport/unreal-message-handler.ts +121 -0
- package/src/transports/unreal-transport/unreal-message-provider.ts +121 -0
- package/src/wallet.ts +20 -4
|
@@ -3145,6 +3145,257 @@ class BaseInjectedTransport extends eventemitter2.EventEmitter2 {
|
|
|
3145
3145
|
|
|
3146
3146
|
}
|
|
3147
3147
|
|
|
3148
|
+
/**
|
|
3149
|
+
* This will redirect console logs from Sequence.js & the wallet to the Unreal console, for debugging purposes.
|
|
3150
|
+
*/
|
|
3151
|
+
function overrideLogs(side) {
|
|
3152
|
+
var _window$ue;
|
|
3153
|
+
|
|
3154
|
+
if ((_window$ue = window.ue) != null && _window$ue.sequencewallettransport && !window.logsOverriddenForUnreal) {
|
|
3155
|
+
var _window$ue2;
|
|
3156
|
+
|
|
3157
|
+
const t = (_window$ue2 = window.ue) == null ? void 0 : _window$ue2.sequencewallettransport;
|
|
3158
|
+
|
|
3159
|
+
console.log = (...args) => {
|
|
3160
|
+
t.logfromjs(`${side}: ${stringify(args)}`);
|
|
3161
|
+
};
|
|
3162
|
+
|
|
3163
|
+
console.warn = (...args) => {
|
|
3164
|
+
t.warnfromjs(`${side}: ${stringify(args)}`);
|
|
3165
|
+
};
|
|
3166
|
+
|
|
3167
|
+
console.error = (...args) => {
|
|
3168
|
+
t.errorfromjs(`${side}: ${stringify(args)}`);
|
|
3169
|
+
};
|
|
3170
|
+
|
|
3171
|
+
window.logsOverriddenForUnreal = true;
|
|
3172
|
+
}
|
|
3173
|
+
}
|
|
3174
|
+
|
|
3175
|
+
function stringify(things) {
|
|
3176
|
+
return things.map(a => typeof a === 'object' ? a instanceof Error ? a.message : JSON.stringify(a) : String(a)).join(' ');
|
|
3177
|
+
}
|
|
3178
|
+
|
|
3179
|
+
let registeredUnrealMessageProvider; // all lowercase is an annoying limitation of Unreal CEF BindUObject
|
|
3180
|
+
|
|
3181
|
+
/**
|
|
3182
|
+
* Initialized on dApp side
|
|
3183
|
+
*/
|
|
3184
|
+
class UnrealMessageProvider extends BaseProviderTransport {
|
|
3185
|
+
constructor(walletAppURL) {
|
|
3186
|
+
super();
|
|
3187
|
+
this.walletURL = void 0;
|
|
3188
|
+
|
|
3189
|
+
this.register = () => {
|
|
3190
|
+
var _window$ue;
|
|
3191
|
+
|
|
3192
|
+
overrideLogs('dapp');
|
|
3193
|
+
|
|
3194
|
+
if (registeredUnrealMessageProvider) {
|
|
3195
|
+
// overriding the registered message provider
|
|
3196
|
+
registeredUnrealMessageProvider.unregister();
|
|
3197
|
+
registeredUnrealMessageProvider = this;
|
|
3198
|
+
} // listen for incoming messages from wallet
|
|
3199
|
+
|
|
3200
|
+
|
|
3201
|
+
if ((_window$ue = window.ue) != null && _window$ue.sequencewallettransport) {
|
|
3202
|
+
window.ue.sequencewallettransport.onmessagefromwallet = this.onUnrealCallback;
|
|
3203
|
+
}
|
|
3204
|
+
|
|
3205
|
+
registeredUnrealMessageProvider = this;
|
|
3206
|
+
this._registered = true;
|
|
3207
|
+
console.log('registering transport!');
|
|
3208
|
+
};
|
|
3209
|
+
|
|
3210
|
+
this.unregister = () => {
|
|
3211
|
+
var _window$ue2, _window$ue2$sequencew;
|
|
3212
|
+
|
|
3213
|
+
this._registered = false;
|
|
3214
|
+
this.closeWallet(); // disable message listener
|
|
3215
|
+
|
|
3216
|
+
if (registeredUnrealMessageProvider === this) {
|
|
3217
|
+
registeredUnrealMessageProvider = undefined;
|
|
3218
|
+
}
|
|
3219
|
+
|
|
3220
|
+
if (((_window$ue2 = window.ue) == null ? void 0 : (_window$ue2$sequencew = _window$ue2.sequencewallettransport) == null ? void 0 : _window$ue2$sequencew.onmessagefromwallet) === this.onUnrealCallback) {
|
|
3221
|
+
delete window.ue.sequencewallettransport.onmessagefromwallet;
|
|
3222
|
+
} // clear event listeners
|
|
3223
|
+
|
|
3224
|
+
|
|
3225
|
+
this.events.removeAllListeners();
|
|
3226
|
+
};
|
|
3227
|
+
|
|
3228
|
+
this.openWallet = (path, intent, networkId) => {
|
|
3229
|
+
if (this.isOpened()) {
|
|
3230
|
+
// TODO focus wallet
|
|
3231
|
+
console.log('wallet already open!');
|
|
3232
|
+
return;
|
|
3233
|
+
}
|
|
3234
|
+
|
|
3235
|
+
console.log('opening wallet!'); // Instantiate new walletURL for this call
|
|
3236
|
+
|
|
3237
|
+
const walletURL = new URL(this.walletURL.href);
|
|
3238
|
+
const windowSessionParams = new WindowSessionParams();
|
|
3239
|
+
|
|
3240
|
+
if (path) {
|
|
3241
|
+
walletURL.pathname = path.toLowerCase();
|
|
3242
|
+
} // Set session, intent and network id on walletURL
|
|
3243
|
+
|
|
3244
|
+
|
|
3245
|
+
this._init = exports.InitState.NIL;
|
|
3246
|
+
this._sessionId = `${performance.now()}`;
|
|
3247
|
+
windowSessionParams.set('sid', this._sessionId);
|
|
3248
|
+
|
|
3249
|
+
if (intent) {
|
|
3250
|
+
// encode intent as base64 url-encoded param
|
|
3251
|
+
windowSessionParams.set('intent', utils.base64EncodeObject(intent));
|
|
3252
|
+
}
|
|
3253
|
+
|
|
3254
|
+
if (networkId) {
|
|
3255
|
+
windowSessionParams.set('net', `${networkId}`);
|
|
3256
|
+
} // serialize params
|
|
3257
|
+
|
|
3258
|
+
|
|
3259
|
+
walletURL.search = windowSessionParams.toString();
|
|
3260
|
+
console.log('opening wallet to', walletURL.href);
|
|
3261
|
+
window.open(walletURL.href);
|
|
3262
|
+
};
|
|
3263
|
+
|
|
3264
|
+
this.onUnrealCallback = message => {
|
|
3265
|
+
if (!message) {
|
|
3266
|
+
throw new Error('ProviderMessage object is empty');
|
|
3267
|
+
} // handle message with base message provider
|
|
3268
|
+
|
|
3269
|
+
|
|
3270
|
+
this.handleMessage(message);
|
|
3271
|
+
};
|
|
3272
|
+
|
|
3273
|
+
this.walletURL = new URL(walletAppURL);
|
|
3274
|
+
}
|
|
3275
|
+
|
|
3276
|
+
closeWallet() {
|
|
3277
|
+
this.close();
|
|
3278
|
+
} // onmessage, receives ProviderMessageResponse from the wallet unreal transport
|
|
3279
|
+
|
|
3280
|
+
|
|
3281
|
+
// all lowercase is an annoying limitation of Unreal CEF BindUObject
|
|
3282
|
+
sendMessage(message) {
|
|
3283
|
+
var _window$ue3, _window$ue3$sequencew;
|
|
3284
|
+
|
|
3285
|
+
const postedMessage = typeof message !== 'string' ? JSON.stringify(message) : message;
|
|
3286
|
+
console.log('Sending message to wallet:', postedMessage);
|
|
3287
|
+
(_window$ue3 = window.ue) == null ? void 0 : (_window$ue3$sequencew = _window$ue3.sequencewallettransport) == null ? void 0 : _window$ue3$sequencew.sendmessagetowallet(postedMessage);
|
|
3288
|
+
}
|
|
3289
|
+
|
|
3290
|
+
}
|
|
3291
|
+
|
|
3292
|
+
/**
|
|
3293
|
+
* Initialized on Wallet side
|
|
3294
|
+
*/
|
|
3295
|
+
class UnrealMessageHandler extends BaseWalletTransport {
|
|
3296
|
+
constructor(walletRequestHandler) {
|
|
3297
|
+
super(walletRequestHandler);
|
|
3298
|
+
|
|
3299
|
+
this.onMessageFromUnreal = request => {
|
|
3300
|
+
// Wallet always expects json-rpc request messages from a dapp
|
|
3301
|
+
utils.logger.debug('RECEIVED MESSAGE', request); // Handle message via the base transport
|
|
3302
|
+
|
|
3303
|
+
this.handleMessage(request);
|
|
3304
|
+
};
|
|
3305
|
+
|
|
3306
|
+
this.getUnrealTransportSession = windowParams => {
|
|
3307
|
+
const params = new WindowSessionParams(windowParams);
|
|
3308
|
+
return {
|
|
3309
|
+
sessionId: params.get('sid'),
|
|
3310
|
+
networkId: params.get('net'),
|
|
3311
|
+
intent: utils.base64DecodeObject(params.get('intent'))
|
|
3312
|
+
};
|
|
3313
|
+
};
|
|
3314
|
+
|
|
3315
|
+
this._init = exports.InitState.NIL;
|
|
3316
|
+
}
|
|
3317
|
+
|
|
3318
|
+
async register(windowHref) {
|
|
3319
|
+
var _window$ue;
|
|
3320
|
+
|
|
3321
|
+
if (((_window$ue = window.ue) == null ? void 0 : _window$ue.sequencewallettransport) === undefined) {
|
|
3322
|
+
return;
|
|
3323
|
+
}
|
|
3324
|
+
|
|
3325
|
+
overrideLogs('wallet'); // record open details (sessionId + default network) from the window url
|
|
3326
|
+
|
|
3327
|
+
const {
|
|
3328
|
+
search: rawParams
|
|
3329
|
+
} = new URL(windowHref || window.location.href);
|
|
3330
|
+
let session = this.getUnrealTransportSession(rawParams); // provider should always include sid when opening a new window
|
|
3331
|
+
|
|
3332
|
+
const isNewWindowSession = !!session.sessionId; // attempt to restore previous session in the case of a redirect or window reload
|
|
3333
|
+
|
|
3334
|
+
if (!isNewWindowSession) {
|
|
3335
|
+
session = await this.getCachedTransportSession();
|
|
3336
|
+
}
|
|
3337
|
+
|
|
3338
|
+
if (!session) {
|
|
3339
|
+
utils.logger.error('unreal session is undefined');
|
|
3340
|
+
return;
|
|
3341
|
+
} // listen for window-transport requests
|
|
3342
|
+
|
|
3343
|
+
|
|
3344
|
+
window.ue.sequencewallettransport.onmessagefromsequencejs = this.onMessageFromUnreal;
|
|
3345
|
+
this._registered = true; // send open event to the app which opened us
|
|
3346
|
+
|
|
3347
|
+
this.open(session).then(opened => {
|
|
3348
|
+
if (!opened) {
|
|
3349
|
+
var _session;
|
|
3350
|
+
|
|
3351
|
+
const err = `failed to open to network ${(_session = session) == null ? void 0 : _session.networkId}`;
|
|
3352
|
+
utils.logger.error(err);
|
|
3353
|
+
this.notifyClose({
|
|
3354
|
+
message: err
|
|
3355
|
+
});
|
|
3356
|
+
window.close();
|
|
3357
|
+
}
|
|
3358
|
+
}).catch(e => {
|
|
3359
|
+
var _session2;
|
|
3360
|
+
|
|
3361
|
+
const err = `failed to open to network ${(_session2 = session) == null ? void 0 : _session2.networkId}, due to: ${e}`;
|
|
3362
|
+
utils.logger.error(err);
|
|
3363
|
+
this.notifyClose({
|
|
3364
|
+
message: err
|
|
3365
|
+
});
|
|
3366
|
+
window.close();
|
|
3367
|
+
});
|
|
3368
|
+
}
|
|
3369
|
+
|
|
3370
|
+
unregister() {
|
|
3371
|
+
var _window$ue2, _window$ue2$sequencew;
|
|
3372
|
+
|
|
3373
|
+
if (((_window$ue2 = window.ue) == null ? void 0 : (_window$ue2$sequencew = _window$ue2.sequencewallettransport) == null ? void 0 : _window$ue2$sequencew.onmessagefromsequencejs) === this.onMessageFromUnreal) {
|
|
3374
|
+
delete window.ue.sequencewallettransport.onmessagefromsequencejs;
|
|
3375
|
+
}
|
|
3376
|
+
|
|
3377
|
+
this._registered = false;
|
|
3378
|
+
} // onmessage is called when (the wallet) receives request messages from the dapp
|
|
3379
|
+
// over the unreal json-messaging transport
|
|
3380
|
+
|
|
3381
|
+
|
|
3382
|
+
// sendMessage sends message to the dapp window
|
|
3383
|
+
sendMessage(message) {
|
|
3384
|
+
var _window$ue3, _window$ue3$sequencew;
|
|
3385
|
+
|
|
3386
|
+
if (message.type !== exports.EventType.INIT && this._init !== exports.InitState.OK) {
|
|
3387
|
+
utils.logger.error('impossible state, should not be calling postMessage until inited');
|
|
3388
|
+
return;
|
|
3389
|
+
} // prepare payload
|
|
3390
|
+
|
|
3391
|
+
|
|
3392
|
+
const payload = JSON.stringify(message); // post-message to app.
|
|
3393
|
+
|
|
3394
|
+
(_window$ue3 = window.ue) == null ? void 0 : (_window$ue3$sequencew = _window$ue3.sequencewallettransport) == null ? void 0 : _window$ue3$sequencew.sendmessagetosequencejs(payload);
|
|
3395
|
+
}
|
|
3396
|
+
|
|
3397
|
+
}
|
|
3398
|
+
|
|
3148
3399
|
class WalletUtils {
|
|
3149
3400
|
constructor(walletProvider) {
|
|
3150
3401
|
var _this = this;
|
|
@@ -3250,7 +3501,7 @@ class Wallet {
|
|
|
3250
3501
|
this.providers = void 0;
|
|
3251
3502
|
|
|
3252
3503
|
this.init = () => {
|
|
3253
|
-
var _this$config$transpor, _this$config$transpor2, _this$config$transpor3, _this$config$transpor4, _this$config$transpor5, _this$config$transpor6;
|
|
3504
|
+
var _this$config$transpor, _this$config$transpor2, _this$config$transpor3, _this$config$transpor4, _this$config$transpor5, _this$config$transpor6, _this$config$transpor7, _this$config$transpor8;
|
|
3254
3505
|
|
|
3255
3506
|
if (this.transport.provider) {
|
|
3256
3507
|
// init must have already been called
|
|
@@ -3282,6 +3533,11 @@ class Wallet {
|
|
|
3282
3533
|
// this.transport.messageProvider.add(this.transport.extensionMessageProvider)
|
|
3283
3534
|
}
|
|
3284
3535
|
|
|
3536
|
+
if ((_this$config$transpor7 = this.config.transports) != null && (_this$config$transpor8 = _this$config$transpor7.unrealTransport) != null && _this$config$transpor8.enabled) {
|
|
3537
|
+
this.transport.unrealMessageProvider = new UnrealMessageProvider(this.config.walletAppURL);
|
|
3538
|
+
this.transport.messageProvider.add(this.transport.unrealMessageProvider);
|
|
3539
|
+
}
|
|
3540
|
+
|
|
3285
3541
|
this.transport.messageProvider.register(); // .....
|
|
3286
3542
|
|
|
3287
3543
|
this.transport.allowProvider = network.allowProviderMiddleware(request => {
|
|
@@ -3839,6 +4095,8 @@ exports.ProxyMessageChannel = ProxyMessageChannel;
|
|
|
3839
4095
|
exports.ProxyMessageChannelPort = ProxyMessageChannelPort;
|
|
3840
4096
|
exports.ProxyMessageHandler = ProxyMessageHandler;
|
|
3841
4097
|
exports.ProxyMessageProvider = ProxyMessageProvider;
|
|
4098
|
+
exports.UnrealMessageHandler = UnrealMessageHandler;
|
|
4099
|
+
exports.UnrealMessageProvider = UnrealMessageProvider;
|
|
3842
4100
|
exports.Wallet = Wallet;
|
|
3843
4101
|
exports.WalletRequestHandler = WalletRequestHandler;
|
|
3844
4102
|
exports.Web3Provider = Web3Provider;
|
|
@@ -3145,6 +3145,257 @@ class BaseInjectedTransport extends eventemitter2.EventEmitter2 {
|
|
|
3145
3145
|
|
|
3146
3146
|
}
|
|
3147
3147
|
|
|
3148
|
+
/**
|
|
3149
|
+
* This will redirect console logs from Sequence.js & the wallet to the Unreal console, for debugging purposes.
|
|
3150
|
+
*/
|
|
3151
|
+
function overrideLogs(side) {
|
|
3152
|
+
var _window$ue;
|
|
3153
|
+
|
|
3154
|
+
if ((_window$ue = window.ue) != null && _window$ue.sequencewallettransport && !window.logsOverriddenForUnreal) {
|
|
3155
|
+
var _window$ue2;
|
|
3156
|
+
|
|
3157
|
+
const t = (_window$ue2 = window.ue) == null ? void 0 : _window$ue2.sequencewallettransport;
|
|
3158
|
+
|
|
3159
|
+
console.log = (...args) => {
|
|
3160
|
+
t.logfromjs(`${side}: ${stringify(args)}`);
|
|
3161
|
+
};
|
|
3162
|
+
|
|
3163
|
+
console.warn = (...args) => {
|
|
3164
|
+
t.warnfromjs(`${side}: ${stringify(args)}`);
|
|
3165
|
+
};
|
|
3166
|
+
|
|
3167
|
+
console.error = (...args) => {
|
|
3168
|
+
t.errorfromjs(`${side}: ${stringify(args)}`);
|
|
3169
|
+
};
|
|
3170
|
+
|
|
3171
|
+
window.logsOverriddenForUnreal = true;
|
|
3172
|
+
}
|
|
3173
|
+
}
|
|
3174
|
+
|
|
3175
|
+
function stringify(things) {
|
|
3176
|
+
return things.map(a => typeof a === 'object' ? a instanceof Error ? a.message : JSON.stringify(a) : String(a)).join(' ');
|
|
3177
|
+
}
|
|
3178
|
+
|
|
3179
|
+
let registeredUnrealMessageProvider; // all lowercase is an annoying limitation of Unreal CEF BindUObject
|
|
3180
|
+
|
|
3181
|
+
/**
|
|
3182
|
+
* Initialized on dApp side
|
|
3183
|
+
*/
|
|
3184
|
+
class UnrealMessageProvider extends BaseProviderTransport {
|
|
3185
|
+
constructor(walletAppURL) {
|
|
3186
|
+
super();
|
|
3187
|
+
this.walletURL = void 0;
|
|
3188
|
+
|
|
3189
|
+
this.register = () => {
|
|
3190
|
+
var _window$ue;
|
|
3191
|
+
|
|
3192
|
+
overrideLogs('dapp');
|
|
3193
|
+
|
|
3194
|
+
if (registeredUnrealMessageProvider) {
|
|
3195
|
+
// overriding the registered message provider
|
|
3196
|
+
registeredUnrealMessageProvider.unregister();
|
|
3197
|
+
registeredUnrealMessageProvider = this;
|
|
3198
|
+
} // listen for incoming messages from wallet
|
|
3199
|
+
|
|
3200
|
+
|
|
3201
|
+
if ((_window$ue = window.ue) != null && _window$ue.sequencewallettransport) {
|
|
3202
|
+
window.ue.sequencewallettransport.onmessagefromwallet = this.onUnrealCallback;
|
|
3203
|
+
}
|
|
3204
|
+
|
|
3205
|
+
registeredUnrealMessageProvider = this;
|
|
3206
|
+
this._registered = true;
|
|
3207
|
+
console.log('registering transport!');
|
|
3208
|
+
};
|
|
3209
|
+
|
|
3210
|
+
this.unregister = () => {
|
|
3211
|
+
var _window$ue2, _window$ue2$sequencew;
|
|
3212
|
+
|
|
3213
|
+
this._registered = false;
|
|
3214
|
+
this.closeWallet(); // disable message listener
|
|
3215
|
+
|
|
3216
|
+
if (registeredUnrealMessageProvider === this) {
|
|
3217
|
+
registeredUnrealMessageProvider = undefined;
|
|
3218
|
+
}
|
|
3219
|
+
|
|
3220
|
+
if (((_window$ue2 = window.ue) == null ? void 0 : (_window$ue2$sequencew = _window$ue2.sequencewallettransport) == null ? void 0 : _window$ue2$sequencew.onmessagefromwallet) === this.onUnrealCallback) {
|
|
3221
|
+
delete window.ue.sequencewallettransport.onmessagefromwallet;
|
|
3222
|
+
} // clear event listeners
|
|
3223
|
+
|
|
3224
|
+
|
|
3225
|
+
this.events.removeAllListeners();
|
|
3226
|
+
};
|
|
3227
|
+
|
|
3228
|
+
this.openWallet = (path, intent, networkId) => {
|
|
3229
|
+
if (this.isOpened()) {
|
|
3230
|
+
// TODO focus wallet
|
|
3231
|
+
console.log('wallet already open!');
|
|
3232
|
+
return;
|
|
3233
|
+
}
|
|
3234
|
+
|
|
3235
|
+
console.log('opening wallet!'); // Instantiate new walletURL for this call
|
|
3236
|
+
|
|
3237
|
+
const walletURL = new URL(this.walletURL.href);
|
|
3238
|
+
const windowSessionParams = new WindowSessionParams();
|
|
3239
|
+
|
|
3240
|
+
if (path) {
|
|
3241
|
+
walletURL.pathname = path.toLowerCase();
|
|
3242
|
+
} // Set session, intent and network id on walletURL
|
|
3243
|
+
|
|
3244
|
+
|
|
3245
|
+
this._init = exports.InitState.NIL;
|
|
3246
|
+
this._sessionId = `${performance.now()}`;
|
|
3247
|
+
windowSessionParams.set('sid', this._sessionId);
|
|
3248
|
+
|
|
3249
|
+
if (intent) {
|
|
3250
|
+
// encode intent as base64 url-encoded param
|
|
3251
|
+
windowSessionParams.set('intent', utils.base64EncodeObject(intent));
|
|
3252
|
+
}
|
|
3253
|
+
|
|
3254
|
+
if (networkId) {
|
|
3255
|
+
windowSessionParams.set('net', `${networkId}`);
|
|
3256
|
+
} // serialize params
|
|
3257
|
+
|
|
3258
|
+
|
|
3259
|
+
walletURL.search = windowSessionParams.toString();
|
|
3260
|
+
console.log('opening wallet to', walletURL.href);
|
|
3261
|
+
window.open(walletURL.href);
|
|
3262
|
+
};
|
|
3263
|
+
|
|
3264
|
+
this.onUnrealCallback = message => {
|
|
3265
|
+
if (!message) {
|
|
3266
|
+
throw new Error('ProviderMessage object is empty');
|
|
3267
|
+
} // handle message with base message provider
|
|
3268
|
+
|
|
3269
|
+
|
|
3270
|
+
this.handleMessage(message);
|
|
3271
|
+
};
|
|
3272
|
+
|
|
3273
|
+
this.walletURL = new URL(walletAppURL);
|
|
3274
|
+
}
|
|
3275
|
+
|
|
3276
|
+
closeWallet() {
|
|
3277
|
+
this.close();
|
|
3278
|
+
} // onmessage, receives ProviderMessageResponse from the wallet unreal transport
|
|
3279
|
+
|
|
3280
|
+
|
|
3281
|
+
// all lowercase is an annoying limitation of Unreal CEF BindUObject
|
|
3282
|
+
sendMessage(message) {
|
|
3283
|
+
var _window$ue3, _window$ue3$sequencew;
|
|
3284
|
+
|
|
3285
|
+
const postedMessage = typeof message !== 'string' ? JSON.stringify(message) : message;
|
|
3286
|
+
console.log('Sending message to wallet:', postedMessage);
|
|
3287
|
+
(_window$ue3 = window.ue) == null ? void 0 : (_window$ue3$sequencew = _window$ue3.sequencewallettransport) == null ? void 0 : _window$ue3$sequencew.sendmessagetowallet(postedMessage);
|
|
3288
|
+
}
|
|
3289
|
+
|
|
3290
|
+
}
|
|
3291
|
+
|
|
3292
|
+
/**
|
|
3293
|
+
* Initialized on Wallet side
|
|
3294
|
+
*/
|
|
3295
|
+
class UnrealMessageHandler extends BaseWalletTransport {
|
|
3296
|
+
constructor(walletRequestHandler) {
|
|
3297
|
+
super(walletRequestHandler);
|
|
3298
|
+
|
|
3299
|
+
this.onMessageFromUnreal = request => {
|
|
3300
|
+
// Wallet always expects json-rpc request messages from a dapp
|
|
3301
|
+
utils.logger.debug('RECEIVED MESSAGE', request); // Handle message via the base transport
|
|
3302
|
+
|
|
3303
|
+
this.handleMessage(request);
|
|
3304
|
+
};
|
|
3305
|
+
|
|
3306
|
+
this.getUnrealTransportSession = windowParams => {
|
|
3307
|
+
const params = new WindowSessionParams(windowParams);
|
|
3308
|
+
return {
|
|
3309
|
+
sessionId: params.get('sid'),
|
|
3310
|
+
networkId: params.get('net'),
|
|
3311
|
+
intent: utils.base64DecodeObject(params.get('intent'))
|
|
3312
|
+
};
|
|
3313
|
+
};
|
|
3314
|
+
|
|
3315
|
+
this._init = exports.InitState.NIL;
|
|
3316
|
+
}
|
|
3317
|
+
|
|
3318
|
+
async register(windowHref) {
|
|
3319
|
+
var _window$ue;
|
|
3320
|
+
|
|
3321
|
+
if (((_window$ue = window.ue) == null ? void 0 : _window$ue.sequencewallettransport) === undefined) {
|
|
3322
|
+
return;
|
|
3323
|
+
}
|
|
3324
|
+
|
|
3325
|
+
overrideLogs('wallet'); // record open details (sessionId + default network) from the window url
|
|
3326
|
+
|
|
3327
|
+
const {
|
|
3328
|
+
search: rawParams
|
|
3329
|
+
} = new URL(windowHref || window.location.href);
|
|
3330
|
+
let session = this.getUnrealTransportSession(rawParams); // provider should always include sid when opening a new window
|
|
3331
|
+
|
|
3332
|
+
const isNewWindowSession = !!session.sessionId; // attempt to restore previous session in the case of a redirect or window reload
|
|
3333
|
+
|
|
3334
|
+
if (!isNewWindowSession) {
|
|
3335
|
+
session = await this.getCachedTransportSession();
|
|
3336
|
+
}
|
|
3337
|
+
|
|
3338
|
+
if (!session) {
|
|
3339
|
+
utils.logger.error('unreal session is undefined');
|
|
3340
|
+
return;
|
|
3341
|
+
} // listen for window-transport requests
|
|
3342
|
+
|
|
3343
|
+
|
|
3344
|
+
window.ue.sequencewallettransport.onmessagefromsequencejs = this.onMessageFromUnreal;
|
|
3345
|
+
this._registered = true; // send open event to the app which opened us
|
|
3346
|
+
|
|
3347
|
+
this.open(session).then(opened => {
|
|
3348
|
+
if (!opened) {
|
|
3349
|
+
var _session;
|
|
3350
|
+
|
|
3351
|
+
const err = `failed to open to network ${(_session = session) == null ? void 0 : _session.networkId}`;
|
|
3352
|
+
utils.logger.error(err);
|
|
3353
|
+
this.notifyClose({
|
|
3354
|
+
message: err
|
|
3355
|
+
});
|
|
3356
|
+
window.close();
|
|
3357
|
+
}
|
|
3358
|
+
}).catch(e => {
|
|
3359
|
+
var _session2;
|
|
3360
|
+
|
|
3361
|
+
const err = `failed to open to network ${(_session2 = session) == null ? void 0 : _session2.networkId}, due to: ${e}`;
|
|
3362
|
+
utils.logger.error(err);
|
|
3363
|
+
this.notifyClose({
|
|
3364
|
+
message: err
|
|
3365
|
+
});
|
|
3366
|
+
window.close();
|
|
3367
|
+
});
|
|
3368
|
+
}
|
|
3369
|
+
|
|
3370
|
+
unregister() {
|
|
3371
|
+
var _window$ue2, _window$ue2$sequencew;
|
|
3372
|
+
|
|
3373
|
+
if (((_window$ue2 = window.ue) == null ? void 0 : (_window$ue2$sequencew = _window$ue2.sequencewallettransport) == null ? void 0 : _window$ue2$sequencew.onmessagefromsequencejs) === this.onMessageFromUnreal) {
|
|
3374
|
+
delete window.ue.sequencewallettransport.onmessagefromsequencejs;
|
|
3375
|
+
}
|
|
3376
|
+
|
|
3377
|
+
this._registered = false;
|
|
3378
|
+
} // onmessage is called when (the wallet) receives request messages from the dapp
|
|
3379
|
+
// over the unreal json-messaging transport
|
|
3380
|
+
|
|
3381
|
+
|
|
3382
|
+
// sendMessage sends message to the dapp window
|
|
3383
|
+
sendMessage(message) {
|
|
3384
|
+
var _window$ue3, _window$ue3$sequencew;
|
|
3385
|
+
|
|
3386
|
+
if (message.type !== exports.EventType.INIT && this._init !== exports.InitState.OK) {
|
|
3387
|
+
utils.logger.error('impossible state, should not be calling postMessage until inited');
|
|
3388
|
+
return;
|
|
3389
|
+
} // prepare payload
|
|
3390
|
+
|
|
3391
|
+
|
|
3392
|
+
const payload = JSON.stringify(message); // post-message to app.
|
|
3393
|
+
|
|
3394
|
+
(_window$ue3 = window.ue) == null ? void 0 : (_window$ue3$sequencew = _window$ue3.sequencewallettransport) == null ? void 0 : _window$ue3$sequencew.sendmessagetosequencejs(payload);
|
|
3395
|
+
}
|
|
3396
|
+
|
|
3397
|
+
}
|
|
3398
|
+
|
|
3148
3399
|
class WalletUtils {
|
|
3149
3400
|
constructor(walletProvider) {
|
|
3150
3401
|
var _this = this;
|
|
@@ -3250,7 +3501,7 @@ class Wallet {
|
|
|
3250
3501
|
this.providers = void 0;
|
|
3251
3502
|
|
|
3252
3503
|
this.init = () => {
|
|
3253
|
-
var _this$config$transpor, _this$config$transpor2, _this$config$transpor3, _this$config$transpor4, _this$config$transpor5, _this$config$transpor6;
|
|
3504
|
+
var _this$config$transpor, _this$config$transpor2, _this$config$transpor3, _this$config$transpor4, _this$config$transpor5, _this$config$transpor6, _this$config$transpor7, _this$config$transpor8;
|
|
3254
3505
|
|
|
3255
3506
|
if (this.transport.provider) {
|
|
3256
3507
|
// init must have already been called
|
|
@@ -3282,6 +3533,11 @@ class Wallet {
|
|
|
3282
3533
|
// this.transport.messageProvider.add(this.transport.extensionMessageProvider)
|
|
3283
3534
|
}
|
|
3284
3535
|
|
|
3536
|
+
if ((_this$config$transpor7 = this.config.transports) != null && (_this$config$transpor8 = _this$config$transpor7.unrealTransport) != null && _this$config$transpor8.enabled) {
|
|
3537
|
+
this.transport.unrealMessageProvider = new UnrealMessageProvider(this.config.walletAppURL);
|
|
3538
|
+
this.transport.messageProvider.add(this.transport.unrealMessageProvider);
|
|
3539
|
+
}
|
|
3540
|
+
|
|
3285
3541
|
this.transport.messageProvider.register(); // .....
|
|
3286
3542
|
|
|
3287
3543
|
this.transport.allowProvider = network.allowProviderMiddleware(request => {
|
|
@@ -3839,6 +4095,8 @@ exports.ProxyMessageChannel = ProxyMessageChannel;
|
|
|
3839
4095
|
exports.ProxyMessageChannelPort = ProxyMessageChannelPort;
|
|
3840
4096
|
exports.ProxyMessageHandler = ProxyMessageHandler;
|
|
3841
4097
|
exports.ProxyMessageProvider = ProxyMessageProvider;
|
|
4098
|
+
exports.UnrealMessageHandler = UnrealMessageHandler;
|
|
4099
|
+
exports.UnrealMessageProvider = UnrealMessageProvider;
|
|
3842
4100
|
exports.Wallet = Wallet;
|
|
3843
4101
|
exports.WalletRequestHandler = WalletRequestHandler;
|
|
3844
4102
|
exports.Web3Provider = Web3Provider;
|
|
@@ -3141,6 +3141,257 @@ class BaseInjectedTransport extends EventEmitter2 {
|
|
|
3141
3141
|
|
|
3142
3142
|
}
|
|
3143
3143
|
|
|
3144
|
+
/**
|
|
3145
|
+
* This will redirect console logs from Sequence.js & the wallet to the Unreal console, for debugging purposes.
|
|
3146
|
+
*/
|
|
3147
|
+
function overrideLogs(side) {
|
|
3148
|
+
var _window$ue;
|
|
3149
|
+
|
|
3150
|
+
if ((_window$ue = window.ue) != null && _window$ue.sequencewallettransport && !window.logsOverriddenForUnreal) {
|
|
3151
|
+
var _window$ue2;
|
|
3152
|
+
|
|
3153
|
+
const t = (_window$ue2 = window.ue) == null ? void 0 : _window$ue2.sequencewallettransport;
|
|
3154
|
+
|
|
3155
|
+
console.log = (...args) => {
|
|
3156
|
+
t.logfromjs(`${side}: ${stringify(args)}`);
|
|
3157
|
+
};
|
|
3158
|
+
|
|
3159
|
+
console.warn = (...args) => {
|
|
3160
|
+
t.warnfromjs(`${side}: ${stringify(args)}`);
|
|
3161
|
+
};
|
|
3162
|
+
|
|
3163
|
+
console.error = (...args) => {
|
|
3164
|
+
t.errorfromjs(`${side}: ${stringify(args)}`);
|
|
3165
|
+
};
|
|
3166
|
+
|
|
3167
|
+
window.logsOverriddenForUnreal = true;
|
|
3168
|
+
}
|
|
3169
|
+
}
|
|
3170
|
+
|
|
3171
|
+
function stringify(things) {
|
|
3172
|
+
return things.map(a => typeof a === 'object' ? a instanceof Error ? a.message : JSON.stringify(a) : String(a)).join(' ');
|
|
3173
|
+
}
|
|
3174
|
+
|
|
3175
|
+
let registeredUnrealMessageProvider; // all lowercase is an annoying limitation of Unreal CEF BindUObject
|
|
3176
|
+
|
|
3177
|
+
/**
|
|
3178
|
+
* Initialized on dApp side
|
|
3179
|
+
*/
|
|
3180
|
+
class UnrealMessageProvider extends BaseProviderTransport {
|
|
3181
|
+
constructor(walletAppURL) {
|
|
3182
|
+
super();
|
|
3183
|
+
this.walletURL = void 0;
|
|
3184
|
+
|
|
3185
|
+
this.register = () => {
|
|
3186
|
+
var _window$ue;
|
|
3187
|
+
|
|
3188
|
+
overrideLogs('dapp');
|
|
3189
|
+
|
|
3190
|
+
if (registeredUnrealMessageProvider) {
|
|
3191
|
+
// overriding the registered message provider
|
|
3192
|
+
registeredUnrealMessageProvider.unregister();
|
|
3193
|
+
registeredUnrealMessageProvider = this;
|
|
3194
|
+
} // listen for incoming messages from wallet
|
|
3195
|
+
|
|
3196
|
+
|
|
3197
|
+
if ((_window$ue = window.ue) != null && _window$ue.sequencewallettransport) {
|
|
3198
|
+
window.ue.sequencewallettransport.onmessagefromwallet = this.onUnrealCallback;
|
|
3199
|
+
}
|
|
3200
|
+
|
|
3201
|
+
registeredUnrealMessageProvider = this;
|
|
3202
|
+
this._registered = true;
|
|
3203
|
+
console.log('registering transport!');
|
|
3204
|
+
};
|
|
3205
|
+
|
|
3206
|
+
this.unregister = () => {
|
|
3207
|
+
var _window$ue2, _window$ue2$sequencew;
|
|
3208
|
+
|
|
3209
|
+
this._registered = false;
|
|
3210
|
+
this.closeWallet(); // disable message listener
|
|
3211
|
+
|
|
3212
|
+
if (registeredUnrealMessageProvider === this) {
|
|
3213
|
+
registeredUnrealMessageProvider = undefined;
|
|
3214
|
+
}
|
|
3215
|
+
|
|
3216
|
+
if (((_window$ue2 = window.ue) == null ? void 0 : (_window$ue2$sequencew = _window$ue2.sequencewallettransport) == null ? void 0 : _window$ue2$sequencew.onmessagefromwallet) === this.onUnrealCallback) {
|
|
3217
|
+
delete window.ue.sequencewallettransport.onmessagefromwallet;
|
|
3218
|
+
} // clear event listeners
|
|
3219
|
+
|
|
3220
|
+
|
|
3221
|
+
this.events.removeAllListeners();
|
|
3222
|
+
};
|
|
3223
|
+
|
|
3224
|
+
this.openWallet = (path, intent, networkId) => {
|
|
3225
|
+
if (this.isOpened()) {
|
|
3226
|
+
// TODO focus wallet
|
|
3227
|
+
console.log('wallet already open!');
|
|
3228
|
+
return;
|
|
3229
|
+
}
|
|
3230
|
+
|
|
3231
|
+
console.log('opening wallet!'); // Instantiate new walletURL for this call
|
|
3232
|
+
|
|
3233
|
+
const walletURL = new URL(this.walletURL.href);
|
|
3234
|
+
const windowSessionParams = new WindowSessionParams();
|
|
3235
|
+
|
|
3236
|
+
if (path) {
|
|
3237
|
+
walletURL.pathname = path.toLowerCase();
|
|
3238
|
+
} // Set session, intent and network id on walletURL
|
|
3239
|
+
|
|
3240
|
+
|
|
3241
|
+
this._init = InitState.NIL;
|
|
3242
|
+
this._sessionId = `${performance.now()}`;
|
|
3243
|
+
windowSessionParams.set('sid', this._sessionId);
|
|
3244
|
+
|
|
3245
|
+
if (intent) {
|
|
3246
|
+
// encode intent as base64 url-encoded param
|
|
3247
|
+
windowSessionParams.set('intent', base64EncodeObject(intent));
|
|
3248
|
+
}
|
|
3249
|
+
|
|
3250
|
+
if (networkId) {
|
|
3251
|
+
windowSessionParams.set('net', `${networkId}`);
|
|
3252
|
+
} // serialize params
|
|
3253
|
+
|
|
3254
|
+
|
|
3255
|
+
walletURL.search = windowSessionParams.toString();
|
|
3256
|
+
console.log('opening wallet to', walletURL.href);
|
|
3257
|
+
window.open(walletURL.href);
|
|
3258
|
+
};
|
|
3259
|
+
|
|
3260
|
+
this.onUnrealCallback = message => {
|
|
3261
|
+
if (!message) {
|
|
3262
|
+
throw new Error('ProviderMessage object is empty');
|
|
3263
|
+
} // handle message with base message provider
|
|
3264
|
+
|
|
3265
|
+
|
|
3266
|
+
this.handleMessage(message);
|
|
3267
|
+
};
|
|
3268
|
+
|
|
3269
|
+
this.walletURL = new URL(walletAppURL);
|
|
3270
|
+
}
|
|
3271
|
+
|
|
3272
|
+
closeWallet() {
|
|
3273
|
+
this.close();
|
|
3274
|
+
} // onmessage, receives ProviderMessageResponse from the wallet unreal transport
|
|
3275
|
+
|
|
3276
|
+
|
|
3277
|
+
// all lowercase is an annoying limitation of Unreal CEF BindUObject
|
|
3278
|
+
sendMessage(message) {
|
|
3279
|
+
var _window$ue3, _window$ue3$sequencew;
|
|
3280
|
+
|
|
3281
|
+
const postedMessage = typeof message !== 'string' ? JSON.stringify(message) : message;
|
|
3282
|
+
console.log('Sending message to wallet:', postedMessage);
|
|
3283
|
+
(_window$ue3 = window.ue) == null ? void 0 : (_window$ue3$sequencew = _window$ue3.sequencewallettransport) == null ? void 0 : _window$ue3$sequencew.sendmessagetowallet(postedMessage);
|
|
3284
|
+
}
|
|
3285
|
+
|
|
3286
|
+
}
|
|
3287
|
+
|
|
3288
|
+
/**
|
|
3289
|
+
* Initialized on Wallet side
|
|
3290
|
+
*/
|
|
3291
|
+
class UnrealMessageHandler extends BaseWalletTransport {
|
|
3292
|
+
constructor(walletRequestHandler) {
|
|
3293
|
+
super(walletRequestHandler);
|
|
3294
|
+
|
|
3295
|
+
this.onMessageFromUnreal = request => {
|
|
3296
|
+
// Wallet always expects json-rpc request messages from a dapp
|
|
3297
|
+
logger.debug('RECEIVED MESSAGE', request); // Handle message via the base transport
|
|
3298
|
+
|
|
3299
|
+
this.handleMessage(request);
|
|
3300
|
+
};
|
|
3301
|
+
|
|
3302
|
+
this.getUnrealTransportSession = windowParams => {
|
|
3303
|
+
const params = new WindowSessionParams(windowParams);
|
|
3304
|
+
return {
|
|
3305
|
+
sessionId: params.get('sid'),
|
|
3306
|
+
networkId: params.get('net'),
|
|
3307
|
+
intent: base64DecodeObject(params.get('intent'))
|
|
3308
|
+
};
|
|
3309
|
+
};
|
|
3310
|
+
|
|
3311
|
+
this._init = InitState.NIL;
|
|
3312
|
+
}
|
|
3313
|
+
|
|
3314
|
+
async register(windowHref) {
|
|
3315
|
+
var _window$ue;
|
|
3316
|
+
|
|
3317
|
+
if (((_window$ue = window.ue) == null ? void 0 : _window$ue.sequencewallettransport) === undefined) {
|
|
3318
|
+
return;
|
|
3319
|
+
}
|
|
3320
|
+
|
|
3321
|
+
overrideLogs('wallet'); // record open details (sessionId + default network) from the window url
|
|
3322
|
+
|
|
3323
|
+
const {
|
|
3324
|
+
search: rawParams
|
|
3325
|
+
} = new URL(windowHref || window.location.href);
|
|
3326
|
+
let session = this.getUnrealTransportSession(rawParams); // provider should always include sid when opening a new window
|
|
3327
|
+
|
|
3328
|
+
const isNewWindowSession = !!session.sessionId; // attempt to restore previous session in the case of a redirect or window reload
|
|
3329
|
+
|
|
3330
|
+
if (!isNewWindowSession) {
|
|
3331
|
+
session = await this.getCachedTransportSession();
|
|
3332
|
+
}
|
|
3333
|
+
|
|
3334
|
+
if (!session) {
|
|
3335
|
+
logger.error('unreal session is undefined');
|
|
3336
|
+
return;
|
|
3337
|
+
} // listen for window-transport requests
|
|
3338
|
+
|
|
3339
|
+
|
|
3340
|
+
window.ue.sequencewallettransport.onmessagefromsequencejs = this.onMessageFromUnreal;
|
|
3341
|
+
this._registered = true; // send open event to the app which opened us
|
|
3342
|
+
|
|
3343
|
+
this.open(session).then(opened => {
|
|
3344
|
+
if (!opened) {
|
|
3345
|
+
var _session;
|
|
3346
|
+
|
|
3347
|
+
const err = `failed to open to network ${(_session = session) == null ? void 0 : _session.networkId}`;
|
|
3348
|
+
logger.error(err);
|
|
3349
|
+
this.notifyClose({
|
|
3350
|
+
message: err
|
|
3351
|
+
});
|
|
3352
|
+
window.close();
|
|
3353
|
+
}
|
|
3354
|
+
}).catch(e => {
|
|
3355
|
+
var _session2;
|
|
3356
|
+
|
|
3357
|
+
const err = `failed to open to network ${(_session2 = session) == null ? void 0 : _session2.networkId}, due to: ${e}`;
|
|
3358
|
+
logger.error(err);
|
|
3359
|
+
this.notifyClose({
|
|
3360
|
+
message: err
|
|
3361
|
+
});
|
|
3362
|
+
window.close();
|
|
3363
|
+
});
|
|
3364
|
+
}
|
|
3365
|
+
|
|
3366
|
+
unregister() {
|
|
3367
|
+
var _window$ue2, _window$ue2$sequencew;
|
|
3368
|
+
|
|
3369
|
+
if (((_window$ue2 = window.ue) == null ? void 0 : (_window$ue2$sequencew = _window$ue2.sequencewallettransport) == null ? void 0 : _window$ue2$sequencew.onmessagefromsequencejs) === this.onMessageFromUnreal) {
|
|
3370
|
+
delete window.ue.sequencewallettransport.onmessagefromsequencejs;
|
|
3371
|
+
}
|
|
3372
|
+
|
|
3373
|
+
this._registered = false;
|
|
3374
|
+
} // onmessage is called when (the wallet) receives request messages from the dapp
|
|
3375
|
+
// over the unreal json-messaging transport
|
|
3376
|
+
|
|
3377
|
+
|
|
3378
|
+
// sendMessage sends message to the dapp window
|
|
3379
|
+
sendMessage(message) {
|
|
3380
|
+
var _window$ue3, _window$ue3$sequencew;
|
|
3381
|
+
|
|
3382
|
+
if (message.type !== EventType.INIT && this._init !== InitState.OK) {
|
|
3383
|
+
logger.error('impossible state, should not be calling postMessage until inited');
|
|
3384
|
+
return;
|
|
3385
|
+
} // prepare payload
|
|
3386
|
+
|
|
3387
|
+
|
|
3388
|
+
const payload = JSON.stringify(message); // post-message to app.
|
|
3389
|
+
|
|
3390
|
+
(_window$ue3 = window.ue) == null ? void 0 : (_window$ue3$sequencew = _window$ue3.sequencewallettransport) == null ? void 0 : _window$ue3$sequencew.sendmessagetosequencejs(payload);
|
|
3391
|
+
}
|
|
3392
|
+
|
|
3393
|
+
}
|
|
3394
|
+
|
|
3144
3395
|
class WalletUtils {
|
|
3145
3396
|
constructor(walletProvider) {
|
|
3146
3397
|
var _this = this;
|
|
@@ -3246,7 +3497,7 @@ class Wallet {
|
|
|
3246
3497
|
this.providers = void 0;
|
|
3247
3498
|
|
|
3248
3499
|
this.init = () => {
|
|
3249
|
-
var _this$config$transpor, _this$config$transpor2, _this$config$transpor3, _this$config$transpor4, _this$config$transpor5, _this$config$transpor6;
|
|
3500
|
+
var _this$config$transpor, _this$config$transpor2, _this$config$transpor3, _this$config$transpor4, _this$config$transpor5, _this$config$transpor6, _this$config$transpor7, _this$config$transpor8;
|
|
3250
3501
|
|
|
3251
3502
|
if (this.transport.provider) {
|
|
3252
3503
|
// init must have already been called
|
|
@@ -3278,6 +3529,11 @@ class Wallet {
|
|
|
3278
3529
|
// this.transport.messageProvider.add(this.transport.extensionMessageProvider)
|
|
3279
3530
|
}
|
|
3280
3531
|
|
|
3532
|
+
if ((_this$config$transpor7 = this.config.transports) != null && (_this$config$transpor8 = _this$config$transpor7.unrealTransport) != null && _this$config$transpor8.enabled) {
|
|
3533
|
+
this.transport.unrealMessageProvider = new UnrealMessageProvider(this.config.walletAppURL);
|
|
3534
|
+
this.transport.messageProvider.add(this.transport.unrealMessageProvider);
|
|
3535
|
+
}
|
|
3536
|
+
|
|
3281
3537
|
this.transport.messageProvider.register(); // .....
|
|
3282
3538
|
|
|
3283
3539
|
this.transport.allowProvider = allowProviderMiddleware(request => {
|
|
@@ -3817,4 +4073,4 @@ const getWallet = () => {
|
|
|
3817
4073
|
return walletInstance;
|
|
3818
4074
|
};
|
|
3819
4075
|
|
|
3820
|
-
export { BaseInjectedTransport, BaseProviderTransport, BaseWalletTransport, CHANNEL_ID, DefaultProviderConfig, ErrSignedInRequired, EventType, ExtensionMessageHandler, ExtensionMessageProvider, InitState, LocalStorage, LocalStore, LocalWeb3Provider, MuxMessageProvider, OpenState, PROVIDER_OPEN_TIMEOUT, ProviderError, ProxyMessageChannel, ProxyMessageChannelPort, ProxyMessageHandler, ProxyMessageProvider, Wallet, WalletRequestHandler, Web3Provider, Web3Signer, WindowMessageHandler, WindowMessageProvider, WindowSessionParams, getWallet, initWallet, isBrowserExtension, isSequenceProvider, isValidMessageSignature, isValidSignature, isValidTypedDataSignature, isWalletUpToDate, messageToBytes, nextMessageIdx, prefixEIP191Message, recoverWalletConfig };
|
|
4076
|
+
export { BaseInjectedTransport, BaseProviderTransport, BaseWalletTransport, CHANNEL_ID, DefaultProviderConfig, ErrSignedInRequired, EventType, ExtensionMessageHandler, ExtensionMessageProvider, InitState, LocalStorage, LocalStore, LocalWeb3Provider, MuxMessageProvider, OpenState, PROVIDER_OPEN_TIMEOUT, ProviderError, ProxyMessageChannel, ProxyMessageChannelPort, ProxyMessageHandler, ProxyMessageProvider, UnrealMessageHandler, UnrealMessageProvider, Wallet, WalletRequestHandler, Web3Provider, Web3Signer, WindowMessageHandler, WindowMessageProvider, WindowSessionParams, getWallet, initWallet, isBrowserExtension, isSequenceProvider, isValidMessageSignature, isValidSignature, isValidTypedDataSignature, isWalletUpToDate, messageToBytes, nextMessageIdx, prefixEIP191Message, recoverWalletConfig };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ProviderMessage } from '../../types';
|
|
2
|
+
import { WalletRequestHandler } from '../wallet-request-handler';
|
|
3
|
+
import { BaseWalletTransport } from '../base-wallet-transport';
|
|
4
|
+
/**
|
|
5
|
+
* Initialized on Wallet side
|
|
6
|
+
*/
|
|
7
|
+
export declare class UnrealMessageHandler extends BaseWalletTransport {
|
|
8
|
+
constructor(walletRequestHandler: WalletRequestHandler);
|
|
9
|
+
register(windowHref?: string | URL): Promise<void>;
|
|
10
|
+
unregister(): void;
|
|
11
|
+
private onMessageFromUnreal;
|
|
12
|
+
sendMessage(message: ProviderMessage<any>): void;
|
|
13
|
+
private getUnrealTransportSession;
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { OpenWalletIntent, ProviderMessage } from '../../types';
|
|
2
|
+
import { BaseProviderTransport } from '../base-provider-transport';
|
|
3
|
+
/**
|
|
4
|
+
* Initialized on dApp side
|
|
5
|
+
*/
|
|
6
|
+
export declare class UnrealMessageProvider extends BaseProviderTransport {
|
|
7
|
+
private walletURL;
|
|
8
|
+
constructor(walletAppURL: string);
|
|
9
|
+
register: () => void;
|
|
10
|
+
unregister: () => void;
|
|
11
|
+
openWallet: (path?: string | undefined, intent?: OpenWalletIntent | undefined, networkId?: string | number | undefined) => void;
|
|
12
|
+
closeWallet(): void;
|
|
13
|
+
private onUnrealCallback;
|
|
14
|
+
sendMessage(message: ProviderMessage<unknown>): void;
|
|
15
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@0xsequence/provider",
|
|
3
|
-
"version": "0.40.
|
|
3
|
+
"version": "0.40.4",
|
|
4
4
|
"description": "provider sub-package for Sequence",
|
|
5
5
|
"repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/provider",
|
|
6
6
|
"source": "src/index.ts",
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
"typecheck": "tsc --noEmit"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@0xsequence/abi": "^0.40.
|
|
17
|
-
"@0xsequence/auth": "^0.40.
|
|
18
|
-
"@0xsequence/config": "^0.40.
|
|
19
|
-
"@0xsequence/network": "^0.40.
|
|
20
|
-
"@0xsequence/transactions": "^0.40.
|
|
21
|
-
"@0xsequence/utils": "^0.40.
|
|
22
|
-
"@0xsequence/wallet": "^0.40.
|
|
16
|
+
"@0xsequence/abi": "^0.40.4",
|
|
17
|
+
"@0xsequence/auth": "^0.40.4",
|
|
18
|
+
"@0xsequence/config": "^0.40.4",
|
|
19
|
+
"@0xsequence/network": "^0.40.4",
|
|
20
|
+
"@0xsequence/transactions": "^0.40.4",
|
|
21
|
+
"@0xsequence/utils": "^0.40.4",
|
|
22
|
+
"@0xsequence/wallet": "^0.40.4",
|
|
23
23
|
"@ethersproject/abstract-signer": "^5.5.0",
|
|
24
24
|
"@ethersproject/hash": "^5.5.0",
|
|
25
25
|
"@ethersproject/providers": "^5.5.1",
|
package/src/transports/index.ts
CHANGED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
interface UnrealInjectedWindow {
|
|
2
|
+
ue?: {
|
|
3
|
+
sequencewallettransport?: {
|
|
4
|
+
logfromjs: (message: string) => void
|
|
5
|
+
warnfromjs: (message: string) => void
|
|
6
|
+
errorfromjs: (message: string) => void
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
logsOverriddenForUnreal?: boolean
|
|
10
|
+
}
|
|
11
|
+
declare const window: Window & typeof globalThis & UnrealInjectedWindow
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* This will redirect console logs from Sequence.js & the wallet to the Unreal console, for debugging purposes.
|
|
15
|
+
*/
|
|
16
|
+
export function overrideLogs(side: 'dapp' | 'wallet') {
|
|
17
|
+
if (window.ue?.sequencewallettransport && !window.logsOverriddenForUnreal) {
|
|
18
|
+
const t = window.ue?.sequencewallettransport
|
|
19
|
+
console.log = (...args: unknown[]) => {
|
|
20
|
+
t.logfromjs(`${side}: ${stringify(args)}`)
|
|
21
|
+
}
|
|
22
|
+
console.warn = (...args: unknown[]) => {
|
|
23
|
+
t.warnfromjs(`${side}: ${stringify(args)}`)
|
|
24
|
+
}
|
|
25
|
+
console.error = (...args: unknown[]) => {
|
|
26
|
+
t.errorfromjs(`${side}: ${stringify(args)}`)
|
|
27
|
+
}
|
|
28
|
+
window.logsOverriddenForUnreal = true
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function stringify(things: unknown[]): string {
|
|
33
|
+
return things
|
|
34
|
+
.map(a => (typeof a === 'object' ? (a instanceof Error ? a.message : JSON.stringify(a)) : String(a)))
|
|
35
|
+
.join(' ')
|
|
36
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ProviderMessageRequest,
|
|
3
|
+
ProviderMessage,
|
|
4
|
+
EventType,
|
|
5
|
+
InitState,
|
|
6
|
+
WindowSessionParams,
|
|
7
|
+
OpenWalletIntent,
|
|
8
|
+
ProviderRpcError,
|
|
9
|
+
TransportSession
|
|
10
|
+
} from '../../types'
|
|
11
|
+
import { WalletRequestHandler } from '../wallet-request-handler'
|
|
12
|
+
import { BaseWalletTransport } from '../base-wallet-transport'
|
|
13
|
+
import { logger, base64DecodeObject } from '@0xsequence/utils'
|
|
14
|
+
import { overrideLogs } from './overridelogs'
|
|
15
|
+
|
|
16
|
+
// all lowercase is an annoying limitation of Unreal CEF BindUObject
|
|
17
|
+
interface UnrealInjectedWalletWindow {
|
|
18
|
+
ue?: {
|
|
19
|
+
sequencewallettransport?: {
|
|
20
|
+
onmessagefromsequencejs?: (message: ProviderMessageRequest) => void
|
|
21
|
+
sendmessagetosequencejs: (message: string) => void
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
declare const window: Window & typeof globalThis & UnrealInjectedWalletWindow
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Initialized on Wallet side
|
|
29
|
+
*/
|
|
30
|
+
export class UnrealMessageHandler extends BaseWalletTransport {
|
|
31
|
+
constructor(walletRequestHandler: WalletRequestHandler) {
|
|
32
|
+
super(walletRequestHandler)
|
|
33
|
+
this._init = InitState.NIL
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async register(windowHref?: string | URL) {
|
|
37
|
+
if (window.ue?.sequencewallettransport === undefined) {
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
overrideLogs('wallet')
|
|
41
|
+
|
|
42
|
+
// record open details (sessionId + default network) from the window url
|
|
43
|
+
const { search: rawParams } = new URL(windowHref || window.location.href)
|
|
44
|
+
|
|
45
|
+
let session: TransportSession | null = this.getUnrealTransportSession(rawParams)
|
|
46
|
+
|
|
47
|
+
// provider should always include sid when opening a new window
|
|
48
|
+
const isNewWindowSession = !!session.sessionId
|
|
49
|
+
|
|
50
|
+
// attempt to restore previous session in the case of a redirect or window reload
|
|
51
|
+
if (!isNewWindowSession) {
|
|
52
|
+
session = await this.getCachedTransportSession()
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (!session) {
|
|
56
|
+
logger.error('unreal session is undefined')
|
|
57
|
+
return
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// listen for window-transport requests
|
|
61
|
+
window.ue.sequencewallettransport.onmessagefromsequencejs = this.onMessageFromUnreal
|
|
62
|
+
this._registered = true
|
|
63
|
+
|
|
64
|
+
// send open event to the app which opened us
|
|
65
|
+
this.open(session)
|
|
66
|
+
.then(opened => {
|
|
67
|
+
if (!opened) {
|
|
68
|
+
const err = `failed to open to network ${session?.networkId}`
|
|
69
|
+
logger.error(err)
|
|
70
|
+
this.notifyClose({ message: err } as ProviderRpcError)
|
|
71
|
+
window.close()
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
.catch(e => {
|
|
75
|
+
const err = `failed to open to network ${session?.networkId}, due to: ${e}`
|
|
76
|
+
logger.error(err)
|
|
77
|
+
this.notifyClose({ message: err } as ProviderRpcError)
|
|
78
|
+
window.close()
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
unregister() {
|
|
83
|
+
if (window.ue?.sequencewallettransport?.onmessagefromsequencejs === this.onMessageFromUnreal) {
|
|
84
|
+
delete window.ue.sequencewallettransport.onmessagefromsequencejs
|
|
85
|
+
}
|
|
86
|
+
this._registered = false
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// onmessage is called when (the wallet) receives request messages from the dapp
|
|
90
|
+
// over the unreal json-messaging transport
|
|
91
|
+
private onMessageFromUnreal = (request: ProviderMessageRequest) => {
|
|
92
|
+
// Wallet always expects json-rpc request messages from a dapp
|
|
93
|
+
|
|
94
|
+
logger.debug('RECEIVED MESSAGE', request)
|
|
95
|
+
|
|
96
|
+
// Handle message via the base transport
|
|
97
|
+
this.handleMessage(request)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// sendMessage sends message to the dapp window
|
|
101
|
+
sendMessage(message: ProviderMessage<any>) {
|
|
102
|
+
if (message.type !== EventType.INIT && this._init !== InitState.OK) {
|
|
103
|
+
logger.error('impossible state, should not be calling postMessage until inited')
|
|
104
|
+
return
|
|
105
|
+
}
|
|
106
|
+
// prepare payload
|
|
107
|
+
const payload = JSON.stringify(message)
|
|
108
|
+
|
|
109
|
+
// post-message to app.
|
|
110
|
+
window.ue?.sequencewallettransport?.sendmessagetosequencejs(payload)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private getUnrealTransportSession = (windowParams: string | undefined): TransportSession => {
|
|
114
|
+
const params = new WindowSessionParams(windowParams)
|
|
115
|
+
return {
|
|
116
|
+
sessionId: params.get('sid'),
|
|
117
|
+
networkId: params.get('net'),
|
|
118
|
+
intent: base64DecodeObject<OpenWalletIntent>(params.get('intent'))
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { OpenWalletIntent, ProviderMessage, InitState, WindowSessionParams } from '../../types'
|
|
2
|
+
import { BaseProviderTransport } from '../base-provider-transport'
|
|
3
|
+
import { base64EncodeObject } from '@0xsequence/utils'
|
|
4
|
+
import { overrideLogs } from './overridelogs'
|
|
5
|
+
|
|
6
|
+
let registeredUnrealMessageProvider: UnrealMessageProvider | undefined
|
|
7
|
+
|
|
8
|
+
// all lowercase is an annoying limitation of Unreal CEF BindUObject
|
|
9
|
+
interface UnrealInjectedSequenceJSWindow {
|
|
10
|
+
ue?: {
|
|
11
|
+
sequencewallettransport?: {
|
|
12
|
+
onmessagefromwallet?: (message: ProviderMessage<any>) => void
|
|
13
|
+
sendmessagetowallet: (message: string) => void
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
declare const window: Window & typeof globalThis & UnrealInjectedSequenceJSWindow
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Initialized on dApp side
|
|
22
|
+
*/
|
|
23
|
+
export class UnrealMessageProvider extends BaseProviderTransport {
|
|
24
|
+
private walletURL: URL
|
|
25
|
+
|
|
26
|
+
constructor(walletAppURL: string) {
|
|
27
|
+
super()
|
|
28
|
+
this.walletURL = new URL(walletAppURL)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
register = () => {
|
|
32
|
+
overrideLogs('dapp')
|
|
33
|
+
if (registeredUnrealMessageProvider) {
|
|
34
|
+
// overriding the registered message provider
|
|
35
|
+
registeredUnrealMessageProvider.unregister()
|
|
36
|
+
registeredUnrealMessageProvider = this
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// listen for incoming messages from wallet
|
|
40
|
+
if (window.ue?.sequencewallettransport) {
|
|
41
|
+
window.ue.sequencewallettransport.onmessagefromwallet = this.onUnrealCallback
|
|
42
|
+
}
|
|
43
|
+
registeredUnrealMessageProvider = this
|
|
44
|
+
|
|
45
|
+
this._registered = true
|
|
46
|
+
console.log('registering transport!')
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
unregister = () => {
|
|
50
|
+
this._registered = false
|
|
51
|
+
this.closeWallet()
|
|
52
|
+
|
|
53
|
+
// disable message listener
|
|
54
|
+
if (registeredUnrealMessageProvider === this) {
|
|
55
|
+
registeredUnrealMessageProvider = undefined
|
|
56
|
+
}
|
|
57
|
+
if (window.ue?.sequencewallettransport?.onmessagefromwallet === this.onUnrealCallback) {
|
|
58
|
+
delete window.ue.sequencewallettransport.onmessagefromwallet
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// clear event listeners
|
|
62
|
+
this.events.removeAllListeners()
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
openWallet = (path?: string, intent?: OpenWalletIntent, networkId?: string | number): void => {
|
|
66
|
+
if (this.isOpened()) {
|
|
67
|
+
// TODO focus wallet
|
|
68
|
+
console.log('wallet already open!')
|
|
69
|
+
return
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
console.log('opening wallet!')
|
|
73
|
+
// Instantiate new walletURL for this call
|
|
74
|
+
const walletURL = new URL(this.walletURL.href)
|
|
75
|
+
const windowSessionParams = new WindowSessionParams()
|
|
76
|
+
|
|
77
|
+
if (path) {
|
|
78
|
+
walletURL.pathname = path.toLowerCase()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Set session, intent and network id on walletURL
|
|
82
|
+
this._init = InitState.NIL
|
|
83
|
+
this._sessionId = `${performance.now()}`
|
|
84
|
+
windowSessionParams.set('sid', this._sessionId)
|
|
85
|
+
|
|
86
|
+
if (intent) {
|
|
87
|
+
// encode intent as base64 url-encoded param
|
|
88
|
+
windowSessionParams.set('intent', base64EncodeObject(intent))
|
|
89
|
+
}
|
|
90
|
+
if (networkId) {
|
|
91
|
+
windowSessionParams.set('net', `${networkId}`)
|
|
92
|
+
}
|
|
93
|
+
// serialize params
|
|
94
|
+
walletURL.search = windowSessionParams.toString()
|
|
95
|
+
|
|
96
|
+
console.log('opening wallet to', walletURL.href)
|
|
97
|
+
|
|
98
|
+
window.open(walletURL.href)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
closeWallet() {
|
|
102
|
+
this.close()
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// onmessage, receives ProviderMessageResponse from the wallet unreal transport
|
|
106
|
+
private onUnrealCallback = (message: ProviderMessage<any>) => {
|
|
107
|
+
if (!message) {
|
|
108
|
+
throw new Error('ProviderMessage object is empty')
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// handle message with base message provider
|
|
112
|
+
this.handleMessage(message)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// all lowercase is an annoying limitation of Unreal CEF BindUObject
|
|
116
|
+
sendMessage(message: ProviderMessage<unknown>) {
|
|
117
|
+
const postedMessage = typeof message !== 'string' ? JSON.stringify(message) : message
|
|
118
|
+
console.log('Sending message to wallet:', postedMessage)
|
|
119
|
+
window.ue?.sequencewallettransport?.sendmessagetowallet(postedMessage)
|
|
120
|
+
}
|
|
121
|
+
}
|
package/src/wallet.ts
CHANGED
|
@@ -19,9 +19,15 @@ import {
|
|
|
19
19
|
} from '@0xsequence/network'
|
|
20
20
|
import { WalletConfig, WalletState } from '@0xsequence/config'
|
|
21
21
|
import { logger } from '@0xsequence/utils'
|
|
22
|
-
import { JsonRpcProvider
|
|
22
|
+
import { JsonRpcProvider } from '@ethersproject/providers'
|
|
23
23
|
import { Web3Provider, Web3Signer } from './provider'
|
|
24
|
-
import {
|
|
24
|
+
import {
|
|
25
|
+
MuxMessageProvider,
|
|
26
|
+
WindowMessageProvider,
|
|
27
|
+
ProxyMessageProvider,
|
|
28
|
+
ProxyMessageChannelPort,
|
|
29
|
+
UnrealMessageProvider
|
|
30
|
+
} from './transports'
|
|
25
31
|
import { WalletSession, ProviderEventTypes, ConnectOptions, OpenWalletIntent, ConnectDetails } from './types'
|
|
26
32
|
import { ethers } from 'ethers'
|
|
27
33
|
import { ExtensionMessageProvider } from './transports/extension-transport/extension-message-provider'
|
|
@@ -36,12 +42,12 @@ export interface WalletProvider {
|
|
|
36
42
|
|
|
37
43
|
isConnected(): boolean
|
|
38
44
|
getSession(): WalletSession | undefined
|
|
39
|
-
|
|
45
|
+
|
|
40
46
|
getAddress(): Promise<string>
|
|
41
47
|
getNetworks(chainId?: ChainIdLike): Promise<NetworkConfig[]>
|
|
42
48
|
getChainId(): Promise<number>
|
|
43
49
|
getAuthChainId(): Promise<number>
|
|
44
|
-
|
|
50
|
+
|
|
45
51
|
isOpened(): boolean
|
|
46
52
|
openWallet(path?: string, intent?: OpenWalletIntent, networkId?: string | number): Promise<boolean>
|
|
47
53
|
closeWallet(): void
|
|
@@ -85,6 +91,7 @@ export class Wallet implements WalletProvider {
|
|
|
85
91
|
windowMessageProvider?: WindowMessageProvider
|
|
86
92
|
proxyMessageProvider?: ProxyMessageProvider
|
|
87
93
|
extensionMessageProvider?: ExtensionMessageProvider
|
|
94
|
+
unrealMessageProvider?: UnrealMessageProvider
|
|
88
95
|
}
|
|
89
96
|
|
|
90
97
|
private networks: NetworkConfig[]
|
|
@@ -147,6 +154,10 @@ export class Wallet implements WalletProvider {
|
|
|
147
154
|
//
|
|
148
155
|
// this.transport.messageProvider.add(this.transport.extensionMessageProvider)
|
|
149
156
|
}
|
|
157
|
+
if (this.config.transports?.unrealTransport?.enabled) {
|
|
158
|
+
this.transport.unrealMessageProvider = new UnrealMessageProvider(this.config.walletAppURL)
|
|
159
|
+
this.transport.messageProvider.add(this.transport.unrealMessageProvider)
|
|
160
|
+
}
|
|
150
161
|
this.transport.messageProvider.register()
|
|
151
162
|
|
|
152
163
|
// .....
|
|
@@ -692,6 +703,11 @@ export interface ProviderConfig {
|
|
|
692
703
|
enabled: boolean
|
|
693
704
|
runtime: Runtime.Static
|
|
694
705
|
}
|
|
706
|
+
|
|
707
|
+
// Unreal Engine transport (optional)
|
|
708
|
+
unrealTransport?: {
|
|
709
|
+
enabled: boolean
|
|
710
|
+
}
|
|
695
711
|
}
|
|
696
712
|
|
|
697
713
|
// Sequence Wallet Modules Context override. By default (and recommended), the
|