@ductape/sdk 0.1.154 → 0.1.156

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.
@@ -4,8 +4,16 @@ import type { IBootstrapFeatureStep } from '../api/services/productsApi.service'
4
4
  export declare const BOOTSTRAP_CACHE_TTL_MS: number;
5
5
  export declare const BOOTSTRAP_REDIS_PREFIX = "ductape:bootstrap:";
6
6
  export type BootstrapDomain = 'action' | 'notification' | 'storage' | 'session' | 'database' | 'broker' | 'graph' | 'vector' | 'resilience' | 'intelligence' | 'workflow';
7
+ export interface IRuntimeBootstrapEntry {
8
+ domain: BootstrapDomain;
9
+ parts: string[];
10
+ data: unknown;
11
+ }
7
12
  export declare function buildBootstrapCacheKey(domain: BootstrapDomain, workspaceId: string, parts: Array<string | undefined | null>): string;
8
13
  export declare function hashFeatureSteps(steps: IBootstrapFeatureStep[]): string;
14
+ /** Atomically prime all runtime entries into the process cache. */
15
+ export declare function primeRuntimeBootstrapCache(workspaceId: string, scope: string, entries: IRuntimeBootstrapEntry[]): void;
16
+ export declare function touchRuntimeBootstrapCache(scope: string): void;
9
17
  /**
10
18
  * Tiered bootstrap response cache: in-memory first, optional Redis (encrypted with workspace key).
11
19
  * Keys: domain:workspaceId:product:env:tag…
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BootstrapCache = exports.BOOTSTRAP_REDIS_PREFIX = exports.BOOTSTRAP_CACHE_TTL_MS = void 0;
4
4
  exports.buildBootstrapCacheKey = buildBootstrapCacheKey;
5
5
  exports.hashFeatureSteps = hashFeatureSteps;
6
+ exports.primeRuntimeBootstrapCache = primeRuntimeBootstrapCache;
7
+ exports.touchRuntimeBootstrapCache = touchRuntimeBootstrapCache;
6
8
  const crypto_1 = require("crypto");
7
9
  const processor_utils_1 = require("../processor/utils/processor.utils");
8
10
  /** TTL for bootstrap cache (same component version = same bootstrap). 5 minutes. */
