Commit Graph
187 Commits
Author SHA1 Message Date
Hornwitser 123148e277 Fix pending request not deleted on response
Fix memory leak due to the recorded _pendingRequests entry for a request
not being deleted when the response for the request has been received.
2024-01-22 20:48:01 +01:00
Hornwitser 72264f0c53 Add suport for color mod setting (#568)
Implement the color-setting type in ModPack and display a color picker
for it in the Web UI. This type of setting was added in Factorio 1.1.77.
2024-01-21 23:48:26 +01:00
Hornwitser c53781d16c Add time unit suffixes to variables (#561)
Add suffixes like Ms and Ns to variables whos time unit is not in
seconds.  This is aligning with a new code style of putting units
on variables that are not in SI base units.
2024-01-20 13:26:55 +01:00
Hornwitser b0f6c95fca Move export for plugin declaration (#555)
Change the expected exported name of plugin declarations to be "plugin"
at the main entrypoint instead of the default export.  This makes the
plugin's code organisation more flexible especially when using CommonJS
JavaScript modules as they can export additional symbols from the
plugin declaration file.
2024-01-18 20:31:52 +01:00
Hornwitser 8884116ee9 Implement stop and restart of controller/hosts (#554)
Implement remotely initiated stopping and restarting of the controller
and hosts.  Restarting is implemented by exiting with a non-zero exit
code and relying on a process manager to start the procress again.  To
prevent accidentally trying to restart on a system that doesn't have a
process manager present the --can-restart command line option needs to
be passed to enable the restart operation.
2024-01-18 16:10:42 +01:00
Hornwitser 527c98d378 Add first join at player statistic (#551)
Record the time a player was first seen joining an instance in
PlayerStats.  For existing stats this value is set to the last
joined time when it is first loaded.
2024-01-17 20:29:30 +01:00
HornwitserandCooldude2606 4628e0ad59 Fix incorrect test description for SystemInfo
Co-authored-by: Cooldude2606 <25043174+Cooldude2606@users.noreply.github.com>
2024-01-17 06:46:18 +01:00
Hornwitser de47989527 Add system info to SystemInfo
Provide the kernel, machine, CPU Model, hostname, and Node.js version
fields to SystemInfo and display them in the Web UI.  These were added
as metrics exposed to prometheus in b46efeb.
2024-01-16 21:27:02 +01:00
Hornwitser 4e36fa1b4e Rename SystemMetrics to SystemInfo
There are more pieces of information about a system than just its CPU,
Memory and disk metrics.  To avoid having to build a separate collection
and subscription for metrics and system info, rename the existing system
metrics to system info in anticipation of providing additonal static
system information such as CPU model in it.
2024-01-16 21:27:02 +01:00
Hornwitser 705fb90740 Remove agent string
The agent string was inspired by the HTTP User-Agent header to serve as
a way to identify what's connecting to the cluster.  While there may
have been vision of other software connecting to a controller than the
Clusterio provided ones this seems highly unlikely to ever happen.

Remove redundant agent string for now.
2024-01-15 03:49:41 +01:00
Hornwitser d2861c4457 Add tests for derived SystemMetrics 2024-01-15 03:27:37 +01:00
Hornwitser ae2c5cf98e Implement power of two size suffies for memory
Memory sizes are usually written using the prefixes with a base of 1024
instead of 1000.  Implment formatting of the power of two based prefixes
for displaying memory sizes.
2024-01-14 09:57:44 +01:00
Hornwitser 9742eb1645 Add parser for simple range expression
Implement parsing of ranges of the form "1, 3-5" into a set of all the
numbers it represents.
2024-01-11 00:19:19 +01:00
Hornwitser e74065a493 Remove config groups
Refactor away the config group concept and simplyfy the way config
fields are defined.  Fields are defined directly as properties of the
static field fieldDefinitions on the class itself with a separate
interface to declare the types of fields.

This makes it possible to easily make accessing the config fields type
checked in a way that lets plugins extend the interfaces with their own
config options by adding additional fields to the interface via
declation merging.
2024-01-09 02:19:07 +01:00
Hornwitser 001db4befe Refactor config to JSON data class pattern
Refactor the Config and ConfigGroup classes to match the JSON data class
pattern with toJSON, toRemote and fromJSON methods replacing the load,
init, and serialize methods.  Since fromJSON requires extra information
the messages structures passes around the plain JSON representation of
the configs instead of serialising instances of the config classes
automatically.
2024-01-06 19:53:32 +01:00
Hornwitser 27af142a87 Remove silly support for async initial_value
This complicates the handling of configs for no good reason.
2024-01-06 19:49:35 +01:00
Hornwitser 6d840fc1e7 Remove redundant .pop() in test 2023-12-20 22:32:12 +01:00
Hornwitser c62ea697fe Fix typos 2023-12-20 22:29:44 +01:00
Hornwitser 8c17adf15b Refactor EventSubscriber to track its resource
Process updates of the resource EventSubscriber are subscribed to and
have it keep a mapping of id to value syncronised with event provider as
long as there are subscription callbacks registered with it.  The
mapping is kept around after the last callback is unsubscribed so that
it can be efficiently resynced with the resource based on the updatedAt
timestaps of individual elements.

This allows the EventSubscriber to provide the right building blocks to
provide its values to React components via the the useSyncExternalStore
hook.  This in turn greatly simplifies the web_ui models for the
subscribed resources.
2023-12-12 23:40:29 +01:00
Hornwitser ddba58ca99 Require control in EventSubscriber.constructor
Reduce complexity in the implementation of EventSubscriber by requiring
a control link be passed to its constructor.  This is possible after the
change in 8c724e3 made the web interface control instance available to
plugins at init time.
2023-12-11 23:14:37 +01:00
Hornwitser 6cab1fa842 Remove SubscriptionResponse
Since subscriptions are handlede per link there's no need for the
eventReplay to be returned as a part of the SubscriptionRequest, it can
be sent and processed normally as an event.  Simplify the logic by
sending eventReplay as an event and remove SubscriptionResponse.
2023-12-11 21:47:15 +01:00
Hornwitser 4439691695 Decouple SubscriptionController from Controller
Remove the reliance a reference to the Controller to get the link that a
subscription is tied to by explicitly handling the SubscriptionRequest
and passing the link to the SubscriptionController.
2023-12-11 21:47:15 +01:00
Hornwitser 1d729adbb7 Move responsibility of handling unsubscription on close
Notify the SubscriptionController that a connection closed from the
Connection instead of having the subscription controller set up an event
to do so.  This simplifies the logic on the SubscriptionController's
side.
2023-12-11 21:47:15 +01:00
Hornwitser 0c4387769e Use -1 as the default lastResponseTime
Entites that didn't have an updatedAt time at the time of creation will
default to having one set to 0.  Since entities with an updatedAt time
greater than lastResponseTime is expected to be returned this means that
these entities would not be included when a client does its initial sync
subscribing to a resource.  Change the default lastResponseTime
requested so that these entities are included.
2023-12-11 20:21:43 +01:00
Hornwitser f12a9926eb Add isDeleted and updatedAt to subscribable types
Prepare for subscriptinos being able to be cached and resumed by adding
updatedAt and isDeleted fields to the subscribable types.
2023-12-08 18:22:34 +01:00
Hornwitser 58914042cc Remove channels to simplify subscription
Make subscriptions either on or off to greatly simplify the logic of
subscribing to events.
2023-12-03 20:32:48 +01:00
Hornwitser 94d67cef71 Add AsyncSerialCallback helper
Add helper to serialise the calls made to an async function such that no
overlapping invocations happen to the async function by queue up calls
made while it's running to continue after it's running.
2023-12-03 00:01:23 +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 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 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 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 f23e442c4c Ignore BOM in locale files
Ignore BOM at the start of Factorio locale files as this is a thing
Factorio also does.

Fixes #507
2023-11-24 20:53:16 +01:00
Cooldude2606 23ba5d612a Fixed failing tests for unsubscribe 2023-10-06 18:56:27 +01:00
Cooldude2606 11d820b085 Increase patch coverage 2023-09-07 22:31:09 +01:00
Cooldude2606 621f850804 Some cleanup 2023-09-07 21:36:27 +01:00
Cooldude2606 2afddafe4d All tests passing 2023-09-07 20:54:21 +01:00
Cooldude2606 2c9050824e Test suite mostly ready 2023-09-07 03:36:38 +01:00
Cooldude2606 cccb27c733 Add test skeleton 2023-09-06 21:16:31 +01:00
Luciole 50f12c719b Port global_chat plugin to typescript (#497)
* .js to .ts

* translate

* update paths to dist/plugin

* add "tsc --build" to prepare

* use field main in package.json de find info

* tsc --build need to append before webpack

* update test and use for plugins package.main
2023-08-18 00:06:49 +02:00
Hornwitser 115cb3fd5d Fix path slash issue in plugin loader test
On Windows require paths use a mix of forward and backward slashes due
to require path possibly being a package path which can't have backward
slashes, or a Windows file path which can have have either.  Fix plugin
loader test failing on Windows due to not using the same combination of
forward and backward slashes for require file paths.
2023-08-15 18:44:53 +02:00
Hornwitser a66e930997 Use strict type checking 2023-08-12 02:31:17 +02:00
Hornwitser 2a52a82fb7 Port message types to TypeScript 2023-08-11 00:24:00 +02:00
Hornwitser 15ea9a91dc Port basic lib sub-modules to TypeScript 2023-08-06 18:38:20 +02:00
Hornwitser 6af25e085c Move Factorio server implementation to host
Move Factorio related code in lib that's only used by the host into the
host package.
2023-07-28 16:03:29 +02:00
Hornwitser bfe119eaa3 Flatten lib namespace
Move all functions and classes currently available through lib/name and
libName to be under a single flat namespace in lib.  This make
reorganising the lib namespace much simpler as the location of symbols
can move without breaking the consumers of lib.

The multi-entrypoint design was already problematic for the web plugin
system which couldn't effectively use it due to how webpack's shared
module system is awkward to set up with multiple entrypoints per package.
2023-07-28 16:03:29 +02:00
Hornwitser 156d517976 Prefer putting nested structures on new lines
Format arguments to have nested structures start on a new line instead
of inline to make it easier to see where the structures starts and what
structure it is.
2023-07-26 14:27:49 +02:00
Hornwitser 87172dfb8d Implement basic ingress filtering on controller
Validate messages received on the controller from hosts and control
nodes before handling or forwarding them.  This should prevent
performing actions that are not allowed by the role system and block
simple attacks such as spoofing the source address of a message.
2023-07-25 17:21:44 +02:00