Browse Source

feat(lnd): implement initial communication with lnd

feat/auto-update
jamaljsr 5 years ago
parent
commit
88dc6de3b0
  1. 3
      .gitignore
  2. 15
      electron/index.ts
  3. 59
      electron/lnd/lndProxy.ts
  4. 5
      electron/tsconfig.json
  5. 28
      electron/types.ts
  6. 3
      package.json
  7. 32
      src/lib/ipc/ipcService.ts
  8. 1
      src/lib/lnd/index.ts
  9. 36
      src/lib/lnd/lndService.ts
  10. 2
      src/store/index.ts
  11. 18
      src/store/models/bitcoind.ts
  12. 6
      src/types/index.ts
  13. 4
      src/utils/tests.tsx
  14. 266
      yarn.lock

3
.gitignore

@ -74,8 +74,7 @@ typings/
/dist
# compiled by tsc from /src/electron/
/public/main.js
/public/main.js.map
/public/main
# misc
.DS_Store

15
electron/main.ts → electron/index.ts

@ -1,11 +1,12 @@
import { app, BrowserWindow } from 'electron';
import debug from 'electron-debug';
import { app, BrowserWindow, ipcMain } from 'electron';
import electronDebug from 'electron-debug';
import isNotPackaged from 'electron-is-dev';
import { warn } from 'electron-log';
import { debug } from 'electron-log';
import path from 'path';
import { initLndProxy } from './lnd/lndProxy';
const isDev = isNotPackaged && process.env.NODE_ENV !== 'production';
warn(`Starting Electron main process`);
debug(`Starting Electron main process`);
let mainWindow: BrowserWindow | null;
@ -23,7 +24,7 @@ const installExtensions = async () => {
return Promise.all(
extensions.map(name => installer.default(installer[name], forceDownload)),
).catch(console.log);
).catch(debug);
};
const createWindow = async () => {
@ -39,7 +40,7 @@ const createWindow = async () => {
mainWindow.loadURL(url);
if (isDev) {
debug();
electronDebug();
await installExtensions();
mainWindow.webContents.openDevTools();
mainWindow.maximize();
@ -61,3 +62,5 @@ app.on('activate', () => {
createWindow();
}
});
initLndProxy(ipcMain);

59
electron/lnd/lndProxy.ts

@ -0,0 +1,59 @@
import { IpcMain } from 'electron';
import { debug } from 'electron-log';
import createLndRpc, { LnRpc, LnRpcClientConfig } from '@radar/lnrpc';
import { LNDNode } from '../types';
const nodes: {
[key: string]: LnRpc;
} = {};
const connect = async (args: {
node: LNDNode;
config: LnRpcClientConfig;
}): Promise<any> => {
nodes[args.node.name] = await createLndRpc(args.config);
return { success: true };
};
const getInfo = async (args: { name: string }): Promise<any> => {
return await nodes[args.name].getInfo();
};
/**
* A mapping of IPC channel names to the functions to execute when
* messages are recieved
*/
const listeners: {
[key: string]: (...args: any) => Promise<any>;
} = {
connect,
'get-info': getInfo,
};
/**
* Sets up the IPC listeners for the main process and maps them to async
* functions.
* @param ipc the IPC onject of the main process
*/
export const initLndProxy = (ipc: IpcMain) => {
debug('LndProxy: init');
Object.entries(listeners).forEach(([channel, func]) => {
const reqChan = `lnd-${channel}-request`;
const resChan = `lnd-${channel}-response`;
debug(`listening for ipc command "${channel}"`);
ipc.on(reqChan, async (event, ...args) => {
debug(`LndProxy: received request "${reqChan}"`, ...args);
try {
const result = await func(...args);
if (result) {
debug(`LndProxy: send response "${resChan}"`, result);
event.reply(resChan, result);
}
} catch (err) {
debug(`LndProxy: send error "${resChan}"`, err);
event.reply(resChan, { err: err.message });
}
});
});
};

5
electron/tsconfig.json

@ -8,9 +8,8 @@
"strict": true,
"module": "commonjs",
"moduleResolution": "node",
"outDir": "../public/",
"pretty": true,
"sourceMap": true
"outDir": "../public/main",
"pretty": true
},
"include": ["."]
}

