-
Notifications
You must be signed in to change notification settings - Fork 542
/
service.ts
64 lines (57 loc) · 1.79 KB
/
service.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { ControllerMessenger } from '@metamask/base-controller';
import { JsonRpcEngine } from 'json-rpc-engine';
import { createEngineStream } from 'json-rpc-middleware-stream';
import pump from 'pump';
import { Duplex } from 'stream';
import { ErrorMessageEvent, setupMultiplex } from '../services';
import { MOCK_BLOCK_NUMBER } from './execution-environment';
export const createService = <
Service extends new (...args: any[]) => InstanceType<Service>,
>(
// eslint-disable-next-line @typescript-eslint/naming-convention
ServiceClass: Service,
options?: Omit<
ConstructorParameters<Service>[0],
'messenger' | 'setupSnapProvider'
>,
) => {
const controllerMessenger = new ControllerMessenger<
never,
ErrorMessageEvent
>();
const messenger = controllerMessenger.getRestricted<
'ExecutionService',
never,
ErrorMessageEvent['type']
>({
name: 'ExecutionService',
});
const service = new ServiceClass({
messenger,
setupSnapProvider: (_snapId: string, rpcStream: Duplex) => {
const mux = setupMultiplex(rpcStream, 'foo');
const stream = mux.createStream('metamask-provider');
const engine = new JsonRpcEngine();
engine.push((req, res, next, end) => {
if (req.method === 'metamask_getProviderState') {
res.result = {
isUnlocked: false,
accounts: [],
chainId: '0x1',
networkVersion: '1',
};
return end();
}
if (req.method === 'eth_blockNumber') {
res.result = MOCK_BLOCK_NUMBER;
return end();
}
return next();
});
const providerStream = createEngineStream({ engine });
pump(stream, providerStream, stream);
},
...options,
});
return { service, messenger, controllerMessenger };
};