@hotmeshio/hotmesh 0.0.7 → 0.0.9
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/LICENSE +4 -7
- package/README.md +37 -46
- package/build/{esm/package.json → package.json} +6 -11
- package/build/{cjs/services → services}/activities/activity.d.ts +6 -0
- package/build/{cjs/services → services}/activities/activity.js +83 -7
- package/build/{cjs/services → services}/activities/await.d.ts +2 -2
- package/build/{cjs/services → services}/activities/await.js +5 -5
- package/build/services/activities/cycle.d.ts +19 -0
- package/build/services/activities/cycle.js +77 -0
- package/build/{esm/services → services}/activities/index.d.ts +4 -2
- package/build/{cjs/services → services}/activities/index.js +4 -2
- package/build/{cjs/services → services}/activities/worker.d.ts +0 -8
- package/build/services/activities/worker.js +73 -0
- package/build/{esm/services → services}/collator/index.d.ts +18 -1
- package/build/{cjs/services → services}/collator/index.js +41 -11
- package/build/{cjs/services → services}/durable/factory.js +17 -1
- package/build/{cjs/services → services}/durable/native.js +2 -2
- package/build/{cjs/services → services}/durable/worker.d.ts +2 -3
- package/build/{esm/services → services}/durable/worker.js +35 -37
- package/build/{cjs/services → services}/durable/workflow.js +11 -2
- package/build/{cjs/services → services}/mapper/index.js +3 -0
- package/build/{cjs/services → services}/signaler/stream.js +0 -1
- package/build/{esm/types → types}/activity.d.ts +7 -2
- package/build/{cjs/types → types}/durable.d.ts +4 -6
- package/build/{cjs/types → types}/index.d.ts +1 -1
- package/package.json +6 -11
- package/services/activities/activity.ts +90 -7
- package/services/activities/await.ts +5 -5
- package/services/activities/cycle.ts +96 -0
- package/services/activities/index.ts +4 -2
- package/services/activities/worker.ts +2 -93
- package/services/collator/index.ts +43 -11
- package/services/durable/factory.ts +17 -1
- package/services/durable/native.ts +2 -2
- package/services/durable/worker.ts +19 -22
- package/services/durable/workflow.ts +11 -2
- package/services/mapper/index.ts +3 -0
- package/services/signaler/stream.ts +0 -1
- package/types/activity.ts +8 -1
- package/types/durable.ts +4 -4
- package/types/index.ts +1 -0
- package/build/cjs/package.json +0 -80
- package/build/cjs/services/activities/index.d.ts +0 -15
- package/build/cjs/services/activities/worker.js +0 -159
- package/build/cjs/services/collator/index.d.ts +0 -56
- package/build/cjs/services/durable/worker.js +0 -298
- package/build/cjs/types/activity.d.ts +0 -87
- package/build/esm/index.d.ts +0 -4
- package/build/esm/index.js +0 -3
- package/build/esm/modules/errors.d.ts +0 -28
- package/build/esm/modules/errors.js +0 -41
- package/build/esm/modules/key.d.ts +0 -75
- package/build/esm/modules/key.js +0 -111
- package/build/esm/modules/utils.d.ts +0 -34
- package/build/esm/modules/utils.js +0 -154
- package/build/esm/services/activities/activity.d.ts +0 -61
- package/build/esm/services/activities/activity.js +0 -410
- package/build/esm/services/activities/await.d.ts +0 -16
- package/build/esm/services/activities/await.js +0 -140
- package/build/esm/services/activities/emit.d.ts +0 -9
- package/build/esm/services/activities/emit.js +0 -10
- package/build/esm/services/activities/index.js +0 -14
- package/build/esm/services/activities/iterate.d.ts +0 -9
- package/build/esm/services/activities/iterate.js +0 -10
- package/build/esm/services/activities/trigger.d.ts +0 -22
- package/build/esm/services/activities/trigger.js +0 -158
- package/build/esm/services/activities/worker.d.ts +0 -19
- package/build/esm/services/activities/worker.js +0 -156
- package/build/esm/services/collator/index.js +0 -191
- package/build/esm/services/compiler/deployer.d.ts +0 -36
- package/build/esm/services/compiler/deployer.js +0 -423
- package/build/esm/services/compiler/index.d.ts +0 -30
- package/build/esm/services/compiler/index.js +0 -82
- package/build/esm/services/compiler/validator.d.ts +0 -32
- package/build/esm/services/compiler/validator.js +0 -131
- package/build/esm/services/connector/clients/ioredis.d.ts +0 -13
- package/build/esm/services/connector/clients/ioredis.js +0 -47
- package/build/esm/services/connector/clients/redis.d.ts +0 -13
- package/build/esm/services/connector/clients/redis.js +0 -59
- package/build/esm/services/connector/index.d.ts +0 -5
- package/build/esm/services/connector/index.js +0 -27
- package/build/esm/services/dimension/index.d.ts +0 -29
- package/build/esm/services/dimension/index.js +0 -32
- package/build/esm/services/durable/asyncLocalStorage.d.ts +0 -3
- package/build/esm/services/durable/asyncLocalStorage.js +0 -2
- package/build/esm/services/durable/client.d.ts +0 -15
- package/build/esm/services/durable/client.js +0 -114
- package/build/esm/services/durable/connection.d.ts +0 -4
- package/build/esm/services/durable/connection.js +0 -47
- package/build/esm/services/durable/factory.d.ts +0 -3
- package/build/esm/services/durable/factory.js +0 -119
- package/build/esm/services/durable/handle.d.ts +0 -8
- package/build/esm/services/durable/handle.js +0 -34
- package/build/esm/services/durable/index.d.ts +0 -57
- package/build/esm/services/durable/index.js +0 -55
- package/build/esm/services/durable/native.d.ts +0 -4
- package/build/esm/services/durable/native.js +0 -43
- package/build/esm/services/durable/worker.d.ts +0 -37
- package/build/esm/services/durable/workflow.d.ts +0 -6
- package/build/esm/services/durable/workflow.js +0 -128
- package/build/esm/services/engine/index.d.ts +0 -82
- package/build/esm/services/engine/index.js +0 -522
- package/build/esm/services/hotmesh/index.d.ts +0 -45
- package/build/esm/services/hotmesh/index.js +0 -131
- package/build/esm/services/logger/index.d.ts +0 -17
- package/build/esm/services/logger/index.js +0 -70
- package/build/esm/services/mapper/index.d.ts +0 -24
- package/build/esm/services/mapper/index.js +0 -69
- package/build/esm/services/pipe/functions/array.d.ts +0 -24
- package/build/esm/services/pipe/functions/array.js +0 -66
- package/build/esm/services/pipe/functions/bitwise.d.ts +0 -9
- package/build/esm/services/pipe/functions/bitwise.js +0 -21
- package/build/esm/services/pipe/functions/conditional.d.ts +0 -10
- package/build/esm/services/pipe/functions/conditional.js +0 -24
- package/build/esm/services/pipe/functions/date.d.ts +0 -57
- package/build/esm/services/pipe/functions/date.js +0 -164
- package/build/esm/services/pipe/functions/index.d.ts +0 -25
- package/build/esm/services/pipe/functions/index.js +0 -24
- package/build/esm/services/pipe/functions/json.d.ts +0 -5
- package/build/esm/services/pipe/functions/json.js +0 -9
- package/build/esm/services/pipe/functions/math.d.ts +0 -38
- package/build/esm/services/pipe/functions/math.js +0 -108
- package/build/esm/services/pipe/functions/number.d.ts +0 -25
- package/build/esm/services/pipe/functions/number.js +0 -130
- package/build/esm/services/pipe/functions/object.d.ts +0 -22
- package/build/esm/services/pipe/functions/object.js +0 -60
- package/build/esm/services/pipe/functions/string.d.ts +0 -23
- package/build/esm/services/pipe/functions/string.js +0 -66
- package/build/esm/services/pipe/functions/symbol.d.ts +0 -12
- package/build/esm/services/pipe/functions/symbol.js +0 -30
- package/build/esm/services/pipe/functions/unary.d.ts +0 -7
- package/build/esm/services/pipe/functions/unary.js +0 -15
- package/build/esm/services/pipe/index.d.ts +0 -30
- package/build/esm/services/pipe/index.js +0 -122
- package/build/esm/services/quorum/index.d.ts +0 -34
- package/build/esm/services/quorum/index.js +0 -144
- package/build/esm/services/reporter/index.d.ts +0 -47
- package/build/esm/services/reporter/index.js +0 -327
- package/build/esm/services/serializer/index.d.ts +0 -41
- package/build/esm/services/serializer/index.js +0 -251
- package/build/esm/services/signaler/store.d.ts +0 -15
- package/build/esm/services/signaler/store.js +0 -50
- package/build/esm/services/signaler/stream.d.ts +0 -43
- package/build/esm/services/signaler/stream.js +0 -315
- package/build/esm/services/store/cache.d.ts +0 -66
- package/build/esm/services/store/cache.js +0 -124
- package/build/esm/services/store/clients/ioredis.d.ts +0 -27
- package/build/esm/services/store/clients/ioredis.js +0 -93
- package/build/esm/services/store/clients/redis.d.ts +0 -29
- package/build/esm/services/store/clients/redis.js +0 -140
- package/build/esm/services/store/index.d.ts +0 -88
- package/build/esm/services/store/index.js +0 -623
- package/build/esm/services/stream/clients/ioredis.d.ts +0 -23
- package/build/esm/services/stream/clients/ioredis.js +0 -112
- package/build/esm/services/stream/clients/redis.d.ts +0 -23
- package/build/esm/services/stream/clients/redis.js +0 -116
- package/build/esm/services/stream/index.d.ts +0 -21
- package/build/esm/services/stream/index.js +0 -6
- package/build/esm/services/sub/clients/ioredis.d.ts +0 -20
- package/build/esm/services/sub/clients/ioredis.js +0 -69
- package/build/esm/services/sub/clients/redis.d.ts +0 -20
- package/build/esm/services/sub/clients/redis.js +0 -60
- package/build/esm/services/sub/index.d.ts +0 -18
- package/build/esm/services/sub/index.js +0 -6
- package/build/esm/services/task/index.d.ts +0 -18
- package/build/esm/services/task/index.js +0 -70
- package/build/esm/services/telemetry/index.d.ts +0 -49
- package/build/esm/services/telemetry/index.js +0 -217
- package/build/esm/services/worker/index.d.ts +0 -30
- package/build/esm/services/worker/index.js +0 -102
- package/build/esm/types/activity.js +0 -1
- package/build/esm/types/app.d.ts +0 -16
- package/build/esm/types/app.js +0 -1
- package/build/esm/types/async.d.ts +0 -5
- package/build/esm/types/async.js +0 -1
- package/build/esm/types/cache.d.ts +0 -1
- package/build/esm/types/cache.js +0 -1
- package/build/esm/types/collator.d.ts +0 -8
- package/build/esm/types/collator.js +0 -8
- package/build/esm/types/durable.d.ts +0 -59
- package/build/esm/types/durable.js +0 -1
- package/build/esm/types/hook.d.ts +0 -31
- package/build/esm/types/hook.js +0 -6
- package/build/esm/types/hotmesh.d.ts +0 -82
- package/build/esm/types/hotmesh.js +0 -1
- package/build/esm/types/index.d.ts +0 -20
- package/build/esm/types/index.js +0 -5
- package/build/esm/types/ioredisclient.d.ts +0 -5
- package/build/esm/types/ioredisclient.js +0 -2
- package/build/esm/types/job.d.ts +0 -50
- package/build/esm/types/job.js +0 -1
- package/build/esm/types/logger.d.ts +0 -6
- package/build/esm/types/logger.js +0 -1
- package/build/esm/types/map.d.ts +0 -4
- package/build/esm/types/map.js +0 -1
- package/build/esm/types/pipe.d.ts +0 -4
- package/build/esm/types/pipe.js +0 -1
- package/build/esm/types/quorum.d.ts +0 -46
- package/build/esm/types/quorum.js +0 -1
- package/build/esm/types/redis.d.ts +0 -8
- package/build/esm/types/redis.js +0 -1
- package/build/esm/types/redisclient.d.ts +0 -25
- package/build/esm/types/redisclient.js +0 -1
- package/build/esm/types/serializer.d.ts +0 -33
- package/build/esm/types/serializer.js +0 -1
- package/build/esm/types/stats.d.ts +0 -83
- package/build/esm/types/stats.js +0 -1
- package/build/esm/types/stream.d.ts +0 -67
- package/build/esm/types/stream.js +0 -22
- package/build/esm/types/telemetry.d.ts +0 -1
- package/build/esm/types/telemetry.js +0 -1
- package/build/esm/types/transition.d.ts +0 -17
- package/build/esm/types/transition.js +0 -1
- package/tsconfig.cjs.json +0 -8
- package/tsconfig.esm.json +0 -9
- /package/build/{cjs/index.d.ts → index.d.ts} +0 -0
- /package/build/{cjs/index.js → index.js} +0 -0
- /package/build/{cjs/modules → modules}/errors.d.ts +0 -0
- /package/build/{cjs/modules → modules}/errors.js +0 -0
- /package/build/{cjs/modules → modules}/key.d.ts +0 -0
- /package/build/{cjs/modules → modules}/key.js +0 -0
- /package/build/{cjs/modules → modules}/utils.d.ts +0 -0
- /package/build/{cjs/modules → modules}/utils.js +0 -0
- /package/build/{cjs/services → services}/activities/emit.d.ts +0 -0
- /package/build/{cjs/services → services}/activities/emit.js +0 -0
- /package/build/{cjs/services → services}/activities/iterate.d.ts +0 -0
- /package/build/{cjs/services → services}/activities/iterate.js +0 -0
- /package/build/{cjs/services → services}/activities/trigger.d.ts +0 -0
- /package/build/{cjs/services → services}/activities/trigger.js +0 -0
- /package/build/{cjs/services → services}/compiler/deployer.d.ts +0 -0
- /package/build/{cjs/services → services}/compiler/deployer.js +0 -0
- /package/build/{cjs/services → services}/compiler/index.d.ts +0 -0
- /package/build/{cjs/services → services}/compiler/index.js +0 -0
- /package/build/{cjs/services → services}/compiler/validator.d.ts +0 -0
- /package/build/{cjs/services → services}/compiler/validator.js +0 -0
- /package/build/{cjs/services → services}/connector/clients/ioredis.d.ts +0 -0
- /package/build/{cjs/services → services}/connector/clients/ioredis.js +0 -0
- /package/build/{cjs/services → services}/connector/clients/redis.d.ts +0 -0
- /package/build/{cjs/services → services}/connector/clients/redis.js +0 -0
- /package/build/{cjs/services → services}/connector/index.d.ts +0 -0
- /package/build/{cjs/services → services}/connector/index.js +0 -0
- /package/build/{cjs/services → services}/dimension/index.d.ts +0 -0
- /package/build/{cjs/services → services}/dimension/index.js +0 -0
- /package/build/{cjs/services → services}/durable/asyncLocalStorage.d.ts +0 -0
- /package/build/{cjs/services → services}/durable/asyncLocalStorage.js +0 -0
- /package/build/{cjs/services → services}/durable/client.d.ts +0 -0
- /package/build/{cjs/services → services}/durable/client.js +0 -0
- /package/build/{cjs/services → services}/durable/connection.d.ts +0 -0
- /package/build/{cjs/services → services}/durable/connection.js +0 -0
- /package/build/{cjs/services → services}/durable/factory.d.ts +0 -0
- /package/build/{cjs/services → services}/durable/handle.d.ts +0 -0
- /package/build/{cjs/services → services}/durable/handle.js +0 -0
- /package/build/{cjs/services → services}/durable/index.d.ts +0 -0
- /package/build/{cjs/services → services}/durable/index.js +0 -0
- /package/build/{cjs/services → services}/durable/native.d.ts +0 -0
- /package/build/{cjs/services → services}/durable/workflow.d.ts +0 -0
- /package/build/{cjs/services → services}/engine/index.d.ts +0 -0
- /package/build/{cjs/services → services}/engine/index.js +0 -0
- /package/build/{cjs/services → services}/hotmesh/index.d.ts +0 -0
- /package/build/{cjs/services → services}/hotmesh/index.js +0 -0
- /package/build/{cjs/services → services}/logger/index.d.ts +0 -0
- /package/build/{cjs/services → services}/logger/index.js +0 -0
- /package/build/{cjs/services → services}/mapper/index.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/array.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/array.js +0 -0
- /package/build/{cjs/services → services}/pipe/functions/bitwise.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/bitwise.js +0 -0
- /package/build/{cjs/services → services}/pipe/functions/conditional.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/conditional.js +0 -0
- /package/build/{cjs/services → services}/pipe/functions/date.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/date.js +0 -0
- /package/build/{cjs/services → services}/pipe/functions/index.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/index.js +0 -0
- /package/build/{cjs/services → services}/pipe/functions/json.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/json.js +0 -0
- /package/build/{cjs/services → services}/pipe/functions/math.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/math.js +0 -0
- /package/build/{cjs/services → services}/pipe/functions/number.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/number.js +0 -0
- /package/build/{cjs/services → services}/pipe/functions/object.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/object.js +0 -0
- /package/build/{cjs/services → services}/pipe/functions/string.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/string.js +0 -0
- /package/build/{cjs/services → services}/pipe/functions/symbol.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/symbol.js +0 -0
- /package/build/{cjs/services → services}/pipe/functions/unary.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/functions/unary.js +0 -0
- /package/build/{cjs/services → services}/pipe/index.d.ts +0 -0
- /package/build/{cjs/services → services}/pipe/index.js +0 -0
- /package/build/{cjs/services → services}/quorum/index.d.ts +0 -0
- /package/build/{cjs/services → services}/quorum/index.js +0 -0
- /package/build/{cjs/services → services}/reporter/index.d.ts +0 -0
- /package/build/{cjs/services → services}/reporter/index.js +0 -0
- /package/build/{cjs/services → services}/serializer/index.d.ts +0 -0
- /package/build/{cjs/services → services}/serializer/index.js +0 -0
- /package/build/{cjs/services → services}/signaler/store.d.ts +0 -0
- /package/build/{cjs/services → services}/signaler/store.js +0 -0
- /package/build/{cjs/services → services}/signaler/stream.d.ts +0 -0
- /package/build/{cjs/services → services}/store/cache.d.ts +0 -0
- /package/build/{cjs/services → services}/store/cache.js +0 -0
- /package/build/{cjs/services → services}/store/clients/ioredis.d.ts +0 -0
- /package/build/{cjs/services → services}/store/clients/ioredis.js +0 -0
- /package/build/{cjs/services → services}/store/clients/redis.d.ts +0 -0
- /package/build/{cjs/services → services}/store/clients/redis.js +0 -0
- /package/build/{cjs/services → services}/store/index.d.ts +0 -0
- /package/build/{cjs/services → services}/store/index.js +0 -0
- /package/build/{cjs/services → services}/stream/clients/ioredis.d.ts +0 -0
- /package/build/{cjs/services → services}/stream/clients/ioredis.js +0 -0
- /package/build/{cjs/services → services}/stream/clients/redis.d.ts +0 -0
- /package/build/{cjs/services → services}/stream/clients/redis.js +0 -0
- /package/build/{cjs/services → services}/stream/index.d.ts +0 -0
- /package/build/{cjs/services → services}/stream/index.js +0 -0
- /package/build/{cjs/services → services}/sub/clients/ioredis.d.ts +0 -0
- /package/build/{cjs/services → services}/sub/clients/ioredis.js +0 -0
- /package/build/{cjs/services → services}/sub/clients/redis.d.ts +0 -0
- /package/build/{cjs/services → services}/sub/clients/redis.js +0 -0
- /package/build/{cjs/services → services}/sub/index.d.ts +0 -0
- /package/build/{cjs/services → services}/sub/index.js +0 -0
- /package/build/{cjs/services → services}/task/index.d.ts +0 -0
- /package/build/{cjs/services → services}/task/index.js +0 -0
- /package/build/{cjs/services → services}/telemetry/index.d.ts +0 -0
- /package/build/{cjs/services → services}/telemetry/index.js +0 -0
- /package/build/{cjs/services → services}/worker/index.d.ts +0 -0
- /package/build/{cjs/services → services}/worker/index.js +0 -0
- /package/build/{cjs/types → types}/activity.js +0 -0
- /package/build/{cjs/types → types}/app.d.ts +0 -0
- /package/build/{cjs/types → types}/app.js +0 -0
- /package/build/{cjs/types → types}/async.d.ts +0 -0
- /package/build/{cjs/types → types}/async.js +0 -0
- /package/build/{cjs/types → types}/cache.d.ts +0 -0
- /package/build/{cjs/types → types}/cache.js +0 -0
- /package/build/{cjs/types → types}/collator.d.ts +0 -0
- /package/build/{cjs/types → types}/collator.js +0 -0
- /package/build/{cjs/types → types}/durable.js +0 -0
- /package/build/{cjs/types → types}/hook.d.ts +0 -0
- /package/build/{cjs/types → types}/hook.js +0 -0
- /package/build/{cjs/types → types}/hotmesh.d.ts +0 -0
- /package/build/{cjs/types → types}/hotmesh.js +0 -0
- /package/build/{cjs/types → types}/index.js +0 -0
- /package/build/{cjs/types → types}/ioredisclient.d.ts +0 -0
- /package/build/{cjs/types → types}/ioredisclient.js +0 -0
- /package/build/{cjs/types → types}/job.d.ts +0 -0
- /package/build/{cjs/types → types}/job.js +0 -0
- /package/build/{cjs/types → types}/logger.d.ts +0 -0
- /package/build/{cjs/types → types}/logger.js +0 -0
- /package/build/{cjs/types → types}/map.d.ts +0 -0
- /package/build/{cjs/types → types}/map.js +0 -0
- /package/build/{cjs/types → types}/pipe.d.ts +0 -0
- /package/build/{cjs/types → types}/pipe.js +0 -0
- /package/build/{cjs/types → types}/quorum.d.ts +0 -0
- /package/build/{cjs/types → types}/quorum.js +0 -0
- /package/build/{cjs/types → types}/redis.d.ts +0 -0
- /package/build/{cjs/types → types}/redis.js +0 -0
- /package/build/{cjs/types → types}/redisclient.d.ts +0 -0
- /package/build/{cjs/types → types}/redisclient.js +0 -0
- /package/build/{cjs/types → types}/serializer.d.ts +0 -0
- /package/build/{cjs/types → types}/serializer.js +0 -0
- /package/build/{cjs/types → types}/stats.d.ts +0 -0
- /package/build/{cjs/types → types}/stats.js +0 -0
- /package/build/{cjs/types → types}/stream.d.ts +0 -0
- /package/build/{cjs/types → types}/stream.js +0 -0
- /package/build/{cjs/types → types}/telemetry.d.ts +0 -0
- /package/build/{cjs/types → types}/telemetry.js +0 -0
- /package/build/{cjs/types → types}/transition.d.ts +0 -0
- /package/build/{cjs/types → types}/transition.js +0 -0
|
@@ -4,15 +4,36 @@ exports.CollatorService = void 0;
|
|
|
4
4
|
const errors_1 = require("../../modules/errors");
|
|
5
5
|
const collator_1 = require("../../types/collator");
|
|
6
6
|
class CollatorService {
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* returns the dimensional address (dad) for the target; due
|
|
9
|
+
* to the nature of the notary system, the dad for leg 2 entry
|
|
10
|
+
* must target the `0` index while leg 2 exit must target the
|
|
11
|
+
* current index (0)
|
|
12
|
+
*/
|
|
13
|
+
static getDimensionalAddress(activity, isEntry = false) {
|
|
8
14
|
let dad = activity.context.metadata.dad || activity.metadata.dad;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
// dad = `${dad.substring(0, dad.lastIndexOf(','))},0`;
|
|
13
|
-
// }
|
|
15
|
+
if (isEntry && dad && activity.leg === 2) {
|
|
16
|
+
dad = `${dad.substring(0, dad.lastIndexOf(','))},0`;
|
|
17
|
+
}
|
|
14
18
|
return CollatorService.getDimensionsById([...activity.config.ancestors, activity.metadata.aid], dad);
|
|
15
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* resolves the dimensional address for the
|
|
22
|
+
* ancestor in the graph to go back to. this address
|
|
23
|
+
* is determined by trimming the last digits from
|
|
24
|
+
* the `dad` (including the target).
|
|
25
|
+
* the target activity index is then set to `0`, so that
|
|
26
|
+
* the origin node can be queried for approval/entry.
|
|
27
|
+
*/
|
|
28
|
+
static resolveReentryDimension(activity) {
|
|
29
|
+
const targetActivityId = activity.config.ancestor;
|
|
30
|
+
const ancestors = activity.config.ancestors;
|
|
31
|
+
const ancestorIndex = ancestors.indexOf(targetActivityId);
|
|
32
|
+
const dimensions = activity.metadata.dad.split(','); //e.g., `,0,0,1,0`
|
|
33
|
+
dimensions.length = ancestorIndex + 1;
|
|
34
|
+
dimensions.push('0');
|
|
35
|
+
return dimensions.join(',');
|
|
36
|
+
}
|
|
16
37
|
static async notarizeEntry(activity, multi) {
|
|
17
38
|
//decrement by -100_000_000_000_000
|
|
18
39
|
const amount = await activity.store.collate(activity.context.metadata.jid, activity.metadata.aid, -100000000000000, this.getDimensionalAddress(activity), multi);
|
|
@@ -27,14 +48,21 @@ class CollatorService {
|
|
|
27
48
|
//this.verifyInteger(amount, 1, 'exit');
|
|
28
49
|
return amount;
|
|
29
50
|
}
|
|
51
|
+
static async notarizeEarlyExit(activity, multi) {
|
|
52
|
+
//decrement the 2nd and 3rd digits to fully deactivate (`cycle` activities use this command to fully exit after leg 1) (should result in `888000000000000`)
|
|
53
|
+
return await activity.store.collate(activity.context.metadata.jid, activity.metadata.aid, -11000000000000, this.getDimensionalAddress(activity), multi);
|
|
54
|
+
}
|
|
55
|
+
;
|
|
30
56
|
static async notarizeEarlyCompletion(activity, multi) {
|
|
31
|
-
//initialize both `possible` (1m) and `actualized` (1) zero dimension, while decrementing the 2nd
|
|
32
|
-
|
|
57
|
+
//initialize both `possible` (1m) and `actualized` (1) zero dimension, while decrementing the 2nd
|
|
58
|
+
//3rd digit is optionally kept open if the activity might be used in a cycle
|
|
59
|
+
const decrement = activity.config.cycle ? 10000000000000 : 11000000000000;
|
|
60
|
+
return await activity.store.collate(activity.context.metadata.jid, activity.metadata.aid, 1000001 - decrement, this.getDimensionalAddress(activity), multi);
|
|
33
61
|
}
|
|
34
62
|
;
|
|
35
63
|
static async notarizeReentry(activity, multi) {
|
|
36
64
|
//increment by 1_000_000 (indicates re-entry and is used to drive the 'dimensional address' for adjacent activities (minus 1))
|
|
37
|
-
const amount = await activity.store.collate(activity.context.metadata.jid, activity.metadata.aid, 1000000, this.getDimensionalAddress(activity), multi);
|
|
65
|
+
const amount = await activity.store.collate(activity.context.metadata.jid, activity.metadata.aid, 1000000, this.getDimensionalAddress(activity, true), multi);
|
|
38
66
|
this.verifyInteger(amount, 2, 'enter');
|
|
39
67
|
return amount;
|
|
40
68
|
}
|
|
@@ -45,8 +73,10 @@ class CollatorService {
|
|
|
45
73
|
}
|
|
46
74
|
;
|
|
47
75
|
static async notarizeCompletion(activity, multi) {
|
|
48
|
-
//
|
|
49
|
-
|
|
76
|
+
//1) ALWAYS actualize leg2 dimension (+1)
|
|
77
|
+
//2) IF the activity is used in a cycle, don't close leg 2!
|
|
78
|
+
const decrement = activity.config.cycle ? 0 : -1000000000000;
|
|
79
|
+
return await activity.store.collate(activity.context.metadata.jid, activity.metadata.aid, 1 - decrement, this.getDimensionalAddress(activity), multi);
|
|
50
80
|
}
|
|
51
81
|
;
|
|
52
82
|
static getDigitAtIndex(num, targetDigitIndex) {
|
|
@@ -29,7 +29,12 @@ const getWorkflowYAML = (topic, version = '1') => {
|
|
|
29
29
|
type: trigger
|
|
30
30
|
stats:
|
|
31
31
|
id: '{$self.input.data.workflowId}'
|
|
32
|
+
|
|
32
33
|
a1:
|
|
34
|
+
type: activity
|
|
35
|
+
cycle: true
|
|
36
|
+
|
|
37
|
+
w1:
|
|
33
38
|
type: worker
|
|
34
39
|
topic: ${topic}
|
|
35
40
|
input:
|
|
@@ -52,9 +57,20 @@ const getWorkflowYAML = (topic, version = '1') => {
|
|
|
52
57
|
job:
|
|
53
58
|
maps:
|
|
54
59
|
response: '{$self.output.data.response}'
|
|
60
|
+
|
|
61
|
+
c1:
|
|
62
|
+
type: cycle
|
|
63
|
+
ancestor: a1
|
|
55
64
|
transitions:
|
|
56
65
|
t1:
|
|
57
|
-
- to: a1
|
|
66
|
+
- to: a1
|
|
67
|
+
a1:
|
|
68
|
+
- to: w1
|
|
69
|
+
w1:
|
|
70
|
+
- to: c1
|
|
71
|
+
conditions:
|
|
72
|
+
code: 500
|
|
73
|
+
`;
|
|
58
74
|
};
|
|
59
75
|
exports.getWorkflowYAML = getWorkflowYAML;
|
|
60
76
|
const getActivityYAML = (topic, version = '1') => {
|
|
@@ -10,7 +10,7 @@ Here is an example of how the methods in this file are used:
|
|
|
10
10
|
import { Durable: { NativeConnection, Worker } } from '@hotmeshio/hotmesh';
|
|
11
11
|
import Redis from 'ioredis'; //OR `import * as Redis from 'redis';`
|
|
12
12
|
|
|
13
|
-
import * as
|
|
13
|
+
import * as workflows from './workflows';
|
|
14
14
|
|
|
15
15
|
async function run() {
|
|
16
16
|
const connection = await NativeConnection.connect({
|
|
@@ -24,7 +24,7 @@ async function run() {
|
|
|
24
24
|
connection,
|
|
25
25
|
namespace: 'default',
|
|
26
26
|
taskQueue: 'hello-world',
|
|
27
|
-
|
|
27
|
+
workflow: workflows.example,
|
|
28
28
|
activities,
|
|
29
29
|
});
|
|
30
30
|
await worker.run();
|
|
@@ -5,6 +5,7 @@ export declare class WorkerService {
|
|
|
5
5
|
static connection: Connection;
|
|
6
6
|
static instances: Map<string, HotMesh | Promise<HotMesh>>;
|
|
7
7
|
workflowRunner: HotMesh;
|
|
8
|
+
activityRunner: HotMesh;
|
|
8
9
|
static getHotMesh: (worflowTopic: string) => Promise<HotMesh>;
|
|
9
10
|
static activateWorkflow(hotMesh: HotMesh, topic: string, factory: Function): Promise<void>;
|
|
10
11
|
/**
|
|
@@ -12,9 +13,7 @@ export declare class WorkerService {
|
|
|
12
13
|
* dynamically importing the user's workflow module. That file
|
|
13
14
|
* contains a call, `proxyActivities`, which needs this info.
|
|
14
15
|
*
|
|
15
|
-
* NOTE:
|
|
16
|
-
* as a natural result of importing worflows.ts. However,
|
|
17
|
-
* because the worker imports the workflows dynamically AFTER
|
|
16
|
+
* NOTE: Because the worker imports the workflows dynamically AFTER
|
|
18
17
|
* the activities are loaded, there will be items in the registry,
|
|
19
18
|
* allowing proxyActivities to succeed.
|
|
20
19
|
*/
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
var _a;
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.WorkerService = void 0;
|
|
5
|
+
const asyncLocalStorage_1 = require("./asyncLocalStorage");
|
|
6
|
+
const hotmesh_1 = require("../hotmesh");
|
|
7
|
+
const stream_1 = require("../../types/stream");
|
|
8
|
+
const factory_1 = require("./factory");
|
|
6
9
|
/*
|
|
7
10
|
Here is an example of how the methods in this file are used:
|
|
8
11
|
|
|
@@ -11,7 +14,7 @@ Here is an example of how the methods in this file are used:
|
|
|
11
14
|
import { Durable: { NativeConnection, Worker } } from '@hotmeshio/hotmesh';
|
|
12
15
|
import Redis from 'ioredis'; //OR `import * as Redis from 'redis';`
|
|
13
16
|
|
|
14
|
-
import * as
|
|
17
|
+
import * as workflows from './workflows';
|
|
15
18
|
|
|
16
19
|
async function run() {
|
|
17
20
|
const connection = await NativeConnection.connect({
|
|
@@ -25,7 +28,7 @@ async function run() {
|
|
|
25
28
|
connection,
|
|
26
29
|
namespace: 'default',
|
|
27
30
|
taskQueue: 'hello-world',
|
|
28
|
-
|
|
31
|
+
workflow: workflows.example,
|
|
29
32
|
activities,
|
|
30
33
|
});
|
|
31
34
|
await worker.run();
|
|
@@ -66,19 +69,19 @@ class WorkerService {
|
|
|
66
69
|
* dynamically importing the user's workflow module. That file
|
|
67
70
|
* contains a call, `proxyActivities`, which needs this info.
|
|
68
71
|
*
|
|
69
|
-
* NOTE:
|
|
70
|
-
* as a natural result of importing worflows.ts. However,
|
|
71
|
-
* because the worker imports the workflows dynamically AFTER
|
|
72
|
+
* NOTE: Because the worker imports the workflows dynamically AFTER
|
|
72
73
|
* the activities are loaded, there will be items in the registry,
|
|
73
74
|
* allowing proxyActivities to succeed.
|
|
74
75
|
*/
|
|
75
76
|
static registerActivities(activities) {
|
|
76
|
-
if (typeof activities === 'function') {
|
|
77
|
+
if (typeof activities === 'function' && typeof WorkerService.activityRegistry[activities.name] !== 'function') {
|
|
77
78
|
WorkerService.activityRegistry[activities.name] = activities;
|
|
78
79
|
}
|
|
79
80
|
else {
|
|
80
81
|
Object.keys(activities).forEach(key => {
|
|
81
|
-
WorkerService.activityRegistry[activities[key].name]
|
|
82
|
+
if (activities[key].name && typeof WorkerService.activityRegistry[activities[key].name] !== 'function') {
|
|
83
|
+
WorkerService.activityRegistry[activities[key].name] = activities[key];
|
|
84
|
+
}
|
|
82
85
|
});
|
|
83
86
|
}
|
|
84
87
|
return WorkerService.activityRegistry;
|
|
@@ -86,18 +89,18 @@ class WorkerService {
|
|
|
86
89
|
static async create(config) {
|
|
87
90
|
//always call `registerActivities` before `import`
|
|
88
91
|
WorkerService.connection = config.connection;
|
|
89
|
-
|
|
90
|
-
const workflow =
|
|
92
|
+
//user can provide the workflow file directly
|
|
93
|
+
const workflow = config.workflow;
|
|
91
94
|
const [workflowFunctionName, workflowFunction] = WorkerService.resolveWorkflowTarget(workflow);
|
|
92
95
|
const baseTopic = `${config.taskQueue}-${workflowFunctionName}`;
|
|
93
96
|
const activityTopic = `${baseTopic}-activity`;
|
|
94
97
|
const workflowTopic = `${baseTopic}`;
|
|
95
98
|
//initialize supporting workflows
|
|
96
99
|
const worker = new WorkerService();
|
|
97
|
-
|
|
98
|
-
await WorkerService.activateWorkflow(activityRunner, activityTopic, getActivityYAML);
|
|
100
|
+
worker.activityRunner = await worker.initActivityWorkflow(config, activityTopic);
|
|
101
|
+
await WorkerService.activateWorkflow(worker.activityRunner, activityTopic, factory_1.getActivityYAML);
|
|
99
102
|
worker.workflowRunner = await worker.initWorkerWorkflow(config, workflowTopic, workflowFunction);
|
|
100
|
-
await WorkerService.activateWorkflow(worker.workflowRunner, workflowTopic, getWorkflowYAML);
|
|
103
|
+
await WorkerService.activateWorkflow(worker.workflowRunner, workflowTopic, factory_1.getWorkflowYAML);
|
|
101
104
|
return worker;
|
|
102
105
|
}
|
|
103
106
|
static resolveWorkflowTarget(workflow) {
|
|
@@ -113,19 +116,14 @@ class WorkerService {
|
|
|
113
116
|
return [workflowFunction.name, workflowFunction];
|
|
114
117
|
}
|
|
115
118
|
async run() {
|
|
116
|
-
|
|
117
|
-
this.workflowRunner.engine.logger.info('WorkerService is running');
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
console.log('WorkerService is running');
|
|
121
|
-
}
|
|
119
|
+
this.workflowRunner.engine.logger.info('WorkerService is running');
|
|
122
120
|
}
|
|
123
121
|
async initActivityWorkflow(config, activityTopic) {
|
|
124
122
|
const redisConfig = {
|
|
125
123
|
class: config.connection.class,
|
|
126
124
|
options: config.connection.options
|
|
127
125
|
};
|
|
128
|
-
const hmshInstance = await
|
|
126
|
+
const hmshInstance = await hotmesh_1.HotMeshService.init({
|
|
129
127
|
appId: activityTopic,
|
|
130
128
|
engine: { redis: redisConfig },
|
|
131
129
|
workers: [
|
|
@@ -147,16 +145,17 @@ class WorkerService {
|
|
|
147
145
|
const activityFunction = WorkerService.activityRegistry[activityName];
|
|
148
146
|
const pojoResponse = await activityFunction.apply(this, activityInput.arguments);
|
|
149
147
|
return {
|
|
150
|
-
status: StreamStatus.SUCCESS,
|
|
148
|
+
status: stream_1.StreamStatus.SUCCESS,
|
|
151
149
|
metadata: { ...data.metadata },
|
|
152
150
|
data: { response: pojoResponse }
|
|
153
151
|
};
|
|
154
152
|
}
|
|
155
153
|
catch (err) {
|
|
156
|
-
|
|
157
|
-
//todo (make retry configurable)
|
|
154
|
+
this.activityRunner.engine.logger.error('durable-worker-activity-err', err);
|
|
158
155
|
return {
|
|
159
|
-
status: StreamStatus.
|
|
156
|
+
status: stream_1.StreamStatus.ERROR,
|
|
157
|
+
code: 500,
|
|
158
|
+
message: err.message,
|
|
160
159
|
metadata: { ...data.metadata },
|
|
161
160
|
data: { error: err }
|
|
162
161
|
};
|
|
@@ -169,11 +168,11 @@ class WorkerService {
|
|
|
169
168
|
const appVersion = app?.version;
|
|
170
169
|
if (isNaN(appVersion)) {
|
|
171
170
|
try {
|
|
172
|
-
await hotMesh.deploy(getActivityYAML(activityTopic, version));
|
|
171
|
+
await hotMesh.deploy((0, factory_1.getActivityYAML)(activityTopic, version));
|
|
173
172
|
await hotMesh.activate(version);
|
|
174
173
|
}
|
|
175
174
|
catch (err) {
|
|
176
|
-
|
|
175
|
+
hotMesh.engine.logger.error('durable-worker-activity-deploy-activate-error', err);
|
|
177
176
|
throw err;
|
|
178
177
|
}
|
|
179
178
|
}
|
|
@@ -192,7 +191,7 @@ class WorkerService {
|
|
|
192
191
|
class: config.connection.class,
|
|
193
192
|
options: config.connection.options
|
|
194
193
|
};
|
|
195
|
-
const hmshInstance = await
|
|
194
|
+
const hmshInstance = await hotmesh_1.HotMeshService.init({
|
|
196
195
|
appId: workflowTopic,
|
|
197
196
|
engine: { redis: redisConfig },
|
|
198
197
|
workers: [
|
|
@@ -218,21 +217,20 @@ class WorkerService {
|
|
|
218
217
|
context.set('workflowName', workflowTopic.split('-').pop());
|
|
219
218
|
context.set('workflowTrace', data.metadata.trc);
|
|
220
219
|
context.set('workflowSpan', data.metadata.spn);
|
|
221
|
-
const workflowResponse = await asyncLocalStorage.run(context, async () => {
|
|
220
|
+
const workflowResponse = await asyncLocalStorage_1.asyncLocalStorage.run(context, async () => {
|
|
222
221
|
return await workflowFunction.apply(this, workflowInput.arguments);
|
|
223
222
|
});
|
|
224
223
|
return {
|
|
225
224
|
code: 200,
|
|
226
|
-
status: StreamStatus.SUCCESS,
|
|
225
|
+
status: stream_1.StreamStatus.SUCCESS,
|
|
227
226
|
metadata: { ...data.metadata },
|
|
228
227
|
data: { response: workflowResponse }
|
|
229
228
|
};
|
|
230
229
|
}
|
|
231
230
|
catch (err) {
|
|
232
|
-
//todo: (retryable error types)
|
|
233
231
|
return {
|
|
232
|
+
status: stream_1.StreamStatus.ERROR,
|
|
234
233
|
code: 500,
|
|
235
|
-
status: StreamStatus.PENDING,
|
|
236
234
|
metadata: { ...data.metadata },
|
|
237
235
|
data: { error: err }
|
|
238
236
|
};
|
|
@@ -253,12 +251,12 @@ WorkerService.getHotMesh = async (worflowTopic) => {
|
|
|
253
251
|
if (WorkerService.instances.has(worflowTopic)) {
|
|
254
252
|
return await WorkerService.instances.get(worflowTopic);
|
|
255
253
|
}
|
|
256
|
-
const hotMesh =
|
|
254
|
+
const hotMesh = hotmesh_1.HotMeshService.init({
|
|
257
255
|
appId: worflowTopic,
|
|
258
256
|
engine: { redis: { ...WorkerService.connection } }
|
|
259
257
|
});
|
|
260
258
|
WorkerService.instances.set(worflowTopic, hotMesh);
|
|
261
|
-
await WorkerService.activateWorkflow(await hotMesh, worflowTopic, getWorkflowYAML);
|
|
259
|
+
await WorkerService.activateWorkflow(await hotMesh, worflowTopic, factory_1.getWorkflowYAML);
|
|
262
260
|
return hotMesh;
|
|
263
261
|
};
|
|
264
262
|
WorkerService.Context = {
|
|
@@ -269,4 +267,4 @@ WorkerService.Context = {
|
|
|
269
267
|
};
|
|
270
268
|
},
|
|
271
269
|
};
|
|
272
|
-
|
|
270
|
+
exports.WorkerService = WorkerService;
|
|
@@ -33,8 +33,10 @@ Here is an example of how the methods in this file are used:
|
|
|
33
33
|
./workflows.ts
|
|
34
34
|
|
|
35
35
|
import { Durable } from '@hotmeshio/hotmesh';
|
|
36
|
-
import
|
|
36
|
+
import * as activities from './activities';
|
|
37
|
+
|
|
37
38
|
const { greet } = Durable.workflow.proxyActivities<typeof activities>({
|
|
39
|
+
activities: activities,
|
|
38
40
|
startToCloseTimeout: '1 minute',
|
|
39
41
|
retryPolicy: {
|
|
40
42
|
initialInterval: '5 seconds', // Initial delay between retries
|
|
@@ -71,6 +73,9 @@ class WorkflowService {
|
|
|
71
73
|
return result;
|
|
72
74
|
}
|
|
73
75
|
static proxyActivities(options) {
|
|
76
|
+
if (options.activities) {
|
|
77
|
+
worker_1.WorkerService.registerActivities(options.activities);
|
|
78
|
+
}
|
|
74
79
|
const proxy = {};
|
|
75
80
|
const keys = Object.keys(worker_1.WorkerService.activityRegistry);
|
|
76
81
|
if (keys.length) {
|
|
@@ -100,7 +105,11 @@ class WorkflowService {
|
|
|
100
105
|
try {
|
|
101
106
|
const hmshInstance = await worker_1.WorkerService.getHotMesh(activityTopic);
|
|
102
107
|
activityState = await hmshInstance.getState(activityTopic, activityJobId);
|
|
103
|
-
if (activityState.metadata.
|
|
108
|
+
if (activityState.metadata.err) {
|
|
109
|
+
await hmshInstance.scrub(activityJobId);
|
|
110
|
+
throw new Error(activityState.metadata.err);
|
|
111
|
+
}
|
|
112
|
+
else if (activityState.metadata.js === 0) {
|
|
104
113
|
//return immediately
|
|
105
114
|
return activityState.data?.response;
|
|
106
115
|
}
|
|
@@ -50,6 +50,9 @@ class MapperService {
|
|
|
50
50
|
return transitionRule;
|
|
51
51
|
}
|
|
52
52
|
if (code.toString() === (transitionRule.code || 200).toString()) {
|
|
53
|
+
if (!transitionRule.match) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
53
56
|
const orGate = transitionRule.gate === 'or';
|
|
54
57
|
let allAreTrue = true;
|
|
55
58
|
let someAreTrue = false;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MetricTypes } from "./stats";
|
|
2
2
|
import { StreamRetryPolicy } from "./stream";
|
|
3
|
-
type ActivityExecutionType = 'trigger' | 'await' | 'worker' | 'activity' | 'emit' | 'iterate';
|
|
3
|
+
type ActivityExecutionType = 'trigger' | 'await' | 'worker' | 'activity' | 'emit' | 'iterate' | 'cycle';
|
|
4
4
|
type Consumes = Record<string, string[]>;
|
|
5
5
|
interface BaseActivity {
|
|
6
6
|
title?: string;
|
|
@@ -15,6 +15,7 @@ interface BaseActivity {
|
|
|
15
15
|
sleep?: number;
|
|
16
16
|
expire?: number;
|
|
17
17
|
retry?: StreamRetryPolicy;
|
|
18
|
+
cycle?: boolean;
|
|
18
19
|
collationInt?: number;
|
|
19
20
|
consumes?: Consumes;
|
|
20
21
|
PRODUCES?: string[];
|
|
@@ -55,6 +56,10 @@ interface WorkerActivity extends BaseActivity {
|
|
|
55
56
|
interface EmitActivity extends BaseActivity {
|
|
56
57
|
type: 'emit';
|
|
57
58
|
}
|
|
59
|
+
interface CycleActivity extends BaseActivity {
|
|
60
|
+
type: 'cycle';
|
|
61
|
+
ancestor: string;
|
|
62
|
+
}
|
|
58
63
|
interface IterateActivity extends BaseActivity {
|
|
59
64
|
type: 'iterate';
|
|
60
65
|
}
|
|
@@ -84,4 +89,4 @@ type ActivityDataType = {
|
|
|
84
89
|
hook?: Record<string, unknown>;
|
|
85
90
|
};
|
|
86
91
|
type ActivityLeg = 1 | 2;
|
|
87
|
-
export { ActivityContext, ActivityData, ActivityDataType, ActivityDuplex, ActivityLeg, ActivityMetadata, ActivityType, Consumes, TriggerActivityStats, AwaitActivity, BaseActivity, EmitActivity, IterateActivity, TriggerActivity, WorkerActivity };
|
|
92
|
+
export { ActivityContext, ActivityData, ActivityDataType, ActivityDuplex, ActivityLeg, ActivityMetadata, ActivityType, Consumes, TriggerActivityStats, AwaitActivity, CycleActivity, BaseActivity, EmitActivity, IterateActivity, TriggerActivity, WorkerActivity };
|
|
@@ -34,10 +34,7 @@ type WorkerConfig = {
|
|
|
34
34
|
connection: Connection;
|
|
35
35
|
namespace: string;
|
|
36
36
|
taskQueue: string;
|
|
37
|
-
|
|
38
|
-
activities: {
|
|
39
|
-
[key: string]: Function;
|
|
40
|
-
};
|
|
37
|
+
workflow: Function;
|
|
41
38
|
};
|
|
42
39
|
type ContextType = {
|
|
43
40
|
workflowId: string;
|
|
@@ -48,8 +45,9 @@ type ProxyType<ACT> = {
|
|
|
48
45
|
[K in keyof ACT]: FunctionSignature<ACT[K]>;
|
|
49
46
|
};
|
|
50
47
|
type ActivityConfig = {
|
|
51
|
-
startToCloseTimeout
|
|
52
|
-
|
|
48
|
+
startToCloseTimeout?: string;
|
|
49
|
+
activities?: any;
|
|
50
|
+
retryPolicy?: {
|
|
53
51
|
initialInterval: string;
|
|
54
52
|
maximumAttempts: number;
|
|
55
53
|
backoffCoefficient: number;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { ActivityType, ActivityDataType, ActivityContext, ActivityData, ActivityDuplex, ActivityLeg, ActivityMetadata, Consumes, AwaitActivity, BaseActivity, EmitActivity, WorkerActivity, IterateActivity, TriggerActivity, TriggerActivityStats } from './activity';
|
|
1
|
+
export { ActivityType, ActivityDataType, ActivityContext, ActivityData, ActivityDuplex, ActivityLeg, ActivityMetadata, Consumes, AwaitActivity, BaseActivity, CycleActivity, EmitActivity, WorkerActivity, IterateActivity, TriggerActivity, TriggerActivityStats } from './activity';
|
|
2
2
|
export { App, AppVID, AppTransitions, AppSubscriptions } from './app';
|
|
3
3
|
export { AsyncSignal } from './async';
|
|
4
4
|
export { CacheMode } from './cache';
|
package/package.json
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hotmeshio/hotmesh",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"description": "Durable Workflows",
|
|
5
|
-
"main": "build/
|
|
6
|
-
"
|
|
7
|
-
"types": "build/cjs/index.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
"import": "./build/esm/index.js",
|
|
10
|
-
"require": "./build/cjs/index.js"
|
|
11
|
-
},
|
|
5
|
+
"main": "build/index.js",
|
|
6
|
+
"types": "build/index.d.ts",
|
|
12
7
|
"repository": {
|
|
13
8
|
"type": "git",
|
|
14
9
|
"url": "https://github.com/hotmeshio/sdk-typescript.git"
|
|
@@ -19,9 +14,7 @@
|
|
|
19
14
|
},
|
|
20
15
|
"scripts": {
|
|
21
16
|
"clean": "rimraf ./build",
|
|
22
|
-
"build
|
|
23
|
-
"build:esm": "tsc --build tsconfig.esm.json",
|
|
24
|
-
"build": "npm run build:cjs && npm run build:esm",
|
|
17
|
+
"build": "tsc --build tsconfig.json",
|
|
25
18
|
"clean-build": "npm run clean && npm run build",
|
|
26
19
|
"lint": "eslint . --ext .ts",
|
|
27
20
|
"lint:fix": "eslint . --fix --ext .ts",
|
|
@@ -29,6 +22,7 @@
|
|
|
29
22
|
"test": "NODE_ENV=test jest --detectOpenHandles --forceExit --verbose",
|
|
30
23
|
"test:hmsh": "NODE_ENV=test jest ./tests/functional/index.test.ts --detectOpenHandles --verbose",
|
|
31
24
|
"test:compile": "NODE_ENV=test jest ./tests/functional/compile/index.test.ts --detectOpenHandles --forceExit --verbose",
|
|
25
|
+
"test:cycle": "NODE_ENV=test jest ./tests/functional/cycle/index.test.ts --detectOpenHandles --forceExit --verbose",
|
|
32
26
|
"test:connect": "NODE_ENV=test jest ./tests/unit/services/connector/index.test.ts --detectOpenHandles --forceExit --verbose",
|
|
33
27
|
"test:connect:redis": "NODE_ENV=test jest ./tests/unit/services/connector/clients/redis.test.ts --detectOpenHandles --forceExit --verbose",
|
|
34
28
|
"test:connect:ioredis": "NODE_ENV=test jest ./tests/unit/services/connector/clients/ioredis.test.ts --detectOpenHandles --forceExit --verbose",
|
|
@@ -48,6 +42,7 @@
|
|
|
48
42
|
"test:durable": "NODE_ENV=test jest ./tests/durable/*/index.test.ts --detectOpenHandles --forceExit --verbose",
|
|
49
43
|
"test:durable:hello": "NODE_ENV=test jest ./tests/durable/helloworld/index.test.ts --detectOpenHandles --forceExit --verbose",
|
|
50
44
|
"test:durable:goodbye": "NODE_ENV=test jest ./tests/durable/goodbye/index.test.ts --detectOpenHandles --forceExit --verbose",
|
|
45
|
+
"test:durable:retry": "NODE_ENV=test jest ./tests/durable/retry/index.test.ts --detectOpenHandles --forceExit --verbose",
|
|
51
46
|
"test:durable:loopactivity": "NODE_ENV=test jest ./tests/durable/loopactivity/index.test.ts --detectOpenHandles --forceExit --verbose",
|
|
52
47
|
"test:durable:nested": "NODE_ENV=test jest ./tests/durable/nested/index.test.ts --detectOpenHandles --forceExit --verbose"
|
|
53
48
|
},
|
|
@@ -129,7 +129,7 @@ class Activity {
|
|
|
129
129
|
this.leg = leg;
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
//********
|
|
132
|
+
//******** SIGNAL RE-ENTRY POINT ********//
|
|
133
133
|
doesHook(): boolean {
|
|
134
134
|
return !!(this.config.hook?.topic || this.config.sleep);
|
|
135
135
|
}
|
|
@@ -170,11 +170,6 @@ class Activity {
|
|
|
170
170
|
return await this.processHookEvent(jobId);
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
-
//todo: hooks are currently singletons. but they can support
|
|
174
|
-
// dimensional threads like `await` and `worker` do.
|
|
175
|
-
// Copy code from those activities to support cyclical
|
|
176
|
-
// timehook and eventhook inputs by adding a 'pending'
|
|
177
|
-
// flag to hooks that allows for repeated signals
|
|
178
173
|
async processHookEvent(jobId: string): Promise<JobStatus | void> {
|
|
179
174
|
this.logger.debug('activity-process-hook-event', { jobId });
|
|
180
175
|
let telemetry: TelemetryService;
|
|
@@ -207,7 +202,6 @@ class Activity {
|
|
|
207
202
|
telemetry.setActivityAttributes(attrs);
|
|
208
203
|
return jobStatus as number;
|
|
209
204
|
} catch (error) {
|
|
210
|
-
console.error('this error?', error);
|
|
211
205
|
this.logger.error('engine-process-hook-event-error', error);
|
|
212
206
|
telemetry.setActivityError(error.message);
|
|
213
207
|
throw error;
|
|
@@ -216,6 +210,95 @@ class Activity {
|
|
|
216
210
|
}
|
|
217
211
|
}
|
|
218
212
|
|
|
213
|
+
//******** DUPLEX RE-ENTRY POINT ********//
|
|
214
|
+
async processEvent(status: StreamStatus = StreamStatus.SUCCESS, code: StreamCode = 200): Promise<void> {
|
|
215
|
+
this.setLeg(2);
|
|
216
|
+
const jid = this.context.metadata.jid;
|
|
217
|
+
const aid = this.metadata.aid;
|
|
218
|
+
this.status = status;
|
|
219
|
+
this.code = code;
|
|
220
|
+
this.logger.debug('activity-process-event', { topic: this.config.subtype, jid, aid, status, code });
|
|
221
|
+
let telemetry: TelemetryService;
|
|
222
|
+
try {
|
|
223
|
+
await this.getState();
|
|
224
|
+
const aState = await CollatorService.notarizeReentry(this);
|
|
225
|
+
this.adjacentIndex = CollatorService.getDimensionalIndex(aState);
|
|
226
|
+
|
|
227
|
+
telemetry = new TelemetryService(this.engine.appId, this.config, this.metadata, this.context);
|
|
228
|
+
let isComplete = CollatorService.isActivityComplete(this.context.metadata.js);
|
|
229
|
+
|
|
230
|
+
if (isComplete) {
|
|
231
|
+
this.logger.warn('activity-process-event-duplicate', { jid, aid });
|
|
232
|
+
this.logger.debug('activity-process-event-duplicate-resolution', { resolution: 'Increase HotMesh config `reclaimDelay` timeout.' });
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
telemetry.startActivitySpan(this.leg);
|
|
237
|
+
let multiResponse: MultiResponseFlags;
|
|
238
|
+
if (status === StreamStatus.PENDING) {
|
|
239
|
+
multiResponse = await this.processPending(telemetry);
|
|
240
|
+
} else if (status === StreamStatus.SUCCESS) {
|
|
241
|
+
multiResponse = await this.processSuccess(telemetry);
|
|
242
|
+
} else {
|
|
243
|
+
multiResponse = await this.processError(telemetry);
|
|
244
|
+
}
|
|
245
|
+
this.transitionAdjacent(multiResponse, telemetry);
|
|
246
|
+
} catch (error) {
|
|
247
|
+
this.logger.error('activity-process-event-error', error);
|
|
248
|
+
telemetry.setActivityError(error.message);
|
|
249
|
+
throw error;
|
|
250
|
+
} finally {
|
|
251
|
+
telemetry.endActivitySpan();
|
|
252
|
+
this.logger.debug('activity-process-event-end', { jid, aid });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
async processPending(telemetry: TelemetryService): Promise<MultiResponseFlags> {
|
|
257
|
+
this.bindActivityData('output');
|
|
258
|
+
this.adjacencyList = await this.filterAdjacent();
|
|
259
|
+
this.mapJobData();
|
|
260
|
+
const multi = this.store.getMulti();
|
|
261
|
+
await this.setState(multi);
|
|
262
|
+
await CollatorService.notarizeContinuation(this, multi);
|
|
263
|
+
|
|
264
|
+
await this.setStatus(this.adjacencyList.length, multi);
|
|
265
|
+
return await multi.exec() as MultiResponseFlags;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async processSuccess(telemetry: TelemetryService): Promise<MultiResponseFlags> {
|
|
269
|
+
this.bindActivityData('output');
|
|
270
|
+
this.adjacencyList = await this.filterAdjacent();
|
|
271
|
+
this.mapJobData();
|
|
272
|
+
const multi = this.store.getMulti();
|
|
273
|
+
await this.setState(multi);
|
|
274
|
+
await CollatorService.notarizeCompletion(this, multi);
|
|
275
|
+
|
|
276
|
+
await this.setStatus(this.adjacencyList.length - 1, multi);
|
|
277
|
+
return await multi.exec() as MultiResponseFlags;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
async processError(telemetry: TelemetryService): Promise<MultiResponseFlags> {
|
|
281
|
+
this.bindActivityError(this.data);
|
|
282
|
+
this.adjacencyList = await this.filterAdjacent();
|
|
283
|
+
const multi = this.store.getMulti();
|
|
284
|
+
await this.setState(multi);
|
|
285
|
+
await CollatorService.notarizeCompletion(this, multi);
|
|
286
|
+
|
|
287
|
+
await this.setStatus(this.adjacencyList.length - 1, multi);
|
|
288
|
+
return await multi.exec() as MultiResponseFlags;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
async transitionAdjacent(multiResponse: MultiResponseFlags, telemetry: TelemetryService): Promise<void> {
|
|
292
|
+
telemetry.mapActivityAttributes();
|
|
293
|
+
const jobStatus = this.resolveStatus(multiResponse);
|
|
294
|
+
const attrs: StringScalarType = { 'app.job.jss': jobStatus };
|
|
295
|
+
const messageIds = await this.transition(this.adjacencyList, jobStatus);
|
|
296
|
+
if (messageIds.length) {
|
|
297
|
+
attrs['app.activity.mids'] = messageIds.join(',')
|
|
298
|
+
}
|
|
299
|
+
telemetry.setActivityAttributes(attrs);
|
|
300
|
+
}
|
|
301
|
+
|
|
219
302
|
resolveStatus(multiResponse: MultiResponseFlags): number {
|
|
220
303
|
const activityStatus = multiResponse[multiResponse.length - 1];
|
|
221
304
|
if (Array.isArray(activityStatus)) {
|