Skip to content

Commit 446b23b

Browse files
committed
Keep original request object
1 parent 3d2e355 commit 446b23b

4 files changed

Lines changed: 48 additions & 23 deletions

File tree

packages/api-middleware/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,6 @@ export {
4242
} from './errorBoxPolymiddleware';
4343

4444
// TODO: [P0] Add tests for nesting `polymiddleware`.
45+
export { __INTERNAL_DO_NOT_USE__legacyAvatarMiddlewareOriginalRequestSymbol } from './legacy/avatarMiddleware';
4546
export { default as PolymiddlewareComposer } from './PolymiddlewareComposer';
4647
export { type Polymiddleware } from './types/Polymiddleware';

packages/api-middleware/src/legacy/avatarMiddleware.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
// TODO: This is moved from /api, need to revisit/rewrite everything in this file.
22
import { type WebChatActivity } from 'botframework-webchat-core';
33
import { type ReactNode } from 'react';
4+
import type { AvatarPolymiddlewareRequest } from '../avatarPolymiddleware';
5+
6+
// Polymiddleware requires immutable request object.
7+
// When bridging between legacy and polymiddlware, this symbol helps keeping the original object.
8+
const __INTERNAL_DO_NOT_USE__legacyAvatarMiddlewareOriginalRequestSymbol = Symbol();
49

510
type LegacyAvatarComponentFactoryArguments = {
11+
readonly [__INTERNAL_DO_NOT_USE__legacyAvatarMiddlewareOriginalRequestSymbol]: AvatarPolymiddlewareRequest;
612
readonly activity: WebChatActivity;
713
readonly fromUser: boolean;
814
readonly styleOptions: Readonly<Record<string, unknown>>;
@@ -16,4 +22,8 @@ type LegacyAvatarEnhancer = (
1622

1723
type LegacyAvatarMiddleware = () => LegacyAvatarEnhancer;
1824

19-
export type { LegacyAvatarMiddleware, LegacyAvatarRenderer };
25+
export {
26+
__INTERNAL_DO_NOT_USE__legacyAvatarMiddlewareOriginalRequestSymbol,
27+
type LegacyAvatarMiddleware,
28+
type LegacyAvatarRenderer
29+
};

packages/api/src/legacy/createAvatarPolymiddlewareFromLegacy.tsx

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol,
3+
__INTERNAL_DO_NOT_USE__legacyAvatarMiddlewareOriginalRequestSymbol,
34
avatarComponent,
45
createAvatarPolymiddleware,
56
type AvatarPolymiddleware
@@ -46,37 +47,45 @@ function createAvatarPolymiddlewareFromLegacy(...middlewares: readonly LegacyAva
4647
const legacyEnhancer = composeEnhancer(...middlewares.map(middleware => middleware()));
4748

4849
return createAvatarPolymiddleware(next => {
49-
const legacyHandler = legacyEnhancer(({ activity, fromUser, styleOptions }) => {
50-
// Pass styleOptions through the polymiddleware chain via the internal runtime extension
51-
// so downstream handlers (e.g. core middleware) can still read it.
52-
const handler = next(
53-
Object.freeze({
54-
activity,
55-
fromUser,
56-
[__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: styleOptions
57-
})
58-
);
50+
const legacyHandler = legacyEnhancer(
51+
({ [__INTERNAL_DO_NOT_USE__legacyAvatarMiddlewareOriginalRequestSymbol]: originalRequest }) => {
52+
if (!originalRequest) {
53+
// TODO: Add a test
54+
throw new Error('botframework-webchat: `avatarMiddleware` must not modify the request object');
55+
}
56+
57+
// Pass styleOptions through the polymiddleware chain via the internal runtime extension
58+
// so downstream handlers (e.g. core middleware) can still read it.
59+
const handler = next(originalRequest);
5960

60-
// TODO: Warn if the result is wrong. Also add tests.
61-
// if (result !== false && typeof result !== 'function') {
62-
// console.warn(
63-
// 'botframework-webchat: avatarMiddleware should return a function to render the avatar, or return false if avatar should be hidden. Please refer to HOOKS.md for details.'
64-
// );
61+
// TODO: Warn if the result is wrong. Also add tests.
62+
// if (result !== false && typeof result !== 'function') {
63+
// console.warn(
64+
// 'botframework-webchat: avatarMiddleware should return a function to render the avatar, or return false if avatar should be hidden. Please refer to HOOKS.md for details.'
65+
// );
6566

66-
// return () => result;
67-
// }
67+
// return () => result;
68+
// }
6869

69-
return !!handler && ((): Exclude<ReactNode, boolean | null | undefined> => handler.render({}));
70-
});
70+
return !!handler && ((): Exclude<ReactNode, boolean | null | undefined> => handler.render({}));
71+
}
72+
);
7173

7274
return request => {
7375
const {
76+
[__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: styleOptions,
7477
activity,
75-
fromUser,
76-
[__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: styleOptions
78+
fromUser
7779
} = request;
7880

79-
const legacyResult = legacyHandler(Object.freeze({ activity, fromUser, styleOptions }));
81+
const legacyResult = legacyHandler(
82+
Object.freeze({
83+
activity,
84+
fromUser,
85+
styleOptions,
86+
[__INTERNAL_DO_NOT_USE__legacyAvatarMiddlewareOriginalRequestSymbol]: request
87+
})
88+
);
8089

8190
return legacyResult
8291
? avatarComponent(MemoizedLegacyAvatarBridge, Object.freeze({ renderFn: legacyResult }))

packages/api/src/types/AvatarMiddleware.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
import { type WebChatActivity } from 'botframework-webchat-core';
22

3+
import type {
4+
__INTERNAL_DO_NOT_USE__legacyAvatarMiddlewareOriginalRequestSymbol,
5+
AvatarPolymiddlewareRequest
6+
} from '@msinternal/botframework-webchat-api-middleware';
37
import { StrictStyleOptions } from '../StyleOptions';
48
import ComponentMiddleware, { ComponentFactory } from './ComponentMiddleware';
59

610
type AvatarComponentFactoryArguments = [
711
{
12+
[__INTERNAL_DO_NOT_USE__legacyAvatarMiddlewareOriginalRequestSymbol]: AvatarPolymiddlewareRequest;
813
activity: WebChatActivity;
914
fromUser: boolean;
1015
styleOptions: StrictStyleOptions;

0 commit comments

Comments
 (0)