@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/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
- maxMemoryMb: number;
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: bloqueia CSS global se plugin declarar style inline sem escopo */
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
- private withTimeout;
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 {
@@ -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,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAQD,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,kGAAkG;IAClG,OAAO,CAAC,qBAAqB;IASvB,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;YAIC,WAAW;IAczB,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"}
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: bloqueia CSS global se plugin declarar style inline sem escopo */
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
- // apenas warn — escopo será aplicado em runtime via scopePluginCss
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)) {
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAQA,MAAM,oBAAoB,GAAkB;IAC1C,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,GAAG;IAChB,kBAAkB,EAAE,EAAE;CACvB,CAAC;AAEF,MAAM,OAAO,aAAa;IAChB,MAAM,CAAgB;IAE9B,YAAY,SAAiC,EAAE;QAC7C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,MAAM,EAAE,CAAC;IACvD,CAAC;IAED,UAAU,CAAC,QAAwB,EAAE,GAAc;QACjD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACrC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC/D,CAAC;IAED,kGAAkG;IAC1F,qBAAqB,CAAC,QAAwB;QACpD,MAAM,WAAW,GAAG,QAA8C,CAAC;QACnE,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACnJ,mEAAmE;YACnE,OAAO,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,IAAI,uEAAuE,CAAC,CAAC;QACzH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CACf,QAAgB,EAChB,OAAsB,EACtB,OAA0B,EAC1B,OAAgB,EAChB,iBAA4B;QAE5B,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,WAAW,CACf,OAA+C,EAC/C,OAAsB,EACtB,GAAG,IAAe;QAElB,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAEO,KAAK,CAAC,WAAW,CAAI,OAAmB;QAC9C,IAAI,KAAiC,CAAC;QACtC,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;gBACxB,OAAO;gBACP,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;oBAC3B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACnG,CAAC,CAAC;aACH,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,WAAqB;QAC5C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
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.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.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"