1313// limitations under the License.
1414import { QueueServiceClient } from '@nitric/api/proto/queue/v1/queue_grpc_pb' ;
1515import {
16- NitricTask ,
16+ NitricTask as NitricTaskPb ,
1717 QueueSendRequest ,
1818 QueueSendBatchRequest ,
1919 QueueReceiveRequest ,
2020 QueueCompleteRequest ,
2121} from '@nitric/api/proto/queue/v1/queue_pb' ;
2222import { SERVICE_BIND } from '../../../constants' ;
2323import * as grpc from '@grpc/grpc-js' ;
24- import type { Task } from '../../../types' ;
24+ import { NitricTask } from '../../../types' ;
2525import { Struct } from 'google-protobuf/google/protobuf/struct_pb' ;
2626import {
2727 fromGrpcError ,
@@ -32,8 +32,8 @@ import {
3232/**
3333 * A message that has failed to be enqueued
3434 */
35- interface FailedMessage {
36- task : Task ;
35+ interface FailedMessage < T > {
36+ task : NitricTask < T > ;
3737 message : string ;
3838}
3939
@@ -44,8 +44,8 @@ interface FailedMessage {
4444 * @param task to convert
4545 * @returns the wire representation of the task
4646 */
47- function taskToWire ( task : Task ) {
48- const wireTask = new NitricTask ( ) ;
47+ function taskToWire ( task : NitricTask ) {
48+ const wireTask = new NitricTaskPb ( ) ;
4949
5050 wireTask . setId ( task . id ) ;
5151 wireTask . setPayloadType ( task . payloadType ) ;
@@ -76,16 +76,16 @@ export class Queueing {
7676 this . QueueServiceClient = newQueueServiceClient ( ) ;
7777 }
7878
79- queue = ( name : string ) : Queue => {
79+ queue = < T > ( name : string ) : Queue < T > => {
8080 if ( ! name ) {
8181 throw new InvalidArgumentError ( 'A queue name is needed to use a Queue.' ) ;
8282 }
8383
84- return new Queue ( this , name ) ;
84+ return new Queue < T > ( this , name ) ;
8585 } ;
8686}
8787
88- export class Queue {
88+ export class Queue < T extends Record < string , any > = Record < string , any > > {
8989 queueing : Queueing ;
9090 name : string ;
9191
@@ -120,17 +120,21 @@ export class Queue {
120120 * };
121121 * });
122122 */
123- public async send ( tasks : Task [ ] ) : Promise < FailedMessage [ ] > ;
124- public async send ( tasks : Task ) : Promise < void > ;
125- public async send ( tasks : Task | Task [ ] ) : Promise < void | FailedMessage [ ] > {
123+ public async send ( tasks : T [ ] | NitricTask < T > [ ] ) : Promise < FailedMessage < T > [ ] > ;
124+ public async send ( tasks : T | NitricTask < T > ) : Promise < void > ;
125+ public async send (
126+ tasks : T [ ] | T | NitricTask < T > | NitricTask < T > [ ]
127+ ) : Promise < void | FailedMessage < T > [ ] > {
126128 return new Promise ( ( resolve , reject ) => {
127129 const request = new QueueSendBatchRequest ( ) ;
128130
129- request . setTasksList (
130- Array . isArray ( tasks )
131- ? tasks . map ( ( task ) => taskToWire ( task ) )
132- : [ taskToWire ( tasks ) ]
131+ // Convert to NitricTask if not specified
132+ const tasksArray = Array . isArray ( tasks ) ? tasks : [ tasks ] ;
133+ const nitricTasksArray = tasksArray . map ( ( t ) =>
134+ t instanceof NitricTask ? t : new NitricTask ( { payload : t } )
133135 ) ;
136+
137+ request . setTasksList ( nitricTasksArray . map ( taskToWire ) ) ;
134138 request . setQueue ( this . name ) ;
135139
136140 this . queueing . QueueServiceClient . sendBatch ( request , ( error , response ) => {
@@ -139,11 +143,11 @@ export class Queue {
139143 return ;
140144 }
141145 const failedTasks = response . getFailedtasksList ( ) . map ( ( m ) => ( {
142- task : {
146+ task : new NitricTask < T > ( {
143147 id : m . getTask ( ) . getId ( ) ,
144- payload : m . getTask ( ) . getPayload ( ) . toJavaScript ( ) ,
145148 payloadType : m . getTask ( ) . getPayloadType ( ) ,
146- } ,
149+ payload : m . getTask ( ) . getPayload ( ) . toJavaScript ( ) as T ,
150+ } ) ,
147151 message : m . getMessage ( ) ,
148152 } ) ) ;
149153 if ( ! Array . isArray ( tasks ) ) {
@@ -181,7 +185,7 @@ export class Queue {
181185 * // do something with task
182186 * ```
183187 */
184- public async receive ( depth ?: number ) : Promise < ReceivedTask [ ] > {
188+ public async receive ( depth ?: number ) : Promise < ReceivedTask < T > [ ] > {
185189 return new Promise ( ( resolve , reject ) => {
186190 const request = new QueueReceiveRequest ( ) ;
187191
@@ -201,7 +205,7 @@ export class Queue {
201205 response . getTasksList ( ) . map ( ( m ) => {
202206 return new ReceivedTask ( {
203207 id : m . getId ( ) ,
204- payload : m . getPayload ( ) . toJavaScript ( ) ,
208+ payload : m . getPayload ( ) . toJavaScript ( ) as T ,
205209 payloadType : m . getPayloadType ( ) ,
206210 leaseId : m . getLeaseId ( ) ,
207211 queue : this ,
@@ -214,11 +218,10 @@ export class Queue {
214218 }
215219}
216220
217- export class ReceivedTask implements Task {
218- id : string ;
221+ export class ReceivedTask <
222+ T extends Record < string , any > = Record < string , any >
223+ > extends NitricTask < T > {
219224 leaseId : string ;
220- payloadType ?: string ;
221- payload ?: Record < string , any > ;
222225 queue : Queue ;
223226
224227 constructor ( {
@@ -227,11 +230,15 @@ export class ReceivedTask implements Task {
227230 payload,
228231 payloadType,
229232 queue,
230- } : Task & { id : string ; leaseId : string ; queue : Queue } ) {
231- this . id = id ;
233+ } : {
234+ id : string ;
235+ payload : T ;
236+ payloadType : string ;
237+ leaseId : string ;
238+ queue : Queue ;
239+ } ) {
240+ super ( { id, payloadType, payload } ) ;
232241 this . leaseId = leaseId ;
233- this . payloadType = payloadType ;
234- this . payload = payload ;
235242 this . queue = queue ;
236243 }
237244
0 commit comments