Skip to content

Commit 50e2902

Browse files
feat: add support for functions-related permissions in key/token generation (#1574)
1 parent a3a702d commit 50e2902

File tree

14 files changed

+1979
-662
lines changed

14 files changed

+1979
-662
lines changed

packages/client-sdk-nodejs/src/index.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,9 @@ import {
136136
CacheRole,
137137
CachePermission,
138138
TopicRole,
139+
FunctionRole,
139140
TopicPermission,
141+
FunctionPermission,
140142
Permission,
141143
Permissions,
142144
AllDataReadWrite,
@@ -150,10 +152,14 @@ import {
150152
DisposableTokenScopes,
151153
CacheName,
152154
TopicName,
155+
FunctionName,
156+
FunctionNamePrefix,
153157
CacheSelector,
154158
TopicSelector,
159+
FunctionSelector,
155160
AllCaches,
156161
AllTopics,
162+
AllFunctions,
157163
LeaderboardOrder,
158164
ILeaderboard,
159165
PostUrlWebhookDestination,
@@ -290,6 +296,8 @@ export {
290296
CachePermission,
291297
TopicRole,
292298
TopicPermission,
299+
FunctionRole,
300+
FunctionPermission,
293301
Permission,
294302
Permissions,
295303
AllDataReadWrite,
@@ -307,12 +315,16 @@ export {
307315
DisposableTokenScopes,
308316
CacheName,
309317
TopicName,
318+
FunctionName,
319+
FunctionNamePrefix,
310320
CacheSelector,
311321
TopicSelector,
322+
FunctionSelector,
312323
AllCaches,
313324
AllTopics,
314325
SortedSetAggregate,
315326
SortedSetSource,
327+
AllFunctions,
316328
// CacheClient response types
317329
CacheGet,
318330
CacheListConcatenateBack,

packages/client-sdk-nodejs/src/internal/internal-auth-client.ts

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,17 @@ import {
4141
asCachePermission,
4242
asPermissionsObject,
4343
asTopicPermission,
44+
asFunctionPermission,
4445
isCachePermission,
46+
isFunctionPermission,
4547
isPermissionsObject,
4648
isTopicPermission,
4749
PredefinedScope,
50+
FunctionPermission,
51+
AllFunctions,
52+
isFunctionNamePrefix,
53+
isFunction,
54+
FunctionRole,
4855
} from '@gomomento/sdk-core/dist/src/auth/tokens/permission-scope';
4956
import {permission_messages} from '@gomomento/generated-types/dist/permissionmessages';
5057
import {convert} from './utils';
@@ -356,6 +363,11 @@ function tokenPermissionToGrpcPermission(
356363
asCachePermission(permission)
357364
);
358365
return result;
366+
} else if (isFunctionPermission(permission)) {
367+
result.function_permissions = functionPermissionToGrpcPermission(
368+
asFunctionPermission(permission)
369+
);
370+
return result;
359371
}
360372
throw new Error(
361373
`Unrecognized token permission: ${JSON.stringify(permission)}`
@@ -477,6 +489,80 @@ function assignCacheSelector(
477489
return grpcPermission;
478490
}
479491

492+
function assignFunctionRole(
493+
permission: FunctionPermission,
494+
grpcPermission: permission_messages.PermissionsType.FunctionPermissions
495+
): permission_messages.PermissionsType.FunctionPermissions {
496+
switch (permission.role) {
497+
case FunctionRole.FunctionInvoke: {
498+
grpcPermission.role = permission_messages.FunctionRole.FunctionInvoke;
499+
break;
500+
}
501+
case FunctionRole.FunctionPermitNone: {
502+
grpcPermission.role = permission_messages.FunctionRole.FunctionPermitNone;
503+
break;
504+
}
505+
default: {
506+
throw new Error(
507+
`Unrecognized function role: ${JSON.stringify(permission)}`
508+
);
509+
}
510+
}
511+
return grpcPermission;
512+
}
513+
514+
function assignFunctionSelector(
515+
permission: FunctionPermission,
516+
grpcPermission: permission_messages.PermissionsType.FunctionPermissions
517+
): permission_messages.PermissionsType.FunctionPermissions {
518+
if (permission.cache === AllCaches) {
519+
grpcPermission.all_caches = new permission_messages.PermissionsType.All();
520+
} else if (typeof permission.cache === 'string') {
521+
grpcPermission.cache_selector =
522+
new permission_messages.PermissionsType.CacheSelector({
523+
cache_name: permission.cache,
524+
});
525+
} else if (isCacheName(permission.cache)) {
526+
grpcPermission.cache_selector =
527+
new permission_messages.PermissionsType.CacheSelector({
528+
cache_name: permission.cache.name,
529+
});
530+
} else {
531+
throw new Error(
532+
`Unrecognized cache specification in function permission: ${JSON.stringify(
533+
permission
534+
)}`
535+
);
536+
}
537+
538+
if (permission.func === AllFunctions) {
539+
grpcPermission.all_functions =
540+
new permission_messages.PermissionsType.All();
541+
} else if (isFunctionNamePrefix(permission.func)) {
542+
grpcPermission.function_selector =
543+
new permission_messages.PermissionsType.FunctionSelector({
544+
function_name_prefix: permission.func.namePrefix,
545+
});
546+
} else if (typeof permission.func === 'string') {
547+
grpcPermission.function_selector =
548+
new permission_messages.PermissionsType.FunctionSelector({
549+
function_name: permission.func,
550+
});
551+
} else if (isFunction(permission.func)) {
552+
grpcPermission.function_selector =
553+
new permission_messages.PermissionsType.FunctionSelector({
554+
function_name: permission.func.name,
555+
});
556+
} else {
557+
throw new Error(
558+
`Unrecognized function specification in function permission: ${JSON.stringify(
559+
permission
560+
)}`
561+
);
562+
}
563+
return grpcPermission;
564+
}
565+
480566
function assignCacheItemSelector(
481567
permission: DisposableTokenCachePermission,
482568
grpcPermission: permission_messages.PermissionsType.CachePermissions
@@ -520,15 +606,30 @@ function cachePermissionToGrpcPermission(
520606
return grpcPermission;
521607
}
522608

609+
function functionPermissionToGrpcPermission(
610+
permission: FunctionPermission
611+
): permission_messages.PermissionsType.FunctionPermissions {
612+
let grpcPermission =
613+
new permission_messages.PermissionsType.FunctionPermissions();
614+
grpcPermission = assignFunctionRole(permission, grpcPermission);
615+
grpcPermission = assignFunctionSelector(permission, grpcPermission);
616+
return grpcPermission;
617+
}
618+
523619
function disposableTokenPermissionToGrpcPermission(
524-
permission: DisposableTokenCachePermission
620+
permission: DisposableTokenCachePermission | FunctionPermission
525621
): permission_messages.PermissionsType {
526622
const result = new permission_messages.PermissionsType();
527623
if (isDisposableTokenCachePermission(permission)) {
528624
result.cache_permissions = disposableCachePermissionToGrpcPermission(
529625
asDisposableTokenCachePermission(permission)
530626
);
531627
return result;
628+
} else if (isFunctionPermission(permission)) {
629+
result.function_permissions = functionPermissionToGrpcPermission(
630+
asFunctionPermission(permission)
631+
);
632+
return result;
532633
}
533634
throw new Error(
534635
`Unrecognized token permission: ${JSON.stringify(permission)}`

0 commit comments

Comments
 (0)