Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Better type safety around networked packets #15

Open
slice opened this issue Dec 19, 2023 · 1 comment · May be fixed by #17
Open

Better type safety around networked packets #15

slice opened this issue Dec 19, 2023 · 1 comment · May be fixed by #17

Comments

@slice
Copy link
Contributor

slice commented Dec 19, 2023

(Copied from GH)

The way we model Gateway packets right now isn't wrong:

export interface GatewayMessage {
  op: OPCode
  d?: any
  s?: number
  t?: GatewayMessageType
}

…but, we could take advantage of TS to model them in a more correct fashion. s and t are virtually guaranteed to be non-null if op == OPCode.DISPATCH, so something this could be better:

export type GatewayMessage<Data> =
  { op: OPCode.DISPATCH, data: Data, sequence: number, eventType: string }
| { op: OPCode, data?: Data }

This also:

  • renames the fields to be more human-readable
  • realizes that the data (d) of a packet should really be unknown, not any. But, since it's the primary encapsulated content of a Gateway packet, so it makes sense to parameterize over it as a generic instead

We can also make more union variants for each OPCode type, and furthermore for each eventType too, probably. This would eliminate a lot of the type annotations from business logic, make it viable to enable strict in tsconfig.json, and give us stronger typing guarantees (meaning, less bugs).

Copy link

linear bot commented Dec 20, 2023

PLT-1014 Better type safety around networked packets

(Copied from GH)

The way we model Gateway packets right now isn't wrong:

export interface GatewayMessage {
  op: OPCode
  d?: anya
  s?: number
  t?: GatewayMessageType
}

…but, we could take advantage of TS to model them in a more correct fashion. s and t are virtually guaranteed to be non-null if op == OPCode.DISPATCH, so something this could be better:

export type GatewayMessage<Data> =
  { op: OPCode.DISPATCH, data: Data, sequence: number, eventType: string }
| { op: OPCode, data?: Data }

This also:

  • renames the fields to be more human-readable
  • realizes that the data (d) of a packet should really be unknown, not any. But, since it's the primary encapsulated content of a Gateway packet, so it makes sense to parameterize over it as a generic instead

We can also make more union variants for each OPCode type, and furthermore for each eventType too, probably. This would eliminate a lot of the type annotations from business logic, make it viable to enable strict in tsconfig.json, and give us stronger typing guarantees (meaning, less bugs).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant