@ductape/sdk 0.0.4-v16 → 0.0.4-v17

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.
Files changed (65) hide show
  1. package/dist/api/services/pricingApi.service.d.ts +10 -0
  2. package/dist/api/services/pricingApi.service.js +34 -0
  3. package/dist/api/services/pricingApi.service.js.map +1 -0
  4. package/dist/api/urls.d.ts +2 -0
  5. package/dist/api/urls.js +8 -1
  6. package/dist/api/urls.js.map +1 -1
  7. package/dist/apps/services/app.service.js +1 -1
  8. package/dist/apps/services/app.service.js.map +1 -1
  9. package/dist/clients/pricing.client.d.ts +3 -0
  10. package/dist/clients/pricing.client.js +33 -0
  11. package/dist/clients/pricing.client.js.map +1 -0
  12. package/dist/inputs/utils/inputs.utils.create.js +1 -1
  13. package/dist/inputs/utils/inputs.utils.create.js.map +1 -1
  14. package/dist/logs/logs.types.d.ts +4 -0
  15. package/dist/logs/logs.types.js.map +1 -1
  16. package/dist/pricing/pricing.repo.d.ts +0 -0
  17. package/dist/pricing/pricing.repo.js +1 -0
  18. package/dist/pricing/pricing.repo.js.map +1 -0
  19. package/dist/pricing/pricing.service.d.ts +24 -0
  20. package/dist/pricing/pricing.service.js +51 -0
  21. package/dist/pricing/pricing.service.js.map +1 -0
  22. package/dist/pricing/pricing.types.d.ts +76 -0
  23. package/dist/pricing/pricing.types.js +21 -0
  24. package/dist/pricing/pricing.types.js.map +1 -0
  25. package/dist/pricing/utils/string.utils.d.ts +1 -0
  26. package/dist/pricing/utils/string.utils.js +9 -0
  27. package/dist/pricing/utils/string.utils.js.map +1 -0
  28. package/dist/processor/services/processor.service.d.ts +6 -0
  29. package/dist/processor/services/processor.service.js +108 -3
  30. package/dist/processor/services/processor.service.js.map +1 -1
  31. package/dist/processor/services/request.service.d.ts +36 -0
  32. package/dist/processor/services/request.service.js +304 -0
  33. package/dist/processor/services/request.service.js.map +1 -0
  34. package/dist/processor/types/request.types.d.ts +14 -0
  35. package/dist/processor/types/request.types.js +3 -0
  36. package/dist/processor/types/request.types.js.map +1 -0
  37. package/dist/processor/utils/processor.utils.js +23 -19
  38. package/dist/processor/utils/processor.utils.js.map +1 -1
  39. package/dist/processor/utils/request.utils.d.ts +20 -0
  40. package/dist/processor/utils/request.utils.js +113 -0
  41. package/dist/processor/utils/request.utils.js.map +1 -0
  42. package/dist/products/services/products.service.js +3 -0
  43. package/dist/products/services/products.service.js.map +1 -1
  44. package/dist/test/test.imports.js +5 -8
  45. package/dist/test/test.imports.js.map +1 -1
  46. package/dist/test/test.processor.js +13 -26
  47. package/dist/test/test.processor.js.map +1 -1
  48. package/dist/test/test.products.d.ts +1 -0
  49. package/dist/test/test.products.js +49 -0
  50. package/dist/test/test.products.js.map +1 -0
  51. package/dist/types/pricing.types.d.ts +4 -0
  52. package/dist/types/pricing.types.js +3 -0
  53. package/dist/types/pricing.types.js.map +1 -0
  54. package/dist/types/productsBuilder.types.d.ts +6 -1
  55. package/dist/types/productsBuilder.types.js +6 -1
  56. package/dist/types/productsBuilder.types.js.map +1 -1
  57. package/dist/types/request-tracker.interface.d.ts +0 -0
  58. package/dist/types/request-tracker.interface.js +1 -0
  59. package/dist/types/request-tracker.interface.js.map +1 -0
  60. package/dist/utils/constants.d.ts +1 -0
  61. package/dist/utils/constants.js +5 -0
  62. package/dist/utils/constants.js.map +1 -0
  63. package/dist/utils/index.js +1 -1
  64. package/dist/utils/index.js.map +1 -1
  65. package/package.json +5 -2
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractOverageTag = void 0;
4
+ const extractOverageTag = (input) => {
5
+ const [origin, tag] = input.split(":");
6
+ return `${origin}:${tag}:overage`;
7
+ };
8
+ exports.extractOverageTag = extractOverageTag;
9
+ //# sourceMappingURL=string.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.utils.js","sourceRoot":"","sources":["../../../src/pricing/utils/string.utils.ts"],"names":[],"mappings":";;;AAAO,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAU,EAAE;IACzD,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,GAAG,MAAM,IAAI,GAAG,UAAU,CAAC;AACpC,CAAC,CAAA;AAHY,QAAA,iBAAiB,qBAG7B"}
@@ -1,4 +1,5 @@
1
1
  import { IAppVersion, IBuilderInit, IGenerateWebhookLink, INotificationsHandler, IProcessingFailure, IProcessorInput, IProcessorSequenceLevels, IActionProcessorInput, IDBActionProcessorInput, IFunctionProcessorInput, INotificationProcessorInput, IProductNotificationTemplate, IStorageProcessorInput, IRegisterWebhook, WebhookEventTypes, IJobProcessorInput, IMessageBrokerPublishInput, IMessageBrokerSubscribeInput, FeatureEventTypes, IActionRequest, IActionSamples, IDbActionRequest, IDependencyMatrix, IFeatureEvent, IFeatureInput, IFeatureSequence, IProductAppEnvs, IProductEnv, IProductFeature, IRetryMeta, IProductDatabaseEnvs, IStorageRequest, IProductStorageEnvs, HttpMethods, ILogData, LogEventStatus, IAppRetryPolicy, IParsedIndexes, IParsedSample, IProductQuota, IProductFallback, IQuotaOptions, IFallbackOptions, FetchRemoteCachePayload, ISessionInput, ISessionOutput, ISessionPayload, ISessionRefreshPayload } from '../../types';
