@amqp-contract/contract 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -4
- package/dist/index.cjs +29 -0
- package/dist/index.d.cts +274 -25
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +274 -25
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +29 -0
- package/dist/index.mjs.map +1 -1
- package/docs/index.md +222 -60
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -43,21 +43,30 @@ const orderCreatedEvent = definePublisherFirst(
|
|
|
43
43
|
const orderQueue = defineQueue('order-processing', { durable: true });
|
|
44
44
|
const { consumer, binding } = orderCreatedEvent.createConsumer(orderQueue);
|
|
45
45
|
|
|
46
|
+
// For topic exchanges, consumers can override with their own pattern
|
|
47
|
+
const analyticsQueue = defineQueue('analytics', { durable: true });
|
|
48
|
+
const { consumer: analyticsConsumer, binding: analyticsBinding } =
|
|
49
|
+
orderCreatedEvent.createConsumer(analyticsQueue, 'order.*'); // Subscribe to all order events
|
|
50
|
+
|
|
46
51
|
const contract = defineContract({
|
|
47
52
|
exchanges: { orders: ordersExchange },
|
|
48
|
-
queues: { orderQueue },
|
|
49
|
-
bindings: { orderBinding: binding },
|
|
53
|
+
queues: { orderQueue, analyticsQueue },
|
|
54
|
+
bindings: { orderBinding: binding, analyticsBinding },
|
|
50
55
|
publishers: { orderCreated: orderCreatedEvent.publisher },
|
|
51
|
-
consumers: {
|
|
56
|
+
consumers: {
|
|
57
|
+
processOrder: consumer,
|
|
58
|
+
trackOrders: analyticsConsumer,
|
|
59
|
+
},
|
|
52
60
|
});
|
|
53
61
|
```
|
|
54
62
|
|
|
55
63
|
**Benefits:**
|
|
56
64
|
|
|
57
65
|
- ✅ Guaranteed message schema consistency between publishers and consumers
|
|
58
|
-
- ✅
|
|
66
|
+
- ✅ Routing key validation and type safety
|
|
59
67
|
- ✅ Full type safety with TypeScript inference
|
|
60
68
|
- ✅ Event-oriented (publisher-first) and command-oriented (consumer-first) patterns
|
|
69
|
+
- ✅ Flexible routing key patterns for topic exchanges
|
|
61
70
|
|
|
62
71
|
## Documentation
|
|
63
72
|
|
package/dist/index.cjs
CHANGED
|
@@ -311,6 +311,22 @@ function callDefineQueueBinding(queue, exchange, options) {
|
|
|
311
311
|
*/
|
|
312
312
|
function definePublisherFirst(exchange, message, options) {
|
|
313
313
|
const publisher = callDefinePublisher(exchange, message, options);
|
|
314
|
+
if (exchange.type === "topic") {
|
|
315
|
+
const createConsumer$1 = (queue, routingKey) => {
|
|
316
|
+
const binding = callDefineQueueBinding(queue, exchange, routingKey ? {
|
|
317
|
+
...options,
|
|
318
|
+
routingKey
|
|
319
|
+
} : options);
|
|
320
|
+
return {
|
|
321
|
+
consumer: defineConsumer(queue, message),
|
|
322
|
+
binding
|
|
323
|
+
};
|
|
324
|
+
};
|
|
325
|
+
return {
|
|
326
|
+
publisher,
|
|
327
|
+
createConsumer: createConsumer$1
|
|
328
|
+
};
|
|
329
|
+
}
|
|
314
330
|
const createConsumer = (queue) => {
|
|
315
331
|
const binding = callDefineQueueBinding(queue, exchange, options);
|
|
316
332
|
return {
|
|
@@ -330,6 +346,19 @@ function definePublisherFirst(exchange, message, options) {
|
|
|
330
346
|
function defineConsumerFirst(queue, exchange, message, options) {
|
|
331
347
|
const consumer = defineConsumer(queue, message);
|
|
332
348
|
const binding = callDefineQueueBinding(queue, exchange, options);
|
|
349
|
+
if (exchange.type === "topic") {
|
|
350
|
+
const createPublisher$1 = (routingKey) => {
|
|
351
|
+
return callDefinePublisher(exchange, message, {
|
|
352
|
+
...options,
|
|
353
|
+
routingKey
|
|
354
|
+
});
|
|
355
|
+
};
|
|
356
|
+
return {
|
|
357
|
+
consumer,
|
|
358
|
+
binding,
|
|
359
|
+
createPublisher: createPublisher$1
|
|
360
|
+
};
|
|
361
|
+
}
|
|
333
362
|
const createPublisher = () => {
|
|
334
363
|
return callDefinePublisher(exchange, message, options);
|
|
335
364
|
};
|
package/dist/index.d.cts
CHANGED
|
@@ -856,7 +856,7 @@ declare function defineConsumer<TMessage extends MessageDefinition>(queue: Queue
|
|
|
856
856
|
*/
|
|
857
857
|
declare function defineContract<TContract extends ContractDefinition>(definition: TContract): TContract;
|
|
858
858
|
/**
|
|
859
|
-
* Publisher-first builder result.
|
|
859
|
+
* Publisher-first builder result for fanout and direct exchanges.
|
|
860
860
|
*
|
|
861
861
|
* This type represents a publisher and provides a method to create
|
|
862
862
|
* a consumer that uses the same message schema with a binding to the exchange.
|
|
@@ -883,6 +883,108 @@ type PublisherFirstResult<TMessage extends MessageDefinition, TPublisher extends
|
|
|
883
883
|
binding: QueueBindingDefinition;
|
|
884
884
|
};
|
|
885
885
|
};
|
|
886
|
+
/**
|
|
887
|
+
* Type-safe routing key that validates basic format.
|
|
888
|
+
*
|
|
889
|
+
* Validates that a routing key follows basic AMQP routing key rules:
|
|
890
|
+
* - Must not contain wildcards (* or #)
|
|
891
|
+
* - Must not be empty
|
|
892
|
+
* - Should contain alphanumeric characters, dots, hyphens, and underscores
|
|
893
|
+
*
|
|
894
|
+
* Note: Full character-by-character validation is not performed to avoid TypeScript
|
|
895
|
+
* recursion depth limits. Runtime validation is still recommended.
|
|
896
|
+
*
|
|
897
|
+
* @public
|
|
898
|
+
* @template S - The routing key string to validate
|
|
899
|
+
* @example
|
|
900
|
+
* ```typescript
|
|
901
|
+
* type Valid = RoutingKey<"order.created">; // "order.created"
|
|
902
|
+
* type Invalid = RoutingKey<"order.*">; // never (contains wildcard)
|
|
903
|
+
* type Invalid2 = RoutingKey<"">; // never (empty string)
|
|
904
|
+
* ```
|
|
905
|
+
*/
|
|
906
|
+
type RoutingKey<S extends string> = S extends "" ? never : S extends `${string}*${string}` | `${string}#${string}` ? never : S;
|
|
907
|
+
/**
|
|
908
|
+
* Type-safe binding pattern that validates basic format and wildcards.
|
|
909
|
+
*
|
|
910
|
+
* Validates that a binding pattern follows basic AMQP binding pattern rules:
|
|
911
|
+
* - Can contain wildcards (* for one word, # for zero or more words)
|
|
912
|
+
* - Must not be empty
|
|
913
|
+
* - Should contain alphanumeric characters, dots, hyphens, underscores, and wildcards
|
|
914
|
+
*
|
|
915
|
+
* Note: Full character-by-character validation is not performed to avoid TypeScript
|
|
916
|
+
* recursion depth limits. Runtime validation is still recommended.
|
|
917
|
+
*
|
|
918
|
+
* @public
|
|
919
|
+
* @template S - The binding pattern string to validate
|
|
920
|
+
* @example
|
|
921
|
+
* ```typescript
|
|
922
|
+
* type ValidPattern = BindingPattern<"order.*">; // "order.*"
|
|
923
|
+
* type ValidHash = BindingPattern<"order.#">; // "order.#"
|
|
924
|
+
* type ValidConcrete = BindingPattern<"order.created">; // "order.created"
|
|
925
|
+
* type Invalid = BindingPattern<"">; // never (empty string)
|
|
926
|
+
* ```
|
|
927
|
+
*/
|
|
928
|
+
type BindingPattern<S extends string> = S extends "" ? never : S;
|
|
929
|
+
/**
|
|
930
|
+
* Helper type for pattern matching with # in the middle
|
|
931
|
+
* Handles backtracking to match # with zero or more segments
|
|
932
|
+
* @internal
|
|
933
|
+
*/
|
|
934
|
+
type MatchesAfterHash<Key extends string, PatternRest$1 extends string> = MatchesPattern<Key, PatternRest$1> extends true ? true : Key extends `${string}.${infer KeyRest}` ? MatchesAfterHash<KeyRest, PatternRest$1> : false;
|
|
935
|
+
/**
|
|
936
|
+
* Check if a routing key matches a binding pattern
|
|
937
|
+
* Implements AMQP topic exchange pattern matching:
|
|
938
|
+
* - * matches exactly one word
|
|
939
|
+
* - # matches zero or more words
|
|
940
|
+
* @internal
|
|
941
|
+
*/
|
|
942
|
+
type MatchesPattern<Key extends string, Pattern extends string> = Pattern extends `${infer PatternPart}.${infer PatternRest}` ? PatternPart extends "#" ? MatchesAfterHash<Key, PatternRest> : Key extends `${infer KeyPart}.${infer KeyRest}` ? PatternPart extends "*" ? MatchesPattern<KeyRest, PatternRest> : PatternPart extends KeyPart ? MatchesPattern<KeyRest, PatternRest> : false : false : Pattern extends "#" ? true : Pattern extends "*" ? Key extends `${string}.${string}` ? false : true : Pattern extends Key ? true : false;
|
|
943
|
+
/**
|
|
944
|
+
* Validate that a routing key matches a binding pattern.
|
|
945
|
+
*
|
|
946
|
+
* This is a utility type provided for users who want compile-time validation
|
|
947
|
+
* that a routing key matches a specific pattern. It's not enforced internally
|
|
948
|
+
* in the API to avoid TypeScript recursion depth issues with complex routing keys.
|
|
949
|
+
*
|
|
950
|
+
* Returns the routing key if it's valid and matches the pattern, `never` otherwise.
|
|
951
|
+
*
|
|
952
|
+
* @example
|
|
953
|
+
* ```typescript
|
|
954
|
+
* type ValidKey = MatchingRoutingKey<"order.*", "order.created">; // "order.created"
|
|
955
|
+
* type InvalidKey = MatchingRoutingKey<"order.*", "user.created">; // never
|
|
956
|
+
* ```
|
|
957
|
+
*
|
|
958
|
+
* @template Pattern - The binding pattern (can contain * and # wildcards)
|
|
959
|
+
* @template Key - The routing key to validate
|
|
960
|
+
*/
|
|
961
|
+
type MatchingRoutingKey<Pattern extends string, Key extends string> = RoutingKey<Key> extends never ? never : BindingPattern<Pattern> extends never ? never : MatchesPattern<Key, Pattern> extends true ? Key : never;
|
|
962
|
+
/**
|
|
963
|
+
* Publisher-first builder result for topic exchanges.
|
|
964
|
+
*
|
|
965
|
+
* This type represents a publisher with a concrete routing key and provides a method
|
|
966
|
+
* to create consumers that can use routing key patterns matching the publisher's key.
|
|
967
|
+
*
|
|
968
|
+
* @template TMessage - The message definition
|
|
969
|
+
* @template TPublisher - The publisher definition
|
|
970
|
+
* @template TRoutingKey - The literal routing key type from the publisher (for documentation purposes)
|
|
971
|
+
*/
|
|
972
|
+
type PublisherFirstResultWithRoutingKey<TMessage extends MessageDefinition, TPublisher extends PublisherDefinition<TMessage>, TRoutingKey extends string> = {
|
|
973
|
+
/** The publisher definition */
|
|
974
|
+
publisher: TPublisher;
|
|
975
|
+
/**
|
|
976
|
+
* Create a consumer that receives messages from this publisher.
|
|
977
|
+
* For topic exchanges, the routing key pattern can be specified for the binding.
|
|
978
|
+
*
|
|
979
|
+
* @param queue - The queue that will consume the messages
|
|
980
|
+
* @param routingKey - Optional routing key pattern for the binding (defaults to publisher's routing key)
|
|
981
|
+
* @returns An object with the consumer definition and binding
|
|
982
|
+
*/
|
|
983
|
+
createConsumer: <TConsumerRoutingKey extends string = TRoutingKey>(queue: QueueDefinition, routingKey?: BindingPattern<TConsumerRoutingKey>) => {
|
|
984
|
+
consumer: ConsumerDefinition<TMessage>;
|
|
985
|
+
binding: QueueBindingDefinition;
|
|
986
|
+
};
|
|
987
|
+
};
|
|
886
988
|
/**
|
|
887
989
|
* Define a publisher-first relationship for event-oriented messaging.
|
|
888
990
|
*
|
|
@@ -942,7 +1044,7 @@ declare function definePublisherFirst<TMessage extends MessageDefinition>(exchan
|
|
|
942
1044
|
exchange: FanoutExchangeDefinition;
|
|
943
1045
|
}>>;
|
|
944
1046
|
/**
|
|
945
|
-
* Define a publisher-first relationship for event-oriented messaging.
|
|
1047
|
+
* Define a publisher-first relationship for event-oriented messaging with direct exchange.
|
|
946
1048
|
*
|
|
947
1049
|
* This builder enforces consistency by:
|
|
948
1050
|
* 1. Ensuring the publisher and consumer use the same message schema
|
|
@@ -951,7 +1053,7 @@ declare function definePublisherFirst<TMessage extends MessageDefinition>(exchan
|
|
|
951
1053
|
* Use this pattern for events where publishers don't need to know about queues.
|
|
952
1054
|
* Multiple consumers can be created for different queues, all using the same message schema.
|
|
953
1055
|
*
|
|
954
|
-
* @param exchange - The exchange to publish to (direct
|
|
1056
|
+
* @param exchange - The exchange to publish to (direct type)
|
|
955
1057
|
* @param message - The message definition (schema and metadata)
|
|
956
1058
|
* @param options - Binding configuration (routingKey is required)
|
|
957
1059
|
* @param options.routingKey - The routing key for message routing
|
|
@@ -961,6 +1063,61 @@ declare function definePublisherFirst<TMessage extends MessageDefinition>(exchan
|
|
|
961
1063
|
* ```typescript
|
|
962
1064
|
* import { z } from 'zod';
|
|
963
1065
|
*
|
|
1066
|
+
* const tasksExchange = defineExchange('tasks', 'direct', { durable: true });
|
|
1067
|
+
* const taskMessage = defineMessage(
|
|
1068
|
+
* z.object({
|
|
1069
|
+
* taskId: z.string(),
|
|
1070
|
+
* payload: z.record(z.unknown()),
|
|
1071
|
+
* })
|
|
1072
|
+
* );
|
|
1073
|
+
*
|
|
1074
|
+
* // Create publisher-first relationship with routing key
|
|
1075
|
+
* const taskEvent = definePublisherFirst(
|
|
1076
|
+
* tasksExchange,
|
|
1077
|
+
* taskMessage,
|
|
1078
|
+
* { routingKey: 'task.execute' }
|
|
1079
|
+
* );
|
|
1080
|
+
*
|
|
1081
|
+
* // Use in contract - routing key is consistent across publisher and bindings
|
|
1082
|
+
* const taskQueue = defineQueue('task-queue', { durable: true });
|
|
1083
|
+
* const { consumer, binding } = taskEvent.createConsumer(taskQueue);
|
|
1084
|
+
*
|
|
1085
|
+
* const contract = defineContract({
|
|
1086
|
+
* exchanges: { tasks: tasksExchange },
|
|
1087
|
+
* queues: { taskQueue },
|
|
1088
|
+
* bindings: { taskBinding: binding },
|
|
1089
|
+
* publishers: { executeTask: taskEvent.publisher },
|
|
1090
|
+
* consumers: { processTask: consumer },
|
|
1091
|
+
* });
|
|
1092
|
+
* ```
|
|
1093
|
+
*/
|
|
1094
|
+
declare function definePublisherFirst<TMessage extends MessageDefinition, TRoutingKey extends string>(exchange: DirectExchangeDefinition, message: TMessage, options: {
|
|
1095
|
+
routingKey: RoutingKey<TRoutingKey>;
|
|
1096
|
+
arguments?: Record<string, unknown>;
|
|
1097
|
+
}): PublisherFirstResult<TMessage, Extract<PublisherDefinition<TMessage>, {
|
|
1098
|
+
exchange: DirectExchangeDefinition | TopicExchangeDefinition;
|
|
1099
|
+
}>>;
|
|
1100
|
+
/**
|
|
1101
|
+
* Define a publisher-first relationship for event-oriented messaging with topic exchange.
|
|
1102
|
+
*
|
|
1103
|
+
* This builder enforces consistency by:
|
|
1104
|
+
* 1. Ensuring the publisher and consumer use the same message schema
|
|
1105
|
+
* 2. The publisher uses a concrete routing key (e.g., 'order.created')
|
|
1106
|
+
* 3. Consumers can optionally specify routing key patterns (e.g., 'order.*') or use the default
|
|
1107
|
+
*
|
|
1108
|
+
* Use this pattern for events where publishers emit with specific routing keys,
|
|
1109
|
+
* and consumers can subscribe with patterns. This is less common than the consumer-first pattern.
|
|
1110
|
+
*
|
|
1111
|
+
* @param exchange - The exchange to publish to (topic type)
|
|
1112
|
+
* @param message - The message definition (schema and metadata)
|
|
1113
|
+
* @param options - Binding configuration (routingKey is required)
|
|
1114
|
+
* @param options.routingKey - The concrete routing key for the publisher
|
|
1115
|
+
* @returns A publisher-first result with publisher and consumer factory that accepts optional routing key patterns
|
|
1116
|
+
*
|
|
1117
|
+
* @example
|
|
1118
|
+
* ```typescript
|
|
1119
|
+
* import { z } from 'zod';
|
|
1120
|
+
*
|
|
964
1121
|
* const ordersExchange = defineExchange('orders', 'topic', { durable: true });
|
|
965
1122
|
* const orderMessage = defineMessage(
|
|
966
1123
|
* z.object({
|
|
@@ -969,43 +1126,46 @@ declare function definePublisherFirst<TMessage extends MessageDefinition>(exchan
|
|
|
969
1126
|
* })
|
|
970
1127
|
* );
|
|
971
1128
|
*
|
|
972
|
-
* // Create publisher-first relationship with routing key
|
|
1129
|
+
* // Create publisher-first relationship with concrete routing key
|
|
973
1130
|
* const orderCreatedEvent = definePublisherFirst(
|
|
974
1131
|
* ordersExchange,
|
|
975
1132
|
* orderMessage,
|
|
976
|
-
* { routingKey: 'order.created' }
|
|
1133
|
+
* { routingKey: 'order.created' } // Concrete key
|
|
977
1134
|
* );
|
|
978
1135
|
*
|
|
979
|
-
* //
|
|
1136
|
+
* // Consumers can use patterns or specific keys
|
|
980
1137
|
* const orderQueue = defineQueue('order-processing', { durable: true });
|
|
981
|
-
* const
|
|
1138
|
+
* const allOrdersQueue = defineQueue('all-orders', { durable: true });
|
|
982
1139
|
*
|
|
983
|
-
* // Use in contract
|
|
984
|
-
* const { consumer: processConsumer, binding: processBinding } =
|
|
985
|
-
*
|
|
1140
|
+
* // Use in contract
|
|
1141
|
+
* const { consumer: processConsumer, binding: processBinding } =
|
|
1142
|
+
* orderCreatedEvent.createConsumer(orderQueue); // Uses 'order.created'
|
|
1143
|
+
* const { consumer: allOrdersConsumer, binding: allOrdersBinding } =
|
|
1144
|
+
* orderCreatedEvent.createConsumer(allOrdersQueue, 'order.*'); // Uses pattern
|
|
986
1145
|
*
|
|
987
1146
|
* const contract = defineContract({
|
|
988
1147
|
* exchanges: { orders: ordersExchange },
|
|
989
|
-
* queues: { orderQueue,
|
|
1148
|
+
* queues: { orderQueue, allOrdersQueue },
|
|
990
1149
|
* bindings: {
|
|
991
1150
|
* orderBinding: processBinding,
|
|
992
|
-
*
|
|
1151
|
+
* allOrdersBinding,
|
|
993
1152
|
* },
|
|
994
1153
|
* publishers: { orderCreated: orderCreatedEvent.publisher },
|
|
995
1154
|
* consumers: {
|
|
996
1155
|
* processOrder: processConsumer,
|
|
997
|
-
*
|
|
1156
|
+
* trackAllOrders: allOrdersConsumer,
|
|
998
1157
|
* },
|
|
999
1158
|
* });
|
|
1000
1159
|
* ```
|
|
1001
1160
|
*/
|
|
1002
|
-
declare function definePublisherFirst<TMessage extends MessageDefinition>(exchange:
|
|
1003
|
-
|
|
1004
|
-
|
|
1161
|
+
declare function definePublisherFirst<TMessage extends MessageDefinition, TRoutingKey extends string>(exchange: TopicExchangeDefinition, message: TMessage, options: {
|
|
1162
|
+
routingKey: RoutingKey<TRoutingKey>;
|
|
1163
|
+
arguments?: Record<string, unknown>;
|
|
1164
|
+
}): PublisherFirstResultWithRoutingKey<TMessage, Extract<PublisherDefinition<TMessage>, {
|
|
1005
1165
|
exchange: DirectExchangeDefinition | TopicExchangeDefinition;
|
|
1006
|
-
}
|
|
1166
|
+
}>, TRoutingKey>;
|
|
1007
1167
|
/**
|
|
1008
|
-
* Consumer-first builder result.
|
|
1168
|
+
* Consumer-first builder result for fanout and direct exchanges.
|
|
1009
1169
|
*
|
|
1010
1170
|
* This type represents a consumer with its binding and provides a method to create
|
|
1011
1171
|
* a publisher that uses the same message schema and routing key.
|
|
@@ -1025,7 +1185,37 @@ type ConsumerFirstResult<TMessage extends MessageDefinition, TConsumer extends C
|
|
|
1025
1185
|
*
|
|
1026
1186
|
* @returns A publisher definition with the same message type and routing key
|
|
1027
1187
|
*/
|
|
1028
|
-
createPublisher: () => PublisherDefinition<TMessage
|
|
1188
|
+
createPublisher: () => TBinding["exchange"] extends FanoutExchangeDefinition ? Extract<PublisherDefinition<TMessage>, {
|
|
1189
|
+
exchange: FanoutExchangeDefinition;
|
|
1190
|
+
}> : Extract<PublisherDefinition<TMessage>, {
|
|
1191
|
+
exchange: DirectExchangeDefinition | TopicExchangeDefinition;
|
|
1192
|
+
}>;
|
|
1193
|
+
};
|
|
1194
|
+
/**
|
|
1195
|
+
* Consumer-first builder result for topic exchanges.
|
|
1196
|
+
*
|
|
1197
|
+
* This type represents a consumer with its binding (which may use a pattern) and provides
|
|
1198
|
+
* a method to create a publisher with a concrete routing key that matches the pattern.
|
|
1199
|
+
*
|
|
1200
|
+
* @template TMessage - The message definition
|
|
1201
|
+
* @template TConsumer - The consumer definition
|
|
1202
|
+
* @template TBinding - The queue binding definition
|
|
1203
|
+
*/
|
|
1204
|
+
type ConsumerFirstResultWithRoutingKey<TMessage extends MessageDefinition, TConsumer extends ConsumerDefinition<TMessage>, TBinding extends QueueBindingDefinition> = {
|
|
1205
|
+
/** The consumer definition */
|
|
1206
|
+
consumer: TConsumer;
|
|
1207
|
+
/** The binding definition connecting the exchange to the queue */
|
|
1208
|
+
binding: TBinding;
|
|
1209
|
+
/**
|
|
1210
|
+
* Create a publisher that sends messages to this consumer.
|
|
1211
|
+
* For topic exchanges, the routing key can be specified to match the binding pattern.
|
|
1212
|
+
*
|
|
1213
|
+
* @param routingKey - The concrete routing key that matches the binding pattern
|
|
1214
|
+
* @returns A publisher definition with the specified routing key
|
|
1215
|
+
*/
|
|
1216
|
+
createPublisher: <TPublisherRoutingKey extends string>(routingKey: RoutingKey<TPublisherRoutingKey>) => Extract<PublisherDefinition<TMessage>, {
|
|
1217
|
+
exchange: DirectExchangeDefinition | TopicExchangeDefinition;
|
|
1218
|
+
}>;
|
|
1029
1219
|
};
|
|
1030
1220
|
/**
|
|
1031
1221
|
* Define a consumer-first relationship between a consumer and publisher.
|
|
@@ -1091,7 +1281,7 @@ declare function defineConsumerFirst<TMessage extends MessageDefinition>(queue:
|
|
|
1091
1281
|
* send messages with the correct type and routing key.
|
|
1092
1282
|
*
|
|
1093
1283
|
* @param queue - The queue to consume from
|
|
1094
|
-
* @param exchange - The exchange that routes to the queue (direct
|
|
1284
|
+
* @param exchange - The exchange that routes to the queue (direct type)
|
|
1095
1285
|
* @param message - The message definition (schema and metadata)
|
|
1096
1286
|
* @param options - Binding configuration (routingKey is required)
|
|
1097
1287
|
* @param options.routingKey - The routing key for message routing
|
|
@@ -1128,11 +1318,70 @@ declare function defineConsumerFirst<TMessage extends MessageDefinition>(queue:
|
|
|
1128
1318
|
* });
|
|
1129
1319
|
* ```
|
|
1130
1320
|
*/
|
|
1131
|
-
declare function defineConsumerFirst<TMessage extends MessageDefinition>(queue: QueueDefinition, exchange: DirectExchangeDefinition
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1321
|
+
declare function defineConsumerFirst<TMessage extends MessageDefinition, TRoutingKey extends string>(queue: QueueDefinition, exchange: DirectExchangeDefinition, message: TMessage, options: {
|
|
1322
|
+
routingKey: RoutingKey<TRoutingKey>;
|
|
1323
|
+
arguments?: Record<string, unknown>;
|
|
1324
|
+
}): ConsumerFirstResult<TMessage, ConsumerDefinition<TMessage>, Extract<QueueBindingDefinition, {
|
|
1325
|
+
exchange: DirectExchangeDefinition;
|
|
1326
|
+
}>>;
|
|
1327
|
+
/**
|
|
1328
|
+
* Define a consumer-first relationship between a consumer and publisher with topic exchange.
|
|
1329
|
+
*
|
|
1330
|
+
* This builder enforces consistency by:
|
|
1331
|
+
* 1. Ensuring the consumer and publisher use the same message schema
|
|
1332
|
+
* 2. The binding uses a routing key pattern (e.g., 'order.*')
|
|
1333
|
+
* 3. The publisher factory accepts a concrete routing key that matches the pattern (e.g., 'order.created')
|
|
1334
|
+
*
|
|
1335
|
+
* Use this when you want to start with a consumer that uses a routing key pattern,
|
|
1336
|
+
* and allow publishers to specify concrete routing keys that match that pattern.
|
|
1337
|
+
*
|
|
1338
|
+
* @param queue - The queue to consume from
|
|
1339
|
+
* @param exchange - The exchange that routes to the queue (topic type)
|
|
1340
|
+
* @param message - The message definition (schema and metadata)
|
|
1341
|
+
* @param options - Binding configuration (routingKey is required)
|
|
1342
|
+
* @param options.routingKey - The routing key pattern for the binding (can use wildcards)
|
|
1343
|
+
* @returns A consumer-first result with consumer, binding, and publisher factory that accepts a routing key
|
|
1344
|
+
*
|
|
1345
|
+
* @example
|
|
1346
|
+
* ```typescript
|
|
1347
|
+
* import { z } from 'zod';
|
|
1348
|
+
*
|
|
1349
|
+
* const orderQueue = defineQueue('order-processing', { durable: true });
|
|
1350
|
+
* const ordersExchange = defineExchange('orders', 'topic', { durable: true });
|
|
1351
|
+
* const orderMessage = defineMessage(
|
|
1352
|
+
* z.object({
|
|
1353
|
+
* orderId: z.string(),
|
|
1354
|
+
* amount: z.number(),
|
|
1355
|
+
* })
|
|
1356
|
+
* );
|
|
1357
|
+
*
|
|
1358
|
+
* // Create consumer-first relationship with pattern
|
|
1359
|
+
* const orderConsumerFirst = defineConsumerFirst(
|
|
1360
|
+
* orderQueue,
|
|
1361
|
+
* ordersExchange,
|
|
1362
|
+
* orderMessage,
|
|
1363
|
+
* { routingKey: 'order.*' } // Pattern in binding
|
|
1364
|
+
* );
|
|
1365
|
+
*
|
|
1366
|
+
* // Use in contract - publisher can specify concrete routing key
|
|
1367
|
+
* const contract = defineContract({
|
|
1368
|
+
* exchanges: { orders: ordersExchange },
|
|
1369
|
+
* queues: { orderQueue },
|
|
1370
|
+
* bindings: { orderBinding: orderConsumerFirst.binding },
|
|
1371
|
+
* publishers: {
|
|
1372
|
+
* orderCreated: orderConsumerFirst.createPublisher('order.created'), // Concrete key
|
|
1373
|
+
* orderUpdated: orderConsumerFirst.createPublisher('order.updated'), // Concrete key
|
|
1374
|
+
* },
|
|
1375
|
+
* consumers: { processOrder: orderConsumerFirst.consumer },
|
|
1376
|
+
* });
|
|
1377
|
+
* ```
|
|
1378
|
+
*/
|
|
1379
|
+
declare function defineConsumerFirst<TMessage extends MessageDefinition, TRoutingKey extends string>(queue: QueueDefinition, exchange: TopicExchangeDefinition, message: TMessage, options: {
|
|
1380
|
+
routingKey: BindingPattern<TRoutingKey>;
|
|
1381
|
+
arguments?: Record<string, unknown>;
|
|
1382
|
+
}): ConsumerFirstResultWithRoutingKey<TMessage, ConsumerDefinition<TMessage>, Extract<QueueBindingDefinition, {
|
|
1383
|
+
exchange: TopicExchangeDefinition;
|
|
1135
1384
|
}>>;
|
|
1136
1385
|
//#endregion
|
|
1137
|
-
export { type AnySchema, type BaseExchangeDefinition, type BindingDefinition, type ConsumerDefinition, type ConsumerFirstResult, type ContractDefinition, type DirectExchangeDefinition, type ExchangeBindingDefinition, type ExchangeDefinition, type FanoutExchangeDefinition, type InferConsumerNames, type InferPublisherNames, type MessageDefinition, type PublisherDefinition, type PublisherFirstResult, type QueueBindingDefinition, type QueueDefinition, type TopicExchangeDefinition, defineConsumer, defineConsumerFirst, defineContract, defineExchange, defineExchangeBinding, defineMessage, definePublisher, definePublisherFirst, defineQueue, defineQueueBinding };
|
|
1386
|
+
export { type AnySchema, type BaseExchangeDefinition, type BindingDefinition, type BindingPattern, type ConsumerDefinition, type ConsumerFirstResult, type ConsumerFirstResultWithRoutingKey, type ContractDefinition, type DirectExchangeDefinition, type ExchangeBindingDefinition, type ExchangeDefinition, type FanoutExchangeDefinition, type InferConsumerNames, type InferPublisherNames, type MatchingRoutingKey, type MessageDefinition, type PublisherDefinition, type PublisherFirstResult, type PublisherFirstResultWithRoutingKey, type QueueBindingDefinition, type QueueDefinition, type RoutingKey, type TopicExchangeDefinition, defineConsumer, defineConsumerFirst, defineContract, defineExchange, defineExchangeBinding, defineMessage, definePublisher, definePublisherFirst, defineQueue, defineQueueBinding };
|
|
1138
1387
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/builder.ts"],"sourcesContent":[],"mappings":";;;;;;AAWA;AAQA;AA6CA;AAiBA;AAqBA;AASA;;AAEI,KAtGQ,SAAA,GAAY,gBAsGpB;;;AASJ;AAuDA;;;AAEoC,KAhKxB,sBAAA,GAgKwB;EAAjB;;;EAYC,IAAA,EAAA,MAAA;EAsBR;;;;EAe+B,OAAA,CAAA,EAAA,OAAA;EAU3B;;AAuBhB;;EAUc,UAAA,CAAA,EAAA,OAAA;EAIA;;;;AAsBd;EAmBY,QAAA,CAAA,EAAA,OAAA;EAAqC;;;;EAMN,SAAA,CAAA,EAlR7B,MAkR6B,CAAA,MAAA,EAAA,OAAA,CAAA;CAS3B;;AAsBhB;;;;;;AAyCA;;;;;;AAiBa,KA3VD,wBAAA,GAA2B,sBA2V1B,GAAA;EAOiB,IAAA,EAAA,QAAA;CAAf;;;;AAyBf;;;;;;AAkBA;;;;AACiE,KA7XrD,wBAAA,GAA2B,sBA6X0B,GAAA;EAAS,IAAA,EAAA,QAAA;;;;ACxa1E;;;;;AA4BA;;;;;AA6BA;;;;;AAwDgB,KDjDJ,uBAAA,GAA0B,sBCiDX,GAAA;EAEV,IAAA,EAAA,OAAA;CAAL;;;AA2CZ;;;AAEmB,KDvFP,kBAAA,GACR,wBCsFe,GDrFf,wBCqFe,GDpFf,uBCoFe;;;;;;;AAmCH,KD/GJ,eAAA,GC+GsB;EACzB;;;EAGuC,IAAA,EAAA,MAAA;EAA5C;;;;EAGD,OAAA,CAAA,EAAA,OAAA;EAAO;AAoCV;;;;EAKM,SAAA,CAAA,EAAA,OAAA;EACY;;;;EAKhB,UAAA,CAAA,EAAA,OAAA;EACY;;;;AA6Dd;;;;;;;;;;;AAiCA;;;;;;EAM2C,SAAA,CAAA,ED5N7B,MC4N6B,CAAA,MAAA,EAAA,OAAA,CAAA;CAFvC;;;;;;;AA6EY,KD9RJ,iBC8RmB,CAAA,iBD7RZ,SC6RY,GD7RA,SC6RA,EAAA,iBD5RZ,gBC4RY,CD5RK,MC4RL,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,GAAA,SAAA,GAAA,SAAA,CAAA,GAAA;EAAkB;;;;EAIrC,OAAA,ED1RD,QC0RC;EAA2C;;;;EAG5C,OAAA,CAAA,EDvRC,QCuRD;EAA2C;;;AAqCtD;EAAiD,OAAA,CAAA,EAAA,MAAA;EACrC;;;;EAIN,WAAA,CAAA,EAAA,MAAA;CACY;;;;;;;;AAIf,KDhTS,sBAAA,GCgTT;EAAO;EA6EM,IAAA,EAAA,OAAA;EAAgC;EACvC,KAAA,EDzXA,eCyXA;EACE;;;;EAEW,SAAA,CAAA,EDtXR,MCsXQ,CAAA,MAAA,EAAA,OAAA,CAAA;CAAnB,GAAA,CAAA;EAAkB;EA6EL,QAAA,ED/bA,wBC+bc,GD/ba,uBC+bb;EAAmB;;;;AA0DjD;EACmB,UAAA,EAAA,MAAA;CACsB,GAAA;EAApB;EAGR,QAAA,EDpfG,wBCofH;EASa;EACO,UAAA,CAAA,EAAA,KAAA;CAAnB,CAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/builder.ts"],"sourcesContent":[],"mappings":"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"}
|