mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Respond to PR comments
- Add helper function to improve types with MessageChannelListeners - Remove some debug printing - Improve some typing about application update status Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
parent
299bc475a2
commit
2012602e6e
@ -4,11 +4,11 @@
|
|||||||
*/
|
*/
|
||||||
import { getInjectionToken } from "@ogre-tools/injectable";
|
import { getInjectionToken } from "@ogre-tools/injectable";
|
||||||
import type { RequestChannel } from "./request-channel-injection-token";
|
import type { RequestChannel } from "./request-channel-injection-token";
|
||||||
import type { RequestChannelHandlerDescriptor } from "./request-channel-listener-injection-token";
|
import type { RequestChannelHandler } from "./request-channel-listener-injection-token";
|
||||||
|
|
||||||
export type EnlistRequestChannelListener = <
|
export type EnlistRequestChannelListener = <
|
||||||
TChannel extends RequestChannel<any, any>,
|
TChannel extends RequestChannel<any, any>,
|
||||||
>(listener: RequestChannelHandlerDescriptor<TChannel>) => () => void;
|
>(listener: RequestChannelHandler<TChannel>) => () => void;
|
||||||
|
|
||||||
export const enlistRequestChannelListenerInjectionToken =
|
export const enlistRequestChannelListenerInjectionToken =
|
||||||
getInjectionToken<EnlistRequestChannelListener>({
|
getInjectionToken<EnlistRequestChannelListener>({
|
||||||
|
|||||||
@ -15,13 +15,13 @@ const listeningOfChannelsInjectable = getInjectable({
|
|||||||
|
|
||||||
instantiate: (di) => {
|
instantiate: (di) => {
|
||||||
const enlistMessageChannelListener = di.inject(enlistMessageChannelListenerInjectionToken);
|
const enlistMessageChannelListener = di.inject(enlistMessageChannelListenerInjectionToken);
|
||||||
const enlistRequestChannelListener = di.inject(enlistRequestChannelListenerInjectionToken);
|
const enlistRequestChannelHandler = di.inject(enlistRequestChannelListenerInjectionToken);
|
||||||
const messageChannelListeners = di.injectMany(messageChannelListenerInjectionToken);
|
const messageChannelListeners = di.injectMany(messageChannelListenerInjectionToken);
|
||||||
const requestChannelListeners = di.injectMany(requestChannelHandlerInjectionToken);
|
const requestChannelHandlers = di.injectMany(requestChannelHandlerInjectionToken);
|
||||||
|
|
||||||
return getStartableStoppable("listening-of-channels", () => {
|
return getStartableStoppable("listening-of-channels", () => {
|
||||||
const messageChannelDisposers = messageChannelListeners.map(enlistMessageChannelListener);
|
const messageChannelDisposers = messageChannelListeners.map(enlistMessageChannelListener);
|
||||||
const requestChannelDisposers = requestChannelListeners.map(enlistRequestChannelListener);
|
const requestChannelDisposers = requestChannelHandlers.map(enlistRequestChannelHandler);
|
||||||
|
|
||||||
return disposer(...messageChannelDisposers, ...requestChannelDisposers);
|
return disposer(...messageChannelDisposers, ...requestChannelDisposers);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -2,13 +2,17 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import { getInjectionToken } from "@ogre-tools/injectable";
|
import type { DiContainerForInjection, Injectable } from "@ogre-tools/injectable";
|
||||||
import type { SetRequired } from "type-fest";
|
import { getInjectable, getInjectionToken } from "@ogre-tools/injectable";
|
||||||
import type { MessageChannel } from "./message-channel-injection-token";
|
import type { MessageChannel } from "./message-channel-injection-token";
|
||||||
|
|
||||||
export interface MessageChannelListener<TChannel extends MessageChannel<any>> {
|
export type MessageChannelListenerFunction<Channel> = Channel extends MessageChannel<infer Message>
|
||||||
channel: TChannel;
|
? (message: Message) => void
|
||||||
handler: (value: SetRequired<TChannel, "_messageSignature">["_messageSignature"]) => void;
|
: never;
|
||||||
|
|
||||||
|
export interface MessageChannelListener<Channel> {
|
||||||
|
channel: Channel;
|
||||||
|
handler: MessageChannelListenerFunction<Channel>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const messageChannelListenerInjectionToken = getInjectionToken<MessageChannelListener<MessageChannel<any>>>(
|
export const messageChannelListenerInjectionToken = getInjectionToken<MessageChannelListener<MessageChannel<any>>>(
|
||||||
@ -16,3 +20,24 @@ export const messageChannelListenerInjectionToken = getInjectionToken<MessageCha
|
|||||||
id: "message-channel-listener",
|
id: "message-channel-listener",
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
export function getMessageChannelListenerInjectable<
|
||||||
|
ChannelInjectionToken,
|
||||||
|
Channel = ChannelInjectionToken extends Injectable<infer Channel, MessageChannel<any>, void>
|
||||||
|
? Channel
|
||||||
|
: never,
|
||||||
|
>(
|
||||||
|
channelInjectionToken: ChannelInjectionToken,
|
||||||
|
instantiate: (di: DiContainerForInjection) => MessageChannelListenerFunction<Channel>,
|
||||||
|
) {
|
||||||
|
const token = channelInjectionToken as unknown as Injectable<MessageChannel<any>, MessageChannel<any>, void>;
|
||||||
|
|
||||||
|
return getInjectable({
|
||||||
|
id: `${token.id}-listener`,
|
||||||
|
instantiate: (di) => ({
|
||||||
|
channel: di.inject(token),
|
||||||
|
handler: instantiate(di),
|
||||||
|
}),
|
||||||
|
injectionToken: messageChannelListenerInjectionToken,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@ -6,11 +6,18 @@
|
|||||||
import { getInjectionToken } from "@ogre-tools/injectable";
|
import { getInjectionToken } from "@ogre-tools/injectable";
|
||||||
import type { IpcValue } from "./allowed-types";
|
import type { IpcValue } from "./allowed-types";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Both of these type parameters are technically unused. Which is fine because we only really
|
||||||
|
* care about them at type check time since they are here to guide what types other functions
|
||||||
|
* require (which in turn are just passed on).
|
||||||
|
*/
|
||||||
export interface RequestChannel<
|
export interface RequestChannel<
|
||||||
|
// eslint-disable-next-line unused-imports/no-unused-vars-ts
|
||||||
Request extends IpcValue | void = void,
|
Request extends IpcValue | void = void,
|
||||||
|
// eslint-disable-next-line unused-imports/no-unused-vars-ts
|
||||||
Response extends IpcValue | void = void,
|
Response extends IpcValue | void = void,
|
||||||
> {
|
> {
|
||||||
id: Request | Response extends boolean ? string : string;
|
id: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ChannelRequest<Channel> = Channel extends RequestChannel<infer Request, infer Response>
|
export type ChannelRequest<Channel> = Channel extends RequestChannel<infer Request, infer Response>
|
||||||
|
|||||||
@ -6,16 +6,16 @@ import type { DiContainerForInjection, Injectable } from "@ogre-tools/injectable
|
|||||||
import { getInjectable, getInjectionToken } from "@ogre-tools/injectable";
|
import { getInjectable, getInjectionToken } from "@ogre-tools/injectable";
|
||||||
import type { RequestChannel } from "./request-channel-injection-token";
|
import type { RequestChannel } from "./request-channel-injection-token";
|
||||||
|
|
||||||
export type RequestChannelHandler<Channel> = Channel extends RequestChannel<infer Request, infer Response>
|
export type RequestChannelHandlerFunction<Channel> = Channel extends RequestChannel<infer Request, infer Response>
|
||||||
? (request: Request) => Response | Promise<Response>
|
? (request: Request) => Response | Promise<Response>
|
||||||
: never;
|
: never;
|
||||||
|
|
||||||
export interface RequestChannelHandlerDescriptor<Channel> {
|
export interface RequestChannelHandler<Channel> {
|
||||||
channel: Channel;
|
channel: Channel;
|
||||||
handler: RequestChannelHandler<Channel>;
|
handler: RequestChannelHandlerFunction<Channel>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const requestChannelHandlerInjectionToken = getInjectionToken<RequestChannelHandlerDescriptor<RequestChannel<any, any>>>(
|
export const requestChannelHandlerInjectionToken = getInjectionToken<RequestChannelHandler<RequestChannel<any, any>>>(
|
||||||
{
|
{
|
||||||
id: "request-channel-handler",
|
id: "request-channel-handler",
|
||||||
},
|
},
|
||||||
@ -28,7 +28,7 @@ export function getRequestChannelHandlerInjectable<
|
|||||||
: never,
|
: never,
|
||||||
>(
|
>(
|
||||||
channelInjectionToken: ChannelInjectionToken,
|
channelInjectionToken: ChannelInjectionToken,
|
||||||
instantiate: (di: DiContainerForInjection) => RequestChannelHandler<Channel>,
|
instantiate: (di: DiContainerForInjection) => RequestChannelHandlerFunction<Channel>,
|
||||||
) {
|
) {
|
||||||
const token = channelInjectionToken as unknown as Injectable<RequestChannel<any, any>, RequestChannel<any, any>, void>;
|
const token = channelInjectionToken as unknown as Injectable<RequestChannel<any, any>, RequestChannel<any, any>, void>;
|
||||||
|
|
||||||
|
|||||||
@ -2,34 +2,16 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
|
||||||
import type { SyncBoxChannel } from "./sync-box-channel.injectable";
|
|
||||||
import syncBoxChannelInjectable from "./sync-box-channel.injectable";
|
import syncBoxChannelInjectable from "./sync-box-channel.injectable";
|
||||||
import syncBoxStateInjectable from "./sync-box-state.injectable";
|
import syncBoxStateInjectable from "./sync-box-state.injectable";
|
||||||
import type { MessageChannelListener } from "../channel/message-channel-listener-injection-token";
|
import { getMessageChannelListenerInjectable } from "../channel/message-channel-listener-injection-token";
|
||||||
import { messageChannelListenerInjectionToken } from "../channel/message-channel-listener-injection-token";
|
|
||||||
|
|
||||||
const syncBoxChannelListenerInjectable = getInjectable({
|
const syncBoxChannelListenerInjectable = getMessageChannelListenerInjectable(syncBoxChannelInjectable, (di) => {
|
||||||
id: "sync-box-channel-listener",
|
return ({ id, value }) => {
|
||||||
|
const syncBoxState = di.inject(syncBoxStateInjectable, id);
|
||||||
|
|
||||||
instantiate: (di): MessageChannelListener<SyncBoxChannel> => {
|
syncBoxState.set(value);
|
||||||
const getSyncBoxState = (id: string) => di.inject(syncBoxStateInjectable, id);
|
};
|
||||||
const channel = di.inject(syncBoxChannelInjectable);
|
|
||||||
|
|
||||||
return {
|
|
||||||
channel,
|
|
||||||
|
|
||||||
handler: ({ id, value }) => {
|
|
||||||
const target = getSyncBoxState(id);
|
|
||||||
|
|
||||||
if (target) {
|
|
||||||
target.set(value);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
injectionToken: messageChannelListenerInjectionToken,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default syncBoxChannelListenerInjectable;
|
export default syncBoxChannelListenerInjectable;
|
||||||
|
|||||||
@ -2,26 +2,14 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getRequestChannelHandlerInjectable } from "../../common/utils/channel/request-channel-listener-injection-token";
|
||||||
import type { RequestChannelHandlerDescriptor } from "../../common/utils/channel/request-channel-listener-injection-token";
|
|
||||||
import { requestChannelHandlerInjectionToken } from "../../common/utils/channel/request-channel-listener-injection-token";
|
|
||||||
import type { AppPathsChannel } from "../../common/app-paths/app-paths-channel.injectable";
|
|
||||||
import appPathsChannelInjectable from "../../common/app-paths/app-paths-channel.injectable";
|
import appPathsChannelInjectable from "../../common/app-paths/app-paths-channel.injectable";
|
||||||
import appPathsInjectable from "../../common/app-paths/app-paths.injectable";
|
import appPathsInjectable from "../../common/app-paths/app-paths.injectable";
|
||||||
|
|
||||||
const appPathsRequestChannelListenerInjectable = getInjectable({
|
const appPathsRequestChannelHandlerInjectable = getRequestChannelHandlerInjectable(appPathsChannelInjectable, (di) => {
|
||||||
id: "app-paths-request-channel-listener",
|
const appPaths = di.inject(appPathsInjectable);
|
||||||
|
|
||||||
instantiate: (di): RequestChannelHandlerDescriptor<AppPathsChannel> => {
|
return () => appPaths;
|
||||||
const channel = di.inject(appPathsChannelInjectable);
|
|
||||||
const appPaths = di.inject(appPathsInjectable);
|
|
||||||
|
|
||||||
return {
|
|
||||||
channel,
|
|
||||||
handler: () => appPaths,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
injectionToken: requestChannelHandlerInjectionToken,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default appPathsRequestChannelListenerInjectable;
|
export default appPathsRequestChannelHandlerInjectable;
|
||||||
|
|||||||
@ -30,6 +30,7 @@ const openLocalShellSessionInjectable = getInjectable({
|
|||||||
|
|
||||||
return (args) => new LocalShellSession(deps, args).open();
|
return (args) => new LocalShellSession(deps, args).open();
|
||||||
},
|
},
|
||||||
|
causesSideEffects: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
export default openLocalShellSessionInjectable;
|
export default openLocalShellSessionInjectable;
|
||||||
|
|||||||
@ -22,6 +22,7 @@ const openNodeShellSessionInjectable = getInjectable({
|
|||||||
id: "node-shell-session",
|
id: "node-shell-session",
|
||||||
|
|
||||||
instantiate: (): OpenNodeShellSession => (args) => new NodeShellSession(args).open(),
|
instantiate: (): OpenNodeShellSession => (args) => new NodeShellSession(args).open(),
|
||||||
|
causesSideEffects: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
export default openNodeShellSessionInjectable;
|
export default openNodeShellSessionInjectable;
|
||||||
|
|||||||
@ -2,34 +2,16 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
|
||||||
import rootFrameRenderedChannelInjectable from "../../../../common/root-frame-rendered-channel/root-frame-rendered-channel.injectable";
|
import rootFrameRenderedChannelInjectable from "../../../../common/root-frame-rendered-channel/root-frame-rendered-channel.injectable";
|
||||||
import { runManyFor } from "../../../../common/runnable/run-many-for";
|
import { runManyFor } from "../../../../common/runnable/run-many-for";
|
||||||
import { afterRootFrameIsReadyInjectionToken } from "../../runnable-tokens/after-root-frame-is-ready-injection-token";
|
import { afterRootFrameIsReadyInjectionToken } from "../../runnable-tokens/after-root-frame-is-ready-injection-token";
|
||||||
import { messageChannelListenerInjectionToken } from "../../../../common/utils/channel/message-channel-listener-injection-token";
|
import { getMessageChannelListenerInjectable } from "../../../../common/utils/channel/message-channel-listener-injection-token";
|
||||||
|
|
||||||
const rootFrameRenderedChannelListenerInjectable = getInjectable({
|
const rootFrameRenderedChannelListenerInjectable = getMessageChannelListenerInjectable(rootFrameRenderedChannelInjectable, (di) => {
|
||||||
id: "root-frame-rendered-channel-listener",
|
const runMany = runManyFor(di);
|
||||||
|
const runRunnablesAfterRootFrameIsReady = runMany(afterRootFrameIsReadyInjectionToken);
|
||||||
|
|
||||||
instantiate: (di) => {
|
return () => runRunnablesAfterRootFrameIsReady();
|
||||||
const channel = di.inject(rootFrameRenderedChannelInjectable);
|
|
||||||
|
|
||||||
const runMany = runManyFor(di);
|
|
||||||
|
|
||||||
const runRunnablesAfterRootFrameIsReady = runMany(
|
|
||||||
afterRootFrameIsReadyInjectionToken,
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
channel,
|
|
||||||
|
|
||||||
handler: async () => {
|
|
||||||
await runRunnablesAfterRootFrameIsReady();
|
|
||||||
},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
injectionToken: messageChannelListenerInjectionToken,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default rootFrameRenderedChannelListenerInjectable;
|
export default rootFrameRenderedChannelListenerInjectable;
|
||||||
|
|||||||
@ -72,7 +72,6 @@ export class TerminalApi extends WebSocketApi<TerminalEvents> {
|
|||||||
tabId: this.query.id,
|
tabId: this.query.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("authTokenArray", authTokenArray);
|
|
||||||
const { hostname, protocol, port } = location;
|
const { hostname, protocol, port } = location;
|
||||||
const socketUrl = url.format({
|
const socketUrl = url.format({
|
||||||
protocol: protocol.includes("https") ? "wss" : "ws",
|
protocol: protocol.includes("https") ? "wss" : "ws",
|
||||||
|
|||||||
@ -20,11 +20,6 @@ const provideInitialValuesForSyncBoxesInjectable = getInjectable({
|
|||||||
run: async () => {
|
run: async () => {
|
||||||
const initialValues = await requestFromChannel(syncBoxInitialValueChannel);
|
const initialValues = await requestFromChannel(syncBoxInitialValueChannel);
|
||||||
|
|
||||||
console.log({
|
|
||||||
initialValues,
|
|
||||||
type: typeof initialValues,
|
|
||||||
});
|
|
||||||
|
|
||||||
initialValues.forEach(({ id, value }) => {
|
initialValues.forEach(({ id, value }) => {
|
||||||
setSyncBoxState(id, value);
|
setSyncBoxState(id, value);
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user