@drawbridge/drawbridge-utils 0.0.69 → 0.0.70

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/billing.cjs CHANGED
@@ -253,21 +253,28 @@ var ai = {
253
253
  };
254
254
  var STANDARD_RATE_PER_GB = 8;
255
255
  var PREMIUM_RATE_PER_GB = 11;
256
+ var STANDARD_CPM_CENTS = 0.15;
257
+ var PREMIUM_CPM_CENTS = 0.25;
256
258
  var PREMIUM_HOSTS = /* @__PURE__ */ new Set();
257
259
  var LOCAL_FLAT_CENTS = 1;
258
260
  var REUSE_FLAT_CENTS = 1;
259
- var ratePerGB = (url) => {
261
+ var isPremium = (url) => {
260
262
  try {
261
- return PREMIUM_HOSTS.has(new URL(url).hostname) ? PREMIUM_RATE_PER_GB : STANDARD_RATE_PER_GB;
263
+ return PREMIUM_HOSTS.has(new URL(url).hostname);
262
264
  } catch {
263
- return STANDARD_RATE_PER_GB;
265
+ return false;
264
266
  }
265
267
  };
266
- var scrapeFee = ({ provider, bytes, url, cold }) => {
268
+ var ratePerGB = (url) => isPremium(url) ? PREMIUM_RATE_PER_GB : STANDARD_RATE_PER_GB;
269
+ var cpmCents = (url) => isPremium(url) ? PREMIUM_CPM_CENTS : STANDARD_CPM_CENTS;
270
+ var scrapeFee = ({ provider, bytes, requests, url, cold }) => {
267
271
  if (!cold) return REUSE_FLAT_CENTS;
268
272
  if (provider === "brightdata") {
269
273
  return Math.ceil((bytes || 0) / 1e9 * ratePerGB(url) * 100 * MARKUP);
270
274
  }
275
+ if (provider === "brightdata-unlocker") {
276
+ return Math.ceil((requests || 0) * cpmCents(url) * MARKUP);
277
+ }
271
278
  return LOCAL_FLAT_CENTS;
272
279
  };
273
280
  var scrape = {
@@ -290,6 +297,7 @@ var scrape = {
290
297
  const cents = scrapeFee({
291
298
  provider: (_a = page == null ? void 0 : page.provider) == null ? void 0 : _a.name,
292
299
  bytes: page == null ? void 0 : page.bytes,
300
+ requests: page == null ? void 0 : page.requests,
293
301
  url: (page == null ? void 0 : page.url) || url,
294
302
  cold: Boolean(claim == null ? void 0 : claim.value)
295
303
  });
@@ -174,27 +174,39 @@ const ai = {
174
174
 
175
175
  // ─── Scrape (credit rail) ──────────────────────────────────────────────────────
176
176
 
177
- // BrightData (the Scraping Browser fallback) bills by GB, so its fee is METERED
178
- // to the traffic measured at scrape time; the 30% margin matches MARKUP above. A
179
- // cold local render and a cache reuse have no external cost, so they're small
180
- // flat fees (set to 0 to make either free). Tune against real BrightData invoices.
177
+ // BrightData has two unblocking tiers, billed on different bases:
178
+ // - Scraping Browser (the CDP fallback): bills by GB of traffic, so its fee is
179
+ // METERED to the bytes measured at scrape time.
180
+ // - Web Unlocker (the last-resort HTML tier): bills per successful request (CPM
181
+ // = per 1,000), so its fee is METERED to the request COUNT the tier made.
182
+ // Both carry the same 30% margin (MARKUP). A cold local render and a cache reuse
183
+ // have no external cost, so they're small flat fees (set to 0 to make either
184
+ // free). Tune the rates against real BrightData invoices.
181
185
  const STANDARD_RATE_PER_GB = 8;
182
186
  const PREMIUM_RATE_PER_GB = 11;
187
+ // Web Unlocker CPM in cents-per-request: $1.50/1,000 = 0.15¢, $2.50/1,000 = 0.25¢.
188
+ const STANDARD_CPM_CENTS = 0.15;
189
+ const PREMIUM_CPM_CENTS = 0.25;
190
+ // Premium-rate domains — shared by both tiers (empty = everything standard).
183
191
  const PREMIUM_HOSTS = new Set();
184
192
  const LOCAL_FLAT_CENTS = 1;
185
193
  const REUSE_FLAT_CENTS = 1;
186
194
 
187
- const ratePerGB = ( url ) => {
195
+ const isPremium = ( url ) => {
188
196
 
189
- try { return PREMIUM_HOSTS.has( new URL( url ).hostname ) ? PREMIUM_RATE_PER_GB : STANDARD_RATE_PER_GB; }
190
- catch { return STANDARD_RATE_PER_GB; }
197
+ try { return PREMIUM_HOSTS.has( new URL( url ).hostname ); }
198
+ catch { return false; }
191
199
 
192
200
  };
193
201
 
202
+ const ratePerGB = ( url ) => isPremium( url ) ? PREMIUM_RATE_PER_GB : STANDARD_RATE_PER_GB;
203
+ const cpmCents = ( url ) => isPremium( url ) ? PREMIUM_CPM_CENTS : STANDARD_CPM_CENTS;
204
+
194
205
  // Cents to charge. `cold` = the first generation off this scrape (charge the real
195
- // cost: metered for BrightData, a flat for a local render); otherwise it's a reuse
196
- // (flat). Rounded up so we never under-bill a fractional cent.
197
- const scrapeFee = ({ provider, bytes, url, cold }) => {
206
+ // cost: metered for either BrightData tier, a flat for a local render); otherwise
207
+ // it's a reuse (flat). Rounded up so we never under-bill a fractional cent — so a
208
+ // typical 1–2 request unlock rounds up to the floor.
209
+ const scrapeFee = ({ provider, bytes, requests, url, cold }) => {
198
210
 
199
211
  if( ! cold ) return REUSE_FLAT_CENTS;
200
212
 
@@ -204,6 +216,12 @@ const scrapeFee = ({ provider, bytes, url, cold }) => {
204
216
 
205
217
  }
206
218
 
219
+ if( provider === 'brightdata-unlocker' ){
220
+
221
+ return Math.ceil( ( requests || 0 ) * cpmCents( url ) * MARKUP );
222
+
223
+ }
224
+
207
225
  return LOCAL_FLAT_CENTS;
208
226
 
209
227
  };
@@ -233,6 +251,7 @@ const scrape = {
233
251
  const cents = scrapeFee({
234
252
  provider : page?.provider?.name,
235
253
  bytes : page?.bytes,
254
+ requests : page?.requests,
236
255
  url : page?.url || url,
237
256
  cold : Boolean( claim?.value )
238
257
  });
package/dist/billing.d.ts CHANGED
@@ -174,27 +174,39 @@ const ai = {
174
174
 
175
175
  // ─── Scrape (credit rail) ──────────────────────────────────────────────────────
176
176
 
177
- // BrightData (the Scraping Browser fallback) bills by GB, so its fee is METERED
178
- // to the traffic measured at scrape time; the 30% margin matches MARKUP above. A
179
- // cold local render and a cache reuse have no external cost, so they're small
180
- // flat fees (set to 0 to make either free). Tune against real BrightData invoices.
177
+ // BrightData has two unblocking tiers, billed on different bases:
178
+ // - Scraping Browser (the CDP fallback): bills by GB of traffic, so its fee is
179
+ // METERED to the bytes measured at scrape time.
180
+ // - Web Unlocker (the last-resort HTML tier): bills per successful request (CPM
181
+ // = per 1,000), so its fee is METERED to the request COUNT the tier made.
182
+ // Both carry the same 30% margin (MARKUP). A cold local render and a cache reuse
183
+ // have no external cost, so they're small flat fees (set to 0 to make either
184
+ // free). Tune the rates against real BrightData invoices.
181
185
  const STANDARD_RATE_PER_GB = 8;
182
186
  const PREMIUM_RATE_PER_GB = 11;
187
+ // Web Unlocker CPM in cents-per-request: $1.50/1,000 = 0.15¢, $2.50/1,000 = 0.25¢.
188
+ const STANDARD_CPM_CENTS = 0.15;
189
+ const PREMIUM_CPM_CENTS = 0.25;
190
+ // Premium-rate domains — shared by both tiers (empty = everything standard).
183
191
  const PREMIUM_HOSTS = new Set();
184
192
  const LOCAL_FLAT_CENTS = 1;
185
193
  const REUSE_FLAT_CENTS = 1;
186
194
 
187
- const ratePerGB = ( url ) => {
195
+ const isPremium = ( url ) => {
188
196
 
189
- try { return PREMIUM_HOSTS.has( new URL( url ).hostname ) ? PREMIUM_RATE_PER_GB : STANDARD_RATE_PER_GB; }
190
- catch { return STANDARD_RATE_PER_GB; }
197
+ try { return PREMIUM_HOSTS.has( new URL( url ).hostname ); }
198
+ catch { return false; }
191
199
 
192
200
  };
193
201
 
202
+ const ratePerGB = ( url ) => isPremium( url ) ? PREMIUM_RATE_PER_GB : STANDARD_RATE_PER_GB;
203
+ const cpmCents = ( url ) => isPremium( url ) ? PREMIUM_CPM_CENTS : STANDARD_CPM_CENTS;
204
+
194
205
  // Cents to charge. `cold` = the first generation off this scrape (charge the real
195
- // cost: metered for BrightData, a flat for a local render); otherwise it's a reuse
196
- // (flat). Rounded up so we never under-bill a fractional cent.
197
- const scrapeFee = ({ provider, bytes, url, cold }) => {
206
+ // cost: metered for either BrightData tier, a flat for a local render); otherwise
207
+ // it's a reuse (flat). Rounded up so we never under-bill a fractional cent — so a
208
+ // typical 1–2 request unlock rounds up to the floor.
209
+ const scrapeFee = ({ provider, bytes, requests, url, cold }) => {
198
210
 
199
211
  if( ! cold ) return REUSE_FLAT_CENTS;
200
212
 
@@ -204,6 +216,12 @@ const scrapeFee = ({ provider, bytes, url, cold }) => {
204
216
 
205
217
  }
206
218
 
219
+ if( provider === 'brightdata-unlocker' ){
220
+
221
+ return Math.ceil( ( requests || 0 ) * cpmCents( url ) * MARKUP );
222
+
223
+ }
224
+
207
225
  return LOCAL_FLAT_CENTS;
208
226
 
209
227
  };
@@ -233,6 +251,7 @@ const scrape = {
233
251
  const cents = scrapeFee({
234
252
  provider : page?.provider?.name,
235
253
  bytes : page?.bytes,
254
+ requests : page?.requests,
236
255
  url : page?.url || url,
237
256
  cold : Boolean( claim?.value )
238
257
  });
package/dist/billing.js CHANGED
@@ -224,21 +224,28 @@ var ai = {
224
224
  };
225
225
  var STANDARD_RATE_PER_GB = 8;
226
226
  var PREMIUM_RATE_PER_GB = 11;
227
+ var STANDARD_CPM_CENTS = 0.15;
228
+ var PREMIUM_CPM_CENTS = 0.25;
227
229
  var PREMIUM_HOSTS = /* @__PURE__ */ new Set();
228
230
  var LOCAL_FLAT_CENTS = 1;
229
231
  var REUSE_FLAT_CENTS = 1;
230
- var ratePerGB = (url) => {
232
+ var isPremium = (url) => {
231
233
  try {
232
- return PREMIUM_HOSTS.has(new URL(url).hostname) ? PREMIUM_RATE_PER_GB : STANDARD_RATE_PER_GB;
234
+ return PREMIUM_HOSTS.has(new URL(url).hostname);
233
235
  } catch {
234
- return STANDARD_RATE_PER_GB;
236
+ return false;
235
237
  }
236
238
  };
237
- var scrapeFee = ({ provider, bytes, url, cold }) => {
239
+ var ratePerGB = (url) => isPremium(url) ? PREMIUM_RATE_PER_GB : STANDARD_RATE_PER_GB;
240
+ var cpmCents = (url) => isPremium(url) ? PREMIUM_CPM_CENTS : STANDARD_CPM_CENTS;
241
+ var scrapeFee = ({ provider, bytes, requests, url, cold }) => {
238
242
  if (!cold) return REUSE_FLAT_CENTS;
239
243
  if (provider === "brightdata") {
240
244
  return Math.ceil((bytes || 0) / 1e9 * ratePerGB(url) * 100 * MARKUP);
241
245
  }
246
+ if (provider === "brightdata-unlocker") {
247
+ return Math.ceil((requests || 0) * cpmCents(url) * MARKUP);
248
+ }
242
249
  return LOCAL_FLAT_CENTS;
243
250
  };
244
251
  var scrape = {
@@ -261,6 +268,7 @@ var scrape = {
261
268
  const cents = scrapeFee({
262
269
  provider: (_a = page == null ? void 0 : page.provider) == null ? void 0 : _a.name,
263
270
  bytes: page == null ? void 0 : page.bytes,
271
+ requests: page == null ? void 0 : page.requests,
264
272
  url: (page == null ? void 0 : page.url) || url,
265
273
  cold: Boolean(claim == null ? void 0 : claim.value)
266
274
  });
package/package.json CHANGED
@@ -158,5 +158,5 @@
158
158
  "build": "tsup && npm publish"
159
159
  },
160
160
  "types": "dist/index.d.ts",
161
- "version": "0.0.69"
161
+ "version": "0.0.70"
162
162
  }