@hamim_4444/pulsar 0.0.0-stage → 1.0.1
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 +14 -2
- package/dist/cluster/Nebula.d.ts +30 -0
- package/dist/cluster/Nebula.d.ts.map +1 -0
- package/dist/dispatch/ConsumerDispatch.d.ts +9 -0
- package/dist/dispatch/ConsumerDispatch.d.ts.map +1 -0
- package/dist/dispatch/Dispatcher.d.ts +6 -0
- package/dist/dispatch/Dispatcher.d.ts.map +1 -0
- package/dist/dispatch/HandlerDispatcher.d.ts +7 -0
- package/dist/dispatch/HandlerDispatcher.d.ts.map +1 -0
- package/dist/dispatch/HttpDispatcher.d.ts +7 -0
- package/dist/dispatch/HttpDispatcher.d.ts.map +1 -0
- package/dist/dispatch/dispatchTypes.d.ts +12 -0
- package/dist/dispatch/dispatchTypes.d.ts.map +1 -0
- package/dist/helpers/computeConfigDelta.d.ts +18 -0
- package/dist/helpers/computeConfigDelta.d.ts.map +1 -0
- package/dist/helpers/defineQueue.d.ts +13 -0
- package/dist/helpers/defineQueue.d.ts.map +1 -0
- package/dist/helpers/generateShaHash.d.ts +2 -0
- package/dist/helpers/generateShaHash.d.ts.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +42 -0
- package/dist/integrations/PulsarEventsIntegrations.d.ts +7 -0
- package/dist/integrations/PulsarEventsIntegrations.d.ts.map +1 -0
- package/dist/integrations/PulsarLoggerIntegrations.d.ts +12 -0
- package/dist/integrations/PulsarLoggerIntegrations.d.ts.map +1 -0
- package/dist/integrations/index.d.ts +4 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +3 -0
- package/dist/integrations/index.js.map +15 -0
- package/dist/modules/Queue.module.d.ts +45 -0
- package/dist/modules/Queue.module.d.ts.map +1 -0
- package/dist/modules/Scheduler.module.d.ts +42 -0
- package/dist/modules/Scheduler.module.d.ts.map +1 -0
- package/dist/modules/Tick.module.d.ts +38 -0
- package/dist/modules/Tick.module.d.ts.map +1 -0
- package/dist/modules/TickController.module.d.ts +36 -0
- package/dist/modules/TickController.module.d.ts.map +1 -0
- package/dist/monitoring/PulsarMonitoringStreamProducer.d.ts +2 -0
- package/dist/monitoring/PulsarMonitoringStreamProducer.d.ts.map +1 -0
- package/dist/monitoring/index.d.ts +2 -0
- package/dist/monitoring/index.d.ts.map +1 -0
- package/dist/monitoring/server/PulsarMonitoringStream.d.ts +2 -0
- package/dist/monitoring/server/PulsarMonitoringStream.d.ts.map +1 -0
- package/dist/network/NetworkInterface.d.ts +12 -0
- package/dist/network/NetworkInterface.d.ts.map +1 -0
- package/dist/network/UnifiedTransportManager.d.ts +19 -0
- package/dist/network/UnifiedTransportManager.d.ts.map +1 -0
- package/dist/network/abstract/BaseNetworkDriver.d.ts +18 -0
- package/dist/network/abstract/BaseNetworkDriver.d.ts.map +1 -0
- package/dist/network/auth/Authenticator.d.ts +2 -0
- package/dist/network/auth/Authenticator.d.ts.map +1 -0
- package/dist/network/drivers/HttpNetworkDriver.d.ts +30 -0
- package/dist/network/drivers/HttpNetworkDriver.d.ts.map +1 -0
- package/dist/network/drivers/ServerlessNetworkDriver.d.ts +13 -0
- package/dist/network/drivers/ServerlessNetworkDriver.d.ts.map +1 -0
- package/dist/network/drivers/WebSocketNetworkDriver.d.ts +24 -0
- package/dist/network/drivers/WebSocketNetworkDriver.d.ts.map +1 -0
- package/dist/network/helpers/httpQueueOperations.d.ts +2 -0
- package/dist/network/helpers/httpQueueOperations.d.ts.map +1 -0
- package/dist/network/interfaces/network.types.d.ts +13 -0
- package/dist/network/interfaces/network.types.d.ts.map +1 -0
- package/dist/run/Queues.d.ts +2 -0
- package/dist/run/Queues.d.ts.map +1 -0
- package/dist/run/index.d.ts +2 -0
- package/dist/run/index.d.ts.map +1 -0
- package/dist/run/index2.d.ts +2 -0
- package/dist/run/index2.d.ts.map +1 -0
- package/dist/runtimes/IsolateRuntime.d.ts +17 -0
- package/dist/runtimes/IsolateRuntime.d.ts.map +1 -0
- package/dist/runtimes/PersistentRuntime.d.ts +21 -0
- package/dist/runtimes/PersistentRuntime.d.ts.map +1 -0
- package/dist/runtimes/ServerlessRuntime.d.ts +15 -0
- package/dist/runtimes/ServerlessRuntime.d.ts.map +1 -0
- package/dist/runtimes/runtimeTypes.d.ts +15 -0
- package/dist/runtimes/runtimeTypes.d.ts.map +1 -0
- package/dist/server/PulsarRequestHandler.d.ts +41 -0
- package/dist/server/PulsarRequestHandler.d.ts.map +1 -0
- package/dist/server/helpers/acquireRedisLock.d.ts +14 -0
- package/dist/server/helpers/acquireRedisLock.d.ts.map +1 -0
- package/dist/server/helpers/checkFencingValidity.d.ts +14 -0
- package/dist/server/helpers/checkFencingValidity.d.ts.map +1 -0
- package/dist/server/helpers/performIsolateRestart.d.ts +20 -0
- package/dist/server/helpers/performIsolateRestart.d.ts.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +53 -0
- package/dist/server/index.js.map +20 -0
- package/dist/server/parser/parseRequest.d.ts +10 -0
- package/dist/server/parser/parseRequest.d.ts.map +1 -0
- package/dist/server/utility/extract-headers.d.ts +13 -0
- package/dist/server/utility/extract-headers.d.ts.map +1 -0
- package/dist/service/ConfigurationStore.d.ts +23 -0
- package/dist/service/ConfigurationStore.d.ts.map +1 -0
- package/dist/service/Isolate.service.d.ts +12 -0
- package/dist/service/Isolate.service.d.ts.map +1 -0
- package/dist/service/Pulsar.service.d.ts +40 -0
- package/dist/service/Pulsar.service.d.ts.map +1 -0
- package/dist/service/PulsarBaseService.d.ts +51 -0
- package/dist/service/PulsarBaseService.d.ts.map +1 -0
- package/dist/service/PulsarEventBus.d.ts +33 -0
- package/dist/service/PulsarEventBus.d.ts.map +1 -0
- package/dist/service/SwarmBudgetTracker.d.ts +14 -0
- package/dist/service/SwarmBudgetTracker.d.ts.map +1 -0
- package/dist/service/consumers/PulsarWorker.d.ts +10 -0
- package/dist/service/consumers/PulsarWorker.d.ts.map +1 -0
- package/dist/shared/PulsarRuntimeCore.d.ts +55 -0
- package/dist/shared/PulsarRuntimeCore.d.ts.map +1 -0
- package/dist/static/TimingProfile.d.ts +9 -0
- package/dist/static/TimingProfile.d.ts.map +1 -0
- package/dist/static/static.d.ts +3 -0
- package/dist/static/static.d.ts.map +1 -0
- package/dist/storage/PulsarStorage.d.ts +42 -0
- package/dist/storage/PulsarStorage.d.ts.map +1 -0
- package/dist/storage/drivers/PostgresDriver.d.ts +20 -0
- package/dist/storage/drivers/PostgresDriver.d.ts.map +1 -0
- package/dist/storage/drivers/RedisDriver.d.ts +20 -0
- package/dist/storage/drivers/RedisDriver.d.ts.map +1 -0
- package/dist/storage/drivers/types.d.ts +27 -0
- package/dist/storage/drivers/types.d.ts.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +393 -0
- package/dist/storage/index.js.map +25 -0
- package/dist/storage/repositories/PostgresEngineOperationRepository.d.ts +39 -0
- package/dist/storage/repositories/PostgresEngineOperationRepository.d.ts.map +1 -0
- package/dist/storage/repositories/PostgresQueueRepository.d.ts +25 -0
- package/dist/storage/repositories/PostgresQueueRepository.d.ts.map +1 -0
- package/dist/storage/repositories/QueueRepository.d.ts +19 -0
- package/dist/storage/repositories/QueueRepository.d.ts.map +1 -0
- package/dist/storage/repositories/RedisQueueRepository.d.ts +27 -0
- package/dist/storage/repositories/RedisQueueRepository.d.ts.map +1 -0
- package/dist/subsys/DeferredTickEvaluator.d.ts +23 -0
- package/dist/subsys/DeferredTickEvaluator.d.ts.map +1 -0
- package/dist/subsys/EventBus.d.ts +13 -0
- package/dist/subsys/EventBus.d.ts.map +1 -0
- package/dist/subsys/ExecutionProfileSwitcher.d.ts +10 -0
- package/dist/subsys/ExecutionProfileSwitcher.d.ts.map +1 -0
- package/dist/subsys/LoggerService.d.ts +15 -0
- package/dist/subsys/LoggerService.d.ts.map +1 -0
- package/dist/subsys/PulsarClock.d.ts +32 -0
- package/dist/subsys/PulsarClock.d.ts.map +1 -0
- package/dist/subsys/RuntimeCacheStorage.d.ts +18 -0
- package/dist/subsys/RuntimeCacheStorage.d.ts.map +1 -0
- package/dist/subsys/RuntimeEventBridge.d.ts +14 -0
- package/dist/subsys/RuntimeEventBridge.d.ts.map +1 -0
- package/dist/transport/PulsarTransportManager.d.ts +10 -0
- package/dist/transport/PulsarTransportManager.d.ts.map +1 -0
- package/dist/transport/strategies/PollingTransport.d.ts +13 -0
- package/dist/transport/strategies/PollingTransport.d.ts.map +1 -0
- package/dist/transport/strategies/TcpListenTransport.d.ts +11 -0
- package/dist/transport/strategies/TcpListenTransport.d.ts.map +1 -0
- package/dist/transport/strategies/WebhookTransport.d.ts +9 -0
- package/dist/transport/strategies/WebhookTransport.d.ts.map +1 -0
- package/dist/transport/types.d.ts +41 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/types/base.types.d.ts +54 -0
- package/dist/types/base.types.d.ts.map +1 -0
- package/dist/types/config.types.d.ts +54 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/consumer.types.d.ts +36 -0
- package/dist/types/consumer.types.d.ts.map +1 -0
- package/dist/types/engine.types.d.ts +115 -0
- package/dist/types/engine.types.d.ts.map +1 -0
- package/dist/types/eventTriggerStrategry.types.d.ts +34 -0
- package/dist/types/eventTriggerStrategry.types.d.ts.map +1 -0
- package/dist/types/integrations.types.d.ts +16 -0
- package/dist/types/integrations.types.d.ts.map +1 -0
- package/dist/types/nebula.types.d.ts +65 -0
- package/dist/types/nebula.types.d.ts.map +1 -0
- package/dist/types/queue.types.d.ts +95 -0
- package/dist/types/queue.types.d.ts.map +1 -0
- package/dist/types/runtime.types.d.ts +89 -0
- package/dist/types/runtime.types.d.ts.map +1 -0
- package/package.json +72 -5
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { IsolateInstance } from "../service/Isolate.service";
|
|
2
|
+
import type { Pulsar } from "../service/Pulsar.service";
|
|
3
|
+
import type { PulsarUnifiedStorage } from "../storage/PulsarStorage";
|
|
4
|
+
interface PulsarHandlerOptions {
|
|
5
|
+
unifiedStorage: PulsarUnifiedStorage;
|
|
6
|
+
getEngine: (instanceId: string) => Pulsar;
|
|
7
|
+
instanceId: string;
|
|
8
|
+
/**
|
|
9
|
+
* Optional isolate instance. Required only when Pulsar runtime is V8_ISOLATE.
|
|
10
|
+
*/
|
|
11
|
+
isolate?: IsolateInstance;
|
|
12
|
+
}
|
|
13
|
+
export type GetEngine = {
|
|
14
|
+
lockKey: string;
|
|
15
|
+
instanceId: string;
|
|
16
|
+
};
|
|
17
|
+
type StandardResponse = {
|
|
18
|
+
status: number;
|
|
19
|
+
message: string;
|
|
20
|
+
};
|
|
21
|
+
export type ErrorHook = (error: unknown) => Response | void;
|
|
22
|
+
declare class PulsarRequestHandlerBuilder {
|
|
23
|
+
private readonly opts;
|
|
24
|
+
private onErrorHook?;
|
|
25
|
+
constructor(opts: PulsarHandlerOptions);
|
|
26
|
+
onError(fn: ErrorHook): this;
|
|
27
|
+
handle(req: Request): Promise<StandardResponse>;
|
|
28
|
+
private getMessageIds;
|
|
29
|
+
private performBatchAction;
|
|
30
|
+
private handleAck;
|
|
31
|
+
private handleNack;
|
|
32
|
+
private handleRetry;
|
|
33
|
+
private handleReconcileConfiguration;
|
|
34
|
+
/**
|
|
35
|
+
* Handles the HTTP request lifecycle for Pulsar Engine.
|
|
36
|
+
*/
|
|
37
|
+
handleEngineExecution(req: Request): Promise<StandardResponse>;
|
|
38
|
+
}
|
|
39
|
+
export declare function createPulsarRequestHandler(opts: PulsarHandlerOptions): PulsarRequestHandlerBuilder;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=PulsarRequestHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PulsarRequestHandler.d.ts","sourceRoot":"","sources":["../../src/server/PulsarRequestHandler.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,UAAU,oBAAoB;IAC1B,cAAc,EAAG,oBAAoB,CAAC;IACtC,SAAS,EAAE,CAAC,UAAU,EAAG,MAAM,KAAK,MAAM,CAAC;IAC3C,UAAU,EAAG,MAAM,CAAC;IACpB;;OAEG;IACH,OAAO,CAAC,EAAG,eAAe,CAAC;CAC9B;AAGD,MAAM,MAAM,SAAS,GAAG;IACpB,OAAO,EAAG,MAAM,CAAC;IACjB,UAAU,EAAG,MAAM,CAAC;CACvB,CAAA;AAED,KAAK,gBAAgB,GAAG;IACpB,MAAM,EAAG,MAAM,CAAC;IAChB,OAAO,EAAG,MAAM,CAAC;CACpB,CAAA;AAOD,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAG,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC;AAE7D,cAAM,2BAA2B;IAGjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,WAAW,CAAC,CAAa;gBAEJ,IAAI,EAAG,oBAAoB;IAEjD,OAAO,CAAC,EAAE,EAAG,SAAS,GAAG,IAAI;IAKvB,MAAM,CAAC,GAAG,EAAG,OAAO;YAyBnB,aAAa;YA2Bb,kBAAkB;YA0BlB,SAAS;YAUT,UAAU;YAUV,WAAW;YAUX,4BAA4B;IAK1C;;OAEG;IACU,qBAAqB,CAAC,GAAG,EAAG,OAAO,GAAI,OAAO,CAAC,gBAAgB,CAAC;CA6GhF;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAG,oBAAoB,GAAI,2BAA2B,CAEpG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IQueueRepository } from "../../storage/repositories/QueueRepository";
|
|
2
|
+
interface IAquireInstanceLock {
|
|
3
|
+
repository: IQueueRepository;
|
|
4
|
+
isEventDriven: boolean;
|
|
5
|
+
targetQueue: string;
|
|
6
|
+
lastExecutionId: string;
|
|
7
|
+
instanceId: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function aquireInstanceLock({ repository, isEventDriven, lastExecutionId, targetQueue, instanceId }: IAquireInstanceLock): Promise<string | {
|
|
10
|
+
message: string;
|
|
11
|
+
status: number;
|
|
12
|
+
}>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=acquireRedisLock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acquireRedisLock.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/acquireRedisLock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAEnF,UAAU,mBAAmB;IACzB,UAAU,EAAG,gBAAgB,CAAC;IAC9B,aAAa,EAAG,OAAO,CAAC;IACxB,WAAW,EAAG,MAAM,CAAC;IACrB,eAAe,EAAG,MAAM,CAAC;IACzB,UAAU,EAAG,MAAM,CAAC;CACvB;AAED,wBAAsB,kBAAkB,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,EAAG,mBAAmB;;;GAsBrI"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IPulsarPostgresEngineOperationRepository } from "../../storage/repositories/PostgresEngineOperationRepository";
|
|
2
|
+
interface ICheckFencingTokenValidity {
|
|
3
|
+
isEventDriven: boolean;
|
|
4
|
+
executionOwner: string;
|
|
5
|
+
fencingToken?: string;
|
|
6
|
+
targetQueue: string;
|
|
7
|
+
ops: IPulsarPostgresEngineOperationRepository;
|
|
8
|
+
}
|
|
9
|
+
export declare function checkFencingTokenValidity({ executionOwner, fencingToken, isEventDriven, targetQueue, ops }: ICheckFencingTokenValidity): Promise<{
|
|
10
|
+
message: string;
|
|
11
|
+
status: number;
|
|
12
|
+
} | undefined>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=checkFencingValidity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkFencingValidity.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/checkFencingValidity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wCAAwC,EAAE,MAAM,8DAA8D,CAAC;AAE7H,UAAU,0BAA0B;IAChC,aAAa,EAAG,OAAO,CAAC;IACxB,cAAc,EAAG,MAAM,CAAC;IACxB,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,MAAM,CAAC;IACrB,GAAG,EAAG,wCAAwC,CAAA;CACjD;AAED,wBAAsB,yBAAyB,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,EAAE,EAAG,0BAA0B;;;eA8B7I"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Pulsar } from "../../service/Pulsar.service";
|
|
2
|
+
import type { IsolateInstance } from "../../service/Isolate.service";
|
|
3
|
+
import type { EnginePoolingMode } from "../../types/engine.types";
|
|
4
|
+
interface IEnginePerformRestart {
|
|
5
|
+
isRestarted: boolean;
|
|
6
|
+
isV8Isolate: boolean;
|
|
7
|
+
isolate?: IsolateInstance;
|
|
8
|
+
executionOwner: string;
|
|
9
|
+
lastIsolateId: string;
|
|
10
|
+
lastExecutionId: string;
|
|
11
|
+
poolerMode: EnginePoolingMode;
|
|
12
|
+
targetQueue: string;
|
|
13
|
+
engine: Pulsar;
|
|
14
|
+
}
|
|
15
|
+
export declare function performEngineRestart({ targetQueue, isRestarted, isV8Isolate, isolate, executionOwner, lastExecutionId, lastIsolateId, poolerMode, engine }: IEnginePerformRestart): Promise<{
|
|
16
|
+
message: string;
|
|
17
|
+
status: number;
|
|
18
|
+
} | undefined>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=performIsolateRestart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performIsolateRestart.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/performIsolateRestart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,UAAU,qBAAqB;IAC3B,WAAW,EAAG,OAAO,CAAC;IACtB,WAAW,EAAG,OAAO,CAAC;IACtB,OAAO,CAAC,EAAG,eAAe,CAAC;IAC3B,cAAc,EAAG,MAAM,CAAC;IACxB,aAAa,EAAG,MAAM,CAAC;IACvB,eAAe,EAAG,MAAM,CAAC;IACzB,UAAU,EAAG,iBAAiB,CAAC;IAC/B,WAAW,EAAG,MAAM,CAAC;IACrB,MAAM,EAAG,MAAM,CAAC;CACnB;AAED,wBAAsB,oBAAoB,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,EAAG,qBAAqB;;;eA6CxL"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
var T=Object.create;var{getPrototypeOf:g,defineProperty:N,getOwnPropertyNames:y}=Object;var b=Object.prototype.hasOwnProperty;function i(E){return this[E]}var m,h,d=(E,c,P)=>{var $=E!=null&&typeof E==="object";if($){var D=c?m??=new WeakMap:h??=new WeakMap,L=D.get(E);if(L)return L}P=E!=null?T(g(E)):{};let C=c||!E||!E.__esModule?N(P,"default",{value:E,enumerable:!0}):P;for(let A of y(E))if(!b.call(C,A))N(C,A,{get:i.bind(E,A),enumerable:!0});if($)D.set(E,C);return C};var s=(E,c)=>()=>(c||E((c={exports:{}}).exports,c),c.exports);class V{sql;constructor(E){this.sql=E.db.getNativeClient()}async triggerUrl({body:E={},delaySeconds:c=0,headers:P={"Content-Type":"application/json"},url:$}){return await this.sql`
|
|
2
|
+
select public.schedule_http_request(
|
|
3
|
+
${$},
|
|
4
|
+
${c},
|
|
5
|
+
'POST',
|
|
6
|
+
${this.sql.json(E)},
|
|
7
|
+
${this.sql.json(P)}
|
|
8
|
+
) as job_id;
|
|
9
|
+
`,!0}async send(E,c,P=0){let $=JSON.stringify(c);return(await this.sql`SELECT pgmq.send( ${E}, ${$}::jsonb, ${P} ) AS msg_id `)[0]?.msg_id}async readFifo(E,c,P,$="grouped"){let D="pgmq.read_grouped";if($==="rr")D="pgmq.read_grouped_rr";if($==="head")D="pgmq.read_grouped_head";return[]}async read(E,c=30,P=1){return await this.sql`
|
|
10
|
+
SELECT *
|
|
11
|
+
FROM pgmq.read(
|
|
12
|
+
${E},
|
|
13
|
+
${c},
|
|
14
|
+
${P}
|
|
15
|
+
)
|
|
16
|
+
`}async ack(E,c){let P=await this.sql`
|
|
17
|
+
SELECT pgmq.delete(
|
|
18
|
+
${E}::text,
|
|
19
|
+
${c.toString()}::bigint
|
|
20
|
+
) AS deleted
|
|
21
|
+
`;return Boolean(P[0]?.deleted)}async ackBatch(E,c){if(!c||c.length===0)return!0;let P=c.map((D)=>D.toString());return(await this.sql`
|
|
22
|
+
SELECT pgmq.delete(
|
|
23
|
+
${E}::text,
|
|
24
|
+
${P}::bigint[]
|
|
25
|
+
) AS deleted
|
|
26
|
+
`).length>0}async retryBatch(E,c){if(c.length===0)return 0;let P=c.map((D)=>D.toString());return(await this.sql`
|
|
27
|
+
SELECT pgmq.set_vt(
|
|
28
|
+
${E},
|
|
29
|
+
id::bigint,
|
|
30
|
+
0
|
|
31
|
+
) AS set_vt
|
|
32
|
+
FROM unnest(${P}::bigint[]) AS id
|
|
33
|
+
`).filter((D)=>Boolean(D.set_vt)).length}async retry(E,c){let P=await this.sql`
|
|
34
|
+
SELECT pgmq.set_vt(
|
|
35
|
+
${E},
|
|
36
|
+
${c.toString()},
|
|
37
|
+
0
|
|
38
|
+
) AS set_vt
|
|
39
|
+
`;return Boolean(P[0]?.set_vt)}async delayRetry(E,c,P){let $=await this.sql`
|
|
40
|
+
SELECT pgmq.set_vt(
|
|
41
|
+
${E},
|
|
42
|
+
${c.toString()},
|
|
43
|
+
${P}
|
|
44
|
+
) AS set_vt
|
|
45
|
+
`;return Boolean($[0]?.set_vt)}async getSingleQueueMetrics(E){try{let c=await this.sql`SELECT * FROM pgmq.get_single_queue_metrics(${E})`,P=Array.from(c);if(!P.length)return null;let $=P[0];return{queueName:$.queue_name,readyJobs:Number($.ready_jobs??0),delayedJobs:Number($.delayed_jobs??0),total:Number($.total_jobs??0),nextVisibleAt:$.next_visible_at?new Date($.next_visible_at).getTime():null}}catch(c){return console.error(`Failed to fetch metrics for queue: ${E}`,c),null}}async getAllQueueMetrics(){let E=await this.sql`SELECT * FROM pgmq.get_queue_metrics()`;return Array.from(E).map((c)=>({queue_name:c.queue_name,ready_jobs:Number(c.ready_jobs),delayed_jobs:Number(c.delayed_jobs),total:Number(c.total_jobs),next_visible_at:Number(c.next_visible_at)}))}async closeQueue(){await this.sql.end()}}async function n({repository:E,isEventDriven:c,lastExecutionId:P,targetQueue:$,instanceId:D}){let L=c?`lock:edp:${$}`:"lock:idp",C=120000;if(await E.acquireQueueLock(L,P,120000))await E.clearDispatchPending(L);else return console.log(`[LOCK REJECTED] : Active execution lock already held for key: ${L}`),{message:"Isolate active, skipping redundant run.",status:200};return L}async function F({executionOwner:E,fencingToken:c,isEventDriven:P,targetQueue:$,ops:D}){if(P&&E=="trigger"){if(!c||c=="NOT_INCLUDED"){let C=`[EventDrivenPoller]-[ExecutionTrigger]-[${$}] : Engine execution rejected: Fencing token is missing.`;return console.error(C),{message:C,status:200}}if(!await D.checkFencingTokenValidity($,c)){let C=`[EventDrivenPoller]-[ExecutionTrigger]-[${$}] : Engine execution rejected : Invalid fencing token.`;return console.error(C),{message:C,status:200}}else console.log("[EventDrivenPoller] : Engine started via DB trigger",{queue:$,currentToken:c,previousToken:isNaN(parseInt(c,10))?null:parseInt(c,10)-1})}}async function k({targetQueue:E,isRestarted:c,isV8Isolate:P,isolate:$,executionOwner:D,lastExecutionId:L,lastIsolateId:C,poolerMode:A,engine:o}){let M=$?.uptime??0,O=$?.maxTime??1/0,U=P&&M>=O;if(c&&P&&$){if(console.log(`[Pulsar] : Engine Restarted By (${D==="watchdog"?"watchdog":"self"})`),$.isSameIsolate(C))console.log(`[Pulsar] : Engine Restarted in same isolate (${$.id}), Header Isolate (${C})`);if(U){console.log(`[${new Date().toISOString()}]: Engine Restarted With Network Call due to isolate recycling.`);let _={"content-type":"application/json","x-last-execution-id":L,"x-last-execution-at":new Date().toISOString(),"x-execution-owner":D,"x-restart":c?"true":"false","x-pooler":A,...E!==void 0&&{"x-target-queue":E}};return await o.restartForSameIsolate(_),{message:"Engine Restarted Due To Same Isolate with no time to process.",status:200}}await o.deleteScheduledRestart(E??"__GLOBAL__")}if(U&&P)return console.log(`[${new Date().toISOString()}] : Scheduling restart for (${E})`),await o.scheduleRestart(E),{message:"Engine Started Successfully",status:200}}function l(E){return!!E&&typeof E.clone==="function"&&typeof E.text==="function"&&typeof E.url==="string"&&typeof E.headers?.get==="function"}function G(E){let c={};if(!E)return c;if(typeof E.forEach==="function"&&typeof E.get==="function")return E.forEach((P,$)=>{c[String($).toLowerCase()]=String(P)}),c;for(let[P,$]of Object.entries(E)){if($==null)continue;c[P.toLowerCase()]=Array.isArray($)?$.join(", "):String($)}return c}function j(E){let c={};if(!E)return c;let P=($,D)=>{if(D==null)return;c[$]=$ in c?`${c[$]},${D}`:String(D)};if(typeof E.forEach==="function")E.forEach(($,D)=>P(D,$));else for(let[$,D]of Object.entries(E))P($,Array.isArray(D)?D.join(","):D);return c}function I(E){let c=E.indexOf("?");return c===-1?{}:j(new URLSearchParams(E.slice(c+1)))}function w(E){let c=atob(E),P=Uint8Array.from(c,($)=>$.charCodeAt(0));return new TextDecoder().decode(P)}function Q(E){return new TextDecoder().decode(E)}async function q(E){let c=new TextEncoder,P=[];for await(let C of E)P.push(typeof C==="string"?c.encode(C):C);let $=P.reduce((C,A)=>C+A.length,0),D=new Uint8Array($),L=0;for(let C of P)D.set(C,L),L+=C.length;return new TextDecoder().decode(D)}function p(E,c){let P=c.toLowerCase();if(P.includes("json"))try{return JSON.parse(E)}catch{return E}if(P.includes("application/x-www-form-urlencoded"))return j(new URLSearchParams(E));if(!P){let $=E.trimStart();if($.startsWith("{")||$.startsWith("["))try{return JSON.parse(E)}catch{}}return E}function J(E,c,P=!1){if(E==null||E==="")return{body:null,rawBody:null};let $;if(typeof E==="string")$=P?w(E):E;else if(E instanceof ArrayBuffer||ArrayBuffer.isView(E))$=Q(E);else return{body:E,rawBody:null};return{body:p($,c),rawBody:$}}var z=new Set(["GET","HEAD"]);async function S(E){if(!E)throw Error("[YourSDK] No request object/event provided.");let c=E;if(!l(c)&&l(c.request))c=c.request;else if(c.req&&c.req.headers&&!c.headers)c=c.req;if(l(c)){let P=c.clone(),$=String(P.method||"GET").toUpperCase(),D=G(P.headers),L=null;if(!z.has($))try{L=await P.text()}catch{L=null}let{body:C,rawBody:A}=J(L,D["content-type"]||"");return{method:$,url:P.url,headers:D,query:j(new URL(P.url).searchParams),body:C,rawBody:A}}if(c.requestContext||c.httpMethod||c.rawPath){let P=G(c.headers),$=String(c.requestContext?.http?.method||c.httpMethod||"POST").toUpperCase(),D=c.rawPath||c.path||"/",L=c.rawQueryString?`?${c.rawQueryString}`:"",C=P["x-forwarded-proto"]||"https",A=P.host||"lambda.local",o=c.rawUrl||`${C}://${A}${D}${L}`,M=c.queryStringParameters&&Object.keys(c.queryStringParameters).length?j(c.queryStringParameters):c.rawQueryString?I(`?${c.rawQueryString}`):{},{body:O,rawBody:U}=J(c.body,P["content-type"]||"",!!c.isBase64Encoded);return{method:$,url:o,headers:P,query:M,body:O,rawBody:U}}if(c.headers&&c.method){let P=G(c.headers),$=String(c.method).toUpperCase(),D=c.originalUrl||c.url||"/",L=D;if(!/^https?:\/\//i.test(D)){let O=P["x-forwarded-proto"]?.split(",")[0]?.trim()||c.protocol||(c.socket?.encrypted?"https":"http"),U=P["x-forwarded-host"]||P.host||"localhost";L=`${O}://${U}${D}`}let A=c.query&&Object.keys(c.query).length>0?j(c.query):I(L),o=c.body!==void 0?c.body:c.rawBody;if(o===void 0&&!z.has($)&&typeof c[Symbol.asyncIterator]==="function")o=await q(c);let M=J(o,P["content-type"]||"");if(M.rawBody===null&&c.rawBody!=null)M.rawBody=typeof c.rawBody==="string"?c.rawBody:Q(c.rawBody);return{method:$,url:L,headers:P,query:A,body:M.body,rawBody:M.rawBody}}throw Error("[YourSDK] Could not identify runtime payload type.")}var v=(E)=>{return{isRestarted:(E["x-restart"]??"false")==="true",poolerMode:E["x-pooler"]??"interval-driven-pooler",lastExecutionId:E["x-last-execution-id"]??crypto.randomUUID(),lastExecutionAt:E["x-last-execution-at"]??new Date().toISOString(),lastIsolateId:E["x-last-isolate-id"]??crypto.randomUUID(),executionOwner:E["x-execution-owner"]??"engine",targetQueue:E["x-target-queue"]??void 0,fencingToken:E["x-fencing-token"]??void 0}};class H{opts;onErrorHook;constructor(E){this.opts=E}onError(E){return this.onErrorHook=E,this}async handle(E){let{url:c,method:P,body:$,headers:D}=await S(E),L=new URL(c),C={headers:D,body:$};if(L.pathname.endsWith("/ack")&&P=="POST")return await this.handleAck(C);if(L.pathname.endsWith("/nack")&&P=="POST")return await this.handleNack(C);if(L.pathname.endsWith("/retry")&&P=="POST")return await this.handleRetry(C);if(L.pathname.endsWith("/validate_config")&&P=="POST")return await this.handleReconcileConfiguration();return await this.handleEngineExecution(E)}async getMessageIds(E){let{headers:c}=E,P=E.body;if(typeof P==="string")try{P=JSON.parse(P)}catch(A){throw Error(A)}let $=c["x-queue"],D=c["x-worker-id"];if(!$)throw Error("[getMessageIds] : Queue Not Found In Headers");if(!D)throw Error("[getMessageIds] : Worker Id Not Found In Headers");let C=(Array.isArray(P?.msg_ids)?P.msg_ids:[]).map((A)=>Number.parseInt(String(A),10)).filter((A)=>Number.isInteger(A)&&A>=0);if(C.length==0)throw Error("[getMessageIds] : No message ids were found");return{queue:$,messageIds:C,workerId:D}}async performBatchAction(E,c,P,$){try{await this.opts.unifiedStorage.connect();let D=new V(this.opts.unifiedStorage);switch($){case"ACK":await D.ackBatch(E,P);break;case"NACK":await D.ackBatch(E,P);break;case"RETRY":await D.retryBatch(E,P);break}}catch(D){console.log(D)}finally{await this.opts.unifiedStorage.repository.deregisterWorker(c,E)}}async handleAck(E){let{messageIds:c,queue:P,workerId:$}=await this.getMessageIds(E);return await this.performBatchAction(P,$,c,"ACK"),{message:"Jobs Acknowledged",status:200}}async handleNack(E){let{queue:c,workerId:P,messageIds:$}=await this.getMessageIds(E);return console.log(`[NACK] : Queue ${c} : Message IDs ${$}`),await this.performBatchAction(c,P,$,"NACK"),{message:"Jobs Nack Applied",status:200}}async handleRetry(E){let{queue:c,workerId:P,messageIds:$}=await this.getMessageIds(E);return console.log(`[RETRY] : Queue ${c} : Message IDs ${$}`),await this.performBatchAction(c,P,$,"RETRY"),{message:"Jobs Retry Applied",status:200}}async handleReconcileConfiguration(){return await this.opts.getEngine(this.opts.instanceId).validateConfiguration()}async handleEngineExecution(E){let{headers:c}=await S(E),P=v(c),{executionOwner:$,isRestarted:D,lastExecutionId:L,lastIsolateId:C,poolerMode:A,targetQueue:o,fencingToken:M}=P,O=A==="event-driven-pooler";if(O&&!o)return{message:"Target queue is not defined.",status:400};console.log("[PulsarRequestHandlerBuilder] : Executing request for engine startup."),await this.opts.unifiedStorage.connect(),this.opts.unifiedStorage.bindInstanceId(this.opts.instanceId);let U=await F({executionOwner:$,isEventDriven:O,targetQueue:o,fencingToken:M,ops:this.opts.unifiedStorage.ops});if(U)return U;let _=await n({isEventDriven:O,lastExecutionId:L,targetQueue:o,repository:this.opts.unifiedStorage.repository,instanceId:this.opts.instanceId});if(typeof _=="object")return _;if(this.opts.isolate)this.opts.isolate.set("current_execution_id",L),this.opts.isolate.set("lock_key",_);let K=this.opts.getEngine(this.opts.instanceId);K.setCurrentExecutionId(L);let x=K.runtime==="V8_ISOLATE",Y=this.opts.isolate;if(x&&!Y)throw Error("[Pulsar SDK] : 'isolate' option must be provided when runtime is V8_ISOLATE.");try{let f=await k({engine:K,isolate:Y,executionOwner:$,isRestarted:D,isV8Isolate:x,lastExecutionId:L,lastIsolateId:C,poolerMode:A,targetQueue:o});if(f)return f;if(O&&o)await K.triggerQueue(o);else await K.start();return{message:"Engine Started Successfully",status:200}}catch(f){if(this.onErrorHook){if(this.onErrorHook(f))return{message:"Interval Exception Raised",status:200}}throw f}finally{await K.awaitPendingShutdown()}}}function X(E){return new H(E)}class Z{type="webhook";constructor(){}async start(E){console.log("[WebhookTransport] Initialized. Awaiting incoming HTTP triggers.")}async handleRequest({req:E,unifiedStorage:c,isolate:P,getEngine:$,instanceId:D}){return await X({unifiedStorage:c,isolate:P,getEngine:$,instanceId:D}).handle(E)}async stop(){}}class R{sql;channel;type="tcp_listen";constructor(E,c="pulsar_queue_channel"){this.sql=E;this.channel=c}async start(E){await this.sql.listen(this.channel,(c)=>{try{let P=JSON.parse(c);if(P.queue)E(P.queue)}catch(P){console.error("[TcpListenTransport] Failed to parse payload:",P)}}),console.log(`[TcpListenTransport] Listening on PostgreSQL channel: ${this.channel}`)}async stop(){}}class W{sql;intervalMs;type="polling";timer;lastSeenId=0;constructor(E,c=2000){this.sql=E;this.intervalMs=c}async start(E){this.timer=setInterval(async()=>{try{let c=await this.sql`
|
|
46
|
+
SELECT id, queue_name
|
|
47
|
+
FROM pulsar_engine.queues
|
|
48
|
+
WHERE id > ${this.lastSeenId}
|
|
49
|
+
ORDER BY id ASC
|
|
50
|
+
LIMIT 100
|
|
51
|
+
`;for(let P of c)this.lastSeenId=P.id,await E(P.queue_name)}catch(c){console.error("[PollingTransport] Error during polling tick:",c)}},this.intervalMs),console.log(`[PollingTransport] Active with interval: ${this.intervalMs}ms`)}async stop(){if(this.timer)clearInterval(this.timer)}}class B{strategy;constructor(E,c){switch(E.mode){case"webhook":this.strategy=new Z;break;case"tcp_listen":if(!c)throw Error("PostgreSQL client is required for tcp_listen transport.");this.strategy=new R(c,E.channelName);break;case"polling":if(!c)throw Error("PostgreSQL client is required for polling transport.");this.strategy=new W(c,E.pollingIntervalMs);break;default:throw Error(`Unknown transport mode: ${E?.mode}`)}}async handleRequest(E){if(this.strategy.type!=="webhook")throw Error(`[PulsarTransportManager] Invalid strategy type for handleRequest. Expected 'webhook', got '${this.strategy.type}'.`);return this.strategy.handleRequest(E)}async initialize(E){if(this.strategy.type!=="webhook")this.strategy.start(E)}async shutdown(){}}export{X as createPulsarRequestHandler,B as PulsarTransportManager};
|
|
52
|
+
|
|
53
|
+
//# debugId=5889B469922F5E2964756E2164756E21
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["..\\src\\modules\\Queue.module.ts", "..\\src\\server\\helpers\\acquireRedisLock.ts", "..\\src\\server\\helpers\\checkFencingValidity.ts", "..\\src\\server\\helpers\\performIsolateRestart.ts", "..\\src\\server\\parser\\parseRequest.ts", "..\\src\\server\\utility\\extract-headers.tsx", "..\\src\\server\\PulsarRequestHandler.ts", "..\\src\\transport\\strategies\\WebhookTransport.ts", "..\\src\\transport\\strategies\\TcpListenTransport.ts", "..\\src\\transport\\strategies\\PollingTransport.ts", "..\\src\\transport\\PulsarTransportManager.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { JSONValue, Sql } from \"postgres\";\r\nimport type { QUEUE } from \"../static/static.ts\";\r\nimport type { PulsarUnifiedStorage } from \"../storage/PulsarStorage.ts\";\r\nimport type { QueueMessage } from \"../types/queue.types.ts\";\r\n\r\ninterface ITriggerURL {\r\n url: string;\r\n body?: JSONValue;\r\n headers?: Record<string, string>;\r\n delaySeconds? : number;\r\n}\r\n\r\ninterface ISingleQueueMetrics {\r\n queueName: string;\r\n readyJobs: number;\r\n delayedJobs: number;\r\n total: number;\r\n nextVisibleAt: number | null;\r\n}\r\n\r\nexport class QueueService {\r\n protected sql : Sql;\r\n\r\n constructor (storage : PulsarUnifiedStorage) {\r\n this.sql = storage.db.getNativeClient();\r\n }\r\n\r\n public async triggerUrl({ body={}, delaySeconds=0, headers={'Content-Type': 'application/json'}, url } : ITriggerURL) {\r\n await this.sql`\r\n select public.schedule_http_request(\r\n ${url},\r\n ${delaySeconds},\r\n 'POST',\r\n ${this.sql.json(body)},\r\n ${this.sql.json(headers)}\r\n ) as job_id;\r\n `;\r\n return true;\r\n }\r\n\r\n public async send<T = unknown>(queue: string, message: T, delaySeconds = 0) : Promise<bigint> {\r\n const messageJson = JSON.stringify(message);\r\n const result = await this.sql`SELECT pgmq.send( ${queue}, ${messageJson}::jsonb, ${delaySeconds} ) AS msg_id `;\r\n return result[0]?.msg_id as bigint;\r\n }\r\n\r\n /**\r\n * Read jobs using PGMQ's native FIFO strategies.\r\n * @param strategy 'rr' (Round Robin), 'grouped' (SQS-style), or 'head' (One per group)\r\n */\r\n public async readFifo(queue: string, vt: number, qty: number, strategy: 'rr' | 'grouped' | 'head' = 'grouped'): Promise<any[]> {\r\n let functionName = 'pgmq.read_grouped';\r\n if (strategy === 'rr') functionName = 'pgmq.read_grouped_rr';\r\n if (strategy === 'head') functionName = 'pgmq.read_grouped_head'; \r\n return []\r\n }\r\n\r\n public async read<T = unknown>(queue: string, visibilityTimeout = 30, quantity = 1): Promise<QueueMessage<T>[]> {\r\n const result = await this.sql`\r\n SELECT *\r\n FROM pgmq.read(\r\n ${queue},\r\n ${visibilityTimeout},\r\n ${quantity}\r\n )\r\n `;\r\n return result as unknown as QueueMessage<T>[];\r\n }\r\n\r\n public async ack(queue: string, messageId: bigint): Promise<boolean> {\r\n const result = await this.sql`\r\n SELECT pgmq.delete(\r\n ${queue}::text,\r\n ${messageId.toString()}::bigint\r\n ) AS deleted\r\n `;\r\n return Boolean(result[0]?.deleted);\r\n }\r\n\r\n \r\n public async ackBatch(queue: string, messageIds: number[]): Promise<boolean> {\r\n if (!messageIds || messageIds.length === 0) {\r\n return true;\r\n }\r\n\r\n const ids = messageIds.map((id) => id.toString());\r\n\r\n const result = await this.sql`\r\n SELECT pgmq.delete(\r\n ${queue}::text,\r\n ${ids}::bigint[]\r\n ) AS deleted\r\n `;\r\n\r\n return result.length > 0;\r\n }\r\n\r\n public async retryBatch(queue: string, messageIds: number[]): Promise<number> {\r\n if (messageIds.length === 0) return 0;\r\n\r\n const ids = messageIds.map((id) => id.toString());\r\n\r\n const result = await this.sql`\r\n SELECT pgmq.set_vt(\r\n ${queue},\r\n id::bigint,\r\n 0\r\n ) AS set_vt\r\n FROM unnest(${ids}::bigint[]) AS id\r\n `;\r\n\r\n return result.filter((row) => Boolean(row.set_vt)).length;\r\n }\r\n\r\n public async retry( queue: string, messageId: bigint): Promise<boolean> {\r\n const result = await this.sql`\r\n SELECT pgmq.set_vt(\r\n ${queue},\r\n ${messageId.toString()},\r\n 0\r\n ) AS set_vt\r\n `;\r\n\r\n return Boolean(result[0]?.set_vt);\r\n }\r\n\r\n public async delayRetry(queue: string,messageId: bigint,seconds: number): Promise<boolean> {\r\n const result = await this.sql`\r\n SELECT pgmq.set_vt(\r\n ${queue},\r\n ${messageId.toString()},\r\n ${seconds}\r\n ) AS set_vt\r\n `;\r\n\r\n return Boolean(result[0]?.set_vt);\r\n }\r\n\r\n public async getSingleQueueMetrics(queueName : string) : Promise<ISingleQueueMetrics | null> {\r\n try {\r\n const result = await this.sql`SELECT * FROM pgmq.get_single_queue_metrics(${queueName})`;\r\n\r\n const rows = Array.from(result);\r\n if (!rows.length) return null;\r\n\r\n const row: any = rows[0];\r\n\r\n return {\r\n queueName: row.queue_name as QUEUE,\r\n readyJobs: Number(row.ready_jobs ?? 0),\r\n delayedJobs: Number(row.delayed_jobs ?? 0),\r\n total: Number(row.total_jobs ?? 0),\r\n nextVisibleAt: row.next_visible_at ? new Date(row.next_visible_at).getTime() : null,\r\n };\r\n }\r\n catch (err) {\r\n console.error(`Failed to fetch metrics for queue: ${queueName}`, err);\r\n return null;\r\n }\r\n }\r\n\r\n public async getAllQueueMetrics() : Promise<{ queue_name : QUEUE, ready_jobs : number, delayed_jobs : number, total : number, next_visible_at : number }[]> {\r\n const allQueueMetrics = await this.sql`SELECT * FROM pgmq.get_queue_metrics()`;\r\n \r\n return Array.from(allQueueMetrics).map((row : any) => ({\r\n queue_name: row.queue_name as QUEUE,\r\n ready_jobs: Number(row.ready_jobs),\r\n delayed_jobs: Number(row.delayed_jobs),\r\n total: Number(row.total_jobs),\r\n next_visible_at : Number(row.next_visible_at),\r\n }))\r\n }\r\n\r\n public async closeQueue(): Promise<void> {\r\n await this.sql.end();\r\n }\r\n}",
|
|
6
|
+
"import type { IQueueRepository } from \"../../storage/repositories/QueueRepository\";\r\n\r\ninterface IAquireInstanceLock {\r\n repository : IQueueRepository;\r\n isEventDriven : boolean;\r\n targetQueue : string;\r\n lastExecutionId : string;\r\n instanceId : string;\r\n}\r\n\r\nexport async function aquireInstanceLock({ repository, isEventDriven, lastExecutionId, targetQueue, instanceId } : IAquireInstanceLock) {\r\n const lockKey = isEventDriven ? `lock:edp:${targetQueue}` : `lock:idp`;\r\n const lockTTL = 120_000;\r\n\r\n const lockAcquired = await repository.acquireQueueLock(\r\n lockKey,\r\n lastExecutionId,\r\n lockTTL\r\n )\r\n\r\n if (lockAcquired) {\r\n await repository.clearDispatchPending(lockKey);\r\n }\r\n else {\r\n console.log(`[LOCK REJECTED] : Active execution lock already held for key: ${lockKey}`);\r\n return {\r\n message: \"Isolate active, skipping redundant run.\",\r\n status: 200\r\n }\r\n }\r\n\r\n return lockKey;\r\n}",
|
|
7
|
+
"import type { IPulsarPostgresEngineOperationRepository } from \"../../storage/repositories/PostgresEngineOperationRepository\";\r\n\r\ninterface ICheckFencingTokenValidity {\r\n isEventDriven : boolean;\r\n executionOwner : string;\r\n fencingToken? : string;\r\n targetQueue : string;\r\n ops : IPulsarPostgresEngineOperationRepository\r\n}\r\n\r\nexport async function checkFencingTokenValidity({ executionOwner, fencingToken, isEventDriven, targetQueue, ops } : ICheckFencingTokenValidity) {\r\n if(isEventDriven && executionOwner == \"trigger\") {\r\n if(!fencingToken || fencingToken == \"NOT_INCLUDED\") {\r\n const errorMsg = `[EventDrivenPoller]-[ExecutionTrigger]-[${targetQueue}] : Engine execution rejected: Fencing token is missing.`;\r\n console.error(errorMsg);\r\n return {\r\n message: errorMsg,\r\n status: 200\r\n }\r\n }\r\n\r\n const isValidToken = await ops.checkFencingTokenValidity(targetQueue, fencingToken);\r\n\r\n if(!isValidToken) {\r\n const errorMsg = `[EventDrivenPoller]-[ExecutionTrigger]-[${targetQueue}] : Engine execution rejected : Invalid fencing token.`;\r\n console.error(errorMsg);\r\n return {\r\n message: errorMsg,\r\n status: 200\r\n }\r\n }\r\n\r\n else {\r\n console.log(\"[EventDrivenPoller] : Engine started via DB trigger\", {\r\n queue: targetQueue,\r\n currentToken: fencingToken,\r\n previousToken: isNaN(parseInt(fencingToken, 10)) ? null : parseInt(fencingToken, 10) - 1\r\n })\r\n }\r\n }\r\n}",
|
|
8
|
+
"import type { Pulsar } from \"../../service/Pulsar.service\";\r\nimport type { IsolateInstance } from \"../../service/Isolate.service\";\r\nimport type { EnginePoolingMode } from \"../../types/engine.types\";\r\n\r\ninterface IEnginePerformRestart {\r\n isRestarted : boolean;\r\n isV8Isolate : boolean;\r\n isolate? : IsolateInstance;\r\n executionOwner : string;\r\n lastIsolateId : string;\r\n lastExecutionId : string;\r\n poolerMode : EnginePoolingMode;\r\n targetQueue : string;\r\n engine : Pulsar;\r\n}\r\n\r\nexport async function performEngineRestart({ targetQueue, isRestarted, isV8Isolate, isolate, executionOwner, lastExecutionId, lastIsolateId, poolerMode, engine } : IEnginePerformRestart) {\r\n const isolateUptime = isolate?.uptime ?? 0;\r\n const isolateMaxTime = isolate?.maxTime ?? Infinity;\r\n const shouldRecycleIsolate = isV8Isolate && isolateUptime >= isolateMaxTime;\r\n\r\n if (isRestarted && isV8Isolate && isolate) {\r\n console.log(`[Pulsar] : Engine Restarted By (${executionOwner === \"watchdog\" ? \"watchdog\" : \"self\"})`);\r\n\r\n if (isolate.isSameIsolate(lastIsolateId)) {\r\n console.log(`[Pulsar] : Engine Restarted in same isolate (${isolate.id}), Header Isolate (${lastIsolateId})`);\r\n }\r\n\r\n if (shouldRecycleIsolate) {\r\n console.log(`[${new Date().toISOString()}]: Engine Restarted With Network Call due to isolate recycling.`);\r\n\r\n const nextHeaders: Record<string, string> = {\r\n \"content-type\": \"application/json\",\r\n \"x-last-execution-id\": lastExecutionId,\r\n \"x-last-execution-at\": new Date().toISOString(),\r\n \"x-execution-owner\": executionOwner,\r\n \"x-restart\": isRestarted ? \"true\" : \"false\",\r\n \"x-pooler\": poolerMode,\r\n ...(targetQueue !== undefined && { \"x-target-queue\": targetQueue })\r\n }\r\n\r\n await engine.restartForSameIsolate(nextHeaders);\r\n\r\n return {\r\n message: \"Engine Restarted Due To Same Isolate with no time to process.\",\r\n status: 200\r\n }\r\n }\r\n\r\n await engine.deleteScheduledRestart(targetQueue ?? \"__GLOBAL__\");\r\n }\r\n\r\n if (shouldRecycleIsolate && isV8Isolate) {\r\n console.log(`[${new Date().toISOString()}] : Scheduling restart for (${targetQueue})`);\r\n await engine.scheduleRestart(targetQueue as string);\r\n\r\n return {\r\n message: \"Engine Started Successfully\",\r\n status: 200\r\n }\r\n }\r\n}",
|
|
9
|
+
"export interface ParsedRequest {\r\n method: string;\r\n url: string;\r\n headers: Record<string, string>; // always lowercase keys\r\n query: Record<string, string>;\r\n body: any; // parsed (JSON / form) or string, null if empty\r\n rawBody: string | null; // exact text, needed for webhook signature checks\r\n}\r\n\r\ntype AnyObj = Record<string, any>;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers (no Node-only globals: no Buffer, no `instanceof Request`)\r\n// ---------------------------------------------------------------------------\r\n\r\n// Duck-typing works across realms/polyfills (Deno, undici, Workers, Azure v4...)\r\nfunction isFetchRequest(x: any): boolean {\r\n return (\r\n !!x &&\r\n typeof x.clone === \"function\" &&\r\n typeof x.text === \"function\" &&\r\n typeof x.url === \"string\" &&\r\n typeof x.headers?.get === \"function\"\r\n );\r\n}\r\n\r\nfunction normalizeHeaders(input: any): Record<string, string> {\r\n const out: Record<string, string> = {};\r\n if (!input) return out;\r\n\r\n // Headers / Map-like (Fetch, Azure v4)\r\n if (typeof input.forEach === \"function\" && typeof input.get === \"function\") {\r\n input.forEach((v: string, k: string) => {\r\n out[String(k).toLowerCase()] = String(v);\r\n });\r\n return out;\r\n }\r\n\r\n // Plain objects (Lambda, Node, Express). Node can give string[] values.\r\n for (const [k, v] of Object.entries(input)) {\r\n if (v == null) continue;\r\n out[k.toLowerCase()] = Array.isArray(v) ? v.join(\", \") : String(v);\r\n }\r\n return out;\r\n}\r\n\r\nfunction normalizeQuery(input: any): Record<string, string> {\r\n const out: Record<string, string> = {};\r\n if (!input) return out;\r\n\r\n const add = (k: string, v: any) => {\r\n if (v == null) return;\r\n out[k] = k in out ? `${out[k]},${v}` : String(v); // repeated keys -> \"a,b\"\r\n };\r\n\r\n if (typeof input.forEach === \"function\") {\r\n input.forEach((v: string, k: string) => add(k, v)); // URLSearchParams\r\n } else {\r\n for (const [k, v] of Object.entries(input)) {\r\n add(k, Array.isArray(v) ? v.join(\",\") : v);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nfunction queryFromUrl(url: string): Record<string, string> {\r\n const i = url.indexOf(\"?\");\r\n return i === -1 ? {} : normalizeQuery(new URLSearchParams(url.slice(i + 1)));\r\n}\r\n\r\nfunction base64ToText(b64: string): string {\r\n // atob exists in Node 16+, Deno, Bun, Workers, browsers\r\n const bin = atob(b64);\r\n const bytes = Uint8Array.from(bin, (c) => c.charCodeAt(0));\r\n return new TextDecoder().decode(bytes);\r\n}\r\n\r\nfunction bytesToText(b: ArrayBuffer | ArrayBufferView): string {\r\n return new TextDecoder().decode(b as any);\r\n}\r\n\r\nasync function readStream(stream: any): Promise<string> {\r\n const enc = new TextEncoder();\r\n const chunks: Uint8Array[] = [];\r\n for await (const c of stream) {\r\n chunks.push(typeof c === \"string\" ? enc.encode(c) : c);\r\n }\r\n const total = chunks.reduce((n, c) => n + c.length, 0);\r\n const all = new Uint8Array(total);\r\n let off = 0;\r\n for (const c of chunks) {\r\n all.set(c, off);\r\n off += c.length;\r\n }\r\n return new TextDecoder().decode(all);\r\n}\r\n\r\nfunction parseText(text: string, contentType: string): any {\r\n const ct = contentType.toLowerCase();\r\n\r\n if (ct.includes(\"json\")) {\r\n try { return JSON.parse(text); } catch { return text; }\r\n }\r\n if (ct.includes(\"application/x-www-form-urlencoded\")) {\r\n return normalizeQuery(new URLSearchParams(text));\r\n }\r\n // No content-type (some proxies strip it): sniff for JSON\r\n if (!ct) {\r\n const t = text.trimStart();\r\n if (t.startsWith(\"{\") || t.startsWith(\"[\")) {\r\n try { return JSON.parse(text); } catch { /* fall through */ }\r\n }\r\n }\r\n return text;\r\n}\r\n\r\n/** Turns whatever a runtime hands us as \"body\" into { body, rawBody }. */\r\nfunction finalizeBody(\r\n raw: unknown,\r\n contentType: string,\r\n isBase64 = false\r\n): { body: any; rawBody: string | null } {\r\n if (raw == null || raw === \"\") return { body: null, rawBody: null };\r\n\r\n let text: string;\r\n if (typeof raw === \"string\") {\r\n text = isBase64 ? base64ToText(raw) : raw;\r\n } else if (raw instanceof ArrayBuffer || ArrayBuffer.isView(raw)) {\r\n text = bytesToText(raw as any); // includes Node Buffer\r\n } else {\r\n // Already parsed by the framework (Express json(), Azure v3, GCF)\r\n return { body: raw, rawBody: null };\r\n }\r\n\r\n return { body: parseText(text, contentType), rawBody: text };\r\n}\r\n\r\nconst NO_BODY_METHODS = new Set([\"GET\", \"HEAD\"]);\r\n\r\n// ---------------------------------------------------------------------------\r\n// Main\r\n// ---------------------------------------------------------------------------\r\n\r\nexport async function parseRequest(rawInput: any): Promise<ParsedRequest> {\r\n if (!rawInput) {\r\n throw new Error(\"[YourSDK] No request object/event provided.\");\r\n }\r\n\r\n // Unwrap handler \"context\" wrappers:\r\n // - Cloudflare Pages Functions / SvelteKit / Remix: { request }\r\n // - Azure Functions v3: context.req\r\n let input: AnyObj = rawInput;\r\n if (!isFetchRequest(input) && isFetchRequest(input.request)) {\r\n input = input.request;\r\n } else if (input.req && input.req.headers && !input.headers) {\r\n input = input.req;\r\n }\r\n\r\n // -------------------------------------------------------------------------\r\n // 1. Fetch-style Request\r\n // Cloudflare Workers, Deno, Bun, Supabase Edge, Vercel Edge, Netlify v2,\r\n // Next.js route handlers, Azure Functions v4\r\n // -------------------------------------------------------------------------\r\n if (isFetchRequest(input)) {\r\n const clone = input.clone(); // leave the original body readable for the caller\r\n const method = String(clone.method || \"GET\").toUpperCase();\r\n const headers = normalizeHeaders(clone.headers);\r\n\r\n let text: string | null = null;\r\n if (!NO_BODY_METHODS.has(method)) {\r\n try { text = await clone.text(); } catch { text = null; }\r\n }\r\n const { body, rawBody } = finalizeBody(text, headers[\"content-type\"] || \"\");\r\n\r\n return {\r\n method,\r\n url: clone.url,\r\n headers,\r\n query: normalizeQuery(new URL(clone.url).searchParams),\r\n body,\r\n rawBody,\r\n };\r\n }\r\n\r\n // -------------------------------------------------------------------------\r\n // 2. AWS Lambda-style events\r\n // API Gateway REST v1 / HTTP v2, Function URLs, ALB, Netlify v1 functions\r\n // -------------------------------------------------------------------------\r\n if (input.requestContext || input.httpMethod || input.rawPath) {\r\n const headers = normalizeHeaders(input.headers);\r\n const method = String(\r\n input.requestContext?.http?.method || input.httpMethod || \"POST\"\r\n ).toUpperCase();\r\n\r\n const path = input.rawPath || input.path || \"/\";\r\n const qs = input.rawQueryString ? `?${input.rawQueryString}` : \"\";\r\n const proto = headers[\"x-forwarded-proto\"] || \"https\";\r\n const host = headers[\"host\"] || \"lambda.local\";\r\n const url = input.rawUrl || `${proto}://${host}${path}${qs}`;\r\n\r\n const query =\r\n input.queryStringParameters && Object.keys(input.queryStringParameters).length\r\n ? normalizeQuery(input.queryStringParameters)\r\n : input.rawQueryString\r\n ? queryFromUrl(`?${input.rawQueryString}`)\r\n : {};\r\n\r\n const { body, rawBody } = finalizeBody(\r\n input.body,\r\n headers[\"content-type\"] || \"\",\r\n !!input.isBase64Encoded\r\n );\r\n\r\n return { method, url, headers, query, body, rawBody };\r\n }\r\n\r\n // -------------------------------------------------------------------------\r\n // 3. Node-style req\r\n // Express, Vercel Node, Google Cloud Functions, Azure Functions v3,\r\n // raw http.IncomingMessage\r\n // -------------------------------------------------------------------------\r\n if (input.headers && input.method) {\r\n const headers = normalizeHeaders(input.headers);\r\n const method = String(input.method).toUpperCase();\r\n\r\n const path: string = input.originalUrl || input.url || \"/\";\r\n let url = path;\r\n if (!/^https?:\\/\\//i.test(path)) {\r\n const proto =\r\n headers[\"x-forwarded-proto\"]?.split(\",\")[0]?.trim() ||\r\n input.protocol ||\r\n (input.socket?.encrypted ? \"https\" : \"http\");\r\n const host = headers[\"x-forwarded-host\"] || headers[\"host\"] || \"localhost\";\r\n url = `${proto}://${host}${path}`;\r\n }\r\n\r\n const hasQueryObj = input.query && Object.keys(input.query).length > 0;\r\n const query = hasQueryObj ? normalizeQuery(input.query) : queryFromUrl(url);\r\n\r\n // Prefer pre-parsed body, then rawBody (GCF/Azure), then read the stream.\r\n let rawBody: unknown = input.body !== undefined ? input.body : input.rawBody;\r\n if (\r\n rawBody === undefined &&\r\n !NO_BODY_METHODS.has(method) &&\r\n typeof (input as any)[Symbol.asyncIterator] === \"function\"\r\n ) {\r\n rawBody = await readStream(input);\r\n }\r\n\r\n const out = finalizeBody(rawBody, headers[\"content-type\"] || \"\");\r\n\r\n // If framework gave us an object but a raw buffer exists, expose the raw text too\r\n if (out.rawBody === null && input.rawBody != null) {\r\n out.rawBody =\r\n typeof input.rawBody === \"string\" ? input.rawBody : bytesToText(input.rawBody);\r\n }\r\n\r\n return { method, url, headers, query, body: out.body, rawBody: out.rawBody };\r\n }\r\n\r\n throw new Error(\"[YourSDK] Could not identify runtime payload type.\");\r\n}",
|
|
10
|
+
"import type { EnginePoolingMode } from \"@package/src/types/engine.types\";\r\n\r\nexport type ResponseHeaders = {\r\n isRestarted: boolean;\r\n poolerMode: EnginePoolingMode;\r\n lastExecutionId: string;\r\n lastExecutionAt: string;\r\n lastIsolateId: string;\r\n executionOwner: \"watchdog\" | \"engine\" | \"trigger\";\r\n targetQueue?: string;\r\n fencingToken?: string;\r\n}\r\n\r\nexport const extractHeaders = (rawHeaders : Record<string, string>) : ResponseHeaders => {\r\n return {\r\n isRestarted: (rawHeaders[\"x-restart\"] ?? \"false\") === \"true\",\r\n poolerMode: (rawHeaders[\"x-pooler\"] ?? \"interval-driven-pooler\") as EnginePoolingMode,\r\n lastExecutionId: rawHeaders[\"x-last-execution-id\"] ?? crypto.randomUUID(),\r\n lastExecutionAt: rawHeaders[\"x-last-execution-at\"] ?? new Date().toISOString(),\r\n lastIsolateId: rawHeaders[\"x-last-isolate-id\"] ?? crypto.randomUUID(),\r\n executionOwner: (rawHeaders[\"x-execution-owner\"] ?? \"engine\") as \"watchdog\" | \"engine\",\r\n targetQueue: rawHeaders[\"x-target-queue\"] ?? undefined,\r\n fencingToken: rawHeaders[\"x-fencing-token\"] ?? undefined,\r\n }\r\n}\r\n",
|
|
11
|
+
"import { QueueService } from \"../modules/Queue.module\";\r\nimport { aquireInstanceLock } from \"./helpers/acquireRedisLock\";\r\nimport { checkFencingTokenValidity } from \"./helpers/checkFencingValidity\";\r\nimport { performEngineRestart } from \"./helpers/performIsolateRestart\";\r\nimport { parseRequest } from \"./parser/parseRequest\";\r\nimport { extractHeaders } from \"./utility/extract-headers\";\r\n\r\nimport type { IsolateInstance } from \"../service/Isolate.service\";\r\nimport type { Pulsar } from \"../service/Pulsar.service\";\r\nimport type { PulsarUnifiedStorage } from \"../storage/PulsarStorage\";\r\n\r\ninterface PulsarHandlerOptions {\r\n unifiedStorage : PulsarUnifiedStorage;\r\n getEngine: (instanceId : string) => Pulsar;\r\n instanceId : string;\r\n /**\r\n * Optional isolate instance. Required only when Pulsar runtime is V8_ISOLATE.\r\n */\r\n isolate? : IsolateInstance;\r\n}\r\n\r\n\r\nexport type GetEngine = {\r\n lockKey : string;\r\n instanceId : string;\r\n}\r\n\r\ntype StandardResponse = {\r\n status : number;\r\n message : string;\r\n}\r\n\r\ntype StandardArgs = {\r\n headers : Record<string, string>;\r\n body: any;\r\n}\r\n\r\nexport type ErrorHook = (error : unknown) => Response | void;\r\n\r\nclass PulsarRequestHandlerBuilder {\r\n private onErrorHook? : ErrorHook;\r\n\r\n constructor(private readonly opts : PulsarHandlerOptions) {}\r\n\r\n public onError(fn : ErrorHook): this {\r\n this.onErrorHook = fn;\r\n return this;\r\n }\r\n\r\n public async handle(req : Request) {\r\n const { url : rawUrl, method, body, headers } = await parseRequest(req);\r\n\r\n const url = new URL(rawUrl);\r\n const args = { headers, body };\r\n\r\n if (url.pathname.endsWith(\"/ack\") && method == \"POST\") {\r\n return await this.handleAck(args);\r\n }\r\n\r\n if (url.pathname.endsWith(\"/nack\") && method == \"POST\") {\r\n return await this.handleNack(args);\r\n }\r\n\r\n if (url.pathname.endsWith(\"/retry\") && method == \"POST\") {\r\n return await this.handleRetry(args);\r\n }\r\n\r\n if (url.pathname.endsWith(\"/validate_config\") && method == \"POST\") {\r\n return await this.handleReconcileConfiguration();\r\n }\r\n\r\n return await this.handleEngineExecution(req);\r\n }\r\n\r\n private async getMessageIds(args : StandardArgs) : Promise<{queue : string, messageIds : number[], workerId : string}> {\r\n const { headers } = args;\r\n\r\n let parsedBody = args.body;\r\n if (typeof parsedBody === \"string\") {\r\n try {\r\n parsedBody = JSON.parse(parsedBody);\r\n }\r\n catch (err : any) {\r\n throw new Error(err);\r\n }\r\n }\r\n\r\n const queue = headers[\"x-queue\"];\r\n const workerId = headers[\"x-worker-id\"];\r\n\r\n if(!queue) throw new Error(\"[getMessageIds] : Queue Not Found In Headers\");\r\n if(!workerId) throw new Error(\"[getMessageIds] : Worker Id Not Found In Headers\");\r\n\r\n const rawMsgIds = (Array.isArray(parsedBody?.msg_ids) ? parsedBody.msg_ids : []) as number[];\r\n const messageIds : number[] = rawMsgIds.map((id) => Number.parseInt(String(id), 10)).filter((id) => Number.isInteger(id) && id >= 0);\r\n\r\n if(messageIds.length == 0) throw new Error(\"[getMessageIds] : No message ids were found\");\r\n\r\n return { queue, messageIds, workerId };\r\n }\r\n\r\n private async performBatchAction(queue : string, workerId : string, messageIds : number[], action : \"ACK\" | \"NACK\" | \"RETRY\") {\r\n try {\r\n await this.opts.unifiedStorage.connect();\r\n\r\n const queueService = new QueueService(this.opts.unifiedStorage);\r\n\r\n switch (action) {\r\n case \"ACK\":\r\n await queueService.ackBatch(queue, messageIds);\r\n break;\r\n case \"NACK\":\r\n await queueService.ackBatch(queue, messageIds);\r\n break;\r\n case \"RETRY\":\r\n await queueService.retryBatch(queue, messageIds);\r\n break;\r\n }\r\n }\r\n catch (error) {\r\n console.log(error);\r\n }\r\n finally {\r\n await this.opts.unifiedStorage.repository.deregisterWorker(workerId, queue);\r\n }\r\n }\r\n\r\n private async handleAck(args : StandardArgs) : Promise<StandardResponse> {\r\n const { messageIds, queue, workerId } = await this.getMessageIds(args);\r\n\r\n //console.log(`[ACK] : Queue ${queue} : Message IDs ${messageIds}`);\r\n\r\n await this.performBatchAction(queue, workerId, messageIds, \"ACK\");\r\n\r\n return { message : \"Jobs Acknowledged\", status : 200 }\r\n }\r\n\r\n private async handleNack(args : StandardArgs) : Promise<StandardResponse> {\r\n const { queue, workerId, messageIds } = await this.getMessageIds(args);\r\n\r\n console.log(`[NACK] : Queue ${queue} : Message IDs ${messageIds}`);\r\n\r\n await this.performBatchAction(queue, workerId, messageIds, \"NACK\");\r\n\r\n return { message : \"Jobs Nack Applied\", status : 200 }\r\n }\r\n\r\n private async handleRetry(args : StandardArgs) : Promise<StandardResponse> {\r\n const { queue, workerId, messageIds } = await this.getMessageIds(args);\r\n\r\n console.log(`[RETRY] : Queue ${queue} : Message IDs ${messageIds}`);\r\n\r\n await this.performBatchAction(queue, workerId, messageIds, \"RETRY\");\r\n\r\n return { message : \"Jobs Retry Applied\", status : 200 }\r\n }\r\n\r\n private async handleReconcileConfiguration () : Promise<StandardResponse> {\r\n const engine = this.opts.getEngine(this.opts.instanceId);\r\n return await engine.validateConfiguration();\r\n }\r\n\r\n /**\r\n * Handles the HTTP request lifecycle for Pulsar Engine.\r\n */\r\n public async handleEngineExecution(req : Request) : Promise<StandardResponse> {\r\n const { headers : rawHeaders } = await parseRequest(req);\r\n const headers = extractHeaders(rawHeaders);\r\n\r\n const {\r\n executionOwner,\r\n isRestarted,\r\n lastExecutionId,\r\n lastIsolateId,\r\n poolerMode,\r\n targetQueue,\r\n fencingToken,\r\n } = headers;\r\n\r\n const isEventDriven = poolerMode === \"event-driven-pooler\";\r\n\r\n if (isEventDriven && !targetQueue) {\r\n return {\r\n message: \"Target queue is not defined.\",\r\n status: 400\r\n }\r\n }\r\n\r\n console.log(`[PulsarRequestHandlerBuilder] : Executing request for engine startup.`);\r\n\r\n await this.opts.unifiedStorage.connect();\r\n this.opts.unifiedStorage.bindInstanceId(this.opts.instanceId);\r\n\r\n const invalidFencingResponse = await checkFencingTokenValidity({\r\n executionOwner,\r\n isEventDriven,\r\n targetQueue : targetQueue as string,\r\n fencingToken,\r\n ops : this.opts.unifiedStorage.ops\r\n })\r\n\r\n if(invalidFencingResponse) return invalidFencingResponse;\r\n\r\n const lockAquiredResponse = await aquireInstanceLock({\r\n isEventDriven,\r\n lastExecutionId,\r\n targetQueue : targetQueue as string,\r\n repository : this.opts.unifiedStorage.repository,\r\n instanceId : this.opts.instanceId\r\n })\r\n\r\n if(typeof lockAquiredResponse == \"object\") {\r\n return lockAquiredResponse;\r\n }\r\n\r\n if(this.opts.isolate) {\r\n this.opts.isolate.set('current_execution_id', lastExecutionId);\r\n this.opts.isolate.set('lock_key', lockAquiredResponse);\r\n }\r\n\r\n const engine = this.opts.getEngine(this.opts.instanceId);\r\n engine.setCurrentExecutionId(lastExecutionId);\r\n const isV8Isolate = engine.runtime === \"V8_ISOLATE\";\r\n\r\n const isolate = this.opts.isolate;\r\n if (isV8Isolate && !isolate) {\r\n throw new Error(\"[Pulsar SDK] : 'isolate' option must be provided when runtime is V8_ISOLATE.\");\r\n }\r\n\r\n try {\r\n const blockResponse = await performEngineRestart({\r\n engine,\r\n isolate,\r\n executionOwner,\r\n isRestarted,\r\n isV8Isolate,\r\n lastExecutionId,\r\n lastIsolateId,\r\n poolerMode,\r\n targetQueue : targetQueue as string \r\n })\r\n\r\n if(blockResponse) {\r\n return blockResponse;\r\n }\r\n\r\n if (isEventDriven && targetQueue) {\r\n await engine.triggerQueue(targetQueue);\r\n }\r\n else {\r\n await engine.start();\r\n }\r\n\r\n return {\r\n message: \"Engine Started Successfully\",\r\n status: 200\r\n }\r\n }\r\n catch (err) {\r\n if (this.onErrorHook) {\r\n const customErrResponse = this.onErrorHook(err);\r\n if (customErrResponse) {\r\n return {\r\n message : \"Interval Exception Raised\",\r\n status : 200\r\n }\r\n }\r\n }\r\n throw err;\r\n }\r\n finally {\r\n await engine.awaitPendingShutdown();\r\n }\r\n }\r\n}\r\n\r\nexport function createPulsarRequestHandler(opts : PulsarHandlerOptions) : PulsarRequestHandlerBuilder {\r\n return new PulsarRequestHandlerBuilder(opts);\r\n}",
|
|
12
|
+
"import { createPulsarRequestHandler } from \"../../server/PulsarRequestHandler\";\r\nimport type { IWebhookTransportStrategy, StandardResponse, WebhookHandleRequestParams } from \"../types\";\r\nimport type { PulsarUnifiedStorage } from \"../../storage/PulsarStorage\";\r\nimport type { IsolateInstance } from \"../../service/Isolate.service\";\r\nimport type { Pulsar } from \"../../service/Pulsar.service\";\r\n\r\nexport class WebhookTransport implements IWebhookTransportStrategy {\r\n public readonly type = \"webhook\" as const;\r\n\r\n constructor() {\r\n \r\n }\r\n\r\n async start(onTrigger : (targetQueue: string) => Promise<void>) : Promise<void> {\r\n // Webhook mode doesn't actively poll or listen via a long-lived socket;\r\n // it simply exposes the request handler endpoint for external callers.\r\n console.log(\"[WebhookTransport] Initialized. Awaiting incoming HTTP triggers.\");\r\n }\r\n\r\n public async handleRequest({ req, unifiedStorage, isolate, getEngine, instanceId } : WebhookHandleRequestParams) : Promise<StandardResponse> {\r\n return await createPulsarRequestHandler({ unifiedStorage, isolate, getEngine, instanceId }).handle(req);\r\n }\r\n\r\n async stop() {\r\n // Cleanup if needed\r\n }\r\n}",
|
|
13
|
+
"import type { ITransportStrategy, ITcpListenTransportStrategy } from \"../types\";\r\nimport type postgres from \"postgres\";\r\n\r\nexport class TcpListenTransport implements ITcpListenTransportStrategy {\r\n public readonly type = \"tcp_listen\";\r\n\r\n constructor(\r\n private readonly sql : postgres.Sql,\r\n private readonly channel : string = \"pulsar_queue_channel\"\r\n ) {}\r\n\r\n async start(onTrigger: (targetQueue : string) => Promise<void>) : Promise<void> {\r\n await this.sql.listen(this.channel, (payload) => {\r\n try {\r\n const data = JSON.parse(payload);\r\n if (data.queue) {\r\n onTrigger(data.queue);\r\n }\r\n } catch (err) {\r\n console.error(\"[TcpListenTransport] Failed to parse payload:\", err);\r\n }\r\n });\r\n console.log(`[TcpListenTransport] Listening on PostgreSQL channel: ${this.channel}`);\r\n }\r\n\r\n async stop() {\r\n //await this.sql.unlisten(this.channel);\r\n }\r\n}",
|
|
14
|
+
"import type { ITransportStrategy, IPollingTransportStrategy } from \"../types\";\r\nimport type postgres from \"postgres\";\r\n\r\nexport class PollingTransport implements IPollingTransportStrategy {\r\n public readonly type = \"polling\";\r\n private timer?: NodeJS.Timeout;\r\n private lastSeenId = 0;\r\n\r\n constructor(\r\n private readonly sql: postgres.Sql,\r\n private readonly intervalMs: number = 2000\r\n ) {}\r\n\r\n async start(onTrigger: (targetQueue: string) => Promise<void>): Promise<void> {\r\n this.timer = setInterval(async () => {\r\n try {\r\n // Fetch unconsumed rows efficiently using an index cursor\r\n const rows = await this.sql`\r\n SELECT id, queue_name \r\n FROM pulsar_engine.queues \r\n WHERE id > ${this.lastSeenId} \r\n ORDER BY id ASC \r\n LIMIT 100\r\n `;\r\n\r\n for (const row of rows) {\r\n this.lastSeenId = row.id;\r\n await onTrigger(row.queue_name);\r\n }\r\n } catch (err) {\r\n console.error(\"[PollingTransport] Error during polling tick:\", err);\r\n }\r\n }, this.intervalMs);\r\n\r\n console.log(`[PollingTransport] Active with interval: ${this.intervalMs}ms`);\r\n }\r\n\r\n async stop(): Promise<void> {\r\n if (this.timer) clearInterval(this.timer);\r\n }\r\n}",
|
|
15
|
+
"import { WebhookTransport } from \"./strategies/WebhookTransport\";\r\nimport { TcpListenTransport } from \"./strategies/TcpListenTransport\";\r\nimport { PollingTransport } from \"./strategies/PollingTransport\";\r\n\r\nimport type postgres from \"postgres\";\r\nimport type { ITransportStrategy, TransportConfig, WebhookHandleRequestParams } from \"./types\";\r\n\r\nexport class PulsarTransportManager {\r\n private strategy : ITransportStrategy;\r\n\r\n constructor(config : TransportConfig, db? : postgres.Sql) {\r\n switch (config.mode) {\r\n case \"webhook\":\r\n this.strategy = new WebhookTransport();\r\n break;\r\n case \"tcp_listen\":\r\n if (!db) throw new Error(\"PostgreSQL client is required for tcp_listen transport.\");\r\n this.strategy = new TcpListenTransport(db, config.channelName);\r\n break;\r\n case \"polling\":\r\n if (!db) throw new Error(\"PostgreSQL client is required for polling transport.\");\r\n this.strategy = new PollingTransport(db, config.pollingIntervalMs);\r\n break;\r\n default:\r\n throw new Error(`Unknown transport mode: ${(config as any)?.mode}`);\r\n }\r\n }\r\n\r\n \r\n public async handleRequest(args : WebhookHandleRequestParams) {\r\n if(this.strategy.type !== \"webhook\") {\r\n throw new Error(`[PulsarTransportManager] Invalid strategy type for handleRequest. Expected 'webhook', got '${this.strategy.type}'.`);\r\n }\r\n\r\n return this.strategy.handleRequest(args);\r\n }\r\n\r\n public async initialize(onTrigger : (queue : string) => Promise<void>) {\r\n if(this.strategy.type !== \"webhook\") {\r\n this.strategy.start(onTrigger);\r\n }\r\n\r\n //await this.strategy.start(onTrigger);\r\n }\r\n\r\n public async shutdown() {\r\n //await this.strategy.stop();\r\n }\r\n}\r\n"
|
|
16
|
+
],
|
|
17
|
+
"mappings": "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",
|
|
18
|
+
"debugId": "5889B469922F5E2964756E2164756E21",
|
|
19
|
+
"names": []
|
|
20
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ParsedRequest {
|
|
2
|
+
method: string;
|
|
3
|
+
url: string;
|
|
4
|
+
headers: Record<string, string>;
|
|
5
|
+
query: Record<string, string>;
|
|
6
|
+
body: any;
|
|
7
|
+
rawBody: string | null;
|
|
8
|
+
}
|
|
9
|
+
export declare function parseRequest(rawInput: any): Promise<ParsedRequest>;
|
|
10
|
+
//# sourceMappingURL=parseRequest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseRequest.d.ts","sourceRoot":"","sources":["../../../src/server/parser/parseRequest.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAwID,wBAAsB,YAAY,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAsHxE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { EnginePoolingMode } from "@package/src/types/engine.types";
|
|
2
|
+
export type ResponseHeaders = {
|
|
3
|
+
isRestarted: boolean;
|
|
4
|
+
poolerMode: EnginePoolingMode;
|
|
5
|
+
lastExecutionId: string;
|
|
6
|
+
lastExecutionAt: string;
|
|
7
|
+
lastIsolateId: string;
|
|
8
|
+
executionOwner: "watchdog" | "engine" | "trigger";
|
|
9
|
+
targetQueue?: string;
|
|
10
|
+
fencingToken?: string;
|
|
11
|
+
};
|
|
12
|
+
export declare const extractHeaders: (rawHeaders: Record<string, string>) => ResponseHeaders;
|
|
13
|
+
//# sourceMappingURL=extract-headers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-headers.d.ts","sourceRoot":"","sources":["../../../src/server/utility/extract-headers.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,MAAM,MAAM,eAAe,GAAG;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,YAAa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAI,eAWrE,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { EngineConfig } from "../types/base.types.d.ts";
|
|
2
|
+
import type { PostgresEngineOperationRepository } from "../storage/repositories/PostgresEngineOperationRepository";
|
|
3
|
+
import type { EngineQueuesConfig } from "../types/queue.types";
|
|
4
|
+
import type { PathValue, SettablePathKeys, ReadablePathKeys } from "../types/config.types";
|
|
5
|
+
export declare class ConfigurationStore {
|
|
6
|
+
private static instance;
|
|
7
|
+
protected _config?: EngineConfig;
|
|
8
|
+
private initialSnapshot?;
|
|
9
|
+
private logger;
|
|
10
|
+
constructor();
|
|
11
|
+
static getInstance(): ConfigurationStore;
|
|
12
|
+
initialize(baseConfig: EngineConfig): void;
|
|
13
|
+
private throwExpectionOnInvalidConfiguration;
|
|
14
|
+
private ensureInitialized;
|
|
15
|
+
get raw(): Readonly<EngineConfig>;
|
|
16
|
+
get<P extends ReadablePathKeys<EngineConfig>>(path: P): PathValue<EngineConfig, P>;
|
|
17
|
+
getInitialSnapshot(): Readonly<EngineConfig>;
|
|
18
|
+
set<P extends SettablePathKeys<EngineConfig>>(path: P, value: PathValue<EngineConfig, P>): void;
|
|
19
|
+
modifyQueue<K extends keyof EngineQueuesConfig, P extends SettablePathKeys<EngineQueuesConfig>>(queue: string, key: K, value: PathValue<EngineQueuesConfig, P>): void;
|
|
20
|
+
reconcileConfiguration(repository: PostgresEngineOperationRepository): Promise<"[Configuration] status : [VALID]." | "[Configuration] status : [INVALID & Reconciled].">;
|
|
21
|
+
}
|
|
22
|
+
export declare const config: ConfigurationStore;
|
|
23
|
+
//# sourceMappingURL=ConfigurationStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigurationStore.d.ts","sourceRoot":"","sources":["../../src/service/ConfigurationStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,2DAA2D,CAAC;AACnH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAU3F,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAC7C,SAAS,CAAC,OAAO,CAAC,EAAG,YAAY,CAAC;IAClC,OAAO,CAAC,eAAe,CAAC,CAAgB;IACxC,OAAO,CAAC,MAAM,CAAW;;WAMX,WAAW,IAAK,kBAAkB;IAOzC,UAAU,CAAC,UAAU,EAAG,YAAY;IAyC3C,OAAO,CAAC,oCAAoC;IA2D5C,OAAO,CAAC,iBAAiB;IASzB,IAAW,GAAG,IAAK,QAAQ,CAAC,YAAY,CAAC,CAGxC;IAEM,GAAG,CAAC,CAAC,SAAS,gBAAgB,CAAC,YAAY,CAAC,EAAE,IAAI,EAAG,CAAC,GAAI,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;IAgBpF,kBAAkB,IAAK,QAAQ,CAAC,YAAY,CAAC;IAK7C,GAAG,CAAC,CAAC,SAAS,gBAAgB,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,IAAI;IAuB/F,WAAW,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,CAAC,SAAS,gBAAgB,CAAC,kBAAkB,CAAC,EACjG,KAAK,EAAG,MAAM,EACd,GAAG,EAAG,CAAC,EACP,KAAK,EAAG,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAiB/B,sBAAsB,CAAC,UAAU,EAAG,iCAAiC;CAkCrF;AAED,eAAO,MAAM,MAAM,oBAAmC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class IsolateInstance {
|
|
2
|
+
private MAX_ISOLATE_LIFESPAN_MS;
|
|
3
|
+
constructor(MAX_ISOLATE_LIFESPAN_MS: number);
|
|
4
|
+
isSameIsolate(id: string): boolean;
|
|
5
|
+
get id(): string;
|
|
6
|
+
get remainingTime(): number;
|
|
7
|
+
get uptime(): number;
|
|
8
|
+
get maxTime(): number;
|
|
9
|
+
set<T = unknown>(key: string, value: T): void;
|
|
10
|
+
get<T = unknown>(key: string): T | undefined;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=Isolate.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Isolate.service.d.ts","sourceRoot":"","sources":["../../src/service/Isolate.service.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe;IACZ,OAAO,CAAC,uBAAuB;gBAAvB,uBAAuB,EAAG,MAAM;IAM7C,aAAa,CAAC,EAAE,EAAG,MAAM,GAAI,OAAO;IAI3C,IAAI,EAAE,IAAM,MAAM,CAEjB;IAED,IAAI,aAAa,IAAK,MAAM,CAU3B;IAED,IAAI,MAAM,IAAK,MAAM,CAGpB;IAED,IAAI,OAAO,IAAK,MAAM,CAErB;IAED,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAI,IAAI;IAI9C,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAI,CAAC,GAAG,SAAS;CAGhD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { PulsarCore } from "./PulsarBaseService.d.ts";
|
|
2
|
+
import type { ConfigForRuntime, PulsarRuntimeType } from "../types/runtime.types.d.ts";
|
|
3
|
+
export type SpawnerAlgorithm = "ROUND_ROBIN" | "LEAST_CONNECTIONS" | "CBS";
|
|
4
|
+
/**
|
|
5
|
+
* Main orchestrator engine for Pulsar responsible for managing queue execution loops,
|
|
6
|
+
* dynamic scheduling, non-blocking worker dispatching, telemetry collection,
|
|
7
|
+
*/
|
|
8
|
+
export declare class Pulsar<R extends PulsarRuntimeType = PulsarRuntimeType> extends PulsarCore {
|
|
9
|
+
private baseConfig;
|
|
10
|
+
private isolateId;
|
|
11
|
+
private currentExecutionId;
|
|
12
|
+
private lockKey;
|
|
13
|
+
private shutdownPromise;
|
|
14
|
+
private eventCleanUps;
|
|
15
|
+
private activeQueues;
|
|
16
|
+
constructor(baseConfig: ConfigForRuntime<R> & {
|
|
17
|
+
runtime: R;
|
|
18
|
+
});
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
triggerQueue(queue: string): Promise<void>;
|
|
21
|
+
validateConfiguration(): Promise<{
|
|
22
|
+
status: number;
|
|
23
|
+
message: string;
|
|
24
|
+
}>;
|
|
25
|
+
private configureQueueProfiles;
|
|
26
|
+
private runTick;
|
|
27
|
+
shutdown(): Promise<void>;
|
|
28
|
+
scheduleRestart(queue: string): Promise<void>;
|
|
29
|
+
restartForSameIsolate(headers: Record<string, string>): Promise<void>;
|
|
30
|
+
private get executionContext();
|
|
31
|
+
setCurrentExecutionId(id: string): void;
|
|
32
|
+
private generateCurrentExecutionIdFromConfig;
|
|
33
|
+
private registerEvents;
|
|
34
|
+
private removeRegisteredEvents;
|
|
35
|
+
awaitPendingShutdown(): Promise<void>;
|
|
36
|
+
deleteScheduledRestart(queue: string | '__GLOBAL__'): Promise<void>;
|
|
37
|
+
acquireExecutionLock(lockKey: string, ownerId: string, ttlMs: number): Promise<boolean>;
|
|
38
|
+
releaseExecutionLock(lockKey: string, ownerId: string): Promise<boolean>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=Pulsar.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pulsar.service.d.ts","sourceRoot":"","sources":["../../src/service/Pulsar.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAMrF,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,mBAAmB,GAAG,KAAK,CAAC;AAE3E;;;EAGE;AACF,qBAAa,MAAM,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,CAAE,SAAQ,UAAU;IActE,OAAO,CAAC,UAAU;IAZ/B,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,OAAO,CAAU;IAIzB,OAAO,CAAC,eAAe,CAA+B;IAEtD,OAAO,CAAC,aAAa,CAA0B;IAE/C,OAAO,CAAC,YAAY,CAAiC;gBAEhC,UAAU,EAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG;QAAE,OAAO,EAAG,CAAC,CAAA;KAAE;IAoB1D,KAAK;IASL,YAAY,CAAC,KAAK,EAAG,MAAM;IAW3B,qBAAqB;;;;IAKlC,OAAO,CAAC,sBAAsB;YAOhB,OAAO;IAKR,QAAQ;IA0BR,eAAe,CAAC,KAAK,EAAG,MAAM;IAmB9B,qBAAqB,CAAC,OAAO,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAkBnE,OAAO,KAAK,gBAAgB,GAU3B;IAEM,qBAAqB,CAAC,EAAE,EAAG,MAAM;IAIxC,OAAO,CAAC,oCAAoC;IAK5C,OAAO,CAAC,cAAc;IA6CtB,OAAO,CAAC,sBAAsB;IAKjB,oBAAoB;IAIpB,sBAAsB,CAAC,KAAK,EAAG,MAAM,GAAG,YAAY;IAIpD,oBAAoB,CAAC,OAAO,EAAG,MAAM,EAAE,OAAO,EAAG,MAAM,EAAE,KAAK,EAAG,MAAM;IAIvE,oBAAoB,CAAC,OAAO,EAAG,MAAM,EAAE,OAAO,EAAG,MAAM;CAGvE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { PulsarUnifiedStorage } from '../storage/PulsarStorage.d.ts';
|
|
2
|
+
import { PulsarEventBus } from './PulsarEventBus.d.ts';
|
|
3
|
+
import { PulsarClock } from '../subsys/PulsarClock.d.ts';
|
|
4
|
+
import { QueueService } from '../modules/Queue.module.d.ts';
|
|
5
|
+
import { SwarmManager } from './SwarmBudgetTracker.d.ts';
|
|
6
|
+
import { Scheduler } from "../modules/Scheduler.module.d.ts";
|
|
7
|
+
import { TickService } from '../modules/Tick.module.d.ts';
|
|
8
|
+
import { TickController } from '../modules/TickController.module.d.ts';
|
|
9
|
+
import { PulsarRuntime } from '../types/runtime.types.d.ts';
|
|
10
|
+
import type { EngineQueuesConfig } from '../types/queue.types.d.ts';
|
|
11
|
+
import type { EngineConsumerConfig } from '../types/consumer.types.d.ts';
|
|
12
|
+
import type { IsolateInstance } from './Isolate.service.d.ts';
|
|
13
|
+
import type { EngineConfig } from '../types/base.types.d.ts';
|
|
14
|
+
import type { IIntegration, IntegrationConstructor, IntegrationMap } from '../types/integrations.types.d.ts';
|
|
15
|
+
import type { PulsarRuntimeCore } from '../shared/PulsarRuntimeCore.d.ts';
|
|
16
|
+
import { UnifiedTransportManager } from '../network/UnifiedTransportManager.d.ts';
|
|
17
|
+
import { LoggerService } from '../subsys/LoggerService.d.ts';
|
|
18
|
+
import { ConsumerDispatch } from '../dispatch/ConsumerDispatch.d.ts';
|
|
19
|
+
/**
|
|
20
|
+
* Core abstract base class for the Pulsar engine ecosystem.
|
|
21
|
+
*
|
|
22
|
+
* Provides foundational lifecycle management, centralized event emitting, unified storage
|
|
23
|
+
* initialization, queue registration
|
|
24
|
+
*/
|
|
25
|
+
export declare abstract class PulsarCore {
|
|
26
|
+
protected storage: PulsarUnifiedStorage;
|
|
27
|
+
protected tickService: TickService;
|
|
28
|
+
protected tickController: TickController;
|
|
29
|
+
protected unifiedTransportManager: UnifiedTransportManager;
|
|
30
|
+
protected dispatcher: ConsumerDispatch;
|
|
31
|
+
protected swarmManager: SwarmManager;
|
|
32
|
+
protected scheduler: Scheduler;
|
|
33
|
+
protected queueService: QueueService;
|
|
34
|
+
protected clock: PulsarClock;
|
|
35
|
+
protected events: PulsarEventBus;
|
|
36
|
+
protected queues: EngineQueuesConfig[];
|
|
37
|
+
protected consumers: EngineConsumerConfig[];
|
|
38
|
+
protected runtimeStrategy: PulsarRuntimeCore;
|
|
39
|
+
readonly logger: LoggerService;
|
|
40
|
+
private readonly integrations;
|
|
41
|
+
constructor(baseConfig: EngineConfig);
|
|
42
|
+
private resolveRuntimeStrategy;
|
|
43
|
+
protected runIntegrations(integrations: Array<IntegrationConstructor | IIntegration>): Promise<void>;
|
|
44
|
+
getIntegration<K extends keyof IntegrationMap>(moduleOrClass: K): IntegrationMap[K];
|
|
45
|
+
getIntegration<T extends IIntegration>(moduleOrClass: new (...args: any[]) => T): T;
|
|
46
|
+
get runtime(): keyof typeof PulsarRuntime;
|
|
47
|
+
get isV8Isolate(): boolean;
|
|
48
|
+
get V8Isolate(): IsolateInstance;
|
|
49
|
+
protected exit(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=PulsarBaseService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PulsarBaseService.d.ts","sourceRoot":"","sources":["../../src/service/PulsarBaseService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAM1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAC3G,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,gCAAgC,CAAC;AAG7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE;;;;;EAKE;AACF,8BAAsB,UAAU;IAC5B,SAAS,CAAC,OAAO,EAAG,oBAAoB,CAAC;IAEzC,SAAS,CAAC,WAAW,EAAG,WAAW,CAAC;IACpC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC;IAEzC,SAAS,CAAC,uBAAuB,EAAG,uBAAuB,CAAC;IAC5D,SAAS,CAAC,UAAU,EAAG,gBAAgB,CAAC;IACxC,SAAS,CAAC,YAAY,EAAG,YAAY,CAAC;IACtC,SAAS,CAAC,SAAS,EAAG,SAAS,CAAC;IAChC,SAAS,CAAC,YAAY,EAAG,YAAY,CAAC;IAEtC,SAAS,CAAC,KAAK,EAAG,WAAW,CAAC;IAC9B,SAAS,CAAC,MAAM,EAAG,cAAc,CAAC;IAElC,SAAS,CAAC,MAAM,EAAG,kBAAkB,EAAE,CAAM;IAC7C,SAAS,CAAC,SAAS,EAAG,oBAAoB,EAAE,CAAM;IAElD,SAAS,CAAC,eAAe,EAAE,iBAAiB,CAAC;IAE7C,SAAgB,MAAM,EAAG,aAAa,CAAC;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;gBAEnD,UAAU,EAAG,YAAY;IA2GtC,OAAO,CAAC,sBAAsB;cAuBd,eAAe,CAAC,YAAY,EAAG,KAAK,CAAC,sBAAsB,GAAG,YAAY,CAAC;IAiBpF,cAAc,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,aAAa,EAAG,CAAC,GAAI,cAAc,CAAC,CAAC,CAAC;IACrF,cAAc,CAAC,CAAC,SAAS,YAAY,EAAE,aAAa,EAAG,KAAK,GAAG,IAAI,EAAG,GAAG,EAAE,KAAK,CAAC,GAAI,CAAC;IAiB7F,IAAI,OAAO,IAAK,MAAM,OAAO,aAAa,CAEzC;IAED,IAAI,WAAW,YAEd;IAED,IAAI,SAAS,IAAK,eAAe,CAEhC;cAEe,IAAI;CAGvB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { EngineQueuesConfig } from "../types/queue.types";
|
|
2
|
+
type PulsarEventMap = {
|
|
3
|
+
"tick:time-exceeded": {
|
|
4
|
+
queue: string;
|
|
5
|
+
elapsedMs: number;
|
|
6
|
+
};
|
|
7
|
+
"tick:cycle-completed": {
|
|
8
|
+
queue: string;
|
|
9
|
+
cycles: number;
|
|
10
|
+
};
|
|
11
|
+
"tick:force-run": {
|
|
12
|
+
queue: EngineQueuesConfig;
|
|
13
|
+
reason?: string;
|
|
14
|
+
};
|
|
15
|
+
"tick:end": {
|
|
16
|
+
queue: string;
|
|
17
|
+
reason?: string;
|
|
18
|
+
};
|
|
19
|
+
"engine:shutdown-requested": {
|
|
20
|
+
reason: string;
|
|
21
|
+
};
|
|
22
|
+
"engine:health-check-requested": {
|
|
23
|
+
timestamp: number;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export declare class PulsarEventBus {
|
|
27
|
+
private target;
|
|
28
|
+
emit<K extends keyof PulsarEventMap>(event: K, payload: PulsarEventMap[K]): void;
|
|
29
|
+
on<K extends keyof PulsarEventMap>(event: K, handler: (payload: PulsarEventMap[K]) => Promise<void> | void): () => void;
|
|
30
|
+
once<K extends keyof PulsarEventMap>(event: K, handler: (payload: PulsarEventMap[K]) => Promise<void> | void): void;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=PulsarEventBus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PulsarEventBus.d.ts","sourceRoot":"","sources":["../../src/service/PulsarEventBus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,KAAK,cAAc,GAAG;IAClB,oBAAoB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,sBAAsB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,gBAAgB,EAAE;QAAE,KAAK,EAAE,kBAAkB,CAAC;QAAC,MAAM,CAAC,EAAG,MAAM,CAAA;KAAE,CAAC;IAClE,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAG,MAAM,CAAA;KAAE,CAAC;IAChD,2BAA2B,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,+BAA+B,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D,CAAA;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAqB;IAE5B,IAAI,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAI,IAAI;IAIjF,EAAE,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAI,MAAM,IAAI;IAOxH,IAAI,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAI,IAAI;CAI9H"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class SwarmManager {
|
|
2
|
+
private maxGlobalJobsPerTick;
|
|
3
|
+
private maxGlobalConcurrency;
|
|
4
|
+
constructor(maxGlobalJobsPerTick: number, maxGlobalConcurrency: number);
|
|
5
|
+
/**
|
|
6
|
+
* Getter for configured maximum global worker concurrency.
|
|
7
|
+
*/
|
|
8
|
+
getMaxGlobalConcurrency(): number;
|
|
9
|
+
/**
|
|
10
|
+
* Getter for configured maximum global jobs per 1s tick window.
|
|
11
|
+
*/
|
|
12
|
+
getMaxGlobalJobsPerTick(): number;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=SwarmBudgetTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwarmBudgetTracker.d.ts","sourceRoot":"","sources":["../../src/service/SwarmBudgetTracker.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IAEjB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,oBAAoB;gBADpB,oBAAoB,EAAE,MAAM,EAC5B,oBAAoB,EAAE,MAAM;IAGxC;;OAEG;IACI,uBAAuB,IAAI,MAAM;IAIxC;;OAEG;IACI,uBAAuB,IAAI,MAAM;CAG3C"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ParsedRequest {
|
|
2
|
+
method: string;
|
|
3
|
+
url: string;
|
|
4
|
+
headers: Record<string, string>;
|
|
5
|
+
query: Record<string, string>;
|
|
6
|
+
body: any;
|
|
7
|
+
rawBody: string | null;
|
|
8
|
+
}
|
|
9
|
+
export declare function parseAnyPayload(rawInput: any): Promise<ParsedRequest>;
|
|
10
|
+
//# sourceMappingURL=PulsarWorker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PulsarWorker.d.ts","sourceRoot":"","sources":["../../../src/service/consumers/PulsarWorker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAwID,wBAAsB,eAAe,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAsH3E"}
|