diff --git a/src/features/auth-header/common/channel.ts b/src/features/auth-header/common/channel.ts new file mode 100644 index 0000000000..030750ea0f --- /dev/null +++ b/src/features/auth-header/common/channel.ts @@ -0,0 +1,8 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getRequestChannel } from "../../../common/utils/channel/get-request-channel"; + +export const authHeaderChannel = getRequestChannel("auth-header-value"); diff --git a/src/features/auth-header/common/header-state.injectable.ts b/src/features/auth-header/common/header-state.injectable.ts new file mode 100644 index 0000000000..34d94d0ed7 --- /dev/null +++ b/src/features/auth-header/common/header-state.injectable.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; + +const authHeaderStateInjectable = getInjectable({ + id: "auth-header-state", + instantiate: () => { + let header: string; + + return { + get: () => { + if (!header) { + throw new Error("Tried to get auth header value before being set"); + } + + return header; + }, + set: (value: string) => { + if (header) { + throw new Error("Tried to set auth header value more than once"); + } + + header = value; + }, + }; + }, +}); + +export default authHeaderStateInjectable; diff --git a/src/features/auth-header/main/channel-handler.injectable.ts b/src/features/auth-header/main/channel-handler.injectable.ts new file mode 100644 index 0000000000..29ed0dd069 --- /dev/null +++ b/src/features/auth-header/main/channel-handler.injectable.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getRequestChannelListenerInjectable } from "../../../main/utils/channel/channel-listeners/listener-tokens"; +import { authHeaderChannel } from "../common/channel"; +import authHeaderStateInjectable from "../common/header-state.injectable"; + +const authHeaderRequestListenerInjectable = getRequestChannelListenerInjectable({ + channel: authHeaderChannel, + handler: (di) => { + const authHeaderState = di.inject(authHeaderStateInjectable); + + return () => authHeaderState.get(); + }, +}); + +export default authHeaderRequestListenerInjectable; diff --git a/src/features/auth-header/main/compute-value.global-override-for-injectable.ts b/src/features/auth-header/main/compute-value.global-override-for-injectable.ts new file mode 100644 index 0000000000..dcda8be6b3 --- /dev/null +++ b/src/features/auth-header/main/compute-value.global-override-for-injectable.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getGlobalOverride } from "../../../common/test-utils/get-global-override"; +import computeAuthHeaderValueInjectable from "./compute-value.injectable"; + +export default getGlobalOverride(computeAuthHeaderValueInjectable, () => async () => "some-auth-header-value"); diff --git a/src/features/auth-header/main/compute-value.injectable.ts b/src/features/auth-header/main/compute-value.injectable.ts new file mode 100644 index 0000000000..7037f3052d --- /dev/null +++ b/src/features/auth-header/main/compute-value.injectable.ts @@ -0,0 +1,15 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getInjectable } from "@ogre-tools/injectable"; +import { randomUUID } from "crypto"; + +const computeAuthHeaderValueInjectable = getInjectable({ + id: "compute-auth-header-value", + instantiate: () => () => randomUUID(), + causesSideEffects: true, +}); + +export default computeAuthHeaderValueInjectable; diff --git a/src/features/auth-header/main/init-state.injectable.ts b/src/features/auth-header/main/init-state.injectable.ts new file mode 100644 index 0000000000..13a7bed633 --- /dev/null +++ b/src/features/auth-header/main/init-state.injectable.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { beforeApplicationIsLoadingInjectionToken } from "../../../main/library"; +import authHeaderStateInjectable from "../common/header-state.injectable"; +import computeAuthHeaderValueInjectable from "./compute-value.injectable"; + +const initAuthHeaderStateInjectable = getInjectable({ + id: "init-auth-header-state", + instantiate: (di) => ({ + id: "init-auth-header-state", + run: async () => { + const state = di.inject(authHeaderStateInjectable); + const computeAuthHeaderValue = di.inject(computeAuthHeaderValueInjectable); + + state.set(computeAuthHeaderValue()); + }, + }), + injectionToken: beforeApplicationIsLoadingInjectionToken, +}); + +export default initAuthHeaderStateInjectable; diff --git a/src/features/auth-header/renderer/init-state.injectable.ts b/src/features/auth-header/renderer/init-state.injectable.ts new file mode 100644 index 0000000000..fc169eb843 --- /dev/null +++ b/src/features/auth-header/renderer/init-state.injectable.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { beforeFrameStartsFirstInjectionToken } from "../../../renderer/before-frame-starts/tokens"; +import authHeaderStateInjectable from "../common/header-state.injectable"; +import requestAuthHeaderValueInjectable from "./request-header.injectable"; + +const initAuthHeaderStateInjectable = getInjectable({ + id: "init-auth-header-state", + instantiate: (di) => ({ + id: "init-auth-header-state", + run: async () => { + const state = di.inject(authHeaderStateInjectable); + const requestAuthHeaderValue = di.inject(requestAuthHeaderValueInjectable); + + state.set(await requestAuthHeaderValue()); + }, + }), + injectionToken: beforeFrameStartsFirstInjectionToken, +}); + +export default initAuthHeaderStateInjectable; diff --git a/src/features/auth-header/renderer/request-header.injectable.ts b/src/features/auth-header/renderer/request-header.injectable.ts new file mode 100644 index 0000000000..8805928593 --- /dev/null +++ b/src/features/auth-header/renderer/request-header.injectable.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getInjectable } from "@ogre-tools/injectable"; +import requestFromChannelInjectable from "../../../renderer/utils/channel/request-from-channel.injectable"; +import { authHeaderChannel } from "../common/channel"; + +const requestAuthHeaderValueInjectable = getInjectable({ + id: "request-auth-header-value", + instantiate: (di) => { + const requestFromChannel = di.inject(requestFromChannelInjectable); + + return () => requestFromChannel(authHeaderChannel); + }, +}); + +export default requestAuthHeaderValueInjectable;