@relazio/plugin-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.OSINTPlugin = exports.RelazioPlugin = void 0;
37
+ const manifest_1 = require("./manifest");
38
+ const progress_1 = require("../jobs/progress");
39
+ const installation_1 = require("../registry/installation");
40
+ /**
41
+ * Classe principale per creare plugin Relazio
42
+ */
43
+ class RelazioPlugin {
44
+ constructor(config) {
45
+ this.transforms = new Map();
46
+ this.asyncTransforms = new Map();
47
+ this.multiTenant = false;
48
+ this.config = config;
49
+ this.manifestGenerator = new manifest_1.ManifestGenerator(config);
50
+ }
51
+ /**
52
+ * Definisci schema di configurazione
53
+ */
54
+ configure(schema) {
55
+ this.configSchema = schema;
56
+ this.manifestGenerator.setConfigSchema(schema);
57
+ }
58
+ /**
59
+ * Registra una transform sincrona
60
+ */
61
+ transform(config) {
62
+ if (this.transforms.has(config.id) || this.asyncTransforms.has(config.id)) {
63
+ throw new Error(`Transform ${config.id} already registered`);
64
+ }
65
+ this.transforms.set(config.id, config);
66
+ this.manifestGenerator.addTransform(config);
67
+ }
68
+ /**
69
+ * Registra una transform asincrona
70
+ */
71
+ asyncTransform(config) {
72
+ if (this.transforms.has(config.id) || this.asyncTransforms.has(config.id)) {
73
+ throw new Error(`Transform ${config.id} already registered`);
74
+ }
75
+ this.asyncTransforms.set(config.id, config);
76
+ this.manifestGenerator.addTransform(config);
77
+ // Inizializza job queue se non esiste
78
+ if (!this.jobQueue) {
79
+ if (this.multiTenant && this.secretProvider) {
80
+ this.jobQueue = new progress_1.JobQueue(this.secretProvider);
81
+ }
82
+ else if (this.webhookSecret) {
83
+ this.jobQueue = new progress_1.JobQueue(this.webhookSecret);
84
+ }
85
+ }
86
+ }
87
+ /**
88
+ * Imposta webhook secret (single-tenant mode)
89
+ */
90
+ setWebhookSecret(secret) {
91
+ if (this.multiTenant) {
92
+ throw new Error('Cannot set single webhook secret in multi-tenant mode');
93
+ }
94
+ this.webhookSecret = secret;
95
+ if (this.asyncTransforms.size > 0 && !this.jobQueue) {
96
+ this.jobQueue = new progress_1.JobQueue(secret);
97
+ }
98
+ }
99
+ /**
100
+ * Abilita multi-tenancy con secret provider
101
+ */
102
+ enableMultiTenant(secretProvider) {
103
+ this.multiTenant = true;
104
+ this.secretProvider = secretProvider;
105
+ // Inizializza registry se il provider è un InstallationRegistry
106
+ if (secretProvider instanceof installation_1.InstallationRegistry) {
107
+ this.registry = secretProvider;
108
+ }
109
+ else {
110
+ // Crea registry separato per installazioni
111
+ this.registry = new installation_1.InstallationRegistry(this.config.id, this.config.version);
112
+ }
113
+ if (this.asyncTransforms.size > 0 && !this.jobQueue) {
114
+ this.jobQueue = new progress_1.JobQueue(secretProvider);
115
+ }
116
+ }
117
+ /**
118
+ * Abilita multi-tenancy con gestione automatica in-memory
119
+ * Utile per development/testing
120
+ */
121
+ enableMultiTenantInMemory() {
122
+ const registry = new installation_1.InstallationRegistry(this.config.id, this.config.version);
123
+ this.enableMultiTenant(registry);
124
+ return registry;
125
+ }
126
+ /**
127
+ * Ottieni registry (solo multi-tenant)
128
+ */
129
+ getRegistry() {
130
+ return this.registry;
131
+ }
132
+ /**
133
+ * Genera manifest JSON
134
+ */
135
+ generateManifest(options) {
136
+ return this.manifestGenerator.generate(options);
137
+ }
138
+ /**
139
+ * Esegui una transform (usato internamente)
140
+ */
141
+ async executeTransform(transformId, input) {
142
+ const transform = this.transforms.get(transformId);
143
+ if (!transform) {
144
+ throw new Error(`Transform ${transformId} not found`);
145
+ }
146
+ return await transform.handler(input, input.config || {});
147
+ }
148
+ /**
149
+ * Esegui una transform asincrona (usato internamente)
150
+ */
151
+ async executeAsyncTransform(transformId, input, callbackUrl, organizationId) {
152
+ const transform = this.asyncTransforms.get(transformId);
153
+ if (!transform) {
154
+ throw new Error(`Async transform ${transformId} not found`);
155
+ }
156
+ if (!this.jobQueue) {
157
+ throw new Error('Job queue not configured for async transforms');
158
+ }
159
+ // Genera job ID
160
+ const jobId = `${this.config.id}-${transformId}-${Date.now()}`;
161
+ // Crea job con supporto multi-tenant
162
+ let job;
163
+ if (this.multiTenant && organizationId) {
164
+ job = await this.jobQueue.createJobForOrganization(jobId, callbackUrl, organizationId);
165
+ }
166
+ else {
167
+ job = this.jobQueue.createJob(jobId, callbackUrl);
168
+ }
169
+ // Esegui transform in background
170
+ setImmediate(async () => {
171
+ try {
172
+ const result = await transform.handler(input, input.config || {}, job);
173
+ await job.complete(result);
174
+ }
175
+ catch (error) {
176
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
177
+ await job.fail(errorMessage);
178
+ }
179
+ finally {
180
+ this.jobQueue?.removeJob(jobId);
181
+ }
182
+ });
183
+ return { jobId };
184
+ }
185
+ /**
186
+ * Avvia il server plugin
187
+ */
188
+ async start(options) {
189
+ // Se multiTenant option è specificata, abilita multi-tenancy automaticamente
190
+ if (options.multiTenant && !this.multiTenant) {
191
+ this.enableMultiTenantInMemory();
192
+ console.log('⚠️ Multi-tenant mode enabled with in-memory provider');
193
+ console.log(' For production, use enableMultiTenant() with a persistent provider');
194
+ }
195
+ // Import dinamico per evitare dipendenze circolari
196
+ const { ExpressServer } = await Promise.resolve().then(() => __importStar(require('../server/express')));
197
+ this.server = new ExpressServer(this, options);
198
+ await this.server.start();
199
+ console.log(`✅ Plugin "${this.config.name}" running on port ${options.port}`);
200
+ console.log(` - Mode: ${this.multiTenant ? 'Multi-tenant' : 'Single-tenant'}`);
201
+ console.log(` - Transforms: ${this.transforms.size + this.asyncTransforms.size}`);
202
+ console.log(` - Sync: ${this.transforms.size}`);
203
+ console.log(` - Async: ${this.asyncTransforms.size}`);
204
+ }
205
+ /**
206
+ * Ferma il server
207
+ */
208
+ async stop() {
209
+ if (this.server) {
210
+ await this.server.stop();
211
+ }
212
+ }
213
+ /**
214
+ * Ottieni configurazione plugin
215
+ */
216
+ getConfig() {
217
+ return this.config;
218
+ }
219
+ /**
220
+ * Ottieni lista transforms
221
+ */
222
+ getTransforms() {
223
+ return Array.from(this.transforms.keys());
224
+ }
225
+ /**
226
+ * Ottieni lista async transforms
227
+ */
228
+ getAsyncTransforms() {
229
+ return Array.from(this.asyncTransforms.keys());
230
+ }
231
+ /**
232
+ * Ottieni tutte le transforms
233
+ */
234
+ getAllTransforms() {
235
+ return [
236
+ ...Array.from(this.transforms.values()),
237
+ ...Array.from(this.asyncTransforms.values()),
238
+ ];
239
+ }
240
+ /**
241
+ * Verifica se una transform esiste
242
+ */
243
+ hasTransform(transformId) {
244
+ return this.transforms.has(transformId) || this.asyncTransforms.has(transformId);
245
+ }
246
+ /**
247
+ * Verifica se una transform è asincrona
248
+ */
249
+ isAsyncTransform(transformId) {
250
+ return this.asyncTransforms.has(transformId);
251
+ }
252
+ /**
253
+ * Ottieni job queue (per monitoring)
254
+ */
255
+ getJobQueue() {
256
+ return this.jobQueue;
257
+ }
258
+ /**
259
+ * Verifica se è in modalità multi-tenant
260
+ */
261
+ isMultiTenant() {
262
+ return this.multiTenant;
263
+ }
264
+ /**
265
+ * Ottieni secret provider (solo multi-tenant)
266
+ */
267
+ getSecretProvider() {
268
+ return this.secretProvider;
269
+ }
270
+ }
271
+ exports.RelazioPlugin = RelazioPlugin;
272
+ exports.OSINTPlugin = RelazioPlugin;
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Tipi core per Relazio Plugin SDK
3
+ */
4
+ export type EntityType = 'domain' | 'ip' | 'email' | 'phone' | 'person' | 'organization' | 'location' | 'note' | 'url' | 'hash' | 'custom';
5
+ export type PluginCategory = 'network' | 'identity' | 'social' | 'financial' | 'security' | 'other';
6
+ export type JobStatus = 'pending' | 'submitted' | 'processing' | 'completed' | 'failed' | 'timeout' | 'cancelled';
7
+ /**
8
+ * Entità OSINT
9
+ */
10
+ export interface OSINTEntity {
11
+ type: EntityType;
12
+ value: string;
13
+ label?: string;
14
+ metadata?: Record<string, any>;
15
+ }
16
+ /**
17
+ * Arco/connessione tra entità
18
+ */
19
+ export interface OSINTEdge {
20
+ sourceId: string;
21
+ targetId: string | 'auto';
22
+ label: string;
23
+ relationship: string;
24
+ metadata?: Record<string, any>;
25
+ }
26
+ /**
27
+ * Input per una transform
28
+ */
29
+ export interface TransformInput {
30
+ entity: OSINTEntity & {
31
+ id: string;
32
+ };
33
+ config?: Record<string, any>;
34
+ organizationId?: string;
35
+ }
36
+ /**
37
+ * Risultato di una transform
38
+ */
39
+ export interface TransformResult {
40
+ success?: boolean;
41
+ entities: OSINTEntity[];
42
+ edges: OSINTEdge[];
43
+ metadata?: Record<string, any>;
44
+ message?: string;
45
+ }
46
+ /**
47
+ * Configurazione del plugin
48
+ */
49
+ export interface PluginConfig {
50
+ id: string;
51
+ name: string;
52
+ version: string;
53
+ author: string;
54
+ description: string;
55
+ category: PluginCategory;
56
+ icon?: string;
57
+ logoUrl?: string;
58
+ homepage?: string;
59
+ documentation?: string;
60
+ license?: string;
61
+ }
62
+ /**
63
+ * Schema di configurazione utente
64
+ */
65
+ export interface ConfigField {
66
+ type: 'string' | 'number' | 'boolean' | 'select';
67
+ label: string;
68
+ description?: string;
69
+ required?: boolean;
70
+ secret?: boolean;
71
+ default?: any;
72
+ min?: number;
73
+ max?: number;
74
+ options?: Array<{
75
+ label: string;
76
+ value: string;
77
+ }>;
78
+ }
79
+ export interface ConfigSchema {
80
+ [key: string]: ConfigField;
81
+ }
82
+ /**
83
+ * Configurazione di una transform
84
+ */
85
+ export interface TransformConfig {
86
+ id: string;
87
+ name: string;
88
+ description: string;
89
+ inputType: EntityType;
90
+ outputTypes: EntityType[];
91
+ handler: TransformHandler;
92
+ }
93
+ /**
94
+ * Configurazione di una transform asincrona
95
+ */
96
+ export interface AsyncTransformConfig {
97
+ id: string;
98
+ name: string;
99
+ description: string;
100
+ inputType: EntityType;
101
+ outputTypes: EntityType[];
102
+ handler: AsyncTransformHandler;
103
+ }
104
+ /**
105
+ * Handler per transform sincrona
106
+ */
107
+ export type TransformHandler = (input: TransformInput, config: Record<string, any>) => Promise<TransformResult>;
108
+ /**
109
+ * Handler per transform asincrona
110
+ */
111
+ export type AsyncTransformHandler = (input: TransformInput, config: Record<string, any>, job: JobContext) => Promise<TransformResult>;
112
+ /**
113
+ * Contesto del job per transform asincrone
114
+ */
115
+ export interface JobContext {
116
+ jobId: string;
117
+ updateProgress: (progress: number, message?: string) => Promise<void>;
118
+ cancel: () => Promise<void>;
119
+ }
120
+ /**
121
+ * Opzioni per avviare il server
122
+ */
123
+ export interface StartOptions {
124
+ port: number;
125
+ host?: string;
126
+ https?: {
127
+ key: string;
128
+ cert: string;
129
+ };
130
+ multiTenant?: boolean;
131
+ }
132
+ /**
133
+ * Opzioni per generare il manifest
134
+ */
135
+ export interface ManifestOptions {
136
+ endpoint: string;
137
+ tags?: string[];
138
+ minimumPlatformVersion?: string;
139
+ }
140
+ /**
141
+ * Manifest JSON completo
142
+ */
143
+ export interface PluginManifest {
144
+ manifestVersion: string;
145
+ plugin: {
146
+ id: string;
147
+ name: string;
148
+ description: string;
149
+ version: string;
150
+ author: string;
151
+ authorUrl?: string;
152
+ homepage?: string;
153
+ documentation?: string;
154
+ license?: string;
155
+ icon?: string;
156
+ logoUrl?: string;
157
+ category: PluginCategory;
158
+ capabilities: {
159
+ inputTypes: EntityType[];
160
+ outputTypes: EntityType[];
161
+ estimatedTime: string;
162
+ supportsAsync: boolean;
163
+ };
164
+ configuration?: {
165
+ required: boolean;
166
+ schema: ConfigSchema;
167
+ };
168
+ transforms: Array<{
169
+ id: string;
170
+ name: string;
171
+ description: string;
172
+ inputType: EntityType;
173
+ outputTypes: EntityType[];
174
+ endpoint: string;
175
+ method: string;
176
+ async: boolean;
177
+ }>;
178
+ metadata: {
179
+ tags: string[];
180
+ minimumPlatformVersion: string;
181
+ };
182
+ };
183
+ }
184
+ /**
185
+ * Webhook payload dal plugin alla piattaforma
186
+ */
187
+ export interface WebhookPayload {
188
+ jobId: string;
189
+ status: 'processing' | 'completed' | 'failed';
190
+ progress?: number;
191
+ progressMessage?: string;
192
+ result?: TransformResult;
193
+ error?: string;
194
+ timestamp: string;
195
+ }
196
+ /**
197
+ * Request body per transform
198
+ */
199
+ export interface TransformRequest {
200
+ transformId: string;
201
+ input: TransformInput;
202
+ callbackUrl: string;
203
+ organizationId?: string;
204
+ }
205
+ /**
206
+ * Response per transform sincrona
207
+ */
208
+ export interface SyncTransformResponse {
209
+ async: false;
210
+ result: TransformResult;
211
+ }
212
+ /**
213
+ * Response per transform asincrona
214
+ */
215
+ export interface AsyncTransformResponse {
216
+ async: true;
217
+ jobId: string;
218
+ estimatedTime?: number;
219
+ message?: string;
220
+ }
221
+ export type TransformResponse = SyncTransformResponse | AsyncTransformResponse;
222
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * Tipi core per Relazio Plugin SDK
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Relazio Plugin SDK
3
+ * SDK ufficiale per creare plugin esterni per Relazio
4
+ */
5
+ export { RelazioPlugin, OSINTPlugin } from './core/plugin';
6
+ export { ManifestGenerator } from './core/manifest';
7
+ export type { EntityType, PluginCategory, JobStatus, OSINTEntity, OSINTEdge, TransformInput, TransformResult, PluginConfig, ConfigField, ConfigSchema, TransformConfig, AsyncTransformConfig, TransformHandler, AsyncTransformHandler, JobContext, StartOptions, ManifestOptions, PluginManifest, WebhookPayload, TransformRequest, SyncTransformResponse, AsyncTransformResponse, TransformResponse, } from './core/types';
8
+ export { HMACUtils, verifyWebhookSignature } from './security/hmac';
9
+ export { JobProgressTracker, JobQueue, InMemorySecretProvider } from './jobs/progress';
10
+ export type { WebhookSecretProvider } from './jobs/progress';
11
+ export { InstallationRegistry, MemoryStorage } from './registry/installation';
12
+ export type { Installation, RegistrationRequest, RegistrationResponse, InstallationStorage } from './registry/installation';
13
+ export { ExpressServer } from './server/express';
14
+ export type { Server } from './server/express';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,YAAY,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,SAAS,EACT,cAAc,EACd,eAAe,EACf,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACvF,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EACL,oBAAoB,EACpB,aAAa,EACd,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ /**
3
+ * Relazio Plugin SDK
4
+ * SDK ufficiale per creare plugin esterni per Relazio
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ExpressServer = exports.MemoryStorage = exports.InstallationRegistry = exports.InMemorySecretProvider = exports.JobQueue = exports.JobProgressTracker = exports.verifyWebhookSignature = exports.HMACUtils = exports.ManifestGenerator = exports.OSINTPlugin = exports.RelazioPlugin = void 0;
8
+ // Core exports
9
+ var plugin_1 = require("./core/plugin");
10
+ Object.defineProperty(exports, "RelazioPlugin", { enumerable: true, get: function () { return plugin_1.RelazioPlugin; } });
11
+ Object.defineProperty(exports, "OSINTPlugin", { enumerable: true, get: function () { return plugin_1.OSINTPlugin; } });
12
+ var manifest_1 = require("./core/manifest");
13
+ Object.defineProperty(exports, "ManifestGenerator", { enumerable: true, get: function () { return manifest_1.ManifestGenerator; } });
14
+ // Security
15
+ var hmac_1 = require("./security/hmac");
16
+ Object.defineProperty(exports, "HMACUtils", { enumerable: true, get: function () { return hmac_1.HMACUtils; } });
17
+ Object.defineProperty(exports, "verifyWebhookSignature", { enumerable: true, get: function () { return hmac_1.verifyWebhookSignature; } });
18
+ // Jobs
19
+ var progress_1 = require("./jobs/progress");
20
+ Object.defineProperty(exports, "JobProgressTracker", { enumerable: true, get: function () { return progress_1.JobProgressTracker; } });
21
+ Object.defineProperty(exports, "JobQueue", { enumerable: true, get: function () { return progress_1.JobQueue; } });
22
+ Object.defineProperty(exports, "InMemorySecretProvider", { enumerable: true, get: function () { return progress_1.InMemorySecretProvider; } });
23
+ // Registry & Multi-tenant
24
+ var installation_1 = require("./registry/installation");
25
+ Object.defineProperty(exports, "InstallationRegistry", { enumerable: true, get: function () { return installation_1.InstallationRegistry; } });
26
+ Object.defineProperty(exports, "MemoryStorage", { enumerable: true, get: function () { return installation_1.MemoryStorage; } });
27
+ // Server
28
+ var express_1 = require("./server/express");
29
+ Object.defineProperty(exports, "ExpressServer", { enumerable: true, get: function () { return express_1.ExpressServer; } });
@@ -0,0 +1,79 @@
1
+ import type { JobContext } from '../core/types';
2
+ /**
3
+ * Implementazione del contesto job per transform asincrone
4
+ */
5
+ export declare class JobProgressTracker implements JobContext {
6
+ jobId: string;
7
+ private callbackUrl;
8
+ private hmac;
9
+ private currentProgress;
10
+ constructor(jobId: string, callbackUrl: string, webhookSecret: string);
11
+ /**
12
+ * Aggiorna il progresso del job
13
+ */
14
+ updateProgress(progress: number, message?: string): Promise<void>;
15
+ /**
16
+ * Marca il job come completato
17
+ */
18
+ complete(result: any): Promise<void>;
19
+ /**
20
+ * Marca il job come fallito
21
+ */
22
+ fail(error: string): Promise<void>;
23
+ /**
24
+ * Cancella il job
25
+ */
26
+ cancel(): Promise<void>;
27
+ /**
28
+ * Invia webhook alla piattaforma
29
+ */
30
+ private sendWebhook;
31
+ }
32
+ /**
33
+ * Provider per webhook secrets multi-tenant
34
+ */
35
+ export interface WebhookSecretProvider {
36
+ getSecret(organizationId: string): Promise<string | null>;
37
+ }
38
+ /**
39
+ * Provider in-memory (per sviluppo/testing)
40
+ */
41
+ export declare class InMemorySecretProvider implements WebhookSecretProvider {
42
+ private secrets;
43
+ setSecret(organizationId: string, secret: string): void;
44
+ getSecret(organizationId: string): Promise<string | null>;
45
+ }
46
+ /**
47
+ * Job queue per gestire transform asincrone (multi-tenant)
48
+ */
49
+ export declare class JobQueue {
50
+ private activeJobs;
51
+ private webhookSecret?;
52
+ private secretProvider?;
53
+ constructor(webhookSecretOrProvider?: string | WebhookSecretProvider);
54
+ /**
55
+ * Crea un nuovo job (single-tenant)
56
+ */
57
+ createJob(jobId: string, callbackUrl: string): JobProgressTracker;
58
+ /**
59
+ * Crea un nuovo job (multi-tenant)
60
+ */
61
+ createJobForOrganization(jobId: string, callbackUrl: string, organizationId: string): Promise<JobProgressTracker>;
62
+ /**
63
+ * Ottieni un job esistente
64
+ */
65
+ getJob(jobId: string): JobProgressTracker | undefined;
66
+ /**
67
+ * Rimuovi un job completato
68
+ */
69
+ removeJob(jobId: string): void;
70
+ /**
71
+ * Conta job attivi
72
+ */
73
+ getActiveJobCount(): number;
74
+ /**
75
+ * Verifica se è multi-tenant
76
+ */
77
+ isMultiTenant(): boolean;
78
+ }
79
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/jobs/progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAC;AAGhE;;GAEG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,eAAe,CAAK;gBAEhB,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAMrE;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1C;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B;;OAEG;YACW,WAAW;CAsB1B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC3D;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,qBAAqB;IAClE,OAAO,CAAC,OAAO,CAA6B;IAE5C,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIjD,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAGhE;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,UAAU,CAAyC;IAC3D,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAC,CAAwB;gBAEnC,uBAAuB,CAAC,EAAE,MAAM,GAAG,qBAAqB;IAUpE;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB;IASjE;;OAEG;IACG,wBAAwB,CAC5B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,kBAAkB,CAAC;IAe9B;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAIrD;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB"}