@peers-app/peers-sdk 0.14.0 → 0.15.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.
Files changed (210) hide show
  1. package/dist/context/data-context.d.ts +4 -4
  2. package/dist/context/data-context.js +1 -1
  3. package/dist/context/index.d.ts +3 -3
  4. package/dist/context/index.js +4 -0
  5. package/dist/context/user-context-singleton.js +13 -14
  6. package/dist/context/user-context.d.ts +4 -4
  7. package/dist/context/user-context.js +48 -31
  8. package/dist/data/assistants.d.ts +1 -1
  9. package/dist/data/assistants.js +35 -24
  10. package/dist/data/change-tracking.d.ts +8 -8
  11. package/dist/data/change-tracking.js +45 -39
  12. package/dist/data/channels.js +5 -5
  13. package/dist/data/data-locks.d.ts +2 -2
  14. package/dist/data/data-locks.js +21 -23
  15. package/dist/data/data-locks.test.js +73 -75
  16. package/dist/data/device-sync-info.d.ts +1 -1
  17. package/dist/data/device-sync-info.js +4 -4
  18. package/dist/data/devices.d.ts +1 -1
  19. package/dist/data/devices.js +9 -12
  20. package/dist/data/embeddings.js +14 -11
  21. package/dist/data/files/file-read-stream.d.ts +2 -2
  22. package/dist/data/files/file-read-stream.js +23 -14
  23. package/dist/data/files/file-write-stream.d.ts +2 -2
  24. package/dist/data/files/file-write-stream.js +8 -8
  25. package/dist/data/files/file.types.d.ts +2 -2
  26. package/dist/data/files/file.types.js +17 -11
  27. package/dist/data/files/files.d.ts +6 -6
  28. package/dist/data/files/files.js +17 -19
  29. package/dist/data/files/files.test.js +213 -214
  30. package/dist/data/files/index.d.ts +4 -4
  31. package/dist/data/files/index.js +4 -4
  32. package/dist/data/group-member-roles.js +2 -2
  33. package/dist/data/group-members.d.ts +5 -5
  34. package/dist/data/group-members.js +27 -18
  35. package/dist/data/group-members.test.js +73 -73
  36. package/dist/data/group-permissions.d.ts +3 -3
  37. package/dist/data/group-permissions.js +13 -11
  38. package/dist/data/group-share.d.ts +2 -2
  39. package/dist/data/group-share.js +29 -24
  40. package/dist/data/groups.d.ts +4 -4
  41. package/dist/data/groups.js +27 -19
  42. package/dist/data/groups.test.js +44 -44
  43. package/dist/data/index.d.ts +6 -6
  44. package/dist/data/index.js +6 -6
  45. package/dist/data/knowledge/peer-types.js +9 -9
  46. package/dist/data/messages.d.ts +5 -5
  47. package/dist/data/messages.js +43 -30
  48. package/dist/data/orm/client-proxy.data-source.d.ts +4 -4
  49. package/dist/data/orm/client-proxy.data-source.js +10 -12
  50. package/dist/data/orm/cursor.d.ts +1 -1
  51. package/dist/data/orm/cursor.js +2 -2
  52. package/dist/data/orm/cursor.test.js +92 -93
  53. package/dist/data/orm/data-query.d.ts +3 -3
  54. package/dist/data/orm/data-query.js +24 -18
  55. package/dist/data/orm/data-query.mongo.d.ts +1 -1
  56. package/dist/data/orm/data-query.mongo.js +49 -51
  57. package/dist/data/orm/data-query.mongo.test.js +173 -204
  58. package/dist/data/orm/data-query.sqlite.d.ts +1 -1
  59. package/dist/data/orm/data-query.sqlite.js +84 -73
  60. package/dist/data/orm/data-query.sqlite.test.js +164 -176
  61. package/dist/data/orm/data-query.test.js +216 -224
  62. package/dist/data/orm/decorators.js +3 -3
  63. package/dist/data/orm/dependency-injection.test.js +53 -56
  64. package/dist/data/orm/doc.d.ts +4 -4
  65. package/dist/data/orm/doc.js +17 -21
  66. package/dist/data/orm/event-registry.d.ts +1 -1
  67. package/dist/data/orm/event-registry.test.js +16 -16
  68. package/dist/data/orm/factory.d.ts +2 -2
  69. package/dist/data/orm/factory.js +33 -33
  70. package/dist/data/orm/index.d.ts +10 -10
  71. package/dist/data/orm/index.js +10 -10
  72. package/dist/data/orm/multi-cursors.d.ts +1 -1
  73. package/dist/data/orm/multi-cursors.js +6 -6
  74. package/dist/data/orm/multi-cursors.test.js +152 -144
  75. package/dist/data/orm/sql.data-source.d.ts +7 -7
  76. package/dist/data/orm/sql.data-source.js +88 -93
  77. package/dist/data/orm/sql.data-source.test.js +109 -101
  78. package/dist/data/orm/subscribable.data-source.d.ts +4 -4
  79. package/dist/data/orm/subscribable.data-source.js +5 -5
  80. package/dist/data/orm/table-container-events.test.js +34 -26
  81. package/dist/data/orm/table-container.d.ts +6 -6
  82. package/dist/data/orm/table-container.js +33 -21
  83. package/dist/data/orm/table-container.test.js +64 -53
  84. package/dist/data/orm/table-definitions.system.d.ts +3 -3
  85. package/dist/data/orm/table-definitions.system.js +3 -3
  86. package/dist/data/orm/table-definitions.type.d.ts +5 -5
  87. package/dist/data/orm/table-dependencies.d.ts +2 -2
  88. package/dist/data/orm/table.d.ts +5 -5
  89. package/dist/data/orm/table.event-source.test.js +105 -115
  90. package/dist/data/orm/table.js +35 -34
  91. package/dist/data/orm/types.d.ts +3 -3
  92. package/dist/data/orm/types.js +26 -25
  93. package/dist/data/orm/types.test.js +166 -92
  94. package/dist/data/package-permissions.d.ts +1 -1
  95. package/dist/data/package-permissions.js +2 -2
  96. package/dist/data/package-version-permissions.d.ts +1 -1
  97. package/dist/data/package-version-permissions.js +2 -2
  98. package/dist/data/package-versions.d.ts +9 -9
  99. package/dist/data/package-versions.js +47 -33
  100. package/dist/data/packages.d.ts +2 -2
  101. package/dist/data/packages.js +36 -18
  102. package/dist/data/packages.utils.d.ts +2 -2
  103. package/dist/data/packages.utils.js +4 -4
  104. package/dist/data/persistent-vars.d.ts +15 -15
  105. package/dist/data/persistent-vars.js +165 -154
  106. package/dist/data/table-definitions-table.d.ts +5 -5
  107. package/dist/data/table-definitions-table.js +13 -12
  108. package/dist/data/tool-tests.js +6 -6
  109. package/dist/data/tools.js +29 -19
  110. package/dist/data/user-permissions.d.ts +1 -1
  111. package/dist/data/user-permissions.js +5 -5
  112. package/dist/data/user-permissions.test.js +90 -88
  113. package/dist/data/user-trust-levels.js +10 -10
  114. package/dist/data/users.d.ts +4 -4
  115. package/dist/data/users.js +16 -15
  116. package/dist/data/voice-messages.d.ts +2 -2
  117. package/dist/data/voice-messages.js +13 -13
  118. package/dist/data/welcome-modal.pvar.js +3 -1
  119. package/dist/data/workflow-logs.js +26 -18
  120. package/dist/data/workflow-runs.d.ts +6 -6
  121. package/dist/data/workflow-runs.js +70 -44
  122. package/dist/data/workflows.d.ts +2 -2
  123. package/dist/data/workflows.js +7 -9
  124. package/dist/device/binary-peer-connection-v2.d.ts +7 -7
  125. package/dist/device/binary-peer-connection-v2.js +32 -28
  126. package/dist/device/binary-peer-connection-v2.test.js +80 -67
  127. package/dist/device/binary-peer-connection.d.ts +7 -7
  128. package/dist/device/binary-peer-connection.js +29 -28
  129. package/dist/device/binary-peer-connection.test.js +35 -31
  130. package/dist/device/connection.d.ts +5 -5
  131. package/dist/device/connection.js +59 -48
  132. package/dist/device/connection.test.js +74 -68
  133. package/dist/device/device-election.d.ts +2 -2
  134. package/dist/device/device-election.js +25 -20
  135. package/dist/device/device-election.test.js +35 -36
  136. package/dist/device/device.d.ts +2 -2
  137. package/dist/device/device.js +10 -4
  138. package/dist/device/device.test.js +16 -17
  139. package/dist/device/get-trust-level-fn.d.ts +2 -2
  140. package/dist/device/get-trust-level-fn.js +22 -11
  141. package/dist/device/get-trust-level-fn.test.js +58 -58
  142. package/dist/device/socket-io-binary-peer.d.ts +1 -1
  143. package/dist/device/socket-io-binary-peer.js +16 -13
  144. package/dist/device/socket.type.d.ts +2 -2
  145. package/dist/device/streamed-socket.d.ts +2 -2
  146. package/dist/device/streamed-socket.js +8 -8
  147. package/dist/device/streamed-socket.test.js +40 -40
  148. package/dist/device/tx-encoding.test.js +77 -77
  149. package/dist/events.d.ts +1 -1
  150. package/dist/events.js +5 -2
  151. package/dist/group-invite/group-invite.js +110 -19
  152. package/dist/group-invite/group-invite.pvars.d.ts +2 -2
  153. package/dist/group-invite/group-invite.pvars.js +21 -13
  154. package/dist/group-invite/group-invite.types.d.ts +1 -1
  155. package/dist/group-invite/index.d.ts +3 -3
  156. package/dist/group-invite/index.js +1 -1
  157. package/dist/index.d.ts +25 -24
  158. package/dist/index.js +30 -25
  159. package/dist/keys.d.ts +3 -3
  160. package/dist/keys.js +31 -30
  161. package/dist/keys.test.js +69 -61
  162. package/dist/logging/console-logger.d.ts +1 -1
  163. package/dist/logging/console-logger.js +35 -40
  164. package/dist/logging/console-logger.test.js +115 -115
  165. package/dist/logging/console-logs.table.d.ts +3 -3
  166. package/dist/logging/console-logs.table.js +28 -23
  167. package/dist/mentions.js +16 -12
  168. package/dist/observable.d.ts +2 -2
  169. package/dist/observable.js +15 -9
  170. package/dist/observable.test.js +47 -47
  171. package/dist/package-loader/get-require.js +3 -4
  172. package/dist/package-loader/package-loader.d.ts +2 -2
  173. package/dist/package-loader/package-loader.js +52 -34
  174. package/dist/peers-ui/peers-ui.d.ts +2 -2
  175. package/dist/peers-ui/peers-ui.js +2 -4
  176. package/dist/peers-ui/peers-ui.types.d.ts +3 -3
  177. package/dist/peers-ui/peers-ui.types.js +0 -1
  178. package/dist/rpc-types.d.ts +61 -59
  179. package/dist/rpc-types.js +61 -55
  180. package/dist/serial-json.d.ts +1 -1
  181. package/dist/serial-json.js +50 -43
  182. package/dist/serial-json.test.js +22 -22
  183. package/dist/system-ids.js +8 -8
  184. package/dist/tools/index.d.ts +1 -1
  185. package/dist/tools/tools-factory.d.ts +1 -1
  186. package/dist/tools/tools-factory.js +2 -2
  187. package/dist/types/assistant-runner-args.d.ts +3 -3
  188. package/dist/types/peer-device.d.ts +1 -1
  189. package/dist/types/peers-package.d.ts +3 -3
  190. package/dist/types/workflow-logger.d.ts +1 -1
  191. package/dist/types/workflow-run-context.d.ts +4 -4
  192. package/dist/types/workflow.d.ts +4 -4
  193. package/dist/types/workflow.js +27 -14
  194. package/dist/types/zod-types.d.ts +2 -1
  195. package/dist/types/zod-types.js +9 -3
  196. package/dist/user-connect/connection-code.d.ts +1 -1
  197. package/dist/user-connect/connection-code.js +7 -7
  198. package/dist/user-connect/connection-code.test.js +106 -106
  199. package/dist/user-connect/index.d.ts +3 -3
  200. package/dist/user-connect/index.js +1 -1
  201. package/dist/user-connect/user-connect.pvars.js +13 -11
  202. package/dist/user-connect/user-connect.types.d.ts +3 -3
  203. package/dist/users.query.d.ts +2 -2
  204. package/dist/users.query.js +40 -30
  205. package/dist/utils.d.ts +2 -2
  206. package/dist/utils.js +34 -32
  207. package/dist/utils.test.js +12 -8
  208. package/dist/workflow-log-formatter.d.ts +1 -1
  209. package/dist/workflow-log-formatter.js +17 -18
  210. package/package.json +14 -8
