Skip to content

Commit b4ceef7

Browse files
committed
refactor(events): remove timestamp from event interfaces
Remove timestamp field from GameEvent, InputEvent, and KeyboardInputEvent interfaces. The tick-based system provides deterministic event ordering without needing wall-clock timestamps.
1 parent de7e25d commit b4ceef7

14 files changed

Lines changed: 34 additions & 108 deletions

packages/core/src/UserInputEventSource.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ export class UserInputEventSource implements GameEventSource {
66
protected dataQueue: Array<{
77
inputType: string
88
data: any
9-
timestamp: number
109
}> = []
1110

1211
/**
@@ -15,7 +14,7 @@ export class UserInputEventSource implements GameEventSource {
1514
* @param data The input data to queue
1615
*/
1716
queueInput(inputType: string, data: any): void {
18-
this.dataQueue.push({ inputType, data, timestamp: Date.now() })
17+
this.dataQueue.push({ inputType, data })
1918
}
2019

2120
/**
@@ -32,7 +31,6 @@ export class UserInputEventSource implements GameEventSource {
3231
const events: UserInputEvent[] = this.dataQueue.map((item) => ({
3332
type: GameEventType.USER_INPUT,
3433
tick: totalTicks,
35-
timestamp: item.timestamp,
3634
inputType: item.inputType,
3735
params: item.data,
3836
}))

packages/core/src/platform/InputLayer.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ export interface InputEvent {
1212
x: number
1313
y: number
1414
button?: number
15-
timestamp: number
1615
}
1716

1817
/**
@@ -21,7 +20,6 @@ export interface InputEvent {
2120
export interface KeyboardInputEvent {
2221
key: string
2322
code: string
24-
timestamp: number
2523
}
2624

2725
/**

packages/core/src/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ export enum GameEventType {
1616
export interface GameEvent {
1717
type: GameEventType
1818
tick: number
19-
timestamp: number
2019
}
2120

2221
export interface UserInputEvent extends GameEvent {

packages/core/tests/events/RecordedEventSource.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,8 @@ describe("RecordedEventSource", () => {
153153
const events = eventSource.getNextEvents(1)
154154

155155
expect(events).toHaveLength(2)
156-
expect(events[0].timestamp).toBe(1000) // Earlier timestamp
157-
expect(events[1].timestamp).toBe(1001) // Later timestamp
156+
expect((events[0] as any).inputType).toBe("keyboard")
157+
expect((events[1] as any).objectType).toBe("Player")
158158
})
159159

160160
it("should track current position correctly", () => {
@@ -233,7 +233,6 @@ describe("RecordedEventSource", () => {
233233
expect(userInputEvent).toBeDefined()
234234
expect(userInputEvent.inputType).toBe("keyboard")
235235
expect(userInputEvent.params).toEqual({ key: "W", pressed: true })
236-
expect(userInputEvent.timestamp).toBe(1000)
237236
})
238237

239238
it("should preserve object update event details", () => {
@@ -247,7 +246,6 @@ describe("RecordedEventSource", () => {
247246
expect(objectUpdateEvent.objectId).toBe("player1")
248247
expect(objectUpdateEvent.method).toBe("setPosition")
249248
expect(objectUpdateEvent.params).toEqual([{ x: 10, y: 20 }])
250-
expect(objectUpdateEvent.timestamp).toBe(1001)
251249
})
252250

253251
it("should handle complex parameter types", () => {

packages/core/tests/events/UserInputEventSource.test.ts

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,12 @@ describe("UserInputEventSource", () => {
4949
expect(events[0].tick).toBe(currentFrame)
5050
expect((events[0] as UserInputEvent).inputType).toBe("direction")
5151
expect(events[0].params).toEqual({ x: 1, y: 0 })
52-
expect(typeof events[0].timestamp).toBe("number")
5352

5453
// Check second event
5554
expect(events[1].type).toBe(GameEventType.USER_INPUT)
5655
expect(events[1].tick).toBe(currentFrame)
5756
expect((events[1] as UserInputEvent).inputType).toBe("button")
5857
expect(events[1].params).toEqual({ action: "jump" })
59-
expect(typeof events[1].timestamp).toBe("number")
6058
})
6159

6260
it("should clear queue after generating events", () => {
@@ -184,44 +182,6 @@ describe("UserInputEventSource", () => {
184182
})
185183
})
186184

187-
describe("Timestamp Handling", () => {
188-
it("should assign timestamps to queued inputs", async () => {
189-
const startTime = Date.now()
190-
191-
inputSource.queueInput("test", { value: 1 })
192-
193-
// Small delay
194-
await new Promise((resolve) => setTimeout(resolve, 5))
195-
196-
inputSource.queueInput("test", { value: 2 })
197-
198-
const events = inputSource.getNextEvents(10)
199-
200-
expect(events).toHaveLength(2)
201-
expect(events[0].timestamp).toBeGreaterThanOrEqual(startTime)
202-
expect(events[1].timestamp).toBeGreaterThan(events[0].timestamp)
203-
})
204-
205-
it("should preserve timestamp order", async () => {
206-
const timestamps: number[] = []
207-
208-
// Queue inputs with small delays
209-
for (let i = 0; i < 5; i++) {
210-
inputSource.queueInput(`input${i}`, { value: i })
211-
await new Promise((resolve) => setTimeout(resolve, 1))
212-
}
213-
214-
const events = inputSource.getNextEvents(10)
215-
216-
events.forEach((event) => timestamps.push(event.timestamp))
217-
218-
// Timestamps should be in ascending order
219-
for (let i = 1; i < timestamps.length; i++) {
220-
expect(timestamps[i]).toBeGreaterThanOrEqual(timestamps[i - 1])
221-
}
222-
})
223-
})
224-
225185
describe("Input Type Handling", () => {
226186
it("should handle different input types", () => {
227187
inputSource.queueInput("keyboard", { key: "W", pressed: true })

packages/core/tests/helpers/PlatformMocks.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -665,42 +665,42 @@ export class MockInputLayer implements InputLayer {
665665

666666
// Test helpers - simulate events
667667
simulatePointerDown(x: number, y: number, button = 0): void {
668-
const event: InputEvent = { x, y, button, timestamp: Date.now() }
668+
const event: InputEvent = { x, y, button }
669669
for (const callback of this.pointerDownCallbacks) {
670670
callback(event)
671671
}
672672
}
673673

674674
simulatePointerUp(x: number, y: number, button = 0): void {
675-
const event: InputEvent = { x, y, button, timestamp: Date.now() }
675+
const event: InputEvent = { x, y, button }
676676
for (const callback of this.pointerUpCallbacks) {
677677
callback(event)
678678
}
679679
}
680680

681681
simulatePointerMove(x: number, y: number): void {
682-
const event: InputEvent = { x, y, timestamp: Date.now() }
682+
const event: InputEvent = { x, y }
683683
for (const callback of this.pointerMoveCallbacks) {
684684
callback(event)
685685
}
686686
}
687687

688688
simulateClick(x: number, y: number): void {
689-
const event: InputEvent = { x, y, timestamp: Date.now() }
689+
const event: InputEvent = { x, y }
690690
for (const callback of this.clickCallbacks) {
691691
callback(event)
692692
}
693693
}
694694

695695
simulateKeyDown(key: string, code: string): void {
696-
const event: KeyboardInputEvent = { key, code, timestamp: Date.now() }
696+
const event: KeyboardInputEvent = { key, code }
697697
for (const callback of this.keyDownCallbacks) {
698698
callback(event)
699699
}
700700
}
701701

702702
simulateKeyUp(key: string, code: string): void {
703-
const event: KeyboardInputEvent = { key, code, timestamp: Date.now() }
703+
const event: KeyboardInputEvent = { key, code }
704704
for (const callback of this.keyUpCallbacks) {
705705
callback(event)
706706
}

packages/core/tests/helpers/RecordingValidator.ts

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@ export class RecordingValidator {
3131
if (typeof event.tick !== "number" || event.tick < 0) {
3232
errors.push(`Event ${index}: missing or invalid frame number`)
3333
}
34-
if (typeof event.timestamp !== "number") {
35-
errors.push(`Event ${index}: missing or invalid timestamp`)
36-
}
3734
})
3835
}
3936

@@ -72,18 +69,6 @@ export class RecordingValidator {
7269
)
7370
}
7471
}
75-
76-
// Check for potential timestamp ordering issues
77-
let lastTimestamp = 0
78-
for (let i = 0; i < recording.events.length; i++) {
79-
const event = recording.events[i]
80-
if (event.timestamp < lastTimestamp) {
81-
warnings.push(
82-
`Event ${i} has timestamp ${event.timestamp} earlier than previous ${lastTimestamp}`,
83-
)
84-
}
85-
lastTimestamp = event.timestamp
86-
}
8772
}
8873

8974
if (recording.deltaTicks && Array.isArray(recording.deltaTicks)) {

packages/core/tests/helpers/TestScenarioBuilder.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,6 @@ export class TestScenarioBuilder {
249249
this.inputEvents.push({
250250
type: GameEventType.USER_INPUT,
251251
tick,
252-
timestamp: Date.now() + tick * 16.67, // Simulate 60 FPS timing
253252
inputType,
254253
params,
255254
})
@@ -431,7 +430,6 @@ export class TestScenarioBuilder {
431430
const event: ObjectUpdateEvent = {
432431
type: GameEventType.OBJECT_UPDATE,
433432
tick,
434-
timestamp: Date.now(),
435433
objectType,
436434
objectId,
437435
method,

packages/core/tests/integration/RecordReplayIntegration.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,6 @@ describe("Record-Replay Integration Tests", () => {
676676
recorder.recordEvent({
677677
type: GameEventType.OBJECT_UPDATE,
678678
tick: originalEngine.getTotalTicks(),
679-
timestamp: Date.now(),
680679
objectType: "Projectile",
681680
objectId: "serialize_proj",
682681
method: "setPosition",

packages/core/tests/platform/MemoryInputLayer.test.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ describe("MemoryInputLayer", () => {
8080
called = true
8181
})
8282

83-
input.triggerPointerDown({ x: 100, y: 200, timestamp: Date.now() })
83+
input.triggerPointerDown({ x: 100, y: 200 })
8484
expect(called).toBe(true)
8585
})
8686

@@ -90,7 +90,7 @@ describe("MemoryInputLayer", () => {
9090
receivedEvent = event
9191
})
9292

93-
const testEvent = { x: 100, y: 200, button: 0, timestamp: Date.now() }
93+
const testEvent = { x: 100, y: 200, button: 0 }
9494
input.triggerPointerDown(testEvent)
9595

9696
expect(receivedEvent).toEqual(testEvent)
@@ -102,7 +102,7 @@ describe("MemoryInputLayer", () => {
102102
called = true
103103
})
104104

105-
input.triggerPointerUp({ x: 100, y: 200, timestamp: Date.now() })
105+
input.triggerPointerUp({ x: 100, y: 200 })
106106
expect(called).toBe(true)
107107
})
108108

@@ -112,7 +112,7 @@ describe("MemoryInputLayer", () => {
112112
called = true
113113
})
114114

115-
input.triggerPointerMove({ x: 100, y: 200, timestamp: Date.now() })
115+
input.triggerPointerMove({ x: 100, y: 200 })
116116
expect(called).toBe(true)
117117
})
118118

@@ -122,7 +122,7 @@ describe("MemoryInputLayer", () => {
122122
called = true
123123
})
124124

125-
input.triggerClick({ x: 100, y: 200, timestamp: Date.now() })
125+
input.triggerClick({ x: 100, y: 200 })
126126
expect(called).toBe(true)
127127
})
128128

@@ -132,7 +132,7 @@ describe("MemoryInputLayer", () => {
132132
called = true
133133
})
134134

135-
input.triggerKeyDown({ key: "a", code: "KeyA", timestamp: Date.now() })
135+
input.triggerKeyDown({ key: "a", code: "KeyA" })
136136
expect(called).toBe(true)
137137
})
138138

@@ -142,7 +142,7 @@ describe("MemoryInputLayer", () => {
142142
called = true
143143
})
144144

145-
input.triggerKeyUp({ key: "a", code: "KeyA", timestamp: Date.now() })
145+
input.triggerKeyUp({ key: "a", code: "KeyA" })
146146
expect(called).toBe(true)
147147
})
148148

@@ -153,7 +153,7 @@ describe("MemoryInputLayer", () => {
153153
})
154154

155155
input.removeAllListeners()
156-
input.triggerPointerDown({ x: 0, y: 0, timestamp: Date.now() })
156+
input.triggerPointerDown({ x: 0, y: 0 })
157157

158158
expect(called).toBe(false)
159159
})
@@ -164,7 +164,7 @@ describe("MemoryInputLayer", () => {
164164
input.onPointerDown(() => count++)
165165
input.onPointerDown(() => count++)
166166

167-
input.triggerPointerDown({ x: 0, y: 0, timestamp: Date.now() })
167+
input.triggerPointerDown({ x: 0, y: 0 })
168168
expect(count).toBe(3)
169169
})
170170
})

0 commit comments

Comments
 (0)