@ductape/sdk 0.1.97 → 0.1.99

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;;;;;;;;;;;;;;;;;;AAEH,sBAAsB;AACtB,uDAAmG;AAA1F,kHAAA,cAAc,OAAA;AAAE,gHAAA,YAAY,OAAA;AAAE,kHAAA,cAAc,OAAA;AACrD,uDAAsE;AAA7D,0IAAA,OAAO,OAAyB;AAEzC,iBAAiB;AACjB,qDAAkE;AAAzD,iHAAA,cAAc,OAAA;AAAE,gHAAA,aAAa,OAAA;AACtC,qDAAqE;AAA5D,yIAAA,OAAO,OAAyB;AAEzC,uCAAuC;AACvC,uDAAqE;AAA5D,mHAAA,eAAe,OAAA;AACxB,uDAAuE;AAA9D,2IAAA,OAAO,OAA0B;AAE1C,eAAe;AACf,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;;;;;;;;;;;;;;;;;;AAEH,sBAAsB;AACtB,uDAAmG;AAA1F,kHAAA,cAAc,OAAA;AAAE,gHAAA,YAAY,OAAA;AAAE,kHAAA,cAAc,OAAA;AACrD,uDAAsE;AAA7D,0IAAA,OAAO,OAAyB;AAEzC,iBAAiB;AACjB,qDAAkE;AAAzD,iHAAA,cAAc,OAAA;AAAE,gHAAA,aAAa,OAAA;AACtC,qDAAqE;AAA5D,yIAAA,OAAO,OAAyB;AAEzC,uCAAuC;AACvC,uDAAqE;AAA5D,mHAAA,eAAe,OAAA;AACxB,uDAAuE;AAA9D,2IAAA,OAAO,OAA0B;AAE1C,eAAe;AACf,0CAAwB"}
@@ -248,7 +248,7 @@ export interface IFeatureStorageContext {
248
248
  }
249
249
  /**
250
250
  * Messaging context for feature steps (Ductape primitive).
251
- * Use ctx.messaging.produce() to publish to a message broker.
251
+ * Use ctx.events.produce() to publish to a message broker.
252
252
  */
