chore(workflow-engine-*): Align event subscribers management (#12976)
* chore(workflow-engine-*): Align event subscribers management * Create nervous-eels-build.md
This commit is contained in:
1 parent
aac2feb974
commit
eb83954f23
3 files changed
+62
-27
No files matched your search
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/workflow-engine-inmemory": patch
|
||||||
|
"@medusajs/workflow-engine-redis": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
chore(workflow-engine-*): Align event subscribers management
|
||||||
@@ -521,14 +521,16 @@ export class WorkflowOrchestratorService {
|
|||||||
const subscribers = this.subscribers.get(workflowId) ?? new Map()
|
const subscribers = this.subscribers.get(workflowId) ?? new Map()
|
||||||
|
|
||||||
const handlerIndex = (handlers) => {
|
const handlerIndex = (handlers) => {
|
||||||
return handlers.indexOf((s) => s === subscriber || s._id === subscriberId)
|
return handlers.findIndex(
|
||||||
|
(s) => s === subscriber || s._id === subscriberId
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (transactionId) {
|
if (transactionId) {
|
||||||
const transactionSubscribers = subscribers.get(transactionId) ?? []
|
const transactionSubscribers = subscribers.get(transactionId) ?? []
|
||||||
const subscriberIndex = handlerIndex(transactionSubscribers)
|
const subscriberIndex = handlerIndex(transactionSubscribers)
|
||||||
if (subscriberIndex !== -1) {
|
if (subscriberIndex !== -1) {
|
||||||
transactionSubscribers.slice(subscriberIndex, 1)
|
transactionSubscribers.splice(subscriberIndex, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
transactionSubscribers.push(subscriber)
|
transactionSubscribers.push(subscriber)
|
||||||
@@ -540,7 +542,7 @@ export class WorkflowOrchestratorService {
|
|||||||
const workflowSubscribers = subscribers.get(AnySubscriber) ?? []
|
const workflowSubscribers = subscribers.get(AnySubscriber) ?? []
|
||||||
const subscriberIndex = handlerIndex(workflowSubscribers)
|
const subscriberIndex = handlerIndex(workflowSubscribers)
|
||||||
if (subscriberIndex !== -1) {
|
if (subscriberIndex !== -1) {
|
||||||
workflowSubscribers.slice(subscriberIndex, 1)
|
workflowSubscribers.splice(subscriberIndex, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
workflowSubscribers.push(subscriber)
|
workflowSubscribers.push(subscriber)
|
||||||
@@ -568,14 +570,22 @@ export class WorkflowOrchestratorService {
|
|||||||
const newTransactionSubscribers = filterSubscribers(
|
const newTransactionSubscribers = filterSubscribers(
|
||||||
transactionSubscribers
|
transactionSubscribers
|
||||||
)
|
)
|
||||||
subscribers.set(transactionId, newTransactionSubscribers)
|
if (newTransactionSubscribers.length) {
|
||||||
|
subscribers.set(transactionId, newTransactionSubscribers)
|
||||||
|
} else {
|
||||||
|
subscribers.delete(transactionId)
|
||||||
|
}
|
||||||
this.subscribers.set(workflowId, subscribers)
|
this.subscribers.set(workflowId, subscribers)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const workflowSubscribers = subscribers.get(AnySubscriber) ?? []
|
const workflowSubscribers = subscribers.get(AnySubscriber) ?? []
|
||||||
const newWorkflowSubscribers = filterSubscribers(workflowSubscribers)
|
const newWorkflowSubscribers = filterSubscribers(workflowSubscribers)
|
||||||
subscribers.set(AnySubscriber, newWorkflowSubscribers)
|
if (newWorkflowSubscribers.length) {
|
||||||
|
subscribers.set(AnySubscriber, newWorkflowSubscribers)
|
||||||
|
} else {
|
||||||
|
subscribers.delete(AnySubscriber)
|
||||||
|
}
|
||||||
this.subscribers.set(workflowId, subscribers)
|
this.subscribers.set(workflowId, subscribers)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -610,6 +620,10 @@ export class WorkflowOrchestratorService {
|
|||||||
if (transactionId) {
|
if (transactionId) {
|
||||||
const transactionSubscribers = subscribers.get(transactionId) ?? []
|
const transactionSubscribers = subscribers.get(transactionId) ?? []
|
||||||
notifySubscribers(transactionSubscribers)
|
notifySubscribers(transactionSubscribers)
|
||||||
|
|
||||||
|
if (options.eventType === "onFinish") {
|
||||||
|
subscribers.delete(transactionId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const workflowSubscribers = subscribers.get(AnySubscriber) ?? []
|
const workflowSubscribers = subscribers.get(AnySubscriber) ?? []
|
||||||
@@ -664,7 +678,6 @@ export class WorkflowOrchestratorService {
|
|||||||
notify({ eventType: "onCompensateBegin" })
|
notify({ eventType: "onCompensateBegin" })
|
||||||
},
|
},
|
||||||
onFinish: ({ transaction, result, errors }) => {
|
onFinish: ({ transaction, result, errors }) => {
|
||||||
// TODO: unsubscribe transaction handlers on finish
|
|
||||||
customEventHandlers?.onFinish?.({ transaction, result, errors })
|
customEventHandlers?.onFinish?.({ transaction, result, errors })
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -572,14 +572,16 @@ export class WorkflowOrchestratorService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handlerIndex = (handlers) => {
|
const handlerIndex = (handlers) => {
|
||||||
return handlers.indexOf((s) => s === subscriber || s._id === subscriberId)
|
return handlers.findIndex(
|
||||||
|
(s) => s === subscriber || s._id === subscriberId
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (transactionId) {
|
if (transactionId) {
|
||||||
const transactionSubscribers = subscribers.get(transactionId) ?? []
|
const transactionSubscribers = subscribers.get(transactionId) ?? []
|
||||||
const subscriberIndex = handlerIndex(transactionSubscribers)
|
const subscriberIndex = handlerIndex(transactionSubscribers)
|
||||||
if (subscriberIndex !== -1) {
|
if (subscriberIndex !== -1) {
|
||||||
transactionSubscribers.slice(subscriberIndex, 1)
|
transactionSubscribers.splice(subscriberIndex, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
transactionSubscribers.push(subscriber)
|
transactionSubscribers.push(subscriber)
|
||||||
@@ -591,7 +593,7 @@ export class WorkflowOrchestratorService {
|
|||||||
const workflowSubscribers = subscribers.get(AnySubscriber) ?? []
|
const workflowSubscribers = subscribers.get(AnySubscriber) ?? []
|
||||||
const subscriberIndex = handlerIndex(workflowSubscribers)
|
const subscriberIndex = handlerIndex(workflowSubscribers)
|
||||||
if (subscriberIndex !== -1) {
|
if (subscriberIndex !== -1) {
|
||||||
workflowSubscribers.slice(subscriberIndex, 1)
|
workflowSubscribers.splice(subscriberIndex, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
workflowSubscribers.push(subscriber)
|
workflowSubscribers.push(subscriber)
|
||||||
@@ -604,7 +606,10 @@ export class WorkflowOrchestratorService {
|
|||||||
transactionId,
|
transactionId,
|
||||||
subscriberOrId,
|
subscriberOrId,
|
||||||
}: UnsubscribeOptions) {
|
}: UnsubscribeOptions) {
|
||||||
const subscribers = this.subscribers.get(workflowId) ?? new Map()
|
const subscribers = this.subscribers.get(workflowId)
|
||||||
|
if (!subscribers) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
const filterSubscribers = (handlers: SubscriberHandler[]) => {
|
const filterSubscribers = (handlers: SubscriberHandler[]) => {
|
||||||
return handlers.filter((handler) => {
|
return handlers.filter((handler) => {
|
||||||
@@ -614,25 +619,36 @@ export class WorkflowOrchestratorService {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unsubscribe instance
|
if (transactionId) {
|
||||||
if (!this.subscribers.has(workflowId)) {
|
const transactionSubscribers = subscribers.get(transactionId)
|
||||||
|
if (transactionSubscribers) {
|
||||||
|
const newTransactionSubscribers = filterSubscribers(
|
||||||
|
transactionSubscribers
|
||||||
|
)
|
||||||
|
|
||||||
|
if (newTransactionSubscribers.length) {
|
||||||
|
subscribers.set(transactionId, newTransactionSubscribers)
|
||||||
|
} else {
|
||||||
|
subscribers.delete(transactionId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const workflowSubscribers = subscribers.get(AnySubscriber)
|
||||||
|
if (workflowSubscribers) {
|
||||||
|
const newWorkflowSubscribers = filterSubscribers(workflowSubscribers)
|
||||||
|
|
||||||
|
if (newWorkflowSubscribers.length) {
|
||||||
|
subscribers.set(AnySubscriber, newWorkflowSubscribers)
|
||||||
|
} else {
|
||||||
|
subscribers.delete(AnySubscriber)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subscribers.size === 0) {
|
||||||
|
this.subscribers.delete(workflowId)
|
||||||
void this.redisSubscriber.unsubscribe(this.getChannelName(workflowId))
|
void this.redisSubscriber.unsubscribe(this.getChannelName(workflowId))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (transactionId) {
|
|
||||||
const transactionSubscribers = subscribers.get(transactionId) ?? []
|
|
||||||
const newTransactionSubscribers = filterSubscribers(
|
|
||||||
transactionSubscribers
|
|
||||||
)
|
|
||||||
subscribers.set(transactionId, newTransactionSubscribers)
|
|
||||||
this.subscribers.set(workflowId, subscribers)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const workflowSubscribers = subscribers.get(AnySubscriber) ?? []
|
|
||||||
const newWorkflowSubscribers = filterSubscribers(workflowSubscribers)
|
|
||||||
subscribers.set(AnySubscriber, newWorkflowSubscribers)
|
|
||||||
this.subscribers.set(workflowId, subscribers)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async notify(
|
private async notify(
|
||||||
|
|||||||
Reference in new issue
Block a user