@liveblocks/core 3.20.0-perm6 → 3.20.0-perm7

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-perm6";
9
+ var PKG_VERSION = "3.20.0-perm7";
10
10
  var PKG_FORMAT = "cjs";
11
11
 
12
12
  // src/dupe-detection.ts
@@ -5246,6 +5246,9 @@ var ROOM_PERMISSION_RESOURCES = [
5246
5246
  "feeds"
5247
5247
  ];
5248
5248
  var VALID_PERMISSIONS = new Set(Object.values(Permission));
5249
+ function isPermission(permission) {
5250
+ return VALID_PERMISSIONS.has(permission);
5251
+ }
5249
5252
  function resolveResourceAccess(scopes, resource) {
5250
5253
  const permissions = PERMISSIONS_BY_RESOURCE[resource];
5251
5254
  let resourceAccess;
@@ -5330,46 +5333,46 @@ function resolveRoomPermissionMatrix(permissions, roomId) {
5330
5333
  matrix: explicitMatrix
5331
5334
  });
5332
5335
  }
5333
- function normalizeRoomPermissionInput(input) {
5334
- if (!Array.isArray(input)) {
5336
+ function normalizeRoomPermissions(permissions) {
5337
+ if (!Array.isArray(permissions)) {
5335
5338
  throw new Error("Permission list must be an array");
5336
5339
  }
5337
- return input.map((permission) => {
5338
- if (!VALID_PERMISSIONS.has(permission)) {
5340
+ return permissions.map((permission) => {
5341
+ if (!isPermission(permission)) {
5339
5342
  throw new Error(`Not a valid permission: ${permission}`);
5340
5343
  }
5341
5344
  return permission;
5342
5345
  });
5343
5346
  }
5344
- function normalizeRoomAccessesInput(input) {
5345
- if (input === void 0) {
5347
+ function normalizeRoomAccesses(accesses) {
5348
+ if (accesses === void 0) {
5346
5349
  return void 0;
5347
5350
  }
5348
5351
  return Object.fromEntries(
5349
- Object.entries(input).map(([id, permissions]) => [
5352
+ Object.entries(accesses).map(([id, permissions]) => [
5350
5353
  id,
5351
- normalizeRoomPermissionInput(permissions)
5354
+ normalizeRoomPermissions(permissions)
5352
5355
  ])
5353
5356
  );
5354
5357
  }
5355
- function normalizeRoomAccessesUpdateInput(input) {
5356
- if (input === void 0) {
5358
+ function normalizeUpdateRoomAccesses(accesses) {
5359
+ if (accesses === void 0) {
5357
5360
  return void 0;
5358
5361
  }
5359
5362
  return Object.fromEntries(
5360
- Object.entries(input).map(([id, permissions]) => [
5363
+ Object.entries(accesses).map(([id, permissions]) => [
5361
5364
  id,
5362
- permissions === null ? null : normalizeRoomPermissionInput(permissions)
5365
+ permissions === null ? null : normalizeRoomPermissions(permissions)
5363
5366
  ])
5364
5367
  );
5365
5368
  }
5366
- function mergePermissionMatrices(sources) {
5369
+ function mergePermissionMatrices(matrices) {
5367
5370
  return {
5368
- room: strongestMatrixAccess(sources, "room"),
5369
- storage: strongestMatrixAccess(sources, "storage"),
5370
- comments: strongestMatrixAccess(sources, "comments"),
5371
- feeds: strongestMatrixAccess(sources, "feeds"),
5372
- personal: strongestMatrixAccess(sources, "personal")
5371
+ room: strongestMatrixAccess(matrices, "room"),
5372
+ storage: strongestMatrixAccess(matrices, "storage"),
5373
+ comments: strongestMatrixAccess(matrices, "comments"),
5374
+ feeds: strongestMatrixAccess(matrices, "feeds"),
5375
+ personal: strongestMatrixAccess(matrices, "personal")
5373
5376
  };
5374
5377
  }
5375
5378
  function permissionMatrixToScopes(matrix) {
@@ -5391,12 +5394,13 @@ function mergeRoomPermissionScopes({
5391
5394
  groupsAccesses,
5392
5395
  userAccesses
5393
5396
  }) {
5394
- const sources = [
5395
- permissionMatrixFromScopes(defaultAccesses),
5396
- ...groupsAccesses.map((scopes) => permissionMatrixFromScopes(scopes)),
5397
- ...userAccesses !== void 0 ? [permissionMatrixFromScopes(userAccesses)] : []
5398
- ];
5399
- return permissionMatrixToScopes(mergePermissionMatrices(sources));
5397
+ return permissionMatrixToScopes(
5398
+ mergePermissionMatrices([
5399
+ permissionMatrixFromScopes(defaultAccesses),
5400
+ ...groupsAccesses.map(permissionMatrixFromScopes),
5401
+ permissionMatrixFromScopes(userAccesses)
5402
+ ])
5403
+ );
5400
5404
  }
5401
5405
  function permissionForAccessLevel(resource, access, field = resource) {
5402
5406
  const levels = PERMISSIONS_BY_RESOURCE[resource];
@@ -5408,9 +5412,9 @@ function permissionForAccessLevel(resource, access, field = resource) {
5408
5412
  }
5409
5413
  return permissions[0];
5410
5414
  }
5411
- function strongestMatrixAccess(sources, resource) {
5412
- return sources.reduce(
5413
- (strongest, source) => strongestAccess(strongest, source[resource]),
5415
+ function strongestMatrixAccess(matrices, resource) {
5416
+ return matrices.reduce(
5417
+ (strongest, matrix) => strongestAccess(strongest, matrix[resource]),
5414
5418
  "none"
5415
5419
  );
5416
5420
  }
@@ -5593,7 +5597,7 @@ function makeCachedToken(token, expiresAt) {
5593
5597
  function getAuthTokenPermissionScopes(permissions) {
5594
5598
  return Object.entries(permissions).map(([resource, scopes]) => ({
5595
5599
  resource,
5596
- scopes
5600
+ scopes: normalizeRoomPermissions(scopes)
5597
5601
  }));
5598
5602
  }
5599
5603
  function cachedTokenSatisfiesRequest(cachedToken, request) {
@@ -9501,23 +9505,15 @@ var ClientMsgCode = Object.freeze({
9501
9505
 
9502
9506
  // src/refs/ManagedOthers.ts
9503
9507
  function makeUser(conn, presence) {
9504
- const { connectionId, id, info } = conn;
9505
- const canWrite = hasPermissionAccess(
9506
- conn.permissionMatrix,
9507
- "storage",
9508
- "write"
9509
- );
9508
+ const { connectionId, id, info, access } = conn;
9509
+ const { canWrite, canComment } = access;
9510
9510
  return freeze(
9511
9511
  compactObject({
9512
9512
  connectionId,
9513
9513
  id,
9514
9514
  info,
9515
9515
  canWrite,
9516
- canComment: hasPermissionAccess(
9517
- conn.permissionMatrix,
9518
- "comments",
9519
- "write"
9520
- ),
9516
+ canComment,
9521
9517
  isReadOnly: !canWrite,
9522
9518
  // Deprecated, kept for backward-compatibility
9523
9519
  presence
@@ -9588,7 +9584,7 @@ var ManagedOthers = class {
9588
9584
  * Records a known connection. This records the connection ID and the
9589
9585
  * associated metadata.
9590
9586
  */
9591
- setConnection(connectionId, metaUserId, metaUserInfo, scopes) {
9587
+ setConnection(connectionId, metaUserId, metaUserInfo, access) {
9592
9588
  this.#internal.mutate((state) => {
9593
9589
  state.connections.set(
9594
9590
  connectionId,
@@ -9596,7 +9592,7 @@ var ManagedOthers = class {
9596
9592
  connectionId,
9597
9593
  id: metaUserId,
9598
9594
  info: metaUserInfo,
9599
- permissionMatrix: permissionMatrixFromScopes(scopes)
9595
+ access
9600
9596
  })
9601
9597
  );
9602
9598
  if (!state.presences.has(connectionId)) {
@@ -9749,6 +9745,14 @@ function defaultMessageFromContext(context) {
9749
9745
 
9750
9746
  // src/room.ts
9751
9747
  var FEEDS_TIMEOUT = 5e3;
9748
+ function connectionAccessFromScopes(scopes) {
9749
+ const roomPermissions = normalizeRoomPermissions(scopes);
9750
+ const matrix = permissionMatrixFromScopes(roomPermissions);
9751
+ return {
9752
+ canWrite: hasPermissionAccess(matrix, "storage", "write"),
9753
+ canComment: hasPermissionAccess(matrix, "comments", "write")
9754
+ };
9755
+ }
9752
9756
  function makeIdFactory(connectionId) {
9753
9757
  let count = 0;
9754
9758
  return () => `${connectionId}:${count++}`;
@@ -10339,7 +10343,9 @@ function createRoom(options, config) {
10339
10343
  context.dynamicSessionInfoSig.set({
10340
10344
  actor: message.actor,
10341
10345
  nonce: message.nonce,
10342
- permissionMatrix: permissionMatrixFromScopes(message.scopes),
10346
+ permissionMatrix: permissionMatrixFromScopes(
10347
+ normalizeRoomPermissions(message.scopes)
10348
+ ),
10343
10349
  meta: message.meta
10344
10350
  });
10345
10351
  context.idFactory = makeIdFactory(message.actor);
@@ -10360,7 +10366,7 @@ function createRoom(options, config) {
10360
10366
  connectionId,
10361
10367
  user.id,
10362
10368
  user.info,
10363
- user.scopes
10369
+ connectionAccessFromScopes(user.scopes)
10364
10370
  );
10365
10371
  }
10366
10372
  return { type: "reset" };
@@ -10380,7 +10386,7 @@ function createRoom(options, config) {
10380
10386
  message.actor,
10381
10387
  message.id,
10382
10388
  message.info,
10383
- message.scopes
10389
+ connectionAccessFromScopes(message.scopes)
10384
10390
  );
10385
10391
  context.buffer.messages.push({
10386
10392
  type: ClientMsgCode.UPDATE_PRESENCE,
@@ -11746,7 +11752,6 @@ function createClient(options) {
11746
11752
  ),
11747
11753
  authenticate: async () => {
11748
11754
  const resp = await authManager.getAuthValue({
11749
- // TODO: Should we have permissions for AI Copilots?
11750
11755
  resource: "personal",
11751
11756
  access: "write"
11752
11757
  });
@@ -12713,5 +12718,5 @@ detectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);
12713
12718
 
12714
12719
 
12715
12720
 
12716
- 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.mergeRoomPermissionScopes = mergeRoomPermissionScopes; 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;
12721
+ 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.mergeRoomPermissionScopes = mergeRoomPermissionScopes; exports.nanoid = nanoid; exports.nn = nn; exports.nodeStreamToCompactNodes = nodeStreamToCompactNodes; exports.normalizeRoomAccesses = normalizeRoomAccesses; exports.normalizeRoomPermissions = normalizeRoomPermissions; exports.normalizeUpdateRoomAccesses = normalizeUpdateRoomAccesses; 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;
12717
12722
  //# sourceMappingURL=index.cjs.map