From 4edf6c1a7f47a90bf215a73dfb49e0d97b4afa01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=BCbleitner?= Date: Thu, 1 Aug 2019 16:56:53 +0200 Subject: [PATCH] help prs, why do i get ENOENT on second downloadFile in downloadPlugin? --- .gitignore | 2 +- backendsrc/FrontblockAdmin.ts | 68 ++-------- backendsrc/PluginManager.ts | 136 +++++++++++++++++++ package-lock.json | 243 ++++++++++++++++++++++++++++++++-- package.json | 13 +- 5 files changed, 388 insertions(+), 74 deletions(-) create mode 100644 backendsrc/PluginManager.ts diff --git a/.gitignore b/.gitignore index 691639c..c83c91d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ node_modules lib static kfs -plugin \ No newline at end of file +plugins \ No newline at end of file diff --git a/backendsrc/FrontblockAdmin.ts b/backendsrc/FrontblockAdmin.ts index 2d5ac56..f3a1967 100644 --- a/backendsrc/FrontblockAdmin.ts +++ b/backendsrc/FrontblockAdmin.ts @@ -3,46 +3,26 @@ import * as Logger from 'log4js' import { Plugin, socketioRPC } from 'frontblock-generic/Plugin'; import { ErrorResponse, SuccessResponse } from 'frontblock-generic/Types'; +import { PluginManager } from './PluginManager' import express = require('express'); import http = require('http'); -import fs = require('fs'); import bsock = require('bsock'); -import fetch = require("node-fetch"); + const kfs = require("key-file-storage").default('kfs') -type pluginEntry = - { - pluginName:string - } - -const pluginList:pluginEntry[] = - [ - //{ pluginName: 'apiclient' }, - //{ pluginName: 'paymentmanager' }, - //{ pluginName: 'wallet' }, - { pluginName: 'htmlsupplier' } - ] - -type releaseEntry = - { - tagName: string, - staticZipURL: URL, - checksumFileURL: URL - } - Logger.configure({ appenders: { - "admin": { type: 'stdout' }, + "frontblock-admin": { type: 'stdout' }, //app: { type: 'file', filename: 'application.log' } }, categories: { - default: { appenders: [ 'admin' ], level: 'debug' } + default: { appenders: [ 'frontblock-admin' ], level: 'debug' } } }) -const logger = Logger.getLogger("admin") +const logger = Logger.getLogger("frontblock-admin") type hookRPC = { @@ -80,58 +60,28 @@ export type rpcInfo = * The list of available plugins is published via the frontblock API and downloaded via gitea-releases */ export class FrontblockAdmin{ - private plugins: Plugin[] - + private plugins: Plugin[] = [] private hookToUids:{[hookName:string]:string[]} = {} - private express private httpServer private io = bsock.createServer() private wsServer = http.createServer() + private pm: PluginManager constructor(){ if(!('admin.conf' in kfs)){ logger.info('Generating ./kfs/admin.conf') kfs['admin.conf'] = { httpPort: 8080 } } + this.pm = new PluginManager() this.initialize() } private async initialize(){ - const wat = await this.fetchReleaseList('htmlsupplier') - logger.debug(wat) - //await this.downloadPlugins() - //this.plugins.forEach(plugin => plugin.start()) //this.startWebsocket() //this.startWebserver() } - private async fetchReleaseList(pluginName:string): Promise{ - const res = await fetch('https://gitea.frontblock.me/api/v1/repos/fb-vendor/' + pluginName + '/releases') - const json = await res.json(); - const releaseList:releaseEntry[] = [] - - json.forEach((release) => { - const tagName = release.tag_name - const staticZipURL = release.assets.filter(asset => asset.name === pluginName + '.zip')[0].browser_download_url - const checksumFileURL = release.assets.filter(asset => asset.name === 'md5sum.txt')[0].browser_download_url - releaseList.push({tagName,staticZipURL,checksumFileURL}) - }) - return releaseList - } - - private async downloadPlugin(release:releaseEntry) { - } - - private async verifyPlugin(release:releaseEntry) { - } - - private async extractPlugin(release:releaseEntry) { - } - - private async installPlugin(release:releaseEntry) { - } - private initApis(socket){ //Declare own functions const rpcInfos:rpcInfo[] = [ @@ -234,7 +184,7 @@ export class FrontblockAdmin{ private restartWebserver(port:number){ this.stopWebserver() - kfs.FrontblockAdmin = { httpPort: port } + kfs['admin.conf'] = { httpPort: port } this.startWebserver() } diff --git a/backendsrc/PluginManager.ts b/backendsrc/PluginManager.ts new file mode 100644 index 0000000..5efca0c --- /dev/null +++ b/backendsrc/PluginManager.ts @@ -0,0 +1,136 @@ +'use strict' + +import * as Logger from 'log4js'; +import fetch = require('node-fetch'); +import fs = require('fs'); +import path = require('path') +import unzip = require('unzip') + +Logger.configure({ + appenders: + { + "plugin-manager": { type: 'stdout' }, + //app: { type: 'file', filename: 'application.log' } + }, + categories: + { + default: { appenders: [ 'plugin-manager' ], level: 'debug' } + } +}) +const logger = Logger.getLogger("plugin-manager") + + +export class PluginManager{ + + private installDir: string + private cacheDir: string + private loadedPlugins: string[] + + constructor(installDir: string = './plugins'){ + this.installDir = installDir + this.cacheDir = path.join(installDir, '.cache') + this.initialize() + } + + private initialize() { + logger.info('Initializing manager') + + try { + fs.access(this.cacheDir, async err => { + if (err && err.code === 'ENOENT') { + await fs.promises.mkdir(this.cacheDir, {recursive: true}) + logger.info('Manager installed to ' + this.installDir) + } else { + logger.info('Manager already installed at ' + this.installDir) + } + }) + } catch (error) { + logger.error(error) + } + } + + public async getAvailablePlugins(): Promise { + return [ + 'apiclient', + 'paymentmanager', + 'wallet', + 'htmlsupplier' + ] + } + + public async getInstalledPlugins(): Promise { + try { + const installed = await fs.promises.readdir(this.installDir) + return installed.filter( entry => entry[0] != '.') + } catch (error) { + logger.error(error) + return + } + } + + public async getLoadedPlugins(): Promise { + return this.loadedPlugins + } + + private async downloadFile(url: URL, dest: string) { + try { + fs.access(path.dirname(dest), err => { + if (err && err.code === 'ENOENT') { + fs.mkdirSync(path.dirname(dest), {recursive: true}) + } + }) + + const file = fs.createWriteStream(dest) + file.on('error', err => {throw new Error(err)}) + const response = await fetch(url) + if (!response.ok) throw new Error(response.statusText) + response.body.pipe(file) + } catch (error) { + logger.error(error) + await fs.promises.unlink(dest) + } + } + + private async downloadPlugin(pluginName: string) { + try { + const response = await fetch('https://gitea.frontblock.me/api/v1/repos/fb-vendor/' + pluginName + '/releases') + if (!response.ok) throw new Error(response.statusText) + + const releases = await response.json() + if (!releases || !releases.length) throw new Error('Empty response') + + const latest = releases[0] + const version = latest.tag_name + const archiveURL = latest.assets.filter(asset => asset.name === pluginName + '.zip')[0].browser_download_url + const checksumURL = latest.assets.filter(asset => asset.name === 'md5sum.txt')[0].browser_download_url + if (!version || ! archiveURL || !checksumURL) throw new Error('Malformed response') + + await this.downloadFile(archiveURL, path.join(this.cacheDir, pluginName, version, 'plugin.zip')) + await this.downloadFile(checksumURL, path.join(this.cacheDir, pluginName, version, 'md5sum.txt')) + + } catch (error) { + logger.error(error) + } + } + + public async installPlugin(pluginName: string) { + try { + await this.downloadPlugin(pluginName) + } catch (error) { + logger.debug(error) + } + } + + public uninstallPlugin(pluginName: string) { + + } + + + public async loadPlugin() { + + } + + public async unloadPlugin() { + + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index fa39d5f..5317c05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -386,7 +386,8 @@ "@types/angular": { "version": "1.6.55", "resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.6.55.tgz", - "integrity": "sha512-jpQ5K6t76thd9Ook5x4Xj9K462hMje6/Q84SFxglBmaW8HOLblVnALpvg6w6aV3Oe6o9jWXnYH8gHHKrfSRxNQ==" + "integrity": "sha512-jpQ5K6t76thd9Ook5x4Xj9K462hMje6/Q84SFxglBmaW8HOLblVnALpvg6w6aV3Oe6o9jWXnYH8gHHKrfSRxNQ==", + "dev": true }, "@types/babel__core": { "version": "7.1.2", @@ -433,6 +434,7 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", + "dev": true, "requires": { "@types/connect": "*", "@types/node": "*" @@ -442,6 +444,7 @@ "version": "3.4.32", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "dev": true, "requires": { "@types/node": "*" } @@ -450,6 +453,7 @@ "version": "4.17.0", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.0.tgz", "integrity": "sha512-CjaMu57cjgjuZbh9DpkloeGxV45CnMGlVd+XpG7Gm9QgVrd7KFq+X4HY0vM+2v0bczS48Wg7bvnMY5TN+Xmcfw==", + "dev": true, "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "*", @@ -460,6 +464,7 @@ "version": "4.16.7", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.7.tgz", "integrity": "sha512-847KvL8Q1y3TtFLRTXcVakErLJQgdpFSaq+k043xefz9raEf0C7HalpSY7OW5PyjCnY8P7bPW5t/Co9qqp+USg==", + "dev": true, "requires": { "@types/node": "*", "@types/range-parser": "*" @@ -521,7 +526,8 @@ "@types/mime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", - "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" + "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", + "dev": true }, "@types/node": { "version": "11.13.18", @@ -537,12 +543,20 @@ "@types/range-parser": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/semver": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.0.1.tgz", + "integrity": "sha512-ffCdcrEE5h8DqVxinQjo+2d1q+FV5z7iNtPofw3JsrltSoSVlOGaW0rY8XxtO9XukdTn8TaCGWmk2VFGhI70mg==", + "dev": true }, "@types/serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", + "dev": true, "requires": { "@types/express-serve-static-core": "*", "@types/mime": "*" @@ -557,7 +571,8 @@ "@types/webpack-env": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.14.0.tgz", - "integrity": "sha512-Fv+0gYJzE/czLoRKq+gnXWr4yBpPM3tO3C8pDLFwqVKlMICQUq5OsxwwFZYDaVr7+L6mgNDp16iOcJHEz3J5RQ==" + "integrity": "sha512-Fv+0gYJzE/czLoRKq+gnXWr4yBpPM3tO3C8pDLFwqVKlMICQUq5OsxwwFZYDaVr7+L6mgNDp16iOcJHEz3J5RQ==", + "dev": true }, "@types/yargs": { "version": "12.0.12", @@ -1262,6 +1277,15 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -1528,6 +1552,11 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -1688,6 +1717,14 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2057,8 +2094,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "5.2.1", @@ -3159,6 +3195,11 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, + "fast-extend": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fast-extend/-/fast-extend-0.0.2.tgz", + "integrity": "sha1-9exCz0C5Rg9SGmOH37Ut7u1nHb0=" + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -3401,6 +3442,11 @@ } } }, + "fs-monkey": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-0.3.3.tgz", + "integrity": "sha512-FNUvuTAJ3CqCQb5ELn+qCbGR/Zllhf2HtwsdAtBi59s1WeCjKMT81fHcSu7dwIskqGVK+MmOrb7VOBlq3/SItw==" + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -5943,6 +5989,38 @@ "object-visit": "^1.0.0" } }, + "match-stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", + "integrity": "sha1-mesFAJOzTf+t5CG5rAtBCpz6F88=", + "requires": { + "buffers": "~0.1.1", + "readable-stream": "~1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -5976,6 +6054,15 @@ "p-is-promise": "^2.0.0" } }, + "memfs": { + "version": "2.15.5", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-2.15.5.tgz", + "integrity": "sha512-x8v6Uok7FRuPt8RNXnIk3HzSFB2kaJtoT6ztpfIxxURjBPPsu4eKA+ZDLQ5GdV8+Lx71+vdMaBzHxy51vLQ7dw==", + "requires": { + "fast-extend": "0.0.2", + "fs-monkey": "^0.3.3" + } + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -6320,6 +6407,11 @@ "to-regex": "^3.0.1" } }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6841,6 +6933,11 @@ "os-tmpdir": "^1.0.0" } }, + "over": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", + "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg=" + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -7823,6 +7920,40 @@ "safe-buffer": "^5.1.2" } }, + "pullstream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", + "integrity": "sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ=", + "requires": { + "over": ">= 0.0.5 < 1", + "readable-stream": "~1.0.31", + "setimmediate": ">= 1.0.2 < 2", + "slice-stream": ">= 1.0.0 < 2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -8285,7 +8416,6 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -8711,8 +8841,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { "version": "1.1.1", @@ -8804,6 +8933,37 @@ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, + "slice-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", + "integrity": "sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA=", + "requires": { + "readable-stream": "~1.0.31" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -9178,6 +9338,11 @@ "readable-stream": "^2.0.2" } }, + "stream-buffers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", + "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==" + }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", @@ -9610,6 +9775,11 @@ "punycode": "^2.1.0" } }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -9921,6 +10091,61 @@ } } }, + "unzip": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz", + "integrity": "sha1-iXScY7BY19kNYZ+GuYqhU107l/A=", + "requires": { + "binary": ">= 0.3.0 < 1", + "fstream": ">= 0.1.30 < 1", + "match-stream": ">= 0.0.2 < 1", + "pullstream": ">= 0.4.1 < 1", + "readable-stream": "~1.0.31", + "setimmediate": ">= 1.0.1 < 2" + }, + "dependencies": { + "fstream": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", + "integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=", + "requires": { + "graceful-fs": "~3.0.2", + "inherits": "~2.0.0", + "mkdirp": "0.5", + "rimraf": "2" + } + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "requires": { + "natives": "^1.1.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "upath": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", diff --git a/package.json b/package.json index 26afd43..5b235d8 100644 --- a/package.json +++ b/package.json @@ -15,10 +15,6 @@ "author": "frontblock.me", "license": "ISC", "dependencies": { - "@types/angular": "^1.6.55", - "@types/express": "^4.17.0", - "@types/node": "^11.13.18", - "@types/webpack-env": "^1.14.0", "@uirouter/angularjs": "^1.0.5", "angular": "^1.7.8", "bsert": "0.0.10", @@ -28,10 +24,17 @@ "http": "0.0.0", "key-file-storage": "^2.2.1", "log4js": "^4.4.0", + "memfs": "^2.15.5", "node-fetch": "^2.6.0", - "socket.io": "^2.2.0" + "socket.io": "^2.2.0", + "stream-buffers": "^3.0.2", + "unzip": "^0.1.11" }, "devDependencies": { + "@types/express": "^4.17.0", + "@types/node": "^11.13.18", + "@types/semver": "^6.0.1", + "@types/webpack-env": "^1.14.0", "@types/angular": "^1.6.27", "@types/jest": "^24.0.15", "autoprefixer": "^9.4.7",