diff --git a/.github/actions/build-docker/action.yml b/.github/actions/build-docker/action.yml index 77ebf4aa3ad03..6f9341c17b183 100644 --- a/.github/actions/build-docker/action.yml +++ b/.github/actions/build-docker/action.yml @@ -100,6 +100,8 @@ runs: find /tmp/build/bundle/programs/server/npm/node_modules/@esbuild -type d -name 'linux-*' -not -name "*-${swc_arch}" -exec rm -rf {} + find /tmp/build/bundle/programs/server/npm/node_modules/@rocket.chat/apps-engine/node_modules/@esbuild -type d -name 'linux-*' -not -name "*-${swc_arch}" -exec rm -rf {} + + + find /tmp/build/bundle/programs/server/npm/node_modules/@rocket.chat/apps/node_modules/@esbuild -type d -name 'linux-*' -not -name "*-${swc_arch}" -exec rm -rf {} + fi if [[ "$INPUT_PUBLISH_IMAGE" == 'true' ]]; then diff --git a/apps/meteor/app/apps/server/bridges/activation.ts b/apps/meteor/app/apps/server/bridges/activation.ts index 399dfd285e65e..b22aeac49b220 100644 --- a/apps/meteor/app/apps/server/bridges/activation.ts +++ b/apps/meteor/app/apps/server/bridges/activation.ts @@ -1,11 +1,10 @@ import type { IAppServerOrchestrator, AppStatus } from '@rocket.chat/apps'; -import type { ProxiedApp } from '@rocket.chat/apps-engine/server/ProxiedApp'; -import { AppActivationBridge as ActivationBridge } from '@rocket.chat/apps-engine/server/bridges/AppActivationBridge'; +import type { ProxiedApp } from '@rocket.chat/apps/dist/server/ProxiedApp'; +import { AppActivationBridge as ActivationBridge } from '@rocket.chat/apps/dist/server/bridges/AppActivationBridge'; import { UserStatus } from '@rocket.chat/core-typings'; import { Users } from '@rocket.chat/models'; export class AppActivationBridge extends ActivationBridge { - // eslint-disable-next-line no-empty-function constructor(private readonly orch: IAppServerOrchestrator) { super(); } diff --git a/apps/meteor/app/apps/server/bridges/api.ts b/apps/meteor/app/apps/server/bridges/api.ts index f115897c82d82..4e117855615ed 100644 --- a/apps/meteor/app/apps/server/bridges/api.ts +++ b/apps/meteor/app/apps/server/bridges/api.ts @@ -1,8 +1,8 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { ApiBridge } from '@rocket.chat/apps/dist/server/bridges/ApiBridge'; +import type { AppApi } from '@rocket.chat/apps/dist/server/managers/AppApi'; import type { RequestMethod } from '@rocket.chat/apps-engine/definition/accessors'; import type { IApiRequest, IApiEndpoint, IApi } from '@rocket.chat/apps-engine/definition/api'; -import { ApiBridge } from '@rocket.chat/apps-engine/server/bridges/ApiBridge'; -import type { AppApi } from '@rocket.chat/apps-engine/server/managers/AppApi'; import type { Response, Request, IRouter, RequestHandler } from 'express'; import express from 'express'; import { Meteor } from 'meteor/meteor'; diff --git a/apps/meteor/app/apps/server/bridges/bridges.js b/apps/meteor/app/apps/server/bridges/bridges.js index 3b49cd91394e9..4205c2afa91bc 100644 --- a/apps/meteor/app/apps/server/bridges/bridges.js +++ b/apps/meteor/app/apps/server/bridges/bridges.js @@ -1,4 +1,4 @@ -import { AppBridges } from '@rocket.chat/apps-engine/server/bridges'; +import { AppBridges } from '@rocket.chat/apps/dist/server/bridges/AppBridges'; import { AppActivationBridge } from './activation'; import { AppApisBridge } from './api'; diff --git a/apps/meteor/app/apps/server/bridges/cloud.ts b/apps/meteor/app/apps/server/bridges/cloud.ts index 0f908ccfe0a39..83d9f98311c1b 100644 --- a/apps/meteor/app/apps/server/bridges/cloud.ts +++ b/apps/meteor/app/apps/server/bridges/cloud.ts @@ -1,6 +1,6 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { CloudWorkspaceBridge } from '@rocket.chat/apps/dist/server/bridges/CloudWorkspaceBridge'; import type { IWorkspaceToken } from '@rocket.chat/apps-engine/definition/cloud/IWorkspaceToken'; -import { CloudWorkspaceBridge } from '@rocket.chat/apps-engine/server/bridges/CloudWorkspaceBridge'; import { getWorkspaceAccessTokenWithScope } from '../../../cloud/server'; diff --git a/apps/meteor/app/apps/server/bridges/commands.ts b/apps/meteor/app/apps/server/bridges/commands.ts index 0f378a4a7abc4..36eaaed5f047d 100644 --- a/apps/meteor/app/apps/server/bridges/commands.ts +++ b/apps/meteor/app/apps/server/bridges/commands.ts @@ -1,7 +1,7 @@ import type { IAppServerOrchestrator, IAppsRoom, IAppsUser } from '@rocket.chat/apps'; +import { CommandBridge } from '@rocket.chat/apps/dist/server/bridges/CommandBridge'; import type { ISlashCommand, ISlashCommandPreview, ISlashCommandPreviewItem } from '@rocket.chat/apps-engine/definition/slashcommands'; import { SlashCommandContext } from '@rocket.chat/apps-engine/definition/slashcommands'; -import { CommandBridge } from '@rocket.chat/apps-engine/server/bridges/CommandBridge'; import type { IMessage, RequiredField, SlashCommand, SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { Utilities } from '../../../../ee/lib/misc/Utilities'; diff --git a/apps/meteor/app/apps/server/bridges/contact.ts b/apps/meteor/app/apps/server/bridges/contact.ts index 802b0bb3ec16b..fa00a839c6a4e 100644 --- a/apps/meteor/app/apps/server/bridges/contact.ts +++ b/apps/meteor/app/apps/server/bridges/contact.ts @@ -1,6 +1,6 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { ContactBridge } from '@rocket.chat/apps/dist/server/bridges/ContactBridge'; import type { ILivechatContact } from '@rocket.chat/apps-engine/definition/livechat'; -import { ContactBridge } from '@rocket.chat/apps-engine/server/bridges'; import { addContactEmail } from '../../../livechat/server/lib/contacts/addContactEmail'; import { verifyContactChannel } from '../../../livechat/server/lib/contacts/verifyContactChannel'; diff --git a/apps/meteor/app/apps/server/bridges/details.ts b/apps/meteor/app/apps/server/bridges/details.ts index 3930cdd451cc7..03f25d9f6d05b 100644 --- a/apps/meteor/app/apps/server/bridges/details.ts +++ b/apps/meteor/app/apps/server/bridges/details.ts @@ -1,6 +1,6 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { AppDetailChangesBridge as DetailChangesBridge } from '@rocket.chat/apps/dist/server/bridges/AppDetailChangesBridge'; import type { ISetting } from '@rocket.chat/apps-engine/definition/settings'; -import { AppDetailChangesBridge as DetailChangesBridge } from '@rocket.chat/apps-engine/server/bridges/AppDetailChangesBridge'; export class AppDetailChangesBridge extends DetailChangesBridge { constructor(private readonly orch: IAppServerOrchestrator) { diff --git a/apps/meteor/app/apps/server/bridges/email.ts b/apps/meteor/app/apps/server/bridges/email.ts index 6d75a45044832..8f984b7bb6ce2 100644 --- a/apps/meteor/app/apps/server/bridges/email.ts +++ b/apps/meteor/app/apps/server/bridges/email.ts @@ -1,6 +1,6 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { EmailBridge } from '@rocket.chat/apps/dist/server/bridges/EmailBridge'; import type { IEmail } from '@rocket.chat/apps-engine/definition/email'; -import { EmailBridge } from '@rocket.chat/apps-engine/server/bridges'; import * as Mailer from '../../../mailer/server/api'; import { settings } from '../../../settings/server'; diff --git a/apps/meteor/app/apps/server/bridges/environmental.ts b/apps/meteor/app/apps/server/bridges/environmental.ts index 705a27186dee7..c79ffbe9f6cf5 100644 --- a/apps/meteor/app/apps/server/bridges/environmental.ts +++ b/apps/meteor/app/apps/server/bridges/environmental.ts @@ -1,5 +1,5 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; -import { EnvironmentalVariableBridge } from '@rocket.chat/apps-engine/server/bridges/EnvironmentalVariableBridge'; +import { EnvironmentalVariableBridge } from '@rocket.chat/apps/dist/server/bridges/EnvironmentalVariableBridge'; export class AppEnvironmentalVariableBridge extends EnvironmentalVariableBridge { allowed: Array; diff --git a/apps/meteor/app/apps/server/bridges/experimental.ts b/apps/meteor/app/apps/server/bridges/experimental.ts index d505a54d5665d..fea16f9cb8a82 100644 --- a/apps/meteor/app/apps/server/bridges/experimental.ts +++ b/apps/meteor/app/apps/server/bridges/experimental.ts @@ -1,5 +1,5 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; -import { ExperimentalBridge } from '@rocket.chat/apps-engine/server/bridges'; +import { ExperimentalBridge } from '@rocket.chat/apps/dist/server/bridges/ExperimentalBridge'; export class AppExperimentalBridge extends ExperimentalBridge { constructor(protected readonly orch: IAppServerOrchestrator) { diff --git a/apps/meteor/app/apps/server/bridges/http.ts b/apps/meteor/app/apps/server/bridges/http.ts index cd297009c4afc..f3bb6c502a426 100644 --- a/apps/meteor/app/apps/server/bridges/http.ts +++ b/apps/meteor/app/apps/server/bridges/http.ts @@ -1,7 +1,7 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import type { IHttpBridgeRequestInfo } from '@rocket.chat/apps/dist/server/bridges/HttpBridge'; +import { HttpBridge } from '@rocket.chat/apps/dist/server/bridges/HttpBridge'; import type { IHttpResponse } from '@rocket.chat/apps-engine/definition/accessors'; -import type { IHttpBridgeRequestInfo } from '@rocket.chat/apps-engine/server/bridges'; -import { HttpBridge } from '@rocket.chat/apps-engine/server/bridges/HttpBridge'; import { serverFetch as fetch, type ExtendedFetchOptions } from '@rocket.chat/server-fetch'; import { censorUrl } from '@rocket.chat/tools'; diff --git a/apps/meteor/app/apps/server/bridges/index.ts b/apps/meteor/app/apps/server/bridges/index.ts index 7705ea45498f0..7ac397768f74d 100644 --- a/apps/meteor/app/apps/server/bridges/index.ts +++ b/apps/meteor/app/apps/server/bridges/index.ts @@ -1,3 +1 @@ -import { RealAppBridges } from './bridges'; - -export { RealAppBridges }; +export * from './bridges'; diff --git a/apps/meteor/app/apps/server/bridges/internal.ts b/apps/meteor/app/apps/server/bridges/internal.ts index 22e44a2bb2d0b..8f5ab68e68787 100644 --- a/apps/meteor/app/apps/server/bridges/internal.ts +++ b/apps/meteor/app/apps/server/bridges/internal.ts @@ -1,5 +1,5 @@ import type { IAppServerOrchestrator, IAppsSetting } from '@rocket.chat/apps'; -import { InternalBridge } from '@rocket.chat/apps-engine/server/bridges/InternalBridge'; +import { InternalBridge } from '@rocket.chat/apps/dist/server/bridges/InternalBridge'; import type { ISetting, ISubscription } from '@rocket.chat/core-typings'; import { Settings, Subscriptions } from '@rocket.chat/models'; import { isTruthy } from '@rocket.chat/tools'; diff --git a/apps/meteor/app/apps/server/bridges/internalFederation.ts b/apps/meteor/app/apps/server/bridges/internalFederation.ts index 9bf3b34439ce5..1b221844488e8 100644 --- a/apps/meteor/app/apps/server/bridges/internalFederation.ts +++ b/apps/meteor/app/apps/server/bridges/internalFederation.ts @@ -1,4 +1,4 @@ -import type { IInternalFederationBridge } from '@rocket.chat/apps-engine/server/bridges/IInternalFederationBridge'; +import type { IInternalFederationBridge } from '@rocket.chat/apps/dist/server/bridges/IInternalFederationBridge'; import { FederationKeys } from '@rocket.chat/models'; export class AppInternalFederationBridge implements IInternalFederationBridge { diff --git a/apps/meteor/app/apps/server/bridges/livechat.ts b/apps/meteor/app/apps/server/bridges/livechat.ts index c73bbda1d3580..81a6d8551f82e 100644 --- a/apps/meteor/app/apps/server/bridges/livechat.ts +++ b/apps/meteor/app/apps/server/bridges/livechat.ts @@ -1,4 +1,5 @@ -import type { IAppServerOrchestrator, IAppsLivechatMessage, IAppsMessage } from '@rocket.chat/apps'; +import type { IAppServerOrchestrator, IAppsLivechatMessage } from '@rocket.chat/apps'; +import { LivechatBridge } from '@rocket.chat/apps/dist/server/bridges/LivechatBridge'; import type { IExtraRoomParams } from '@rocket.chat/apps-engine/definition/accessors/ILivechatCreator'; import type { IVisitorExternalIdentifier, @@ -10,8 +11,7 @@ import type { } from '@rocket.chat/apps-engine/definition/livechat'; import type { IMessage as IAppsEngineMessage } from '@rocket.chat/apps-engine/definition/messages'; import type { IUser } from '@rocket.chat/apps-engine/definition/users'; -import { LivechatBridge } from '@rocket.chat/apps-engine/server/bridges/LivechatBridge'; -import type { ILivechatDepartment, IOmnichannelRoom, SelectedAgent, IMessage, ILivechatVisitor } from '@rocket.chat/core-typings'; +import type { ILivechatDepartment, IOmnichannelRoom, SelectedAgent, ILivechatVisitor } from '@rocket.chat/core-typings'; import { OmnichannelSourceType } from '@rocket.chat/core-typings'; import { LivechatVisitors, LivechatRooms, LivechatDepartment, Users } from '@rocket.chat/models'; import { registerGuest } from '@rocket.chat/omni-core'; @@ -29,12 +29,6 @@ import { online } from '../../../livechat/server/lib/service-status'; import { transfer } from '../../../livechat/server/lib/transfer'; import { settings } from '../../../settings/server'; -declare module '@rocket.chat/apps/dist/converters/IAppMessagesConverter' { - export interface IAppMessagesConverter { - convertMessage(message: IMessage, cacheObj?: object): Promise; - } -} - declare module '@rocket.chat/apps-engine/definition/accessors/ILivechatCreator' { interface IExtraRoomParams { customFields?: Record; @@ -65,7 +59,7 @@ export class AppLivechatBridge extends LivechatBridge { // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. const guest = this.orch.getConverters().get('visitors').convertAppVisitor(message.visitor); - const appMessage = (await this.orch.getConverters().get('messages').convertAppMessage(message)) as IMessage | undefined; + const appMessage = await this.orch.getConverters().get('messages').convertAppMessage(message); const livechatMessage = appMessage as ILivechatMessage | undefined; const msg = await sendMessage({ @@ -129,13 +123,12 @@ export class AppLivechatBridge extends LivechatBridge { type: OmnichannelSourceType.APP, id: appId, alias: this.orch.getManager()?.getOneById(appId)?.getName(), - ...(source && - source.type === 'app' && { - sidebarIcon: source.sidebarIcon, - defaultIcon: source.defaultIcon, - label: source.label, - destination: source.destination, - }), + ...(source?.type === 'app' && { + sidebarIcon: source.sidebarIcon, + defaultIcon: source.defaultIcon, + label: source.label, + destination: source.destination, + }), }, }, agent: agentRoom, diff --git a/apps/meteor/app/apps/server/bridges/messages.ts b/apps/meteor/app/apps/server/bridges/messages.ts index 16366626c07c8..b5be15ae7ca92 100644 --- a/apps/meteor/app/apps/server/bridges/messages.ts +++ b/apps/meteor/app/apps/server/bridges/messages.ts @@ -1,8 +1,8 @@ import type { IAppServerOrchestrator, IAppsMessage, IAppsUser } from '@rocket.chat/apps'; +import type { ITypingDescriptor } from '@rocket.chat/apps/dist/server/bridges/MessageBridge'; +import { MessageBridge } from '@rocket.chat/apps/dist/server/bridges/MessageBridge'; import type { Reaction } from '@rocket.chat/apps-engine/definition/messages'; import type { IRoom } from '@rocket.chat/apps-engine/definition/rooms'; -import type { ITypingDescriptor } from '@rocket.chat/apps-engine/server/bridges/MessageBridge'; -import { MessageBridge } from '@rocket.chat/apps-engine/server/bridges/MessageBridge'; import { api } from '@rocket.chat/core-services'; import type { IMessage } from '@rocket.chat/core-typings'; import { Users, Subscriptions } from '@rocket.chat/models'; diff --git a/apps/meteor/app/apps/server/bridges/moderation.ts b/apps/meteor/app/apps/server/bridges/moderation.ts index 0f1e56bbdec35..42d521b102f83 100644 --- a/apps/meteor/app/apps/server/bridges/moderation.ts +++ b/apps/meteor/app/apps/server/bridges/moderation.ts @@ -1,7 +1,7 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { ModerationBridge } from '@rocket.chat/apps/dist/server/bridges/ModerationBridge'; import type { IMessage } from '@rocket.chat/apps-engine/definition/messages'; import type { IUser } from '@rocket.chat/apps-engine/definition/users'; -import { ModerationBridge } from '@rocket.chat/apps-engine/server/bridges/ModerationBridge'; import { ModerationReports } from '@rocket.chat/models'; import { reportMessage } from '../../../../server/lib/moderation/reportMessage'; diff --git a/apps/meteor/app/apps/server/bridges/oauthApps.ts b/apps/meteor/app/apps/server/bridges/oauthApps.ts index bfd72917a367c..ad9d26c24ae4c 100644 --- a/apps/meteor/app/apps/server/bridges/oauthApps.ts +++ b/apps/meteor/app/apps/server/bridges/oauthApps.ts @@ -1,8 +1,8 @@ import { randomUUID } from 'crypto'; import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { OAuthAppsBridge } from '@rocket.chat/apps/dist/server/bridges/OAuthAppsBridge'; import type { IOAuthApp, IOAuthAppParams } from '@rocket.chat/apps-engine/definition/accessors/IOAuthApp'; -import { OAuthAppsBridge } from '@rocket.chat/apps-engine/server/bridges/OAuthAppsBridge'; import type { IOAuthApps } from '@rocket.chat/core-typings'; import { OAuthApps, Users } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; diff --git a/apps/meteor/app/apps/server/bridges/outboundCommunication.ts b/apps/meteor/app/apps/server/bridges/outboundCommunication.ts index 146ae18b38ead..3ba7218a601c0 100644 --- a/apps/meteor/app/apps/server/bridges/outboundCommunication.ts +++ b/apps/meteor/app/apps/server/bridges/outboundCommunication.ts @@ -1,10 +1,10 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { OutboundMessageBridge } from '@rocket.chat/apps/dist/server/bridges/OutboundMessagesBridge'; import type { IOutboundEmailMessageProvider, IOutboundMessageProviders, IOutboundPhoneMessageProvider, } from '@rocket.chat/apps-engine/definition/outboundCommunication'; -import { OutboundMessageBridge } from '@rocket.chat/apps-engine/server/bridges'; import { getOutboundService } from '../../../livechat/server/lib/outboundcommunication'; diff --git a/apps/meteor/app/apps/server/bridges/persistence.ts b/apps/meteor/app/apps/server/bridges/persistence.ts index e1dedd270ac6e..ce85b801a9808 100644 --- a/apps/meteor/app/apps/server/bridges/persistence.ts +++ b/apps/meteor/app/apps/server/bridges/persistence.ts @@ -1,6 +1,6 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { PersistenceBridge } from '@rocket.chat/apps/dist/server/bridges/PersistenceBridge'; import type { RocketChatAssociationRecord } from '@rocket.chat/apps-engine/definition/metadata'; -import { PersistenceBridge } from '@rocket.chat/apps-engine/server/bridges/PersistenceBridge'; import type { InsertOneResult } from 'mongodb'; export class AppPersistenceBridge extends PersistenceBridge { diff --git a/apps/meteor/app/apps/server/bridges/roles.ts b/apps/meteor/app/apps/server/bridges/roles.ts index aa0fcdc7b80b7..7f7daddd328de 100644 --- a/apps/meteor/app/apps/server/bridges/roles.ts +++ b/apps/meteor/app/apps/server/bridges/roles.ts @@ -1,5 +1,5 @@ import type { IAppServerOrchestrator, IAppsRole } from '@rocket.chat/apps'; -import { RoleBridge } from '@rocket.chat/apps-engine/server/bridges'; +import { RoleBridge } from '@rocket.chat/apps/dist/server/bridges/RoleBridge'; import type { IRole } from '@rocket.chat/core-typings'; import { Roles } from '@rocket.chat/models'; diff --git a/apps/meteor/app/apps/server/bridges/rooms.ts b/apps/meteor/app/apps/server/bridges/rooms.ts index 473614edfe25c..11b2b405fb2e6 100644 --- a/apps/meteor/app/apps/server/bridges/rooms.ts +++ b/apps/meteor/app/apps/server/bridges/rooms.ts @@ -1,10 +1,10 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import type { GetMessagesOptions, GetRoomsFilters, GetRoomsOptions } from '@rocket.chat/apps/dist/server/bridges/RoomBridge'; +import { RoomBridge } from '@rocket.chat/apps/dist/server/bridges/RoomBridge'; import type { IMessage, IMessageRaw } from '@rocket.chat/apps-engine/definition/messages'; import type { IRoom, IRoomRaw } from '@rocket.chat/apps-engine/definition/rooms'; import { RoomType } from '@rocket.chat/apps-engine/definition/rooms'; import type { IUser } from '@rocket.chat/apps-engine/definition/users'; -import type { GetMessagesOptions, GetRoomsFilters, GetRoomsOptions } from '@rocket.chat/apps-engine/server/bridges/RoomBridge'; -import { RoomBridge } from '@rocket.chat/apps-engine/server/bridges/RoomBridge'; import type { ISubscription, IUser as ICoreUser, IRoom as ICoreRoom, IMessage as ICoreMessage } from '@rocket.chat/core-typings'; import { Subscriptions, Users, Rooms, Messages } from '@rocket.chat/models'; import type { FindOptions, Sort } from 'mongodb'; diff --git a/apps/meteor/app/apps/server/bridges/scheduler.ts b/apps/meteor/app/apps/server/bridges/scheduler.ts index b08d49182c9bc..8f044cf1832f9 100644 --- a/apps/meteor/app/apps/server/bridges/scheduler.ts +++ b/apps/meteor/app/apps/server/bridges/scheduler.ts @@ -1,9 +1,9 @@ import type { Job } from '@rocket.chat/agenda'; import { Agenda } from '@rocket.chat/agenda'; import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { SchedulerBridge } from '@rocket.chat/apps/dist/server/bridges/SchedulerBridge'; import type { IProcessor, IOnetimeSchedule, IRecurringSchedule, IJobContext } from '@rocket.chat/apps-engine/definition/scheduler'; import { StartupType } from '@rocket.chat/apps-engine/definition/scheduler'; -import { SchedulerBridge } from '@rocket.chat/apps-engine/server/bridges/SchedulerBridge'; import { ObjectId } from 'bson'; import { MongoInternals } from 'meteor/mongo'; @@ -90,7 +90,7 @@ export class AppSchedulerBridge extends SchedulerBridge { }); if (runAfterRegister.length) { - return Promise.all(runAfterRegister) as Promise>; + return Promise.all(runAfterRegister); } } diff --git a/apps/meteor/app/apps/server/bridges/settings.ts b/apps/meteor/app/apps/server/bridges/settings.ts index 7c569a3f12fd7..145f81fc129ae 100644 --- a/apps/meteor/app/apps/server/bridges/settings.ts +++ b/apps/meteor/app/apps/server/bridges/settings.ts @@ -1,7 +1,7 @@ import { Apps, type IAppServerOrchestrator } from '@rocket.chat/apps'; +import { ServerSettingBridge } from '@rocket.chat/apps/dist/server/bridges/ServerSettingBridge'; import type { IReadSettingPermission } from '@rocket.chat/apps-engine/definition/permissions/IPermission'; import type { ISetting } from '@rocket.chat/apps-engine/definition/settings'; -import { ServerSettingBridge } from '@rocket.chat/apps-engine/server/bridges/ServerSettingBridge'; import { Settings } from '@rocket.chat/models'; import { updateAuditedByApp } from '../../../../server/settings/lib/auditedSettingUpdates'; diff --git a/apps/meteor/app/apps/server/bridges/thread.ts b/apps/meteor/app/apps/server/bridges/thread.ts index 099fe9184e004..7857005eaea23 100644 --- a/apps/meteor/app/apps/server/bridges/thread.ts +++ b/apps/meteor/app/apps/server/bridges/thread.ts @@ -1,6 +1,6 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { ThreadBridge } from '@rocket.chat/apps/dist/server/bridges/ThreadBridge'; import type { IMessage } from '@rocket.chat/apps-engine/definition/messages'; -import { ThreadBridge } from '@rocket.chat/apps-engine/server/bridges/ThreadBridge'; export class AppThreadBridge extends ThreadBridge { constructor(private readonly orch: IAppServerOrchestrator) { diff --git a/apps/meteor/app/apps/server/bridges/uiInteraction.ts b/apps/meteor/app/apps/server/bridges/uiInteraction.ts index fc68e4e30d3ff..69172f9cf5d59 100644 --- a/apps/meteor/app/apps/server/bridges/uiInteraction.ts +++ b/apps/meteor/app/apps/server/bridges/uiInteraction.ts @@ -1,7 +1,7 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { UiInteractionBridge as AppsEngineUiInteractionBridge } from '@rocket.chat/apps/dist/server/bridges/UiInteractionBridge'; import type { IUIKitInteraction } from '@rocket.chat/apps-engine/definition/uikit'; import type { IUser } from '@rocket.chat/apps-engine/definition/users'; -import { UiInteractionBridge as AppsEngineUiInteractionBridge } from '@rocket.chat/apps-engine/server/bridges/UiInteractionBridge'; import { api } from '@rocket.chat/core-services'; import type * as UiKit from '@rocket.chat/ui-kit'; diff --git a/apps/meteor/app/apps/server/bridges/uploads.ts b/apps/meteor/app/apps/server/bridges/uploads.ts index b9d0ff67de58e..929e70743c557 100644 --- a/apps/meteor/app/apps/server/bridges/uploads.ts +++ b/apps/meteor/app/apps/server/bridges/uploads.ts @@ -1,7 +1,7 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { UploadBridge } from '@rocket.chat/apps/dist/server/bridges/UploadBridge'; import type { IUpload } from '@rocket.chat/apps-engine/definition/uploads'; import type { IUploadDetails } from '@rocket.chat/apps-engine/definition/uploads/IUploadDetails'; -import { UploadBridge } from '@rocket.chat/apps-engine/server/bridges/UploadBridge'; import { determineFileType } from '../../../../ee/lib/misc/determineFileType'; import { FileUpload } from '../../../file-upload/server'; diff --git a/apps/meteor/app/apps/server/bridges/users.ts b/apps/meteor/app/apps/server/bridges/users.ts index 43cd7f9ea89e1..ee5f8d93f799f 100644 --- a/apps/meteor/app/apps/server/bridges/users.ts +++ b/apps/meteor/app/apps/server/bridges/users.ts @@ -1,6 +1,6 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { UserBridge } from '@rocket.chat/apps/dist/server/bridges/UserBridge'; import type { IUserCreationOptions, IUser, UserType } from '@rocket.chat/apps-engine/definition/users'; -import { UserBridge } from '@rocket.chat/apps-engine/server/bridges/UserBridge'; import { Presence } from '@rocket.chat/core-services'; import type { UserStatus } from '@rocket.chat/core-typings'; import { Subscriptions, Users } from '@rocket.chat/models'; diff --git a/apps/meteor/app/apps/server/bridges/videoConferences.ts b/apps/meteor/app/apps/server/bridges/videoConferences.ts index 8986c15a3c6dd..56f70e3e416e4 100644 --- a/apps/meteor/app/apps/server/bridges/videoConferences.ts +++ b/apps/meteor/app/apps/server/bridges/videoConferences.ts @@ -1,7 +1,7 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; +import { VideoConferenceBridge } from '@rocket.chat/apps/dist/server/bridges/VideoConferenceBridge'; import type { IVideoConfProvider } from '@rocket.chat/apps-engine/definition/videoConfProviders'; import type { AppVideoConference, VideoConference } from '@rocket.chat/apps-engine/definition/videoConferences'; -import { VideoConferenceBridge } from '@rocket.chat/apps-engine/server/bridges/VideoConferenceBridge'; import { VideoConf } from '@rocket.chat/core-services'; import { videoConfProviders } from '../../../../server/lib/videoConfProviders'; diff --git a/apps/meteor/app/statistics/server/lib/getAppsStatistics.ts b/apps/meteor/app/statistics/server/lib/getAppsStatistics.ts index 90e05d1923563..1734d175c6c5d 100644 --- a/apps/meteor/app/statistics/server/lib/getAppsStatistics.ts +++ b/apps/meteor/app/statistics/server/lib/getAppsStatistics.ts @@ -1,6 +1,6 @@ import { Apps } from '@rocket.chat/apps'; +import { AppInstallationSource } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; import { AppStatus, AppStatusUtils } from '@rocket.chat/apps-engine/definition/AppStatus'; -import { AppInstallationSource } from '@rocket.chat/apps-engine/server/storage'; import mem from 'mem'; import { SystemLogger } from '../../../../server/lib/logger/system'; diff --git a/apps/meteor/client/apps/RealAppsEngineUIHost.ts b/apps/meteor/client/apps/RealAppsEngineUIHost.ts index c6a746f6bb7a8..a8da21e8aeea1 100644 --- a/apps/meteor/client/apps/RealAppsEngineUIHost.ts +++ b/apps/meteor/client/apps/RealAppsEngineUIHost.ts @@ -1,5 +1,6 @@ -import { AppsEngineUIHost } from '@rocket.chat/apps-engine/client/AppsEngineUIHost'; -import type { IExternalComponentRoomInfo, IExternalComponentUserInfo } from '@rocket.chat/apps-engine/client/definition'; +import { AppsEngineUIHost } from '@rocket.chat/apps/dist/client/AppsEngineUIHost'; +import type { IExternalComponentRoomInfo } from '@rocket.chat/apps/dist/client/definition/IExternalComponentRoomInfo'; +import type { IExternalComponentUserInfo } from '@rocket.chat/apps/dist/client/definition/IExternalComponentUserInfo'; import { getUserAvatarURL } from '../../app/utils/client/getUserAvatarURL'; import { sdk } from '../../app/utils/client/lib/SDKClient'; diff --git a/apps/meteor/client/apps/orchestrator.ts b/apps/meteor/client/apps/orchestrator.ts index d08641da34d22..e376211b8260a 100644 --- a/apps/meteor/client/apps/orchestrator.ts +++ b/apps/meteor/client/apps/orchestrator.ts @@ -1,5 +1,5 @@ -import { AppClientManager } from '@rocket.chat/apps-engine/client/AppClientManager'; -import type { AppsEngineUIHost } from '@rocket.chat/apps-engine/client/AppsEngineUIHost'; +import { AppClientManager } from '@rocket.chat/apps/dist/client/AppClientManager'; +import type { AppsEngineUIHost } from '@rocket.chat/apps/dist/client/AppsEngineUIHost'; import type { IPermission } from '@rocket.chat/apps-engine/definition/permissions/IPermission'; import type { ISetting } from '@rocket.chat/apps-engine/definition/settings'; import type { Serialized } from '@rocket.chat/core-typings'; diff --git a/apps/meteor/client/contexts/AppsContext.tsx b/apps/meteor/client/contexts/AppsContext.tsx index 39929c20aed08..38eda15a7ab98 100644 --- a/apps/meteor/client/contexts/AppsContext.tsx +++ b/apps/meteor/client/contexts/AppsContext.tsx @@ -1,4 +1,4 @@ -import type { AppClientManager } from '@rocket.chat/apps-engine/client/AppClientManager'; +import type { AppClientManager } from '@rocket.chat/apps/dist/client/AppClientManager'; import type { IPermission } from '@rocket.chat/apps-engine/definition/permissions/IPermission'; import type { ISetting } from '@rocket.chat/apps-engine/definition/settings'; import type { Serialized } from '@rocket.chat/core-typings'; diff --git a/apps/meteor/ee/app/license/server/canEnableApp.ts b/apps/meteor/ee/app/license/server/canEnableApp.ts index c18ad9efb6619..b691656226e23 100644 --- a/apps/meteor/ee/app/license/server/canEnableApp.ts +++ b/apps/meteor/ee/app/license/server/canEnableApp.ts @@ -1,4 +1,4 @@ -import type { IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; +import type { IAppStorageItem } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; import { Apps } from '@rocket.chat/core-services'; import type { LicenseModule } from '@rocket.chat/core-typings'; import { License, type LicenseImp } from '@rocket.chat/license'; diff --git a/apps/meteor/ee/lib/misc/formatAppInstanceForRest.ts b/apps/meteor/ee/lib/misc/formatAppInstanceForRest.ts index 7819404525d5f..4a976c0ef7c03 100644 --- a/apps/meteor/ee/lib/misc/formatAppInstanceForRest.ts +++ b/apps/meteor/ee/lib/misc/formatAppInstanceForRest.ts @@ -1,8 +1,8 @@ +import type { ProxiedApp } from '@rocket.chat/apps/dist/server/ProxiedApp'; +import type { AppLicenseValidationResult } from '@rocket.chat/apps/dist/server/marketplace/license/AppLicenseValidationResult'; +import type { IAppStorageItem } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; import type { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; import type { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; -import type { ProxiedApp } from '@rocket.chat/apps-engine/server/ProxiedApp'; -import type { AppLicenseValidationResult } from '@rocket.chat/apps-engine/server/marketplace/license'; -import type { IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; import type { AppStatusReport } from '@rocket.chat/core-services'; import type { App } from '@rocket.chat/core-typings'; diff --git a/apps/meteor/ee/server/apps/communication/endpoints/appsCountHandler.ts b/apps/meteor/ee/server/apps/communication/endpoints/appsCountHandler.ts index 402ceb709a16a..67665124d980c 100644 --- a/apps/meteor/ee/server/apps/communication/endpoints/appsCountHandler.ts +++ b/apps/meteor/ee/server/apps/communication/endpoints/appsCountHandler.ts @@ -1,4 +1,4 @@ -import type { AppManager } from '@rocket.chat/apps-engine/server/AppManager'; +import type { AppManager } from '@rocket.chat/apps/dist/server/AppManager'; import { License } from '@rocket.chat/license'; import { API } from '../../../../../app/api/server'; diff --git a/apps/meteor/ee/server/apps/communication/rest.ts b/apps/meteor/ee/server/apps/communication/rest.ts index 62af65d40987f..27440ba7caeea 100644 --- a/apps/meteor/ee/server/apps/communication/rest.ts +++ b/apps/meteor/ee/server/apps/communication/rest.ts @@ -1,7 +1,7 @@ +import type { AppManager } from '@rocket.chat/apps/dist/server/AppManager'; +import type { IMarketplaceInfo } from '@rocket.chat/apps/dist/server/marketplace/IMarketplaceInfo'; import { AppStatus, AppStatusUtils } from '@rocket.chat/apps-engine/definition/AppStatus'; import type { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; -import type { AppManager } from '@rocket.chat/apps-engine/server/AppManager'; -import type { IMarketplaceInfo } from '@rocket.chat/apps-engine/server/marketplace'; import type { AppStatusReport } from '@rocket.chat/core-services'; import type { IMessage, IUser } from '@rocket.chat/core-typings'; import { License } from '@rocket.chat/license'; diff --git a/apps/meteor/ee/server/apps/cron.ts b/apps/meteor/ee/server/apps/cron.ts index d5e7111972821..9a09a1b457d18 100644 --- a/apps/meteor/ee/server/apps/cron.ts +++ b/apps/meteor/ee/server/apps/cron.ts @@ -1,5 +1,5 @@ +import type { ProxiedApp } from '@rocket.chat/apps/dist/server/ProxiedApp'; import { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; -import type { ProxiedApp } from '@rocket.chat/apps-engine/server/ProxiedApp'; import { cronJobs } from '@rocket.chat/cron'; import { Settings, Users } from '@rocket.chat/models'; diff --git a/apps/meteor/ee/server/apps/orchestrator.js b/apps/meteor/ee/server/apps/orchestrator.js index 919f695bedc6d..0c04100add928 100644 --- a/apps/meteor/ee/server/apps/orchestrator.js +++ b/apps/meteor/ee/server/apps/orchestrator.js @@ -3,8 +3,8 @@ import * as os from 'os'; import * as path from 'path'; import { registerOrchestrator } from '@rocket.chat/apps'; +import { AppManager } from '@rocket.chat/apps/dist/server/AppManager'; import { EssentialAppDisabledException } from '@rocket.chat/apps-engine/definition/exceptions'; -import { AppManager } from '@rocket.chat/apps-engine/server/AppManager'; import { Logger } from '@rocket.chat/logger'; import { AppLogs, Apps as AppsModel, AppsPersistence, Statistics } from '@rocket.chat/models'; import { Meteor } from 'meteor/meteor'; diff --git a/apps/meteor/ee/server/apps/storage/AppFileSystemSourceStorage.ts b/apps/meteor/ee/server/apps/storage/AppFileSystemSourceStorage.ts index 54e83a11df5d5..afd3d16808d77 100644 --- a/apps/meteor/ee/server/apps/storage/AppFileSystemSourceStorage.ts +++ b/apps/meteor/ee/server/apps/storage/AppFileSystemSourceStorage.ts @@ -1,8 +1,8 @@ import { promises as fs } from 'fs'; import { join, normalize } from 'path'; -import type { IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; -import { AppSourceStorage } from '@rocket.chat/apps-engine/server/storage'; +import { AppSourceStorage } from '@rocket.chat/apps/dist/server/storage/AppSourceStorage'; +import type { IAppStorageItem } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; export class AppFileSystemSourceStorage extends AppSourceStorage { private pathPrefix = 'fs:/'; diff --git a/apps/meteor/ee/server/apps/storage/AppGridFSSourceStorage.ts b/apps/meteor/ee/server/apps/storage/AppGridFSSourceStorage.ts index 2fd4232ee6d35..e903ce2023a17 100644 --- a/apps/meteor/ee/server/apps/storage/AppGridFSSourceStorage.ts +++ b/apps/meteor/ee/server/apps/storage/AppGridFSSourceStorage.ts @@ -1,5 +1,5 @@ -import type { IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; -import { AppSourceStorage } from '@rocket.chat/apps-engine/server/storage'; +import { AppSourceStorage } from '@rocket.chat/apps/dist/server/storage/AppSourceStorage'; +import type { IAppStorageItem } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; import { streamToBuffer } from '@rocket.chat/tools'; import { MongoInternals } from 'meteor/mongo'; import { NpmModuleMongodb } from 'meteor/npm-mongo'; diff --git a/apps/meteor/ee/server/apps/storage/AppRealLogStorage.ts b/apps/meteor/ee/server/apps/storage/AppRealLogStorage.ts index e86bafe7afe88..f8f7e632c4353 100644 --- a/apps/meteor/ee/server/apps/storage/AppRealLogStorage.ts +++ b/apps/meteor/ee/server/apps/storage/AppRealLogStorage.ts @@ -1,6 +1,6 @@ -import type { ILoggerStorageEntry } from '@rocket.chat/apps-engine/server/logging'; -import type { IAppLogStorageFindOptions } from '@rocket.chat/apps-engine/server/storage'; -import { AppLogStorage } from '@rocket.chat/apps-engine/server/storage'; +import type { ILoggerStorageEntry } from '@rocket.chat/apps/dist/server/logging/ILoggerStorageEntry'; +import type { IAppLogStorageFindOptions } from '@rocket.chat/apps/dist/server/storage/AppLogStorage'; +import { AppLogStorage } from '@rocket.chat/apps/dist/server/storage/AppLogStorage'; import { InstanceStatus } from '@rocket.chat/instance-status'; import type { AppLogs } from '@rocket.chat/models'; diff --git a/apps/meteor/ee/server/apps/storage/AppRealStorage.ts b/apps/meteor/ee/server/apps/storage/AppRealStorage.ts index db96013af0c76..eba729edce941 100644 --- a/apps/meteor/ee/server/apps/storage/AppRealStorage.ts +++ b/apps/meteor/ee/server/apps/storage/AppRealStorage.ts @@ -1,9 +1,9 @@ +import type { IMarketplaceInfo } from '@rocket.chat/apps/dist/server/marketplace/IMarketplaceInfo'; +import { AppMetadataStorage } from '@rocket.chat/apps/dist/server/storage/AppMetadataStorage'; +import type { IAppStorageItem } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; import type { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; import type { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; import type { ISetting } from '@rocket.chat/apps-engine/definition/settings'; -import type { IMarketplaceInfo } from '@rocket.chat/apps-engine/server/marketplace'; -import type { IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; -import { AppMetadataStorage } from '@rocket.chat/apps-engine/server/storage'; import type { Apps } from '@rocket.chat/models'; import { removeEmpty } from '@rocket.chat/tools'; import type { UpdateFilter } from 'mongodb'; diff --git a/apps/meteor/ee/server/apps/storage/ConfigurableAppSourceStorage.ts b/apps/meteor/ee/server/apps/storage/ConfigurableAppSourceStorage.ts index ee70cd38b409f..87a8fd21a8642 100644 --- a/apps/meteor/ee/server/apps/storage/ConfigurableAppSourceStorage.ts +++ b/apps/meteor/ee/server/apps/storage/ConfigurableAppSourceStorage.ts @@ -1,5 +1,5 @@ -import type { IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; -import { AppSourceStorage } from '@rocket.chat/apps-engine/server/storage'; +import { AppSourceStorage } from '@rocket.chat/apps/dist/server/storage/AppSourceStorage'; +import type { IAppStorageItem } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; import { AppFileSystemSourceStorage } from './AppFileSystemSourceStorage'; import { AppGridFSSourceStorage } from './AppGridFSSourceStorage'; diff --git a/apps/meteor/ee/tests/unit/server/apps/AppRealStorage.spec.ts b/apps/meteor/ee/tests/unit/server/apps/AppRealStorage.spec.ts index 3ea794fd06614..ed13081ecc1e6 100644 --- a/apps/meteor/ee/tests/unit/server/apps/AppRealStorage.spec.ts +++ b/apps/meteor/ee/tests/unit/server/apps/AppRealStorage.spec.ts @@ -1,7 +1,7 @@ +import { AppInstallationSource, type IAppStorageItem } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; import { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; import { AppInterface } from '@rocket.chat/apps-engine/definition/metadata'; import { SettingType } from '@rocket.chat/apps-engine/definition/settings'; -import { AppInstallationSource, type IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; import { expect } from 'chai'; import sinon from 'sinon'; diff --git a/apps/meteor/lib/apps/getInstallationSourceFromAppStorageItem.ts b/apps/meteor/lib/apps/getInstallationSourceFromAppStorageItem.ts index d8fd5a48f79f3..43c87ca56e80e 100644 --- a/apps/meteor/lib/apps/getInstallationSourceFromAppStorageItem.ts +++ b/apps/meteor/lib/apps/getInstallationSourceFromAppStorageItem.ts @@ -1,4 +1,4 @@ -import type { IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; +import type { IAppStorageItem } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; import type { LicenseAppSources } from '@rocket.chat/core-typings'; /** diff --git a/apps/meteor/server/services/apps-engine/service.ts b/apps/meteor/server/services/apps-engine/service.ts index 0be60a579908d..dcf0497a2ef53 100644 --- a/apps/meteor/server/services/apps-engine/service.ts +++ b/apps/meteor/server/services/apps-engine/service.ts @@ -1,9 +1,9 @@ import { Apps, AppEvents } from '@rocket.chat/apps'; +import type { IGetAppsFilter } from '@rocket.chat/apps/dist/server/IGetAppsFilter'; +import type { IAppStorageItem } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; import type { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; import { AppStatusUtils } from '@rocket.chat/apps-engine/definition/AppStatus'; import type { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; -import type { IGetAppsFilter } from '@rocket.chat/apps-engine/server/IGetAppsFilter'; -import type { IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; import type { AppStatusReport, IAppsEngineService } from '@rocket.chat/core-services'; import { ServiceClassInternal } from '@rocket.chat/core-services'; diff --git a/apps/meteor/server/services/video-conference/service.ts b/apps/meteor/server/services/video-conference/service.ts index 3c33979fdd3a0..1517dc4d56e0b 100644 --- a/apps/meteor/server/services/video-conference/service.ts +++ b/apps/meteor/server/services/video-conference/service.ts @@ -1,6 +1,6 @@ import { Apps } from '@rocket.chat/apps'; +import type { AppVideoConfProviderManager } from '@rocket.chat/apps/dist/server/managers/AppVideoConfProviderManager'; import type { VideoConfData, VideoConfDataExtended } from '@rocket.chat/apps-engine/definition/videoConfProviders'; -import type { AppVideoConfProviderManager } from '@rocket.chat/apps-engine/server/managers'; import type { IVideoConfService, VideoConferenceJoinOptions } from '@rocket.chat/core-services'; import { api, ServiceClassInternal, Room } from '@rocket.chat/core-services'; import type { diff --git a/apps/meteor/server/startup/migrations/v294.ts b/apps/meteor/server/startup/migrations/v294.ts index 07f6dc2acc1fe..0cc7b55f45373 100644 --- a/apps/meteor/server/startup/migrations/v294.ts +++ b/apps/meteor/server/startup/migrations/v294.ts @@ -1,8 +1,6 @@ import { Apps } from '@rocket.chat/apps'; -import type { AppSignatureManager } from '@rocket.chat/apps-engine/server/managers/AppSignatureManager'; -import type { IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; +import type { IAppStorageItem } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; -import type { AppRealStorage } from '../../../ee/server/apps/storage'; import { addMigration } from '../../lib/migrations'; addMigration({ @@ -14,12 +12,12 @@ addMigration({ Apps.initialize(); - const sigMan = Apps.getManager()?.getSignatureManager() as AppSignatureManager; - const appsStorage = Apps.getStorage() as AppRealStorage; + const sigMan = Apps.getManager().getSignatureManager(); + const appsStorage = Apps.getStorage(); const apps = await appsStorage.retrieveAll(); - for await (const app of apps.values()) { + for (const app of apps.values()) { if (app.installationSource && app.signature) { continue; } diff --git a/apps/meteor/server/startup/migrations/v307.ts b/apps/meteor/server/startup/migrations/v307.ts index d16d16220edc8..d10bb62349d55 100644 --- a/apps/meteor/server/startup/migrations/v307.ts +++ b/apps/meteor/server/startup/migrations/v307.ts @@ -1,9 +1,7 @@ import { Apps } from '@rocket.chat/apps'; -import type { AppSignatureManager } from '@rocket.chat/apps-engine/server/managers/AppSignatureManager'; -import type { IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; +import type { IAppStorageItem } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; import { License } from '@rocket.chat/license'; -import type { AppRealStorage } from '../../../ee/server/apps/storage'; import { addMigration } from '../../lib/migrations'; addMigration({ @@ -21,11 +19,11 @@ addMigration({ Apps.initialize(); - const sigMan = Apps.getManager()?.getSignatureManager() as AppSignatureManager; - const appsStorage = Apps.getStorage() as AppRealStorage; + const sigMan = Apps.getManager().getSignatureManager(); + const appsStorage = Apps.getStorage(); const apps = await appsStorage.retrieveAllPrivate(); - for await (const app of apps.values()) { + for (const app of apps.values()) { const updatedApp = { ...app, migrated: true, diff --git a/apps/meteor/tests/end-to-end/apps/app-logs-export.ts b/apps/meteor/tests/end-to-end/apps/app-logs-export.ts index 0d8b1fc088a44..4022133b4abec 100644 --- a/apps/meteor/tests/end-to-end/apps/app-logs-export.ts +++ b/apps/meteor/tests/end-to-end/apps/app-logs-export.ts @@ -1,4 +1,4 @@ -import type { ILoggerStorageEntry } from '@rocket.chat/apps-engine/server/logging'; +import type { ILoggerStorageEntry } from '@rocket.chat/apps/dist/server/logging/ILoggerStorageEntry'; import type { App } from '@rocket.chat/core-typings'; import { expect } from 'chai'; import { after, before, describe, it } from 'mocha'; diff --git a/apps/meteor/tests/end-to-end/apps/app-logs-general.ts b/apps/meteor/tests/end-to-end/apps/app-logs-general.ts index 34ad33b561523..92d9d668f7b7d 100644 --- a/apps/meteor/tests/end-to-end/apps/app-logs-general.ts +++ b/apps/meteor/tests/end-to-end/apps/app-logs-general.ts @@ -1,4 +1,4 @@ -import type { ILoggerStorageEntry } from '@rocket.chat/apps-engine/server/logging'; +import type { ILoggerStorageEntry } from '@rocket.chat/apps/dist/server/logging/ILoggerStorageEntry'; import type { App } from '@rocket.chat/core-typings'; import { expect } from 'chai'; import { after, before, describe, it } from 'mocha'; diff --git a/apps/meteor/tests/end-to-end/apps/app-logs-nested-requests.ts b/apps/meteor/tests/end-to-end/apps/app-logs-nested-requests.ts index 76080fe704c72..6ef79a8cc60f0 100644 --- a/apps/meteor/tests/end-to-end/apps/app-logs-nested-requests.ts +++ b/apps/meteor/tests/end-to-end/apps/app-logs-nested-requests.ts @@ -1,4 +1,4 @@ -import type { ILoggerStorageEntry } from '@rocket.chat/apps-engine/server/logging'; +import type { ILoggerStorageEntry } from '@rocket.chat/apps/dist/server/logging/ILoggerStorageEntry'; import { expect } from 'chai'; import { after, before, describe, it } from 'mocha'; diff --git a/apps/meteor/tests/end-to-end/apps/app-logs.ts b/apps/meteor/tests/end-to-end/apps/app-logs.ts index da12c1bc77988..71c576e38fb75 100644 --- a/apps/meteor/tests/end-to-end/apps/app-logs.ts +++ b/apps/meteor/tests/end-to-end/apps/app-logs.ts @@ -1,4 +1,4 @@ -import type { ILoggerStorageEntry } from '@rocket.chat/apps-engine/server/logging'; +import type { ILoggerStorageEntry } from '@rocket.chat/apps/dist/server/logging/ILoggerStorageEntry'; import type { App } from '@rocket.chat/core-typings'; import { expect } from 'chai'; import { after, before, describe, it } from 'mocha'; diff --git a/apps/meteor/tests/mocks/client/marketplace.tsx b/apps/meteor/tests/mocks/client/marketplace.tsx index 52f1acae2c584..a571ddf06bf3f 100644 --- a/apps/meteor/tests/mocks/client/marketplace.tsx +++ b/apps/meteor/tests/mocks/client/marketplace.tsx @@ -1,6 +1,6 @@ -import { AppClientManager } from '@rocket.chat/apps-engine/client/AppClientManager'; -import { AppsEngineUIHost } from '@rocket.chat/apps-engine/client/AppsEngineUIHost'; -import type { IExternalComponentRoomInfo } from '@rocket.chat/apps-engine/client/definition'; +import { AppClientManager } from '@rocket.chat/apps/dist/client/AppClientManager'; +import { AppsEngineUIHost } from '@rocket.chat/apps/dist/client/AppsEngineUIHost'; +import type { IExternalComponentRoomInfo } from '@rocket.chat/apps/dist/client/definition/IExternalComponentRoomInfo'; import type { ReactNode } from 'react'; import { AppsContext, type IAppsOrchestrator } from '../../../client/contexts/AppsContext'; diff --git a/apps/meteor/tests/mocks/data.ts b/apps/meteor/tests/mocks/data.ts index fb8859a3055b2..7e8e290f4f510 100644 --- a/apps/meteor/tests/mocks/data.ts +++ b/apps/meteor/tests/mocks/data.ts @@ -1,5 +1,6 @@ import { faker } from '@faker-js/faker'; -import type { IExternalComponentRoomInfo, IExternalComponentUserInfo } from '@rocket.chat/apps-engine/client/definition'; +import type { IExternalComponentRoomInfo } from '@rocket.chat/apps/dist/client/definition/IExternalComponentRoomInfo'; +import type { IExternalComponentUserInfo } from '@rocket.chat/apps/dist/client/definition/IExternalComponentUserInfo'; import type { ILivechatContact } from '@rocket.chat/apps-engine/definition/livechat'; import { AppSubscriptionStatus, diff --git a/apps/meteor/tests/unit/app/license/server/canEnableApp.spec.ts b/apps/meteor/tests/unit/app/license/server/canEnableApp.spec.ts index 0cb68734fb462..0208c3afccacc 100644 --- a/apps/meteor/tests/unit/app/license/server/canEnableApp.spec.ts +++ b/apps/meteor/tests/unit/app/license/server/canEnableApp.spec.ts @@ -1,6 +1,6 @@ +import type { IMarketplaceInfo } from '@rocket.chat/apps/dist/server/marketplace/IMarketplaceInfo'; +import { AppInstallationSource, type IAppStorageItem } from '@rocket.chat/apps/dist/server/storage/IAppStorageItem'; import { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; -import type { IMarketplaceInfo } from '@rocket.chat/apps-engine/server/marketplace'; -import { AppInstallationSource, type IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; import type { Apps } from '@rocket.chat/core-services'; import type { LicenseImp } from '@rocket.chat/license'; import { expect } from 'chai'; @@ -34,9 +34,6 @@ const getDefaultApp = (): IAppStorageItem => ({ updatedAt: new Date('2024-10-09T19:27:33.923Z'), }); -// We will be passing promises to the `expect` function -/* eslint-disable @typescript-eslint/no-floating-promises */ - describe('canEnableApp', () => { it('should throw the message "apps-engine-not-initialized" when appropriate', () => { const AppsMock = { diff --git a/docs/apps-engine-migration.md b/docs/apps-engine-migration.md index 9e39dca694aaa..dd7271e715271 100644 --- a/docs/apps-engine-migration.md +++ b/docs/apps-engine-migration.md @@ -26,3 +26,4 @@ To make this migration easier to understand and review, we're using a stacked PR - [40183](https://github.com/RocketChat/Rocket.Chat/pull/40183) Replaces `AppPackageParser.getEngineVersion()` - which resolved the version by traversing the filesystem relative to `__dirname` - with a direct import of `ENGINE_VERSION`. This will support the migration of the `AppPackageParser` class itself. - [40184](https://github.com/RocketChat/Rocket.Chat/pull/40184) Copies all relevant source files from `packages/apps-engine/src/server`, `packages/apps-engine/src/client`, `packages/apps-engine/deno-runtime`, `packages/apps-engine/tests` and `packages/apps-engine/scripts` into their corresponding path at `packages/apps`. - [40185](https://github.com/RocketChat/Rocket.Chat/pull/40185) Adapts the path resolution of the apps-engine package for the deno runtime +- [40186](https://github.com/RocketChat/Rocket.Chat/pull/40186) Flips the switch; changes code in `apps/meteor` and `packages/core-services` that pointed to `@rocket.chat/apps-engine` and makes it point to `@rocket.chat/apps`. This is the turning point in what is actually executed. diff --git a/ee/apps/account-service/Dockerfile b/ee/apps/account-service/Dockerfile index 3c4dd3b6f3dd9..d2560ff77089c 100644 --- a/ee/apps/account-service/Dockerfile +++ b/ee/apps/account-service/Dockerfile @@ -11,7 +11,6 @@ COPY ./packages/core-services/package.json packages/core-services/package.json COPY ./packages/core-services/dist packages/core-services/dist COPY ./packages/apps-engine/package.json packages/apps-engine/package.json -COPY ./packages/apps-engine/client packages/apps-engine/client COPY ./packages/apps-engine/definition packages/apps-engine/definition COPY ./packages/agenda/package.json packages/agenda/package.json diff --git a/ee/apps/authorization-service/Dockerfile b/ee/apps/authorization-service/Dockerfile index 747b9793bb66e..743b4c30629dc 100644 --- a/ee/apps/authorization-service/Dockerfile +++ b/ee/apps/authorization-service/Dockerfile @@ -11,7 +11,6 @@ COPY ./packages/core-services/package.json packages/core-services/package.json COPY ./packages/core-services/dist packages/core-services/dist COPY ./packages/apps-engine/package.json packages/apps-engine/package.json -COPY ./packages/apps-engine/client packages/apps-engine/client COPY ./packages/apps-engine/definition packages/apps-engine/definition COPY ./packages/agenda/package.json packages/agenda/package.json diff --git a/ee/apps/ddp-streamer/Dockerfile b/ee/apps/ddp-streamer/Dockerfile index bc489a5a24a21..0205a95371f95 100644 --- a/ee/apps/ddp-streamer/Dockerfile +++ b/ee/apps/ddp-streamer/Dockerfile @@ -11,7 +11,6 @@ COPY ./packages/core-services/package.json packages/core-services/package.json COPY ./packages/core-services/dist packages/core-services/dist COPY ./packages/apps-engine/package.json packages/apps-engine/package.json -COPY ./packages/apps-engine/client packages/apps-engine/client COPY ./packages/apps-engine/definition packages/apps-engine/definition COPY ./packages/agenda/package.json packages/agenda/package.json diff --git a/ee/apps/omnichannel-transcript/Dockerfile b/ee/apps/omnichannel-transcript/Dockerfile index 9425aaeb9cf7a..b869abbfd9254 100644 --- a/ee/apps/omnichannel-transcript/Dockerfile +++ b/ee/apps/omnichannel-transcript/Dockerfile @@ -11,7 +11,6 @@ COPY ./packages/core-services/package.json packages/core-services/package.json COPY ./packages/core-services/dist packages/core-services/dist COPY ./packages/apps-engine/package.json packages/apps-engine/package.json -COPY ./packages/apps-engine/client packages/apps-engine/client COPY ./packages/apps-engine/definition packages/apps-engine/definition COPY ./packages/agenda/package.json packages/agenda/package.json diff --git a/ee/apps/presence-service/Dockerfile b/ee/apps/presence-service/Dockerfile index 4bdb808180d23..affe93f578f9e 100644 --- a/ee/apps/presence-service/Dockerfile +++ b/ee/apps/presence-service/Dockerfile @@ -17,7 +17,6 @@ COPY ./packages/core-services/package.json packages/core-services/package.json COPY ./packages/core-services/dist packages/core-services/dist COPY ./packages/apps-engine/package.json packages/apps-engine/package.json -COPY ./packages/apps-engine/client packages/apps-engine/client COPY ./packages/apps-engine/definition packages/apps-engine/definition COPY ./packages/core-typings/package.json packages/core-typings/package.json diff --git a/ee/apps/queue-worker/Dockerfile b/ee/apps/queue-worker/Dockerfile index 9425aaeb9cf7a..b869abbfd9254 100644 --- a/ee/apps/queue-worker/Dockerfile +++ b/ee/apps/queue-worker/Dockerfile @@ -11,7 +11,6 @@ COPY ./packages/core-services/package.json packages/core-services/package.json COPY ./packages/core-services/dist packages/core-services/dist COPY ./packages/apps-engine/package.json packages/apps-engine/package.json -COPY ./packages/apps-engine/client packages/apps-engine/client COPY ./packages/apps-engine/definition packages/apps-engine/definition COPY ./packages/agenda/package.json packages/agenda/package.json diff --git a/packages/apps-engine/src/definition/accessors/IRoomRead.ts b/packages/apps-engine/src/definition/accessors/IRoomRead.ts index ae086150784f9..dc78134e66974 100644 --- a/packages/apps-engine/src/definition/accessors/IRoomRead.ts +++ b/packages/apps-engine/src/definition/accessors/IRoomRead.ts @@ -1,5 +1,5 @@ -import type { GetMessagesOptions, GetRoomsFilters, GetRoomsOptions } from '../../server/bridges/RoomBridge'; import type { IMessageRaw } from '../messages/index'; +import type { GetMessagesOptions, GetRoomsFilters, GetRoomsOptions } from '../rooms/IGetMessagesOptions'; import type { IRoom, IRoomRaw } from '../rooms/index'; import type { IUser } from '../users/index'; diff --git a/packages/apps-engine/src/definition/externalComponent/IExternalComponentRoomInfo.ts b/packages/apps-engine/src/definition/externalComponent/IExternalComponentRoomInfo.ts new file mode 100644 index 0000000000000..090b9b6903379 --- /dev/null +++ b/packages/apps-engine/src/definition/externalComponent/IExternalComponentRoomInfo.ts @@ -0,0 +1,16 @@ +import type { IRoom } from '../rooms'; +import type { IExternalComponentUserInfo } from './IExternalComponentUserInfo'; + +type ClientRoomInfo = Pick; + +/** + * Represents the room's information returned to the + * external component. + */ +export interface IExternalComponentRoomInfo extends ClientRoomInfo { + /** + * the list that contains all the users belonging + * to this room. + */ + members: Array; +} diff --git a/packages/apps-engine/src/definition/externalComponent/IExternalComponentState.ts b/packages/apps-engine/src/definition/externalComponent/IExternalComponentState.ts index ba33072a28281..db726a8cd177f 100644 --- a/packages/apps-engine/src/definition/externalComponent/IExternalComponentState.ts +++ b/packages/apps-engine/src/definition/externalComponent/IExternalComponentState.ts @@ -1,4 +1,5 @@ -import type { IExternalComponentRoomInfo, IExternalComponentUserInfo } from '../../client/definition'; +import type { IExternalComponentRoomInfo } from './IExternalComponentRoomInfo'; +import type { IExternalComponentUserInfo } from './IExternalComponentUserInfo'; /** * The state of an external component, which contains the diff --git a/packages/apps-engine/src/definition/externalComponent/IExternalComponentUserInfo.ts b/packages/apps-engine/src/definition/externalComponent/IExternalComponentUserInfo.ts new file mode 100644 index 0000000000000..dd681db8d42bf --- /dev/null +++ b/packages/apps-engine/src/definition/externalComponent/IExternalComponentUserInfo.ts @@ -0,0 +1,14 @@ +import type { IUser } from '../users'; + +type ClientUserInfo = Pick; + +/** + * Represents the user's information returned to + * the external component. + */ +export interface IExternalComponentUserInfo extends ClientUserInfo { + /** + * the avatar URL of the Rocket.Chat user + */ + avatarUrl: string; +} diff --git a/packages/apps-engine/src/definition/externalComponent/index.ts b/packages/apps-engine/src/definition/externalComponent/index.ts index 69231fca5211f..6229bf8995f75 100644 --- a/packages/apps-engine/src/definition/externalComponent/index.ts +++ b/packages/apps-engine/src/definition/externalComponent/index.ts @@ -3,3 +3,7 @@ import type { IPostExternalComponentClosed } from './IPostExternalComponentClose import type { IPostExternalComponentOpened } from './IPostExternalComponentOpened'; export type { IExternalComponent, IPostExternalComponentClosed, IPostExternalComponentOpened }; + +export type * from './IExternalComponentState'; +export type * from './IExternalComponentRoomInfo'; +export type * from './IExternalComponentUserInfo'; diff --git a/packages/apps-engine/src/definition/oauth2/OAuth2.ts b/packages/apps-engine/src/definition/oauth2/OAuth2.ts index 6339e5ea224a4..d4d0dfe9fdc98 100644 --- a/packages/apps-engine/src/definition/oauth2/OAuth2.ts +++ b/packages/apps-engine/src/definition/oauth2/OAuth2.ts @@ -1,4 +1,4 @@ -import { OAuth2Client } from '../../server/oauth2/OAuth2Client'; +import { OAuth2Client } from './OAuth2Client'; import type { App } from '../App'; import type { IOAuth2ClientOptions } from './IOAuth2'; diff --git a/packages/apps-engine/src/definition/oauth2/OAuth2Client.ts b/packages/apps-engine/src/definition/oauth2/OAuth2Client.ts new file mode 100644 index 0000000000000..0f8a95b031321 --- /dev/null +++ b/packages/apps-engine/src/definition/oauth2/OAuth2Client.ts @@ -0,0 +1,337 @@ +import { URL } from 'url'; + +import type { App } from '../App'; +import type { IConfigurationExtend, IHttp, IModify, IPersistence, IRead } from '../accessors'; +import { HttpStatusCode } from '../accessors'; +import type { IApiEndpointInfo, IApiRequest, IApiResponse } from '../api'; +import { ApiSecurity, ApiVisibility } from '../api'; +import { RocketChatAssociationModel, RocketChatAssociationRecord } from '../metadata'; +import type { IAuthData, IOAuth2Client, IOAuth2ClientOptions } from './IOAuth2'; +import { SettingType } from '../settings'; +import type { IUser } from '../users'; + +export enum GrantType { + RefreshToken = 'refresh_token', + AuthorizationCode = 'authorization_code', +} + +export class OAuth2Client implements IOAuth2Client { + private defaultContents = { + success: `
\ +

\ + Authorization went successfully
\ + You can close this tab now
\ +

\ +
`, + failed: `
\ +

\ + Oops, something went wrong, please try again or in case it still does not work, contact the administrator.\ +

\ +
`, + }; + + constructor( + private readonly app: App, + private readonly config: IOAuth2ClientOptions, + ) {} + + public async setup(configuration: IConfigurationExtend): Promise { + await configuration.api.provideApi({ + security: ApiSecurity.UNSECURE, + visibility: ApiVisibility.PUBLIC, + endpoints: [ + { + path: `${this.config.alias}-callback`, + get: this.handleOAuthCallback.bind(this), + }, + ], + }); + + await Promise.all([ + configuration.settings.provideSetting({ + id: `${this.config.alias}-oauth-client-id`, + type: SettingType.STRING, + public: true, + required: true, + packageValue: '', + i18nLabel: `${this.config.alias}-oauth-client-id`, + }), + + configuration.settings.provideSetting({ + id: `${this.config.alias}-oauth-clientsecret`, + type: SettingType.STRING, + public: true, + required: true, + packageValue: '', + i18nLabel: `${this.config.alias}-oauth-client-secret`, + }), + ]); + } + + public async getUserAuthorizationUrl(user: IUser, scopes?: Array): Promise { + const redirectUri = this.app.getAccessors().providedApiEndpoints[0].computedPath.substring(1); + + const siteUrl = await this.getBaseURLWithoutTrailingSlash(); + + const finalScopes = ([] as Array).concat(this.config.defaultScopes || [], scopes || []); + + const { authUri } = this.config; + + const clientId = await this.app + .getAccessors() + .reader.getEnvironmentReader() + .getSettings() + .getValueById(`${this.config.alias}-oauth-client-id`); + + const url = new URL(authUri, siteUrl); + + url.searchParams.set('response_type', 'code'); + url.searchParams.set('redirect_uri', `${siteUrl}/${redirectUri}`); + url.searchParams.set('state', user.id); + url.searchParams.set('client_id', clientId); + url.searchParams.set('access_type', 'offline'); + + if (finalScopes.length > 0) { + url.searchParams.set('scope', finalScopes.join(' ')); + } + + return url; + } + + public async getAccessTokenForUser(user: IUser): Promise { + const associations = [ + new RocketChatAssociationRecord(RocketChatAssociationModel.USER, user.id), + new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `${this.config.alias}-oauth-connection`), + ]; + + const [result] = (await this.app.getAccessors().reader.getPersistenceReader().readByAssociations(associations)) as unknown as Array< + IAuthData | undefined + >; + + return result; + } + + public async refreshUserAccessToken(user: IUser, persis: IPersistence): Promise { + try { + const tokenInfo = await this.getAccessTokenForUser(user); + + if (!tokenInfo) { + throw new Error('User has no access token information'); + } + + if (!tokenInfo.refreshToken) { + throw new Error('User token information has no refresh token available'); + } + + const { + config: { refreshTokenUri }, + } = this; + + const clientId = await this.app + .getAccessors() + .reader.getEnvironmentReader() + .getSettings() + .getValueById(`${this.config.alias}-oauth-client-id`); + + const clientSecret = await this.app + .getAccessors() + .reader.getEnvironmentReader() + .getSettings() + .getValueById(`${this.config.alias}-oauth-clientsecret`); + + const siteUrl = await this.getBaseURLWithoutTrailingSlash(); + + const redirectUri = this.app.getAccessors().providedApiEndpoints[0].computedPath.substring(1); + + const url = new URL(refreshTokenUri); + + url.searchParams.set('client_id', clientId); + url.searchParams.set('client_secret', clientSecret); + url.searchParams.set('redirect_uri', `${siteUrl}/${redirectUri}`); + url.searchParams.set('refresh_token', tokenInfo.refreshToken); + url.searchParams.set('grant_type', GrantType.RefreshToken); + + const { content, statusCode } = await this.app.getAccessors().http.post(url.href); + + if (statusCode !== 200) { + throw new Error('Request to provider was unsuccessful. Check logs for more information'); + } + + const { access_token, expires_in, refresh_token, scope } = JSON.parse(content as string); + + if (!access_token) { + throw new Error('No access token returned by the provider'); + } + + const authData: IAuthData = { + scope, + token: access_token, + expiresAt: expires_in, + refreshToken: refresh_token || tokenInfo.refreshToken, + }; + + await this.saveToken(authData, user.id, persis); + + return authData; + } catch (error) { + this.app.getLogger().error(error); + throw error; + } + } + + public async revokeUserAccessToken(user: IUser, persis: IPersistence): Promise { + try { + const tokenInfo = await this.getAccessTokenForUser(user); + + if (!tokenInfo?.token) { + throw new Error('No access token available for this user.'); + } + + const url = new URL(this.config.revokeTokenUri); + + url.searchParams.set('token', tokenInfo?.token); + + const result = await this.app.getAccessors().http.post(url.href); + + if (result.statusCode !== 200) { + throw new Error('Provider did not allow token to be revoked'); + } + + await this.removeToken({ userId: user.id, persis }); + + return true; + } catch (error) { + this.app.getLogger().error(error); + return false; + } + } + + private async getBaseURLWithoutTrailingSlash(): Promise { + const SITE_URL = 'Site_Url'; + const url = await this.app.getAccessors().environmentReader.getServerSettings().getValueById(SITE_URL); + + if (url.endsWith('/')) { + return url.substr(0, url.length - 1); + } + return url; + } + + private async handleOAuthCallback( + request: IApiRequest, + endpoint: IApiEndpointInfo, + read: IRead, + modify: IModify, + http: IHttp, + persis: IPersistence, + ): Promise { + try { + const { + query: { code, state }, + } = request; + + const user = await this.app.getAccessors().reader.getUserReader().getById(state); + + if (!user) { + throw new Error('User could not be determined.'); + } + + // User chose not to authorize the access + if (!code) { + const failedResult = await this.config.authorizationCallback?.(undefined, user, read, modify, http, persis); + + return { + status: HttpStatusCode.UNAUTHORIZED, + content: failedResult?.responseContent || this.defaultContents.failed, + }; + } + + const siteUrl = await this.getBaseURLWithoutTrailingSlash(); + + const accessTokenUrl = this.config.accessTokenUri; + + const redirectUri = this.app.getAccessors().providedApiEndpoints[0].computedPath.substring(1); + + const clientId = await this.app + .getAccessors() + .reader.getEnvironmentReader() + .getSettings() + .getValueById(`${this.config.alias}-oauth-client-id`); + + const clientSecret = await this.app + .getAccessors() + .reader.getEnvironmentReader() + .getSettings() + .getValueById(`${this.config.alias}-oauth-clientsecret`); + + const url = new URL(accessTokenUrl, siteUrl); + + url.searchParams.set('client_id', clientId); + url.searchParams.set('redirect_uri', `${siteUrl}/${redirectUri}`); + url.searchParams.set('code', code); + url.searchParams.set('client_secret', clientSecret); + url.searchParams.set('access_type', 'offline'); + url.searchParams.set('grant_type', GrantType.AuthorizationCode); + + const { content, statusCode } = await http.post(url.href, { + headers: { Accept: 'application/json' }, + }); + + // If provider had a server error, nothing we can do + if (statusCode >= 500) { + throw new Error('Request for access token failed. Check logs for more information'); + } + + const response = JSON.parse(content as string); + const { access_token, expires_in, refresh_token, scope } = response; + + const authData: IAuthData = { + scope, + token: access_token, + expiresAt: expires_in, + refreshToken: refresh_token, + }; + + const result = await this.config.authorizationCallback?.(authData, user, read, modify, http, persis); + + await this.saveToken(authData, user.id, persis); + + return { + status: statusCode, + content: result?.responseContent || this.defaultContents.success, + }; + } catch (error) { + this.app.getLogger().error(error); + return { + status: HttpStatusCode.INTERNAL_SERVER_ERROR, + content: this.defaultContents.failed, + }; + } + } + + private async saveToken(authData: IAuthData, userId: string, persis: IPersistence): Promise { + const { scope, token, expiresAt, refreshToken } = authData; + + return persis.updateByAssociations( + [ + new RocketChatAssociationRecord(RocketChatAssociationModel.USER, userId), + new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `${this.config.alias}-oauth-connection`), + ], + { + scope, + token, + expiresAt: expiresAt || '', + refreshToken: refreshToken || '', + }, + true, // we want to create the record if it doesn't exist + ); + } + + private async removeToken({ userId, persis }: { userId: string; persis: IPersistence }): Promise { + const [result] = (await persis.removeByAssociations([ + new RocketChatAssociationRecord(RocketChatAssociationModel.USER, userId), + new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `${this.config.alias}-oauth-connection`), + ])) as unknown as Array; + + return result; + } +} diff --git a/packages/apps-engine/src/definition/rooms/IGetMessagesOptions.ts b/packages/apps-engine/src/definition/rooms/IGetMessagesOptions.ts new file mode 100644 index 0000000000000..b2a36adde9843 --- /dev/null +++ b/packages/apps-engine/src/definition/rooms/IGetMessagesOptions.ts @@ -0,0 +1,43 @@ +import type { RoomType } from './RoomType'; + +export const GetMessagesSortableFields = ['createdAt'] as const; + +export type GetMessagesOptions = { + limit: number; + skip: number; + sort: Record<(typeof GetMessagesSortableFields)[number], 'asc' | 'desc'>; + showThreadMessages: boolean; +}; + +/** + * Filters for querying rooms in the system. + */ +export type GetRoomsFilters = { + /** + * When specified, only rooms matching the provided types will be returned. + */ + types?: Array; + /** + * Filter to include or exclude discussion rooms. + * + * When undefined (default), discussions are included in the result set. + * + * When true, ONLY discussions are included in the result set (remove non-discussions). + * When false, discussion rooms are excluded from the result set. + */ + discussions?: boolean; + /** + * Filter to include or exclude team main rooms. + * + * When undefined (default), team main rooms are included in the result set. + * + * When true, ONLY team main rooms are included in the result set (remove non-teams). + * When false, team main rooms are excluded from the result set. + */ + teams?: boolean; +}; + +export type GetRoomsOptions = { + limit?: number; + skip?: number; +}; diff --git a/packages/apps-engine/src/definition/rooms/index.ts b/packages/apps-engine/src/definition/rooms/index.ts index d4e51c6089c77..eb5083756daa1 100644 --- a/packages/apps-engine/src/definition/rooms/index.ts +++ b/packages/apps-engine/src/definition/rooms/index.ts @@ -26,3 +26,4 @@ export type * from './IRoomUserJoinedContext'; export type * from './IPreRoomUserLeave'; export type * from './IPostRoomUserLeave'; export type * from './IRoomUserLeaveContext'; +export type * from './IGetMessagesOptions'; diff --git a/packages/apps/deno-runtime/deno.lock b/packages/apps/deno-runtime/deno.lock index bc87cb5e87d84..4ef784109019f 100644 --- a/packages/apps/deno-runtime/deno.lock +++ b/packages/apps/deno-runtime/deno.lock @@ -7,6 +7,7 @@ "jsr:@std/streams@^1.0.16": "1.0.16", "npm:@msgpack/msgpack@3.0.0-beta2": "3.0.0-beta2", "npm:@rocket.chat/ui-kit@~0.31.22": "0.31.25_@rocket.chat+icons@0.32.0", + "npm:@types/node@*": "22.12.0", "npm:acorn-walk@8.2.0": "8.2.0", "npm:acorn@8.10.0": "8.10.0", "npm:astring@1.8.6": "1.8.6", @@ -37,7 +38,8 @@ }, "npm": { "@msgpack/msgpack@3.0.0-beta2": { - "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==" + "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==", + "deprecated": true }, "@rocket.chat/icons@0.32.0": { "integrity": "sha512-7yhhELKNLb9kUtXCvau0V+iMXraV2bOsxcPjc/ZtLR5VeeIDTeaflqRWGtLroX6f3bE+J1n5qB5zi8A4YXuH2g==" @@ -48,6 +50,12 @@ "@rocket.chat/icons" ] }, + "@types/node@22.12.0": { + "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", + "dependencies": [ + "undici-types" + ] + }, "acorn-walk@8.2.0": { "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" }, @@ -65,6 +73,9 @@ "stack-trace@0.0.10": { "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" }, + "undici-types@6.20.0": { + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, "uuid@8.3.2": { "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": true diff --git a/packages/apps/package.json b/packages/apps/package.json index f5f11360d9e1e..20aacfec4cea8 100644 --- a/packages/apps/package.json +++ b/packages/apps/package.json @@ -3,11 +3,11 @@ "version": "0.6.9", "private": true, "main": "./dist/index.js", - "typings": "./dist/index.d.ts", + "types": "./dist/index.d.ts", "files": [ - "/dist", - "/deno-runtime", - "/scripts" + "dist/", + "deno-runtime/", + ".deno-cache/" ], "scripts": { "build": "run-s build:clean build:default build:deno-cache", @@ -16,9 +16,10 @@ "build:deno-cache": "node scripts/deno-cache.js", "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput", "lint": "eslint .", - "lint:fix": "eslint --fix .", - "test:deno": "cd deno-runtime && deno task test", - "test:node": "NODE_ENV=test node --require ts-node/register/transpile-only --test-reporter spec --test \"tests/**/*.test.ts\"" + "test:deno": "deno task --config=deno-runtime/deno.jsonc test", + "test:node": "NODE_ENV=test node --require ts-node/register/transpile-only --test-reporter spec --test \"tests/**/*.test.ts\"", + "testunit": "yarn test:node && yarn test:deno", + "typecheck": "tsc -p tsconfig.json --noEmit" }, "dependencies": { "@msgpack/msgpack": "3.0.0-beta2", @@ -53,5 +54,8 @@ }, "volta": { "extends": "../../package.json" + }, + "installConfig": { + "hoistingLimits": "workspaces" } } diff --git a/packages/apps/src/AppsEngine.ts b/packages/apps/src/AppsEngine.ts index 4bffbbbc810fb..1184c237b060d 100644 --- a/packages/apps/src/AppsEngine.ts +++ b/packages/apps/src/AppsEngine.ts @@ -20,6 +20,6 @@ export type { IVideoConference as IAppsVideoConference, VideoConference as AppsVideoConference, } from '@rocket.chat/apps-engine/definition/videoConferences'; -export { AppManager } from '@rocket.chat/apps-engine/server/AppManager'; -export { AppBridges } from '@rocket.chat/apps-engine/server/bridges'; -export { AppMetadataStorage } from '@rocket.chat/apps-engine/server/storage'; +export { AppManager } from './server/AppManager'; +export { AppBridges } from './server/bridges'; +export { AppMetadataStorage } from './server/storage'; diff --git a/packages/apps/src/IAppServerOrchestrator.ts b/packages/apps/src/IAppServerOrchestrator.ts index 2f1f7db5d4b50..aabfb0078750c 100644 --- a/packages/apps/src/IAppServerOrchestrator.ts +++ b/packages/apps/src/IAppServerOrchestrator.ts @@ -1,11 +1,11 @@ -import type { AppManager } from '@rocket.chat/apps-engine/server/AppManager'; -import type { AppSourceStorage } from '@rocket.chat/apps-engine/server/storage'; import type { Logger } from '@rocket.chat/logger'; import type { IAppsPersistenceModel } from '@rocket.chat/model-typings'; import type { AppBridges, AppEvents, AppMetadataStorage } from './AppsEngine'; import type { IAppServerNotifier } from './IAppServerNotifier'; import type { IAppConvertersMap } from './converters'; +import type { AppManager } from './server/AppManager'; +import type { AppSourceStorage } from './server/storage'; export interface IAppServerOrchestrator { initialize(): void; diff --git a/packages/apps/src/converters/IAppMessagesConverter.ts b/packages/apps/src/converters/IAppMessagesConverter.ts index 8c10114304d09..5a2a025b86206 100644 --- a/packages/apps/src/converters/IAppMessagesConverter.ts +++ b/packages/apps/src/converters/IAppMessagesConverter.ts @@ -5,8 +5,8 @@ import type { IAppsMessage, IAppsMesssageRaw } from '../AppsEngine'; export interface IAppMessagesConverter { convertById(messageId: IMessage['_id']): Promise; convertMessage(message: undefined | null): Promise; - convertMessage(message: IMessage): Promise; - convertMessage(message: IMessage | undefined | null): Promise; + convertMessage(message: IMessage, cacheKey?: object): Promise; + convertMessage(message: IMessage | undefined | null, cacheKey?: object): Promise; convertAppMessage(message: undefined | null): Promise; convertAppMessage(message: IAppsMessage): Promise; convertAppMessage(message: IAppsMessage, isPartial: boolean): Promise>; diff --git a/packages/apps/src/server/bridges/RoomBridge.ts b/packages/apps/src/server/bridges/RoomBridge.ts index 5f1d7b2ae7ff6..662fb1039b76c 100644 --- a/packages/apps/src/server/bridges/RoomBridge.ts +++ b/packages/apps/src/server/bridges/RoomBridge.ts @@ -1,5 +1,7 @@ import type { IMessage, IMessageRaw } from '@rocket.chat/apps-engine/definition/messages'; -import type { IRoom, IRoomRaw, RoomType } from '@rocket.chat/apps-engine/definition/rooms'; +import type { IRoom, IRoomRaw } from '@rocket.chat/apps-engine/definition/rooms'; +import { GetMessagesSortableFields } from '@rocket.chat/apps-engine/definition/rooms/IGetMessagesOptions'; +import type { GetMessagesOptions, GetRoomsFilters, GetRoomsOptions } from '@rocket.chat/apps-engine/definition/rooms/IGetMessagesOptions'; import type { IUser } from '@rocket.chat/apps-engine/definition/users'; import { BaseBridge } from './BaseBridge'; @@ -7,47 +9,8 @@ import { PermissionDeniedError } from '../errors/PermissionDeniedError'; import { AppPermissionManager } from '../managers/AppPermissionManager'; import { AppPermissions } from '../permissions/AppPermissions'; -export const GetMessagesSortableFields = ['createdAt'] as const; - -export type GetMessagesOptions = { - limit: number; - skip: number; - sort: Record<(typeof GetMessagesSortableFields)[number], 'asc' | 'desc'>; - showThreadMessages: boolean; -}; - -/** - * Filters for querying rooms in the system. - */ -export type GetRoomsFilters = { - /** - * When specified, only rooms matching the provided types will be returned. - */ - types?: Array; - /** - * Filter to include or exclude discussion rooms. - * - * When undefined (default), discussions are included in the result set. - * - * When true, ONLY discussions are included in the result set (remove non-discussions). - * When false, discussion rooms are excluded from the result set. - */ - discussions?: boolean; - /** - * Filter to include or exclude team main rooms. - * - * When undefined (default), team main rooms are included in the result set. - * - * When true, ONLY team main rooms are included in the result set (remove non-teams). - * When false, team main rooms are excluded from the result set. - */ - teams?: boolean; -}; - -export type GetRoomsOptions = { - limit?: number; - skip?: number; -}; +export { GetMessagesSortableFields }; +export type { GetMessagesOptions, GetRoomsFilters, GetRoomsOptions }; export abstract class RoomBridge extends BaseBridge { public async doCreate(room: IRoom, members: Array, appId: string): Promise { diff --git a/packages/apps/src/server/oauth2/OAuth2Client.ts b/packages/apps/src/server/oauth2/OAuth2Client.ts index 08cbd0314aec9..d6277bca86622 100644 --- a/packages/apps/src/server/oauth2/OAuth2Client.ts +++ b/packages/apps/src/server/oauth2/OAuth2Client.ts @@ -1,337 +1 @@ -import { URL } from 'url'; - -import type { App } from '@rocket.chat/apps-engine/definition/App'; -import type { IConfigurationExtend, IHttp, IModify, IPersistence, IRead } from '@rocket.chat/apps-engine/definition/accessors'; -import { HttpStatusCode } from '@rocket.chat/apps-engine/definition/accessors'; -import type { IApiEndpointInfo, IApiRequest, IApiResponse } from '@rocket.chat/apps-engine/definition/api'; -import { ApiSecurity, ApiVisibility } from '@rocket.chat/apps-engine/definition/api'; -import { RocketChatAssociationModel, RocketChatAssociationRecord } from '@rocket.chat/apps-engine/definition/metadata'; -import type { IAuthData, IOAuth2Client, IOAuth2ClientOptions } from '@rocket.chat/apps-engine/definition/oauth2/IOAuth2'; -import { SettingType } from '@rocket.chat/apps-engine/definition/settings'; -import type { IUser } from '@rocket.chat/apps-engine/definition/users'; - -export enum GrantType { - RefreshToken = 'refresh_token', - AuthorizationCode = 'authorization_code', -} - -export class OAuth2Client implements IOAuth2Client { - private defaultContents = { - success: `
\ -

\ - Authorization went successfully
\ - You can close this tab now
\ -

\ -
`, - failed: `
\ -

\ - Oops, something went wrong, please try again or in case it still does not work, contact the administrator.\ -

\ -
`, - }; - - constructor( - private readonly app: App, - private readonly config: IOAuth2ClientOptions, - ) {} - - public async setup(configuration: IConfigurationExtend): Promise { - await configuration.api.provideApi({ - security: ApiSecurity.UNSECURE, - visibility: ApiVisibility.PUBLIC, - endpoints: [ - { - path: `${this.config.alias}-callback`, - get: this.handleOAuthCallback.bind(this), - }, - ], - }); - - await Promise.all([ - configuration.settings.provideSetting({ - id: `${this.config.alias}-oauth-client-id`, - type: SettingType.STRING, - public: true, - required: true, - packageValue: '', - i18nLabel: `${this.config.alias}-oauth-client-id`, - }), - - configuration.settings.provideSetting({ - id: `${this.config.alias}-oauth-clientsecret`, - type: SettingType.STRING, - public: true, - required: true, - packageValue: '', - i18nLabel: `${this.config.alias}-oauth-client-secret`, - }), - ]); - } - - public async getUserAuthorizationUrl(user: IUser, scopes?: Array): Promise { - const redirectUri = this.app.getAccessors().providedApiEndpoints[0].computedPath.substring(1); - - const siteUrl = await this.getBaseURLWithoutTrailingSlash(); - - const finalScopes = ([] as Array).concat(this.config.defaultScopes || [], scopes || []); - - const { authUri } = this.config; - - const clientId = await this.app - .getAccessors() - .reader.getEnvironmentReader() - .getSettings() - .getValueById(`${this.config.alias}-oauth-client-id`); - - const url = new URL(authUri, siteUrl); - - url.searchParams.set('response_type', 'code'); - url.searchParams.set('redirect_uri', `${siteUrl}/${redirectUri}`); - url.searchParams.set('state', user.id); - url.searchParams.set('client_id', clientId); - url.searchParams.set('access_type', 'offline'); - - if (finalScopes.length > 0) { - url.searchParams.set('scope', finalScopes.join(' ')); - } - - return url; - } - - public async getAccessTokenForUser(user: IUser): Promise { - const associations = [ - new RocketChatAssociationRecord(RocketChatAssociationModel.USER, user.id), - new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `${this.config.alias}-oauth-connection`), - ]; - - const [result] = (await this.app.getAccessors().reader.getPersistenceReader().readByAssociations(associations)) as unknown as Array< - IAuthData | undefined - >; - - return result; - } - - public async refreshUserAccessToken(user: IUser, persis: IPersistence): Promise { - try { - const tokenInfo = await this.getAccessTokenForUser(user); - - if (!tokenInfo) { - throw new Error('User has no access token information'); - } - - if (!tokenInfo.refreshToken) { - throw new Error('User token information has no refresh token available'); - } - - const { - config: { refreshTokenUri }, - } = this; - - const clientId = await this.app - .getAccessors() - .reader.getEnvironmentReader() - .getSettings() - .getValueById(`${this.config.alias}-oauth-client-id`); - - const clientSecret = await this.app - .getAccessors() - .reader.getEnvironmentReader() - .getSettings() - .getValueById(`${this.config.alias}-oauth-clientsecret`); - - const siteUrl = await this.getBaseURLWithoutTrailingSlash(); - - const redirectUri = this.app.getAccessors().providedApiEndpoints[0].computedPath.substring(1); - - const url = new URL(refreshTokenUri); - - url.searchParams.set('client_id', clientId); - url.searchParams.set('client_secret', clientSecret); - url.searchParams.set('redirect_uri', `${siteUrl}/${redirectUri}`); - url.searchParams.set('refresh_token', tokenInfo.refreshToken); - url.searchParams.set('grant_type', GrantType.RefreshToken); - - const { content, statusCode } = await this.app.getAccessors().http.post(url.href); - - if (statusCode !== 200) { - throw new Error('Request to provider was unsuccessful. Check logs for more information'); - } - - const { access_token, expires_in, refresh_token, scope } = JSON.parse(content as string); - - if (!access_token) { - throw new Error('No access token returned by the provider'); - } - - const authData: IAuthData = { - scope, - token: access_token, - expiresAt: expires_in, - refreshToken: refresh_token || tokenInfo.refreshToken, - }; - - await this.saveToken(authData, user.id, persis); - - return authData; - } catch (error) { - this.app.getLogger().error(error); - throw error; - } - } - - public async revokeUserAccessToken(user: IUser, persis: IPersistence): Promise { - try { - const tokenInfo = await this.getAccessTokenForUser(user); - - if (!tokenInfo?.token) { - throw new Error('No access token available for this user.'); - } - - const url = new URL(this.config.revokeTokenUri); - - url.searchParams.set('token', tokenInfo?.token); - - const result = await this.app.getAccessors().http.post(url.href); - - if (result.statusCode !== 200) { - throw new Error('Provider did not allow token to be revoked'); - } - - await this.removeToken({ userId: user.id, persis }); - - return true; - } catch (error) { - this.app.getLogger().error(error); - return false; - } - } - - private async getBaseURLWithoutTrailingSlash(): Promise { - const SITE_URL = 'Site_Url'; - const url = await this.app.getAccessors().environmentReader.getServerSettings().getValueById(SITE_URL); - - if (url.endsWith('/')) { - return url.substr(0, url.length - 1); - } - return url; - } - - private async handleOAuthCallback( - request: IApiRequest, - endpoint: IApiEndpointInfo, - read: IRead, - modify: IModify, - http: IHttp, - persis: IPersistence, - ): Promise { - try { - const { - query: { code, state }, - } = request; - - const user = await this.app.getAccessors().reader.getUserReader().getById(state); - - if (!user) { - throw new Error('User could not be determined.'); - } - - // User chose not to authorize the access - if (!code) { - const failedResult = await this.config.authorizationCallback?.(undefined, user, read, modify, http, persis); - - return { - status: HttpStatusCode.UNAUTHORIZED, - content: failedResult?.responseContent || this.defaultContents.failed, - }; - } - - const siteUrl = await this.getBaseURLWithoutTrailingSlash(); - - const accessTokenUrl = this.config.accessTokenUri; - - const redirectUri = this.app.getAccessors().providedApiEndpoints[0].computedPath.substring(1); - - const clientId = await this.app - .getAccessors() - .reader.getEnvironmentReader() - .getSettings() - .getValueById(`${this.config.alias}-oauth-client-id`); - - const clientSecret = await this.app - .getAccessors() - .reader.getEnvironmentReader() - .getSettings() - .getValueById(`${this.config.alias}-oauth-clientsecret`); - - const url = new URL(accessTokenUrl, siteUrl); - - url.searchParams.set('client_id', clientId); - url.searchParams.set('redirect_uri', `${siteUrl}/${redirectUri}`); - url.searchParams.set('code', code); - url.searchParams.set('client_secret', clientSecret); - url.searchParams.set('access_type', 'offline'); - url.searchParams.set('grant_type', GrantType.AuthorizationCode); - - const { content, statusCode } = await http.post(url.href, { - headers: { Accept: 'application/json' }, - }); - - // If provider had a server error, nothing we can do - if (statusCode >= 500) { - throw new Error('Request for access token failed. Check logs for more information'); - } - - const response = JSON.parse(content as string); - const { access_token, expires_in, refresh_token, scope } = response; - - const authData: IAuthData = { - scope, - token: access_token, - expiresAt: expires_in, - refreshToken: refresh_token, - }; - - const result = await this.config.authorizationCallback?.(authData, user, read, modify, http, persis); - - await this.saveToken(authData, user.id, persis); - - return { - status: statusCode, - content: result?.responseContent || this.defaultContents.success, - }; - } catch (error) { - this.app.getLogger().error(error); - return { - status: HttpStatusCode.INTERNAL_SERVER_ERROR, - content: this.defaultContents.failed, - }; - } - } - - private async saveToken(authData: IAuthData, userId: string, persis: IPersistence): Promise { - const { scope, token, expiresAt, refreshToken } = authData; - - return persis.updateByAssociations( - [ - new RocketChatAssociationRecord(RocketChatAssociationModel.USER, userId), - new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `${this.config.alias}-oauth-connection`), - ], - { - scope, - token, - expiresAt: expiresAt || '', - refreshToken: refreshToken || '', - }, - true, // we want to create the record if it doesn't exist - ); - } - - private async removeToken({ userId, persis }: { userId: string; persis: IPersistence }): Promise { - const [result] = (await persis.removeByAssociations([ - new RocketChatAssociationRecord(RocketChatAssociationModel.USER, userId), - new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `${this.config.alias}-oauth-connection`), - ])) as unknown as Array; - - return result; - } -} +export { OAuth2Client, GrantType } from '@rocket.chat/apps-engine/definition/oauth2/OAuth2Client'; diff --git a/packages/core-services/package.json b/packages/core-services/package.json index 12423f388bde2..30f4f74e1e5a7 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -29,7 +29,7 @@ "@rocket.chat/ui-kit": "workspace:~" }, "devDependencies": { - "@rocket.chat/apps-engine": "workspace:^", + "@rocket.chat/apps": "workspace:^", "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/tsconfig": "workspace:*", "@types/jest": "~30.0.0", diff --git a/packages/core-services/src/types/IAppsEngineService.ts b/packages/core-services/src/types/IAppsEngineService.ts index 5d026c5149fb9..361112ce42945 100644 --- a/packages/core-services/src/types/IAppsEngineService.ts +++ b/packages/core-services/src/types/IAppsEngineService.ts @@ -1,7 +1,7 @@ +import type { IGetAppsFilter } from '@rocket.chat/apps/dist/server/IGetAppsFilter'; +import type { IAppStorageItem } from '@rocket.chat/apps/dist/server/storage'; import type { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; import type { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; -import type { IGetAppsFilter } from '@rocket.chat/apps-engine/server/IGetAppsFilter'; -import type { IAppStorageItem } from '@rocket.chat/apps-engine/server/storage'; export type AppStatusReport = { [appId: string]: { instanceId: string; isLocal: boolean; status: AppStatus }[]; diff --git a/yarn.lock b/yarn.lock index b8074571378cf..3882adc09d08d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9052,7 +9052,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/core-services@workspace:packages/core-services" dependencies: - "@rocket.chat/apps-engine": "workspace:^" + "@rocket.chat/apps": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/federation-sdk": "npm:0.6.3" "@rocket.chat/http-router": "workspace:^" @@ -14828,7 +14828,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=0.0.2, @types/node@npm:>=12, @types/node@npm:>=12.0.0, @types/node@npm:>=13.7.0, @types/node@npm:>=18, @types/node@npm:>=18.0.0": +"@types/node@npm:*, @types/node@npm:>=12, @types/node@npm:>=12.0.0, @types/node@npm:>=13.7.0, @types/node@npm:>=18, @types/node@npm:>=18.0.0": version: 22.16.1 resolution: "@types/node@npm:22.16.1" dependencies: @@ -14837,6 +14837,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:>=0.0.2": + version: 25.6.0 + resolution: "@types/node@npm:25.6.0" + dependencies: + undici-types: "npm:~7.19.0" + checksum: 10/99b18690a4be55904cbf8f6a6ac8eed5ec5b8d791fdd8ee2ae598b46c0fa9b83cda7b70dd7f00dbfb18189dcfc67648fdc7fdd3fcced2619a5a6453d9aec107d + languageName: node + linkType: hard + "@types/node@npm:^12.7.1": version: 12.20.55 resolution: "@types/node@npm:12.20.55" @@ -26727,7 +26736,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.1, js-yaml@npm:^3.2.7, js-yaml@npm:^3.6.1": +"js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.1, js-yaml@npm:^3.6.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" dependencies: @@ -26739,6 +26748,18 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:^3.2.7": + version: 3.14.2 + resolution: "js-yaml@npm:3.14.2" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10/172e0b6007b0bf0fc8d2469c94424f7dd765c64a047d2b790831fecef2204a4054eabf4d911eb73ab8c9a3256ab8ba1ee8d655b789bf24bf059c772acc2075a1 + languageName: node + linkType: hard + "js-yaml@npm:^4.1.1": version: 4.1.1 resolution: "js-yaml@npm:4.1.1" @@ -36914,6 +36935,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~7.19.0": + version: 7.19.2 + resolution: "undici-types@npm:7.19.2" + checksum: 10/05c34c63444c8caca7137f122b29ed50c1d7d05d1e0b2337f423575d3264054c4a0139e47e82e65723d09b97fcad6d8b0223b3550430a9006cc00e72a1e035bf + languageName: node + linkType: hard + "undici@npm:^6.23.0, undici@npm:^6.24.0": version: 6.25.0 resolution: "undici@npm:6.25.0"