@liveblocks/core 3.20.0-perm3 → 3.20.0-perm4

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/index.cjs CHANGED
@@ -6,7 +6,7 @@ var __export = (target, all) => {
6
6
 
7
7
  // src/version.ts
8
8
  var PKG_NAME = "@liveblocks/core";
9
- var PKG_VERSION = "3.20.0-perm3";
9
+ var PKG_VERSION = "3.20.0-perm4";
10
10
  var PKG_FORMAT = "cjs";
11
11
 
12
12
  // src/dupe-detection.ts
@@ -5215,8 +5215,8 @@ var ACCESS_RANKS = {
5215
5215
  read: 1,
5216
5216
  write: 2
5217
5217
  };
5218
- var NO_PERMISSION_CAPABILITIES = {
5219
- creation: "none",
5218
+ var NO_PERMISSION_MATRIX = {
5219
+ room: "none",
5220
5220
  presence: "none",
5221
5221
  storage: "none",
5222
5222
  comments: "none",
@@ -5224,7 +5224,7 @@ var NO_PERMISSION_CAPABILITIES = {
5224
5224
  personal: "write"
5225
5225
  };
5226
5226
  var RESOURCE_PERMISSIONS = {
5227
- creation: {
5227
+ room: {
5228
5228
  read: [Permission.RoomRead],
5229
5229
  write: [Permission.RoomWrite]
5230
5230
  },
@@ -5252,7 +5252,7 @@ var RESOURCE_PERMISSIONS = {
5252
5252
  none: [Permission.RoomFeedsNone]
5253
5253
  }
5254
5254
  };
5255
- var DEFAULT_PERMISSION_RESOURCE = "creation";
5255
+ var DEFAULT_PERMISSION_RESOURCE = "room";
5256
5256
  var ROOM_PERMISSION_RESOURCES = [
5257
5257
  "presence",
5258
5258
  "storage",
@@ -5270,43 +5270,41 @@ function resolveResourceAccess(scopes, resource) {
5270
5270
  }
5271
5271
  return resourceAccess;
5272
5272
  }
5273
- function resolveFullPermissionCapabilities(resolved) {
5273
+ function resolveFullPermissionMatrix(resolved) {
5274
5274
  if (!resolved.hasDefaultPermission) {
5275
- return { ...NO_PERMISSION_CAPABILITIES, ...resolved.capabilities };
5275
+ return { ...NO_PERMISSION_MATRIX, ...resolved.matrix };
5276
5276
  }
5277
- const capabilities = {
5278
- ...NO_PERMISSION_CAPABILITIES,
5277
+ const matrix = {
5278
+ ...NO_PERMISSION_MATRIX,
5279
5279
  [DEFAULT_PERMISSION_RESOURCE]: resolved.baseAccess
5280
5280
  };
5281
5281
  for (const resource of ROOM_PERMISSION_RESOURCES) {
5282
- capabilities[resource] = _nullishCoalesce(resolved.capabilities[resource], () => ( resolved.baseAccess));
5282
+ matrix[resource] = _nullishCoalesce(resolved.matrix[resource], () => ( resolved.baseAccess));
5283
5283
  }
5284
- return capabilities;
5284
+ return matrix;
5285
5285
  }
5286
- function permissionCapabilitiesFromScopes(scopes) {
5287
- return resolveFullPermissionCapabilities(
5288
- resolvePermissionCapabilities(scopes)
5289
- );
5286
+ function permissionMatrixFromScopes(scopes) {
5287
+ return resolveFullPermissionMatrix(resolvePermissionMatrix(scopes));
5290
5288
  }
5291
- function resolvePermissionCapabilities(scopes) {
5289
+ function resolvePermissionMatrix(scopes) {
5292
5290
  const hasDefaultPermission = scopes.includes(Permission.RoomWrite) || scopes.includes(Permission.RoomRead);
5293
5291
  const baseAccess = scopes.includes(Permission.RoomWrite) ? "write" : scopes.includes(Permission.RoomRead) ? "read" : "none";
5294
- const capabilities = {};
5292
+ const matrix = {};
5295
5293
  for (const resource of ROOM_PERMISSION_RESOURCES) {
5296
5294
  const access = resolveResourceAccess(scopes, resource);
5297
5295
  if (access !== void 0) {
5298
- capabilities[resource] = access;
5296
+ matrix[resource] = access;
5299
5297
  }
5300
5298
  }
5301
- return { hasDefaultPermission, baseAccess, capabilities };
5299
+ return { hasDefaultPermission, baseAccess, matrix };
5302
5300
  }
5303
- function hasPermissionCapability(scopes, resource, requiredAccess) {
5304
- const access = permissionCapabilitiesFromScopes(scopes)[resource];
5301
+ function hasPermissionAccess(source, resource, requiredAccess) {
5302
+ const matrix = isPermissionScopes(source) ? permissionMatrixFromScopes(source) : source;
5303
+ const access = _nullishCoalesce(matrix[resource], () => ( "none"));
5305
5304
  return ACCESS_RANKS[access] >= ACCESS_RANKS[requiredAccess];
5306
5305
  }
5307
- function hasPermissionCapabilityAccess(capabilities, resource, requiredAccess) {
5308
- const access = _nullishCoalesce(capabilities[resource], () => ( "none"));
5309
- return ACCESS_RANKS[access] >= ACCESS_RANKS[requiredAccess];
5306
+ function isPermissionScopes(source) {
5307
+ return Array.isArray(source);
5310
5308
  }
5311
5309
 
5312
5310
  // src/permissions.ts
@@ -5325,7 +5323,7 @@ function permissionForAccessLevel(resource, access, field = resource) {
5325
5323
  }
5326
5324
  return permissions[0];
5327
5325
  }
5328
- function resolveRoomPermissionCapabilities(permissions, roomId) {
5326
+ function resolveRoomPermissionMatrix(permissions, roomId) {
5329
5327
  const matchedPermissions = permissions.filter(
5330
5328
  (permission) => resourceMatchesRoomId(permission.resource, roomId)
5331
5329
  );
@@ -5334,27 +5332,27 @@ function resolveRoomPermissionCapabilities(permissions, roomId) {
5334
5332
  }
5335
5333
  let hasDefaultPermission = false;
5336
5334
  let baseAccess = "none";
5337
- const explicitCapabilities = {};
5335
+ const explicitMatrix = {};
5338
5336
  for (const permission of matchedPermissions) {
5339
- const resolved = resolvePermissionCapabilities(permission.scopes);
5337
+ const resolved = resolvePermissionMatrix(permission.scopes);
5340
5338
  if (resolved.hasDefaultPermission) {
5341
5339
  hasDefaultPermission = true;
5342
5340
  baseAccess = strongestAccess(baseAccess, resolved.baseAccess);
5343
5341
  }
5344
5342
  for (const resource of ROOM_PERMISSION_RESOURCES) {
5345
- const access = resolved.capabilities[resource];
5343
+ const access = resolved.matrix[resource];
5346
5344
  if (access !== void 0) {
5347
- explicitCapabilities[resource] = strongestAccess(
5348
- _nullishCoalesce(explicitCapabilities[resource], () => ( "none")),
5345
+ explicitMatrix[resource] = strongestAccess(
5346
+ _nullishCoalesce(explicitMatrix[resource], () => ( "none")),
5349
5347
  access
5350
5348
  );
5351
5349
  }
5352
5350
  }
5353
5351
  }
5354
- return resolveFullPermissionCapabilities({
5352
+ return resolveFullPermissionMatrix({
5355
5353
  hasDefaultPermission,
5356
5354
  baseAccess,
5357
- capabilities: explicitCapabilities
5355
+ matrix: explicitMatrix
5358
5356
  });
5359
5357
  }
5360
5358
  function isRoomPermissionArray(input) {
@@ -5420,33 +5418,33 @@ function normalizeRoomAccessesUpdateInput(input) {
5420
5418
  ])
5421
5419
  );
5422
5420
  }
5423
- function mergePermissionCapabilities(sources) {
5421
+ function mergePermissionMatrices(sources) {
5424
5422
  return {
5425
- creation: strongestCapabilityAccess(sources, "creation"),
5426
- presence: strongestCapabilityAccess(sources, "presence"),
5427
- storage: strongestCapabilityAccess(sources, "storage"),
5428
- comments: strongestCapabilityAccess(sources, "comments"),
5429
- feeds: strongestCapabilityAccess(sources, "feeds"),
5423
+ room: strongestMatrixAccess(sources, "room"),
5424
+ presence: strongestMatrixAccess(sources, "presence"),
5425
+ storage: strongestMatrixAccess(sources, "storage"),
5426
+ comments: strongestMatrixAccess(sources, "comments"),
5427
+ feeds: strongestMatrixAccess(sources, "feeds"),
5430
5428
  personal: "write"
5431
5429
  };
5432
5430
  }
5433
- function permissionCapabilitiesToScopes(capabilities) {
5431
+ function permissionMatrixToScopes(matrix) {
5434
5432
  const scopes = [];
5435
- const baseAccess = capabilities.creation;
5433
+ const baseAccess = matrix.room;
5436
5434
  if (baseAccess !== "none") {
5437
5435
  scopes.push(
5438
5436
  permissionForAccessLevel(DEFAULT_PERMISSION_RESOURCE, baseAccess)
5439
5437
  );
5440
5438
  }
5441
- for (const capability of ROOM_PERMISSION_RESOURCES) {
5442
- const access = capabilities[capability];
5439
+ for (const resource of ROOM_PERMISSION_RESOURCES) {
5440
+ const access = matrix[resource];
5443
5441
  if (access !== baseAccess) {
5444
- scopes.push(permissionForAccessLevel(capability, access));
5442
+ scopes.push(permissionForAccessLevel(resource, access));
5445
5443
  }
5446
5444
  }
5447
5445
  return scopes;
5448
5446
  }
5449
- function strongestCapabilityAccess(sources, resource) {
5447
+ function strongestMatrixAccess(sources, resource) {
5450
5448
  return sources.reduce(
5451
5449
  (strongest, source) => strongestAccess(strongest, source[resource]),
5452
5450
  "none"
@@ -5641,15 +5639,11 @@ function cachedTokenSatisfiesRequest(cachedToken, request) {
5641
5639
  if (request.roomId === void 0) {
5642
5640
  return false;
5643
5641
  }
5644
- const capabilities = resolveRoomPermissionCapabilities(
5642
+ const matrix = resolveRoomPermissionMatrix(
5645
5643
  _nullishCoalesce(cachedToken.permissions, () => ( [])),
5646
5644
  request.roomId
5647
5645
  );
5648
- return capabilities !== void 0 && hasPermissionCapabilityAccess(
5649
- capabilities,
5650
- request.resource,
5651
- request.access
5652
- );
5646
+ return matrix !== void 0 && hasPermissionAccess(matrix, request.resource, request.access);
5653
5647
  }
5654
5648
  function prepareAuthentication(authOptions) {
5655
5649
  const { publicApiKey, authEndpoint } = authOptions;
@@ -9541,14 +9535,14 @@ var ClientMsgCode = Object.freeze({
9541
9535
  // src/refs/ManagedOthers.ts
9542
9536
  function makeUser(conn, presence) {
9543
9537
  const { connectionId, id, info } = conn;
9544
- const canWrite = hasPermissionCapability(conn.scopes, "storage", "write");
9538
+ const canWrite = hasPermissionAccess(conn.scopes, "storage", "write");
9545
9539
  return freeze(
9546
9540
  compactObject({
9547
9541
  connectionId,
9548
9542
  id,
9549
9543
  info,
9550
9544
  canWrite,
9551
- canComment: hasPermissionCapability(conn.scopes, "comments", "write"),
9545
+ canComment: hasPermissionAccess(conn.scopes, "comments", "write"),
9552
9546
  isReadOnly: !canWrite,
9553
9547
  // Deprecated, kept for backward-compatibility
9554
9548
  presence
@@ -10005,7 +9999,7 @@ function createRoom(options, config) {
10005
9999
  }
10006
10000
  function isStorageWritable() {
10007
10001
  const scopes = _optionalChain([context, 'access', _224 => _224.dynamicSessionInfoSig, 'access', _225 => _225.get, 'call', _226 => _226(), 'optionalAccess', _227 => _227.scopes]);
10008
- return scopes !== void 0 ? hasPermissionCapability(scopes, "storage", "write") : true;
10002
+ return scopes !== void 0 ? hasPermissionAccess(scopes, "storage", "write") : true;
10009
10003
  }
10010
10004
  const eventHub = {
10011
10005
  status: makeEventSource(),
@@ -10066,7 +10060,7 @@ function createRoom(options, config) {
10066
10060
  if (staticSession === null || dynamicSession === null) {
10067
10061
  return null;
10068
10062
  } else {
10069
- const canWrite = hasPermissionCapability(
10063
+ const canWrite = hasPermissionAccess(
10070
10064
  dynamicSession.scopes,
10071
10065
  "storage",
10072
10066
  "write"
@@ -10077,7 +10071,7 @@ function createRoom(options, config) {
10077
10071
  info: staticSession.userInfo,
10078
10072
  presence: myPresence,
10079
10073
  canWrite,
10080
- canComment: hasPermissionCapability(
10074
+ canComment: hasPermissionAccess(
10081
10075
  dynamicSession.scopes,
10082
10076
  "comments",
10083
10077
  "write"
@@ -12741,6 +12735,5 @@ detectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);
12741
12735
 
12742
12736
 
12743
12737
 
12744
-
12745
- exports.ClientMsgCode = ClientMsgCode; exports.CrdtType = CrdtType; exports.DefaultMap = DefaultMap; exports.Deque = Deque; exports.DerivedSignal = DerivedSignal; exports.FeedRequestErrorCode = FeedRequestErrorCode; exports.HttpError = HttpError; exports.LiveList = LiveList; exports.LiveMap = LiveMap; exports.LiveObject = LiveObject; exports.LiveblocksError = LiveblocksError; exports.MENTION_CHARACTER = MENTION_CHARACTER; exports.MutableSignal = MutableSignal; exports.OpCode = OpCode; exports.Permission = Permission; exports.Promise_withResolvers = Promise_withResolvers; exports.ServerMsgCode = ServerMsgCode; exports.Signal = Signal; exports.SortedList = SortedList; exports.TextEditorType = TextEditorType; exports.WebsocketCloseCodes = WebsocketCloseCodes; exports.asPos = asPos; exports.assert = assert; exports.assertNever = assertNever; exports.autoRetry = autoRetry; exports.b64decode = b64decode; exports.batch = batch; exports.checkBounds = checkBounds; exports.chunk = chunk; exports.cloneLson = cloneLson; exports.compactNodesToNodeStream = compactNodesToNodeStream; exports.compactObject = compactObject; exports.console = fancy_console_exports; exports.convertToCommentData = convertToCommentData; exports.convertToCommentUserReaction = convertToCommentUserReaction; exports.convertToGroupData = convertToGroupData; exports.convertToInboxNotificationData = convertToInboxNotificationData; exports.convertToSubscriptionData = convertToSubscriptionData; exports.convertToThreadData = convertToThreadData; exports.convertToUserSubscriptionData = convertToUserSubscriptionData; exports.createClient = createClient; exports.createCommentAttachmentId = createCommentAttachmentId; exports.createCommentId = createCommentId; exports.createInboxNotificationId = createInboxNotificationId; exports.createManagedPool = createManagedPool; exports.createNotificationSettings = createNotificationSettings; exports.createThreadId = createThreadId; exports.deepLiveify = deepLiveify; exports.defineAiTool = defineAiTool; exports.deprecate = deprecate; exports.deprecateIf = deprecateIf; exports.detectDupes = detectDupes; exports.entries = entries; exports.errorIf = errorIf; exports.findLastIndex = findLastIndex; exports.freeze = freeze; exports.generateUrl = generateUrl; exports.getMentionsFromCommentBody = getMentionsFromCommentBody; exports.getSubscriptionKey = getSubscriptionKey; exports.hasPermissionCapability = hasPermissionCapability; exports.hasPermissionCapabilityAccess = hasPermissionCapabilityAccess; exports.html = html; exports.htmlSafe = htmlSafe; exports.isCommentBodyLink = isCommentBodyLink; exports.isCommentBodyMention = isCommentBodyMention; exports.isCommentBodyText = isCommentBodyText; exports.isJsonArray = isJsonArray; exports.isJsonObject = isJsonObject; exports.isJsonScalar = isJsonScalar; exports.isListStorageNode = isListStorageNode; exports.isLiveNode = isLiveNode; exports.isMapStorageNode = isMapStorageNode; exports.isNotificationChannelEnabled = isNotificationChannelEnabled; exports.isNumberOperator = isNumberOperator; exports.isObjectStorageNode = isObjectStorageNode; exports.isPlainObject = isPlainObject; exports.isRegisterStorageNode = isRegisterStorageNode; exports.isRootStorageNode = isRootStorageNode; exports.isStartsWithOperator = isStartsWithOperator; exports.isUrl = isUrl; exports.kInternal = kInternal; exports.keys = keys; exports.makeAbortController = makeAbortController; exports.makeEventSource = makeEventSource; exports.makePoller = makePoller; exports.makePosition = makePosition; exports.mapValues = mapValues; exports.memoizeOnSuccess = memoizeOnSuccess; exports.mergePermissionCapabilities = mergePermissionCapabilities; exports.nanoid = nanoid; exports.nn = nn; exports.nodeStreamToCompactNodes = nodeStreamToCompactNodes; exports.normalizeRoomAccessesInput = normalizeRoomAccessesInput; exports.normalizeRoomAccessesUpdateInput = normalizeRoomAccessesUpdateInput; exports.normalizeRoomPermissionInput = normalizeRoomPermissionInput; exports.objectToQuery = objectToQuery; exports.patchNotificationSettings = patchNotificationSettings; exports.permissionCapabilitiesFromScopes = permissionCapabilitiesFromScopes; exports.permissionCapabilitiesToScopes = permissionCapabilitiesToScopes; exports.raise = raise; exports.resolveMentionsInCommentBody = resolveMentionsInCommentBody; exports.sanitizeUrl = sanitizeUrl; exports.shallow = shallow; exports.shallow2 = shallow2; exports.stableStringify = stableStringify; exports.stringifyCommentBody = stringifyCommentBody; exports.throwUsageError = throwUsageError; exports.toPlainLson = toPlainLson; exports.tryParseJson = tryParseJson; exports.url = url; exports.urljoin = urljoin; exports.wait = wait; exports.warnOnce = warnOnce; exports.warnOnceIf = warnOnceIf; exports.withTimeout = withTimeout;
12738
+ exports.ClientMsgCode = ClientMsgCode; exports.CrdtType = CrdtType; exports.DefaultMap = DefaultMap; exports.Deque = Deque; exports.DerivedSignal = DerivedSignal; exports.FeedRequestErrorCode = FeedRequestErrorCode; exports.HttpError = HttpError; exports.LiveList = LiveList; exports.LiveMap = LiveMap; exports.LiveObject = LiveObject; exports.LiveblocksError = LiveblocksError; exports.MENTION_CHARACTER = MENTION_CHARACTER; exports.MutableSignal = MutableSignal; exports.OpCode = OpCode; exports.Permission = Permission; exports.Promise_withResolvers = Promise_withResolvers; exports.ServerMsgCode = ServerMsgCode; exports.Signal = Signal; exports.SortedList = SortedList; exports.TextEditorType = TextEditorType; exports.WebsocketCloseCodes = WebsocketCloseCodes; exports.asPos = asPos; exports.assert = assert; exports.assertNever = assertNever; exports.autoRetry = autoRetry; exports.b64decode = b64decode; exports.batch = batch; exports.checkBounds = checkBounds; exports.chunk = chunk; exports.cloneLson = cloneLson; exports.compactNodesToNodeStream = compactNodesToNodeStream; exports.compactObject = compactObject; exports.console = fancy_console_exports; exports.convertToCommentData = convertToCommentData; exports.convertToCommentUserReaction = convertToCommentUserReaction; exports.convertToGroupData = convertToGroupData; exports.convertToInboxNotificationData = convertToInboxNotificationData; exports.convertToSubscriptionData = convertToSubscriptionData; exports.convertToThreadData = convertToThreadData; exports.convertToUserSubscriptionData = convertToUserSubscriptionData; exports.createClient = createClient; exports.createCommentAttachmentId = createCommentAttachmentId; exports.createCommentId = createCommentId; exports.createInboxNotificationId = createInboxNotificationId; exports.createManagedPool = createManagedPool; exports.createNotificationSettings = createNotificationSettings; exports.createThreadId = createThreadId; exports.deepLiveify = deepLiveify; exports.defineAiTool = defineAiTool; exports.deprecate = deprecate; exports.deprecateIf = deprecateIf; exports.detectDupes = detectDupes; exports.entries = entries; exports.errorIf = errorIf; exports.findLastIndex = findLastIndex; exports.freeze = freeze; exports.generateUrl = generateUrl; exports.getMentionsFromCommentBody = getMentionsFromCommentBody; exports.getSubscriptionKey = getSubscriptionKey; exports.hasPermissionAccess = hasPermissionAccess; exports.html = html; exports.htmlSafe = htmlSafe; exports.isCommentBodyLink = isCommentBodyLink; exports.isCommentBodyMention = isCommentBodyMention; exports.isCommentBodyText = isCommentBodyText; exports.isJsonArray = isJsonArray; exports.isJsonObject = isJsonObject; exports.isJsonScalar = isJsonScalar; exports.isListStorageNode = isListStorageNode; exports.isLiveNode = isLiveNode; exports.isMapStorageNode = isMapStorageNode; exports.isNotificationChannelEnabled = isNotificationChannelEnabled; exports.isNumberOperator = isNumberOperator; exports.isObjectStorageNode = isObjectStorageNode; exports.isPlainObject = isPlainObject; exports.isRegisterStorageNode = isRegisterStorageNode; exports.isRootStorageNode = isRootStorageNode; exports.isStartsWithOperator = isStartsWithOperator; exports.isUrl = isUrl; exports.kInternal = kInternal; exports.keys = keys; exports.makeAbortController = makeAbortController; exports.makeEventSource = makeEventSource; exports.makePoller = makePoller; exports.makePosition = makePosition; exports.mapValues = mapValues; exports.memoizeOnSuccess = memoizeOnSuccess; exports.mergePermissionMatrices = mergePermissionMatrices; exports.nanoid = nanoid; exports.nn = nn; exports.nodeStreamToCompactNodes = nodeStreamToCompactNodes; exports.normalizeRoomAccessesInput = normalizeRoomAccessesInput; exports.normalizeRoomAccessesUpdateInput = normalizeRoomAccessesUpdateInput; exports.normalizeRoomPermissionInput = normalizeRoomPermissionInput; exports.objectToQuery = objectToQuery; exports.patchNotificationSettings = patchNotificationSettings; exports.permissionMatrixFromScopes = permissionMatrixFromScopes; exports.permissionMatrixToScopes = permissionMatrixToScopes; exports.raise = raise; exports.resolveMentionsInCommentBody = resolveMentionsInCommentBody; exports.sanitizeUrl = sanitizeUrl; exports.shallow = shallow; exports.shallow2 = shallow2; exports.stableStringify = stableStringify; exports.stringifyCommentBody = stringifyCommentBody; exports.throwUsageError = throwUsageError; exports.toPlainLson = toPlainLson; exports.tryParseJson = tryParseJson; exports.url = url; exports.urljoin = urljoin; exports.wait = wait; exports.warnOnce = warnOnce; exports.warnOnceIf = warnOnceIf; exports.withTimeout = withTimeout;
12746
12739
  //# sourceMappingURL=index.cjs.map