2
+ import { IPricingResult } from '../../pricing/pricing.types';
2
3
  export interface IProcessorService {
3
4
  processFeature(data: IProcessorInput): Promise<any>;
4
5
  processDBAction(db_action: IDBActionProcessorInput): Promise<any>;
@@ -21,7 +22,9 @@ export default class ProcessorService implements IProcessorService {
21
22
  private productBuilderService;
22
23
  private processorApiService;
23
24
  private logService;
25
+ private pricingService;
24
26
  private inputService;
27
+ private requestTrackerService;
25
28
  private start;
26
29
  private end;
27
30
  private processingOutput;
@@ -35,6 +38,7 @@ export default class ProcessorService implements IProcessorService {
35
38
  private processingFailure;
36
39
  private doneWithProcessing;
37
40
  private productTag;
41
+ private pricingTag;
38
42
  private apps;
39
43
  private baseLogs;
40
44
  private clone;
@@ -70,6 +74,7 @@ export default class ProcessorService implements IProcessorService {
70
74
  process_id: string;
71
75
  }>;
72
76
  intializeProduct(additional_logs: Partial<ILogData>): Promise<void>;
77
+ initializePricing(additional_logs: Partial<ILogData>, access_tag: string): Promise<void>;
73
78
  fetchFeature(tag: string, additional_logs: Partial<ILogData>): IProductFeature;
74
79
  fetchQuota(tag: string, additional_logs: Partial<ILogData>): IProductQuota;
75
80
  fetchFallback(tag: string, additional_logs: Partial<ILogData>): IProductFallback;
@@ -184,6 +189,7 @@ export default class ProcessorService implements IProcessorService {
184
189
  status?: undefined;
185
190
  data?: undefined;
186
191
  }>;
192
+ processPricingCost(additional_logs: Partial<ILogData>): Promise<IPricingResult>;
187
193
  addToSuccessOutput(event: IFeatureEvent, output: any, additional_logs: Partial<ILogData>): Promise<void>;
188
194
  checkIsSuccessful(): boolean;
189
195
  addToWaitingOutput(event: IFeatureEvent, dependants: Array<IDependencyMatrix>): void;
@@ -69,6 +69,9 @@ const postgres_repo_1 = require("../repos/postgres.repo");
69
69
  const storage_util_1 = require("../utils/storage.util");
70
70
  const sms_repo_1 = require("../repos/sms.repo");
71
71
  const quota_service_1 = __importDefault(require("./quota.service"));
72
+ const pricing_service_1 = __importDefault(require("../../pricing/pricing.service"));
73
+ const request_utils_1 = require("../utils/request.utils");
74
+ const request_service_1 = __importDefault(require("./request.service"));
72
75
  async function loadBrokerService() {
73
76
  if (typeof window === 'undefined') {
74
77
  const { createBrokerService } = await Promise.resolve().then(() => __importStar(require('./messagebrokers')));
@@ -98,6 +101,14 @@ class ProcessorService {
98
101
  env_type,
99
102
  redis_client
100
103
  });
104
+ this.pricingService = new pricing_service_1.default({
105
+ workspace_id,
106
+ public_key,
107
+ user_id,
108
+ token,
109
+ env_type,
110
+ redis_client,
111
+ });
101
112
  this.inputService = new inputs_service_1.default();
102
113
  this.requestTime = 0;
103
114
  this.totalRequests = 0;
@@ -108,6 +119,7 @@ class ProcessorService {
108
119
  skipped: [],
109
120
  };
110
121
  this.apps = [];
122
+ this.requestTrackerService = request_service_1.default.getInstance(redis_client);
111
123
  this.processorApiService = new processorApi_service_1.ProcessorApiService(env_type);
112
124
  this.environment = env_type;
113
125
  if (redis_client && this.productTag) {
@@ -663,6 +675,32 @@ class ProcessorService {
663
675
  throw e;
664
676
  }
665
677
  }
678
+ async initializePricing(additional_logs, access_tag) {
679
+ if (!this.logService) {
680
+ this.logService = new logs_service_1.default({
681
+ product_id: this.productId,
682
+ workspace_id: this.workspace_id,
683
+ public_key: this.public_key,
684
+ user_id: this.user_id,
685
+ token: this.token,
686
+ env_type: this.environment,
687
+ });
688
+ }
689
+ try {
690
+ console.log(`Initializing pricing for access tag: ${access_tag}`);
691
+ const product_app = this.productBuilderService.fetchApp(access_tag); // validate app exists
692
+ console.log(`Found product app: ${JSON.stringify(product_app)}`);
693
+ const app = await this.productBuilderService.fetchThirdPartyAppByAccessTag(product_app.access_tag);
694
+ await this.pricingService.initializePricingByTag(product_app.pricing_tag, app._id);
695
+ const { pricing_tag } = this.pricingService.fetchPricing();
696
+ this.pricingTag = pricing_tag;
697
+ this.logService.add(Object.assign(Object.assign(Object.assign({}, this.baseLogs), additional_logs), { message: 'Pricing initialize - success', data: { pricing_tag: this.pricingTag }, status: types_1.LogEventStatus.SUCCESS }));
698
+ }
699
+ catch (e) {
700
+ this.logService.add(Object.assign(Object.assign(Object.assign({}, this.baseLogs), additional_logs), { message: 'Pricing initialize - failed', data: e, status: types_1.LogEventStatus.FAIL }));
701
+ throw e;
702
+ }
703
+ }
666
704
  fetchFeature(tag, additional_logs) {
667
705
  try {
668
706
  const feature = this.productBuilderService.fetchFeature(tag); // validate feature exists
@@ -2022,7 +2060,7 @@ class ProcessorService {
2022
2060
  additional_logs.app_env = app_env_slug;
2023
2061
  console.log(app, appEnvs);
2024
2062
  const env = appEnvs.find((item) => item.slug === app_env_slug); // fetch the actuall app Environment variable
2025
- if (!active) {
2063
+ if (!active && recipient_workspace_id !== this.baseLogs.workspace_id) {
2026
2064
  throw new Error(`App ${event.app} version ${app.version} is not active`);
2027
2065
  }
2028
2066
  if (!env.active) {
@@ -2109,6 +2147,7 @@ class ProcessorService {
2109
2147
  }
2110
2148
  }
2111
2149
  async processRequest(payload, event, retries, additional_logs, returnValue = false) {
2150
+ var _a;
2112
2151
  const { request_base_url, resource, payloads, method, env, app_id } = payload;
2113
2152
  const start = Date.now();
2114
2153
  try {
@@ -2119,7 +2158,11 @@ class ProcessorService {
2119
2158
  const end = Date.now();
2120
2159
  this.requestTime += end - start;
2121
2160
  this.totalRequests += 1;
2122
- this.logService.add(Object.assign(Object.assign(Object.assign({}, this.baseLogs), additional_logs), { message: 'Process http request - success', successful_execution: true, data: { response: (0, processor_utils_1.anonymizeObject)(results) }, status: types_1.LogEventStatus.SUCCESS, app_id, action: event.event, start,
2161
+ const { pricing_tag, pricing_cost, is_overage, currency } = await this.processPricingCost(Object.assign(Object.assign({}, additional_logs), { app_id, workspace_id: this.workspace_id }));
2162
+ this.logService.add(Object.assign(Object.assign(Object.assign({}, this.baseLogs), additional_logs), { pricing_tag,
2163
+ pricing_cost,
2164
+ currency,
2165
+ is_overage, message: 'Process http request - success', successful_execution: true, data: { response: (0, processor_utils_1.anonymizeObject)(results) }, status: types_1.LogEventStatus.SUCCESS, app_id, action: event.event, start,
2123
2166
  end }));
2124
2167
  await this.addToSuccessOutput(event, results, additional_logs);
2125
2168
  if (returnValue) {
@@ -2132,7 +2175,7 @@ class ProcessorService {
2132
2175
  catch (e) {
2133
2176
  const end = Date.now();
2134
2177
  let error = e;
2135
- if (e.response.data) {
2178
+ if ((_a = e === null || e === void 0 ? void 0 : e.response) === null || _a === void 0 ? void 0 : _a.data) {
2136
2179
  error = e.response.data;
2137
2180
  }
2138
2181
  this.requestTime += end - start;
@@ -2165,6 +2208,67 @@ class ProcessorService {
2165
2208
  }
2166
2209
  }
2167
2210
  }
2211
+ async processPricingCost(additional_logs) {
2212
+ try {
2213
+ const { app_id, workspace_id } = additional_logs;
2214
+ if (!app_id || !workspace_id) {
2215
+ throw new Error('app_id and workspace_id are required in additional_logs');
2216
+ }
2217
+ const primaryPricing = this.pricingService.fetchPricing();
2218
+ const overagePricing = this.pricingService.fetchOveragePricing();
2219
+ const requests = await this.requestTrackerService.incrementRequest(app_id, workspace_id);
2220
+ const limitCheck = (0, request_utils_1.checkLimitExceeded)(requests, primaryPricing.limits);
2221
+ let finalCost = 0;
2222
+ let usedPricing = primaryPricing;
2223
+ let isOverage = false;
2224
+ let finalCurrency = primaryPricing.currency;
2225
+ if ((0, request_utils_1.isFreeTag)(primaryPricing.pricing_tag)) {
2226
+ if (limitCheck.exceeded) {
2227
+ const overageRequests = (0, request_utils_1.calculateOverageRequests)(requests, primaryPricing.limits);
2228
+ finalCost = (0, request_utils_1.calculateCost)(overagePricing.pricing_mode, overagePricing.unit_price, overageRequests);
2229
+ usedPricing = overagePricing;
2230
+ isOverage = true;
2231
+ finalCurrency = overagePricing.currency;
2232
+ }
2233
+ else {
2234
+ finalCost = 0;
2235
+ }
2236
+ }
2237
+ else {
2238
+ if (limitCheck.exceeded) {
2239
+ const overageRequests = (0, request_utils_1.calculateOverageRequests)(requests, primaryPricing.limits);
2240
+ const overageCost = (0, request_utils_1.calculateCost)(overagePricing.pricing_mode, overagePricing.unit_price, overageRequests);
2241
+ finalCost = overageCost;
2242
+ isOverage = true;
2243
+ }
2244
+ else {
2245
+ const pricingRequests = (0, request_utils_1.calculateRequests)(requests);
2246
+ finalCost = (0, request_utils_1.calculateCost)(primaryPricing.pricing_mode, primaryPricing.unit_price, pricingRequests);
2247
+ }
2248
+ }
2249
+ this.logService.add(Object.assign(Object.assign(Object.assign({}, this.baseLogs), additional_logs), { message: 'Process Pricing Cost - success', data: {
2250
+ pricing_tag: usedPricing.pricing_tag,
2251
+ cost: finalCost,
2252
+ currency: finalCurrency,
2253
+ is_overage: isOverage,
2254
+ requests: requests,
2255
+ limit_exceeded: limitCheck.exceeded
2256
+ }, status: types_1.LogEventStatus.SUCCESS }));
2257
+ return {
2258
+ pricing_tag: usedPricing.pricing_tag,
2259
+ pricing_cost: Math.round(finalCost * 100) / 100,
2260
+ currency: finalCurrency,
2261
+ is_overage: isOverage,
2262
+ requests_made: requests,
2263
+ limit_exceeded: limitCheck.exceeded,
2264
+ exceeded_limits: limitCheck.exceededLimits
2265
+ };
2266
+ }
2267
+ catch (e) {
2268
+ this.logService.add(Object.assign(Object.assign(Object.assign({}, this.baseLogs), additional_logs), { message: 'Process Pricing Cost - failed', data: { error: e }, status: types_1.LogEventStatus.FAIL }));
2269
+ throw e;
2270
+ }
2271
+ }
2168
2272
  async addToSuccessOutput(event, output, additional_logs) {
2169
2273
  // Remove event from failed, skipped, and waiting arrays
2170
2274
  this.processingOutput.failure = this.processingOutput.failure.filter((data) => !(data.event.sequence_tag === event.sequence_tag && data.event.event === event.event));
@@ -3351,6 +3455,7 @@ class ProcessorService {
3351
3455
  data: input,
3352
3456
  };
3353
3457
  await this.intializeProduct(additional_logs);
3458
+ await this.initializePricing(additional_logs, app);
3354
3459
  this.process_id = process_id;
3355
3460
  this.baseLogs.product_id = this.productId;
3356
3461
  const productEnv = this.fetchEnv(env, additional_logs);