Skip to content

Commit b86d454

Browse files
authored
Switch to awilix 13 (#424)
1 parent c98a004 commit b86d454

18 files changed

Lines changed: 218 additions & 218 deletions

docker-compose.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ services:
88
volumes:
99
- rabbit_data:/var/lib/rabbitmq
1010
restart: on-failure
11+
healthcheck:
12+
test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
13+
interval: 5s
14+
timeout: 5s
15+
retries: 10
16+
start_period: 10s
1117

1218
redis:
1319
image: redis:6.2.7-alpine

packages/amqp/lib/AbstractAmqpConsumer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ export abstract class AbstractAmqpConsumer<
306306
}
307307

308308
// Empty content for whatever reason
309-
if (!resolveMessageResult.result || !resolveMessageResult.result.body) {
309+
if (!resolveMessageResult.result?.body) {
310310
return ABORT_EARLY_EITHER
311311
}
312312

@@ -347,7 +347,7 @@ export abstract class AbstractAmqpConsumer<
347347
const resolvedMessage = resolveMessageResult.result
348348

349349
// Empty content for whatever reason
350-
if (!resolvedMessage || !resolvedMessage.body) return ABORT_EARLY_EITHER
350+
if (!resolvedMessage?.body) return ABORT_EARLY_EITHER
351351

352352
// @ts-expect-error
353353
if (this.messageIdField in resolvedMessage.body) {

packages/amqp/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"test:coverage": "npm run test -- --coverage",
2424
"lint": "biome check . && tsc",
2525
"lint:fix": "biome check --write .",
26-
"docker:start": "docker compose up -d rabbitmq",
26+
"docker:start": "docker compose up -d --wait rabbitmq",
2727
"docker:stop": "docker compose down",
2828
"prepublishOnly": "npm run lint && npm run build"
2929
},
@@ -45,7 +45,7 @@
4545
"@types/node": "^25.0.2",
4646
"@vitest/coverage-v8": "^4.0.15",
4747
"amqplib": "^0.10.8",
48-
"awilix": "^12.0.5",
48+
"awilix": "^13.0.3",
4949
"awilix-manager": "^6.1.0",
5050
"rimraf": "^6.0.1",
5151
"typescript": "^5.9.3",

packages/amqp/test/utils/testContext.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ export async function registerDependencies(
9494
dependencyOverrides: DependencyOverrides = {},
9595
queuesEnabled = true,
9696
) {
97-
const diContainer = createContainer({
97+
const diContainer = createContainer<Dependencies>({
9898
injectionMode: 'PROXY',
9999
})
100100
const awilixManager = new AwilixManager({

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
"@types/node": "^25.0.2",
4545
"@types/tmp": "^0.2.6",
4646
"@vitest/coverage-v8": "^4.0.15",
47-
"awilix": "^12.0.5",
47+
"awilix": "^13.0.3",
4848
"awilix-manager": "^6.1.0",
4949
"rimraf": "^6.0.1",
5050
"typescript": "^5.9.2",

packages/core/test/testContext.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const TestEvents = {
4444
export type TestEventsType = (typeof TestEvents)[keyof typeof TestEvents][]
4545

4646
export async function registerDependencies(dependencyOverrides: DependencyOverrides = {}) {
47-
const diContainer = createContainer({
47+
const diContainer = createContainer<Dependencies>({
4848
injectionMode: 'PROXY',
4949
})
5050
const awilixManager = new AwilixManager({

packages/gcp-pubsub/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
"@message-queue-toolkit/schemas": "*",
4747
"@types/node": "^25.0.2",
4848
"@vitest/coverage-v8": "^4.0.15",
49-
"awilix": "^12.0.5",
49+
"awilix": "^13.0.3",
5050
"awilix-manager": "^6.1.0",
5151
"ioredis": "^5.7.0",
5252
"rimraf": "^6.0.1",

packages/gcp-pubsub/test/consumers/PubSubPermissionConsumer.deduplication.spec.ts

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -230,32 +230,30 @@ describe('PubSubPermissionConsumer - Deduplication', () => {
230230
expect(consumer.addCounter).toBe(1)
231231
})
232232

233-
it(
234-
'processes message when lock acquisition has non-timeout error',
235-
{ timeout: 15000 },
236-
async () => {
237-
const messageId = randomUUID()
238-
239-
// Mock acquireLock to simulate a non-timeout error (e.g., Redis connection error)
240-
// Non-timeout errors are swallowed and message is processed normally
241-
vi.spyOn(messageDeduplicationStore, 'acquireLock').mockResolvedValue({
242-
error: new Error('Redis connection error'),
243-
})
244-
245-
const message: PERMISSIONS_ADD_MESSAGE_TYPE = {
246-
id: messageId,
247-
messageType: 'add',
248-
timestamp: new Date().toISOString(),
249-
userIds: ['user1'],
250-
}
251-
252-
await publisher.publish(message)
253-
254-
// Message should be processed even though lock acquisition failed
255-
const result = await consumer.handlerSpy.waitForMessageWithId(messageId, 'consumed')
256-
expect(result.processingResult.status).toBe('consumed')
257-
expect(consumer.addCounter).toBe(1)
258-
},
259-
)
233+
it('processes message when lock acquisition has non-timeout error', {
234+
timeout: 15000,
235+
}, async () => {
236+
const messageId = randomUUID()
237+
238+
// Mock acquireLock to simulate a non-timeout error (e.g., Redis connection error)
239+
// Non-timeout errors are swallowed and message is processed normally
240+
vi.spyOn(messageDeduplicationStore, 'acquireLock').mockResolvedValue({
241+
error: new Error('Redis connection error'),
242+
})
243+
244+
const message: PERMISSIONS_ADD_MESSAGE_TYPE = {
245+
id: messageId,
246+
messageType: 'add',
247+
timestamp: new Date().toISOString(),
248+
userIds: ['user1'],
249+
}
250+
251+
await publisher.publish(message)
252+
253+
// Message should be processed even though lock acquisition failed
254+
const result = await consumer.handlerSpy.waitForMessageWithId(messageId, 'consumed')
255+
expect(result.processingResult.status).toBe('consumed')
256+
expect(consumer.addCounter).toBe(1)
257+
})
260258
})
261259
})

packages/gcp-pubsub/test/consumers/PubSubPermissionConsumer.payloadOffloading.spec.ts

Lines changed: 73 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -125,89 +125,85 @@ describe('PubSubPermissionConsumer - Payload Offloading', () => {
125125
expect(consumer.addCounter).toBe(1)
126126
})
127127

128-
it(
129-
'consumes offloaded message with array field and validates schema correctly',
130-
{ timeout: 10000 },
131-
async () => {
132-
// Create a large array of userIds to trigger offloading (need > 10MB)
133-
// Each userId needs to be ~1000 chars to make 10,500 items exceed 10MB
134-
const largeUserIdArray = Array.from(
135-
{ length: 10500 },
136-
(_, i) => `user-${i}-${'x'.repeat(1000)}`,
137-
)
128+
it('consumes offloaded message with array field and validates schema correctly', {
129+
timeout: 10000,
130+
}, async () => {
131+
// Create a large array of userIds to trigger offloading (need > 10MB)
132+
// Each userId needs to be ~1000 chars to make 10,500 items exceed 10MB
133+
const largeUserIdArray = Array.from(
134+
{ length: 10500 },
135+
(_, i) => `user-${i}-${'x'.repeat(1000)}`,
136+
)
138137

139-
const message = {
140-
id: 'large-array-message-1',
141-
messageType: 'add',
142-
timestamp: new Date().toISOString(),
143-
userIds: largeUserIdArray,
144-
} satisfies PERMISSIONS_ADD_MESSAGE_TYPE
138+
const message = {
139+
id: 'large-array-message-1',
140+
messageType: 'add',
141+
timestamp: new Date().toISOString(),
142+
userIds: largeUserIdArray,
143+
} satisfies PERMISSIONS_ADD_MESSAGE_TYPE
145144

146-
// Verify the message is large enough to trigger offloading
147-
expect(JSON.stringify(message).length).toBeGreaterThan(largeMessageSizeThreshold)
145+
// Verify the message is large enough to trigger offloading
146+
expect(JSON.stringify(message).length).toBeGreaterThan(largeMessageSizeThreshold)
148147

149-
await publisher.publish(message)
148+
await publisher.publish(message)
150149

151-
// Wait for the message to be consumed
152-
const consumptionResult = await consumer.handlerSpy.waitForMessageWithId(
153-
message.id,
154-
'consumed',
155-
)
150+
// Wait for the message to be consumed
151+
const consumptionResult = await consumer.handlerSpy.waitForMessageWithId(
152+
message.id,
153+
'consumed',
154+
)
156155

157-
// Verify the full payload was received including the large array
158-
expect(consumptionResult.message).toMatchObject({
159-
id: message.id,
160-
messageType: message.messageType,
161-
userIds: largeUserIdArray,
162-
})
163-
expect(consumptionResult.message.userIds).toHaveLength(largeUserIdArray.length)
164-
expect(consumer.addCounter).toBe(1)
165-
},
166-
)
167-
168-
it(
169-
'validates schema correctly after retrieving offloaded payload',
170-
{ timeout: 10000 },
171-
async () => {
172-
// Create a message with metadata that will be validated against the schema
173-
const message = {
174-
id: 'schema-validation-1',
175-
messageType: 'add',
176-
timestamp: new Date().toISOString(),
177-
metadata: {
178-
largeField: 'x'.repeat(largeMessageSizeThreshold + 1000),
179-
},
180-
userIds: ['test-user'],
181-
} satisfies PERMISSIONS_ADD_MESSAGE_TYPE
182-
183-
expect(JSON.stringify(message).length).toBeGreaterThan(largeMessageSizeThreshold)
184-
185-
await publisher.publish(message)
186-
187-
const consumptionResult = await consumer.handlerSpy.waitForMessageWithId(
188-
message.id,
189-
'consumed',
190-
)
156+
// Verify the full payload was received including the large array
157+
expect(consumptionResult.message).toMatchObject({
158+
id: message.id,
159+
messageType: message.messageType,
160+
userIds: largeUserIdArray,
161+
})
162+
expect(consumptionResult.message.userIds).toHaveLength(largeUserIdArray.length)
163+
expect(consumer.addCounter).toBe(1)
164+
})
191165

192-
// Verify all fields were properly deserialized and validated
193-
expect(consumptionResult.message).toMatchObject({
194-
id: message.id,
195-
messageType: message.messageType,
196-
userIds: message.userIds,
197-
metadata: {
198-
largeField: message.metadata.largeField,
199-
},
200-
})
201-
202-
// Type guard to access metadata property
203-
if (consumptionResult.message.messageType === 'add') {
204-
expect(consumptionResult.message.metadata?.largeField).toHaveLength(
205-
message.metadata.largeField.length,
206-
)
207-
}
208-
expect(consumer.addCounter).toBe(1)
209-
},
210-
)
166+
it('validates schema correctly after retrieving offloaded payload', {
167+
timeout: 10000,
168+
}, async () => {
169+
// Create a message with metadata that will be validated against the schema
170+
const message = {
171+
id: 'schema-validation-1',
172+
messageType: 'add',
173+
timestamp: new Date().toISOString(),
174+
metadata: {
175+
largeField: 'x'.repeat(largeMessageSizeThreshold + 1000),
176+
},
177+
userIds: ['test-user'],
178+
} satisfies PERMISSIONS_ADD_MESSAGE_TYPE
179+
180+
expect(JSON.stringify(message).length).toBeGreaterThan(largeMessageSizeThreshold)
181+
182+
await publisher.publish(message)
183+
184+
const consumptionResult = await consumer.handlerSpy.waitForMessageWithId(
185+
message.id,
186+
'consumed',
187+
)
188+
189+
// Verify all fields were properly deserialized and validated
190+
expect(consumptionResult.message).toMatchObject({
191+
id: message.id,
192+
messageType: message.messageType,
193+
userIds: message.userIds,
194+
metadata: {
195+
largeField: message.metadata.largeField,
196+
},
197+
})
198+
199+
// Type guard to access metadata property
200+
if (consumptionResult.message.messageType === 'add') {
201+
expect(consumptionResult.message.metadata?.largeField).toHaveLength(
202+
message.metadata.largeField.length,
203+
)
204+
}
205+
expect(consumer.addCounter).toBe(1)
206+
})
211207
})
212208

213209
describe('payload retrieval errors', () => {

0 commit comments

Comments
 (0)