Skip to content

Commit 1745389

Browse files
committed
fix(eventstream-handler-node): add system clock offset to event signing streams
1 parent fb98e0c commit 1745389

10 files changed

+35
-8
lines changed

packages/eventstream-handler-node/src/EventSigningStream.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ describe("EventSigningStream", () => {
1111
Date = originalDate;
1212
});
1313

14-
it("should sign a eventstream payload properly", (done) => {
14+
it("should sign an eventstream payload properly", (done) => {
1515
const eventStreamCodec = new EventStreamCodec(toUtf8, fromUtf8);
1616
const message1: Message = {
1717
headers: {},

packages/eventstream-handler-node/src/EventSigningStream.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface EventSigningStreamOptions extends TransformOptions {
99
priorSignature: string;
1010
messageSigner: MessageSigner;
1111
eventStreamCodec: EventStreamCodec;
12+
systemClockOffset?: number;
1213
}
1314

1415
/**
@@ -20,6 +21,7 @@ export class EventSigningStream extends Transform {
2021
private priorSignature: string;
2122
private messageSigner: MessageSigner;
2223
private eventStreamCodec: EventStreamCodec;
24+
private readonly systemClockOffset: number;
2325

2426
constructor(options: EventSigningStreamOptions) {
2527
super({
@@ -32,11 +34,12 @@ export class EventSigningStream extends Transform {
3234
this.priorSignature = options.priorSignature;
3335
this.eventStreamCodec = options.eventStreamCodec;
3436
this.messageSigner = options.messageSigner;
37+
this.systemClockOffset = options.systemClockOffset ?? 0;
3538
}
3639

3740
async _transform(chunk: Uint8Array, encoding: string, callback: TransformCallback): Promise<void> {
3841
try {
39-
const now = new Date();
42+
const now = new Date(new Date().getTime() + this.systemClockOffset);
4043
const dateHeader: MessageHeaders = {
4144
":date": { type: "timestamp", value: now },
4245
};

packages/eventstream-handler-node/src/EventStreamPayloadHandler.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ describe(EventStreamPayloadHandler.name, () => {
9090
priorSignature,
9191
eventStreamCodec: expect.anything(),
9292
messageSigner: expect.anything(),
93+
systemClockOffset: 0,
9394
});
9495
});
9596

@@ -121,6 +122,7 @@ describe(EventStreamPayloadHandler.name, () => {
121122
priorSignature,
122123
eventStreamCodec: expect.anything(),
123124
messageSigner: expect.anything(),
125+
systemClockOffset: 0,
124126
});
125127
});
126128

packages/eventstream-handler-node/src/EventStreamPayloadHandler.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export interface EventStreamPayloadHandlerOptions {
2323
messageSigner: Provider<MessageSigner>;
2424
utf8Encoder: Encoder;
2525
utf8Decoder: Decoder;
26+
systemClockOffset?: number;
2627
}
2728

2829
/**
@@ -37,10 +38,12 @@ export interface EventStreamPayloadHandlerOptions {
3738
export class EventStreamPayloadHandler implements IEventStreamPayloadHandler {
3839
private readonly messageSigner: Provider<MessageSigner>;
3940
private readonly eventStreamCodec: EventStreamCodec;
41+
private readonly systemClockOffset: number;
4042

4143
constructor(options: EventStreamPayloadHandlerOptions) {
4244
this.messageSigner = options.messageSigner;
4345
this.eventStreamCodec = new EventStreamCodec(options.utf8Encoder, options.utf8Decoder);
46+
this.systemClockOffset = options.systemClockOffset ?? 0;
4447
}
4548

4649
async handle<T extends MetadataBearer>(
@@ -79,6 +82,7 @@ export class EventStreamPayloadHandler implements IEventStreamPayloadHandler {
7982
priorSignature,
8083
eventStreamCodec: this.eventStreamCodec,
8184
messageSigner: await this.messageSigner(),
85+
systemClockOffset: this.systemClockOffset,
8286
});
8387

8488
pipeline(payloadStream, signingStream, request.body, (err: NodeJS.ErrnoException | null) => {

packages/eventstream-handler-node/src/provider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ export const eventStreamPayloadHandlerProvider: EventStreamPayloadHandlerProvide
1414
utf8Encoder: Encoder;
1515
utf8Decoder: Decoder;
1616
messageSigner: Provider<MessageSigner>;
17+
systemClockOffset?: number;
1718
}) => new EventStreamPayloadHandler(options);

packages/middleware-websocket/src/EventStreamPayloadHandler.spec.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,12 @@ describe(EventStreamPayloadHandler.name, () => {
9191
});
9292

9393
expect(getEventSigningTransformStream).toHaveBeenCalledTimes(1);
94-
expect(getEventSigningTransformStream).toHaveBeenCalledWith(priorSignature, expect.anything(), expect.anything());
94+
expect(getEventSigningTransformStream).toHaveBeenCalledWith(
95+
priorSignature,
96+
expect.anything(),
97+
expect.anything(),
98+
0
99+
);
95100
});
96101

97102
it("should call event signer with request signature from query string if no signature headers are found", async () => {
@@ -118,7 +123,12 @@ describe(EventStreamPayloadHandler.name, () => {
118123
});
119124

120125
expect(getEventSigningTransformStream).toHaveBeenCalledTimes(1);
121-
expect(getEventSigningTransformStream).toHaveBeenCalledWith(priorSignature, expect.anything(), expect.anything());
126+
expect(getEventSigningTransformStream).toHaveBeenCalledWith(
127+
priorSignature,
128+
expect.anything(),
129+
expect.anything(),
130+
0
131+
);
122132
});
123133

124134
it("should start piping to request payload through event signer if downstream middleware returns", async () => {

packages/middleware-websocket/src/EventStreamPayloadHandler.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export interface EventStreamPayloadHandlerOptions {
1919
messageSigner: Provider<MessageSigner>;
2020
utf8Encoder: Encoder;
2121
utf8Decoder: Decoder;
22+
systemClockOffset?: number;
2223
}
2324

2425
/**
@@ -31,10 +32,12 @@ export interface EventStreamPayloadHandlerOptions {
3132
export class EventStreamPayloadHandler implements IEventStreamPayloadHandler {
3233
private readonly messageSigner: Provider<MessageSigner>;
3334
private readonly eventStreamCodec: EventStreamCodec;
35+
private readonly systemClockOffset: number;
3436

3537
constructor(options: EventStreamPayloadHandlerOptions) {
3638
this.messageSigner = options.messageSigner;
3739
this.eventStreamCodec = new EventStreamCodec(options.utf8Encoder, options.utf8Decoder);
40+
this.systemClockOffset = options.systemClockOffset ?? 0;
3841
}
3942

4043
async handle<T extends MetadataBearer>(
@@ -69,7 +72,8 @@ export class EventStreamPayloadHandler implements IEventStreamPayloadHandler {
6972
const signingStream = getEventSigningTransformStream(
7073
priorSignature,
7174
await this.messageSigner(),
72-
this.eventStreamCodec
75+
this.eventStreamCodec,
76+
this.systemClockOffset
7377
);
7478

7579
const signedPayload = payload.pipeThrough(signingStream);

packages/middleware-websocket/src/eventstream-payload-handler-provider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ export const eventStreamPayloadHandlerProvider: EventStreamPayloadHandlerProvide
77
utf8Encoder: Encoder;
88
utf8Decoder: Decoder;
99
messageSigner: Provider<MessageSigner>;
10+
systemClockOffset?: number;
1011
}) => new EventStreamPayloadHandler(options);

packages/middleware-websocket/src/get-event-signing-stream.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ describe(getEventSigningTransformStream.name, () => {
8080
sign: mockMessageSigner,
8181
signMessage: mockMessageSigner,
8282
},
83-
eventStreamCodec
83+
eventStreamCodec,
84+
0
8485
);
8586
const output: Array<MessageHeaders> = [];
8687

packages/middleware-websocket/src/get-event-signing-stream.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@ import { fromHex } from "@smithy/util-hex-encoding";
1010
export const getEventSigningTransformStream = (
1111
initialSignature: string,
1212
messageSigner: MessageSigner,
13-
eventStreamCodec: EventStreamCodec
13+
eventStreamCodec: EventStreamCodec,
14+
systemClockOffset: number
1415
): TransformStream<Uint8Array, Uint8Array> => {
1516
let priorSignature = initialSignature;
1617
const transformer: Transformer<Uint8Array, Uint8Array> = {
1718
start() {},
1819
async transform(chunk, controller) {
1920
try {
20-
const now = new Date();
21+
const now = new Date(new Date().getTime() + systemClockOffset);
2122
const dateHeader: MessageHeaders = {
2223
":date": { type: "timestamp", value: now },
2324
};

0 commit comments

Comments
 (0)