@statsig/serverless-client 3.29.0 → 3.30.0
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/package.json +7 -3
- package/src/provider/fastly.d.ts +28 -0
- package/src/provider/fastly.js +124 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@statsig/serverless-client",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.30.0",
|
|
4
4
|
"license": "ISC",
|
|
5
5
|
"homepage": "https://github.com/statsig-io/js-client-monorepo",
|
|
6
6
|
"repository": {
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
"directory": "packages/serverless"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@statsig/client-core": "3.
|
|
13
|
-
"@statsig/js-on-device-eval-client": "3.
|
|
12
|
+
"@statsig/client-core": "3.30.0",
|
|
13
|
+
"@statsig/js-on-device-eval-client": "3.30.0"
|
|
14
14
|
},
|
|
15
15
|
"type": "commonjs",
|
|
16
16
|
"main": "./src/index.js",
|
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
"./cloudflare": {
|
|
20
20
|
"types": "./src/provider/cloudflare.d.ts",
|
|
21
21
|
"default": "./src/provider/cloudflare.js"
|
|
22
|
+
},
|
|
23
|
+
"./fastly": {
|
|
24
|
+
"types": "./src/provider/fastly.d.ts",
|
|
25
|
+
"default": "./src/provider/fastly.js"
|
|
22
26
|
}
|
|
23
27
|
},
|
|
24
28
|
"devDependencies": {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { StatsigUpdateDetails } from '@statsig/client-core';
|
|
2
|
+
import { StatsigOptions } from '@statsig/js-on-device-eval-client';
|
|
3
|
+
import { StatsigServerlessClient } from '../StatsigServerlessClient';
|
|
4
|
+
export declare class StatsigFastlyClient extends StatsigServerlessClient {
|
|
5
|
+
constructor(sdkKey: string, options?: StatsigOptions | null);
|
|
6
|
+
initializeFromFastly(FastlyStoreType: 'kv' | 'config', storeId: string, keyId: string, apiToken: string): Promise<StatsigUpdateDetails>;
|
|
7
|
+
}
|
|
8
|
+
interface FetchEvent {
|
|
9
|
+
request: Request;
|
|
10
|
+
respondWith(response: Response | Promise<Response>): void;
|
|
11
|
+
waitUntil(promise: Promise<any>): void;
|
|
12
|
+
}
|
|
13
|
+
export interface StatsigFastlyHandler {
|
|
14
|
+
(event: FetchEvent, client: StatsigFastlyClient): Promise<Response> | Response;
|
|
15
|
+
}
|
|
16
|
+
export interface StatsigFastlyHandlerParams {
|
|
17
|
+
statsigSdkKey: string;
|
|
18
|
+
fastlyStoreType: 'kv' | 'config';
|
|
19
|
+
storeId: string;
|
|
20
|
+
keyId: string;
|
|
21
|
+
apiToken: string;
|
|
22
|
+
statsigOptions?: StatsigOptions;
|
|
23
|
+
}
|
|
24
|
+
interface FastlyHandlerExport {
|
|
25
|
+
(event: FetchEvent): Promise<Response>;
|
|
26
|
+
}
|
|
27
|
+
export declare function handleWithStatsig(handler: StatsigFastlyHandler, params: StatsigFastlyHandlerParams): FastlyHandlerExport;
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.handleWithStatsig = exports.StatsigFastlyClient = void 0;
|
|
13
|
+
const client_core_1 = require("@statsig/client-core");
|
|
14
|
+
const StatsigServerlessClient_1 = require("../StatsigServerlessClient");
|
|
15
|
+
class StatsigFastlyClient extends StatsigServerlessClient_1.StatsigServerlessClient {
|
|
16
|
+
constructor(sdkKey, options = null) {
|
|
17
|
+
var _a;
|
|
18
|
+
const userOverride = (_a = options === null || options === void 0 ? void 0 : options.networkConfig) === null || _a === void 0 ? void 0 : _a.networkOverrideFunc;
|
|
19
|
+
const fastlyNetworkOverride = (url, args) => __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
if (userOverride) {
|
|
21
|
+
return userOverride(url, args);
|
|
22
|
+
}
|
|
23
|
+
let backend;
|
|
24
|
+
if (url.startsWith(`${client_core_1.NetworkDefault[client_core_1.Endpoint._rgstr]}/${client_core_1.Endpoint._rgstr}`)) {
|
|
25
|
+
backend = 'statsig_flush';
|
|
26
|
+
}
|
|
27
|
+
else if (url.startsWith(`${client_core_1.NetworkDefault[client_core_1.Endpoint._download_config_specs]}/${client_core_1.Endpoint._download_config_specs}`)) {
|
|
28
|
+
backend = 'async_initialize';
|
|
29
|
+
}
|
|
30
|
+
return fetch(url, Object.assign(Object.assign({}, args), { backend }));
|
|
31
|
+
});
|
|
32
|
+
const fastlyOptions = Object.assign(Object.assign({}, options), { networkConfig: Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.networkConfig), { networkOverrideFunc: fastlyNetworkOverride }) });
|
|
33
|
+
super(sdkKey, fastlyOptions);
|
|
34
|
+
}
|
|
35
|
+
initializeFromFastly(FastlyStoreType, storeId, keyId, apiToken) {
|
|
36
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
const startTime = performance.now();
|
|
38
|
+
let url;
|
|
39
|
+
if (FastlyStoreType === 'kv') {
|
|
40
|
+
url = `https://api.fastly.com/resources/stores/kv/${storeId}/keys/${keyId}`;
|
|
41
|
+
}
|
|
42
|
+
else if (FastlyStoreType === 'config') {
|
|
43
|
+
url = `https://api.fastly.com/resources/stores/config/${storeId}/item/${keyId}`;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return {
|
|
47
|
+
duration: performance.now() - startTime,
|
|
48
|
+
source: 'Bootstrap',
|
|
49
|
+
success: false,
|
|
50
|
+
error: { message: 'Invalid Fastly store type' },
|
|
51
|
+
sourceUrl: 'Invalid Fastly store type',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const response = yield fetch(url, {
|
|
56
|
+
method: 'GET',
|
|
57
|
+
headers: {
|
|
58
|
+
'Fastly-Key': apiToken,
|
|
59
|
+
Accept: 'application/json',
|
|
60
|
+
},
|
|
61
|
+
backend: 'fastly_api',
|
|
62
|
+
});
|
|
63
|
+
const res = yield response.text();
|
|
64
|
+
if (res) {
|
|
65
|
+
let configData;
|
|
66
|
+
if (FastlyStoreType === 'config') {
|
|
67
|
+
const parsedRes = JSON.parse(res);
|
|
68
|
+
configData = parsedRes.item_value;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
configData = res;
|
|
72
|
+
}
|
|
73
|
+
this.dataAdapter.setData(configData);
|
|
74
|
+
return this.initializeSync({
|
|
75
|
+
disableBackgroundCacheRefresh: true,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
duration: performance.now() - startTime,
|
|
80
|
+
source: 'Bootstrap',
|
|
81
|
+
success: false,
|
|
82
|
+
error: {
|
|
83
|
+
message: 'Config specs were not parsed successfully',
|
|
84
|
+
},
|
|
85
|
+
sourceUrl: url,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
return {
|
|
90
|
+
duration: performance.now() - startTime,
|
|
91
|
+
source: 'Bootstrap',
|
|
92
|
+
success: false,
|
|
93
|
+
error: {
|
|
94
|
+
message: 'Failed to retrieve config specs from Fastly',
|
|
95
|
+
},
|
|
96
|
+
sourceUrl: url,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.StatsigFastlyClient = StatsigFastlyClient;
|
|
103
|
+
function handleWithStatsig(handler, params) {
|
|
104
|
+
return (event) => __awaiter(this, void 0, void 0, function* () {
|
|
105
|
+
if (!params.statsigSdkKey || typeof params.statsigSdkKey !== 'string') {
|
|
106
|
+
client_core_1.Log.error(`Invalid statsigSdkKey`);
|
|
107
|
+
}
|
|
108
|
+
if (!params.storeId || typeof params.storeId !== 'string') {
|
|
109
|
+
client_core_1.Log.error(`Invalid storeId`);
|
|
110
|
+
}
|
|
111
|
+
if (!params.keyId || typeof params.keyId !== 'string') {
|
|
112
|
+
client_core_1.Log.error(`Invalid keyId`);
|
|
113
|
+
}
|
|
114
|
+
if (!params.apiToken || typeof params.apiToken !== 'string') {
|
|
115
|
+
client_core_1.Log.error(`Invalid apiToken`);
|
|
116
|
+
}
|
|
117
|
+
const client = new StatsigFastlyClient(params.statsigSdkKey, params.statsigOptions);
|
|
118
|
+
yield client.initializeFromFastly(params.fastlyStoreType, params.storeId, params.keyId, params.apiToken);
|
|
119
|
+
const response = yield handler(event, client);
|
|
120
|
+
event.waitUntil(client.flush());
|
|
121
|
+
return response;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
exports.handleWithStatsig = handleWithStatsig;
|