feat(widget): Rtc transports discovery for widgets (#34393)
* feat(widget): Rtc transports discovery for widgets * fix linter * update matrix-widget-api and js-sdk * fix eslint-plugin-element-call path * update widget-api: Parent-id delegation is deprectated --------- Co-authored-by: Robin <robin@robin.town>
This commit is contained in:
@@ -82,7 +82,7 @@
|
|||||||
"maplibre-gl": "^5.0.0",
|
"maplibre-gl": "^5.0.0",
|
||||||
"matrix-encrypt-attachment": "^1.0.3",
|
"matrix-encrypt-attachment": "^1.0.3",
|
||||||
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop",
|
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop",
|
||||||
"matrix-widget-api": "^1.16.1",
|
"matrix-widget-api": "^1.18.0",
|
||||||
"memoize-one": "^6.0.0",
|
"memoize-one": "^6.0.0",
|
||||||
"mime": "^4.0.4",
|
"mime": "^4.0.4",
|
||||||
"opus-recorder": "^8.0.3",
|
"opus-recorder": "^8.0.3",
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import {
|
|||||||
type IWidgetApiErrorResponseDataDetails,
|
type IWidgetApiErrorResponseDataDetails,
|
||||||
type ISearchUserDirectoryResult,
|
type ISearchUserDirectoryResult,
|
||||||
type IGetMediaConfigResult,
|
type IGetMediaConfigResult,
|
||||||
|
type IRtcTransportsResult,
|
||||||
} from "matrix-widget-api";
|
} from "matrix-widget-api";
|
||||||
import {
|
import {
|
||||||
ClientEvent,
|
ClientEvent,
|
||||||
@@ -39,7 +40,6 @@ import {
|
|||||||
type StateEvents,
|
type StateEvents,
|
||||||
type TimelineEvents,
|
type TimelineEvents,
|
||||||
type Room,
|
type Room,
|
||||||
type SendDelayedEventRequestOpts,
|
|
||||||
type MatrixClient,
|
type MatrixClient,
|
||||||
} from "matrix-js-sdk/src/matrix";
|
} from "matrix-js-sdk/src/matrix";
|
||||||
import { logger } from "matrix-js-sdk/src/logger";
|
import { logger } from "matrix-js-sdk/src/logger";
|
||||||
@@ -123,6 +123,7 @@ export class ElementWidgetDriver extends WidgetDriver {
|
|||||||
// This is a trusted Element Call widget that we control
|
// This is a trusted Element Call widget that we control
|
||||||
this.allowedCapabilities.add(MatrixCapabilities.AlwaysOnScreen);
|
this.allowedCapabilities.add(MatrixCapabilities.AlwaysOnScreen);
|
||||||
this.allowedCapabilities.add(MatrixCapabilities.MSC3846TurnServers);
|
this.allowedCapabilities.add(MatrixCapabilities.MSC3846TurnServers);
|
||||||
|
this.allowedCapabilities.add(MatrixCapabilities.MSC4515RtcTransports);
|
||||||
this.allowedCapabilities.add(`org.matrix.msc2762.timeline:${inRoomId}`);
|
this.allowedCapabilities.add(`org.matrix.msc2762.timeline:${inRoomId}`);
|
||||||
this.allowedCapabilities.add(MatrixCapabilities.MSC4157SendDelayedEvent);
|
this.allowedCapabilities.add(MatrixCapabilities.MSC4157SendDelayedEvent);
|
||||||
this.allowedCapabilities.add(MatrixCapabilities.MSC4157UpdateDelayedEvent);
|
this.allowedCapabilities.add(MatrixCapabilities.MSC4157UpdateDelayedEvent);
|
||||||
@@ -405,27 +406,12 @@ export class ElementWidgetDriver extends WidgetDriver {
|
|||||||
return stickyEvents;
|
return stickyEvents;
|
||||||
}
|
}
|
||||||
|
|
||||||
private getSendDelayedEventOpts(delay: number | null, parentDelayId: string | null): SendDelayedEventRequestOpts {
|
|
||||||
if (delay !== null) {
|
|
||||||
return {
|
|
||||||
delay,
|
|
||||||
...(parentDelayId !== null && { parent_delay_id: parentDelayId }),
|
|
||||||
};
|
|
||||||
} else if (parentDelayId !== null) {
|
|
||||||
return {
|
|
||||||
parent_delay_id: parentDelayId,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
throw new Error("Must provide at least one of delay or parentDelayId");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @experimental Part of MSC4140 & MSC4157
|
* @experimental Part of MSC4140 & MSC4157
|
||||||
* @see {@link WidgetDriver#sendDelayedEvent}
|
* @see {@link WidgetDriver#sendDelayedEvent}
|
||||||
*/
|
*/
|
||||||
public async sendDelayedEvent<K extends keyof StateEvents>(
|
public async sendDelayedEvent<K extends keyof StateEvents>(
|
||||||
delay: number | null,
|
delay: number,
|
||||||
parentDelayId: string | null,
|
|
||||||
eventType: K,
|
eventType: K,
|
||||||
content: StateEvents[K],
|
content: StateEvents[K],
|
||||||
stateKey: string | null,
|
stateKey: string | null,
|
||||||
@@ -435,23 +421,21 @@ export class ElementWidgetDriver extends WidgetDriver {
|
|||||||
* @experimental Part of MSC4140 & MSC4157
|
* @experimental Part of MSC4140 & MSC4157
|
||||||
*/
|
*/
|
||||||
public async sendDelayedEvent<K extends keyof TimelineEvents>(
|
public async sendDelayedEvent<K extends keyof TimelineEvents>(
|
||||||
delay: number | null,
|
delay: number,
|
||||||
parentDelayId: string | null,
|
|
||||||
eventType: K,
|
eventType: K,
|
||||||
content: TimelineEvents[K],
|
content: TimelineEvents[K],
|
||||||
stateKey: null,
|
stateKey: null,
|
||||||
targetRoomId: string | null,
|
targetRoomId: string | null,
|
||||||
): Promise<ISendDelayedEventDetails>;
|
): Promise<ISendDelayedEventDetails>;
|
||||||
public async sendDelayedEvent(
|
public async sendDelayedEvent(
|
||||||
delay: number | null,
|
delay: number,
|
||||||
parentDelayId: string | null,
|
|
||||||
eventType: string,
|
eventType: string,
|
||||||
content: IContent,
|
content: IContent,
|
||||||
stateKey: string | null = null,
|
stateKey: string | null = null,
|
||||||
targetRoomId: string | null = null,
|
targetRoomId: string | null = null,
|
||||||
): Promise<ISendDelayedEventDetails> {
|
): Promise<ISendDelayedEventDetails> {
|
||||||
const { client, roomId } = this.getSendEventTarget(targetRoomId);
|
const { client, roomId } = this.getSendEventTarget(targetRoomId);
|
||||||
const delayOpts = this.getSendDelayedEventOpts(delay, parentDelayId);
|
const delayOpts = { delay };
|
||||||
|
|
||||||
let r: SendDelayedEventResponse | null;
|
let r: SendDelayedEventResponse | null;
|
||||||
if (stateKey !== null) {
|
if (stateKey !== null) {
|
||||||
@@ -485,20 +469,17 @@ export class ElementWidgetDriver extends WidgetDriver {
|
|||||||
* @see {@link WidgetDriver#sendStickyEvent}
|
* @see {@link WidgetDriver#sendStickyEvent}
|
||||||
*/
|
*/
|
||||||
public async sendDelayedStickyEvent(
|
public async sendDelayedStickyEvent(
|
||||||
delay: number | null,
|
delay: number,
|
||||||
parentDelayId: string | null,
|
|
||||||
stickyDurationMs: number,
|
stickyDurationMs: number,
|
||||||
eventType: string,
|
eventType: string,
|
||||||
content: unknown,
|
content: unknown,
|
||||||
targetRoomId?: string | null,
|
targetRoomId?: string | null,
|
||||||
): Promise<ISendDelayedEventDetails> {
|
): Promise<ISendDelayedEventDetails> {
|
||||||
const { client, roomId } = this.getSendEventTarget(targetRoomId);
|
const { client, roomId } = this.getSendEventTarget(targetRoomId);
|
||||||
const delayOpts = this.getSendDelayedEventOpts(delay, parentDelayId);
|
|
||||||
|
|
||||||
const r = await client._unstable_sendStickyDelayedEvent(
|
const r = await client._unstable_sendStickyDelayedEvent(
|
||||||
roomId,
|
roomId,
|
||||||
stickyDurationMs,
|
stickyDurationMs,
|
||||||
delayOpts,
|
{ delay },
|
||||||
null,
|
null,
|
||||||
eventType as keyof TimelineEvents,
|
eventType as keyof TimelineEvents,
|
||||||
content as TimelineEvents[keyof TimelineEvents] & { msc4354_sticky_key: string },
|
content as TimelineEvents[keyof TimelineEvents] & { msc4354_sticky_key: string },
|
||||||
@@ -765,6 +746,16 @@ export class ElementWidgetDriver extends WidgetDriver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getRtcTransports(): Promise<IRtcTransportsResult> {
|
||||||
|
const client = MatrixClientPeg.safeGet();
|
||||||
|
// Delegate to the authenticated CS endpoint (MSC4143). Any error (e.g. the
|
||||||
|
// homeserver not supporting it) propagates and is turned into a widget error
|
||||||
|
// response by ClientWidgetApi. The js-sdk Transport and widget-api IRtcTransport
|
||||||
|
// types are structurally identical.
|
||||||
|
const transports = await client._unstable_getRTCTransports();
|
||||||
|
return { rtc_transports: transports };
|
||||||
|
}
|
||||||
|
|
||||||
public async readEventRelations(
|
public async readEventRelations(
|
||||||
eventId: string,
|
eventId: string,
|
||||||
roomId?: string,
|
roomId?: string,
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import {
|
|||||||
type ITurnServer as IClientTurnServer,
|
type ITurnServer as IClientTurnServer,
|
||||||
Direction,
|
Direction,
|
||||||
EventType,
|
EventType,
|
||||||
|
MatrixError,
|
||||||
MatrixEvent,
|
MatrixEvent,
|
||||||
MsgType,
|
MsgType,
|
||||||
RelationType,
|
RelationType,
|
||||||
@@ -89,6 +90,7 @@ describe("ElementWidgetDriver", () => {
|
|||||||
const requestedCapabilities = new Set([
|
const requestedCapabilities = new Set([
|
||||||
"m.always_on_screen",
|
"m.always_on_screen",
|
||||||
"town.robin.msc3846.turn_servers",
|
"town.robin.msc3846.turn_servers",
|
||||||
|
"org.matrix.msc4515.rtc_transports",
|
||||||
"org.matrix.msc2762.timeline:!1:example.org",
|
"org.matrix.msc2762.timeline:!1:example.org",
|
||||||
"org.matrix.msc2762.send.event:org.matrix.msc4075.call.notify",
|
"org.matrix.msc2762.send.event:org.matrix.msc4075.call.notify",
|
||||||
"org.matrix.msc2762.send.event:org.matrix.msc4075.rtc.notification",
|
"org.matrix.msc2762.send.event:org.matrix.msc4075.rtc.notification",
|
||||||
@@ -420,6 +422,31 @@ describe("ElementWidgetDriver", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("getRtcTransports", () => {
|
||||||
|
let driver: WidgetDriver;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
driver = mkDefaultDriver();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("gets the RTC transports from the homeserver", async () => {
|
||||||
|
const transports = [{ type: "livekit", livekit_service_url: "https://livekit-jwt.example.com" }];
|
||||||
|
client._unstable_getRTCTransports.mockResolvedValue(transports);
|
||||||
|
|
||||||
|
await expect(driver.getRtcTransports()).resolves.toEqual({ rtc_transports: transports });
|
||||||
|
|
||||||
|
expect(client._unstable_getRTCTransports).toHaveBeenCalledWith();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("propagates errors from the homeserver", async () => {
|
||||||
|
const error = new MatrixError({ errcode: "M_NOT_FOUND", error: "Not found" }, 404);
|
||||||
|
|
||||||
|
client._unstable_getRTCTransports.mockRejectedValue(error);
|
||||||
|
|
||||||
|
await expect(driver.getRtcTransports()).rejects.toBe(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("readEventRelations", () => {
|
describe("readEventRelations", () => {
|
||||||
let driver: WidgetDriver;
|
let driver: WidgetDriver;
|
||||||
|
|
||||||
@@ -540,18 +567,12 @@ describe("ElementWidgetDriver", () => {
|
|||||||
driver = mkDefaultDriver();
|
driver = mkDefaultDriver();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("cannot send delayed events with missing arguments", async () => {
|
|
||||||
await expect(driver.sendDelayedEvent(null, null, EventType.RoomMessage, {})).rejects.toThrow(
|
|
||||||
"Must provide at least one of",
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("sends delayed message events", async () => {
|
it("sends delayed message events", async () => {
|
||||||
client._unstable_sendDelayedEvent.mockResolvedValue({
|
client._unstable_sendDelayedEvent.mockResolvedValue({
|
||||||
delay_id: "id",
|
delay_id: "id",
|
||||||
});
|
});
|
||||||
|
|
||||||
await expect(driver.sendDelayedEvent(2000, null, EventType.RoomMessage, {})).resolves.toEqual({
|
await expect(driver.sendDelayedEvent(2000, EventType.RoomMessage, {})).resolves.toEqual({
|
||||||
roomId,
|
roomId,
|
||||||
delayId: "id",
|
delayId: "id",
|
||||||
});
|
});
|
||||||
@@ -565,31 +586,12 @@ describe("ElementWidgetDriver", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("sends child action delayed message events", async () => {
|
|
||||||
client._unstable_sendDelayedEvent.mockResolvedValue({
|
|
||||||
delay_id: "id-child",
|
|
||||||
});
|
|
||||||
|
|
||||||
await expect(driver.sendDelayedEvent(null, "id-parent", EventType.RoomMessage, {})).resolves.toEqual({
|
|
||||||
roomId,
|
|
||||||
delayId: "id-child",
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(client._unstable_sendDelayedEvent).toHaveBeenCalledWith(
|
|
||||||
roomId,
|
|
||||||
{ parent_delay_id: "id-parent" },
|
|
||||||
null,
|
|
||||||
EventType.RoomMessage,
|
|
||||||
{},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("sends delayed state events", async () => {
|
it("sends delayed state events", async () => {
|
||||||
client._unstable_sendDelayedStateEvent.mockResolvedValue({
|
client._unstable_sendDelayedStateEvent.mockResolvedValue({
|
||||||
delay_id: "id",
|
delay_id: "id",
|
||||||
});
|
});
|
||||||
|
|
||||||
await expect(driver.sendDelayedEvent(2000, null, EventType.RoomTopic, {}, "")).resolves.toEqual({
|
await expect(driver.sendDelayedEvent(2000, EventType.RoomTopic, {}, "")).resolves.toEqual({
|
||||||
roomId,
|
roomId,
|
||||||
delayId: "id",
|
delayId: "id",
|
||||||
});
|
});
|
||||||
@@ -602,25 +604,6 @@ describe("ElementWidgetDriver", () => {
|
|||||||
"",
|
"",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("sends child action delayed state events", async () => {
|
|
||||||
client._unstable_sendDelayedStateEvent.mockResolvedValue({
|
|
||||||
delay_id: "id-child",
|
|
||||||
});
|
|
||||||
|
|
||||||
await expect(driver.sendDelayedEvent(null, "id-parent", EventType.RoomTopic, {}, "")).resolves.toEqual({
|
|
||||||
roomId,
|
|
||||||
delayId: "id-child",
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(client._unstable_sendDelayedStateEvent).toHaveBeenCalledWith(
|
|
||||||
roomId,
|
|
||||||
{ parent_delay_id: "id-parent" },
|
|
||||||
EventType.RoomTopic,
|
|
||||||
{},
|
|
||||||
"",
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("updateDelayedEvent", () => {
|
describe("updateDelayedEvent", () => {
|
||||||
@@ -743,7 +726,7 @@ describe("ElementWidgetDriver", () => {
|
|||||||
delay_id: "id",
|
delay_id: "id",
|
||||||
});
|
});
|
||||||
|
|
||||||
await expect(driver.sendDelayedStickyEvent(1000, null, 2000, EventType.RoomMessage, {})).resolves.toEqual({
|
await expect(driver.sendDelayedStickyEvent(1000, 2000, EventType.RoomMessage, {})).resolves.toEqual({
|
||||||
roomId,
|
roomId,
|
||||||
delayId: "id",
|
delayId: "id",
|
||||||
});
|
});
|
||||||
@@ -757,27 +740,6 @@ describe("ElementWidgetDriver", () => {
|
|||||||
{},
|
{},
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it("sends child action delayed sticky message events", async () => {
|
|
||||||
client._unstable_sendStickyDelayedEvent.mockResolvedValue({
|
|
||||||
delay_id: "id-child",
|
|
||||||
});
|
|
||||||
|
|
||||||
await expect(
|
|
||||||
driver.sendDelayedStickyEvent(null, "id-parent", 2000, EventType.RoomMessage, {}),
|
|
||||||
).resolves.toEqual({
|
|
||||||
roomId,
|
|
||||||
delayId: "id-child",
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(client._unstable_sendStickyDelayedEvent).toHaveBeenCalledWith(
|
|
||||||
roomId,
|
|
||||||
2000,
|
|
||||||
{ parent_delay_id: "id-parent" },
|
|
||||||
null,
|
|
||||||
EventType.RoomMessage,
|
|
||||||
{},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("If the feature_dynamic_room_predecessors feature is not enabled", () => {
|
describe("If the feature_dynamic_room_predecessors feature is not enabled", () => {
|
||||||
|
|||||||
Generated
+13
-13
@@ -276,7 +276,7 @@ overrides:
|
|||||||
'@types/react': ^19.2.10
|
'@types/react': ^19.2.10
|
||||||
'@types/react-dom': ^19.2.3
|
'@types/react-dom': ^19.2.3
|
||||||
caniuse-lite: 1.0.30001806
|
caniuse-lite: 1.0.30001806
|
||||||
matrix-widget-api: ^1.17.0
|
matrix-widget-api: ^1.18.0
|
||||||
'@types/node': 25.9.3
|
'@types/node': 25.9.3
|
||||||
config-file-ts: 0.2.8-rc1
|
config-file-ts: 0.2.8-rc1
|
||||||
node-abi: 4.33.0
|
node-abi: 4.33.0
|
||||||
@@ -655,8 +655,8 @@ importers:
|
|||||||
specifier: github:matrix-org/matrix-js-sdk#develop
|
specifier: github:matrix-org/matrix-js-sdk#develop
|
||||||
version: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/a7396ee8e7ef4011f87d6f5c5a3103e92bb16bb3
|
version: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/a7396ee8e7ef4011f87d6f5c5a3103e92bb16bb3
|
||||||
matrix-widget-api:
|
matrix-widget-api:
|
||||||
specifier: ^1.17.0
|
specifier: ^1.18.0
|
||||||
version: 1.17.0
|
version: 1.18.0
|
||||||
memoize-one:
|
memoize-one:
|
||||||
specifier: ^6.0.0
|
specifier: ^6.0.0
|
||||||
version: 6.0.0
|
version: 6.0.0
|
||||||
@@ -1113,8 +1113,8 @@ importers:
|
|||||||
specifier: ^3.6.0
|
specifier: ^3.6.0
|
||||||
version: 3.6.0(supports-color@10.2.2)
|
version: 3.6.0(supports-color@10.2.2)
|
||||||
matrix-widget-api:
|
matrix-widget-api:
|
||||||
specifier: ^1.17.0
|
specifier: ^1.18.0
|
||||||
version: 1.17.0
|
version: 1.18.0
|
||||||
react:
|
react:
|
||||||
specifier: 'catalog:'
|
specifier: 'catalog:'
|
||||||
version: 19.2.8
|
version: 19.2.8
|
||||||
@@ -1208,8 +1208,8 @@ importers:
|
|||||||
specifier: ^9.0.0
|
specifier: ^9.0.0
|
||||||
version: 9.9.0(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.3.0)(@types/react-dom@19.2.3)(@types/react@19.2.18)(@vector-im/compound-design-tokens@10.2.1)(react-dom@19.2.8)(react@19.2.8)
|
version: 9.9.0(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.3.0)(@types/react-dom@19.2.3)(@types/react@19.2.18)(@vector-im/compound-design-tokens@10.2.1)(react-dom@19.2.8)(react@19.2.8)
|
||||||
matrix-widget-api:
|
matrix-widget-api:
|
||||||
specifier: ^1.17.0
|
specifier: ^1.18.0
|
||||||
version: 1.17.0
|
version: 1.18.0
|
||||||
styled-components:
|
styled-components:
|
||||||
specifier: ^6.3.11
|
specifier: ^6.3.11
|
||||||
version: 6.4.4(react-dom@19.2.8)(react@19.2.8)
|
version: 6.4.4(react-dom@19.2.8)(react@19.2.8)
|
||||||
@@ -1294,8 +1294,8 @@ importers:
|
|||||||
specifier: 'catalog:'
|
specifier: 'catalog:'
|
||||||
version: typescript@7.0.2
|
version: typescript@7.0.2
|
||||||
matrix-widget-api:
|
matrix-widget-api:
|
||||||
specifier: ^1.17.0
|
specifier: ^1.18.0
|
||||||
version: 1.17.0
|
version: 1.18.0
|
||||||
rollup-plugin-external-globals:
|
rollup-plugin-external-globals:
|
||||||
specifier: ^0.13.0
|
specifier: ^0.13.0
|
||||||
version: 0.13.0(rollup@4.60.1)
|
version: 0.13.0(rollup@4.60.1)
|
||||||
@@ -10142,8 +10142,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-oY4YZCU8OqDZzmCiJpo8XrATa7XNOB5oFyIpE7O0jjaIEeu6LnQrHmm/fpsYkPUENVzGJm1YdoOtvcBrQx+h2g==}
|
resolution: {integrity: sha512-oY4YZCU8OqDZzmCiJpo8XrATa7XNOB5oFyIpE7O0jjaIEeu6LnQrHmm/fpsYkPUENVzGJm1YdoOtvcBrQx+h2g==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
matrix-widget-api@1.17.0:
|
matrix-widget-api@1.18.0:
|
||||||
resolution: {integrity: sha512-5FHoo3iEP3Bdlv5jsYPWOqj+pGdFQNLWnJLiB0V7Ygne7bb+Gsj3ibyFyHWC6BVw+Z+tSW4ljHpO17I9TwStwQ==}
|
resolution: {integrity: sha512-4T2f2koWmx05p1BLcT/9YGGGPSXpPT+PA4Oap/5fjhXsWPxMGJiGL97YpANMYLKsnE1sScYFeuyxIgdc1Qo+Ew==}
|
||||||
|
|
||||||
md5.js@1.3.5:
|
md5.js@1.3.5:
|
||||||
resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
|
resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
|
||||||
@@ -23387,7 +23387,7 @@ snapshots:
|
|||||||
content-type: 2.0.0
|
content-type: 2.0.0
|
||||||
loglevel: 1.9.2
|
loglevel: 1.9.2
|
||||||
matrix-events-sdk: 0.0.1
|
matrix-events-sdk: 0.0.1
|
||||||
matrix-widget-api: 1.17.0
|
matrix-widget-api: 1.18.0
|
||||||
p-retry: 8.0.0
|
p-retry: 8.0.0
|
||||||
sdp-transform: 3.0.0
|
sdp-transform: 3.0.0
|
||||||
unhomoglyph: 1.0.6
|
unhomoglyph: 1.0.6
|
||||||
@@ -23402,7 +23402,7 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
matrix-widget-api@1.17.0:
|
matrix-widget-api@1.18.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/events': 3.0.3
|
'@types/events': 3.0.3
|
||||||
events: 3.3.0
|
events: 3.3.0
|
||||||
|
|||||||
+1
-1
@@ -136,7 +136,7 @@ overrides:
|
|||||||
"@types/react": "catalog:"
|
"@types/react": "catalog:"
|
||||||
"@types/react-dom": "catalog:"
|
"@types/react-dom": "catalog:"
|
||||||
caniuse-lite: 1.0.30001806
|
caniuse-lite: 1.0.30001806
|
||||||
matrix-widget-api: "^1.17.0"
|
matrix-widget-api: "^1.18.0"
|
||||||
"@types/node": 25.9.3
|
"@types/node": 25.9.3
|
||||||
config-file-ts: 0.2.8-rc1
|
config-file-ts: 0.2.8-rc1
|
||||||
node-abi: 4.33.0
|
node-abi: 4.33.0
|
||||||
|
|||||||
Reference in New Issue
Block a user