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/managerpackage 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-keyDropped Node.js 18 support. io.Manager now requires Node.js 20 LTS or 22 LTS.
The default value for
skipProcessExitOnStopis changed totrue. If you wantprocess.exit()to be called whenserver.stop()is called or when the server fails to start, setskipProcessExitOnStoptofalse.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/managerinstead of@interopio/manager-api:TokenUser
- When implementing
AuditService, you now have to import the following types from@interopio/managerinstead of@interopio/manager-api:AuditLogAuditLogDataResultCleanAuditLogRequestDataRequestUser
- When implementing
GroupsService, you now have to import the following types from@interopio/managerinstead of@interopio/manager-api:DataRequestGroupGroupDataResultGroupsFeaturesUser
- The
AuditService.getAll()method now returnsAuditLogDataResultinstead ofDataResult<AuditLog>. The types are structurally equivalent. - The types
AuditLogEntityTypeandAuditLogOperationhave been converted from TypeScript Union types to TypeScript Enums. - The
@interopio/manager-apipackage is no longer required for io.Manager Server deployments and was subsequently dropped as a dependency.
- When implementing
In
CustomAuthenticatorimplementations, the value of thereq.urlproperty will now include the value of thebaseproperty provided to io.Manager via configuration. For example, if a request is received for/userandbaseis set to"api", in version 1.8.0 the value ofreq.urlwill be"/user", and in version 2.0.0 the value ofreq.urlwill be"/api/user".Implementations of
CustomAuthenticatorshould always callnexteven when rejecting requests and should not respond to the request directly. Previously, a common pattern forCustomAuthenticatorimplementations 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
traceContextdatabase column to thecommandstable (for PostgreSQL and Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must create the
traceContextcolumn 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
commandParamsdatabase column of thecommandstable toJSON(for PostgreSQL only).
⚠️ Note that users who don't use automatic schema migration must change the type of the
commandParamscolumn manually by running the following script:ALTER TABLE commands ALTER COLUMN "commandParams" TYPE JSON USING "commandParams"::json;
- Changed the precision of the
weightdatabase column in theglue42SystemConfigtable (for PostgreSQL and Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must change the precision of the
weightcolumn 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
definitiondatabase column of thelayoutstable toJSON(for PostgreSQL and Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must change the type of the
definitioncolumn 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
commentdatabase column of thecrashestable toNVARCHAR(max)(for Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must change the type of the
commentcolumn manually by running the following script:ALTER TABLE crashes ALTER COLUMN comment NVARCHAR(max);
- Changed the types of the
comment,descriptionandattachmentdatabase columns of thefeedbacktable 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 themonitoringproperty. Use{ type: "none" }or{ type: "sentry" }instead.
- Removed
Sentry monitoring configuration changes:
- Removed the
tracesSampleRateproperty from the Sentry monitoring configuration. UsesentryOptions.tracesSampleRateinstead. - Removed the
dsnproperty from the Sentry monitoring configuration. UsesentryOptions.dsninstead. - 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_USERSenvironment 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_USERSenvironment variable.Due to a change in the FDC3 specification, the
nameanddefinition.nameapp properties won't be checked for consistency for FDC3 app definitions. Thenameanddefinition.appIdproperties will still be checked. For more details, see the FDC3 Standard 2.1.When using environment variable configuration with
.envfiles, values from the.envfiles will override the process environment variables. This means that if an environment variable is both defined in the.envfile and passed to the process, the value from the.envfile will be used.
1.7.0
- Added database column
othersto thelast_updatedtable (for PostgreSQL and Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must create the
otherscolumn 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
browserto themachinestable (for PostgreSQL and Microsoft SQL Server only).
⚠️ Note that users who don't use automatic schema migration must create the
browsercolumn 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_sensitiveproperty in the configuration object for initializing the io.Manager Server or theAPI_USERNAME_CASE_SENSITIVEenvironment variable to switch between the two modes. The new default is case-insensitive. To switch back to case sensitive mode, set theusername_case_sensitiveproperty or theAPI_USERNAME_CASE_SENSITIVEenvironment 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-uipackage 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
userstop-level configuration property. Its options will now be implied from theauthtop-level configuration property.If using TypeScript, the
"jsx"property of the"compilerOptions"object in thetsconfig.jsonfile 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-reactpackage has been updated from v1 to v2. The@auth0/auth0-reactv2 package introduces breaking changes to theauth_auth0property which accepts a value of typeAuth0ProviderOptionsimported from@auth0/auth0-react. For more details, see the Auth0-React v2 Migration Guide.For clients using the
manager-admin-uidocker image: ThePUBLIC_URLenvironment variable has been deprecated and won't have any effect. Setting theREACT_APP_BASEenvironment 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:AppPreferenceDataResultAuditLogDataResultCommandDataResultClientCrashDataResultFeedbackDataResultGroupDataResultLayoutDataResultMachineDataResultUserSessionDataResultSystemConfigEntryDataResult
- Removed type alias
GetAppsRequest- useDataRequestinstead. - Removed type alias
GetCommandsResponse- useCommandDataResultinstead. - Removed type alias
GetUsersResponse- useUserDataResultinstead. - The types of the following interface properties have been converted from inline TypeScript Union types to TypeScript Enums:
CleanSessionsAction.actionis now of typeCleanSessionsAction.UserAppStatus.explainis now of typeUserAppStatusExplain.AuditLog.entityTypeis now of typeAuditLogEntityType.AuditLog.operationis now of typeAuditLogOperation.Command.statusis now of typeCommandStatus.Command.resultTypeis now of typeResultType.TextFilterCondition.typeis now of typeTextFilterType.BooleanFilterCondition.typeis now of typeBooleanFilterType.NumberFilterCondition.typeis now of typeNumberFilterType.DateFilterCondition.typeis now of typeDateFilterType.SortOrder.sortis now of typeSortOrderEnum.LogicalCondition.operatoris now of typeLogicalConditionOperator.
- Removed types
SimpleConditionandFilter.
- The usage of type
The
MatchAllexport has been renamed toConfigMatchAll.