Commit Graph
77 Commits
Author SHA1 Message Date
Hornwitser 94cb607930 Improve typing of various controller entities 2023-12-03 19:59:14 +01:00
Hornwitser ec734c92bc Fix bad typings detected by linting
Fix badly typed expressions that were detected by turning on
`@typescript-eslint/no-unnecessary-condition` in eslint.
2023-12-02 01:47:02 +01:00
Hornwitser 90a88f7e01 Fix /api/plugins leaking filesystem paths
Replace PluginWebApi's requirePath member with npmPackage which is only
populated if the package is not marked as private and the requirePath
matches the name. This prevents the public /api/plugins endpoint from
leaking filesystem paths into the controller.
2023-12-02 01:43:28 +01:00
Hornwitser 11ffee646e Add the other packages to typedoc output
Add controller, host, ctl, and web_ui packages to the typedoc output.
2023-12-02 01:43:28 +01:00
Hornwitser e453a80155 Refactor User and Role into data classes (#531)
Use the JSON data class pattern for User, Role, and PlayerStats and move
them into lib/src/data.  This means that User is purely data now and
can't reference role objects directly.  To make it possible easily check
permissions attached to roles and store data only visible on the
controller on user objects a ControllerUser type is introduced which is
linked with the UserManager and can therefore reference role objects
directly.

Resolves #525.
2023-12-02 01:41:43 +01:00
Hornwitser f802e6ba67 Merge pull request #527 from Hornwitser/autosave-data
Implement autosaving of data held in memory
2023-12-01 02:30:54 +01:00
Hornwitser ab52cc35bf Provide controller resources at construction time
Load hosts, instances, mod packs, mods and users before constructing the
Controller instances.  This allows these resources to be correctly typed
as always available and prevents any possibility of save being initiated
on these resources before they are loaded.
2023-11-30 18:31:42 +01:00
Hornwitser a0b02ee68b Separate updates of Instance and InstanceDetails
Some updates for instances trigger instance details updates, while other
updates to instances are not visible on instance details. Rename
instanceUpdated to instanceDetailsUpdated to better represent what it
does and only set instancesDirty when an update is made to the
instances.
2023-11-30 15:01:14 +01:00
Hornwitser fae6ed3297 Implement serial calls to save with a helper
Separate out the serialisation of the invocations to saveData with an
AsyncSerialMergingCallback helper than has unit tests covering its
functionality.
2023-11-30 01:57:18 +01:00
Hornwitser d5bcd34cdb Use .tmp before the file extension (#529)
When creating temporary files use the pattern `.tmp.ext` instead of
`.ext.tmp` to be consistent with Factorio which creates `.tmp.zip` files
during saving.

If patching fails this will leave a `.tmp.zip` file in the instance saves
directory which is ignored by the default save selector.

Resolves #486.
2023-11-30 01:21:06 +01:00
Hornwitser ffe5040644 Implement autosaving of data held in memory
Add controller.autosave_interval config that specifies the frequency
which controller config, hosts, instances, users, mod packs and plugin
specific data which is held in memory should be automatically flushed to
disk if they have changed since the last time they were saved.  This
prevents data loss in the event of a server crash.

Plugins can use the onSaveData hook to save its own data at the same
time as the controller does and this obsoletes making an autosave
interval in the plugin.

Resolves #523.
2023-11-29 20:18:50 +01:00
Hornwitser 1434ede2dc Improve error reporting when web_ui fails to load
Catch uncaught errors and display the error message on the page itself
if bootstraping fails. This should prevent most cases of the of the web
interface being stuck on "Loading web interface..." after an error was
thrown and the loading failed.
2023-11-29 19:01:46 +01:00
Hornwitser f1edbd78cb Move dist/web_build inside dest/web
By default webpack-dev-middleware will refuse to delete files outside of
its working directory. This becomes dist/web in the configuration
currently set up, which means that a rebuild triggered on the watched
files will fail when declaration files are output to to dist/web_build.

Fix by moving dist/web_build to dist/web/build.
2023-11-29 18:02:27 +01:00
Hornwitser 6a404d9fb3 Refactor and port plugin web code to TypeScript
Clean up the configuration for compiling TypeScript for the Web
interface to us its own tsconfig.web.json config files and reference the
TypeScript source files directly in the configuration and imports
instead of files compiled to dist.

To properly support recompliation with TypeScript's projects feature
each package's tsconfig.web.json file is set to output the build to
dist/web_build which is then ignored in .npmignore.  Webpack is still
used to create the proper build in dist/web, so this is mainly to make
TypeScipt's compiler happy but it also allows the root tsconfig.json
file to include the web interface code, meaning running the build script
now also checks the typing of the web interface.

Final part of #491.
2023-11-28 15:52:54 +01:00
Hornwitser ceb7e48c99 Fix global declaration of staticRoot and webRoot
These variables were intended to be globals declare in the global
namespace. That this ends up on the window object is an implementation
detail of JavaScript. Remove the window. prefix put in front of
staticRoot and webRoot and include the global declaration in the
TypeScript module.
2023-11-28 15:35:40 +01:00
Hornwitser 9df6717364 Move PluginWebApi to lib
Resolve circular dependency of controller depending on web_ui and web_ui
depending on controller by moving the type from controller that was used
in web_ui to lib.
2023-11-28 14:48:06 +01:00
Hornwitser 654df76065 Strongly type invokeHook
Add strong typing of the invokeHook function to prevent incorrect
paramaters being passed to plugin hooks. This detected a few places
where the parameters passed were incorrect.
2023-11-28 14:28:22 +01:00
Hornwitser e3e5867d60 Fix PlayerEvent being completely broken
Fix the name being passed as the type when deserialising the event, the
stats being missing, and incorrect parameters passed to plugins.
2023-11-28 14:28:22 +01:00
Hornwitser b9c3458cc2 Fix onMetrics using the wrong iteration type 2023-11-28 14:07:38 +01:00
Hornwitser 808eda0513 Move base plugins to their respective packages
Move BaseControllerPlugin to controller/src/BaseControllerPlugin.ts
Move BaseInstancePlugin to host/src/BaseInstancePlugin.ts
Move BaseControlPlugin to ctl/src/BaseCtlPlugin.ts
Move BaseWebPlugin to web_ui/src/BaseWebPlugin.ts

This solves the circular package dependency problem of the base plugins
needing types that are available only in the dependencies to lib.
2023-11-25 18:41:43 +01:00
Hornwitser 87e52b804e Convert JSON file indents to tabs
Be consistent with the usage of tabs as indents in all JSON files in the
project.  This makes it easier to configure editors to emit the right
indents when manually editing these files.
2023-11-25 18:19:15 +01:00
Hornwitser d47fd20926 Fix --dev broken after 7517917 2023-11-24 21:11:56 +01:00
Hornwitser 142cf8a626 Fix log splitting not happening on UTC boundnary 2023-11-24 20:53:16 +01:00
Hornwitser 0de70df472 Move dev server logic out of _startInternal
Break out the logic for setting up the webpack dev server into its own
method to reduce the complexity of _startInternal.
2023-11-20 13:46:51 +01:00
Hornwitser 7517917832 Move controller's TypeScript output to dist
Be consistent with the other packages and set the controller's
TypeScript compilation outDir to dist instead of dist/controller.
2023-11-20 13:46:25 +01:00
Hornwitser af9ed19af0 Setup typescript-eslint
Configure eslint to work with TypeScript via the typescript-eslint
plugin.
2023-11-19 04:50:07 +01:00
Hornwitser b78ca31b09 Add typing for serialized collector type
Setup TypeScript tyings and JSON schema for serializeResult and
deserializeResult and use these in the metrics related requests.
2023-11-19 04:50:07 +01:00
Hornwitser b66138587b Move exposition content type to its own var
Remove anti-pattern of setting properties on Function object that is
difficult to document.
2023-11-19 04:50:07 +01:00
Hornwitser 80e1904175 Fix bad typings left over from the migration 2023-11-19 04:50:07 +01:00
Hornwitser 7314dc99c8 Fix code style errors
Remove extra whitespace, use more consistent spacing, add missing
semicolons, using dangling commas, break up long lines, consistent
multiline operator placement, add missing JSDoc strings and so on.
2023-11-19 04:48:38 +01:00
Hornwitser 2c9b07b8d6 Add subscription handlers in constructor
Move the calls to add subscrition handlers into the constructor of
Controller to reduce the amount of code in the start logic.
2023-11-18 22:12:14 +01:00
Hornwitser 60f09b11f9 Merge pull request #510 from Cooldude2606/refactor/subscriptions
Refactor/subscriptions - Create a generalized event subscription class
2023-10-13 14:45:44 +02:00
Hornwitser d58602f1a1 Fix merge conflicts 2023-10-12 17:21:56 +02:00
Luciole e2dea35e02 allow to revoke host tokens from web ui (#511)
* allow to revoke / restore host access from web ui

* refector to what is expected

* remove core.admin check on HostViewPage.tsx

* update core.host.revoke_token description
2023-09-29 19:50:14 +02:00
Cooldude2606 2afddafe4d All tests passing 2023-09-07 20:54:21 +01:00
Cooldude2606 71166af75b Fixed TestControl subscription requests 2023-09-06 01:09:02 +01:00
Cooldude2606 da25196830 Refactor to use subsribers 2023-09-05 01:46:45 +01:00
Luciole 838170a9ff Port packages/web_ui to TypeScript (#508)
* .jsx to .tsx

* controller: tsc --build before webpack-cli

* Type Annotation

* disabled move into the <Input/> and <Checkbox/>

* cleanup debug left over

* documentation

* default ModPack

* modPackUpdateHandlers no undefined

* PluginInfo changes proposition

* PluginInfo changes proposition miss

* ModRecord & ModInfo feedback loop at const mods = [ ?

* ["connect", "drop", "resume", "close"] as const

* .tsx to .ts when possible
2023-09-02 14:51:35 +02:00
Hornwitser 425daac6b6 Set up references in TSConfig
Link the projects together properly so that builds don't use out of date
files and editor "go to definition" function give the right file.
2023-08-26 17:11:47 +02:00
Hornwitser c3d78a8cb8 Organise TSConfig files using inheritance
Removed duplicated TSConfig options by using a shared base config which
all plugins inherit shared settings from.
2023-08-26 17:11:46 +02:00
Hornwitser 6d1ff4c178 Fix web interface broken by TypeScript porting 2023-08-25 15:25:43 +02:00
Hornwitser 94fbb8a92f Rename MessageSrcDst to MessageRoutable 2023-08-17 16:47:09 +02:00
Hornwitser 9c9adf7c8e Use return type deduction for timers
Fix updates to Node.js timers types breaking the TypeScript build by
deducing the correct type from the return type of the
setTimeout/setInterval functions.
2023-08-15 18:01:27 +02:00
Luciole e59027f557 don't cast filename to string 2023-08-14 22:27:35 +02:00
Luciole f2736bae40 tsconfig update; fix function signature; test: add .default 2023-08-14 14:34:56 +02:00
Luciole a26dcf5075 defaultRoleId: explicitly check for null 2023-08-14 13:31:55 +02:00
Luciole 8108fcac81 update package.json to fix test running and import version 2023-08-14 11:56:41 +02:00
Luciole 8256f06a6a update QueryLogFilter: make maxLevel optional 2023-08-14 11:29:24 +02:00
Luciole 25e65910dd Controller: back to hosts, instances, modPacks, mods init to null 2023-08-14 11:26:48 +02:00
Luciole ef32f6f466 .closing > .connector.closing 2023-08-14 11:03:44 +02:00