@@ -1,4 +1,4 @@
1
- export * from './file.types';
2
- export * from './files';
3
- export { FileWriteStream } from './file-write-stream';
4
- export { FileReadStream } from './file-read-stream';
1
+ export * from "./file.types";
2
+ export { FileReadStream } from "./file-read-stream";
3
+ export { FileWriteStream } from "./file-write-stream";
4
+ export * from "./files";
@@ -14,10 +14,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.FileReadStream = exports.FileWriteStream = void 0;
17
+ exports.FileWriteStream = exports.FileReadStream = void 0;
18
18
  __exportStar(require("./file.types"), exports);
19
- __exportStar(require("./files"), exports);
20
- var file_write_stream_1 = require("./file-write-stream");
21
- Object.defineProperty(exports, "FileWriteStream", { enumerable: true, get: function () { return file_write_stream_1.FileWriteStream; } });
22
19
  var file_read_stream_1 = require("./file-read-stream");
23
20
  Object.defineProperty(exports, "FileReadStream", { enumerable: true, get: function () { return file_read_stream_1.FileReadStream; } });
21
+ var file_write_stream_1 = require("./file-write-stream");
22
+ Object.defineProperty(exports, "FileWriteStream", { enumerable: true, get: function () { return file_write_stream_1.FileWriteStream; } });
23
+ __exportStar(require("./files"), exports);
@@ -13,7 +13,7 @@ var GroupMemberRole;
13
13
  })(GroupMemberRole || (exports.GroupMemberRole = GroupMemberRole = {}));
