google-ads-api 13.0.0 → 13.0.1

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.
@@ -10,7 +10,7 @@ export declare class Customer extends ServiceFactory {
10
10
  @description Single query using a raw GAQL string.
11
11
  @hooks onQueryStart, onQueryError, onQueryEnd
12
12
  */
13
- query<T = services.IGoogleAdsRow[]>(gaqlQuery: string, requestOptions?: RequestOptions): Promise<T>;
13
+ query<T = services.IGoogleAdsRow[]>(gaqlQuery: string, requestOptions?: Readonly<RequestOptions>): Promise<T>;
14
14
  /**
15
15
  @description Stream query using a raw GAQL string. If a generic type is provided, it must be the type of a single row.
16
16
  If a summary row is requested then this will be the last emitted row of the stream.
@@ -19,18 +19,18 @@ export declare class Customer extends ServiceFactory {
19
19
  const stream = queryStream<T>(gaqlQuery)
20
20
  for await (const row of stream) { ... }
21
21
  */
22
- queryStream<T = services.IGoogleAdsRow>(gaqlQuery: string, requestOptions?: RequestOptions): AsyncGenerator<T>;
22
+ queryStream<T = services.IGoogleAdsRow>(gaqlQuery: string, requestOptions?: Readonly<RequestOptions>): AsyncGenerator<T>;
23
23
  /**
24
24
  @description Single query using ReportOptions.
25
25
  If a summary row is requested then this will be the first row of the results.
26
26
  @hooks onQueryStart, onQueryError, onQueryEnd
27
27
  */
28
- report<T = services.IGoogleAdsRow[]>(options: ReportOptions): Promise<T>;
28
+ report<T = services.IGoogleAdsRow[]>(options: Readonly<ReportOptions>): Promise<T>;
29
29
  /**
30
30
  @description Get the total row count of a report.
31
31
  @hooks none
32
32
  */
33
- reportCount(options: ReportOptions): Promise<number | undefined>;
33
+ reportCount(options: Readonly<ReportOptions>): Promise<number | undefined>;
34
34
  /**
35
35
  @description Stream query using ReportOptions. If a generic type is provided, it must be the type of a single row.
36
36
  If a summary row is requested then this will be the last emitted row of the stream.
@@ -39,7 +39,7 @@ export declare class Customer extends ServiceFactory {
39
39
  const stream = reportStream<T>(reportOptions)
40
40
  for await (const row of stream) { ... }
41
41
  */
42
- reportStream<T = services.IGoogleAdsRow>(reportOptions: ReportOptions): AsyncGenerator<T>;
42
+ reportStream<T = services.IGoogleAdsRow>(reportOptions: Readonly<ReportOptions>): AsyncGenerator<T>;
43
43
  /**
44
44
  @description Retreive the raw stream using ReportOptions.
45
45
  @hooks onStreamStart
@@ -49,7 +49,7 @@ export declare class Customer extends ServiceFactory {
49
49
  stream.on('error', (error) => { ... })
50
50
  stream.on('end', () => { ... })
51
51
  */
52
- reportStreamRaw(reportOptions: ReportOptions): Promise<CancellableStream | void>;
52
+ reportStreamRaw(reportOptions: Readonly<ReportOptions>): Promise<CancellableStream | void>;
53
53
  private search;
54
54
  private paginatedSearch;
55
55
  private querier;
@@ -49,8 +49,7 @@ class Customer extends serviceFactory_1.default {
49
49
  @hooks none
50
50
  */
51
51
  async reportCount(options) {
52
- options.limit = 1; // must get at least one row
53
- const { gaqlQuery, requestOptions } = (0, query_1.buildQuery)(options);
52
+ const { gaqlQuery, requestOptions } = (0, query_1.buildQuery)({ ...options, limit: 1 }); // must get at least one row
54
53
  // @ts-expect-error we do not allow this field in reportOptions, however it is still a valid request option
55
54
  requestOptions.return_total_results_count = true;
56
55
  const useHooks = false; // to avoid cacheing conflicts
@@ -44,18 +44,18 @@ export declare function validateConstraintKeyAndValue(key: ConstraintKey, op: Co
44
44
  val: ParsedConstraintValue;
45
45
  };
46
46
  export declare function convertNumericEnumToString(key: ConstraintKey, val: ParsedConstraintValue): ParsedConstraintValue;
47
- export declare function extractConstraintConditions(constraints: ReportOptions["constraints"]): ConstraintString[];
47
+ export declare function extractConstraintConditions(constraints: Readonly<ReportOptions["constraints"]>): ConstraintString[];
48
48
  export declare function extractDateConstantConditions(dateConstant: ReportOptions["date_constant"]): ConstraintString[];
49
49
  export declare function extractDateConditions(fromDate: ReportOptions["from_date"], toDate: ReportOptions["to_date"]): ConstraintString[];
50
- export declare function buildWhereClause(constraints: ReportOptions["constraints"], dateConstant: ReportOptions["date_constant"], fromDate: ReportOptions["from_date"], toDate: ReportOptions["to_date"]): WhereClause;
50
+ export declare function buildWhereClause(constraints: Readonly<ReportOptions["constraints"]>, dateConstant: Readonly<ReportOptions["date_constant"]>, fromDate: Readonly<ReportOptions["from_date"]>, toDate: Readonly<ReportOptions["to_date"]>): WhereClause;
51
51
  export declare function buildLimitClause(limit: ReportOptions["limit"]): LimitClause;
52
- export declare function buildParametersClause(parameters: ReportOptions["parameters"]): ParametersClause;
52
+ export declare function buildParametersClause(parameters: Readonly<ReportOptions["parameters"]>): ParametersClause;
53
53
  export declare function completeOrderly(orderly: string, entity: ReportOptions["entity"]): string;
54
- export declare function buildOrderClauseOld(orderBy: ReportOptions["order_by"], sortOrder: ReportOptions["sort_order"], entity: ReportOptions["entity"]): OrderClause;
55
- export declare function buildOrderClauseNew(order: Required<ReportOptions["order"]>, entity: ReportOptions["entity"]): OrderClause;
56
- export declare function buildOrderClause(order: ReportOptions["order"], orderBy: ReportOptions["order_by"], sortOrder: ReportOptions["sort_order"], entity: ReportOptions["entity"]): OrderClause;
57
- export declare function buildRequestOptions(reportOptions: ReportOptions): RequestOptions;
58
- export declare function buildQuery(reportOptions: ReportOptions): {
54
+ export declare function buildOrderClauseOld(orderBy: Readonly<ReportOptions["order_by"]>, sortOrder: Readonly<ReportOptions["sort_order"]>, entity: Readonly<ReportOptions["entity"]>): OrderClause;
55
+ export declare function buildOrderClauseNew(order: Readonly<Required<ReportOptions["order"]>>, entity: Readonly<ReportOptions["entity"]>): OrderClause;
56
+ export declare function buildOrderClause(order: Readonly<ReportOptions["order"]>, orderBy: Readonly<ReportOptions["order_by"]>, sortOrder: Readonly<ReportOptions["sort_order"]>, entity: Readonly<ReportOptions["entity"]>): OrderClause;
57
+ export declare function buildRequestOptions(reportOptions: Readonly<ReportOptions>): RequestOptions;
58
+ export declare function buildQuery(reportOptions: Readonly<ReportOptions>): {
59
59
  gaqlQuery: Query;
60
60
  requestOptions: RequestOptions;
61
61
  };
@@ -12,7 +12,6 @@ export declare class Service {
12
12
  protected readonly clientOptions: ClientOptions;
13
13
  protected readonly customerOptions: CustomerOptions;
14
14
  protected readonly hooks: Hooks;
15
- private serviceCache;
16
15
  constructor(clientOptions: ClientOptions, customerOptions: CustomerOptions, hooks?: Hooks);
17
16
  get credentials(): CustomerCredentials;
18
17
  protected get callHeaders(): CallHeaders;
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.Service = exports.FAILURE_KEY = void 0;
4
7
  const google_gax_1 = require("google-gax");
@@ -6,8 +9,18 @@ const google_auth_library_1 = require("google-auth-library");
6
9
  const protos_1 = require("./protos");
7
10
  const utils_1 = require("./utils");
8
11
  const version_1 = require("./version");
12
+ const ttlcache_1 = __importDefault(require("@isaacs/ttlcache"));
9
13
  // Make sure to update this version number when upgrading
10
14
  exports.FAILURE_KEY = `google.ads.googleads.${version_1.googleAdsVersion}.errors.googleadsfailure-bin`;
15
+ // A global service cache to avoid re-initialising services
16
+ const serviceCache = new ttlcache_1.default({
17
+ max: 1000,
18
+ ttl: 10 * 60 * 1000,
19
+ dispose: async (service) => {
20
+ // Close connections when services are removed from the cache
21
+ await service.close();
22
+ },
23
+ });
11
24
  class Service {
12
25
  constructor(clientOptions, customerOptions, hooks) {
13
26
  this.clientOptions = clientOptions;
@@ -42,18 +55,20 @@ class Service {
42
55
  return credentials;
43
56
  }
44
57
  loadService(service) {
45
- if (this.serviceCache[service]) {
46
- return this.serviceCache[service];
58
+ const serviceCacheKey = `${service}_${this.customerOptions.refresh_token}`;
59
+ if (serviceCache.has(serviceCacheKey)) {
60
+ return serviceCache.get(serviceCacheKey);
47
61
  }
48
62
  // eslint-disable-next-line @typescript-eslint/no-var-requires
49
63
  const { [service]: protoService } = require("google-ads-node");
50
64
  if (typeof protoService === "undefined") {
51
65
  throw new Error(`Service "${service}" could not be found`);
52
66
  }
67
+ // Initialising services can take a few ms, so we cache when possible.
53
68
  const client = new protoService({
54
69
  sslCreds: this.getCredentials(),
55
70
  });
56
- this.serviceCache[service] = client;
71
+ serviceCache.set(serviceCacheKey, client);
57
72
  return client;
58
73
  }
59
74
  getGoogleAdsError(error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "google-ads-api",
3
- "version": "13.0.0",
3
+ "version": "13.0.1",
4
4
  "description": "Google Ads API Client Library for Node.js",
5
5
  "repository": "https://github.com/Opteo/google-ads-api",
6
6
  "main": "build/src/index.js",
@@ -17,6 +17,7 @@
17
17
  "author": "Opteo",
18
18
  "license": "MIT",
19
19
  "dependencies": {
20
+ "@isaacs/ttlcache": "^1.2.2",
20
21
  "google-ads-node": "^11.0.0",
21
22
  "google-auth-library": "^7.1.0",
22
23
  "google-gax": "^3.6.0",