Upgrade
Overview
To upgrade io.Manager, you must update the @interopio/manager
, @interopio/manager-admin-ui
, and @interopio/manager-api
packages in your project via npm
.
If you aren't using automatic schema migration for PostgreSQL and Microsoft SQL Server databases, you must create the databases manually by using the provided schema creation scripts.
Unless explicitly stated in the changelog or on this page, all io.Manager packages support backward and forward compatibility between each other and with the io.Connect platforms. This means that older versions of io.Connect Desktop and io.Connect Browser will operate properly with newer versions of io.Manager and vice versa.
⚠️ Note that this section focuses only on versions of the io.Manager packages containing breaking changes and any required migration steps other than updating the packages via
npm
. Before upgrading, it's highly recommended to review the changelog and this section for details about the release to which you want to upgrade and also for all in-between releases. It's important to consider any breaking changes or necessary migration steps related to the packages or to the databases in order to ensure a smoother transition to the targeted version.
@interopio/manager
2.0.0
As of version
2.0.0
, the@interopio/manager
package will be published in the public NPM registry. Previous versions of the package will still be available in the private JFROG registry.io.Manager now requires a license key.️ To acquire a license key, contact us at
sales@interop.io
. Existing customers should contact their Client Success representative to obtain a license key. For more details, see the Requirements > Licensing section.
The license key can be passed to io.Manager via the licenseKey
property of the configuration object for initializing io.Manager, or via the API_LICENSE_KEY
environment variable, depending on your deployment approach.
The following example demonstrates providing the license key when initializing io.Manager:
import { start } from "@interopio/manager";
const config = {
// It's now required to provide a valid license key for io.Manager to operate.
licenseKey: "my-license-key"
};
const server = await start(config);
The following example demonstrates providing the license key by using an environment variable:
API_LICENSE_KEY=my-license-key
Dropped Node.js 18 support. io.Manager now requires Node.js 20 LTS or 22 LTS.
The default value for
skipProcessExitOnStop
is changed totrue
. If you wantprocess.exit()
to be called whenserver.stop()
is called or when the server fails to start, setskipProcessExitOnStop
tofalse
.TypeScript type changes. The following changes will affect only clients who are using TypeScript instead of pure JavaScript.
- When implementing
CustomAuthenticator
, you now have to import the following types from@interopio/manager
instead of@interopio/manager-api
:Token
User
- When implementing
AuditService
, you now have to import the following types from@interopio/manager
instead of@interopio/manager-api
:AuditLog
AuditLogDataResult
CleanAuditLogRequest
DataRequest
User
- When implementing
GroupsService
, you now have to import the following types from@interopio/manager
instead of@interopio/manager-api
:DataRequest
Group
GroupDataResult
GroupsFeatures
User
- The
AuditService.getAll()
method now returnsAuditLogDataResult
instead ofDataResult<AuditLog>
. The types are structurally equivalent. - The types
AuditLogEntityType
andAuditLogOperation
have been converted from TypeScript Union types to TypeScript Enums. - The
@interopio/manager-api
package is no longer required for io.Manager Server deployments and was subsequently dropped as a dependency.
- When implementing
Implementations of
CustomAuthenticator
should always callnext
even when rejecting requests and should not respond to the request directly. Previously, a common pattern forCustomAuthenticator
implementations was rejecting the requests directly:
import type { Request, Response } from "express";
import {
type CustomAuthenticator,
type User,
type Token
} from "@interopio/manager";
export class MyAuthenticator implements CustomAuthenticator {
initialize(): void {};
authenticate(
req: Request,
res: Response,
next: (err?: Error, info?: User) = void,
token?: Token
): void {
const user = this.findUser(req);
if (user) {
// Successful authentication request.
next(undefined, user);
} else {
// Failed authentication request.
res.status(401);
res.send();
return;
};
};
private findUser(req: Request): User {
// Custom authentication logic.
throw new Error("Not implemented.");
};
};
Rejecting the requests directly could cause memory leaks and is therefore not recommended. Instead, implementations of CustomAuthenticator
should import CustomAuthUnauthorizedError
and use it in the following way:
import type { Request, Response } from "express";
import {
type CustomAuthenticator,
type User,
type Token,
CustomAuthUnauthorizedError
} from "@interopio/manager";
export class MyAuthenticator implements CustomAuthenticator {
initialize(): void {};
authenticate(
req: Request,
res: Response,
next: (err?: Error, info?: User) = void,
token?: Token
): void {
const user = this.findUser(req);
if (user) {
// Successful authentication request.
next(undefined, user);
} else {
// Failed authentication request.
next(new CustomAuthUnauthorizedError());
};
};
private findUser(req: Request): User {
// Custom authentication logic.
throw new Error("Not implemented.");
};
};
If you are using an older versions of io.Manager, you can work around this problem by manually defining an error class and passing an instance of it to the next()
function.
ℹ️ For an example of defining an error class and passing it to the
next()
function, see the Custom Authentication example on GitHub.
As of version 2.0.0
, io.Manager will produce warnings when it detects that the authentication pipeline is short-circuited by omitting the call to the next()
function.
- Added a
traceContext
database column to thecommands
table (for PostgreSQL and Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must create the
traceContext
column manually by running the following scripts.For PostgreSQL:
ALTER TABLE commands ADD COLUMN IF NOT EXISTS "traceContext" JSON;
For Microsoft SQL Server:
IF NOT EXISTS ( SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[commands]') AND name = 'traceContext' ) ALTER TABLE commands ADD traceContext NVARCHAR(MAX);
- Changed the type of the
commandParams
database column of thecommands
table toJSON
(for PostgreSQL only).
⚠️ Note that users who don't use automatic schema migration must change the type of the
commandParams
column manually by running the following script:
ALTER TABLE commands ALTER COLUMN "commandParams" TYPE JSON USING "commandParams"::json;
- Changed the precision of the
weight
database column in theglue42SystemConfig
table (for PostgreSQL and Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must change the precision of the
weight
column manually by running the following scripts.For PostgreSQL:
ALTER TABLE "glue42SystemConfig" ALTER COLUMN weight TYPE numeric(8, 6) USING weight::numeric(8, 6);
For Microsoft SQL Server:
ALTER TABLE glue42SystemConfig ALTER COLUMN weight decimal(8, 6);
- Changed the type of the
definition
database column of thelayouts
table toJSON
(for PostgreSQL and Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must change the type of the
definition
column manually by running the following scripts.For PostgreSQL:
ALTER TABLE layouts ALTER COLUMN definition TYPE JSON USING definition::json;
For Microsoft SQL Server:
ALTER TABLE layouts ALTER COLUMN definition NVARCHAR(max) NOT NULL;
- Changed the type of the
comment
database column of thecrashes
table toNVARCHAR(max)
(for Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must change the type of the
comment
column manually by running the following script:
ALTER TABLE crashes ALTER COLUMN comment NVARCHAR(max);
- Changed the types of the
comment
,description
andattachment
database columns of thefeedback
table toNVARCHAR(max)
(for Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must change the type of the columns manually by running the following script:
ALTER TABLE feedback ALTER COLUMN comment NVARCHAR(max); ALTER TABLE feedback ALTER COLUMN description NVARCHAR(max) NOT NULL; ALTER TABLE feedback ALTER COLUMN attachment NVARCHAR(max) NOT NULL;
Monitoring configuration changes:
- Removed
false
,"none"
, and"sentry"
as values for themonitoring
property. Use{ type: "none" }
or{ type: "sentry" }
instead.
- Removed
Sentry monitoring configuration changes:
- Removed the
tracesSampleRate
property from the Sentry monitoring configuration. UsesentryOptions.tracesSampleRate
instead. - Removed the
dsn
property from the Sentry monitoring configuration. UsesentryOptions.dsn
instead. - Tracing via the Sentry SDK is no longer supported. The recommended way to send traces to Sentry is by using OpenTelemetry traces. See also the OpenTelemetry with Sentry example on GitHub.
- Removed the
Removed
["admin"]
as a default value for theAPI_AUTH_EXCLUSIVE_USERS
environment variable. This change doesn't affect users who don't use environment variables for configuring io.Manager as the default value was valid only for theAPI_AUTH_EXCLUSIVE_USERS
environment variable.Due to a change in the FDC3 specification, the
name
anddefinition.name
app properties won't be checked for consistency for FDC3 app definitions. Thename
anddefinition.appId
properties will still be checked. For more details, see the FDC3 Standard 2.1.When using environment variable configuration with
.env
files, values from the.env
files will override the process environment variables. This means that if an environment variable is both defined in the.env
file and passed to the process, the value from the.env
file will be used.
1.7.0
- Added database column
others
to thelast_updated
table (for PostgreSQL and Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must create the
others
column manually by running the following scripts.For PostgreSQL:
ALTER TABLE last_updated ADD COLUMN IF NOT EXISTS others JSON NULL;
For Microsoft SQL Server:
IF NOT EXISTS ( SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[last_updated]') AND name = 'others' ) ALTER TABLE last_updated ADD others NVARCHAR(MAX);
1.6.0
- Added database column
browser
to themachines
table (for PostgreSQL and Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must create the
browser
column manually by running the following scripts.For PostgreSQL:
ALTER TABLE machines ADD COLUMN IF NOT EXISTS browser JSON NULL;
For Microsoft SQL Server:
IF NOT EXISTS ( SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[machines]') AND name = 'browser' ) ALTER TABLE machines ADD browser NVARCHAR(MAX);
1.0.0
Users can now be compared in a case-insensitive way. You can use the
username_case_sensitive
property in the configuration object for initializing the io.Manager Server or theAPI_USERNAME_CASE_SENSITIVE
environment variable to switch between the two modes. The new default is case-insensitive. To switch back to case sensitive mode, set theusername_case_sensitive
property or theAPI_USERNAME_CASE_SENSITIVE
environment variable totrue
.Removed status endpoint. Use
GET /
instead.
@interopio/manager-admin-ui
3.0.0
As of version
3.0.0
, the@interopio/manager-admin-ui
package will be published in the public NPM registry. Previous versions of the package will still be available in the private JFROG registry.Dropped React 17 support. The io.Manager Admin UI now requires React 18. See the React 18 Upgrade Guide and the Admin UI example on GitHub.
Removed the
users
top-level configuration property. Its options will now be implied from theauth
top-level configuration property.If using TypeScript, the
"jsx"
property of the"compilerOptions"
object in thetsconfig.json
file must be set to"react-jsx"
.All io.Manager Admin UI style imports have been combined in one:
// This is the only required style import.
import "@interopio/manager-admin-ui/styles.css";
The @interopio/theme-demo-apps
dependency can be safely removed from your package.json
file. For a complete example, see the Admin UI example on GitHub.
For clients using Auth0 authentication: The
@auth0/auth0-react
package has been updated from v1 to v2. The@auth0/auth0-react
v2 package introduces breaking changes to theauth_auth0
property which accepts a value of typeAuth0ProviderOptions
imported from@auth0/auth0-react
. For more details, see the Auth0-React v2 Migration Guide.For clients using the
manager-admin-ui
docker image: ThePUBLIC_URL
environment variable has been deprecated and won't have any effect. Setting theREACT_APP_BASE
environment variable will be enough for the routing to work correctly.
@interopio/manager-api
4.0.0
TypeScript type changes. The following changes will affect only clients who are using TypeScript instead of pure JavaScript.
- The usage of type
DataResult<T>
has been replaced with several concrete types:AppPreferenceDataResult
AuditLogDataResult
CommandDataResult
ClientCrashDataResult
FeedbackDataResult
GroupDataResult
LayoutDataResult
MachineDataResult
UserSessionDataResult
SystemConfigEntryDataResult
- Removed type alias
GetAppsRequest
- useDataRequest
instead. - Removed type alias
GetCommandsResponse
- useCommandDataResult
instead. - Removed type alias
GetUsersResponse
- useUserDataResult
instead. - The types of the following interface properties have been converted from inline TypeScript Union types to TypeScript Enums:
CleanSessionsAction.action
is now of typeCleanSessionsAction
.UserAppStatus.explain
is now of typeUserAppStatusExplain
.AuditLog.entityType
is now of typeAuditLogEntityType
.AuditLog.operation
is now of typeAuditLogOperation
.Command.status
is now of typeCommandStatus
.Command.resultType
is now of typeResultType
.TextFilterCondition.type
is now of typeTextFilterType
.BooleanFilterCondition.type
is now of typeBooleanFilterType
.NumberFilterCondition.type
is now of typeNumberFilterType
.DateFilterCondition.type
is now of typeDateFilterType
.SortOrder.sort
is now of typeSortOrderEnum
.LogicalCondition.operator
is now of typeLogicalConditionOperator
.
- Removed types
SimpleCondition
andFilter
.
- The usage of type
The
MatchAll
export has been renamed toConfigMatchAll
.