@@ -23,6 +25,31 @@ function hashFeatureSteps(steps) {
23
25
  // only caused duplicate calls when Features delegated to Database/Graph/etc.
24
26
  const processBootstrapCache = new Map();
25
27
  const processBootstrapInFlight = new Map();
28
+ const processRuntimeKeys = new Map();
29
+ /** Atomically prime all runtime entries into the process cache. */
30
+ function primeRuntimeBootstrapCache(workspaceId, scope, entries) {
31
+ const storedAt = Date.now();
32
+ const replacements = entries.map((entry) => ({
33
+ key: buildBootstrapCacheKey(entry.domain, workspaceId, entry.parts),
34
+ data: entry.data,
35
+ }));
36
+ const nextKeys = new Set(replacements.map((entry) => entry.key));
37
+ for (const previousKey of processRuntimeKeys.get(scope) || []) {
38
+ if (!nextKeys.has(previousKey))
39
+ processBootstrapCache.delete(previousKey);
40
+ }
41
+ for (const entry of replacements)
42
+ processBootstrapCache.set(entry.key, { data: entry.data, storedAt });
43
+ processRuntimeKeys.set(scope, nextKeys);
44
+ }
45
+ function touchRuntimeBootstrapCache(scope) {
46
+ const storedAt = Date.now();
47
+ for (const key of processRuntimeKeys.get(scope) || []) {
48
+ const entry = processBootstrapCache.get(key);
49
+ if (entry)
50
+ processBootstrapCache.set(key, Object.assign(Object.assign({}, entry), { storedAt }));
51
+ }
52
+ }
26
53
  /**
27
54
  * Tiered bootstrap response cache: in-memory first, optional Redis (encrypted with workspace key).
28
55
  * Keys: domain:workspaceId:product:env:tag…
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-cache.js","sourceRoot":"","sources":["../../src/products/bootstrap-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap-cache.js","sourceRoot":"","sources":["../../src/products/bootstrap-cache.ts"],"names":[],"mappings":"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"}
@@ -624,17 +624,15 @@ class ProductsBuilderService {
624
624
  }
625
625
  async bootstrapNotification(params) {
626
626
  try {
627
- return await this.cachedBootstrap('notification', [params.product_tag, params.env_slug, params.notification_tag, params.message_tag], async () => {
628
- const result = await this.productApi.bootstrapNotification(params, this.getUserAccess());
629
- if (result.notification && result.private_key) {
630
- result.notification = this.decryptNotificationChannelConfigs(result.notification, result.private_key);
631
- }
632
- return result;
633
- }, (result) => {
627
+ const result = await this.cachedBootstrap('notification', [params.product_tag, params.env_slug, params.notification_tag, params.message_tag], () => this.productApi.bootstrapNotification(params, this.getUserAccess()), (result) => {
634
628
  if (result.product_id) {
635
629
  this.product_id = result.product_id;
636
630
  }
637
631
  });
632
+ if (result.notification && result.private_key) {
633
+ result.notification = this.decryptNotificationChannelConfigs(result.notification, result.private_key);
634
+ }
635
+ return result;
638
636
  }
639
637
  catch (e) {
640
638
  throw e;
@@ -713,8 +711,40 @@ class ProductsBuilderService {
713
711
  * Bootstrap feature - fetch all action/notification/storage data for multiple steps in one API call
714
712
  */
715
713
  async bootstrapFeature(params) {
714
+ var _a;
716
715
  try {
717
716
  const auth = this.getUserAccess();
717
+ const cachedSteps = {};
718
+ for (const step of params.steps) {
719
+ const domain = step.type === 'quota' || step.type === 'fallback' ? 'resilience' : step.type;
720
+ const parts = step.type === 'action'
721
+ ? [params.product_tag, step.access_tag, params.env_slug, step.action_tag]
722
+ : step.type === 'notification'
723
+ ? [params.product_tag, params.env_slug, step.notification_tag, step.message_tag]
724
+ : step.type === 'storage'
725
+ ? [params.product_tag, params.env_slug, step.storage_tag]
726
+ : step.type === 'database'
727
+ ? [params.product_tag, params.env_slug, step.database_tag]
728
+ : step.type === 'broker'
729
+ ? [params.product_tag, params.env_slug, step.broker_tag, (_a = step.topic_tag) !== null && _a !== void 0 ? _a : '']
730
+ : step.type === 'graph'
731
+ ? [params.product_tag, params.env_slug, step.graph_tag]
732
+ : step.type === 'vector'
733
+ ? [params.product_tag, params.env_slug, step.vector_tag]
734
+ : [params.product_tag, params.env_slug, step.type, step.component_tag];
735
+ const cached = await this.bootstrapCache.get((0, bootstrap_cache_1.buildBootstrapCacheKey)(domain, this.workspace_id, parts));
736
+ if (cached == null)
737
+ break;
738
+ const cachedData = cached;
739
+ cachedSteps[step.step_tag] = step.type === 'notification' && (cachedData === null || cachedData === void 0 ? void 0 : cachedData.notification) && (cachedData === null || cachedData === void 0 ? void 0 : cachedData.private_key)
740
+ ? Object.assign(Object.assign({}, cachedData), { notification: this.decryptNotificationChannelConfigs(cachedData.notification, cachedData.private_key) }) : cached;
741
+ }
742
+ if (Object.keys(cachedSteps).length === params.steps.length) {
743
+ const first = Object.values(cachedSteps)[0];
744
+ if (first)
745
+ this.applyBootstrapProductContext(params.product_tag, first);
746
+ return cachedSteps;
747
+ }
718
748
  return await this.cachedBootstrap('workflow', [params.product_tag, params.env_slug, (0, bootstrap_cache_1.hashFeatureSteps)(params.steps)], async () => {
719
749
  var _a;
720
750
  const result = await this.productApi.bootstrapFeature(Object.assign(Object.assign({}, params), { workspace_id: auth.workspace_id }), auth);
@@ -2670,27 +2700,31 @@ class ProductsBuilderService {
2670
2700
  if (!appEnv) {
2671
2701
  throw new Error(`app_slug ${env.app_env_slug} not found`);
2672
2702
  }
2673
- // const updates = this.validateAppAuth(auth, version);
2703
+ const updates = auth ? this.validateAppAuth(auth, version) : null;
2674
2704
  this.validateVariablesSchema(env.variables, version.variables, appEnv.base_url_variables);
2675
2705
  this.validateVariablesValues(env.variables, version.variables);
2676
2706
  this.validateBaseUrlVariablesRequired(env.variables, appEnv.base_url_variables);
2677
- /*if (updates && updates.data) {
2678
- env.auth.data = updates.data;
2707
+ if (updates && updates.data && env.auth) {
2708
+ env.auth.data = updates.data;
2709
+ }
2710
+ if (updates && updates.values && env.auth) {
2711
+ env.auth.values = updates.values;
2679
2712
  }
2680
-
2681
- if (updates && updates.values) {
2682
- env.auth.values = updates.values;
2683
- }*/
2684
2713
  return env;
2685
2714
  });
2686
2715
  }
2687
2716
  validateAppAuth(auth, version) {
2717
+ var _a;
2688
2718
  const { auths: appAuth, actions } = version;
2689
2719
  const exists = appAuth.find((appAuth) => appAuth.tag === auth.auth_tag);
2690
2720
  if (!exists) {
2691
2721
  throw new Error(`app_auth ${auth.auth_tag} not found`);
2692
2722
  }
2693
2723
  const { data } = auth;
2724
+ // Existing mappings are already encrypted. Updates that do not replace auth
2725
+ // must preserve the ciphertext instead of attempting to validate/encrypt it again.
2726
+ if (typeof data === 'string')
2727
+ return { data, values: (_a = auth.values) !== null && _a !== void 0 ? _a : null };
2694
2728
  let bodySchema;
2695
2729
  let headerSchema;
2696
2730
  let paramsSchema;