@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.
- package/LICENSE +22 -0
- package/README.md +255 -0
- package/dist/core/manifest.d.ts +21 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +96 -0
- package/dist/core/plugin.d.ts +110 -0
- package/dist/core/plugin.d.ts.map +1 -0
- package/dist/core/plugin.js +272 -0
- package/dist/core/types.d.ts +222 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/jobs/progress.d.ts +79 -0
- package/dist/jobs/progress.d.ts.map +1 -0
- package/dist/jobs/progress.js +165 -0
- package/dist/registry/installation.d.ts +101 -0
- package/dist/registry/installation.d.ts.map +1 -0
- package/dist/registry/installation.js +148 -0
- package/dist/security/hmac.d.ts +28 -0
- package/dist/security/hmac.d.ts.map +1 -0
- package/dist/security/hmac.js +68 -0
- package/dist/server/express.d.ts +43 -0
- package/dist/server/express.d.ts.map +1 -0
- package/dist/server/express.js +279 -0
- package/package.json +52 -0
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|