Skip to content

Commit 643de5f

Browse files
committed
Delayed event management: split endpoints, no auth
Use the new js-sdk client methods for calling the dedicated, unauthenticated endpoints for each of the cancel/restart/send actions for updating a delayed event. Note that these methods are compatible with homeservers that support only the original endpoint where the update action is in the request body.
1 parent abb9354 commit 643de5f

File tree

5 files changed

+73
-21
lines changed

5 files changed

+73
-21
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@
132132
"matrix-encrypt-attachment": "^1.0.3",
133133
"matrix-events-sdk": "0.0.1",
134134
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop",
135-
"matrix-widget-api": "^1.10.0",
135+
"matrix-widget-api": "^1.14.0",
136136
"memoize-one": "^6.0.0",
137137
"mime": "^4.0.4",
138138
"oidc-client-ts": "^3.0.1",

src/stores/widgets/StopGapWidgetDriver.ts

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import {
2626
type IWidgetApiErrorResponseDataDetails,
2727
type ISearchUserDirectoryResult,
2828
type IGetMediaConfigResult,
29-
type UpdateDelayedEventAction,
3029
} from "matrix-widget-api";
3130
import {
3231
ClientEvent,
@@ -425,12 +424,34 @@ export class StopGapWidgetDriver extends WidgetDriver {
425424
/**
426425
* @experimental Part of MSC4140 & MSC4157
427426
*/
428-
public async updateDelayedEvent(delayId: string, action: UpdateDelayedEventAction): Promise<void> {
427+
public async cancelScheduledDelayedEvent(delayId: string): Promise<void> {
429428
const client = MatrixClientPeg.get();
430429

431430
if (!client) throw new Error("Not in a room or not attached to a client");
432431

433-
await client._unstable_updateDelayedEvent(delayId, action);
432+
await client._unstable_cancelScheduledDelayedEvent(delayId);
433+
}
434+
435+
/**
436+
* @experimental Part of MSC4140 & MSC4157
437+
*/
438+
public async restartScheduledDelayedEvent(delayId: string): Promise<void> {
439+
const client = MatrixClientPeg.get();
440+
441+
if (!client) throw new Error("Not in a room or not attached to a client");
442+
443+
await client._unstable_restartScheduledDelayedEvent(delayId);
444+
}
445+
446+
/**
447+
* @experimental Part of MSC4140 & MSC4157
448+
*/
449+
public async sendScheduledDelayedEvent(delayId: string): Promise<void> {
450+
const client = MatrixClientPeg.get();
451+
452+
if (!client) throw new Error("Not in a room or not attached to a client");
453+
454+
await client._unstable_sendScheduledDelayedEvent(delayId);
434455
}
435456

436457
/**

test/test-utils/test-utils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,9 @@ export function createTestClient(): MatrixClient {
276276

277277
_unstable_sendDelayedEvent: jest.fn(),
278278
_unstable_sendDelayedStateEvent: jest.fn(),
279-
_unstable_updateDelayedEvent: jest.fn(),
279+
_unstable_cancelScheduledDelayedEvent: jest.fn(),
280+
_unstable_restartScheduledDelayedEvent: jest.fn(),
281+
_unstable_sendScheduledDelayedEvent: jest.fn(),
280282

281283
searchUserDirectory: jest.fn().mockResolvedValue({ limited: false, results: [] }),
282284
setDeviceVerified: jest.fn(),

test/unit-tests/stores/widgets/StopGapWidgetDriver-test.ts

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import {
2727
SimpleObservable,
2828
OpenIDRequestState,
2929
type IOpenIDUpdate,
30-
UpdateDelayedEventAction,
3130
} from "matrix-widget-api";
3231
import {
3332
type ApprovalOpts,
@@ -554,22 +553,44 @@ describe("StopGapWidgetDriver", () => {
554553
driver = mkDefaultDriver();
555554
});
556555

557-
it("updates delayed events", async () => {
558-
client._unstable_updateDelayedEvent.mockResolvedValue({});
559-
for (const action of [
560-
UpdateDelayedEventAction.Cancel,
561-
UpdateDelayedEventAction.Restart,
562-
UpdateDelayedEventAction.Send,
563-
]) {
564-
await expect(driver.updateDelayedEvent("id", action)).resolves.toBeUndefined();
565-
expect(client._unstable_updateDelayedEvent).toHaveBeenCalledWith("id", action);
566-
}
556+
it("can cancel scheduled delayed events", async () => {
557+
client._unstable_cancelScheduledDelayedEvent.mockResolvedValue({});
558+
await expect(driver.cancelScheduledDelayedEvent("id")).resolves.toBeUndefined();
559+
expect(client._unstable_cancelScheduledDelayedEvent).toHaveBeenCalledWith("id");
560+
});
561+
562+
it("can restart scheduled delayed events", async () => {
563+
client._unstable_restartScheduledDelayedEvent.mockResolvedValue({});
564+
await expect(driver.restartScheduledDelayedEvent("id")).resolves.toBeUndefined();
565+
expect(client._unstable_restartScheduledDelayedEvent).toHaveBeenCalledWith("id");
567566
});
568567

569-
it("fails to update delayed events", async () => {
568+
it("can send scheduled delayed events", async () => {
569+
client._unstable_sendScheduledDelayedEvent.mockResolvedValue({});
570+
await expect(driver.sendScheduledDelayedEvent("id")).resolves.toBeUndefined();
571+
expect(client._unstable_sendScheduledDelayedEvent).toHaveBeenCalledWith("id");
572+
});
573+
574+
it("fails to cancel scheduled delayed events", async () => {
575+
const errorMessage = "Cannot cancel this delayed event";
576+
client._unstable_cancelScheduledDelayedEvent.mockRejectedValue(new Error(errorMessage));
577+
await expect(driver.cancelScheduledDelayedEvent("id")).rejects.toThrow(
578+
errorMessage,
579+
);
580+
});
581+
582+
it("fails to restart scheduled delayed events", async () => {
570583
const errorMessage = "Cannot restart this delayed event";
571-
client._unstable_updateDelayedEvent.mockRejectedValue(new Error(errorMessage));
572-
await expect(driver.updateDelayedEvent("id", UpdateDelayedEventAction.Restart)).rejects.toThrow(
584+
client._unstable_restartScheduledDelayedEvent.mockRejectedValue(new Error(errorMessage));
585+
await expect(driver.restartScheduledDelayedEvent("id")).rejects.toThrow(
586+
errorMessage,
587+
);
588+
});
589+
590+
it("fails to send scheduled delayed events", async () => {
591+
const errorMessage = "Cannot send this delayed event";
592+
client._unstable_sendScheduledDelayedEvent.mockRejectedValue(new Error(errorMessage));
593+
await expect(driver.sendScheduledDelayedEvent("id")).rejects.toThrow(
573594
errorMessage,
574595
);
575596
});

yarn.lock

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4089,7 +4089,7 @@
40894089
classnames "^2.5.1"
40904090
vaul "^1.0.0"
40914091

4092-
"@vector-im/matrix-wysiwyg-wasm@link:../../Library/Caches/Yarn/v6/npm-@vector-im-matrix-wysiwyg-2.40.0-53c9ca5ea907d91e4515da64f20a82e5586b882c-integrity/node_modules/bindings/wysiwyg-wasm":
4092+
"@vector-im/matrix-wysiwyg-wasm@link:../../.cache/yarn/v6/npm-@vector-im-matrix-wysiwyg-2.40.0-53c9ca5ea907d91e4515da64f20a82e5586b882c-integrity/node_modules/bindings/wysiwyg-wasm":
40934093
version "0.0.0"
40944094
uid ""
40954095

@@ -4098,7 +4098,7 @@
40984098
resolved "https://registry.yarnpkg.com/@vector-im/matrix-wysiwyg/-/matrix-wysiwyg-2.40.0.tgz#53c9ca5ea907d91e4515da64f20a82e5586b882c"
40994099
integrity sha512-8LRFLs5PEKYs4lOL7aJ4lL/hGCrvEvOYkCR3JggXYXDVMtX4LmfdlKYucSAe98pCmqAAbLRvlRcR1bTOYvM8ug==
41004100
dependencies:
4101-
"@vector-im/matrix-wysiwyg-wasm" "link:../../../.cache/yarn/v6/npm-@vector-im-matrix-wysiwyg-2.40.0-53c9ca5ea907d91e4515da64f20a82e5586b882c-integrity/node_modules/bindings/wysiwyg-wasm"
4101+
"@vector-im/matrix-wysiwyg-wasm" "link:../../.cache/yarn/v6/npm-@vector-im-matrix-wysiwyg-2.40.0-53c9ca5ea907d91e4515da64f20a82e5586b882c-integrity/node_modules/bindings/wysiwyg-wasm"
41024102

41034103
41044104
version "3.2.4"
@@ -9716,6 +9716,14 @@ matrix-widget-api@^1.10.0:
97169716
"@types/events" "^3.0.0"
97179717
events "^3.2.0"
97189718

9719+
matrix-widget-api@^1.14.0:
9720+
version "1.14.0"
9721+
resolved "https://registry.yarnpkg.com/matrix-widget-api/-/matrix-widget-api-1.14.0.tgz#aa90c40ace27d3165299f7dbc760a53001ce1446"
9722+
integrity sha512-DDvZGOQhI/rilPWg5VlLN7pHIsPt0Jt14lsuHDP+KU+fmpAQNITJ6aIld1ZoXWsrVGv2PS3x6K/MHtfruIOQJQ==
9723+
dependencies:
9724+
"@types/events" "^3.0.0"
9725+
events "^3.2.0"
9726+
97199727
97209728
version "2.0.28"
97219729
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba"

0 commit comments

Comments
 (0)