Skip to content

Commit 17a0576

Browse files
d-gubertclaude
andauthored
chore(apps): consolidate accessor implementation to runtime (4/4) (#41171)
Co-authored-by: Claude <noreply@anthropic.com>
1 parent c7970e7 commit 17a0576

55 files changed

Lines changed: 1131 additions & 1580 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/adr/0001-app-accessor-logic-in-base-runtime.md

Lines changed: 463 additions & 0 deletions
Large diffs are not rendered by default.

docs/proposals/apps-accessor-consolidation/README.md

Lines changed: 0 additions & 757 deletions
This file was deleted.

docs/proposals/apps-accessor-consolidation/base-runtime-app-id-exceptions.md

Lines changed: 0 additions & 94 deletions
This file was deleted.
Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,53 @@
11
import type { IPersistence } from '@rocket.chat/apps-engine/definition/accessors';
22
import type { RocketChatAssociationRecord } from '@rocket.chat/apps-engine/definition/metadata';
33

4-
import type { RemoteBridges } from '../bridges/RemoteBridges';
4+
import { bridgeCall } from '../bridges/bridgeCall';
5+
import type * as Messenger from '../messenger';
56

67
export class Persistence implements IPersistence {
7-
constructor(private readonly bridges: RemoteBridges) {}
8+
constructor(private readonly senderFn: typeof Messenger.sendRequest) {}
89

910
public create(data: object): Promise<string> {
10-
return this.bridges.getPersistenceBridge().doCreate(data, 'APP_ID') as Promise<string>;
11+
return bridgeCall<string>(this.senderFn, 'getPersistenceBridge', 'doCreate', data, 'APP_ID');
1112
}
1213

1314
public createWithAssociation(data: object, association: RocketChatAssociationRecord): Promise<string> {
14-
return this.bridges.getPersistenceBridge().doCreateWithAssociations(data, new Array(association), 'APP_ID') as Promise<string>;
15+
return bridgeCall<string>(this.senderFn, 'getPersistenceBridge', 'doCreateWithAssociations', data, new Array(association), 'APP_ID');
1516
}
1617

1718
public createWithAssociations(data: object, associations: Array<RocketChatAssociationRecord>): Promise<string> {
18-
return this.bridges.getPersistenceBridge().doCreateWithAssociations(data, associations, 'APP_ID') as Promise<string>;
19+
return bridgeCall<string>(this.senderFn, 'getPersistenceBridge', 'doCreateWithAssociations', data, associations, 'APP_ID');
1920
}
2021

2122
public update(id: string, data: object, upsert = false): Promise<string> {
22-
return this.bridges.getPersistenceBridge().doUpdate(id, data, upsert, 'APP_ID') as Promise<string>;
23+
return bridgeCall<string>(this.senderFn, 'getPersistenceBridge', 'doUpdate', id, data, upsert, 'APP_ID');
2324
}
2425

2526
public updateByAssociation(association: RocketChatAssociationRecord, data: object, upsert = false): Promise<string> {
26-
return this.bridges.getPersistenceBridge().doUpdateByAssociations(new Array(association), data, upsert, 'APP_ID') as Promise<string>;
27+
return bridgeCall<string>(
28+
this.senderFn,
29+
'getPersistenceBridge',
30+
'doUpdateByAssociations',
31+
new Array(association),
32+
data,
33+
upsert,
34+
'APP_ID',
35+
);
2736
}
2837

2938
public updateByAssociations(associations: Array<RocketChatAssociationRecord>, data: object, upsert = false): Promise<string> {
30-
return this.bridges.getPersistenceBridge().doUpdateByAssociations(associations, data, upsert, 'APP_ID') as Promise<string>;
39+
return bridgeCall<string>(this.senderFn, 'getPersistenceBridge', 'doUpdateByAssociations', associations, data, upsert, 'APP_ID');
3140
}
3241

3342
public remove(id: string): Promise<object> {
34-
return this.bridges.getPersistenceBridge().doRemove(id, 'APP_ID') as Promise<object>;
43+
return bridgeCall<object>(this.senderFn, 'getPersistenceBridge', 'doRemove', id, 'APP_ID');
3544
}
3645

3746
public removeByAssociation(association: RocketChatAssociationRecord): Promise<Array<object>> {
38-
return this.bridges.getPersistenceBridge().doRemoveByAssociations(new Array(association), 'APP_ID') as Promise<Array<object>>;
47+
return bridgeCall<Array<object>>(this.senderFn, 'getPersistenceBridge', 'doRemoveByAssociations', new Array(association), 'APP_ID');
3948
}
4049

4150
public removeByAssociations(associations: Array<RocketChatAssociationRecord>): Promise<Array<object>> {
42-
return this.bridges.getPersistenceBridge().doRemoveByAssociations(associations, 'APP_ID') as Promise<Array<object>>;
51+
return bridgeCall<Array<object>>(this.senderFn, 'getPersistenceBridge', 'doRemoveByAssociations', associations, 'APP_ID');
4352
}
4453
}
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import type { IEnvironmentalVariableRead } from '@rocket.chat/apps-engine/definition/accessors';
22

3-
import type { RemoteBridges } from '../../bridges/RemoteBridges';
3+
import { bridgeCall } from '../../bridges/bridgeCall';
4+
import type * as Messenger from '../../messenger';
45

56
export class EnvironmentalVariableRead implements IEnvironmentalVariableRead {
6-
constructor(private readonly bridges: RemoteBridges) {}
7+
constructor(private readonly senderFn: typeof Messenger.sendRequest) {}
78

89
public getValueByName(envVarName: string): Promise<string> {
9-
return this.bridges.getEnvironmentalVariableBridge().doGetValueByName(envVarName, 'APP_ID') as Promise<string>;
10+
return bridgeCall<string>(this.senderFn, 'getEnvironmentalVariableBridge', 'doGetValueByName', envVarName, 'APP_ID');
1011
}
1112

1213
public isReadable(envVarName: string): Promise<boolean> {
13-
return this.bridges.getEnvironmentalVariableBridge().doIsReadable(envVarName, 'APP_ID') as Promise<boolean>;
14+
return bridgeCall<boolean>(this.senderFn, 'getEnvironmentalVariableBridge', 'doIsReadable', envVarName, 'APP_ID');
1415
}
1516

1617
public isSet(envVarName: string): Promise<boolean> {
17-
return this.bridges.getEnvironmentalVariableBridge().doIsSet(envVarName, 'APP_ID') as Promise<boolean>;
18+
return bridgeCall<boolean>(this.senderFn, 'getEnvironmentalVariableBridge', 'doIsSet', envVarName, 'APP_ID');
1819
}
1920
}

packages/apps/base-runtime/src/lib/accessors/environment/ServerSettingRead.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
import type { IServerSettingRead } from '@rocket.chat/apps-engine/definition/accessors';
22
import type { ISetting } from '@rocket.chat/apps-engine/definition/settings';
33

4-
import type { RemoteBridges } from '../../bridges/RemoteBridges';
4+
import { bridgeCall } from '../../bridges/bridgeCall';
5+
import type * as Messenger from '../../messenger';
56

67
export class ServerSettingRead implements IServerSettingRead {
7-
constructor(private readonly bridges: RemoteBridges) {}
8+
constructor(private readonly senderFn: typeof Messenger.sendRequest) {}
89

910
public getOneById(id: string): Promise<ISetting> {
10-
return this.bridges.getServerSettingBridge().doGetOneById(id, 'APP_ID') as Promise<ISetting>;
11+
return bridgeCall<ISetting>(this.senderFn, 'getServerSettingBridge', 'doGetOneById', id, 'APP_ID');
1112
}
1213

1314
public async getValueById(id: string): Promise<any> {
14-
const set = (await this.bridges.getServerSettingBridge().doGetOneById(id, 'APP_ID')) as ISetting;
15+
const set = (await bridgeCall(this.senderFn, 'getServerSettingBridge', 'doGetOneById', id, 'APP_ID')) as ISetting;
1516

1617
// The host accessor checks `typeof set === 'undefined'`, but across the RPC boundary an
1718
// absent (undefined) host return is serialized as null, so both must be treated as "not found".
@@ -31,6 +32,6 @@ export class ServerSettingRead implements IServerSettingRead {
3132
}
3233

3334
public isReadableById(id: string): Promise<boolean> {
34-
return this.bridges.getServerSettingBridge().doIsReadableById(id, 'APP_ID') as Promise<boolean>;
35+
return bridgeCall<boolean>(this.senderFn, 'getServerSettingBridge', 'doIsReadableById', id, 'APP_ID');
3536
}
3637
}
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import type { IServerSettingUpdater } from '@rocket.chat/apps-engine/definition/accessors';
22
import type { ISetting } from '@rocket.chat/apps-engine/definition/settings';
33

4-
import type { RemoteBridges } from '../../bridges/RemoteBridges';
4+
import { bridgeCall } from '../../bridges/bridgeCall';
5+
import type * as Messenger from '../../messenger';
56

67
export class ServerSettingUpdater implements IServerSettingUpdater {
7-
constructor(private readonly bridges: RemoteBridges) {}
8+
constructor(private readonly senderFn: typeof Messenger.sendRequest) {}
89

910
public async updateOne(setting: ISetting): Promise<void> {
10-
await this.bridges.getServerSettingBridge().doUpdateOne(setting, 'APP_ID');
11+
await bridgeCall(this.senderFn, 'getServerSettingBridge', 'doUpdateOne', setting, 'APP_ID');
1112
}
1213

1314
public async incrementValue(id: ISetting['id'], value = 1): Promise<void> {
14-
await this.bridges.getServerSettingBridge().doIncrementValue(id, value, 'APP_ID');
15+
await bridgeCall(this.senderFn, 'getServerSettingBridge', 'doIncrementValue', id, value, 'APP_ID');
1516
}
1617
}
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
import type { IServerSettingsModify } from '@rocket.chat/apps-engine/definition/accessors';
22
import type { ISetting } from '@rocket.chat/apps-engine/definition/settings';
33

4-
import type { RemoteBridges } from '../../bridges/RemoteBridges';
4+
import { bridgeCall } from '../../bridges/bridgeCall';
5+
import type * as Messenger from '../../messenger';
56

67
export class ServerSettingsModify implements IServerSettingsModify {
7-
constructor(private readonly bridges: RemoteBridges) {}
8+
constructor(private readonly senderFn: typeof Messenger.sendRequest) {}
89

910
public async hideGroup(name: string): Promise<void> {
10-
await this.bridges.getServerSettingBridge().doHideGroup(name, 'APP_ID');
11+
await bridgeCall(this.senderFn, 'getServerSettingBridge', 'doHideGroup', name, 'APP_ID');
1112
}
1213

1314
public async hideSetting(id: string): Promise<void> {
14-
await this.bridges.getServerSettingBridge().doHideSetting(id, 'APP_ID');
15+
await bridgeCall(this.senderFn, 'getServerSettingBridge', 'doHideSetting', id, 'APP_ID');
1516
}
1617

1718
public async modifySetting(setting: ISetting): Promise<void> {
18-
await this.bridges.getServerSettingBridge().doUpdateOne(setting, 'APP_ID');
19+
await bridgeCall(this.senderFn, 'getServerSettingBridge', 'doUpdateOne', setting, 'APP_ID');
1920
}
2021

2122
public async incrementValue(id: ISetting['id'], value = 1): Promise<void> {
22-
await this.bridges.getServerSettingBridge().doIncrementValue(id, value, 'APP_ID');
23+
await bridgeCall(this.senderFn, 'getServerSettingBridge', 'doIncrementValue', id, value, 'APP_ID');
2324
}
2425
}

packages/apps/base-runtime/src/lib/accessors/environment/SettingRead.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import type { ISettingRead } from '@rocket.chat/apps-engine/definition/accessors';
22
import type { ISetting } from '@rocket.chat/apps-engine/definition/settings';
33

4-
import type { RemoteBridges } from '../../bridges/RemoteBridges';
4+
import { bridgeCall } from '../../bridges/bridgeCall';
5+
import type * as Messenger from '../../messenger';
56

67
// App settings are host-persisted metadata (ProxiedApp storage item), fronted by the internal
78
// AppResourceBridge. The value fallback that used to run host-side now runs locally.
89
export class SettingRead implements ISettingRead {
9-
constructor(private readonly bridges: RemoteBridges) {}
10+
constructor(private readonly senderFn: typeof Messenger.sendRequest) {}
1011

1112
public getById(id: string): Promise<ISetting> {
12-
return this.bridges.getAppResourceBridge().doGetSettingById(id, 'APP_ID') as Promise<ISetting>;
13+
return bridgeCall<ISetting>(this.senderFn, 'getAppResourceBridge', 'doGetSettingById', id, 'APP_ID');
1314
}
1415

1516
public async getValueById(id: string): Promise<any> {
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import type { ISettingUpdater } from '@rocket.chat/apps-engine/definition/accessors/ISettingUpdater';
22
import type { ISetting } from '@rocket.chat/apps-engine/definition/settings';
33

4-
import type { RemoteBridges } from '../../bridges/RemoteBridges';
4+
import { bridgeCall } from '../../bridges/bridgeCall';
5+
import type * as Messenger from '../../messenger';
56

67
// The "not found" guard and the AppSettingsManager persistence run host-side in the
78
// AppResourceBridge (they depend on the ProxiedApp storage item and the settings manager); the
89
// runtime accessor is a thin forwarder.
910
export class SettingUpdater implements ISettingUpdater {
10-
constructor(private readonly bridges: RemoteBridges) {}
11+
constructor(private readonly senderFn: typeof Messenger.sendRequest) {}
1112

1213
public async updateValue(id: ISetting['id'], value: ISetting['value']): Promise<void> {
13-
await this.bridges.getAppResourceBridge().doUpdateSettingValue(id, value, 'APP_ID');
14+
await bridgeCall(this.senderFn, 'getAppResourceBridge', 'doUpdateSettingValue', id, value, 'APP_ID');
1415
}
1516

1617
public async updateSelectOptions(id: ISetting['id'], values: ISetting['values']): Promise<void> {
17-
await this.bridges.getAppResourceBridge().doUpdateSettingSelectOptions(id, values, 'APP_ID');
18+
await bridgeCall(this.senderFn, 'getAppResourceBridge', 'doUpdateSettingSelectOptions', id, values, 'APP_ID');
1819
}
1920
}

0 commit comments

Comments
 (0)