From 1ef9114325883048303bbc0cae570ca0759029aa Mon Sep 17 00:00:00 2001 From: Diane Huxley Date: Thu, 14 Dec 2023 14:52:06 -0800 Subject: [PATCH] Validate structure of messages and resources during creation --- packages/protocol/src/message-kinds/close.ts | 6 ++++-- packages/protocol/src/message-kinds/order-status.ts | 7 +++++-- packages/protocol/src/message-kinds/order.ts | 6 ++++-- packages/protocol/src/message-kinds/quote.ts | 6 ++++-- packages/protocol/src/message-kinds/rfq.ts | 6 ++++-- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/packages/protocol/src/message-kinds/close.ts b/packages/protocol/src/message-kinds/close.ts index 34bd9abd..831f2357 100644 --- a/packages/protocol/src/message-kinds/close.ts +++ b/packages/protocol/src/message-kinds/close.ts @@ -22,7 +22,7 @@ export class Close extends Message<'close'> { * Creates a close message with the given options * @param opts - options to create a close message */ - static create(opts: CreateCloseOptions) { + static async create(opts: CreateCloseOptions) { const metadata: MessageMetadata<'close'> = { ...opts.metadata, kind : 'close' as const, @@ -31,7 +31,9 @@ export class Close extends Message<'close'> { } const message = { metadata, data: opts.data } - return new Close(message) + const close = new Close(message) + await Message.validate(close) + return close } /** an explanation of why the exchange is being closed */ diff --git a/packages/protocol/src/message-kinds/order-status.ts b/packages/protocol/src/message-kinds/order-status.ts index efc8f1f8..6abcc59e 100644 --- a/packages/protocol/src/message-kinds/order-status.ts +++ b/packages/protocol/src/message-kinds/order-status.ts @@ -1,5 +1,6 @@ import type { MessageKind, MessageKindModel, MessageMetadata } from '../types.js' import { Message } from '../message.js' +import { order } from '../../generated/compiled-validators.js' /** * Options passed to {@link OrderStatus.create} @@ -23,7 +24,7 @@ export class OrderStatus extends Message<'orderstatus'> { * Creates an order status with the given options * @param opts - options to create an order status */ - static create(opts: CreateOrderStatusOptions) { + static async create(opts: CreateOrderStatusOptions) { const metadata: MessageMetadata<'orderstatus'> = { ...opts.metadata, kind : 'orderstatus' as const, @@ -32,7 +33,9 @@ export class OrderStatus extends Message<'orderstatus'> { } const message = { metadata, data: opts.data } - return new OrderStatus(message) + const orderStatus = new OrderStatus(message) + await Message.validate(order) + return orderStatus } /** Current status of Order that's being executed (e.g. PROCESSING, COMPLETED, FAILED etc.) */ diff --git a/packages/protocol/src/message-kinds/order.ts b/packages/protocol/src/message-kinds/order.ts index 4812341b..34f70685 100644 --- a/packages/protocol/src/message-kinds/order.ts +++ b/packages/protocol/src/message-kinds/order.ts @@ -22,7 +22,7 @@ export class Order extends Message<'order'> { * Creates an order with the given options * @param opts - options to create an order */ - static create(opts: CreateOrderOptions) { + static async create(opts: CreateOrderOptions) { const metadata: MessageMetadata<'order'> = { ...opts.metadata, kind : 'order' as const, @@ -31,6 +31,8 @@ export class Order extends Message<'order'> { } const message = { metadata, data: {} } - return new Order(message) + const order = new Order(message) + await Message.validate(order) + return order } } \ No newline at end of file diff --git a/packages/protocol/src/message-kinds/quote.ts b/packages/protocol/src/message-kinds/quote.ts index 4c4fe7e0..801e1b2c 100644 --- a/packages/protocol/src/message-kinds/quote.ts +++ b/packages/protocol/src/message-kinds/quote.ts @@ -23,7 +23,7 @@ export class Quote extends Message<'quote'> { * Creates a quote message with the given options * @param opts - options to create a quote */ - static create(opts: CreateQuoteOptions) { + static async create(opts: CreateQuoteOptions) { const metadata: MessageMetadata<'quote'> = { ...opts.metadata, kind : 'quote' as const, @@ -32,7 +32,9 @@ export class Quote extends Message<'quote'> { } const message = { metadata, data: opts.data } - return new Quote(message) + const quote = new Quote(message) + await Message.validate(quote) + return quote } /** When this quote expires. Expressed as ISO8601 */ diff --git a/packages/protocol/src/message-kinds/rfq.ts b/packages/protocol/src/message-kinds/rfq.ts index 1e840ec8..90ea7a23 100644 --- a/packages/protocol/src/message-kinds/rfq.ts +++ b/packages/protocol/src/message-kinds/rfq.ts @@ -30,7 +30,7 @@ export class Rfq extends Message<'rfq'> { * @param opts - options to create an rfq * @returns {@link Rfq} */ - static create(opts: CreateRfqOptions) { + static async create(opts: CreateRfqOptions) { const id = Message.generateId('rfq') const metadata: MessageMetadata<'rfq'> = { ...opts.metadata, @@ -44,7 +44,9 @@ export class Rfq extends Message<'rfq'> { // TODO: hash `data.payoutMethod.paymentDetails` and set `private` const message = { metadata, data: opts.data } - return new Rfq(message) + const rfq = new Rfq(message) + await Message.validate(rfq) + return rfq } /**