@brandlab-digital/site-next 1.0.0-rc.25 → 1.0.0-rc.26
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/google-reviews-server.d.ts +5 -19
- package/dist/google-reviews-server.d.ts.map +1 -1
- package/dist/google-reviews-server.js +26 -76
- package/dist/google-reviews-server.js.map +1 -1
- package/package.json +2 -2
- package/dist/google-reviews-durable.d.ts +0 -22
- package/dist/google-reviews-durable.d.ts.map +0 -1
- package/dist/google-reviews-durable.js +0 -81
- package/dist/google-reviews-durable.js.map +0 -1
- package/dist/redis-rest.d.ts +0 -12
- package/dist/redis-rest.d.ts.map +0 -1
- package/dist/redis-rest.js +0 -83
- package/dist/redis-rest.js.map +0 -1
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import 'server-only';
|
|
2
2
|
import { type FetchGooglePlaceReviewsOptions, type GooglePlaceReviewsMode } from '@brandlab-digital/site-core/google-reviews';
|
|
3
|
-
export declare const BRANDLAB_GOOGLE_REVIEWS_PRODUCTION_RUNTIME: "brandlab-google-reviews-production-
|
|
3
|
+
export declare const BRANDLAB_GOOGLE_REVIEWS_PRODUCTION_RUNTIME: "brandlab-google-reviews-production-v2";
|
|
4
4
|
export declare const BRANDLAB_GOOGLE_REVIEWS_ENVIRONMENT_NAMES: {
|
|
5
5
|
readonly apiKey: "GOOGLE_MAPS_PLATFORM_API_KEY";
|
|
6
|
-
readonly redisRestUrl: "UPSTASH_REDIS_REST_URL";
|
|
7
|
-
readonly redisRestToken: "UPSTASH_REDIS_REST_TOKEN";
|
|
8
6
|
};
|
|
7
|
+
export declare const BRANDLAB_GOOGLE_REVIEWS_REVALIDATE_SECONDS = 86400;
|
|
9
8
|
export declare const GOOGLE_PLACE_REVIEWS_UNAVAILABLE_HEADERS: {
|
|
10
9
|
readonly 'Cache-Control': "private, no-store, max-age=0";
|
|
11
10
|
readonly Pragma: "no-cache";
|
|
@@ -16,34 +15,20 @@ export declare const GOOGLE_PLACE_REVIEWS_AVAILABLE_HEADERS: {
|
|
|
16
15
|
readonly Pragma: "no-cache";
|
|
17
16
|
readonly 'X-Content-Type-Options': "nosniff";
|
|
18
17
|
};
|
|
19
|
-
export interface GooglePlaceReviewsQuotaDecision {
|
|
20
|
-
allowed: boolean;
|
|
21
|
-
retryAfterSeconds?: number;
|
|
22
|
-
}
|
|
23
|
-
export type GooglePlaceReviewsQuotaGuard = (input: {
|
|
24
|
-
placeId: string;
|
|
25
|
-
}) => Promise<GooglePlaceReviewsQuotaDecision> | GooglePlaceReviewsQuotaDecision;
|
|
26
18
|
export interface GooglePlaceReviewsRouteOptions extends FetchGooglePlaceReviewsOptions {
|
|
27
|
-
/** Durable, project-wide quota protection keyed without request PII. */
|
|
28
|
-
quotaGuard: GooglePlaceReviewsQuotaGuard;
|
|
29
19
|
responseInit?: ResponseInit;
|
|
30
20
|
}
|
|
31
21
|
/** Low-level route response for tests and approved custom adapters. */
|
|
32
22
|
export declare function createGooglePlaceReviewsRouteResponse(options: GooglePlaceReviewsRouteOptions): Promise<Response>;
|
|
33
23
|
export interface BrandlabGooglePlaceReviewsProductionRuntimeOptions {
|
|
34
|
-
projectId: string;
|
|
35
24
|
placeId: string;
|
|
36
25
|
mode: GooglePlaceReviewsMode;
|
|
37
|
-
monthlyRequestLimit: number;
|
|
38
26
|
/** Full mode only. Google currently returns at most five reviews. */
|
|
39
27
|
maxReviews?: number;
|
|
40
28
|
fallbackGoogleMapsUri?: string;
|
|
41
29
|
environment: Readonly<Record<string, string | undefined>>;
|
|
42
|
-
namespace?: string;
|
|
43
30
|
/** Test-only transport override. */
|
|
44
31
|
fetcher?: typeof fetch;
|
|
45
|
-
/** Test-only clock override. */
|
|
46
|
-
now?: () => Date;
|
|
47
32
|
}
|
|
48
33
|
export interface BrandlabGooglePlaceReviewsProductionRuntime {
|
|
49
34
|
runtimeKind: typeof BRANDLAB_GOOGLE_REVIEWS_PRODUCTION_RUNTIME;
|
|
@@ -51,8 +36,9 @@ export interface BrandlabGooglePlaceReviewsProductionRuntime {
|
|
|
51
36
|
routeHandler: () => Promise<Response>;
|
|
52
37
|
}
|
|
53
38
|
/**
|
|
54
|
-
* Creates the
|
|
55
|
-
*
|
|
39
|
+
* Creates the approved production route. The public response is never cached,
|
|
40
|
+
* while the server-only Places request uses Next.js' built-in Data Cache for
|
|
41
|
+
* one day. No external database is required.
|
|
56
42
|
*/
|
|
57
43
|
export declare function createBrandlabGooglePlaceReviewsProductionRuntime(options: BrandlabGooglePlaceReviewsProductionRuntimeOptions): BrandlabGooglePlaceReviewsProductionRuntime;
|
|
58
44
|
//# sourceMappingURL=google-reviews-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-reviews-server.d.ts","sourceRoot":"","sources":["../src/google-reviews-server.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AAEpB,OAAO,
|
|
1
|
+
{"version":3,"file":"google-reviews-server.d.ts","sourceRoot":"","sources":["../src/google-reviews-server.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AAEpB,OAAO,EAIL,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,EAE5B,MAAM,4CAA4C,CAAA;AAEnD,eAAO,MAAM,0CAA0C,EACrD,uCAAgD,CAAA;AAElD,eAAO,MAAM,yCAAyC;;CAE5C,CAAA;AAEV,eAAO,MAAM,0CAA0C,QAAS,CAAA;AAEhE,eAAO,MAAM,wCAAwC;;;;CAI3C,CAAA;AAEV,eAAO,MAAM,sCAAsC;;;;CACT,CAAA;AAE1C,MAAM,WAAW,8BAA+B,SAAQ,8BAA8B;IACpF,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B;AA2CD,uEAAuE;AACvE,wBAAsB,qCAAqC,CACzD,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,QAAQ,CAAC,CAYnB;AAED,MAAM,WAAW,kDAAkD;IACjE,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,sBAAsB,CAAA;IAC5B,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IACzD,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;CACvB;AAED,MAAM,WAAW,2CAA2C;IAC1D,WAAW,EAAE,OAAO,0CAA0C,CAAA;IAC9D,IAAI,EAAE,sBAAsB,CAAA;IAC5B,YAAY,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAA;CACtC;AA6BD;;;;GAIG;AACH,wBAAgB,iDAAiD,CAC/D,OAAO,EAAE,kDAAkD,GAC1D,2CAA2C,CA2B7C"}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import 'server-only';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import { createBrandlabUpstashRedisEvalClient } from './redis-rest.js';
|
|
5
|
-
export const BRANDLAB_GOOGLE_REVIEWS_PRODUCTION_RUNTIME = 'brandlab-google-reviews-production-v1';
|
|
2
|
+
import { fetchGooglePlaceReviewsSnapshot, normalizeGooglePlaceId, normalizeGooglePlaceReviewsMode, } from '@brandlab-digital/site-core/google-reviews';
|
|
3
|
+
export const BRANDLAB_GOOGLE_REVIEWS_PRODUCTION_RUNTIME = 'brandlab-google-reviews-production-v2';
|
|
6
4
|
export const BRANDLAB_GOOGLE_REVIEWS_ENVIRONMENT_NAMES = {
|
|
7
5
|
apiKey: 'GOOGLE_MAPS_PLATFORM_API_KEY',
|
|
8
|
-
redisRestUrl: 'UPSTASH_REDIS_REST_URL',
|
|
9
|
-
redisRestToken: 'UPSTASH_REDIS_REST_TOKEN',
|
|
10
6
|
};
|
|
7
|
+
export const BRANDLAB_GOOGLE_REVIEWS_REVALIDATE_SECONDS = 86_400;
|
|
11
8
|
export const GOOGLE_PLACE_REVIEWS_UNAVAILABLE_HEADERS = {
|
|
12
9
|
'Cache-Control': 'private, no-store, max-age=0',
|
|
13
10
|
Pragma: 'no-cache',
|
|
@@ -24,42 +21,6 @@ function coalescingKey(options) {
|
|
|
24
21
|
]);
|
|
25
22
|
}
|
|
26
23
|
async function loadGooglePlaceReviewsSnapshot(options) {
|
|
27
|
-
const placeId = normalizeGooglePlaceId(options.placeId);
|
|
28
|
-
const mode = normalizeGooglePlaceReviewsMode(options.mode);
|
|
29
|
-
if (!options.apiKey?.trim() || !placeId) {
|
|
30
|
-
return { snapshot: await fetchGooglePlaceReviewsSnapshot(options) };
|
|
31
|
-
}
|
|
32
|
-
if (typeof options.quotaGuard !== 'function') {
|
|
33
|
-
return {
|
|
34
|
-
snapshot: createGooglePlaceReviewsUnavailableSnapshot('quota-guard-unavailable', options.fallbackGoogleMapsUri, mode),
|
|
35
|
-
forcedStatus: 503,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
let decision;
|
|
39
|
-
try {
|
|
40
|
-
decision = await options.quotaGuard({ placeId });
|
|
41
|
-
if (typeof decision?.allowed !== 'boolean' ||
|
|
42
|
-
(decision.retryAfterSeconds !== undefined && (!Number.isSafeInteger(decision.retryAfterSeconds) ||
|
|
43
|
-
decision.retryAfterSeconds < 1 ||
|
|
44
|
-
decision.retryAfterSeconds > 86_400))) {
|
|
45
|
-
throw new Error('Invalid quota decision.');
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
return {
|
|
50
|
-
snapshot: createGooglePlaceReviewsUnavailableSnapshot('quota-guard-unavailable', options.fallbackGoogleMapsUri, mode),
|
|
51
|
-
forcedStatus: 503,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
if (!decision.allowed) {
|
|
55
|
-
return {
|
|
56
|
-
snapshot: createGooglePlaceReviewsUnavailableSnapshot('quota-exhausted', options.fallbackGoogleMapsUri, mode),
|
|
57
|
-
forcedStatus: 429,
|
|
58
|
-
...(decision.retryAfterSeconds
|
|
59
|
-
? { retryAfterSeconds: decision.retryAfterSeconds }
|
|
60
|
-
: {}),
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
24
|
return { snapshot: await fetchGooglePlaceReviewsSnapshot(options) };
|
|
64
25
|
}
|
|
65
26
|
function getGooglePlaceReviewsRequest(options) {
|
|
@@ -85,50 +46,40 @@ export async function createGooglePlaceReviewsRouteResponse(options) {
|
|
|
85
46
|
Object.entries(GOOGLE_PLACE_REVIEWS_AVAILABLE_HEADERS).forEach(([name, value]) => {
|
|
86
47
|
headers.set(name, value);
|
|
87
48
|
});
|
|
88
|
-
if (result.retryAfterSeconds) {
|
|
89
|
-
headers.set('Retry-After', String(result.retryAfterSeconds));
|
|
90
|
-
}
|
|
91
49
|
return Response.json(result.snapshot, {
|
|
92
50
|
...options.responseInit,
|
|
93
|
-
status:
|
|
51
|
+
status: options.responseInit?.status,
|
|
94
52
|
headers,
|
|
95
53
|
});
|
|
96
54
|
}
|
|
97
|
-
function
|
|
55
|
+
function optionalEnvironment(environment, name) {
|
|
98
56
|
const value = environment[name];
|
|
99
|
-
if (typeof value !== 'string' ||
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
57
|
+
if (typeof value !== 'string' || !value.trim())
|
|
58
|
+
return undefined;
|
|
59
|
+
if (value.length > 8_192 || /[\u0000-\u001f\u007f]/.test(value))
|
|
60
|
+
return undefined;
|
|
61
|
+
return value.trim();
|
|
62
|
+
}
|
|
63
|
+
function createCachedGooglePlacesFetcher(fetcher) {
|
|
64
|
+
return ((input, init) => fetcher(input, {
|
|
65
|
+
...init,
|
|
66
|
+
cache: 'force-cache',
|
|
67
|
+
next: {
|
|
68
|
+
revalidate: BRANDLAB_GOOGLE_REVIEWS_REVALIDATE_SECONDS,
|
|
69
|
+
},
|
|
70
|
+
}));
|
|
106
71
|
}
|
|
107
72
|
/**
|
|
108
|
-
* Creates the
|
|
109
|
-
*
|
|
73
|
+
* Creates the approved production route. The public response is never cached,
|
|
74
|
+
* while the server-only Places request uses Next.js' built-in Data Cache for
|
|
75
|
+
* one day. No external database is required.
|
|
110
76
|
*/
|
|
111
77
|
export function createBrandlabGooglePlaceReviewsProductionRuntime(options) {
|
|
112
|
-
if (
|
|
113
|
-
|
|
114
|
-
throw new Error('Google reviews transport and clock overrides are available only in test mode.');
|
|
78
|
+
if (options.fetcher && options.environment.NODE_ENV !== 'test') {
|
|
79
|
+
throw new Error('Google reviews transport overrides are available only in test mode.');
|
|
115
80
|
}
|
|
116
|
-
const apiKey =
|
|
117
|
-
const
|
|
118
|
-
const redisRestToken = requiredEnvironment(options.environment, BRANDLAB_GOOGLE_REVIEWS_ENVIRONMENT_NAMES.redisRestToken);
|
|
119
|
-
const fetcher = options.fetcher ?? fetch;
|
|
120
|
-
const redis = createBrandlabUpstashRedisEvalClient({
|
|
121
|
-
url: redisRestUrl,
|
|
122
|
-
token: redisRestToken,
|
|
123
|
-
fetcher,
|
|
124
|
-
});
|
|
125
|
-
const quotaGuard = createRedisGooglePlaceReviewsQuotaGuard({
|
|
126
|
-
redis,
|
|
127
|
-
projectId: options.projectId,
|
|
128
|
-
monthlyRequestLimit: options.monthlyRequestLimit,
|
|
129
|
-
...(options.namespace ? { namespace: options.namespace } : {}),
|
|
130
|
-
...(options.now ? { now: options.now } : {}),
|
|
131
|
-
});
|
|
81
|
+
const apiKey = optionalEnvironment(options.environment, BRANDLAB_GOOGLE_REVIEWS_ENVIRONMENT_NAMES.apiKey);
|
|
82
|
+
const fetcher = createCachedGooglePlacesFetcher(options.fetcher ?? fetch);
|
|
132
83
|
const mode = normalizeGooglePlaceReviewsMode(options.mode);
|
|
133
84
|
return {
|
|
134
85
|
runtimeKind: BRANDLAB_GOOGLE_REVIEWS_PRODUCTION_RUNTIME,
|
|
@@ -143,7 +94,6 @@ export function createBrandlabGooglePlaceReviewsProductionRuntime(options) {
|
|
|
143
94
|
...(options.fallbackGoogleMapsUri
|
|
144
95
|
? { fallbackGoogleMapsUri: options.fallbackGoogleMapsUri }
|
|
145
96
|
: {}),
|
|
146
|
-
quotaGuard,
|
|
147
97
|
fetcher,
|
|
148
98
|
}),
|
|
149
99
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-reviews-server.js","sourceRoot":"","sources":["../src/google-reviews-server.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AAEpB,OAAO,EACL
|
|
1
|
+
{"version":3,"file":"google-reviews-server.js","sourceRoot":"","sources":["../src/google-reviews-server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brandlab-digital/site-next",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.26",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/RomieDandan/brandlab.git",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@brandlab-digital/site-core": "1.0.0-rc.
|
|
21
|
+
"@brandlab-digital/site-core": "1.0.0-rc.26",
|
|
22
22
|
"server-only": "0.0.1",
|
|
23
23
|
"sharp": "0.35.3"
|
|
24
24
|
},
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import 'server-only';
|
|
2
|
-
import type { BrandlabAtomicRedisClient } from './redis-rest.js';
|
|
3
|
-
export interface GooglePlaceReviewsQuotaDecision {
|
|
4
|
-
allowed: boolean;
|
|
5
|
-
retryAfterSeconds?: number;
|
|
6
|
-
}
|
|
7
|
-
export type GooglePlaceReviewsQuotaGuard = (input: {
|
|
8
|
-
placeId: string;
|
|
9
|
-
}) => Promise<GooglePlaceReviewsQuotaDecision> | GooglePlaceReviewsQuotaDecision;
|
|
10
|
-
export interface RedisGooglePlaceReviewsQuotaGuardOptions {
|
|
11
|
-
redis: BrandlabAtomicRedisClient;
|
|
12
|
-
projectId: string;
|
|
13
|
-
monthlyRequestLimit: number;
|
|
14
|
-
namespace?: string;
|
|
15
|
-
now?: () => Date;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Enforces a project-level monthly request ceiling in the existing Brandlab
|
|
19
|
-
* Redis database. Keys contain only the canonical project ID and month.
|
|
20
|
-
*/
|
|
21
|
-
export declare function createRedisGooglePlaceReviewsQuotaGuard(options: RedisGooglePlaceReviewsQuotaGuardOptions): GooglePlaceReviewsQuotaGuard;
|
|
22
|
-
//# sourceMappingURL=google-reviews-durable.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google-reviews-durable.d.ts","sourceRoot":"","sources":["../src/google-reviews-durable.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AAGpB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAmBhE,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,OAAO,CAAA;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,MAAM,4BAA4B,GAAG,CAAC,KAAK,EAAE;IACjD,OAAO,EAAE,MAAM,CAAA;CAChB,KAAK,OAAO,CAAC,+BAA+B,CAAC,GAAG,+BAA+B,CAAA;AAEhF,MAAM,WAAW,wCAAwC;IACvD,KAAK,EAAE,yBAAyB,CAAA;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAiCD;;;GAGG;AACH,wBAAgB,uCAAuC,CACrD,OAAO,EAAE,wCAAwC,GAChD,4BAA4B,CAuC9B"}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import 'server-only';
|
|
2
|
-
import { isBrandlabCanonicalEntityId } from '@brandlab-digital/site-core/entity-id';
|
|
3
|
-
const NAMESPACE_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
4
|
-
const DEFAULT_NAMESPACE = 'brandlab';
|
|
5
|
-
const MAXIMUM_MONTHLY_REQUEST_LIMIT = 100_000;
|
|
6
|
-
const MONTHLY_QUOTA_LUA = `
|
|
7
|
-
local count = redis.call('INCR', KEYS[1])
|
|
8
|
-
if count == 1 then
|
|
9
|
-
redis.call('PEXPIREAT', KEYS[1], ARGV[1])
|
|
10
|
-
end
|
|
11
|
-
local ttl = redis.call('PTTL', KEYS[1])
|
|
12
|
-
if ttl < 0 then
|
|
13
|
-
redis.call('PEXPIREAT', KEYS[1], ARGV[1])
|
|
14
|
-
ttl = tonumber(ARGV[1]) - tonumber(ARGV[2])
|
|
15
|
-
end
|
|
16
|
-
return {count, ttl}
|
|
17
|
-
`.trim();
|
|
18
|
-
function redisInteger(value) {
|
|
19
|
-
if (typeof value !== 'number' &&
|
|
20
|
-
(typeof value !== 'string' || !/^-?\d+$/.test(value))) {
|
|
21
|
-
return undefined;
|
|
22
|
-
}
|
|
23
|
-
const parsed = typeof value === 'number' ? value : Number(value);
|
|
24
|
-
return Number.isSafeInteger(parsed) ? parsed : undefined;
|
|
25
|
-
}
|
|
26
|
-
function quotaResult(value) {
|
|
27
|
-
if (!Array.isArray(value) || value.length !== 2)
|
|
28
|
-
return undefined;
|
|
29
|
-
const count = redisInteger(value[0]);
|
|
30
|
-
const ttlMs = redisInteger(value[1]);
|
|
31
|
-
if (count === undefined || count < 1 || ttlMs === undefined || ttlMs < 1)
|
|
32
|
-
return undefined;
|
|
33
|
-
return { count, ttlMs };
|
|
34
|
-
}
|
|
35
|
-
function namespacePrefix(namespace) {
|
|
36
|
-
const value = namespace ?? DEFAULT_NAMESPACE;
|
|
37
|
-
if (!NAMESPACE_PATTERN.test(value)) {
|
|
38
|
-
throw new Error('The Google reviews durable namespace must be bounded lowercase kebab-case.');
|
|
39
|
-
}
|
|
40
|
-
return `${value}:reviews:v1`;
|
|
41
|
-
}
|
|
42
|
-
function nextUtcMonth(date) {
|
|
43
|
-
return Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 1);
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Enforces a project-level monthly request ceiling in the existing Brandlab
|
|
47
|
-
* Redis database. Keys contain only the canonical project ID and month.
|
|
48
|
-
*/
|
|
49
|
-
export function createRedisGooglePlaceReviewsQuotaGuard(options) {
|
|
50
|
-
if (!options.redis || typeof options.redis.eval !== 'function') {
|
|
51
|
-
throw new Error('A Redis-compatible Google reviews quota store is required.');
|
|
52
|
-
}
|
|
53
|
-
if (!isBrandlabCanonicalEntityId(options.projectId)) {
|
|
54
|
-
throw new Error('The Google reviews project ID is invalid.');
|
|
55
|
-
}
|
|
56
|
-
if (!Number.isSafeInteger(options.monthlyRequestLimit) ||
|
|
57
|
-
options.monthlyRequestLimit < 1 ||
|
|
58
|
-
options.monthlyRequestLimit > MAXIMUM_MONTHLY_REQUEST_LIMIT) {
|
|
59
|
-
throw new Error(`Google reviews monthlyRequestLimit must be between 1 and ${MAXIMUM_MONTHLY_REQUEST_LIMIT}.`);
|
|
60
|
-
}
|
|
61
|
-
const prefix = namespacePrefix(options.namespace);
|
|
62
|
-
const now = options.now ?? (() => new Date());
|
|
63
|
-
return async () => {
|
|
64
|
-
const current = now();
|
|
65
|
-
if (Number.isNaN(current.getTime())) {
|
|
66
|
-
throw new Error('The Google reviews quota clock is invalid.');
|
|
67
|
-
}
|
|
68
|
-
const month = current.toISOString().slice(0, 7);
|
|
69
|
-
const expiresAt = nextUtcMonth(current);
|
|
70
|
-
const result = quotaResult(await options.redis.eval(MONTHLY_QUOTA_LUA, [`${prefix}:quota:${options.projectId}:${month}`], [String(expiresAt), String(current.getTime())]));
|
|
71
|
-
if (!result)
|
|
72
|
-
throw new Error('The Google reviews quota store returned an invalid result.');
|
|
73
|
-
return result.count <= options.monthlyRequestLimit
|
|
74
|
-
? { allowed: true }
|
|
75
|
-
: {
|
|
76
|
-
allowed: false,
|
|
77
|
-
retryAfterSeconds: Math.max(1, Math.ceil(result.ttlMs / 1_000)),
|
|
78
|
-
};
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=google-reviews-durable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google-reviews-durable.js","sourceRoot":"","sources":["../src/google-reviews-durable.ts"],"names":[],"mappings":"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"}
|
package/dist/redis-rest.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import 'server-only';
|
|
2
|
-
export interface BrandlabAtomicRedisClient {
|
|
3
|
-
eval(script: string, keys: readonly string[], args: readonly (string | number)[]): Promise<unknown>;
|
|
4
|
-
}
|
|
5
|
-
/** Shared server-only Upstash REST boundary used by Brandlab durable runtimes. */
|
|
6
|
-
export declare function createBrandlabUpstashRedisEvalClient(options: {
|
|
7
|
-
url: string;
|
|
8
|
-
token: string;
|
|
9
|
-
fetcher?: typeof fetch;
|
|
10
|
-
timeoutMs?: number;
|
|
11
|
-
}): BrandlabAtomicRedisClient;
|
|
12
|
-
//# sourceMappingURL=redis-rest.d.ts.map
|
package/dist/redis-rest.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"redis-rest.d.ts","sourceRoot":"","sources":["../src/redis-rest.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AAKpB,MAAM,WAAW,yBAAyB;IACxC,IAAI,CACF,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GACjC,OAAO,CAAC,OAAO,CAAC,CAAA;CACpB;AAwBD,kFAAkF;AAClF,wBAAgB,oCAAoC,CAAC,OAAO,EAAE;IAC5D,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,yBAAyB,CAyD5B"}
|
package/dist/redis-rest.js
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import 'server-only';
|
|
2
|
-
const DEFAULT_REQUEST_TIMEOUT_MS = 5_000;
|
|
3
|
-
const RESPONSE_MAXIMUM_BYTES = 64 * 1_024;
|
|
4
|
-
function normalizeHttpsOrigin(value, field) {
|
|
5
|
-
const candidate = value.includes('://') ? value : `https://${value}`;
|
|
6
|
-
let parsed;
|
|
7
|
-
try {
|
|
8
|
-
parsed = new URL(candidate);
|
|
9
|
-
}
|
|
10
|
-
catch {
|
|
11
|
-
throw new Error(`${field} must resolve to an absolute HTTPS origin.`);
|
|
12
|
-
}
|
|
13
|
-
if (parsed.protocol !== 'https:' ||
|
|
14
|
-
parsed.username ||
|
|
15
|
-
parsed.password ||
|
|
16
|
-
parsed.pathname !== '/' ||
|
|
17
|
-
parsed.search ||
|
|
18
|
-
parsed.hash ||
|
|
19
|
-
!parsed.hostname.includes('.')) {
|
|
20
|
-
throw new Error(`${field} must resolve to an absolute HTTPS origin.`);
|
|
21
|
-
}
|
|
22
|
-
return parsed.origin;
|
|
23
|
-
}
|
|
24
|
-
/** Shared server-only Upstash REST boundary used by Brandlab durable runtimes. */
|
|
25
|
-
export function createBrandlabUpstashRedisEvalClient(options) {
|
|
26
|
-
const endpoint = normalizeHttpsOrigin(options.url, 'Redis REST URL');
|
|
27
|
-
if (options.token.length < 16 ||
|
|
28
|
-
options.token.length > 8_192 ||
|
|
29
|
-
/[\u0000-\u001f\u007f]/.test(options.token)) {
|
|
30
|
-
throw new Error('Redis REST token is invalid.');
|
|
31
|
-
}
|
|
32
|
-
const fetcher = options.fetcher ?? fetch;
|
|
33
|
-
if (typeof fetcher !== 'function') {
|
|
34
|
-
throw new Error('A Redis REST fetch implementation is required.');
|
|
35
|
-
}
|
|
36
|
-
const timeoutMs = options.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
37
|
-
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 100 || timeoutMs > 20_000) {
|
|
38
|
-
throw new Error('Redis REST timeout must be between 100 and 20000 milliseconds.');
|
|
39
|
-
}
|
|
40
|
-
return {
|
|
41
|
-
async eval(script, keys, args) {
|
|
42
|
-
const controller = new AbortController();
|
|
43
|
-
const timeout = globalThis.setTimeout(() => controller.abort(), timeoutMs);
|
|
44
|
-
try {
|
|
45
|
-
const response = await fetcher(endpoint, {
|
|
46
|
-
method: 'POST',
|
|
47
|
-
headers: {
|
|
48
|
-
authorization: `Bearer ${options.token}`,
|
|
49
|
-
'content-type': 'application/json',
|
|
50
|
-
},
|
|
51
|
-
body: JSON.stringify(['EVAL', script, keys.length, ...keys, ...args]),
|
|
52
|
-
cache: 'no-store',
|
|
53
|
-
signal: controller.signal,
|
|
54
|
-
});
|
|
55
|
-
if (!response.ok)
|
|
56
|
-
throw new Error('The durable Brandlab store is unavailable.');
|
|
57
|
-
const rawPayload = await response.text();
|
|
58
|
-
if (new TextEncoder().encode(rawPayload).byteLength > RESPONSE_MAXIMUM_BYTES) {
|
|
59
|
-
throw new Error('The durable Brandlab store returned an invalid result.');
|
|
60
|
-
}
|
|
61
|
-
let payload;
|
|
62
|
-
try {
|
|
63
|
-
payload = JSON.parse(rawPayload);
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
throw new Error('The durable Brandlab store returned an invalid result.');
|
|
67
|
-
}
|
|
68
|
-
if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
|
|
69
|
-
throw new Error('The durable Brandlab store returned an invalid result.');
|
|
70
|
-
}
|
|
71
|
-
const record = payload;
|
|
72
|
-
if (record.error || !Object.prototype.hasOwnProperty.call(record, 'result')) {
|
|
73
|
-
throw new Error('The durable Brandlab store returned an invalid result.');
|
|
74
|
-
}
|
|
75
|
-
return record.result;
|
|
76
|
-
}
|
|
77
|
-
finally {
|
|
78
|
-
globalThis.clearTimeout(timeout);
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=redis-rest.js.map
|
package/dist/redis-rest.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"redis-rest.js","sourceRoot":"","sources":["../src/redis-rest.ts"],"names":[],"mappings":"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"}
|