mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-14 15:24:52 +09:00
The lib library was written with the assumption that there's only one copy of it in the whole application and everything imports that one copy. Unfortunately there are quite a few circumstances were package managers end up installing multiple copies of lib and then different parts use different versions of the library. This causes Clusterio to break with strange and hard to track down errors. Most notably permissions and link messages for a plugin may get registered to one copy of lib while the controller uses a different copy and thus does not see or register that what the plugin added exists. Detect this condition when importing @clusterio/lib and throw an error when it has been imported twice in order to prevent the broken installation from causing future hard to debug issues.
22 lines
788 B
TypeScript
22 lines
788 B
TypeScript
import { InstallationError } from "./errors";
|
|
declare global {
|
|
// eslint-disable-next-line vars-on-top
|
|
var _clusterioLibImportedFrom: string;
|
|
}
|
|
|
|
export function checkSingletonImport(location: string) {
|
|
if (!global._clusterioLibImportedFrom) {
|
|
global._clusterioLibImportedFrom = location;
|
|
} else {
|
|
throw new InstallationError(`Attempt to import duplicate copy of @clusterio/lib
|
|
|
|
Importing more than one copy of @clusterio/lib into the same runtime
|
|
will break Clusterio. This typically happens when the package
|
|
manager has installed two different versions of @clusterio/lib
|
|
and assigned different ones to different components of Clusterio.
|
|
|
|
Previously imported @clusterio/lib was located at ${_clusterioLibImportedFrom}
|
|
This copy of @clusterio/lib is located at ${location}`);
|
|
}
|
|
}
|