28
electron/types.ts

@ -0,0 +1,28 @@
export enum Status {
Starting,
Started,
Stopping,
Stopped,
Error,
}
export interface CommonNode {
id: number;
name: string;
type: 'bitcoin' | 'lightning';
version: string;
status: Status;
}
export interface LightningNode extends CommonNode {
type: 'lightning';
implementation: 'LND' | 'c-lightning' | 'eclair';
backendName: string;
}
export interface LNDNode extends LightningNode {
ports: {
rest: number;
grpc: number;
};
}

3
package.json

@ -8,7 +8,7 @@
"email": "contact@lightningpolar.com",
"url": "https://lightningpolar.com"
},
"main": "public/main.js",
"main": "public/main/index.js",
"scripts": {
"build": "cross-env PUBLIC_URL=./ rescripts build",
"cm": "git add . && git cz",
@ -38,6 +38,7 @@
"tsc": "tsc --noEmit"
},
"dependencies": {
"@radar/lnrpc": "^0.7.1-beta",
"docker-compose": "^0.22.2",
"dockerode": "^3.0.1",
"electron-debug": "^3.0.1",

32
src/lib/ipc/ipcService.ts

@ -0,0 +1,32 @@
import { ipcRenderer, IpcRendererEvent } from 'electron';
import { debug } from 'electron-log';
export type IcpSender = <T>(channel: string, payload?: any) => Promise<T>;
/**
* A wrapper function to create an async function which sends messages over IPC and
* returns the response via a promise
* @param serviceName the name of of the channel that will be displayed in logs
* @param prefix the prefix to use in the ipc messages
*/
export const createIpcSender = (serviceName: string, prefix: string) => {
const send: IcpSender = (channel, payload) => {
const reqChan = `${prefix}-${channel}-request`;
const resChan = `${prefix}-${channel}-response`;
return new Promise((resolve, reject) => {
ipcRenderer.once(resChan, (event: IpcRendererEvent, args: any) => {
debug(`${serviceName}: receive response "${resChan}"`, args);
if (args.err) {
reject(new Error(args.err));
} else {
resolve(args);
}
});
debug(`${serviceName}: send request "${reqChan}"`, payload);
ipcRenderer.send(reqChan, payload);
});
};
return send;
};

1
src/lib/lnd/index.ts

@ -0,0 +1 @@
export { default as lndService } from './lndService';

36
src/lib/lnd/lndService.ts

@ -0,0 +1,36 @@
import { join } from 'path';
import { createIpcSender, IcpSender } from 'lib/ipc/ipcService';
import { LndLibrary, LNDNode } from 'types';
class LndService implements LndLibrary {
ipc: IcpSender;
constructor() {
this.ipc = createIpcSender('LndService', 'lnd');
}
async connect(node: LNDNode): Promise<void> {
const macAppPath = join('/', 'Users', 'jamal', 'Library', 'Application Support');
const dataPath = join(process.env['APPDATA'] || macAppPath, 'polar', 'data');
const adminMacaroonPath = join(
'data',
'chain',
'bitcoin',
'regtest',
'admin.macaroon',
);
const nodePath = join(dataPath, 'networks', '1', 'volumes', 'lnd', node.name);
const config = {
server: `127.0.0.1:${node.ports.grpc}`,
tls: join(nodePath, 'tls.cert'),
macaroonPath: join(nodePath, adminMacaroonPath),
};
await this.ipc('connect', { node, config });
}
async getInfo(node: LNDNode): Promise<void> {
await this.ipc('get-info', { name: node.name });
}
}
export default new LndService();

2
src/store/index.ts

@ -4,6 +4,7 @@ import { createHashHistory, History } from 'history';
import { createLogger } from 'redux-logger';
import { bitcoindService } from 'lib/bitcoin';
import { dockerService } from 'lib/docker';
import { lndService } from 'lib/lnd';
import { createModel, RootModel } from 'store/models';
import { StoreInjections } from 'types';
@ -49,6 +50,7 @@ export const createReduxStore = (options?: {
const injections: StoreInjections = {
dockerService,
bitcoindService,
lndService,
};
const store = createReduxStore({ injections });

18
src/store/models/bitcoind.ts

@ -1,6 +1,6 @@
import { ChainInfo, WalletInfo } from 'bitcoin-core';
import { Action, action, Thunk, thunk } from 'easy-peasy';
import { BitcoinNode, StoreInjections } from 'types';
import { BitcoinNode, LNDNode, Status, StoreInjections } from 'types';
export interface BitcoindModel {
chainInfo: ChainInfo | undefined;
@ -25,6 +25,22 @@ const bitcoindModel: BitcoindModel = {
await injections.bitcoindService.getBlockchainInfo(node.ports.rpc),
);
actions.setWalletinfo(await injections.bitcoindService.getWalletInfo(node.ports.rpc));
const lnd: LNDNode = {
id: 1,
name: 'polar-n1-lnd-1',
type: 'lightning',
implementation: 'LND',
version: '0.7.1-beta',
status: Status.Stopped,
backendName: 'bitcoind1',
ports: {
rest: 8081,
grpc: 10001,
},
};
await injections.lndService.connect(lnd);
await injections.lndService.getInfo(lnd);
}),
mine: thunk(async (actions, { blocks, node }, { injections }) => {
if (blocks < 0) {

6
src/types/index.ts

@ -71,7 +71,13 @@ export interface BitcoindLibrary {
mine: (numBlocks: number, port?: number) => Promise<string[]>;
}
export interface LndLibrary {
connect: (node: LNDNode) => Promise<void>;
getInfo: (node: LNDNode) => Promise<void>;
}
export interface StoreInjections {
dockerService: DockerLibrary;
bitcoindService: BitcoindLibrary;
lndService: LndLibrary;
}

4
src/utils/tests.tsx

@ -71,6 +71,10 @@ export const injections: StoreInjections = {
getWalletInfo: jest.fn(),
mine: jest.fn(),
},
lndService: {
connect: jest.fn(),
getInfo: jest.fn(),
},
};
/**

266
yarn.lock

@ -1421,6 +1421,14 @@
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.4.tgz#622a72bebd1e3f48d921563b4b60a762295a81fc"
integrity sha512-6PYY5DVdAY1ifaQW6XYTnOMihmBVT27elqSjEoodchsGjzYlEsTQMcEhSud99kVawatyTZRTiVkJ/c6lwbQ7nA==
"@grpc/proto-loader@^0.4.0":
version "0.4.0"
resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.4.0.tgz#a823a51eb2fde58369bef1deb5445fd808d70901"
integrity sha512-Jm6o+75uWT7E6+lt8edg4J1F/9+BedOjaMgwE14pxS/AO43/0ZqK+rCLVVrXLoExwSAZvgvOD2B0ivy3Spsspw==
dependencies:
lodash.camelcase "^4.3.0"
protobufjs "^6.8.6"
"@hapi/address@2.x.x":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.0.0.tgz#9f05469c88cb2fd3dcd624776b54ee95c312126a"
@ -1719,6 +1727,70 @@
"@nodelib/fs.scandir" "2.1.1"
fastq "^1.6.0"
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78=
"@protobufjs/base64@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==
"@protobufjs/codegen@^2.0.4":
version "2.0.4"
resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==
"@protobufjs/eventemitter@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A=
"@protobufjs/fetch@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=
dependencies:
"@protobufjs/aspromise" "^1.1.1"
"@protobufjs/inquire" "^1.1.0"
"@protobufjs/float@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=
"@protobufjs/inquire@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=
"@protobufjs/path@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=
"@protobufjs/pool@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=
"@protobufjs/utf8@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
"@radar/lnrpc@^0.7.1-beta":
version "0.7.1-beta"
resolved "https://registry.yarnpkg.com/@radar/lnrpc/-/lnrpc-0.7.1-beta.tgz#17673c61f5470fd17e8ac885076c688211852050"
integrity sha512-luWqG5Rjc7qA/7mU/Njgt+gED83KPsMcKR58vNs2qpBfjQ9uE7oYLvl8h4SV8yPBQex+OUVkHFsBH8PT8Icumw==
dependencies:
"@grpc/proto-loader" "^0.4.0"
"@types/google-protobuf" "^3.2.7"
grpc "^1.19.0"
pkg-dir "^2.0.0"
ts-protoc-gen "^0.8.0"
"@rescripts/cli@^0.0.12":
version "0.0.12"
resolved "https://registry.yarnpkg.com/@rescripts/cli/-/cli-0.0.12.tgz#c78581624e8d568efa03943aa858e2add88a1102"
@ -1938,6 +2010,14 @@
dependencies:
"@babel/types" "^7.3.0"
"@types/bytebuffer@^5.0.40":
version "5.0.40"
resolved "https://registry.yarnpkg.com/@types/bytebuffer/-/bytebuffer-5.0.40.tgz#d6faac40dcfb09cd856cdc4c01d3690ba536d3ee"
integrity sha512-h48dyzZrPMz25K6Q4+NCwWaxwXany2FhQg/ErOcdZS1ZpsaDnDMZg8JYLMTGz7uvXKrcKGJUZJlZObyfgdaN9g==
dependencies:
"@types/long" "*"
"@types/node" "*"
"@types/debug@^4.1.4":
version "4.1.4"
resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.4.tgz#56eec47706f0fd0b7c694eae2f3172e6b0b769da"
@ -1986,6 +2066,11 @@
"@types/minimatch" "*"
"@types/node" "*"
"@types/google-protobuf@^3.2.7":
version "3.7.1"
resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.7.1.tgz#69503856e717a4ed2fd0216d4aa3f0bebf5df5df"
integrity sha512-kiLxbqoi2C7NmkGj1ZpkSDyIqj4vqDEIjx7wX+O0GXV6bLX6u/oLz49CwefD0c0vzaKeBdOqmUtI8bC0bBRr0w==
"@types/history@*":
version "4.7.2"
resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.2.tgz#0e670ea254d559241b6eeb3894f8754991e73220"
@ -2046,6 +2131,11 @@
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.136.tgz#413e85089046b865d960c9ff1d400e04c31ab60f"
integrity sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA==
"@types/long@*", "@types/long@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef"
integrity sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==
"@types/minimatch@*":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
@ -2061,6 +2151,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.8.tgz#cb1bf6800238898bc2ff6ffa5702c3cadd350708"
integrity sha512-FMdVn84tJJdV+xe+53sYiZS4R5yn1mAIxfj+DVoNiQjTYz1+OYmjwEZr1ev9nU0axXwda0QDbYl06QHanRVH3A==
"@types/node@^10.1.0":
version "10.14.18"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.18.tgz#b7d45fc950e6ffd7edc685e890d13aa7b8535dce"
integrity sha512-ryO3Q3++yZC/+b8j8BdKd/dn9JlzlHBPdm80656xwYUdmPkpTGTjkAdt6BByiNupGPE8w0FhBgvYy/fX9hRNGQ==
"@types/node@^10.12.18", "@types/node@^10.12.19":
version "10.14.13"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.13.tgz#ac786d623860adf39a3f51d629480aacd6a6eec7"
@ -3051,6 +3146,14 @@ asar@^2.0.1:
mkdirp "^0.5.1"
tmp-promise "^1.0.5"
ascli@~1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ascli/-/ascli-1.0.1.tgz#bcfa5974a62f18e81cabaeb49732ab4a88f906bc"
integrity sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=
dependencies:
colour "~0.7.1"
optjs "~3.2.2"
asn1.js@^4.0.0:
version "4.10.1"
resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
@ -4389,6 +4492,13 @@ bunyan@^1.8.1:
mv "~2"
safe-json-stringify "~1"
bytebuffer@~5:
version "5.0.1"
resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd"
integrity sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=
dependencies:
long "~3"
bytes@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
@ -4526,7 +4636,7 @@ camelcase@5.0.0, camelcase@^5.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42"
integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==
camelcase@^2.0.0:
camelcase@^2.0.0, camelcase@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
@ -4799,6 +4909,15 @@ cli-width@^2.0.0:
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
cliui@^3.0.3:
version "3.2.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
dependencies:
string-width "^1.0.1"
strip-ansi "^3.0.1"
wrap-ansi "^2.0.0"
cliui@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
@ -4968,6 +5087,11 @@ colors@~1.1.2:
resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM=
colour@~0.7.1:
version "0.7.1"
resolved "https://registry.yarnpkg.com/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778"
integrity sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.7"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
@ -6011,7 +6135,7 @@ decamelize-keys@^1.0.0:
decamelize "^1.1.0"
map-obj "^1.0.0"
decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0:
decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
@ -8290,6 +8414,11 @@ gonzales-pe@^4.2.4:
dependencies:
minimist "1.1.x"
google-protobuf@^3.6.1:
version "3.9.1"
resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.9.1.tgz#87e6a16b7fb16405b515a6c6622d5ace45578d86"
integrity sha512-tkz7SVwBktFbqFK3teXFUY/VM57+mbUgV9bSD+sZH1ocHJ7uk7BfEWMRdU24dd0ciUDokreA7ghH2fYFIczQdw==
got@^9.6.0:
version "9.6.0"
resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
@ -8334,6 +8463,18 @@ growly@^1.3.0:
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=
grpc@^1.19.0:
version "1.23.3"
resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.23.3.tgz#30a013ca2cd7e350b0ffc0034be5380ddef3ae7f"
integrity sha512-7vdzxPw9s5UYch4aUn4hyM5tMaouaxUUkwkgJlwbR4AXMxiYZJOv19N2ps2eKiuUbJovo5fnGF9hg/X91gWYjw==
dependencies:
"@types/bytebuffer" "^5.0.40"
lodash.camelcase "^4.3.0"
lodash.clone "^4.5.0"
nan "^2.13.2"
node-pre-gyp "^0.13.0"
protobufjs "^5.0.3"
gud@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
@ -9096,6 +9237,11 @@ invariant@^2.2.2, invariant@^2.2.4:
dependencies:
loose-envify "^1.0.0"
invert-kv@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
invert-kv@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
@ -10515,6 +10661,13 @@ lazystream@^1.0.0:
dependencies:
readable-stream "^2.0.5"
lcid@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
dependencies:
invert-kv "^1.0.0"
lcid@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
@ -10748,6 +10901,16 @@ lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0:
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
lodash.clone@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=
lodash.debounce@^4.0.0, lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
@ -10890,6 +11053,16 @@ loglevel@^1.4.1:
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"
integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=
long@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
long@~3:
version "3.2.0"
resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b"
integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=
longest-streak@^2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.3.tgz#3de7a3f47ee18e9074ded8575b5c091f5d0a4105"
@ -11515,7 +11688,7 @@ mv@~2:
ncp "~2.0.0"
rimraf "~2.4.0"
nan@^2.12.1, nan@^2.14.0:
nan@^2.12.1, nan@^2.13.2, nan@^2.14.0:
version "2.14.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
@ -11712,6 +11885,22 @@ node-pre-gyp@^0.12.0:
semver "^5.3.0"
tar "^4"
node-pre-gyp@^0.13.0:
version "0.13.0"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz#df9ab7b68dd6498137717838e4f92a33fc9daa42"
integrity sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==
dependencies:
detect-libc "^1.0.2"
mkdirp "^0.5.1"
needle "^2.2.1"
nopt "^4.0.1"
npm-packlist "^1.1.6"
npmlog "^4.0.2"
rc "^1.2.7"
rimraf "^2.6.1"
semver "^5.3.0"
tar "^4"
node-releases@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.2.tgz#27c296d9fca3b659c64f7d43ea47a31ad2a90e4b"
@ -12100,6 +12289,11 @@ optionator@^0.8.1, optionator@^0.8.2:
type-check "~0.3.2"
wordwrap "~1.0.0"
optjs@~3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/optjs/-/optjs-3.2.2.tgz#69a6ce89c442a44403141ad2f9b370bd5bb6f4ee"
integrity sha1-aabOicRCpEQDFBrS+bNwvVu29O4=
ordered-read-streams@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e"
@ -12129,6 +12323,13 @@ os-homedir@^1.0.0:
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
os-locale@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
dependencies:
lcid "^1.0.0"
os-locale@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620"
@ -13543,6 +13744,35 @@ prop-types@^15.6.2:
loose-envify "^1.3.1"
object-assign "^4.1.1"
protobufjs@^5.0.3:
version "5.0.3"
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-5.0.3.tgz#e4dfe9fb67c90b2630d15868249bcc4961467a17"
integrity sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==
dependencies:
ascli "~1"
bytebuffer "~5"
glob "^7.0.5"
yargs "^3.10.0"
protobufjs@^6.8.6:
version "6.8.8"
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c"
integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==
dependencies:
"@protobufjs/aspromise" "^1.1.2"
"@protobufjs/base64" "^1.1.2"
"@protobufjs/codegen" "^2.0.4"
"@protobufjs/eventemitter" "^1.1.0"
"@protobufjs/fetch" "^1.1.0"
"@protobufjs/float" "^1.0.2"
"@protobufjs/inquire" "^1.1.0"
"@protobufjs/path" "^1.1.2"
"@protobufjs/pool" "^1.1.0"
"@protobufjs/utf8" "^1.1.0"
"@types/long" "^4.0.0"
"@types/node" "^10.1.0"
long "^4.0.0"
proxy-addr@~2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
@ -17117,6 +17347,13 @@ ts-pnp@^1.1.2:
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.2.tgz#be8e4bfce5d00f0f58e0666a82260c34a57af552"
integrity sha512-f5Knjh7XCyRIzoC/z1Su1yLLRrPrFCgtUAh/9fCSP6NKbATwpOL1+idQVXQokK9GRFURn/jYPGPfegIctwunoA==
ts-protoc-gen@^0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/ts-protoc-gen/-/ts-protoc-gen-0.8.0.tgz#2a9a31ee8a4d4760c484f1d0c7199633afaa5e3e"
integrity sha512-LUFM4Jy3qMSVyRf5ql973cJjltS98MiCz8kPf1Rc9AC9BeLu0WJfoHLf0Tvx2cGH0jSK9BpA0o1tHQQfjeO47Q==
dependencies:
google-protobuf "^3.6.1"
ts-toolbelt@^3.8.0:
version "3.8.1"
resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-3.8.1.tgz#2f37d367e2d9755180faa743c0dc69bd7cab02f5"
@ -17928,6 +18165,11 @@ widest-line@^2.0.0:
dependencies:
string-width "^2.1.1"
window-size@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876"
integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=
word-wrap@^1.0.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
@ -18212,6 +18454,11 @@ xtend@~2.1.1:
dependencies:
object-keys "~0.4.0"
y18n@^3.2.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
@ -18302,6 +18549,19 @@ yargs@^12.0.5:
y18n "^3.2.1 || ^4.0.0"
yargs-parser "^11.1.1"
yargs@^3.10.0:
version "3.32.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"
integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=
dependencies:
camelcase "^2.0.1"
cliui "^3.0.3"
decamelize "^1.1.1"
os-locale "^1.4.0"
string-width "^1.0.1"
window-size "^0.1.4"
y18n "^3.2.0"
yauzl@2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"

Loading…
Cancel
Save