@eclipse-emfcloud/model-service-theia
Version:
Model service Theia
130 lines (113 loc) • 3.77 kB
text/typescript
// *****************************************************************************
// Copyright (C) 2023-2024 STMicroelectronics.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// http://www.eclipse.org/legal/epl-2.0.
//
// This Source Code may also be made available under the following Secondary
// Licenses when the conditions for such availability set forth in the Eclipse
// Public License v. 2.0 are satisfied: MIT License which is
// available at https://opensource.org/licenses/MIT.
//
// SPDX-License-Identifier: EPL-2.0 OR MIT
// *****************************************************************************
import {
Container,
injectable,
interfaces,
} from '@theia/core/shared/inversify';
import {
ModelAccessorBusClient,
ModelAccessorBusProtocol,
ProviderChangeSubscriptionToken,
} from '../../common';
import {
FrontendModelAccessorBusSubscriber,
FrontendModelAccessorBusSubscriberImpl,
} from '../frontend-model-accessor-bus-subscriber';
/**
* All that we need for testing are the subscription-related methods and `get()`.
*/
()
export class FakeModelAccessorBusProtocol implements ModelAccessorBusProtocol {
protected nextSubscriptionId = 0;
protected readonly subscriptions = new Map<
number,
ProviderChangeSubscriptionToken
>();
protected client: ModelAccessorBusClient | undefined;
protected readonly pendingSubs = <
Promise<ProviderChangeSubscriptionToken>[]
>[];
subscribe(
_context: string,
accessorId: string
): Promise<ProviderChangeSubscriptionToken> {
const token = {
id: ++this.nextSubscriptionId,
accessorId: accessorId,
};
this.subscriptions.set(token.id, token);
const result = Promise.resolve(token);
this.pendingSubs.push(result);
return result;
}
closeSubscription(token: ProviderChangeSubscriptionToken): void {
this.subscriptions.delete(token.id);
this.client?.closeSubscription(token.id);
}
/**
* (fake) get function that returns the first parameter given
*
* @param _context not used
* @param _accessorId not used
* @param parameters a list of parameters (can be empty)
* @returns the first parameter given
*/
async get<T>(
_context: string,
_accessorId: string,
...parameters: unknown[]
): Promise<T | undefined> {
return parameters[0] as T | undefined;
}
setClient(client: ModelAccessorBusClient): void {
this.client = client;
}
get pendingSubsReady(): Promise<void> {
return Promise.allSettled(this.pendingSubs).then(() => {
this.pendingSubs.length = 0;
});
}
protected lookupSubs(accessorId: string): ProviderChangeSubscriptionToken[] {
const result: ProviderChangeSubscriptionToken[] = [];
if (!this.client) {
// No point
return result;
}
for (const token of this.subscriptions.values()) {
if (token.accessorId === accessorId) {
result.push(token);
}
}
return result;
}
}
export function bindFakeModelAccessorBusProtocol(
binder: interfaces.Bind | Container
): void {
const bind = binder instanceof Container ? binder.bind.bind(binder) : binder;
bind(FakeModelAccessorBusProtocol).toSelf().inSingletonScope();
bind(ModelAccessorBusProtocol).toService(FakeModelAccessorBusProtocol);
}
export function connectClient(
modelAccessorBus: FakeModelAccessorBusProtocol,
subscriber: FrontendModelAccessorBusSubscriber
): void {
const subscriberImpl = subscriber as FrontendModelAccessorBusSubscriberImpl;
modelAccessorBus.setClient(subscriberImpl.client);
subscriberImpl.setModelAccessorBus(
modelAccessorBus as unknown as ModelAccessorBusProtocol
);
}