253
253
  export interface IFeatureMessagingContext {
254
254
  /**
@@ -263,7 +263,7 @@ export interface IFeatureMessagingContext {
263
263
  }
264
264
  /**
265
265
  * Publish context for feature steps.
266
- * @deprecated Prefer ctx.messaging.produce() (Ductape primitive).
266
+ * @deprecated Prefer ctx.events.produce() (Ductape primitive).
267
267
  */
268
268
  export interface IFeaturePublishContext {
269
269
  send(options: {
@@ -7,6 +7,9 @@ export interface ILogsService {
7
7
  publish(): Promise<void>;
8
8
  }
9
9
  export default class LogsService {
10
+ private static readonly DEFAULT_BATCH_BYTES;
11
+ private static readonly DEFAULT_ENTRY_DATA_BYTES;
12
+ private static readonly DEFAULT_MAX_RETRIES;
10
13
  private eventLogs;
11
14
  private user_id;
12
15
  private workspace_id;
@@ -23,6 +26,15 @@ export default class LogsService {
23
26
  constructor({ workspace_id, public_key, user_id, token, product_id, env_type, app_id, workspace_private_key, ip_address, language }: ILoggerInit);
24
27
  add(item: ILogData): void;
25
28
  fetchLogs(): ILogData[];
29
+ private configuredByteLimit;
30
+ private byteLength;
31
+ private truncateUtf8;
32
+ private delay;
33
+ private deliverBatch;
34
+ /**
35
+ * Flush telemetry without making application availability depend on the
36
+ * Logs API. Failed and unsent entries remain queued for a later flush.
37
+ */
26
38
  publish(): Promise<void>;
27
39
  fetch(params: LogQueryParams): Promise<any>;
28
40
  private getUserAccess;
@@ -30,23 +30,36 @@ class LogsService {
30
30
  fetchLogs() {
31
31
  return this.eventLogs;
32
32
  }
33
- async publish() {
34
- var _a, _b;
33
+ configuredByteLimit(name, fallback) {
34
+ const value = typeof process !== 'undefined' ? Number(process.env[name]) : NaN;
35
+ return Number.isFinite(value) && value > 0 ? value : fallback;
36
+ }
37
+ byteLength(value) {
38
+ return new TextEncoder().encode(JSON.stringify(value)).byteLength;
39
+ }
40
+ truncateUtf8(value, maxBytes) {
41
+ if (new TextEncoder().encode(value).byteLength <= maxBytes)
42
+ return value;
43
+ const suffix = '...[truncated by Ductape Logs]';
44
+ const contentBudget = Math.max(0, maxBytes - new TextEncoder().encode(suffix).byteLength);
45
+ let low = 0;
46
+ let high = value.length;
47
+ while (low < high) {
48
+ const mid = Math.ceil((low + high) / 2);
49
+ if (new TextEncoder().encode(value.slice(0, mid)).byteLength <= contentBudget)
50
+ low = mid;
51
+ else
52
+ high = mid - 1;
53
+ }
54
+ return `${value.slice(0, low)}${suffix}`;
55
+ }
56
+ async delay(ms) {
57
+ await new Promise((resolve) => setTimeout(resolve, ms));
58
+ }
59
+ async deliverBatch(batch, attempt = 0) {
60
+ var _a, _b, _c, _d, _e;
35
61
  try {
36
- const payload = this.workspace_private_key
37
- ? this.eventLogs.map((item) => {
38
- var _a;
39
- const dataStr = typeof item.data === 'string' ? item.data : JSON.stringify((_a = item.data) !== null && _a !== void 0 ? _a : {});
40
- try {
41
- const encrypted = (0, processor_utils_1.encrypt)(dataStr, this.workspace_private_key);
42
- return Object.assign(Object.assign({}, item), { data: encrypted, data_encrypted: true });
43
- }
44
- catch (_b) {
45
- return Object.assign(Object.assign({}, item), { data_encrypted: false });
46
- }
47
- })
48
- : this.eventLogs;
49
- await this.logsApi.logData(payload, {
62
+ await this.logsApi.logData(batch, {
50
63
  user_id: this.user_id,
51
64
  token: this.token,
52
65
  workspace_id: this.workspace_id,
@@ -54,10 +67,81 @@ class LogsService {
54
67
  ip_address: (_a = this.ip_address) !== null && _a !== void 0 ? _a : undefined,
55
68
  language: (_b = this.language) !== null && _b !== void 0 ? _b : undefined,
56
69
  });
57
- this.eventLogs = [];
58
70
  }
59
- catch (e) {
60
- throw e;
71
+ catch (error) {
72
+ const status = Number((_c = error === null || error === void 0 ? void 0 : error.response) === null || _c === void 0 ? void 0 : _c.status);
73
+ if (status === 413 && batch.length > 1) {
74
+ const midpoint = Math.ceil(batch.length / 2);
75
+ await this.deliverBatch(batch.slice(0, midpoint), attempt);
76
+ await this.deliverBatch(batch.slice(midpoint), attempt);
77
+ return;
78
+ }
79
+ const maxRetries = this.configuredByteLimit('DUCTAPE_LOG_MAX_RETRIES', LogsService.DEFAULT_MAX_RETRIES);
80
+ const transient = !status || status === 408 || status === 425 || status === 429 || status >= 500;
81
+ if (transient && attempt < maxRetries) {
82
+ const retryAfterSeconds = Number((_e = (_d = error === null || error === void 0 ? void 0 : error.response) === null || _d === void 0 ? void 0 : _d.headers) === null || _e === void 0 ? void 0 : _e['retry-after']);
83
+ const exponentialMs = Math.min(30000, 250 * (2 ** attempt));
84
+ const jitterMs = Math.floor(Math.random() * Math.max(1, exponentialMs / 2));
85
+ const delayMs = Number.isFinite(retryAfterSeconds) && retryAfterSeconds >= 0
86
+ ? retryAfterSeconds * 1000
87
+ : exponentialMs + jitterMs;
88
+ await this.delay(delayMs);
89
+ await this.deliverBatch(batch, attempt + 1);
90
+ return;
91
+ }
92
+ throw error;
93
+ }
94
+ }
95
+ /**
96
+ * Flush telemetry without making application availability depend on the
97
+ * Logs API. Failed and unsent entries remain queued for a later flush.
98
+ */
99
+ async publish() {
100
+ if (!this.eventLogs.length)
101
+ return;
102
+ const pending = this.eventLogs.splice(0, this.eventLogs.length);
103
+ const maxBatchBytes = this.configuredByteLimit('DUCTAPE_LOG_MAX_BATCH_BYTES', LogsService.DEFAULT_BATCH_BYTES);
104
+ const maxEntryDataBytes = this.configuredByteLimit('DUCTAPE_LOG_MAX_ENTRY_DATA_BYTES', LogsService.DEFAULT_ENTRY_DATA_BYTES);
105
+ const payload = pending.map((item) => {
106
+ var _a;
107
+ const rawData = typeof item.data === 'string' ? item.data : JSON.stringify((_a = item.data) !== null && _a !== void 0 ? _a : {});
108
+ const dataStr = this.truncateUtf8(rawData, maxEntryDataBytes);
109
+ if (!this.workspace_private_key)
110
+ return Object.assign(Object.assign({}, item), { data: dataStr });
111
+ try {
112
+ return Object.assign(Object.assign({}, item), { data: (0, processor_utils_1.encrypt)(dataStr, this.workspace_private_key), data_encrypted: true });
113
+ }
114
+ catch (_b) {
115
+ // Never fall back to sending plaintext when encryption was requested.
116
+ return Object.assign(Object.assign({}, item), { data: '[log encryption failed]', data_encrypted: false });
117
+ }
118
+ });
119
+ const batches = [];
120
+ let batch = [];
121
+ let batchBytes = 0;
122
+ for (const item of payload) {
123
+ const itemBytes = this.byteLength(item);
124
+ if (batch.length && batchBytes + itemBytes > maxBatchBytes) {
125
+ batches.push(batch);
126
+ batch = [];
127
+ batchBytes = 0;
128
+ }
129
+ batch.push(item);
130
+ batchBytes += itemBytes;
131
+ }
132
+ if (batch.length)
133
+ batches.push(batch);
134
+ for (let index = 0; index < batches.length; index += 1) {
135
+ try {
136
+ await this.deliverBatch(batches[index]);
137
+ }
138
+ catch (error) {
139
+ const unsent = batches.slice(index).flat();
140
+ this.eventLogs.unshift(...unsent);
141
+ console.warn(`[Ductape Logs] Flush failed; ${unsent.length} log entries retained for retry. ` +
142
+ 'Request details were suppressed.');
143
+ return;
144
+ }
61
145
  }
62
146
  }
63
147
  async fetch(params) {
@@ -92,5 +176,8 @@ class LogsService {
92
176
  };
93
177
  }
94
178
  }
179
+ LogsService.DEFAULT_BATCH_BYTES = 128 * 1024;
180
+ LogsService.DEFAULT_ENTRY_DATA_BYTES = 64 * 1024;
181
+ LogsService.DEFAULT_MAX_RETRIES = 4;
95
182
  exports.default = LogsService;
96
183
  //# sourceMappingURL=logs.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logs.service.js","sourceRoot":"","sources":["../../src/logs/logs.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logs.service.js","sourceRoot":"","sources":["../../src/logs/logs.service.ts"],"names":[],"mappings":"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"}
@@ -372,9 +372,9 @@ export default class ProcessorService implements IProcessorService {
372
372
  runBrokerPublish(data: IStepEvent, additional_logs?: Partial<ILogData>): Promise<{
373
373
  published: boolean;
374
374
  }>;
375
- processStorageRequest(data: IStepEvent, input: IStorageRequest, storageEnv: IProductStorageEnvs, additional_logs: Partial<ILogData>, decryptionKey?: string): Promise<IProcessingFailure | {
375
+ processStorageRequest(data: IStepEvent, input: IStorageRequest, storageEnv: IProductStorageEnvs, additional_logs: Partial<ILogData>, decryptionKey?: string): Promise<{
376
376
  url: string;
377
- }>;
377
+ } | IProcessingFailure>;
378
378
  writeResult(status: LogEventStatus, retryable?: boolean): Promise<void>;
379
379
  /**
380
380
  * Separate credentials into prefixed (e.g., 'headers:Authorization') and non-prefixed (e.g., 'api_key').
@@ -237,6 +237,14 @@ export default class ProductsBuilderService implements IProductsBuilderService {
237
237
  getWorkspacePrivateKey(): string | null;
238
238
  initializeProduct(product_id: string): Promise<void>;
239
239
  initializeProductByTag(tag: string): Promise<void>;
240
+ /**
241
+ * Refresh product-backed component state after an administrative mutation.
242
+ *
243
+ * ProductBuilder instances are cached by the proxy, so clearing only the
244
+ * component caches is insufficient: fetchMessageBroker() would otherwise
245
+ * repopulate them from the pre-mutation product snapshot.
246
+ */
247
+ private refreshProductState;
240
248
  /**
241
249
  * Bootstrap action - ultra-lightweight API call to fetch action data needed for processAction
242
250
  * Replaces 5+ separate API calls: initializeProduct, fetchApp, fetchThirdPartyApp, fetchEnv, initializePricing
@@ -486,6 +486,24 @@ class ProductsBuilderService {
486
486
  throw e;
487
487
  }
488
488
  }
489
+ /**
490
+ * Refresh product-backed component state after an administrative mutation.
491
+ *
492
+ * ProductBuilder instances are cached by the proxy, so clearing only the
493
+ * component caches is insufficient: fetchMessageBroker() would otherwise
494
+ * repopulate them from the pre-mutation product snapshot.
495
+ */
496
+ async refreshProductState() {
497
+ var _a;
498
+ const productReference = ((_a = this.product) === null || _a === void 0 ? void 0 : _a.tag) || this.product_id;
499
+ this.brokerCache.clear();
500
+ this.envCache.clear();
501
+ this.product = (await this.productApi.initProduct(productReference, this.getUserAccess()));
502
+ if (!this.product) {
503
+ throw new Error(`Product "${productReference}" could not be refreshed after update`);
504
+ }
505
+ this.product_id = this.product._id;
506
+ }
489
507
  /**
490
508
  * Bootstrap action - ultra-lightweight API call to fetch action data needed for processAction
491
509
  * Replaces 5+ separate API calls: initializeProduct, fetchApp, fetchThirdPartyApp, fetchEnv, initializePricing
@@ -801,6 +819,7 @@ class ProductsBuilderService {
801
819
  data.data = (await (0, string_utils_1.extractPlaceholders)(data.sample));
802
820
  }
803
821
  await this.productApi.updateProduct(this.product_id, Object.assign(Object.assign({}, data), { messageBrokerTag, component: enums_1.ProductComponents.MESSAGEBROKER_TOPIC, action: enums_1.RequestAction.CREATE }), this.getUserAccess());
822
+ await this.refreshProductState();
804
823
  }
805
824
  else {
806
825
  if (throwErrorIfExists)
@@ -837,6 +856,7 @@ class ProductsBuilderService {
837
856
  data.data = (await (0, string_utils_1.extractPlaceholders)(data.sample));
838
857
  }
839
858
  await this.productApi.updateProduct(this.product_id, Object.assign(Object.assign({}, data), { messageBrokerTag, component: enums_1.ProductComponents.MESSAGEBROKER_TOPIC, action: enums_1.RequestAction.UPDATE }), this.getUserAccess());
859
+ await this.refreshProductState();
840
860
  }
841
861
  else {
842
862
  throw new Error(`Message Broker Topic ${data.tag} not found`);