@oktis-works/plugin-runtime 0.5.5 → 0.5.7
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/dist/bootstrap.d.ts +74 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +272 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/hook-registry.d.ts +60 -1
- package/dist/hook-registry.d.ts.map +1 -1
- package/dist/hook-registry.js +142 -10
- package/dist/hook-registry.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +7 -9
- package/dist/loader.js.map +1 -1
- package/dist/manifest.d.ts +24 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +76 -0
- package/dist/manifest.js.map +1 -0
- package/dist/plugin-api.d.ts +148 -0
- package/dist/plugin-api.d.ts.map +1 -0
- package/dist/plugin-api.js +174 -0
- package/dist/plugin-api.js.map +1 -0
- package/dist/sandbox.d.ts +23 -3
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +29 -4
- package/dist/sandbox.js.map +1 -1
- package/package.json +2 -2
package/dist/sandbox.d.ts
CHANGED
|
@@ -1,18 +1,38 @@
|
|
|
1
1
|
import type { PluginManifest, PluginContext, PluginHookHandler, PluginAPI } from '@oktis-works/plugin-sdk';
|
|
2
2
|
export interface SandboxConfig {
|
|
3
|
+
/** Timeout para callbacks de hook (ms). 0 = sem timeout. */
|
|
3
4
|
timeoutMs: number;
|
|
4
|
-
|
|
5
|
+
/**
|
|
6
|
+
* **Política** de permissões concedidas (allowlist vinda de configuração /
|
|
7
|
+
* catálogo). Nunca o manifesto: passar as permissões do próprio manifesto
|
|
8
|
+
* aqui seria uma tautologia (aprovação garantida).
|
|
9
|
+
*/
|
|
5
10
|
allowedPermissions: string[];
|
|
6
11
|
}
|
|
7
12
|
export declare class PluginSandbox {
|
|
8
13
|
private config;
|
|
9
14
|
constructor(config?: Partial<SandboxConfig>);
|
|
10
15
|
loadPlugin(manifest: PluginManifest, api: PluginAPI): LoadedPlugin;
|
|
11
|
-
/** BUSI plugin-style-isolation:
|
|
16
|
+
/** BUSI plugin-style-isolation: CSS global sem escopo é escopado ao servir via scopePluginCss */
|
|
12
17
|
private enforceStyleIsolation;
|
|
13
18
|
executeHook(hookName: string, context: PluginContext, handler: PluginHookHandler, payload: unknown, pluginPermissions?: string[]): Promise<void>;
|
|
14
19
|
callHandler<T>(handler: (...args: unknown[]) => T | Promise<T>, context: PluginContext, ...args: unknown[]): Promise<T>;
|
|
15
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Aplica o timeout **no ponto real de execução** (registro do callback).
|
|
22
|
+
*
|
|
23
|
+
* - retorno síncrono → devolve o valor como está (semântica síncrona dos
|
|
24
|
+
* filtros, DECI-026 — um `applyFilters` não pode virar Promise);
|
|
25
|
+
* - retorno assíncrono → corre contra o timeout (`timeoutMs`).
|
|
26
|
+
*
|
|
27
|
+
* Limite honesto: `Promise.race` não interrompe CPU síncrona; plugins
|
|
28
|
+
* custosos de bloco continuam travando o processo (isolamento real seria
|
|
29
|
+
* worker/processo separado).
|
|
30
|
+
*/
|
|
31
|
+
wrapCallback<TArgs extends unknown[]>(fn: (...args: TArgs) => unknown): (...args: TArgs) => unknown;
|
|
32
|
+
/** Race Promise × timeout (API pública usada pelo bootstrap). */
|
|
33
|
+
withTimeout<T>(promise: Promise<T>): Promise<T>;
|
|
34
|
+
/** Política vigente (para testes/observabilidade). */
|
|
35
|
+
getPolicy(): SandboxConfig;
|
|
16
36
|
private checkPermissions;
|
|
17
37
|
}
|
|
18
38
|
export interface LoadedPlugin {
|
package/dist/sandbox.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE3G,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE3G,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAOD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAI/C,UAAU,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,SAAS,GAAG,YAAY;IAMlE,iGAAiG;IACjG,OAAO,CAAC,qBAAqB;IAUvB,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,OAAO,EAChB,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC;IAOV,WAAW,CAAC,CAAC,EACjB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAC/C,OAAO,EAAE,aAAa,EACtB,GAAG,IAAI,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,CAAC,CAAC;IAIb;;;;;;;;;;OAUG;IACH,YAAY,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO;IAWnG,iEAAiE;IAC3D,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAcrD,sDAAsD;IACtD,SAAS,IAAI,aAAa;IAI1B,OAAO,CAAC,gBAAgB;CAOzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
package/dist/sandbox.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
const defaultSandboxConfig = {
|
|
2
2
|
timeoutMs: 5000,
|
|
3
|
-
maxMemoryMb: 128,
|
|
4
3
|
allowedPermissions: [],
|
|
5
4
|
};
|
|
6
5
|
export class PluginSandbox {
|
|
@@ -13,13 +12,12 @@ export class PluginSandbox {
|
|
|
13
12
|
this.enforceStyleIsolation(manifest);
|
|
14
13
|
return { manifest, api, loaded: true, loadedAt: Date.now() };
|
|
15
14
|
}
|
|
16
|
-
/** BUSI plugin-style-isolation:
|
|
15
|
+
/** BUSI plugin-style-isolation: CSS global sem escopo é escopado ao servir via scopePluginCss */
|
|
17
16
|
enforceStyleIsolation(manifest) {
|
|
18
17
|
const anyManifest = manifest;
|
|
19
18
|
const style = anyManifest['style'] ?? anyManifest['styles'];
|
|
20
19
|
if (typeof style === 'string' && (style.includes(':root') || style.includes('html{') || style.includes('body{')) && !style.includes('data-plugin')) {
|
|
21
|
-
|
|
22
|
-
console.warn(`[sandbox] Plugin ${manifest.name} declara CSS global sem [data-plugin] — será escopado automaticamente`);
|
|
20
|
+
console.warn(`[sandbox] Plugin ${manifest.name} declara CSS global sem [data-plugin] — será escopado via scopePluginCss ao ser servido em /style.css`);
|
|
23
21
|
}
|
|
24
22
|
}
|
|
25
23
|
async executeHook(hookName, context, handler, payload, pluginPermissions) {
|
|
@@ -31,6 +29,29 @@ export class PluginSandbox {
|
|
|
31
29
|
async callHandler(handler, context, ...args) {
|
|
32
30
|
return this.withTimeout(Promise.resolve(handler(context, ...args)));
|
|
33
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Aplica o timeout **no ponto real de execução** (registro do callback).
|
|
34
|
+
*
|
|
35
|
+
* - retorno síncrono → devolve o valor como está (semântica síncrona dos
|
|
36
|
+
* filtros, DECI-026 — um `applyFilters` não pode virar Promise);
|
|
37
|
+
* - retorno assíncrono → corre contra o timeout (`timeoutMs`).
|
|
38
|
+
*
|
|
39
|
+
* Limite honesto: `Promise.race` não interrompe CPU síncrona; plugins
|
|
40
|
+
* custosos de bloco continuam travando o processo (isolamento real seria
|
|
41
|
+
* worker/processo separado).
|
|
42
|
+
*/
|
|
43
|
+
wrapCallback(fn) {
|
|
44
|
+
if (this.config.timeoutMs <= 0)
|
|
45
|
+
return fn;
|
|
46
|
+
return (...args) => {
|
|
47
|
+
const result = fn(...args);
|
|
48
|
+
if (result && typeof result.then === 'function') {
|
|
49
|
+
return this.withTimeout(result);
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** Race Promise × timeout (API pública usada pelo bootstrap). */
|
|
34
55
|
async withTimeout(promise) {
|
|
35
56
|
let timer;
|
|
36
57
|
try {
|
|
@@ -46,6 +67,10 @@ export class PluginSandbox {
|
|
|
46
67
|
clearTimeout(timer);
|
|
47
68
|
}
|
|
48
69
|
}
|
|
70
|
+
/** Política vigente (para testes/observabilidade). */
|
|
71
|
+
getPolicy() {
|
|
72
|
+
return { ...this.config };
|
|
73
|
+
}
|
|
49
74
|
checkPermissions(permissions) {
|
|
50
75
|
for (const permission of permissions) {
|
|
51
76
|
if (!this.config.allowedPermissions.includes(permission)) {
|
package/dist/sandbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oktis-works/plugin-runtime",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.7",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"clean": "rm -rf dist tsconfig.tsbuildinfo"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@oktis-works/plugin-sdk": "^0.5.
|
|
19
|
+
"@oktis-works/plugin-sdk": "^0.5.6",
|
|
20
20
|
"@oktis-works/types": "^0.5.5",
|
|
21
21
|
"@oktis-works/validation": "^0.5.5",
|
|
22
22
|
"semver": "7"
|