@feelflow/ffid-sdk 5.18.0 → 5.21.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/README.md +77 -0
- package/dist/agency/index.cjs +4 -2
- package/dist/agency/index.js +4 -2
- package/dist/announcements/index.cjs +2 -1
- package/dist/announcements/index.js +2 -1
- package/dist/{chunk-55S5VUWR.cjs → chunk-RDQ4R3XC.cjs} +190 -49
- package/dist/{chunk-L2H56C4W.js → chunk-U57ZDFEN.js} +190 -49
- package/dist/components/index.cjs +8 -8
- package/dist/components/index.d.cts +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.js +1 -1
- package/dist/{ffid-client-Cwk6cG3b.d.cts → ffid-client-BQPhm-XL.d.cts} +268 -9
- package/dist/{ffid-client-w8Twi5lD.d.ts → ffid-client-Bx8y4SwC.d.ts} +268 -9
- package/dist/{index-Bkul-fRw.d.cts → index--wRiPlpi.d.cts} +54 -8
- package/dist/{index-Bkul-fRw.d.ts → index--wRiPlpi.d.ts} +54 -8
- package/dist/index.cjs +42 -42
- package/dist/index.d.cts +217 -4
- package/dist/index.d.ts +217 -4
- package/dist/index.js +2 -2
- package/dist/legal/index.cjs +2 -1
- package/dist/legal/index.js +2 -1
- package/dist/server/index.cjs +188 -48
- package/dist/server/index.d.cts +2 -2
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +188 -48
- package/dist/server/test/index.d.cts +1 -1
- package/dist/server/test/index.d.ts +1 -1
- package/dist/webhooks/index.cjs +2 -2
- package/dist/webhooks/index.js +2 -2
- package/package.json +1 -1
package/dist/server/index.cjs
CHANGED
|
@@ -261,10 +261,12 @@ var OAUTH_INTROSPECT_ENDPOINT = "/api/v1/oauth/introspect";
|
|
|
261
261
|
var CACHE_KEY_PREFIX = "ffid:introspect:";
|
|
262
262
|
var HEX_BASE = 16;
|
|
263
263
|
var HEX_BYTE_WIDTH = 2;
|
|
264
|
-
var TOKEN_LOG_PREFIX_LENGTH = 8;
|
|
265
264
|
function createVerifyAccessToken(deps) {
|
|
266
265
|
const { authMode, baseUrl, serviceCode, serviceApiKey, verifyStrategy, logger, createError, errorCodes, cache, timeout } = deps;
|
|
267
266
|
let jwtVerify2 = null;
|
|
267
|
+
let cacheReadFailureEscalated = false;
|
|
268
|
+
let cacheWriteFailureEscalated = false;
|
|
269
|
+
let missingSubtleCryptoLogged = false;
|
|
268
270
|
function getJwtVerifier() {
|
|
269
271
|
if (!jwtVerify2) {
|
|
270
272
|
jwtVerify2 = createJwtVerifier({
|
|
@@ -324,8 +326,9 @@ function createVerifyAccessToken(deps) {
|
|
|
324
326
|
}
|
|
325
327
|
const url = `${baseUrl}${OAUTH_INTROSPECT_ENDPOINT}`;
|
|
326
328
|
logger.debug("Verifying access token:", url);
|
|
327
|
-
const cacheKey = cache ? await buildCacheKey(accessToken, cacheKeySuffix) :
|
|
328
|
-
|
|
329
|
+
const cacheKey = cache ? await buildCacheKey(accessToken, cacheKeySuffix) : null;
|
|
330
|
+
let verificationCacheDegraded = cache !== void 0 && cacheKey === null;
|
|
331
|
+
if (cache && cacheKey !== null) {
|
|
329
332
|
try {
|
|
330
333
|
const cached = await cache.adapter.get(cacheKey);
|
|
331
334
|
if (cached && typeof cached === "object" && "sub" in cached) {
|
|
@@ -333,7 +336,16 @@ function createVerifyAccessToken(deps) {
|
|
|
333
336
|
return { data: cached };
|
|
334
337
|
}
|
|
335
338
|
} catch (cacheError) {
|
|
336
|
-
|
|
339
|
+
verificationCacheDegraded = true;
|
|
340
|
+
if (!cacheReadFailureEscalated) {
|
|
341
|
+
cacheReadFailureEscalated = true;
|
|
342
|
+
logger.error(
|
|
343
|
+
"Cache read failed \u2014 falling back to API call. Redis \u7B49\u306E cache adapter \u969C\u5BB3\u6642\u306F\u5168 verification \u304C introspect \u306B degrade \u3057\u307E\u3059\uFF08\u3053\u306E error \u306F instance \u3054\u3068\u306B\u521D\u56DE\u306E\u307F\u3001\u4EE5\u964D\u306F warn\uFF09:",
|
|
344
|
+
cacheError
|
|
345
|
+
);
|
|
346
|
+
} else {
|
|
347
|
+
logger.warn("Cache read failed, falling back to API call:", cacheError);
|
|
348
|
+
}
|
|
337
349
|
}
|
|
338
350
|
}
|
|
339
351
|
const fetchOptions = {
|
|
@@ -428,31 +440,40 @@ function createVerifyAccessToken(deps) {
|
|
|
428
440
|
}
|
|
429
441
|
} : base;
|
|
430
442
|
const userinfo = normalizeUserinfo(raw);
|
|
431
|
-
if (cache) {
|
|
443
|
+
if (cache && cacheKey !== null) {
|
|
432
444
|
try {
|
|
433
445
|
await cache.adapter.set(cacheKey, userinfo, cache.ttl);
|
|
434
446
|
} catch (cacheError) {
|
|
435
|
-
|
|
447
|
+
verificationCacheDegraded = true;
|
|
448
|
+
if (!cacheWriteFailureEscalated) {
|
|
449
|
+
cacheWriteFailureEscalated = true;
|
|
450
|
+
logger.error(
|
|
451
|
+
"Cache write failed \u2014 result still returned. cache adapter \u969C\u5BB3\u6642\u306F introspect \u7D50\u679C\u304C\u30AD\u30E3\u30C3\u30B7\u30E5\u3055\u308C\u305A\u5168 verification \u304C API \u547C\u3073\u51FA\u3057\u306B degrade \u3057\u307E\u3059\uFF08\u3053\u306E error \u306F instance \u3054\u3068\u306B\u521D\u56DE\u306E\u307F\u3001\u4EE5\u964D\u306F warn\uFF09:",
|
|
452
|
+
cacheError
|
|
453
|
+
);
|
|
454
|
+
} else {
|
|
455
|
+
logger.warn("Cache write failed (result still returned):", cacheError);
|
|
456
|
+
}
|
|
436
457
|
}
|
|
437
458
|
}
|
|
438
|
-
return { data: userinfo };
|
|
459
|
+
return verificationCacheDegraded ? { data: userinfo, meta: { verificationCacheDegraded: true } } : { data: userinfo };
|
|
439
460
|
}
|
|
440
461
|
async function buildCacheKey(token, suffix) {
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
462
|
+
if (typeof globalThis.crypto?.subtle?.digest !== "function") {
|
|
463
|
+
if (!missingSubtleCryptoLogged) {
|
|
464
|
+
missingSubtleCryptoLogged = true;
|
|
465
|
+
logger.error(
|
|
466
|
+
"crypto.subtle \u304C\u5229\u7528\u3067\u304D\u306A\u3044\u305F\u3081 introspect \u7D50\u679C\u306E\u30AD\u30E3\u30C3\u30B7\u30E5\u3092\u7121\u52B9\u5316\u3057\u307E\u3057\u305F\uFF08\u30CF\u30C3\u30B7\u30E5\u5316\u3055\u308C\u3066\u3044\u306A\u3044\u30C8\u30FC\u30AF\u30F3\u3092 cache key \u306B\u4F7F\u308F\u306A\u3044\u305F\u3081\u306E\u63AA\u7F6E #4119\uFF09\u3002\u5168 verification \u304C API \u547C\u3073\u51FA\u3057\u306B\u306A\u308A\u307E\u3059"
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
return null;
|
|
470
|
+
}
|
|
471
|
+
const encoder = new TextEncoder();
|
|
472
|
+
const data = encoder.encode(token);
|
|
473
|
+
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
|
|
474
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
475
|
+
const hashHex = hashArray.map((b) => b.toString(HEX_BASE).padStart(HEX_BYTE_WIDTH, "0")).join("");
|
|
476
|
+
const key = CACHE_KEY_PREFIX + hashHex;
|
|
456
477
|
return suffix ? `${key}:${suffix}` : key;
|
|
457
478
|
}
|
|
458
479
|
return verifyAccessToken;
|
|
@@ -870,6 +891,93 @@ function createMembersMethods(deps) {
|
|
|
870
891
|
return { listMembers, addMember, updateMemberRole, removeMember };
|
|
871
892
|
}
|
|
872
893
|
|
|
894
|
+
// src/client/provisioning-methods.ts
|
|
895
|
+
var USER_PROVISION_ENDPOINT = "/api/v1/ext/users/provision";
|
|
896
|
+
var ORGANIZATION_PROVISION_ENDPOINT = "/api/v1/ext/organizations/provision";
|
|
897
|
+
var MAX_PROVISION_MEMBERS = 100;
|
|
898
|
+
var ASSIGNABLE_MEMBER_ROLES = {
|
|
899
|
+
admin: true,
|
|
900
|
+
member: true,
|
|
901
|
+
viewer: true
|
|
902
|
+
};
|
|
903
|
+
function isAssignableMemberRole(role) {
|
|
904
|
+
return Object.hasOwn(ASSIGNABLE_MEMBER_ROLES, role);
|
|
905
|
+
}
|
|
906
|
+
function createProvisioningMethods(deps) {
|
|
907
|
+
const { fetchWithAuth, createError, authMode } = deps;
|
|
908
|
+
function serviceKeyModeError() {
|
|
909
|
+
if (authMode === "service-key") return null;
|
|
910
|
+
return createError(
|
|
911
|
+
"VALIDATION_ERROR",
|
|
912
|
+
"provisionUser / provisionOrganization \u306F service-key \u8A8D\u8A3C\uFF08X-Service-Api-Key\uFF09\u3067\u306E\u307F\u5229\u7528\u3067\u304D\u307E\u3059\u3002Bearer / cookie \u30E2\u30FC\u30C9\u3067\u306F\u547C\u3073\u51FA\u305B\u307E\u305B\u3093"
|
|
913
|
+
);
|
|
914
|
+
}
|
|
915
|
+
async function provisionUser(params) {
|
|
916
|
+
const modeError = serviceKeyModeError();
|
|
917
|
+
if (modeError) return { error: modeError };
|
|
918
|
+
if (!params.email || !params.email.trim()) {
|
|
919
|
+
return { error: createError("VALIDATION_ERROR", "email \u306F\u5FC5\u9808\u3067\u3059") };
|
|
920
|
+
}
|
|
921
|
+
const body = { email: params.email.trim() };
|
|
922
|
+
if (params.profile !== void 0) body.profile = params.profile;
|
|
923
|
+
if (params.dryRun !== void 0) body.dryRun = params.dryRun;
|
|
924
|
+
return fetchWithAuth(USER_PROVISION_ENDPOINT, {
|
|
925
|
+
method: "POST",
|
|
926
|
+
body: JSON.stringify(body)
|
|
927
|
+
});
|
|
928
|
+
}
|
|
929
|
+
async function provisionOrganization(params) {
|
|
930
|
+
const modeError = serviceKeyModeError();
|
|
931
|
+
if (modeError) return { error: modeError };
|
|
932
|
+
if (!params.name || !params.name.trim()) {
|
|
933
|
+
return { error: createError("VALIDATION_ERROR", "name \u306F\u5FC5\u9808\u3067\u3059") };
|
|
934
|
+
}
|
|
935
|
+
if (!params.ownerEmail || !params.ownerEmail.trim()) {
|
|
936
|
+
return { error: createError("VALIDATION_ERROR", "ownerEmail \u306F\u5FC5\u9808\u3067\u3059") };
|
|
937
|
+
}
|
|
938
|
+
if (params.members) {
|
|
939
|
+
if (params.members.length > MAX_PROVISION_MEMBERS) {
|
|
940
|
+
return {
|
|
941
|
+
error: createError(
|
|
942
|
+
"VALIDATION_ERROR",
|
|
943
|
+
`members \u306F1\u30EA\u30AF\u30A8\u30B9\u30C8\u3042\u305F\u308A\u6700\u5927 ${MAX_PROVISION_MEMBERS} \u4EF6\u307E\u3067\u3067\u3059`
|
|
944
|
+
)
|
|
945
|
+
};
|
|
946
|
+
}
|
|
947
|
+
for (const member of params.members) {
|
|
948
|
+
if (!member.email || !member.email.trim()) {
|
|
949
|
+
return { error: createError("VALIDATION_ERROR", "members[].email \u306F\u5FC5\u9808\u3067\u3059") };
|
|
950
|
+
}
|
|
951
|
+
if (!isAssignableMemberRole(member.role)) {
|
|
952
|
+
return {
|
|
953
|
+
error: createError(
|
|
954
|
+
"VALIDATION_ERROR",
|
|
955
|
+
"members[].role \u306F admin\u3001member\u3001viewer \u306E\u3044\u305A\u308C\u304B\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
|
|
956
|
+
)
|
|
957
|
+
};
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
const body = {
|
|
962
|
+
name: params.name.trim(),
|
|
963
|
+
ownerEmail: params.ownerEmail.trim()
|
|
964
|
+
};
|
|
965
|
+
if (params.billingEmail !== void 0) body.billingEmail = params.billingEmail.trim();
|
|
966
|
+
if (params.members !== void 0) {
|
|
967
|
+
body.members = params.members.map((member) => ({
|
|
968
|
+
email: member.email.trim(),
|
|
969
|
+
role: member.role
|
|
970
|
+
}));
|
|
971
|
+
}
|
|
972
|
+
if (params.dryRun !== void 0) body.dryRun = params.dryRun;
|
|
973
|
+
return fetchWithAuth(ORGANIZATION_PROVISION_ENDPOINT, {
|
|
974
|
+
method: "POST",
|
|
975
|
+
body: JSON.stringify(body)
|
|
976
|
+
});
|
|
977
|
+
}
|
|
978
|
+
return { provisionUser, provisionOrganization };
|
|
979
|
+
}
|
|
980
|
+
|
|
873
981
|
// src/client/seat-methods.ts
|
|
874
982
|
function seatsEndpoint(subscriptionId) {
|
|
875
983
|
return `/api/v1/subscriptions/ext/${encodeURIComponent(subscriptionId)}/seats/assignments`;
|
|
@@ -1114,7 +1222,7 @@ function createNonContractMethods(deps) {
|
|
|
1114
1222
|
}
|
|
1115
1223
|
|
|
1116
1224
|
// src/client/version-check.ts
|
|
1117
|
-
var SDK_VERSION = "5.
|
|
1225
|
+
var SDK_VERSION = "5.21.0";
|
|
1118
1226
|
var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
|
|
1119
1227
|
var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
|
|
1120
1228
|
function sdkHeaders() {
|
|
@@ -1356,33 +1464,48 @@ function createOAuthTokenMethods(deps) {
|
|
|
1356
1464
|
async function signOutToken() {
|
|
1357
1465
|
const tokens = tokenStore.getTokens();
|
|
1358
1466
|
tokenStore.clearTokens();
|
|
1467
|
+
const allRevoked = {
|
|
1468
|
+
revoked: true,
|
|
1469
|
+
accessTokenRevoked: true,
|
|
1470
|
+
refreshTokenRevoked: true
|
|
1471
|
+
};
|
|
1359
1472
|
if (!tokens) {
|
|
1360
1473
|
logger.debug("No tokens to revoke");
|
|
1361
|
-
return { data:
|
|
1474
|
+
return { data: allRevoked };
|
|
1362
1475
|
}
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
);
|
|
1476
|
+
async function revokeOAuthToken(token, tokenTypeHint) {
|
|
1477
|
+
const url = `${baseUrl}${OAUTH_REVOKE_ENDPOINT}`;
|
|
1478
|
+
try {
|
|
1479
|
+
const response = await fetch(url, {
|
|
1480
|
+
method: "POST",
|
|
1481
|
+
credentials: "omit",
|
|
1482
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded", ...sdkHeaders() },
|
|
1483
|
+
body: new URLSearchParams({
|
|
1484
|
+
token,
|
|
1485
|
+
client_id: clientId,
|
|
1486
|
+
token_type_hint: tokenTypeHint
|
|
1487
|
+
}).toString()
|
|
1488
|
+
});
|
|
1489
|
+
return response.ok;
|
|
1490
|
+
} catch {
|
|
1491
|
+
return false;
|
|
1380
1492
|
}
|
|
1381
|
-
}
|
|
1382
|
-
|
|
1493
|
+
}
|
|
1494
|
+
logger.debug("Revoking tokens:", `${baseUrl}${OAUTH_REVOKE_ENDPOINT}`);
|
|
1495
|
+
const accessTokenRevoked = await revokeOAuthToken(tokens.accessToken, "access_token");
|
|
1496
|
+
if (!accessTokenRevoked) {
|
|
1497
|
+
logger.warn("\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306E\u7121\u52B9\u5316\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30B5\u30FC\u30D0\u30FC\u3067\u5931\u6557\u3057\u307E\u3057\u305F");
|
|
1498
|
+
}
|
|
1499
|
+
const refreshTokenRevoked = tokens.refreshToken ? await revokeOAuthToken(tokens.refreshToken, "refresh_token") : true;
|
|
1500
|
+
if (tokens.refreshToken && !refreshTokenRevoked) {
|
|
1501
|
+
logger.warn("\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306E\u7121\u52B9\u5316\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30B5\u30FC\u30D0\u30FC\u3067\u5931\u6557\u3057\u307E\u3057\u305F");
|
|
1502
|
+
}
|
|
1503
|
+
const revoked = accessTokenRevoked && refreshTokenRevoked;
|
|
1504
|
+
if (!revoked) {
|
|
1505
|
+
logger.warn("\u30C8\u30FC\u30AF\u30F3\u7121\u52B9\u5316\u304C\u4E00\u90E8\u307E\u305F\u306F\u5168\u90E8\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30ED\u30FC\u30AB\u30EB\u30C8\u30FC\u30AF\u30F3\u306F\u30AF\u30EA\u30A2\u6E08\u307F\uFF09");
|
|
1383
1506
|
}
|
|
1384
1507
|
logger.debug("Token sign-out completed");
|
|
1385
|
-
return { data:
|
|
1508
|
+
return { data: { revoked, accessTokenRevoked, refreshTokenRevoked } };
|
|
1386
1509
|
}
|
|
1387
1510
|
return { exchangeCodeForTokens, refreshAccessToken, signOutToken };
|
|
1388
1511
|
}
|
|
@@ -1546,7 +1669,7 @@ function createSessionMethods(deps) {
|
|
|
1546
1669
|
}
|
|
1547
1670
|
if (response.status === NO_CONTENT_STATUS) {
|
|
1548
1671
|
logger.debug("Response: 204 No Content");
|
|
1549
|
-
return { data:
|
|
1672
|
+
return { data: { revoked: true } };
|
|
1550
1673
|
}
|
|
1551
1674
|
if (!response.ok) {
|
|
1552
1675
|
try {
|
|
@@ -1573,7 +1696,7 @@ function createSessionMethods(deps) {
|
|
|
1573
1696
|
}
|
|
1574
1697
|
}
|
|
1575
1698
|
logger.debug("Response:", response.status);
|
|
1576
|
-
return { data:
|
|
1699
|
+
return { data: { revoked: true } };
|
|
1577
1700
|
}
|
|
1578
1701
|
return { getSession, signOutCookie };
|
|
1579
1702
|
}
|
|
@@ -1696,6 +1819,9 @@ var REDIRECT_LOOP_WINDOW_MS = 6e4;
|
|
|
1696
1819
|
var REDIRECT_LOOP_THRESHOLD = 3;
|
|
1697
1820
|
var storageReadFailureLogged = false;
|
|
1698
1821
|
var storageWriteFailureLogged = false;
|
|
1822
|
+
function isLoopDetectionDegraded() {
|
|
1823
|
+
return storageReadFailureLogged || storageWriteFailureLogged;
|
|
1824
|
+
}
|
|
1699
1825
|
function logStorageReadFailure(logger, err) {
|
|
1700
1826
|
if (storageReadFailureLogged) return;
|
|
1701
1827
|
storageReadFailureLogged = true;
|
|
@@ -1840,9 +1966,16 @@ function createRedirectMethods(deps) {
|
|
|
1840
1966
|
}
|
|
1841
1967
|
const state = generateRandomState();
|
|
1842
1968
|
if (!storeState(state, logger)) {
|
|
1969
|
+
cleanupVerifierStorage(logger);
|
|
1970
|
+
cleanupStateStorage(logger);
|
|
1843
1971
|
logger.error(
|
|
1844
|
-
"redirectToAuthorize: OAuth state \u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08storage \u5229\u7528\u4E0D\u53EF\uFF09\u3002\
|
|
1972
|
+
"redirectToAuthorize: OAuth state \u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08storage \u5229\u7528\u4E0D\u53EF\uFF09\u3002\u8A8D\u53EF\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3092\u4E2D\u6B62\u3057\u307E\u3057\u305F"
|
|
1845
1973
|
);
|
|
1974
|
+
return {
|
|
1975
|
+
success: false,
|
|
1976
|
+
code: "state_persistence_failed",
|
|
1977
|
+
error: "OAuth state \u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08storage \u5229\u7528\u4E0D\u53EF\uFF09\u3002\u8A8D\u53EF\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3092\u4E2D\u6B62\u3057\u307E\u3057\u305F"
|
|
1978
|
+
};
|
|
1846
1979
|
}
|
|
1847
1980
|
const redirectUri = resolvedRedirectUri ?? window.location.origin + window.location.pathname;
|
|
1848
1981
|
const params = new URLSearchParams({
|
|
@@ -1877,7 +2010,7 @@ function createRedirectMethods(deps) {
|
|
|
1877
2010
|
rollbackLastRedirectAttempt(authorizeKey, logger);
|
|
1878
2011
|
throw err;
|
|
1879
2012
|
}
|
|
1880
|
-
return { success: true };
|
|
2013
|
+
return isLoopDetectionDegraded() ? { success: true, loopDetectionDisabled: true } : { success: true };
|
|
1881
2014
|
}
|
|
1882
2015
|
async function redirectToLogin(options) {
|
|
1883
2016
|
if (typeof window === "undefined") {
|
|
@@ -2955,6 +3088,11 @@ function createFFIDClient(config) {
|
|
|
2955
3088
|
createError,
|
|
2956
3089
|
serviceCode: config.serviceCode
|
|
2957
3090
|
});
|
|
3091
|
+
const { provisionUser, provisionOrganization } = createProvisioningMethods({
|
|
3092
|
+
fetchWithAuth,
|
|
3093
|
+
createError,
|
|
3094
|
+
authMode
|
|
3095
|
+
});
|
|
2958
3096
|
const { getProfile, updateProfile } = createProfileMethods({
|
|
2959
3097
|
fetchWithAuth,
|
|
2960
3098
|
createError
|
|
@@ -3050,6 +3188,8 @@ function createFFIDClient(config) {
|
|
|
3050
3188
|
addMember,
|
|
3051
3189
|
updateMemberRole,
|
|
3052
3190
|
removeMember,
|
|
3191
|
+
provisionUser,
|
|
3192
|
+
provisionOrganization,
|
|
3053
3193
|
getProfile,
|
|
3054
3194
|
updateProfile,
|
|
3055
3195
|
// Non-contract ext API coverage (#3783)
|
package/dist/server/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo } from '../ffid-client-
|
|
2
|
-
export { f as FFIDAddMemberParams, g as FFIDAddMemberRequest, h as FFIDAddMemberResponse, i as FFIDAssignableMemberRole, j as FFIDCacheConfig, k as FFIDClient, l as FFIDConfig, m as FFIDListMembersResponse, n as FFIDMemberRole, o as FFIDOrganization, p as FFIDOrganizationMember, q as FFIDOtpSendResponse, r as FFIDOtpVerifyResponse, s as FFIDPasswordResetConfirmResponse, t as FFIDPasswordResetResponse, u as FFIDPasswordResetVerifyResponse, v as FFIDProfileCallOptions, w as
|
|
1
|
+
import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo } from '../ffid-client-BQPhm-XL.cjs';
|
|
2
|
+
export { f as FFIDAddMemberParams, g as FFIDAddMemberRequest, h as FFIDAddMemberResponse, i as FFIDAssignableMemberRole, j as FFIDCacheConfig, k as FFIDClient, l as FFIDConfig, m as FFIDListMembersResponse, n as FFIDMemberRole, o as FFIDOrganization, p as FFIDOrganizationMember, q as FFIDOtpSendResponse, r as FFIDOtpVerifyResponse, s as FFIDPasswordResetConfirmResponse, t as FFIDPasswordResetResponse, u as FFIDPasswordResetVerifyResponse, v as FFIDProfileCallOptions, w as FFIDProvisionMemberPlan, x as FFIDProvisionMemberPlanStatus, y as FFIDProvisionMemberResult, z as FFIDProvisionMemberStatus, A as FFIDProvisionOrganizationDryRun, B as FFIDProvisionOrganizationMemberInput, C as FFIDProvisionOrganizationOutcome, D as FFIDProvisionOrganizationParams, E as FFIDProvisionOrganizationResponse, G as FFIDProvisionUserDryRun, H as FFIDProvisionUserOutcome, I as FFIDProvisionUserParams, J as FFIDProvisionUserProfileInput, K as FFIDProvisionUserResponse, L as FFIDProvisionedOrganization, M as FFIDProvisionedUser, N as FFIDRemoveMemberResponse, O as FFIDResetSessionResponse, P as FFIDSubscription, Q as FFIDUpdateMemberRoleResponse, R as FFIDUpdateUserProfileRequest, S as FFIDUser, T as FFIDUserProfile, U as TokenData, V as TokenStore, W as createFFIDClient, X as createTokenStore } from '../ffid-client-BQPhm-XL.cjs';
|
|
3
3
|
export { D as DEFAULT_API_BASE_URL, a as DEFAULT_OAUTH_SCOPES } from '../constants-D61jqRIO.cjs';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import '../types-BeVl-z12.cjs';
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo } from '../ffid-client-
|
|
2
|
-
export { f as FFIDAddMemberParams, g as FFIDAddMemberRequest, h as FFIDAddMemberResponse, i as FFIDAssignableMemberRole, j as FFIDCacheConfig, k as FFIDClient, l as FFIDConfig, m as FFIDListMembersResponse, n as FFIDMemberRole, o as FFIDOrganization, p as FFIDOrganizationMember, q as FFIDOtpSendResponse, r as FFIDOtpVerifyResponse, s as FFIDPasswordResetConfirmResponse, t as FFIDPasswordResetResponse, u as FFIDPasswordResetVerifyResponse, v as FFIDProfileCallOptions, w as
|
|
1
|
+
import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo } from '../ffid-client-Bx8y4SwC.js';
|
|
2
|
+
export { f as FFIDAddMemberParams, g as FFIDAddMemberRequest, h as FFIDAddMemberResponse, i as FFIDAssignableMemberRole, j as FFIDCacheConfig, k as FFIDClient, l as FFIDConfig, m as FFIDListMembersResponse, n as FFIDMemberRole, o as FFIDOrganization, p as FFIDOrganizationMember, q as FFIDOtpSendResponse, r as FFIDOtpVerifyResponse, s as FFIDPasswordResetConfirmResponse, t as FFIDPasswordResetResponse, u as FFIDPasswordResetVerifyResponse, v as FFIDProfileCallOptions, w as FFIDProvisionMemberPlan, x as FFIDProvisionMemberPlanStatus, y as FFIDProvisionMemberResult, z as FFIDProvisionMemberStatus, A as FFIDProvisionOrganizationDryRun, B as FFIDProvisionOrganizationMemberInput, C as FFIDProvisionOrganizationOutcome, D as FFIDProvisionOrganizationParams, E as FFIDProvisionOrganizationResponse, G as FFIDProvisionUserDryRun, H as FFIDProvisionUserOutcome, I as FFIDProvisionUserParams, J as FFIDProvisionUserProfileInput, K as FFIDProvisionUserResponse, L as FFIDProvisionedOrganization, M as FFIDProvisionedUser, N as FFIDRemoveMemberResponse, O as FFIDResetSessionResponse, P as FFIDSubscription, Q as FFIDUpdateMemberRoleResponse, R as FFIDUpdateUserProfileRequest, S as FFIDUser, T as FFIDUserProfile, U as TokenData, V as TokenStore, W as createFFIDClient, X as createTokenStore } from '../ffid-client-Bx8y4SwC.js';
|
|
3
3
|
export { D as DEFAULT_API_BASE_URL, a as DEFAULT_OAUTH_SCOPES } from '../constants-D61jqRIO.js';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import '../types-BeVl-z12.js';
|