@casual-simulation/aux-common
Version:
Common library for AUX projects
334 lines • 11.4 kB
JavaScript
/* CasualOS is a set of web-based tools designed to facilitate the creation of real-time, multi-user, context-aware interactive experiences.
*
* Copyright (c) 2019-2025 Casual Simulation, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { z } from 'zod';
export const DATA_RESOURCE_KIND = 'data';
export const FILE_RESOURCE_KIND = 'file';
export const EVENT_RESOURCE_KIND = 'event';
export const MARKER_RESOURCE_KIND = 'marker';
export const ROLE_RESOURCE_KIND = 'role';
export const INST_RESOURCE_KIND = 'inst';
export const LOOM_RESOURCE_KIND = 'loom';
export const SLOYD_RESOURCE_KIND = 'ai.sloyd';
export const HUME_RESOURCE_KIND = 'ai.hume';
export const OPENAI_REALTIME_RESOURCE_KIND = 'ai.openai.realtime';
export const WEBHOOK_RESOURCE_KIND = 'webhook';
export const NOTIFICATION_RESOURCE_KIND = 'notification';
export const PACKAGE_RESOURCE_KIND = 'package';
export const PACKAGE_VERSION_RESOURCE_KIND = 'package.version';
export const SEARCH_RESOURCE_KIND = 'search';
export const READ_ACTION = 'read';
export const CREATE_ACTION = 'create';
export const UPDATE_ACTION = 'update';
export const DELETE_ACTION = 'delete';
export const ASSIGN_ACTION = 'assign';
export const UNASSIGN_ACTION = 'unassign';
export const INCREMENT_ACTION = 'increment';
export const COUNT_ACTION = 'count';
export const LIST_ACTION = 'list';
export const GRANT_PERMISSION_ACTION = 'grantPermission';
export const REVOKE_PERMISSION_ACTION = 'revokePermission';
export const GRANT_ACTION = 'grant';
export const REVOKE_ACTION = 'revoke';
export const SEND_ACTION_ACTION = 'sendAction';
export const UPDATE_DATA_ACTION = 'updateData';
export const RUN_ACTION = 'run';
export const SEND_ACTION = 'send';
export const SUBSCRIBE_ACTION = 'subscribe';
export const UNSUBSCRIBE_ACTION = 'unsubscribe';
export const LIST_SUBSCRIPTIONS_ACTION = 'listSubscriptions';
export const SUBJECT_TYPE_VALIDATION = z.enum(['user', 'inst', 'role']);
export const DATA_ACTION_KINDS_VALIDATION = z.enum([
READ_ACTION,
CREATE_ACTION,
UPDATE_ACTION,
DELETE_ACTION,
LIST_ACTION,
]);
export const FILE_ACTION_KINDS_VALIDATION = z.enum([
READ_ACTION,
CREATE_ACTION,
UPDATE_ACTION,
DELETE_ACTION,
LIST_ACTION,
]);
export const EVENT_ACTION_KINDS_VALIDATION = z.enum([
INCREMENT_ACTION,
COUNT_ACTION,
UPDATE_ACTION,
LIST_ACTION,
]);
export const MARKER_ACTION_KINDS_VALIDATION = z.enum([
ASSIGN_ACTION,
UNASSIGN_ACTION,
GRANT_PERMISSION_ACTION,
REVOKE_PERMISSION_ACTION,
READ_ACTION,
]);
export const ROLE_ACTION_KINDS_VALIDATION = z.enum([
GRANT_ACTION,
REVOKE_ACTION,
READ_ACTION,
UPDATE_ACTION,
LIST_ACTION,
]);
export const INST_ACTION_KINDS_VALIDATION = z.enum([
CREATE_ACTION,
READ_ACTION,
UPDATE_ACTION,
UPDATE_DATA_ACTION,
DELETE_ACTION,
LIST_ACTION,
SEND_ACTION_ACTION,
]);
export const LOOM_ACTION_KINDS_VALIDATION = z.enum([CREATE_ACTION]);
export const SLOYD_ACTION_KINDS_VALIDATION = z.enum([CREATE_ACTION]);
export const HUME_ACTION_KINDS_VALIDATION = z.enum([CREATE_ACTION]);
export const OPENAI_REALTIME_ACTION_KINDS_VALIDATION = z.enum([CREATE_ACTION]);
export const WEBHOOK_ACTION_KINDS_VALIDATION = z.enum([
CREATE_ACTION,
READ_ACTION,
UPDATE_ACTION,
DELETE_ACTION,
LIST_ACTION,
RUN_ACTION,
]);
export const NOTIFICATION_ACTION_KINDS_VALIDATION = z.enum([
CREATE_ACTION,
READ_ACTION,
UPDATE_ACTION,
DELETE_ACTION,
LIST_ACTION,
SEND_ACTION,
SUBSCRIBE_ACTION,
UNSUBSCRIBE_ACTION,
LIST_SUBSCRIPTIONS_ACTION,
]);
export const PACKAGE_ACTION_KINDS_VALIDATION = z.enum([
CREATE_ACTION,
READ_ACTION,
UPDATE_ACTION,
DELETE_ACTION,
LIST_ACTION,
RUN_ACTION,
]);
export const PACKAGE_VERSION_ACTION_KINDS_VALIDATION = z.enum([
CREATE_ACTION,
READ_ACTION,
UPDATE_ACTION,
DELETE_ACTION,
LIST_ACTION,
RUN_ACTION,
]);
export const SEARCH_ACTION_KINDS_VALIDATION = z.enum([
CREATE_ACTION,
READ_ACTION,
UPDATE_ACTION,
DELETE_ACTION,
LIST_ACTION,
]);
export const RESOURCE_KIND_VALIDATION = z.enum([
DATA_RESOURCE_KIND,
FILE_RESOURCE_KIND,
EVENT_RESOURCE_KIND,
MARKER_RESOURCE_KIND,
ROLE_RESOURCE_KIND,
INST_RESOURCE_KIND,
LOOM_RESOURCE_KIND,
SLOYD_RESOURCE_KIND,
HUME_RESOURCE_KIND,
OPENAI_REALTIME_RESOURCE_KIND,
WEBHOOK_RESOURCE_KIND,
NOTIFICATION_RESOURCE_KIND,
PACKAGE_RESOURCE_KIND,
PACKAGE_VERSION_RESOURCE_KIND,
SEARCH_RESOURCE_KIND,
]);
export const ACTION_KINDS_VALIDATION = z.enum([
CREATE_ACTION,
READ_ACTION,
UPDATE_ACTION,
UPDATE_DATA_ACTION,
DELETE_ACTION,
LIST_ACTION,
SEND_ACTION_ACTION,
ASSIGN_ACTION,
UNASSIGN_ACTION,
GRANT_ACTION,
REVOKE_ACTION,
INCREMENT_ACTION,
COUNT_ACTION,
GRANT_PERMISSION_ACTION,
REVOKE_PERMISSION_ACTION,
RUN_ACTION,
SEND_ACTION,
SUBSCRIBE_ACTION,
UNSUBSCRIBE_ACTION,
LIST_SUBSCRIPTIONS_ACTION,
]);
export const ENTITLEMENT_FEATURE_VALIDATION = z.enum([
'data',
'file',
'event',
'inst',
'notification',
'package',
'permissions',
'webhook',
'ai',
'search',
]);
export const ENTITLEMENT_VALIDATION = z.object({
feature: ENTITLEMENT_FEATURE_VALIDATION,
scope: z.enum(['personal', 'owned', 'studio', 'shared', 'designated']),
designatedRecords: z.array(z.string()).optional(),
});
export const PERMISSION_VALIDATION = z.object({
subjectType: SUBJECT_TYPE_VALIDATION,
subjectId: z.string().min(1),
resourceId: z.string().min(1).nullable().optional(),
expireTimeMs: z.number().nullable(),
marker: z.string().min(1).max(100).optional(),
});
export const DATA_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(DATA_RESOURCE_KIND),
action: DATA_ACTION_KINDS_VALIDATION.nullable(),
});
export const FILE_PERMISSION_OPTIONS_VALIDATION = z.object({
maxFileSizeInBytes: z.number().nonnegative().optional(),
allowedMimeTypes: z
.union([z.literal(true), z.array(z.string())])
.optional(),
});
export const FILE_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(FILE_RESOURCE_KIND),
action: FILE_ACTION_KINDS_VALIDATION.nullable(),
options: FILE_PERMISSION_OPTIONS_VALIDATION,
});
export const EVENT_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(EVENT_RESOURCE_KIND),
resourceId: z.string().min(1).nullable(),
action: EVENT_ACTION_KINDS_VALIDATION.nullable(),
});
export const MARKER_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(MARKER_RESOURCE_KIND),
action: MARKER_ACTION_KINDS_VALIDATION.nullable(),
});
export const ROLE_PERMISSION_OPTIONS_VALIDATION = z.object({
maxDurationMs: z.number().optional(),
});
export const ROLE_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(ROLE_RESOURCE_KIND),
action: ROLE_ACTION_KINDS_VALIDATION.nullable(),
options: ROLE_PERMISSION_OPTIONS_VALIDATION,
});
export const INST_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(INST_RESOURCE_KIND),
action: INST_ACTION_KINDS_VALIDATION.nullable(),
});
export const LOOM_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(LOOM_RESOURCE_KIND),
action: LOOM_ACTION_KINDS_VALIDATION.nullable(),
});
export const SLOYD_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(SLOYD_RESOURCE_KIND),
action: SLOYD_ACTION_KINDS_VALIDATION.nullable(),
});
export const HUME_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(HUME_RESOURCE_KIND),
action: HUME_ACTION_KINDS_VALIDATION.nullable(),
});
export const OPENAI_REALTIME_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(OPENAI_REALTIME_RESOURCE_KIND),
action: OPENAI_REALTIME_ACTION_KINDS_VALIDATION.nullable(),
});
export const WEBHOOK_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(WEBHOOK_RESOURCE_KIND),
action: WEBHOOK_ACTION_KINDS_VALIDATION.nullable(),
});
export const NOTIFICATION_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(NOTIFICATION_RESOURCE_KIND),
action: NOTIFICATION_ACTION_KINDS_VALIDATION.nullable(),
});
export const PACKAGE_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(PACKAGE_RESOURCE_KIND),
action: PACKAGE_ACTION_KINDS_VALIDATION.nullable(),
});
export const PACKAGE_VERSION_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(PACKAGE_VERSION_RESOURCE_KIND),
action: PACKAGE_VERSION_ACTION_KINDS_VALIDATION.nullable(),
});
export const SEARCH_PERMISSION_VALIDATION = PERMISSION_VALIDATION.extend({
resourceKind: z.literal(SEARCH_RESOURCE_KIND),
action: SEARCH_ACTION_KINDS_VALIDATION.nullable(),
});
export const AVAILABLE_PERMISSIONS_VALIDATION = z.discriminatedUnion('resourceKind', [
DATA_PERMISSION_VALIDATION,
FILE_PERMISSION_VALIDATION,
EVENT_PERMISSION_VALIDATION,
MARKER_PERMISSION_VALIDATION,
ROLE_PERMISSION_VALIDATION,
INST_PERMISSION_VALIDATION,
LOOM_PERMISSION_VALIDATION,
SLOYD_PERMISSION_VALIDATION,
HUME_PERMISSION_VALIDATION,
OPENAI_REALTIME_PERMISSION_VALIDATION,
WEBHOOK_PERMISSION_VALIDATION,
NOTIFICATION_PERMISSION_VALIDATION,
PACKAGE_PERMISSION_VALIDATION,
PACKAGE_VERSION_PERMISSION_VALIDATION,
SEARCH_PERMISSION_VALIDATION,
]);
// /**
// * Defines an interface that represents a policy document.
// * That is, a list of permissions that are granted to specific roles.
// */
// export interface PolicyDocument {
// /**
// * The list of permissions that are allowed by this policy document.
// */
// permissions: AvailablePermissions[];
// }
/**
* The name of the admin role.
*/
export const ADMIN_ROLE_NAME = 'admin';
/**
* The name of the recordOwner role.
*/
export const RECORD_OWNER_ROLE_NAME = 'recordOwner';
/**
* The name of the "publicRead" resource marker.
* Used by default for data, file, and event records.
*/
export const PUBLIC_READ_MARKER = 'publicRead';
/**
* The name of the "publicWrite" resource marker.
* Used by default for public insts.
*/
export const PUBLIC_WRITE_MARKER = 'publicWrite';
/**
* The name of the "private" resource marker.
* Used by default for private insts.
*/
export const PRIVATE_MARKER = 'private';
/**
* The name of the "account" resource marker.
* Used by default for policy and role records.
*/
export const ACCOUNT_MARKER = 'account';
//# sourceMappingURL=PolicyPermissions.js.map