PHP WebShell

Текущая директория: /opt/BitGoJS/modules/abstract-lightning/dist/test/unit/lightning

Просмотр файла: lightningUtils.js

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const assert_1 = __importDefault(require("assert"));
const macaroon_1 = require("macaroon");
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const createWatchOnlyFixture_1 = require("./createWatchOnlyFixture");
const lightning_1 = require("../../../src/lightning");
const sdkcore = __importStar(require("@bitgo/sdk-core"));
describe('lightning utils', function () {
    [
        { name: 'lnbtc', networkName: 'bitcoin' },
        { name: 'tlnbtc', networkName: 'testnet' },
    ].forEach(({ name, networkName }) => {
        describe(`success - coin ${name} and network ${networkName}`, function () {
            it(`isValidLightningNetworkName and getLightningNetwork`, function () {
                (0, assert_1.default)((0, lightning_1.isValidLightningNetworkName)(networkName));
                const network = (0, lightning_1.getLightningNetwork)(networkName);
                assert_1.default.strictEqual(network, utxolib.networks[networkName]);
            });
            it(`isValidLightningNetwork`, function () {
                (0, assert_1.default)((0, lightning_1.isValidLightningNetworkName)(networkName));
                (0, assert_1.default)((0, lightning_1.isValidLightningNetwork)(utxolib.networks[networkName]));
            });
            it(`getStaticsLightningNetwork`, function () {
                assert_1.default.strictEqual((0, lightning_1.getStaticsLightningNetwork)(name).family, 'lnbtc');
            });
            it(`getUtxolibNetwork`, function () {
                assert_1.default.strictEqual((0, lightning_1.getUtxolibNetwork)(name), networkName === 'bitcoin' ? utxolib.networks.bitcoin : utxolib.networks.testnet);
            });
            it(`isLightningCoinName`, function () {
                assert_1.default.strictEqual((0, lightning_1.isLightningCoinName)(name), true);
                assert_1.default.strictEqual((0, lightning_1.isLightningCoinName)('ltc'), false);
            });
        });
    });
    it(`isValidLightningNetworkName should return false for non lightning network name`, function () {
        assert_1.default.strictEqual((0, lightning_1.isValidLightningNetworkName)('litecoin'), false);
    });
    it(`isValidLightningNetwork should return false for non lightning network`, function () {
        assert_1.default.strictEqual((0, lightning_1.isValidLightningNetwork)(utxolib.networks['litecoin']), false);
    });
    it(`getUtxolibNetwork should return fail for invalid lightning coin`, function () {
        assert_1.default.throws(() => {
            (0, lightning_1.getUtxolibNetwork)('ltc');
        }, /ltc is not a lightning coin/);
    });
    it(`createWatchOnly`, function () {
        const watchOnly = (0, lightning_1.createWatchOnly)(createWatchOnlyFixture_1.signerRootKey, utxolib.networks.testnet);
        assert_1.default.deepStrictEqual(watchOnly.accounts, createWatchOnlyFixture_1.accounts);
        assert_1.default.strictEqual(watchOnly.master_key_fingerprint, utxolib.bip32.fromBase58(createWatchOnlyFixture_1.signerRootKey, utxolib.networks.testnet).fingerprint.toString('hex'));
    });
    it(`addIPCaveatToMacaroon`, function () {
        const macaroon = 'AgEDbG5kAvgBAwoQMgU7rDi802Yqg/tHll24nhIBMBoWCgdhZGRyZXNzEgRyZWFkEgV3cml0ZRoTCgRpbmZvEgRyZWFkEgV3cml0ZRoXCghpbnZvaWNlcxIEcmVhZBIFd3JpdGUaIQoIbWFjYXJvb24SCGdlbmVyYXRlEgRyZWFkEgV3cml0ZRoWCgdtZXNzYWdlEgRyZWFkEgV3cml0ZRoXCghvZmZjaGFpbhIEcmVhZBIFd3JpdGUaFgoHb25jaGFpbhIEcmVhZBIFd3JpdGUaFAoFcGVlcnMSBHJlYWQSBXdyaXRlGhgKBnNpZ25lchIIZ2VuZXJhdGUSBHJlYWQAAAYgZKiUvEzxGd2QKGUS+9R5ZWevG09S06fMJUnt+k1XXXQ=';
        const macaroonObj = (0, macaroon_1.importMacaroon)(macaroon).exportJSON();
        assert_1.default.strictEqual(macaroonObj.c, undefined);
        const macaroonWithCaveat = (0, lightning_1.addIPCaveatToMacaroon)(macaroon, '127.0.0.1');
        const macaroonObjWithCaveat = (0, macaroon_1.importMacaroon)(macaroonWithCaveat).exportJSON();
        assert_1.default.strictEqual(macaroonObjWithCaveat.c[0].i, 'ipaddr 127.0.0.1');
    });
    it(`deriveLightningServiceSharedSecret`, function () {
        const userAuthXprv = 'xprv9s21ZrQH143K4NPkV8riiTnFf72MRyQDVHMmmpekGF1w5QkS2MfTei9KXYvrZVMop4zQ4arnzSF7TRp3Cy73AWaDdADiYMCi5qpYW1bUa5m';
        const lightningServicePubKey = (0, lightning_1.getStaticsLightningNetwork)('tlnbtc').lightningServicePubKey;
        const expectedSecret = sdkcore.getSharedSecret(utxolib.bip32.fromBase58(userAuthXprv), Buffer.from(lightningServicePubKey, 'hex'));
        const secret = (0, lightning_1.deriveLightningServiceSharedSecret)('tlnbtc', userAuthXprv);
        assert_1.default.deepStrictEqual(secret, expectedSecret);
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGlnaHRuaW5nL2xpZ2h0bmluZ1V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLHVDQUEwQztBQUMxQyx5REFBMkM7QUFFM0MscUVBQW1FO0FBQ25FLHNEQVVnQztBQUVoQyx5REFBMkM7QUFFM0MsUUFBUSxDQUFDLGlCQUFpQixFQUFFO0lBQzFCO1FBQ0UsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUU7UUFDekMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUU7S0FDM0MsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFO1FBQ2xDLFFBQVEsQ0FBQyxrQkFBa0IsSUFBSSxnQkFBZ0IsV0FBVyxFQUFFLEVBQUU7WUFDNUQsRUFBRSxDQUFDLHFEQUFxRCxFQUFFO2dCQUN4RCxJQUFBLGdCQUFNLEVBQUMsSUFBQSx1Q0FBMkIsRUFBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxNQUFNLE9BQU8sR0FBRyxJQUFBLCtCQUFtQixFQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNqRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzdELENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLHlCQUF5QixFQUFFO2dCQUM1QixJQUFBLGdCQUFNLEVBQUMsSUFBQSx1Q0FBMkIsRUFBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxJQUFBLGdCQUFNLEVBQUMsSUFBQSxtQ0FBdUIsRUFBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FB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QUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUN2RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRTtRQUN2QyxNQUFNLFlBQVksR0FDaEIsaUhBQWlILENBQUM7UUFDcEgsTUFBTSxzQkFBc0IsR0FBRyxJQUFBLHNDQUEwQixFQUFDLFFBQVEsQ0FBQyxDQUFDLHNCQUFzQixDQUFDO1FBRTNGLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQzVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUMzQyxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBQSw4Q0FBa0MsRUFBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFMUUsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBpbXBvcnRNYWNhcm9vbiB9IGZyb20gJ21hY2Fyb29uJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcblxuaW1wb3J0IHsgYWNjb3VudHMsIHNpZ25lclJvb3RLZXkgfSBmcm9tICcuL2NyZWF0ZVdhdGNoT25seUZpeHR1cmUnO1xuaW1wb3J0IHtcbiAgaXNWYWxpZExpZ2h0bmluZ05ldHdvcmtOYW1lLFxuICBnZXRMaWdodG5pbmdOZXR3b3JrLFxuICBpc1ZhbGlkTGlnaHRuaW5nTmV0d29yayxcbiAgZ2V0U3RhdGljc0xpZ2h0bmluZ05ldHdvcmssXG4gIGdldFV0eG9saWJOZXR3b3JrLFxuICBpc0xpZ2h0bmluZ0NvaW5OYW1lLFxuICBjcmVhdGVXYXRjaE9ubHksXG4gIGFkZElQQ2F2ZWF0VG9NYWNhcm9vbixcbiAgZGVyaXZlTGlnaHRuaW5nU2VydmljZVNoYXJlZFNlY3JldCxcbn0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpZ2h0bmluZyc7XG5cbmltcG9ydCAqIGFzIHNka2NvcmUgZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuZGVzY3JpYmUoJ2xpZ2h0bmluZyB1dGlscycsIGZ1bmN0aW9uICgpIHtcbiAgW1xuICAgIHsgbmFtZTogJ2xuYnRjJywgbmV0d29ya05hbWU6ICdiaXRjb2luJyB9LFxuICAgIHsgbmFtZTogJ3RsbmJ0YycsIG5ldHdvcmtOYW1lOiAndGVzdG5ldCcgfSxcbiAgXS5mb3JFYWNoKCh7IG5hbWUsIG5ldHdvcmtOYW1lIH0pID0+IHtcbiAgICBkZXNjcmliZShgc3VjY2VzcyAtIGNvaW4gJHtuYW1lfSBhbmQgbmV0d29yayAke25ldHdvcmtOYW1lfWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KGBpc1ZhbGlkTGlnaHRuaW5nTmV0d29ya05hbWUgYW5kIGdldExpZ2h0bmluZ05ldHdvcmtgLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFzc2VydChpc1ZhbGlkTGlnaHRuaW5nTmV0d29ya05hbWUobmV0d29ya05hbWUpKTtcbiAgICAgICAgY29uc3QgbmV0d29yayA9IGdldExpZ2h0bmluZ05ldHdvcmsobmV0d29ya05hbWUpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobmV0d29yaywgdXR4b2xpYi5uZXR3b3Jrc1tuZXR3b3JrTmFtZV0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KGBpc1ZhbGlkTGlnaHRuaW5nTmV0d29ya2AsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXNzZXJ0KGlzVmFsaWRMaWdodG5pbmdOZXR3b3JrTmFtZShuZXR3b3JrTmFtZSkpO1xuICAgICAgICBhc3NlcnQoaXNWYWxpZExpZ2h0bmluZ05ldHdvcmsodXR4b2xpYi5uZXR3b3Jrc1tuZXR3b3JrTmFtZV0pKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdChgZ2V0U3RhdGljc0xpZ2h0bmluZ05ldHdvcmtgLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRTdGF0aWNzTGlnaHRuaW5nTmV0d29yayhuYW1lKS5mYW1pbHksICdsbmJ0YycpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KGBnZXRVdHhvbGliTmV0d29ya2AsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICAgIGdldFV0eG9saWJOZXR3b3JrKG5hbWUpLFxuICAgICAgICAgIG5ldHdvcmtOYW1lID09PSAnYml0Y29pbicgPyB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4gOiB1dHhvbGliLm5ldHdvcmtzLnRlc3RuZXRcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdChgaXNMaWdodG5pbmdDb2luTmFtZWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzTGlnaHRuaW5nQ29pbk5hbWUobmFtZSksIHRydWUpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNMaWdodG5pbmdDb2luTmFtZSgnbHRjJyksIGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBpdChgaXNWYWxpZExpZ2h0bmluZ05ldHdvcmtOYW1lIHNob3VsZCByZXR1cm4gZmFsc2UgZm9yIG5vbiBsaWdodG5pbmcgbmV0d29yayBuYW1lYCwgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkTGlnaHRuaW5nTmV0d29ya05hbWUoJ2xpdGVjb2luJyksIGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoYGlzVmFsaWRMaWdodG5pbmdOZXR3b3JrIHNob3VsZCByZXR1cm4gZmFsc2UgZm9yIG5vbiBsaWdodG5pbmcgbmV0d29ya2AsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZExpZ2h0bmluZ05ldHdvcmsodXR4b2xpYi5uZXR3b3Jrc1snbGl0ZWNvaW4nXSksIGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoYGdldFV0eG9saWJOZXR3b3JrIHNob3VsZCByZXR1cm4gZmFpbCBmb3IgaW52YWxpZCBsaWdodG5pbmcgY29pbmAsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIGdldFV0eG9saWJOZXR3b3JrKCdsdGMnKTtcbiAgICB9LCAvbHRjIGlzIG5vdCBhIGxpZ2h0bmluZyBjb2luLyk7XG4gIH0pO1xuXG4gIGl0KGBjcmVhdGVXYXRjaE9ubHlgLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgd2F0Y2hPbmx5ID0gY3JlYXRlV2F0Y2hPbmx5KHNpZ25lclJvb3RLZXksIHV0eG9saWIubmV0d29ya3MudGVzdG5ldCk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh3YXRjaE9ubHkuYWNjb3VudHMsIGFjY291bnRzKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICB3YXRjaE9ubHkubWFzdGVyX2tleV9maW5nZXJwcmludCxcbiAgICAgIHV0eG9saWIuYmlwMzIuZnJvbUJhc2U1OChzaWduZXJSb290S2V5LCB1dHhvbGliLm5ldHdvcmtzLnRlc3RuZXQpLmZpbmdlcnByaW50LnRvU3RyaW5nKCdoZXgnKVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KGBhZGRJUENhdmVhdFRvTWFjYXJvb25gLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbWFjYXJvb24gPVxuICAgICAgJ0FnRURiRzVrQXZnQkF3b1FNZ1U3ckRpODAyWXFnL3RIbGwyNG5oSUJNQm9XQ2dkaFpHUnlaWE56RWdSeVpXRmtFZ1YzY21sMFpSb1RDZ1JwYm1adkVnUnlaV0ZrRWdWM2NtbDBaUm9YQ2docGJuWnZhV05sY3hJRWNtVmhaQklGZDNKcGRHVWFJUW9JYldGallYSnZiMjRTQ0dkbGJtVnlZWFJsRWdSeVpXRmtFZ1YzY21sMFpSb1dDZ2R0WlhOellXZGxFZ1J5WldGa0VnVjNjbWwwWlJvWENnaHZabVpqYUdGcGJoSUVjbVZoWkJJRmQzSnBkR1VhRmdvSGIyNWphR0ZwYmhJRWNtVmhaQklGZDNKcGRHVWFGQW9GY0dWbGNuTVNCSEpsWVdRU0JYZHlhWFJsR2hnS0JuTnBaMjVsY2hJSVoyVnVaWEpoZEdVU0JISmxZV1FBQUFZZ1pLaVV2RXp4R2QyUUtHVVMrOVI1WldldkcwOVMwNmZNSlVudCtrMVhYWFE9JztcbiAgICBjb25zdCBtYWNhcm9vbk9iaiA9IGltcG9ydE1hY2Fyb29uKG1hY2Fyb29uKS5leHBvcnRKU09OKCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1hY2Fyb29uT2JqLmMsIHVuZGVmaW5lZCk7XG4gICAgY29uc3QgbWFjYXJvb25XaXRoQ2F2ZWF0ID0gYWRkSVBDYXZlYXRUb01hY2Fyb29uKG1hY2Fyb29uLCAnMTI3LjAuMC4xJyk7XG4gICAgY29uc3QgbWFjYXJvb25PYmpXaXRoQ2F2ZWF0ID0gaW1wb3J0TWFjYXJvb24obWFjYXJvb25XaXRoQ2F2ZWF0KS5leHBvcnRKU09OKCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1hY2Fyb29uT2JqV2l0aENhdmVhdC5jWzBdLmksICdpcGFkZHIgMTI3LjAuMC4xJyk7XG4gIH0pO1xuXG4gIGl0KGBkZXJpdmVMaWdodG5pbmdTZXJ2aWNlU2hhcmVkU2VjcmV0YCwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHVzZXJBdXRoWHBydiA9XG4gICAgICAneHBydjlzMjFaclFIMTQzSzROUGtWOHJpaVRuRmY3Mk1SeVFEVkhNbW1wZWtHRjF3NVFrUzJNZlRlaTlLWFl2clpWTW9wNHpRNGFybnpTRjdUUnAzQ3k3M0FXYURkQURpWU1DaTVxcFlXMWJVYTVtJztcbiAgICBjb25zdCBsaWdodG5pbmdTZXJ2aWNlUHViS2V5ID0gZ2V0U3RhdGljc0xpZ2h0bmluZ05ldHdvcmsoJ3RsbmJ0YycpLmxpZ2h0bmluZ1NlcnZpY2VQdWJLZXk7XG5cbiAgICBjb25zdCBleHBlY3RlZFNlY3JldCA9IHNka2NvcmUuZ2V0U2hhcmVkU2VjcmV0KFxuICAgICAgdXR4b2xpYi5iaXAzMi5mcm9tQmFzZTU4KHVzZXJBdXRoWHBydiksXG4gICAgICBCdWZmZXIuZnJvbShsaWdodG5pbmdTZXJ2aWNlUHViS2V5LCAnaGV4JylcbiAgICApO1xuXG4gICAgY29uc3Qgc2VjcmV0ID0gZGVyaXZlTGlnaHRuaW5nU2VydmljZVNoYXJlZFNlY3JldCgndGxuYnRjJywgdXNlckF1dGhYcHJ2KTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoc2VjcmV0LCBleHBlY3RlZFNlY3JldCk7XG4gIH0pO1xufSk7XG4iXX0=

Выполнить команду


Для локальной разработки. Не используйте в интернете!