浏览代码

Added dependency injection

master
peter 5 年前
父节点
当前提交
78ad241526

+ 89
- 26
package-lock.json 查看文件

@@ -506,17 +506,20 @@
506 506
     "ansi-colors": {
507 507
       "version": "3.2.3",
508 508
       "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
509
-      "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw=="
509
+      "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
510
+      "dev": true
510 511
     },
511 512
     "ansi-regex": {
512 513
       "version": "4.1.0",
513 514
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
514
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
515
+      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
516
+      "dev": true
515 517
     },
516 518
     "ansi-styles": {
517 519
       "version": "3.2.1",
518 520
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
519 521
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
522
+      "dev": true,
520 523
       "requires": {
521 524
         "color-convert": "^1.9.0"
522 525
       }
@@ -566,6 +569,7 @@
566 569
       "version": "1.0.10",
567 570
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
568 571
       "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
572
+      "dev": true,
569 573
       "requires": {
570 574
         "sprintf-js": "~1.0.2"
571 575
       }
@@ -883,7 +887,8 @@
883 887
     "browser-stdout": {
884 888
       "version": "1.3.1",
885 889
       "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
886
-      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="
890
+      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
891
+      "dev": true
887 892
     },
888 893
     "browserify-aes": {
889 894
       "version": "1.2.0",
@@ -1071,7 +1076,8 @@
1071 1076
     "camelcase": {
1072 1077
       "version": "5.3.1",
1073 1078
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
1074
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
1079
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
1080
+      "dev": true
1075 1081
     },
1076 1082
     "caseless": {
1077 1083
       "version": "0.12.0",
@@ -1082,6 +1088,7 @@
1082 1088
       "version": "2.4.2",
1083 1089
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
1084 1090
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
1091
+      "dev": true,
1085 1092
       "requires": {
1086 1093
         "ansi-styles": "^3.2.1",
1087 1094
         "escape-string-regexp": "^1.0.5",
@@ -1199,6 +1206,7 @@
1199 1206
       "version": "5.0.0",
1200 1207
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
1201 1208
       "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
1209
+      "dev": true,
1202 1210
       "requires": {
1203 1211
         "string-width": "^3.1.0",
1204 1212
         "strip-ansi": "^5.2.0",
@@ -1229,6 +1237,7 @@
1229 1237
       "version": "1.9.3",
1230 1238
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
1231 1239
       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
1240
+      "dev": true,
1232 1241
       "requires": {
1233 1242
         "color-name": "1.1.3"
1234 1243
       }
@@ -1236,7 +1245,8 @@
1236 1245
     "color-name": {
1237 1246
       "version": "1.1.3",
1238 1247
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
1239
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
1248
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
1249
+      "dev": true
1240 1250
     },
1241 1251
     "colorette": {
1242 1252
       "version": "1.0.8",
@@ -1491,7 +1501,8 @@
1491 1501
     "decamelize": {
1492 1502
       "version": "1.2.0",
1493 1503
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
1494
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
1504
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
1505
+      "dev": true
1495 1506
     },
1496 1507
     "decode-uri-component": {
1497 1508
       "version": "0.2.0",
@@ -1729,7 +1740,8 @@
1729 1740
     "diff": {
1730 1741
       "version": "3.5.0",
1731 1742
       "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
1732
-      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
1743
+      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
1744
+      "dev": true
1733 1745
     },
1734 1746
     "diffie-hellman": {
1735 1747
       "version": "5.0.3",
@@ -1800,7 +1812,8 @@
1800 1812
     "emoji-regex": {
1801 1813
       "version": "7.0.3",
1802 1814
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
1803
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
1815
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
1816
+      "dev": true
1804 1817
     },
1805 1818
     "emojis-list": {
1806 1819
       "version": "2.1.0",
@@ -1877,7 +1890,8 @@
1877 1890
     "escape-string-regexp": {
1878 1891
       "version": "1.0.5",
1879 1892
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1880
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
1893
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
1894
+      "dev": true
1881 1895
     },
1882 1896
     "escodegen": {
1883 1897
       "version": "1.13.0",
@@ -1911,7 +1925,8 @@
1911 1925
     "esprima": {
1912 1926
       "version": "4.0.1",
1913 1927
       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
1914
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
1928
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
1929
+      "dev": true
1915 1930
     },
1916 1931
     "esrecurse": {
1917 1932
       "version": "4.2.1",
@@ -2301,6 +2316,7 @@
2301 2316
       "version": "3.0.0",
2302 2317
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
2303 2318
       "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
2319
+      "dev": true,
2304 2320
       "requires": {
2305 2321
         "locate-path": "^3.0.0"
2306 2322
       }
@@ -2352,6 +2368,7 @@
2352 2368
       "version": "4.1.0",
2353 2369
       "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
2354 2370
       "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
2371
+      "dev": true,
2355 2372
       "requires": {
2356 2373
         "is-buffer": "~2.0.3"
2357 2374
       },
@@ -2359,7 +2376,8 @@
2359 2376
         "is-buffer": {
2360 2377
           "version": "2.0.4",
2361 2378
           "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
2362
-          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A=="
2379
+          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
2380
+          "dev": true
2363 2381
         }
2364 2382
       }
2365 2383
     },
@@ -3219,7 +3237,8 @@
3219 3237
     "get-caller-file": {
3220 3238
       "version": "2.0.5",
3221 3239
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
3222
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
3240
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
3241
+      "dev": true
3223 3242
     },
3224 3243
     "get-own-enumerable-property-symbols": {
3225 3244
       "version": "3.0.2",
@@ -3406,7 +3425,8 @@
3406 3425
     "growl": {
3407 3426
       "version": "1.10.5",
3408 3427
       "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
3409
-      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="
3428
+      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
3429
+      "dev": true
3410 3430
     },
3411 3431
     "har-schema": {
3412 3432
       "version": "2.0.0",
@@ -3433,7 +3453,8 @@
3433 3453
     "has-flag": {
3434 3454
       "version": "3.0.0",
3435 3455
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
3436
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
3456
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
3457
+      "dev": true
3437 3458
     },
3438 3459
     "has-symbols": {
3439 3460
       "version": "1.0.0",
@@ -3497,7 +3518,8 @@
3497 3518
     "he": {
3498 3519
       "version": "1.2.0",
3499 3520
       "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
3500
-      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
3521
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
3522
+      "dev": true
3501 3523
     },
3502 3524
     "hmac-drbg": {
3503 3525
       "version": "1.0.1",
@@ -3929,6 +3951,7 @@
3929 3951
       "version": "3.13.1",
3930 3952
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
3931 3953
       "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
3954
+      "dev": true,
3932 3955
       "requires": {
3933 3956
         "argparse": "^1.0.7",
3934 3957
         "esprima": "^4.0.0"
@@ -4103,6 +4126,7 @@
4103 4126
       "version": "3.0.0",
4104 4127
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
4105 4128
       "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
4129
+      "dev": true,
4106 4130
       "requires": {
4107 4131
         "p-locate": "^3.0.0",
4108 4132
         "path-exists": "^3.0.0"
@@ -4117,6 +4141,7 @@
4117 4141
       "version": "2.2.0",
4118 4142
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
4119 4143
       "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
4144
+      "dev": true,
4120 4145
       "requires": {
4121 4146
         "chalk": "^2.0.1"
4122 4147
       }
@@ -4505,6 +4530,7 @@
4505 4530
       "version": "7.0.0",
4506 4531
       "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.0.0.tgz",
4507 4532
       "integrity": "sha512-CirsOPbO3jU86YKjjMzFLcXIb5YiGLUrjrXFHoJ3e2z9vWiaZVCZQ2+gtRGMPWF+nFhN6AWwLM/juzAQ6KRkbA==",
4533
+      "dev": true,
4508 4534
       "requires": {
4509 4535
         "ansi-colors": "3.2.3",
4510 4536
         "browser-stdout": "1.3.1",
@@ -4536,6 +4562,7 @@
4536 4562
           "version": "3.1.1",
4537 4563
           "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
4538 4564
           "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
4565
+          "dev": true,
4539 4566
           "requires": {
4540 4567
             "normalize-path": "^3.0.0",
4541 4568
             "picomatch": "^2.0.4"
@@ -4544,12 +4571,14 @@
4544 4571
         "binary-extensions": {
4545 4572
           "version": "2.0.0",
4546 4573
           "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
4547
-          "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow=="
4574
+          "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
4575
+          "dev": true
4548 4576
         },
4549 4577
         "braces": {
4550 4578
           "version": "3.0.2",
4551 4579
           "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
4552 4580
           "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
4581
+          "dev": true,
4553 4582
           "requires": {
4554 4583
             "fill-range": "^7.0.1"
4555 4584
           }
@@ -4558,6 +4587,7 @@
4558 4587
           "version": "3.3.0",
4559 4588
           "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
4560 4589
           "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
4590
+          "dev": true,
4561 4591
           "requires": {
4562 4592
             "anymatch": "~3.1.1",
4563 4593
             "braces": "~3.0.2",
@@ -4573,6 +4603,7 @@
4573 4603
           "version": "3.2.6",
4574 4604
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
4575 4605
           "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
4606
+          "dev": true,
4576 4607
           "requires": {
4577 4608
             "ms": "^2.1.1"
4578 4609
           }
@@ -4581,6 +4612,7 @@
4581 4612
           "version": "7.0.1",
4582 4613
           "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
4583 4614
           "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
4615
+          "dev": true,
4584 4616
           "requires": {
4585 4617
             "to-regex-range": "^5.0.1"
4586 4618
           }
@@ -4589,12 +4621,14 @@
4589 4621
           "version": "2.1.2",
4590 4622
           "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
4591 4623
           "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
4624
+          "dev": true,
4592 4625
           "optional": true
4593 4626
         },
4594 4627
         "glob": {
4595 4628
           "version": "7.1.3",
4596 4629
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
4597 4630
           "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
4631
+          "dev": true,
4598 4632
           "requires": {
4599 4633
             "fs.realpath": "^1.0.0",
4600 4634
             "inflight": "^1.0.4",
@@ -4608,6 +4642,7 @@
4608 4642
           "version": "5.1.0",
4609 4643
           "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
4610 4644
           "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
4645
+          "dev": true,
4611 4646
           "requires": {
4612 4647
             "is-glob": "^4.0.1"
4613 4648
           }
@@ -4616,6 +4651,7 @@
4616 4651
           "version": "2.1.0",
4617 4652
           "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
4618 4653
           "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
4654
+          "dev": true,
4619 4655
           "requires": {
4620 4656
             "binary-extensions": "^2.0.0"
4621 4657
           }
@@ -4623,12 +4659,14 @@
4623 4659
         "is-extglob": {
4624 4660
           "version": "2.1.1",
4625 4661
           "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
4626
-          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
4662
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
4663
+          "dev": true
4627 4664
         },
4628 4665
         "is-glob": {
4629 4666
           "version": "4.0.1",
4630 4667
           "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
4631 4668
           "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
4669
+          "dev": true,
4632 4670
           "requires": {
4633 4671
             "is-extglob": "^2.1.1"
4634 4672
           }
@@ -4636,12 +4674,14 @@
4636 4674
         "is-number": {
4637 4675
           "version": "7.0.0",
4638 4676
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
4639
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
4677
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
4678
+          "dev": true
4640 4679
         },
4641 4680
         "minimatch": {
4642 4681
           "version": "3.0.4",
4643 4682
           "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
4644 4683
           "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
4684
+          "dev": true,
4645 4685
           "requires": {
4646 4686
             "brace-expansion": "^1.1.7"
4647 4687
           }
@@ -4649,12 +4689,14 @@
4649 4689
         "ms": {
4650 4690
           "version": "2.1.1",
4651 4691
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
4652
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
4692
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
4693
+          "dev": true
4653 4694
         },
4654 4695
         "readdirp": {
4655 4696
           "version": "3.2.0",
4656 4697
           "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
4657 4698
           "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
4699
+          "dev": true,
4658 4700
           "requires": {
4659 4701
             "picomatch": "^2.0.4"
4660 4702
           }
@@ -4663,6 +4705,7 @@
4663 4705
           "version": "6.0.0",
4664 4706
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
4665 4707
           "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
4708
+          "dev": true,
4666 4709
           "requires": {
4667 4710
             "has-flag": "^3.0.0"
4668 4711
           }
@@ -4671,6 +4714,7 @@
4671 4714
           "version": "5.0.1",
4672 4715
           "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
4673 4716
           "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
4717
+          "dev": true,
4674 4718
           "requires": {
4675 4719
             "is-number": "^7.0.0"
4676 4720
           }
@@ -4679,6 +4723,7 @@
4679 4723
           "version": "13.3.0",
4680 4724
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
4681 4725
           "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
4726
+          "dev": true,
4682 4727
           "requires": {
4683 4728
             "cliui": "^5.0.0",
4684 4729
             "find-up": "^3.0.0",
@@ -4870,6 +4915,7 @@
4870 4915
       "version": "1.0.6",
4871 4916
       "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
4872 4917
       "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
4918
+      "dev": true,
4873 4919
       "requires": {
4874 4920
         "object.getownpropertydescriptors": "^2.0.3",
4875 4921
         "semver": "^5.7.0"
@@ -4981,7 +5027,8 @@
4981 5027
     "normalize-path": {
4982 5028
       "version": "3.0.0",
4983 5029
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
4984
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
5030
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
5031
+      "dev": true
4985 5032
     },
4986 5033
     "npm-bundled": {
4987 5034
       "version": "1.0.6",
@@ -5082,6 +5129,7 @@
5082 5129
       "version": "4.1.0",
5083 5130
       "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
5084 5131
       "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
5132
+      "dev": true,
5085 5133
       "requires": {
5086 5134
         "define-properties": "^1.1.2",
5087 5135
         "function-bind": "^1.1.1",
@@ -5367,6 +5415,7 @@
5367 5415
       "version": "2.2.1",
5368 5416
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
5369 5417
       "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
5418
+      "dev": true,
5370 5419
       "requires": {
5371 5420
         "p-try": "^2.0.0"
5372 5421
       }
@@ -5375,6 +5424,7 @@
5375 5424
       "version": "3.0.0",
5376 5425
       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
5377 5426
       "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
5427
+      "dev": true,
5378 5428
       "requires": {
5379 5429
         "p-limit": "^2.0.0"
5380 5430
       }
@@ -5550,7 +5600,8 @@
5550 5600
     "picomatch": {
5551 5601
       "version": "2.2.1",
5552 5602
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
5553
-      "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA=="
5603
+      "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==",
5604
+      "dev": true
5554 5605
     },
5555 5606
     "pify": {
5556 5607
       "version": "3.0.0",
@@ -5940,12 +5991,14 @@
5940 5991
     "require-directory": {
5941 5992
       "version": "2.1.1",
5942 5993
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
5943
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
5994
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
5995
+      "dev": true
5944 5996
     },
5945 5997
     "require-main-filename": {
5946 5998
       "version": "2.0.0",
5947 5999
       "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
5948
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
6000
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
6001
+      "dev": true
5949 6002
     },
5950 6003
     "requirejs": {
5951 6004
       "version": "2.3.6",
@@ -6461,7 +6514,8 @@
6461 6514
     "sprintf-js": {
6462 6515
       "version": "1.0.3",
6463 6516
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
6464
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
6517
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
6518
+      "dev": true
6465 6519
     },
6466 6520
     "sqlite3": {
6467 6521
       "version": "4.1.0",
@@ -6605,6 +6659,7 @@
6605 6659
       "version": "3.1.0",
6606 6660
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
6607 6661
       "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
6662
+      "dev": true,
6608 6663
       "requires": {
6609 6664
         "emoji-regex": "^7.0.1",
6610 6665
         "is-fullwidth-code-point": "^2.0.0",
@@ -6652,6 +6707,7 @@
6652 6707
       "version": "5.2.0",
6653 6708
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
6654 6709
       "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
6710
+      "dev": true,
6655 6711
       "requires": {
6656 6712
         "ansi-regex": "^4.1.0"
6657 6713
       }
@@ -6680,6 +6736,7 @@
6680 6736
       "version": "5.5.0",
6681 6737
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
6682 6738
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
6739
+      "dev": true,
6683 6740
       "requires": {
6684 6741
         "has-flag": "^3.0.0"
6685 6742
       }
@@ -7306,7 +7363,8 @@
7306 7363
     "which-module": {
7307 7364
       "version": "2.0.0",
7308 7365
       "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
7309
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
7366
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
7367
+      "dev": true
7310 7368
     },
7311 7369
     "wide-align": {
7312 7370
       "version": "1.1.3",
@@ -7359,6 +7417,7 @@
7359 7417
       "version": "5.1.0",
7360 7418
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
7361 7419
       "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
7420
+      "dev": true,
7362 7421
       "requires": {
7363 7422
         "ansi-styles": "^3.2.0",
7364 7423
         "string-width": "^3.0.0",
@@ -7421,7 +7480,8 @@
7421 7480
     "y18n": {
7422 7481
       "version": "4.0.0",
7423 7482
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
7424
-      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
7483
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
7484
+      "dev": true
7425 7485
     },
7426 7486
     "yallist": {
7427 7487
       "version": "2.1.2",
@@ -7451,6 +7511,7 @@
7451 7511
       "version": "13.1.1",
7452 7512
       "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
7453 7513
       "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
7514
+      "dev": true,
7454 7515
       "requires": {
7455 7516
         "camelcase": "^5.0.0",
7456 7517
         "decamelize": "^1.2.0"
@@ -7460,6 +7521,7 @@
7460 7521
       "version": "1.6.0",
7461 7522
       "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
7462 7523
       "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
7524
+      "dev": true,
7463 7525
       "requires": {
7464 7526
         "flat": "^4.1.0",
7465 7527
         "lodash": "^4.17.15",
@@ -7470,6 +7532,7 @@
7470 7532
           "version": "13.3.0",
7471 7533
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
7472 7534
           "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
7535
+          "dev": true,
7473 7536
           "requires": {
7474 7537
             "cliui": "^5.0.0",
7475 7538
             "find-up": "^3.0.0",

+ 3
- 2
package.json 查看文件

@@ -4,7 +4,8 @@
4 4
   "version": "1.0.0",
5 5
   "scripts": {
6 6
     "tsc": "tsc",
7
-    "start": "npm run build; node lib/src/Launcher.js",
7
+    "start": "npm run build; node lib/src/backend/Launcher.js",
8
+    "start-backend": "npm run build-backend; node lib/src/backend/Launcher.js",
8 9
     "build": "npm run clean; npm run build-backend; npm run build-frontend",
9 10
     "test": "npm run clean && npm run build-backend && mocha lib/test/backendTest.js",
10 11
     "build-backend": "tsc;",
@@ -36,7 +37,6 @@
36 37
     "loadson": "^1.0.0",
37 38
     "log4js": "^4.5.1",
38 39
     "lowdb": "^1.0.0",
39
-    "mocha": "^7.0.0",
40 40
     "node-fetch": "^2.6.0",
41 41
     "path": "^0.12.7",
42 42
     "reflect-metadata": "^0.1.13",
@@ -56,6 +56,7 @@
56 56
     "@types/node": "^11.13.19",
57 57
     "@types/semver": "^6.0.1",
58 58
     "madge": "^3.6.0",
59
+    "mocha": "^7.0.0",
59 60
     "terser-webpack-plugin": "^1.4.1",
60 61
     "ts-loader": "^5.3.3",
61 62
     "typescript": "^3.5.3",

+ 11
- 5
src/backend/Admin/Admin.ts 查看文件

@@ -10,14 +10,15 @@ import * as express from 'express';
10 10
 import { GuildManager } from '../Components/Guild/GuildManager';
11 11
 import { ItemManager } from '../Components/Item/ItemManager';
12 12
 import { RaidManager } from '../Components/Raid/RaidManager';
13
-import { CharacterManager } from '../Components/User/CharacterManager';
14
-import { LoginManager } from '../Components/User/LoginManager';
13
+import { CharacterManager } from '../Components/Character/CharacterManager';
14
+import { LoginManager } from '../Components/Login/LoginManager';
15 15
 import { RootComponent } from '../Injector/ServiceDecorator';
16 16
 import { TableDefinitionExporter } from '../Types/Interfaces';
17 17
 import { AdminConf, TableDefiniton } from '../Types/Types';
18 18
 import { RPCConfigLoader } from '../Components/RPCConfigLoader';
19 19
 import { FrontworkComponent } from '../Types/FrontworkComponent';
20 20
 import { IAdmin } from './Interface';
21
+import { Injector } from '../Injector/Injector';
21 22
 
22 23
 
23 24
 const logger = getLogger("admin", 'debug') 
@@ -64,11 +65,16 @@ implements TableDefinitionExporter, IAdmin {
64 65
         await this.makeKnex()
65 66
         this.startWebsocket()
66 67
         await Promise.all( this.frontworkComponents.map(c => c.initialize?c.initialize():undefined ))
68
+        logger.debug(this.frontworkComponents.length+" components initialized")
67 69
         this.startWebserver()
68 70
     }
69 71
 
70 72
     stop(){
71
-        process.exit(0);
73
+        Promise.race([
74
+            Promise.all( this.frontworkComponents.map(c => c.stop?c.stop():undefined )),
75
+            new Promise((res, rej) => { setTimeout(res, 250);})
76
+        ]).catch(e => logger.warn(e))
77
+        .finally(() => { process.exit(0) })
72 78
     }
73 79
 
74 80
     protected configChangeHandler = (conf:AdminConf, key?:string) => {
@@ -95,6 +101,7 @@ implements TableDefinitionExporter, IAdmin {
95 101
         this.rpcServer = new RPCServer(20000, [
96 102
             ...this.frontworkComponents,
97 103
         ])
104
+        logger.debug("Websocket up on", 20000)
98 105
     }
99 106
 
100 107
     private startWebserver(){
@@ -183,6 +190,5 @@ implements TableDefinitionExporter, IAdmin {
183 190
 
184 191
 process.on( 'SIGINT', function() {
185 192
     logger.info("Shutting down from SIGINT (Ctrl-C)" );
186
-    // some other closing procedures go here
187
-    process.exit(0);
193
+    Injector.resolve<FrontworkAdmin>(FrontworkAdmin).stop()
188 194
 })

src/backend/Components/User/CharacterManager.ts → src/backend/Components/Character/CharacterManager.ts 查看文件

@@ -3,20 +3,22 @@ import { Inject, Module } from "../../Injector/ServiceDecorator";
3 3
 import { TableDefiniton, Character } from "../../Types/Types";
4 4
 import { CharacterManagerIfc } from "./RPCInterface";
5 5
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
6
-import { FrontworkAdmin } from "../../Admin/Admin";
7
-import { LoginManager } from "./LoginManager";
8 6
 import { getSpecTableData, SpecT } from "../../Types/PlayerSpecs";
9 7
 import { IAdmin } from "../../Admin/Interface";
8
+import { ILoginManager } from "../Login/Interface";
9
+import { ICharacterManager } from "./Interface";
10
+import { getLogger } from "log4js";
10 11
 
11
-@Module()
12
+@Module(ICharacterManager)
12 13
 export class CharacterManager
13
-implements FrontworkComponent<CharacterManagerIfc, RPCInterface>{
14
+implements FrontworkComponent<CharacterManagerIfc, RPCInterface>, ICharacterManager{
14 15
     name = "CharacterManager" as "CharacterManager";   
15 16
     
16 17
     @Inject(IAdmin)
17 18
     private admin: IAdmin   
18 19
 
19
-    private loginManager : LoginManager
20
+    @Inject(ILoginManager)
21
+    private loginManager : any
20 22
 
21 23
     exportRPCs = () => [
22 24
         {
@@ -60,17 +62,20 @@ implements FrontworkComponent<CharacterManagerIfc, RPCInterface>{
60 62
     ]
61 63
 
62 64
     private initialized = false
65
+    
63 66
     initialize = async () => {
64
-
65 67
         if(!this.initialized)
66 68
             this.initialized = true
67 69
         //initialize spec table
70
+
71
+        getLogger('CharacterManager').debug('inserting specs')
72
+
68 73
         await this.admin.knex('specs').insert(getSpecTableData()).catch(e => { console.log("skipping spec insertion") })
69 74
     }
70 75
 
71 76
     createCharacter = async (userToken: string, character : Character) : Promise<Character> => {
72 77
         try{
73
-
78
+            const user = this.loginManager.getUserRecordByToken(userToken)
74 79
             await this.admin.knex('characters').insert(character)
75 80
             const char : Character = await this.admin.knex.select('*').from('characters').where(character).first()
76 81
             return char

+ 9
- 0
src/backend/Components/Character/Interface.ts 查看文件

@@ -0,0 +1,9 @@
1
+import { Character } from "../../Types/Types"
2
+import { SpecT } from "../../Types/PlayerSpecs"
3
+
4
+
5
+export class ICharacterManager{
6
+    createCharacter: (usertoken: string, char : Character) => Promise<Character>
7
+    getSpecId: <c extends keyof SpecT>(clazz: c, name: SpecT[c]) => Promise<number>
8
+    getCharacters: () => Promise<Character[]>
9
+}

+ 15
- 0
src/backend/Components/Character/RPCInterface.ts 查看文件

@@ -0,0 +1,15 @@
1
+import { ICharacterManager } from "./Interface"
2
+
3
+
4
+export type CharacterManagerIfc = {
5
+    CharacterManager: {
6
+        getSpecId : ICharacterManager['getSpecId']
7
+        getCharacters : ICharacterManager['getCharacters']
8
+    }
9
+}
10
+
11
+export type CharacterManagerFeatureIfc = {
12
+    createCharacter: {
13
+        createCharacter: ICharacterManager['createCharacter']
14
+    }
15
+}

+ 23
- 23
src/backend/Components/Guild/GuildManager.ts 查看文件

@@ -1,10 +1,10 @@
1 1
 import { ConfigLoader } from "loadson";
2 2
 import { Inject, Module } from "../../Injector/ServiceDecorator";
3 3
 import { GuildManagerFeatureIfc, GuildManagerIfc } from "./RPCInterface";
4
-import { FrontworkAdmin } from "../../Admin/Admin";
5 4
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
6 5
 import { _Rank, Rank } from "../../Types/Types";
7 6
 import { IAdmin } from "../../Admin/Interface";
7
+import { IGuildManager } from "./Interface";
8 8
 
9 9
 export type Guild = {
10 10
     name: string
@@ -12,55 +12,51 @@ export type Guild = {
12 12
     description: string
13 13
 }
14 14
 
15
-@Module()
15
+@Module(IGuildManager)
16 16
 export class GuildManager
17
-implements FrontworkComponent<GuildManagerIfc, GuildManagerFeatureIfc>{
17
+implements FrontworkComponent<GuildManagerIfc, GuildManagerFeatureIfc>, IGuildManager{
18 18
 
19 19
     name = "GuildManager" as "GuildManager";    
20 20
     
21 21
     @Inject(IAdmin)
22
-    private admin
22
+    private admin : IAdmin
23 23
 
24
-    guild: ConfigLoader<Guild>
25
-
26
-    constructor(){
27
-        this.guild = new ConfigLoader({
28
-            name: "guild",
29
-            getDefaultConfig: () => {
30
-                return <Guild>{
31
-                    name: "Tranquil",
32
-                    realm: "Gandling EU",
33
-                    description: "Wee woo"
34
-                }
24
+    guild: ConfigLoader<Guild> = new ConfigLoader({
25
+        name: "guild",
26
+        getDefaultConfig: () => {
27
+            return <Guild>{
28
+                name: "Tranquil",
29
+                realm: "Gandling EU",
30
+                description: "Wee woo"
35 31
             }
36
-        }, "./config")
37
-    }
32
+        }
33
+    }, "./config")
38 34
 
39 35
     exportRPCs = () => [{
40 36
         name: 'getHeadCount' as 'getHeadCount',
41
-        call: this.headCount
37
+        call: this.getHeadCount
42 38
     },{
43 39
         name: 'getGuildInfo' as 'getGuildInfo',
44
-        call: async () => this.guild.getConfig()
40
+        call: this.getGuildInfo
45 41
     }]
46 42
 
47 43
     exportRPCFeatures = () => [{
48 44
         name: 'manageGuild' as 'manageGuild',
49 45
         exportRPCs: () => [{
50 46
             name: 'setName' as 'setName',
51
-            call: async (name:string) => this.guild.setConfigKey('name', name)
47
+            call: this.setName
52 48
         },{
53 49
             name: 'setRealm' as 'setRealm',
54
-            call: async (realm:string) => this.guild.setConfigKey('realm', realm)
50
+            call: this.setRealm
55 51
         }, {
56 52
             name: 'setDescription' as 'setDescription',
57
-            call: async (description: string) => this.guild.setConfigKey('description', description)
53
+            call: this.setDescription
58 54
         }]
59 55
     }]
60 56
     
61 57
     getTableDefinitions = () => []
62 58
 
63
-    headCount = async () => await Promise.all(
59
+    getHeadCount = async() : Promise<{ rank: Rank; count: number; }[]> => await Promise.all(
64 60
         _Rank.map(async r => {
65 61
             const res = await this.admin.knex
66 62
             .select('*')
@@ -76,4 +72,8 @@ implements FrontworkComponent<GuildManagerIfc, GuildManagerFeatureIfc>{
76 72
         })
77 73
     )
78 74
 
75
+    getGuildInfo = async () => this.guild.getConfig()
76
+    setName = async (name:string) => this.guild.setConfigKey('name', name)
77
+    setDescription = async (description: string) => this.guild.setConfigKey('description', description)
78
+    setRealm = async (realm:string) => this.guild.setConfigKey('realm', realm)
79 79
 }

+ 10
- 0
src/backend/Components/Guild/Interface.ts 查看文件

@@ -0,0 +1,10 @@
1
+import { Rank } from "../../Types/Types"
2
+import { Guild } from "./GuildManager"
3
+
4
+export class IGuildManager{
5
+    getHeadCount: () => Promise<{rank:Rank, count: number}[]>
6
+    getGuildInfo: () => Promise<Guild>
7
+    setName: (name:string) => Promise<Guild>
8
+    setRealm: (realm:string) => Promise<Guild>
9
+    setDescription: (description:string) => Promise<Guild>
10
+}

+ 6
- 7
src/backend/Components/Guild/RPCInterface.ts 查看文件

@@ -1,17 +1,16 @@
1
-import { Guild } from "./GuildManager"
2
-import { Rank } from "../../Types/Types"
1
+import { IGuildManager } from "./Interface"
3 2
 
4 3
 export type GuildManagerIfc = {
5 4
     GuildManager: {
6
-        getHeadCount: () => Promise<{rank:Rank, count: number}[]>
7
-        getGuildInfo: () => Promise<Guild>
5
+        getHeadCount: IGuildManager['getHeadCount']
6
+        getGuildInfo: IGuildManager['getGuildInfo']
8 7
     }
9 8
 }
10 9
 
11 10
 export type GuildManagerFeatureIfc = {
12 11
     manageGuild: {
13
-        setName: (name:string) => Promise<Guild>
14
-        setRealm: (realm:string) => Promise<Guild>
15
-        setDescription: (description:string) => Promise<Guild>
12
+        setName: IGuildManager['setName']
13
+        setRealm: IGuildManager['setRealm']
14
+        setDescription: IGuildManager['setDescription']
16 15
     }
17 16
 }

+ 6
- 0
src/backend/Components/Item/Interface.ts 查看文件

@@ -0,0 +1,6 @@
1
+import { Item } from "../../Types/Types"
2
+
3
+export class IItemManager{
4
+    getItems: () => Promise<Item[]>
5
+    getItem: (name:string) => Promise<Item>
6
+}

+ 9
- 16
src/backend/Components/Item/ItemManager.ts 查看文件

@@ -4,30 +4,22 @@ import { Inject, Module } from "../../Injector/ServiceDecorator";
4 4
 import { ItemManagerFeatureIfc, ItemManagerIfc } from "./RPCInterface";
5 5
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
6 6
 import { TableDefinitionExporter } from "../../Types/Interfaces";
7
-import { FrontworkAdmin } from "../../Admin/Admin";
8
-import { TableDefiniton } from "../../Types/Types";
7
+import { TableDefiniton, Item } from "../../Types/Types";
9 8
 import { IAdmin } from "../../Admin/Interface";
9
+import { IItemManager } from "./Interface";
10
+import { getLogger } from "log4js";
10 11
 
11 12
 const fetch = require('node-fetch')
12 13
 const xml2js = require('xml2js');
13 14
 const parser = new xml2js.Parser(/* options */);
14 15
 
15
-export type Item = {
16
-    id?:number
17
-    name:string
18
-    iconname:string
19
-    url:string
20
-    quality:string
21
-    hidden:boolean
22
-}
23
-
24
-@Module()
16
+@Module(IItemManager)
25 17
 export class ItemManager
26
-implements FrontworkComponent<ItemManagerIfc, ItemManagerFeatureIfc>, TableDefinitionExporter{
18
+implements FrontworkComponent<ItemManagerIfc, ItemManagerFeatureIfc>, TableDefinitionExporter, IItemManager{
27 19
     name = "ItemManager" as "ItemManager";    
28 20
     
29 21
     @Inject(IAdmin)
30
-    private admin: FrontworkAdmin
22
+    private admin: IAdmin
31 23
 
32 24
     exportRPCs(): RPC<any, any>[]{
33 25
         return [{
@@ -99,6 +91,8 @@ implements FrontworkComponent<ItemManagerIfc, ItemManagerFeatureIfc>, TableDefin
99 91
             this.initialized = true        
100 92
         
101 93
         const allItems = [...T1]
94
+        getLogger('ItemManager').debug('Checking items')
95
+
102 96
         const countCache = await this.countItems()
103 97
         if(countCache != allItems.length){
104 98
             const items:Item[] = await Promise.all(allItems.map((i) => this.getItem(i)))
@@ -107,8 +101,7 @@ implements FrontworkComponent<ItemManagerIfc, ItemManagerFeatureIfc>, TableDefin
107 101
                 .knex('items')
108 102
                 .insert(items)
109 103
             }catch(e){
110
-                console.log(e)
111
-                console.info("Skipping item insertion")
104
+                getLogger('ItemManager').debug("Skipping item insertion")
112 105
             }
113 106
         }
114 107
     }

+ 10
- 3
src/backend/Components/Item/RPCInterface.ts 查看文件

@@ -1,4 +1,11 @@
1
-import { RPCInterface } from "rpclibrary"
1
+import { IItemManager } from "./Interface"
2 2
 
3
-export type ItemManagerIfc = RPCInterface
4
-export type ItemManagerFeatureIfc = RPCInterface
3
+export type ItemManagerIfc = {
4
+    ItemManager: {
5
+        getItem: IItemManager['getItem']
6
+        getItems: IItemManager['getItems']
7
+    }
8
+}
9
+
10
+export type ItemManagerFeatureIfc = {
11
+}

+ 11
- 0
src/backend/Components/Login/Interface.ts 查看文件

@@ -0,0 +1,11 @@
1
+import { Auth, Rank, User, RPCPermission } from "../../Types/Types"
2
+
3
+export class ILoginManager{
4
+    login: (username:string, pwHash:string) => Promise<Auth>
5
+    logout: (username: string, tokenValue :string) => Promise<void>
6
+    getAuth: (tokenValue: string) => Promise<Auth>
7
+    createUser: (user:User) => Promise<User>
8
+    setPermission: (perm: RPCPermission) => Promise<void>
9
+    getPermissions: () => Promise<RPCPermission[]>
10
+    checkToken: (token: string, rank: Rank) => boolean
11
+}

src/backend/Components/User/LoginManager.ts → src/backend/Components/Login/LoginManager.ts 查看文件

@@ -4,11 +4,13 @@ import { FrontworkAdmin } from "../../Admin/Admin";
4 4
 import { GuildManager } from "../Guild/GuildManager";
5 5
 import { ItemManager } from "../Item/ItemManager";
6 6
 import { RaidManager } from "../Raid/RaidManager";
7
-import { CharacterManager } from "./CharacterManager";
7
+import { CharacterManager } from "../Character/CharacterManager";
8 8
 import { LoginManagerIfc, LoginManagerFeatureIfc } from "./RPCInterface";
9 9
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
10 10
 import { Rank, User, Auth, _Rank, TableDefiniton, RPCPermission, FrontcraftFeatureIfc, AnyRPCExporter, Token } from "../../Types/Types";
11 11
 import { IAdmin } from "../../Admin/Interface";
12
+import { ILoginManager } from "./Interface";
13
+import { getLogger } from "log4js";
12 14
 
13 15
 const uuid = require('uuid/v4')
14 16
 
@@ -21,9 +23,9 @@ type Serverstate = {
21 23
 }
22 24
 
23 25
 
24
-@Module()
26
+@Module(ILoginManager)
25 27
 export class LoginManager
26
-implements FrontworkComponent<LoginManagerIfc, LoginManagerFeatureIfc>{
28
+implements FrontworkComponent<LoginManagerIfc, LoginManagerFeatureIfc>, ILoginManager{
27 29
     name = "Authenticator" as "Authenticator";   
28 30
 
29 31
     @Inject(IAdmin)
@@ -61,7 +63,7 @@ implements FrontworkComponent<LoginManagerIfc, LoginManagerFeatureIfc>{
61 63
             call: this.getAuth
62 64
         },{
63 65
             name: 'checkToken' as 'checkToken',
64
-            call: async (tokenValue : string, rank: Rank) => this.checkToken(tokenValue, rank)
66
+            call: this.checkToken
65 67
         },{
66 68
             name: 'createUser' as 'createUser',
67 69
             call: this.createUser
@@ -111,31 +113,52 @@ implements FrontworkComponent<LoginManagerIfc, LoginManagerFeatureIfc>{
111 113
     initialize = async () => {
112 114
         this.exporters = [this.guild, this.item, this.raid, this.character] 
113 115
         //set up permissions
116
+        getLogger('LoginManager').debug('inserting permissions')
117
+
114 118
         await Promise.all( 
115 119
             [this, ...this.exporters].flatMap(exp => exp.exportRPCFeatures().map(async (feature) => {
116 120
             try{
117 121
                 await this.admin.knex.insert({ name: feature.name }).into('rpcpermissions')
118
-            }catch(e){}
122
+            }catch(e){
123
+                console.log(e);
124
+            }
119 125
         })))
120 126
 
121 127
         //start rankServers
122
-        const rankServers : any = {}   
128
+        getLogger('LoginManager').debug('Starting rank servers')
123 129
 
124
-        for(let i = 0; i < _Rank.length; i++){
125
-            const rank:Rank = _Rank[i]
130
+        let rankServers = { } as any
131
+        await Promise.all(_Rank.map(async (r,i) => {
126 132
             const port = 20001 + i
127
-            const rankServer = await this.startRankServer(rank, port)
128
-            rankServers[rank] = {
133
+            const rankServer = await this.startRankServer(r, port)
134
+            rankServers[r] = {
129 135
                 server: rankServer,
130 136
                 port: port,
131 137
                 allowed: []
132 138
             }
133
-        }
139
+        }))
134 140
         this.rankServers = rankServers
141
+        
135 142
     
136 143
         setInterval(this.checkExpiredSessions, 600_000)   
137 144
     }
138 145
 
146
+    stop = async () => {
147
+        Object.values(this.userLogins).forEach(x => Object.values(x.connections).forEach(c => c.destroy()))
148
+
149
+        await Promise.all(Object
150
+            .values(this.rankServers)
151
+            .map(async state => {
152
+                try{
153
+                    //return await state.server.destroy()
154
+                }catch(e){
155
+                    getLogger('LoginManager').warn(e)
156
+                }
157
+            })
158
+        );
159
+        
160
+    }
161
+
139 162
     checkExpiredSessions = () => {
140 163
         Object.values(this.userLogins).map(userLogin => {
141 164
             const auth = userLogin.auth
@@ -146,11 +169,13 @@ implements FrontworkComponent<LoginManagerIfc, LoginManagerFeatureIfc>{
146 169
     }
147 170
 
148 171
     checkConnection = async (socket: Socket) => {
149
-        let data : any = false
172
+        let data : any
150 173
         let tries = 0
151 174
         while(!data){
152 175
             tries ++
153 176
             if(tries === 5){
177
+                getLogger('LoginManager').debug('Connection check failed for connection *'+socket.port)
178
+
154 179
                 socket.destroy()
155 180
                 return
156 181
             }
@@ -282,18 +307,37 @@ implements FrontworkComponent<LoginManagerIfc, LoginManagerFeatureIfc>{
282 307
     }
283 308
 
284 309
     startRankServer = async (rank : Rank, port: number) : Promise<RPCServer> => {
310
+
285 311
         const allowedRPCs = await this.getRPCForRank(rank)
286
-        let rpcServer : RPCServer = new RPCServer(port, allowedRPCs, {
287
-            closeHandler: (socket) => { 
288
-                Object.values(this.userLogins)
289
-                    .forEach(login => delete login.connections[socket.port])
290
-
291
-            },
292
-            connectionHandler: (socket) => {
293
-                this.checkConnection(socket).catch(() => {}) //sometimes times out if you go too fast
294
-            },
295
-            sesame: (sesame) => this.checkToken(sesame, rank)
296
-        })
312
+        let rpcServer
313
+        let n = 0
314
+        while(!rpcServer){
315
+            n++            
316
+            await Promise.race([
317
+                new Promise((res, rej) => {
318
+                    rpcServer = new RPCServer(port, allowedRPCs, {
319
+                        closeHandler: (socket) => { 
320
+                            Object.values(this.userLogins)
321
+                                .forEach(login => delete login.connections[socket.port])
322
+            
323
+                        },
324
+                        connectionHandler: (socket) => {
325
+                            this.checkConnection(socket).catch((e) => {
326
+                                console.log(e);
327
+                            }) //sometimes times out if you go too fast
328
+                        },
329
+                        errorHandler: (socket, e, rpcName, args) => {
330
+                            console.log(rpcName, args);
331
+                        },
332
+                        sesame: (sesame) => this.checkToken(sesame, rank)
333
+                    })
334
+                    res()
335
+                }),
336
+                new Promise((res, rej) => setTimeout(res, 500))
337
+            ])
338
+            if(!rpcServer && n>1) 
339
+                getLogger('LoginManager').warn("createServer retry nr.", n, 'port', port)
340
+        }
297 341
         return rpcServer
298 342
     }
299 343
 

+ 18
- 0
src/backend/Components/Login/RPCInterface.ts 查看文件

@@ -0,0 +1,18 @@
1
+import { ILoginManager } from "./Interface"
2
+
3
+export type LoginManagerIfc = {
4
+    Authenticator: {
5
+        checkToken: ILoginManager['checkToken']
6
+        login: ILoginManager['login']
7
+        logout: ILoginManager['logout']
8
+        createUser: ILoginManager['createUser']
9
+        getAuth: ILoginManager['getAuth']
10
+    }
11
+}
12
+
13
+export type LoginManagerFeatureIfc = {
14
+    modifyPermissions: {
15
+        setPermission: ILoginManager['setPermission']
16
+        getPermissions: ILoginManager['getPermissions']
17
+    }
18
+}

+ 10
- 0
src/backend/Components/Raid/Interface.ts 查看文件

@@ -0,0 +1,10 @@
1
+import { User, Raid, Signup } from "../../Types/Types"
2
+
3
+export class IRaidManager{
4
+    getRaids: () => Promise<Raid[]>
5
+    createRaid: (raid:Raid) => Promise<any>
6
+    addSignup: (signup: Signup) => Promise<any>
7
+    removeSignup: (signup: Signup) => Promise<any>    
8
+    getSignups: (raid:Raid) => Promise<Signup[]>
9
+    sign: (user:User, raid:Raid, attending:boolean) => Promise<any>
10
+}

+ 7
- 8
src/backend/Components/Raid/RPCInterface.ts 查看文件

@@ -1,20 +1,19 @@
1
-import { Raid, Signup, User } from "../../Types/Types"
1
+import { IRaidManager } from "./Interface"
2 2
 
3 3
 export type RaidManagerIfc = {
4 4
     RaidManager:{
5
-        getRaids: () => Promise<Raid[]>
5
+        getRaids: IRaidManager['getRaids']
6 6
     }
7 7
 }
8 8
 
9 9
 export type RaidManagerFeatureIfc = {
10 10
     manageRaid: {
11
-        createRaid: (raid:Raid) => Promise<any>
12
-        addSignup: (signup: Signup) => Promise<any>
13
-        removeSignup: (signup: Signup) => Promise<any>    
11
+        createRaid: IRaidManager['createRaid']
12
+        addSignup: IRaidManager['addSignup']
13
+        removeSignup: IRaidManager['removeSignup'] 
14 14
     }
15 15
     signup: {
16
-        getRaids: () => Promise<Raid[]>
17
-        getSingups: (raid:Raid) => Promise<Signup[]>
18
-        sign: (user:User, raid:Raid, attending:boolean) => Promise<any>
16
+        getSignups: IRaidManager['getSignups']
17
+        sign: IRaidManager['sign']
19 18
     }
20 19
 }

+ 6
- 6
src/backend/Components/Raid/RaidManager.ts 查看文件

@@ -1,17 +1,17 @@
1 1
 import { Inject, Module } from "../../Injector/ServiceDecorator";
2 2
 import { RaidManagerIfc, RaidManagerFeatureIfc } from "./RPCInterface";
3 3
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
4
-import { FrontworkAdmin } from "../../Admin/Admin";
5 4
 import { TableDefiniton, Signup, Raid, User } from "../../Types/Types";
6 5
 import { IAdmin } from "../../Admin/Interface";
6
+import { IRaidManager } from "./Interface";
7 7
 
8
-@Module()
8
+@Module(IRaidManager)
9 9
 export class RaidManager
10
-implements FrontworkComponent<RaidManagerIfc, RaidManagerFeatureIfc>{
10
+implements FrontworkComponent<RaidManagerIfc, RaidManagerFeatureIfc>, IRaidManager{
11 11
     name = "RaidManager" as "RaidManager";    
12 12
 
13 13
     @Inject(IAdmin)
14
-    private admin: FrontworkAdmin
14
+    private admin: IAdmin
15 15
 
16 16
     exportRPCs = () => [{
17 17
         name: 'getRaids' as 'getRaids',
@@ -34,7 +34,7 @@ implements FrontworkComponent<RaidManagerIfc, RaidManagerFeatureIfc>{
34 34
         },{
35 35
             name: 'signup' as 'signup',
36 36
             exportRPCs: () => [{
37
-                name: 'getSingups' as 'getSingups',
37
+                name: 'getSignups' as 'getSignups',
38 38
                 call: this.getSignups
39 39
             },{
40 40
                 name: 'sign' as 'sign',
@@ -87,7 +87,7 @@ implements FrontworkComponent<RaidManagerIfc, RaidManagerFeatureIfc>{
87 87
     .select('*')
88 88
     .from('raids')
89 89
     
90
-    getSignups = async (raid:Raid) => await this.admin.knex
90
+    getSignups = async (raid:Raid) : Promise<Signup[]> => await this.admin.knex
91 91
     .select('*')
92 92
     .from('signups')
93 93
     .where('raid_id', '=', raid.id!)

+ 0
- 32
src/backend/Components/User/RPCInterface.ts 查看文件

@@ -1,32 +0,0 @@
1
-import { Auth, Rank, User, RPCPermission, Character } from "../../Types/Types"
2
-import { SpecT } from "../../Types/PlayerSpecs"
3
-
4
-export type LoginManagerIfc = {
5
-    Authenticator: {
6
-        login: (username:string, pwHash:string) => Promise<Auth>
7
-        logout: (username: string, tokenValue :string) => Promise<void>
8
-        getAuth: (tokenValue: string) => Promise<Auth>
9
-        checkToken: (token: string, rank: Rank) => Promise<boolean>
10
-        createUser: (user:User) => Promise<User>
11
-    }
12
-}
13
-
14
-export type LoginManagerFeatureIfc = {
15
-    modifyPermissions: {
16
-        setPermission: (perm: RPCPermission) => Promise<void>
17
-        getPermissions: () => Promise<RPCPermission[]>
18
-    }
19
-}
20
-
21
-export type CharacterManagerIfc = {
22
-    CharacterManager: {
23
-        getSpecId : <c extends keyof SpecT>(clazz: c, name: SpecT[c]) => Promise<number>
24
-        getCharacters : () => Promise<Character[]>
25
-    }
26
-}
27
-
28
-export type CharacterManagerFeatureIfc = {
29
-    createCharacter: {
30
-        createCharacter: (usertoken: string, char : Character) => Promise<Character>
31
-    }
32
-}

+ 9
- 8
src/backend/Injector/Injector.ts 查看文件

@@ -12,7 +12,8 @@ export const Injector = new class {
12 12
 
13 13
   rootInterface : Type<any>
14 14
   root : Type<any>
15
-  rootModules : Type<any>[] = []
15
+  rootModules: Type<any>[] = []
16
+  modules : {ifc?: Type<any>, implementation: Type<any>}[] = []
16 17
 
17 18
   moduleObjs : {[key in string] : FrontworkComponent} = {}
18 19
 
@@ -28,9 +29,11 @@ export const Injector = new class {
28 29
       return this.moduleObjs[target.name] as any
29 30
 
30 31
     if(target.name === this.rootInterface.name || target.name === this.root.name){
31
-      let modules = this.rootModules.map(m => {
32
-        const module = new m()
33
-        this.moduleObjs[m.name] = module
32
+      let modules = this.modules.map(m => {
33
+        const module = new m.implementation()
34
+        if(m.ifc)
35
+          this.moduleObjs[m.ifc.name] = module
36
+        this.moduleObjs[m.implementation.name] = module
34 37
         return module
35 38
       })
36 39
       const rootobj = new this.root(modules);
@@ -42,11 +45,9 @@ export const Injector = new class {
42 45
         if(this.moduleObjs[i.what.name])
43 46
           i.target[i.where] = this.moduleObjs[i.what.name]
44 47
         else
45
-          this.injectionQueue.push()
48
+          this.injectionQueue.push(i)
46 49
       }
47
-      this.injectionQueue.forEach(i => {
48
-        i.target[i.where] = this.moduleObjs[i.what.name]
49
-      })
50
+
50 51
       return rootobj
51 52
     }
52 53
     this.moduleObjs[target.name] = new target()

+ 5
- 2
src/backend/Injector/ServiceDecorator.ts 查看文件

@@ -6,9 +6,12 @@ import { FrontworkComponent } from "../Types/FrontworkComponent";
6 6
  * @returns {GenericClassDecorator<Type<any>>}
7 7
  * @constructor
8 8
  */
9
-export const Module = (...args) : GenericClassDecorator<Type<any>> => {
9
+export const Module = (ifc?: Type<any>) : GenericClassDecorator<Type<any>> => {
10 10
   return (target: Type<any>) => {
11
-    Injector.rootModules.push(target)
11
+    Injector.modules.push({
12
+      ifc: ifc,
13
+      implementation: target
14
+    })
12 15
   }
13 16
 }
14 17
 

+ 1
- 0
src/backend/Launcher.ts 查看文件

@@ -1,5 +1,6 @@
1 1
 import { Injector } from './Injector/Injector';
2 2
 import { IAdmin } from './Admin/Interface';
3
+import "./Admin/Admin"
3 4
 require('events').EventEmitter.defaultMaxListeners = 0;
4 5
 
5 6
 Injector.resolve<IAdmin>(IAdmin).start()

+ 1
- 0
src/backend/Types/FrontworkComponent.ts 查看文件

@@ -20,4 +20,5 @@ export interface FrontworkComponent<
20 20
     getTableDefinitions(): TableDefiniton[] 
21 21
 
22 22
     initialize?(): Promise<any>
23
+    stop?() : Promise<any>
23 24
 }

+ 18
- 8
src/backend/Types/Types.ts 查看文件

@@ -1,8 +1,16 @@
1 1
 import * as Knex from "knex"
2 2
 import { RPCExporter } from "rpclibrary";
3 3
 import { RaidManagerIfc, RaidManagerFeatureIfc } from "../Components/Raid/RPCInterface";
4
-import { LoginManagerIfc, CharacterManagerIfc, LoginManagerFeatureIfc, CharacterManagerFeatureIfc } from "../Components/User/RPCInterface";
4
+import { LoginManagerIfc, LoginManagerFeatureIfc } from "../Components/Login/RPCInterface";
5
+import { CharacterManagerIfc, CharacterManagerFeatureIfc } from "../Components/Character/RPCInterface";
5 6
 
7
+export type FrontcraftIfc = RaidManagerIfc
8
+                          & LoginManagerIfc
9
+                          & CharacterManagerIfc 
10
+
11
+export type FrontcraftFeatureIfc = RaidManagerFeatureIfc 
12
+                                 & LoginManagerFeatureIfc
13
+                                 & CharacterManagerFeatureIfc
6 14
 
7 15
 export declare type NotificationSeverity = 'Info' | 'Important' | 'Error';
8 16
 
@@ -30,6 +38,15 @@ export type RPCPermission = {
30 38
     [rank in Rank] : boolean
31 39
 }
32 40
 
41
+export type Item = {
42
+    id?:number
43
+    name:string
44
+    iconname:string
45
+    url:string
46
+    quality:string
47
+    hidden:boolean
48
+}
49
+
33 50
 export type User = {
34 51
     id?: number
35 52
     name: string
@@ -67,13 +84,6 @@ export type Token = {
67 84
 
68 85
 export type Auth = {port: number, user: User, token: Token}
69 86
 
70
-export type FrontcraftIfc = RaidManagerIfc
71
-                          & LoginManagerIfc
72
-                          & CharacterManagerIfc
73
-
74
-export type FrontcraftFeatureIfc = RaidManagerFeatureIfc 
75
-                                 & LoginManagerFeatureIfc
76
-                                 & CharacterManagerFeatureIfc
77 87
 
78 88
 export type Spec = {
79 89
     id?: number,

正在加载...
取消
保存