14
14
  function getRoleLabel(value) {
15
15
  const roleEntries = Object.entries(GroupMemberRole)
16
- .filter(([key, val]) => typeof val === 'number')
16
+ .filter(([_key, val]) => typeof val === "number")
17
17
  .map(([key, val]) => ({ level: val, label: key }))
18
18
  .sort((a, b) => b.level - a.level);
19
19
  for (const role of roleEntries) {
@@ -21,5 +21,5 @@ function getRoleLabel(value) {
21
21
  return value === role.level ? role.label : `${role.label}+`;
22
22
  }
23
23
  }
24
- return 'None';
24
+ return "None";
25
25
  }
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import type { DataContext } from "../context/data-context";
3
- import { GroupMemberRole } from './group-member-roles';
3
+ import { GroupMemberRole } from "./group-member-roles";
4
4
  import type { ISaveOptions } from "./orm/data-query";
5
5
  import { Table } from "./orm/table";
6
6
  export declare const groupMemberSchema: z.ZodObject<{
@@ -13,16 +13,16 @@ export declare const groupMemberSchema: z.ZodObject<{
13
13
  }, "strip", z.ZodTypeAny, {
14
14
  role: GroupMemberRole;
15
15
  signature: string;
16
+ groupId: string;
16
17
  userId: string;
17
18
  groupMemberId: string;
18
- groupId: string;
19
19
  deleted?: boolean | undefined;
20
20
  }, {
21
21
  role: GroupMemberRole;
22
22
  signature: string;
23
+ groupId: string;
23
24
  userId: string;
24
25
  groupMemberId: string;
25
- groupId: string;
26
26
  deleted?: boolean | undefined;
27
27
  }>;
28
28
  export type IGroupMember = z.infer<typeof groupMemberSchema>;
@@ -35,8 +35,8 @@ export declare class GroupMembersTable extends Table<IGroupMember> {
35
35
  private static addSignatureToGroupMember;
36
36
  static enableGroupMemberSigning(fn: (groupMember: IGroupMember) => IGroupMember): void;
37
37
  /** @deprecated Forbidden on GroupsTable; use save() */
38
- insert(..._args: Parameters<Table<IGroupMember>['insert']>): never;
38
+ insert(..._args: Parameters<Table<IGroupMember>["insert"]>): never;
39
39
  /** @deprecated Forbidden on GroupsTable; use save() */
40
- update(..._args: Parameters<Table<IGroupMember>['update']>): never;
40
+ update(..._args: Parameters<Table<IGroupMember>["update"]>): never;
41
41
  }
42
42
  export declare function GroupMembers(dataContext?: DataContext): GroupMembersTable;
@@ -48,21 +48,24 @@ const types_1 = require("./orm/types");
48
48
  const users_1 = require("./users");
49
49
  exports.groupMemberSchema = zod_1.z.object({
50
50
  groupMemberId: zod_types_1.zodPeerId,
51
- groupId: zod_types_1.zodPeerId.describe('The id of the group'),
52
- userId: zod_types_1.zodPeerId.describe('The id of the user who is a member of the group'),
53
- role: zod_1.z.nativeEnum(group_member_roles_1.GroupMemberRole).describe('The role of the user in the group. Use "none" to explicitly block a user'),
54
- signature: zod_1.z.string().describe('The signed hash of this data excluding the signature itself'),
55
- deleted: zod_1.z.boolean().optional().describe('Whether this membership has been deleted (soft delete)'),
51
+ groupId: zod_types_1.zodPeerId.describe("The id of the group"),
52
+ userId: zod_types_1.zodPeerId.describe("The id of the user who is a member of the group"),
53
+ role: zod_1.z
54
+ .nativeEnum(group_member_roles_1.GroupMemberRole)
55
+ .describe('The role of the user in the group. Use "none" to explicitly block a user'),
56
+ signature: zod_1.z.string().describe("The signed hash of this data excluding the signature itself"),
57
+ deleted: zod_1.z
58
+ .boolean()
59
+ .optional()
60
+ .describe("Whether this membership has been deleted (soft delete)"),
56
61
  });
57
- exports.groupMembersTableName = 'GroupMembers';
62
+ exports.groupMembersTableName = "GroupMembers";
58
63
  const metaData = {
59
64
  name: exports.groupMembersTableName,
60
- description: 'group membership associations',
61
- primaryKeyName: 'groupMemberId',
65
+ description: "group membership associations",
66
+ primaryKeyName: "groupMemberId",
62
67
  fields: (0, types_1.schemaToFields)(exports.groupMemberSchema),
63
- indexes: [
64
- { fields: ['groupId', 'userId'], unique: true },
65
- ]
68
+ indexes: [{ fields: ["groupId", "userId"], unique: true }],
66
69
  };
67
70
  let GroupMembersTable = (() => {
68
71
  let _classSuper = table_1.Table;
@@ -82,20 +85,26 @@ let GroupMembersTable = (() => {
82
85
  }
83
86
  const me = await (0, users_1.getMe)();
84
87
  if (groupMember.groupId === me.userId) {
85
- throw new Error('Group members cannot be added to personal user contexts');
88
+ throw new Error("Group members cannot be added to personal user contexts");
86
89
  }
87
- const oldGroupMember = groupMember.groupMemberId ? await this.get(groupMember.groupMemberId) : undefined;
90
+ const oldGroupMember = groupMember.groupMemberId
91
+ ? await this.get(groupMember.groupMemberId)
92
+ : undefined;
88
93
  if (await (0, group_permissions_1.isGroupMemberSignatureValid)(groupMember.groupId, groupMember, oldGroupMember)) {
89
94
  return super.save(groupMember, opts);
90
95
  }
91
- throw new Error('Group member signature is not valid');
96
+ throw new Error("Group member signature is not valid");
92
97
  }
93
98
  async signAndSave(groupMember, opts) {
94
99
  if (!GroupMembersTable.addSignatureToGroupMember) {
95
- throw new Error('Group member signing must be enabled to sign and save group members. Call GroupMembersTable.enableGroupMemberSigning(fn) to enable it.');
100
+ throw new Error("Group member signing must be enabled to sign and save group members. Call GroupMembersTable.enableGroupMemberSigning(fn) to enable it.");
96
101
  }
97
102
  groupMember = GroupMembersTable.addSignatureToGroupMember(groupMember);
98
- return this.save(groupMember, { saveAsSnapshot: true, restoreIfDeleted: true, ...(opts || {}) });
103
+ return this.save(groupMember, {
104
+ saveAsSnapshot: true,
105
+ restoreIfDeleted: true,
106
+ ...(opts || {}),
107
+ });
99
108
  }
100
109
  async delete(groupMemberId) {
101
110
  if (GroupMembersTable.isPassthrough) {
@@ -115,11 +124,11 @@ let GroupMembersTable = (() => {
115
124
  }
116
125
  /** @deprecated Forbidden on GroupsTable; use save() */
117
126
  insert(..._args) {
118
- throw new Error('GroupsTable forbids insert; use save()');
127
+ throw new Error("GroupsTable forbids insert; use save()");
119
128
  }
120
129
  /** @deprecated Forbidden on GroupsTable; use save() */
121
130
  update(..._args) {
122
- throw new Error('GroupsTable forbids update; use save()');
131
+ throw new Error("GroupsTable forbids update; use save()");
123
132
  }
124
133
  constructor() {
125
134
  super(...arguments);
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const keys_1 = require("../keys");
4
4
  const group_permissions_1 = require("./group-permissions");
5
5
  // Test the group members signature logic directly without ORM dependencies
6
- describe('Group Members Signature Logic', () => {
6
+ describe("Group Members Signature Logic", () => {
7
7
  let testGroupMember;
8
8
  let ownerKeys;
9
9
  let adminKeys;
@@ -11,57 +11,57 @@ describe('Group Members Signature Logic', () => {
11
11
  ownerKeys = (0, keys_1.newKeys)();
12
12
  adminKeys = (0, keys_1.newKeys)();
13
13
  testGroupMember = {
14
- groupMemberId: 'test-member-1',
15
- groupId: 'test-group-1',
16
- userId: 'test-user-1',
14
+ groupMemberId: "test-member-1",
15
+ groupId: "test-group-1",
16
+ userId: "test-user-1",
17
17
  role: group_permissions_1.GroupMemberRole.Reader,
18
- signature: ''
18
+ signature: "",
19
19
  };
20
20
  });
21
- describe('basic signature functionality', () => {
22
- it('should add signature to group member object', () => {
21
+ describe("basic signature functionality", () => {
22
+ it("should add signature to group member object", () => {
23
23
  const signedGroupMember = (0, keys_1.addSignatureToObject)(testGroupMember, ownerKeys.secretKey);
24
24
  expect(signedGroupMember.signature).toBeTruthy();
25
- expect(signedGroupMember.signature).toContain(':');
25
+ expect(signedGroupMember.signature).toContain(":");
26
26
  expect(signedGroupMember.groupId).toBe(testGroupMember.groupId);
27
27
  expect(signedGroupMember.userId).toBe(testGroupMember.userId);
28
28
  expect(signedGroupMember.role).toBe(testGroupMember.role);
29
29
  });
30
- it('should verify valid signature', () => {
30
+ it("should verify valid signature", () => {
31
31
  const signedGroupMember = (0, keys_1.addSignatureToObject)(testGroupMember, ownerKeys.secretKey);
32
32
  const isValid = (0, keys_1.isObjectSignatureValid)(signedGroupMember);
33
33
  expect(isValid).toBe(true);
34
34
  });
35
- it('should reject invalid signature after modification', () => {
35
+ it("should reject invalid signature after modification", () => {
36
36
  const signedGroupMember = (0, keys_1.addSignatureToObject)(testGroupMember, ownerKeys.secretKey);
37
37
  // Modify the group member after signing
38
38
  signedGroupMember.role = group_permissions_1.GroupMemberRole.Admin;
39
39
  const isValid = (0, keys_1.isObjectSignatureValid)(signedGroupMember);
40
40
  expect(isValid).toBe(false);
41
41
  });
42
- it('should extract correct public key from signature', () => {
42
+ it("should extract correct public key from signature", () => {
43
43
  const signedGroupMember = (0, keys_1.addSignatureToObject)(testGroupMember, ownerKeys.secretKey);
44
44
  const extractedKey = (0, keys_1.getPublicKeyFromObjectSignature)(signedGroupMember);
45
45
  expect(extractedKey).toBe(ownerKeys.publicKey);
46
46
  });
47
47
  });
48
- describe('permission validation with group context', () => {
48
+ describe("permission validation with group context", () => {
49
49
  // Note: These tests use basic signature verification since the new permission system
50
50
  // requires actual user/group data context which isn't available in unit tests
51
- it('should allow owner to add any role', () => {
51
+ it("should allow owner to add any role", () => {
52
52
  const memberWithAdminRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
53
53
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithAdminRole, ownerKeys.secretKey);
54
54
  expect(signedMember.signature).toBeTruthy();
55
55
  expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Admin);
56
56
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
57
57
  });
58
- it('should allow admin to add non-admin roles', () => {
58
+ it("should allow admin to add non-admin roles", () => {
59
59
  const signedMember = (0, keys_1.addSignatureToObject)(testGroupMember, adminKeys.secretKey);
60
60
  expect(signedMember.signature).toBeTruthy();
61
61
  expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Reader);
62
62
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
63
63
  });
64
- it('should allow admin to assign admin roles', () => {
64
+ it("should allow admin to assign admin roles", () => {
65
65
  const memberWithAdminRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
66
66
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithAdminRole, adminKeys.secretKey);
67
67
  expect(signedMember.signature).toBeTruthy();
@@ -69,125 +69,125 @@ describe('Group Members Signature Logic', () => {
69
69
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
70
70
  });
71
71
  });
72
- describe('role assignment rules', () => {
72
+ describe("role assignment rules", () => {
73
73
  // Note: These tests focus on basic signature functionality since the new permission system
74
74
  // requires actual user/group data context for role-based validation
75
- it('should allow signing owner role', () => {
75
+ it("should allow signing owner role", () => {
76
76
  const memberWithOwnerRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Owner };
77
77
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithOwnerRole, ownerKeys.secretKey);
78
78
  expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Owner);
79
79
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
80
80
  });
81
- it('should allow signing founder role', () => {
81
+ it("should allow signing founder role", () => {
82
82
  const memberWithFounderRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Founder };
83
83
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithFounderRole, ownerKeys.secretKey);
84
84
  expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Founder);
85
85
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
86
86
  });
87
- it('should allow signing writer role', () => {
87
+ it("should allow signing writer role", () => {
88
88
  const memberWithWriterRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Writer };
89
89
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithWriterRole, adminKeys.secretKey);
90
90
  expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Writer);
91
91
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
92
92
  });
93
- it('should allow setting role to None (blocking user)', () => {
93
+ it("should allow setting role to None (blocking user)", () => {
94
94
  const memberWithNoneRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.None };
95
95
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithNoneRole, adminKeys.secretKey);
96
96
  expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.None);
97
97
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
98
98
  });
99
- it('should handle role modifications with signatures', () => {
99
+ it("should handle role modifications with signatures", () => {
100
100
  const demotedToWriter = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Writer };
101
101
  const signedMember = (0, keys_1.addSignatureToObject)(demotedToWriter, adminKeys.secretKey);
102
102
  expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Writer);
103
103
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
104
104
  });
105
105
  });
106
- describe('signature tampering detection', () => {
107
- it('should detect tampered signature', () => {
106
+ describe("signature tampering detection", () => {
107
+ it("should detect tampered signature", () => {
108
108
  const signedMember = (0, keys_1.addSignatureToObject)(testGroupMember, ownerKeys.secretKey);
109
109
  // Tamper with signature by adding extra characters
110
- signedMember.signature = signedMember.signature + 'tampered';
110
+ signedMember.signature = `${signedMember.signature}tampered`;
111
111
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(false);
112
112
  });
113
- it('should detect empty signature', () => {
114
- testGroupMember.signature = '';
113
+ it("should detect empty signature", () => {
114
+ testGroupMember.signature = "";
115
115
  expect((0, keys_1.isObjectSignatureValid)(testGroupMember)).toBe(false);
116
116
  });
117
- it('should detect malformed signature', () => {
118
- testGroupMember.signature = 'malformed-signature';
117
+ it("should detect malformed signature", () => {
118
+ testGroupMember.signature = "malformed-signature";
119
119
  expect((0, keys_1.isObjectSignatureValid)(testGroupMember)).toBe(false);
120
120
  });
121
- it('should handle signature without colon separator', () => {
122
- testGroupMember.signature = 'noseparator';
121
+ it("should handle signature without colon separator", () => {
122
+ testGroupMember.signature = "noseparator";
123
123
  expect((0, keys_1.isObjectSignatureValid)(testGroupMember)).toBe(false);
124
124
  expect((0, keys_1.getPublicKeyFromObjectSignature)(testGroupMember)).toBeUndefined();
125
125
  });
126
126
  });
127
- describe('complex group member objects', () => {
128
- it('should handle all role types', () => {
127
+ describe("complex group member objects", () => {
128
+ it("should handle all role types", () => {
129
129
  const roles = [
130
130
  group_permissions_1.GroupMemberRole.None,
131
131
  group_permissions_1.GroupMemberRole.Reader,
132
132
  group_permissions_1.GroupMemberRole.Writer,
133
133
  group_permissions_1.GroupMemberRole.Admin,
134
134
  group_permissions_1.GroupMemberRole.Owner,
135
- group_permissions_1.GroupMemberRole.Founder
135
+ group_permissions_1.GroupMemberRole.Founder,
136
136
  ];
137
- roles.forEach(role => {
137
+ roles.forEach((role) => {
138
138
  const member = { ...testGroupMember, role };
139
139
  const signedMember = (0, keys_1.addSignatureToObject)(member, ownerKeys.secretKey);
140
140
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
141
141
  expect(signedMember.role).toBe(role);
142
142
  });
143
143
  });
144
- it('should handle different user and group IDs', () => {
144
+ it("should handle different user and group IDs", () => {
145
145
  const memberWithDifferentIds = {
146
146
  ...testGroupMember,
147
- groupMemberId: 'member-123',
148
- groupId: 'group-456',
149
- userId: 'user-789'
147
+ groupMemberId: "member-123",
148
+ groupId: "group-456",
149
+ userId: "user-789",
150
150
  };
151
151
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithDifferentIds, ownerKeys.secretKey);
152
152
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
153
- expect(signedMember.groupMemberId).toBe('member-123');
154
- expect(signedMember.groupId).toBe('group-456');
155
- expect(signedMember.userId).toBe('user-789');
153
+ expect(signedMember.groupMemberId).toBe("member-123");
154
+ expect(signedMember.groupId).toBe("group-456");
155
+ expect(signedMember.userId).toBe("user-789");
156
156
  });
157
157
  });
158
- describe('edge cases', () => {
159
- it('should handle long IDs', () => {
158
+ describe("edge cases", () => {
159
+ it("should handle long IDs", () => {
160
160
  const memberWithLongIds = {
161
161
  ...testGroupMember,
162
- groupMemberId: 'A'.repeat(1000),
163
- groupId: 'B'.repeat(1000),
164
- userId: 'C'.repeat(1000)
162
+ groupMemberId: "A".repeat(1000),
163
+ groupId: "B".repeat(1000),
164
+ userId: "C".repeat(1000),
165
165
  };
166
166
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithLongIds, ownerKeys.secretKey);
167
167
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
168
168
  });
169
- it('should handle special characters in IDs', () => {
169
+ it("should handle special characters in IDs", () => {
170
170
  const memberWithSpecialIds = {
171
171
  ...testGroupMember,
172
- groupMemberId: 'member-🚀-test',
172
+ groupMemberId: "member-🚀-test",
173
173
  groupId: 'group-"with"-quotes',
174
- userId: 'user\nwith\nnewlines'
174
+ userId: "user\nwith\nnewlines",
175
175
  };
176
176
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithSpecialIds, ownerKeys.secretKey);
177
177
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
178
- expect(signedMember.groupMemberId).toContain('🚀');
178
+ expect(signedMember.groupMemberId).toContain("🚀");
179
179
  });
180
- it('should handle empty string IDs', () => {
180
+ it("should handle empty string IDs", () => {
181
181
  const memberWithEmptyIds = {
182
182
  ...testGroupMember,
183
- groupMemberId: '',
184
- groupId: '',
185
- userId: ''
183
+ groupMemberId: "",
184
+ groupId: "",
185
+ userId: "",
186
186
  };
187
187
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithEmptyIds, ownerKeys.secretKey);
188
188
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
189
189
  });
190
- it('should handle modification of existing group member', () => {
190
+ it("should handle modification of existing group member", () => {
191
191
  const originalMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Reader };
192
192
  const modifiedMember = { ...originalMember, role: group_permissions_1.GroupMemberRole.Writer };
193
193
  const signedMember = (0, keys_1.addSignatureToObject)(modifiedMember, adminKeys.secretKey);
@@ -195,17 +195,17 @@ describe('Group Members Signature Logic', () => {
195
195
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
196
196
  });
197
197
  });
198
- describe('permission functions with role override', () => {
198
+ describe("permission functions with role override", () => {
199
199
  // Use the optional signerRole parameter to avoid mocking complexity
200
- describe('signGroupMemberObject', () => {
201
- it('should allow admin to sign group member', async () => {
200
+ describe("signGroupMemberObject", () => {
201
+ it("should allow admin to sign group member", async () => {
202
202
  const memberToSign = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Writer };
203
203
  const signedMember = await (0, keys_1.addSignatureToObject)(memberToSign, adminKeys.secretKey);
204
204
  expect(signedMember.signature).toBeTruthy();
205
205
  expect(signedMember.role).toBe(group_permissions_1.GroupMemberRole.Writer);
206
206
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
207
207
  });
208
- it('should allow owner to sign group member', async () => {
208
+ it("should allow owner to sign group member", async () => {
209
209
  const memberToSign = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
210
210
  const signedMember = await (0, keys_1.addSignatureToObject)(memberToSign, ownerKeys.secretKey);
211
211
  expect(signedMember.signature).toBeTruthy();
@@ -213,60 +213,60 @@ describe('Group Members Signature Logic', () => {
213
213
  expect((0, keys_1.isObjectSignatureValid)(signedMember)).toBe(true);
214
214
  });
215
215
  });
216
- describe('verifyGroupMemberSignature with role override', () => {
217
- it('should verify valid signature with admin signer role', async () => {
216
+ describe("verifyGroupMemberSignature with role override", () => {
217
+ it("should verify valid signature with admin signer role", async () => {
218
218
  const signedMember = (0, keys_1.addSignatureToObject)(testGroupMember, adminKeys.secretKey);
219
219
  const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(testGroupMember.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Admin);
220
220
  expect(isValid).toBe(true);
221
221
  });
222
- it('should verify valid signature with owner signer role', async () => {
222
+ it("should verify valid signature with owner signer role", async () => {
223
223
  const memberWithAdminRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
224
224
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithAdminRole, ownerKeys.secretKey);
225
225
  const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(memberWithAdminRole.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Owner);
226
226
  expect(isValid).toBe(true);
227
227
  });
228
- it('should reject when signer role is below admin', async () => {
228
+ it("should reject when signer role is below admin", async () => {
229
229
  const signedMember = (0, keys_1.addSignatureToObject)(testGroupMember, adminKeys.secretKey);
230
230
  const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(testGroupMember.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Writer);
231
231
  expect(isValid).toBe(false);
232
232
  });
233
- it('should reject when signer role is below new member role', async () => {
233
+ it("should reject when signer role is below new member role", async () => {
234
234
  const memberWithOwnerRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Owner };
235
235
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithOwnerRole, adminKeys.secretKey);
236
236
  const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(memberWithOwnerRole.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Admin);
237
237
  expect(isValid).toBe(false);
238
238
  });
239
- it('should reject when signer role is below old member role', async () => {
239
+ it("should reject when signer role is below old member role", async () => {
240
240
  const oldMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Owner };
241
241
  const newMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Writer };
242
242
  const signedNewMember = (0, keys_1.addSignatureToObject)(newMember, adminKeys.secretKey);
243
243
  const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(newMember.groupId, signedNewMember, oldMember, group_permissions_1.GroupMemberRole.Admin);
244
244
  expect(isValid).toBe(false);
245
245
  });
246
- it('should allow admin to modify reader role', async () => {
246
+ it("should allow admin to modify reader role", async () => {
247
247
  const memberWithReaderRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Reader };
248
248
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithReaderRole, adminKeys.secretKey);
249
249
  const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(memberWithReaderRole.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Admin);
250
250
  expect(isValid).toBe(true);
251
251
  });
252
- it('should allow owner to modify admin role', async () => {
252
+ it("should allow owner to modify admin role", async () => {
253
253
  const memberWithAdminRole = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
254
254
  const signedMember = (0, keys_1.addSignatureToObject)(memberWithAdminRole, ownerKeys.secretKey);
255
255
  const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(memberWithAdminRole.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Owner);
256
256
  expect(isValid).toBe(true);
257
257
  });
258
- it('should reject invalid signature', async () => {
258
+ it("should reject invalid signature", async () => {
259
259
  const signedMember = (0, keys_1.addSignatureToObject)(testGroupMember, adminKeys.secretKey);
260
- signedMember.signature = 'invalid-signature';
260
+ signedMember.signature = "invalid-signature";
261
261
  const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(testGroupMember.groupId, signedMember, undefined, group_permissions_1.GroupMemberRole.Admin);
262
262
  expect(isValid).toBe(false);
263
263
  });
264
- it('should reject when signature is missing', async () => {
265
- const memberWithoutSignature = { ...testGroupMember, signature: '' };
264
+ it("should reject when signature is missing", async () => {
265
+ const memberWithoutSignature = { ...testGroupMember, signature: "" };
266
266
  const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(testGroupMember.groupId, memberWithoutSignature, undefined, group_permissions_1.GroupMemberRole.Admin);
267
267
  expect(isValid).toBe(false);
268
268
  });
269
- it('should handle role modifications correctly', async () => {
269
+ it("should handle role modifications correctly", async () => {
270
270
  const oldMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Writer };
271
271
  const newMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
272
272
  const signedNewMember = (0, keys_1.addSignatureToObject)(newMember, ownerKeys.secretKey);
@@ -274,7 +274,7 @@ describe('Group Members Signature Logic', () => {
274
274
  const isValid = await (0, group_permissions_1.isGroupMemberSignatureValid)(newMember.groupId, signedNewMember, oldMember, group_permissions_1.GroupMemberRole.Owner);
275
275
  expect(isValid).toBe(true);
276
276
  });
277
- it('should handle role demotion correctly', async () => {
277
+ it("should handle role demotion correctly", async () => {
278
278
  const oldMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Admin };
279
279
  const newMember = { ...testGroupMember, role: group_permissions_1.GroupMemberRole.Writer };
280
280
  const signedNewMember = (0, keys_1.addSignatureToObject)(newMember, ownerKeys.secretKey);
@@ -1,6 +1,6 @@
1
- import { GroupMemberRole } from './group-member-roles';
2
- import type { IGroupMember } from './group-members';
3
- import type { IGroup } from './groups';
1
+ import { GroupMemberRole } from "./group-member-roles";
2
+ import type { IGroupMember } from "./group-members";
3
+ import type { IGroup } from "./groups";
4
4
  export { GroupMemberRole };
5
5
  export declare function getUserRole(groupId: string, userId: string): Promise<GroupMemberRole>;
6
6
  export declare function getUserRoleFromPublicKey(groupId: string, publicKey: string): Promise<GroupMemberRole>;
@@ -10,12 +10,12 @@ const keys_1 = require("../keys");
10
10
  const group_member_roles_1 = require("./group-member-roles");
11
11
  Object.defineProperty(exports, "GroupMemberRole", { enumerable: true, get: function () { return group_member_roles_1.GroupMemberRole; } });
12
12
  async function getUserRole(groupId, userId) {
13
- const { Groups } = await Promise.resolve().then(() => require('./groups'));
14
- const { GroupMembers } = await Promise.resolve().then(() => require('./group-members'));
13
+ const { Groups } = await Promise.resolve().then(() => require("./groups"));
14
+ const { GroupMembers } = await Promise.resolve().then(() => require("./group-members"));
15
15
  const userContext = await (0, context_1.getUserContext)();
16
16
  const groupDataContext = userContext.getDataContext(groupId);
17
- const group = await Groups(groupDataContext).get(groupId)
18
- || await Groups(userContext.userDataContext).get(groupId);
17
+ const group = (await Groups(groupDataContext).get(groupId)) ||
18
+ (await Groups(userContext.userDataContext).get(groupId));
19
19
  // If the group doesn't exist or the current user is explicitly the founder, return Founder role
20
20
  if (!group || group.founderUserId === userId) {
21
21
  return group_member_roles_1.GroupMemberRole.Founder;
@@ -27,11 +27,11 @@ async function getUserRole(groupId, userId) {
27
27
  return group.publicRole || group_member_roles_1.GroupMemberRole.None;
28
28
  }
29
29
  async function getUserRoleFromPublicKey(groupId, publicKey) {
30
- const { Users } = await Promise.resolve().then(() => require('./users'));
30
+ const { Users } = await Promise.resolve().then(() => require("./users"));
31
31
  const userContext = await (0, context_1.getUserContext)();
32
32
  const groupDataContext = userContext.getDataContext(groupId);
33
- const user = await Users(groupDataContext).findOne({ publicKey })
34
- || await Users(userContext.userDataContext).findOne({ publicKey });
33
+ const user = (await Users(groupDataContext).findOne({ publicKey })) ||
34
+ (await Users(userContext.userDataContext).findOne({ publicKey }));
35
35
  if (user) {
36
36
  return getUserRole(groupId, user?.userId);
37
37
  }
@@ -39,13 +39,15 @@ async function getUserRoleFromPublicKey(groupId, publicKey) {
39
39
  }
40
40
  async function verifyGroupSignature(group, oldGroup) {
41
41
  (0, keys_1.verifyObjectSignature)(group);
42
- const publicKey = (0, keys_1.getPublicKeyFromObjectSignature)(group) ?? '';
42
+ const publicKey = (0, keys_1.getPublicKeyFromObjectSignature)(group) ?? "";
43
43
  const signerRole = await getUserRoleFromPublicKey(group.groupId, publicKey);
44
- if (oldGroup && oldGroup.founderUserId !== group.founderUserId && signerRole < group_member_roles_1.GroupMemberRole.Founder) {
45
- throw new Error('Only group founders can change the founder of the group');
44
+ if (oldGroup &&
45
+ oldGroup.founderUserId !== group.founderUserId &&
46
+ signerRole < group_member_roles_1.GroupMemberRole.Founder) {
47
+ throw new Error("Only group founders can change the founder of the group");
46
48
  }
47
49
  if (signerRole < group_member_roles_1.GroupMemberRole.Admin) {
48
- throw new Error('Only group admins can modify group settings');
50
+ throw new Error("Only group admins can modify group settings");
49
51
  }
50
52
  }
51
53
  async function isGroupMemberSignatureValid(groupId, newGroupMember, oldGroupMember, signerRole) {
@@ -1,5 +1,5 @@
1
- import { IGroupMember } from './group-members';
2
- import { IGroup } from './groups';
1
+ import { type IGroupMember } from "./group-members";
2
+ import { type IGroup } from "./groups";
3
3
  /**
4
4
  * Interface representing a shareable group with admin+ members
5
5
  */