diff --git a/package.json b/package.json index 716ae670..1a1cc7eb 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "@bazel/jasmine": "^0.35.0", "@bazel/typescript": "latest", "@types/jasmine": "^2.5.53", + "@types/mkdirp": "^0.5.2", "@types/node": "^12.6.9", "clang-format": "^1.2.2", "husky": "^1.3.1", @@ -28,5 +29,10 @@ "hooks": { "pre-commit": "yarn tslint --fix 'src/**/*.ts' -e '**/bower_components/**' -e '**/node_modules/**' && yarn git-clang-format" } + }, + "dependencies": { + "js-yaml": "^3.13.1", + "mkdirp": "^0.5.1", + "request-lite": "^2.40.1" } } diff --git a/src/shadowbox/infrastructure/BUILD b/src/shadowbox/infrastructure/BUILD index 812caefa..8a4f1125 100644 --- a/src/shadowbox/infrastructure/BUILD +++ b/src/shadowbox/infrastructure/BUILD @@ -2,13 +2,46 @@ package(default_visibility=["//visibility:public"]) load("@npm_bazel_typescript//:index.bzl", "ts_library") load("@npm_bazel_jasmine//:index.bzl", "jasmine_node_test") +ts_library( + name = "clock", + srcs = ["clock.ts"], + deps = [ + "@npm//@types/node", + ], +) + +ts_library( + name = "filesystem_text_file", + srcs = ["filesystem_text_file.ts"], + deps = [ + ":text_file", + "@npm//@types/node", + ], +) + +ts_library( + name = "file_read", + srcs = ["file_read.ts"], + deps = [ + "@npm//@types/node", + ], +) + +ts_library( + name = "follow_redirects", + srcs = ["follow_redirects.ts"], + deps = [ + "@npm//request-lite", + "@npm//@types/node", + ], +) + ts_library( name = "get_port", srcs = ["get_port.ts"], deps = [ "@npm//@types/node", ], - tsconfig = "//:tsconfig.nodejs.json", ) ts_library( @@ -19,7 +52,6 @@ ts_library( "@npm//@types/jasmine", "@npm//@types/node", ], - tsconfig = "//:tsconfig.nodejs.json", ) jasmine_node_test( @@ -29,3 +61,63 @@ jasmine_node_test( ], size = "small", ) + +ts_library( + name = "json_config", + srcs = ["json_config.ts"], + deps = [ + ":file_read", + ":logging", + "@npm//@types/node", + ], +) + +ts_library( + name = "logging", + srcs = ["logging.ts"], + deps = [ + "@npm//@types/node", + ], +) + +ts_library( + name = "prometheus_scraper", + srcs = ["prometheus_scraper.ts"], + deps = [ + ":logging", + "@npm//@types/mkdirp", + "@npm//@types/node", + "@npm//mkdirp", + "@npm//js-yaml", + ], +) + +ts_library( + name = "rollout", + srcs = ["rollout.ts"], + deps = [ + "@npm//@types/node", + ], +) + +ts_library( + name = "rollout_test_lib", + srcs = ["rollout.spec.ts"], + deps = [ + ":rollout", + "@npm//@types/jasmine", + ], +) + +jasmine_node_test( + name = "rollout_test", + deps = [ + ":rollout_test_lib", + ], + size = "small", +) + +ts_library( + name = "text_file", + srcs = ["text_file.ts"], +) \ No newline at end of file diff --git a/src/shadowbox/infrastructure/filesystem_text_file.ts b/src/shadowbox/infrastructure/filesystem_text_file.ts index 9a368cd4..5bea7016 100644 --- a/src/shadowbox/infrastructure/filesystem_text_file.ts +++ b/src/shadowbox/infrastructure/filesystem_text_file.ts @@ -13,7 +13,7 @@ // limitations under the License. import * as fs from 'fs'; -import {TextFile} from '../model/text_file'; +import {TextFile} from './text_file'; // Reads a text file if it exists, or null if the file is not found. // Throws any other error except file not found. diff --git a/src/shadowbox/model/text_file.ts b/src/shadowbox/infrastructure/text_file.ts similarity index 100% rename from src/shadowbox/model/text_file.ts rename to src/shadowbox/infrastructure/text_file.ts diff --git a/src/shadowbox/server/mocks/mocks.ts b/src/shadowbox/server/mocks/mocks.ts index 85bb8fcd..823dcd84 100644 --- a/src/shadowbox/server/mocks/mocks.ts +++ b/src/shadowbox/server/mocks/mocks.ts @@ -13,9 +13,8 @@ // limitations under the License. import {PrometheusClient, QueryResultData} from '../../infrastructure/prometheus_scraper'; -import {DataUsageByUser} from '../../model/metrics'; +import {TextFile} from '../../infrastructure/text_file'; import {ShadowsocksAccessKey, ShadowsocksServer} from '../../model/shadowsocks_server'; -import {TextFile} from '../../model/text_file'; export class InMemoryFile implements TextFile { private savedText: string; diff --git a/yarn.lock b/yarn.lock index 436f595b..1563dc32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -143,16 +143,23 @@ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef" integrity sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q== +"@types/mkdirp@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@^12.6.9": + version "12.6.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.9.tgz#ffeee23afdc19ab16e979338e7b536fdebbbaeaf" + integrity sha512-+YB9FtyxXGyD54p8rXwWaN1EWEyar5L58GlGWgtH2I9rGmLGBQcw63+0jw+ujqVavNuO47S1ByAjm9zdHMnskw== + "@types/node@^10.1.0": version "10.14.14" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.14.tgz#a47955df2acf76ba7f0ac3b205d325da193dc9ad" integrity sha512-xXD08vZsvpv4xptQXj1+ky22f7ZoKu5ZNI/4l+/BXG3X+XaeZsmaFbbTKuhSE3NjjvRuZFxFf9sQBMXIcZNFMQ== -"@types/node@^12.6.9": - version "12.6.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.9.tgz#ffeee23afdc19ab16e979338e7b536fdebbbaeaf" - integrity sha512-+YB9FtyxXGyD54p8rXwWaN1EWEyar5L58GlGWgtH2I9rGmLGBQcw63+0jw+ujqVavNuO47S1ByAjm9zdHMnskw== - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -231,6 +238,11 @@ camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" +caseless@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.6.0.tgz#8167c1ab8397fb5bb95f96d28e5a81c50f247ac4" + integrity sha1-gWfBq4OX+1u5X5bSjlqBxQ8kesQ= + chalk@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -423,6 +435,11 @@ foreground-child@^1.5.6: cross-spawn "^4" signal-exit "^3.0.0" +forever-agent@~0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130" + integrity sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA= + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -634,6 +651,14 @@ js-tokens@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^3.7.0: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" @@ -654,6 +679,11 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-stringify-safe@~5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -704,6 +734,11 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" +mime-types@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" + integrity sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4= + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -743,6 +778,11 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-uuid@~1.4.0: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= + normalize-package-data@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -909,6 +949,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +qs@~1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-1.2.2.tgz#19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88" + integrity sha1-GbV/8k3CqZzh+L32r82ln472H4g= + read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -935,6 +980,18 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" +request-lite@^2.40.1: + version "2.40.1" + resolved "https://registry.yarnpkg.com/request-lite/-/request-lite-2.40.1.tgz#08a8a151eaa84117e01d3e14fe765e8529b3f3df" + integrity sha1-CKihUeqoQRfgHT4U/nZehSmz898= + dependencies: + caseless "~0.6.0" + forever-agent "~0.5.0" + json-stringify-safe "~5.0.0" + mime-types "~1.0.1" + node-uuid "~1.4.0" + qs "~1.2.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"