@nocobase/plugin-notification-in-app-message 2.1.0-beta.12 → 2.1.0-beta.14

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 (100) hide show
  1. package/dist/client/index.js +1 -1
  2. package/dist/externalVersion.js +9 -11
  3. package/dist/node_modules/uuid/dist/bin/uuid +2 -0
  4. package/dist/node_modules/uuid/dist/commonjs-browser/index.js +104 -0
  5. package/dist/node_modules/uuid/dist/commonjs-browser/max.js +7 -0
  6. package/dist/node_modules/uuid/dist/commonjs-browser/md5.js +200 -0
  7. package/dist/node_modules/uuid/dist/commonjs-browser/native.js +10 -0
  8. package/dist/node_modules/uuid/dist/commonjs-browser/nil.js +7 -0
  9. package/dist/node_modules/uuid/dist/commonjs-browser/parse.js +44 -0
  10. package/dist/node_modules/uuid/dist/commonjs-browser/regex.js +7 -0
  11. package/dist/node_modules/uuid/dist/commonjs-browser/rng.js +23 -0
  12. package/dist/node_modules/uuid/dist/commonjs-browser/sha1.js +82 -0
  13. package/dist/node_modules/uuid/dist/commonjs-browser/stringify.js +38 -0
  14. package/dist/node_modules/uuid/dist/commonjs-browser/v1.js +131 -0
  15. package/dist/node_modules/uuid/dist/commonjs-browser/v1ToV6.js +26 -0
  16. package/dist/node_modules/uuid/dist/commonjs-browser/v3.js +11 -0
  17. package/dist/node_modules/uuid/dist/commonjs-browser/v35.js +63 -0
  18. package/dist/node_modules/uuid/dist/commonjs-browser/v4.js +32 -0
  19. package/dist/node_modules/uuid/dist/commonjs-browser/v5.js +11 -0
  20. package/dist/node_modules/uuid/dist/commonjs-browser/v6.js +42 -0
  21. package/dist/node_modules/uuid/dist/commonjs-browser/v6ToV1.js +26 -0
  22. package/dist/node_modules/uuid/dist/commonjs-browser/v7.js +152 -0
  23. package/dist/node_modules/uuid/dist/commonjs-browser/validate.js +12 -0
  24. package/dist/node_modules/uuid/dist/commonjs-browser/version.js +15 -0
  25. package/dist/node_modules/uuid/dist/esm-browser/index.js +14 -0
  26. package/dist/node_modules/uuid/dist/esm-browser/max.js +1 -0
  27. package/dist/node_modules/uuid/dist/esm-browser/md5.js +194 -0
  28. package/dist/node_modules/uuid/dist/esm-browser/native.js +4 -0
  29. package/dist/node_modules/uuid/dist/esm-browser/nil.js +1 -0
  30. package/dist/node_modules/uuid/dist/esm-browser/parse.js +37 -0
  31. package/dist/node_modules/uuid/dist/esm-browser/regex.js +1 -0
  32. package/dist/node_modules/uuid/dist/esm-browser/rng.js +17 -0
  33. package/dist/node_modules/uuid/dist/esm-browser/sha1.js +76 -0
  34. package/dist/node_modules/uuid/dist/esm-browser/stringify.js +31 -0
  35. package/dist/node_modules/uuid/dist/esm-browser/v1.js +125 -0
  36. package/dist/node_modules/uuid/dist/esm-browser/v1ToV6.js +20 -0
  37. package/dist/node_modules/uuid/dist/esm-browser/v3.js +4 -0
  38. package/dist/node_modules/uuid/dist/esm-browser/v35.js +55 -0
  39. package/dist/node_modules/uuid/dist/esm-browser/v4.js +25 -0
  40. package/dist/node_modules/uuid/dist/esm-browser/v5.js +4 -0
  41. package/dist/node_modules/uuid/dist/esm-browser/v6.js +36 -0
  42. package/dist/node_modules/uuid/dist/esm-browser/v6ToV1.js +20 -0
  43. package/dist/node_modules/uuid/dist/esm-browser/v7.js +146 -0
  44. package/dist/node_modules/uuid/dist/esm-browser/validate.js +5 -0
  45. package/dist/node_modules/uuid/dist/esm-browser/version.js +8 -0
  46. package/dist/node_modules/uuid/dist/esm-node/index.js +14 -0
  47. package/dist/node_modules/uuid/dist/esm-node/max.js +1 -0
  48. package/dist/node_modules/uuid/dist/esm-node/md5.js +10 -0
  49. package/dist/node_modules/uuid/dist/esm-node/native.js +4 -0
  50. package/dist/node_modules/uuid/dist/esm-node/nil.js +1 -0
  51. package/dist/node_modules/uuid/dist/esm-node/parse.js +37 -0
  52. package/dist/node_modules/uuid/dist/esm-node/regex.js +1 -0
  53. package/dist/node_modules/uuid/dist/esm-node/rng.js +10 -0
  54. package/dist/node_modules/uuid/dist/esm-node/sha1.js +10 -0
  55. package/dist/node_modules/uuid/dist/esm-node/stringify.js +31 -0
  56. package/dist/node_modules/uuid/dist/esm-node/v1.js +125 -0
  57. package/dist/node_modules/uuid/dist/esm-node/v1ToV6.js +20 -0
  58. package/dist/node_modules/uuid/dist/esm-node/v3.js +4 -0
  59. package/dist/node_modules/uuid/dist/esm-node/v35.js +55 -0
  60. package/dist/node_modules/uuid/dist/esm-node/v4.js +25 -0
  61. package/dist/node_modules/uuid/dist/esm-node/v5.js +4 -0
  62. package/dist/node_modules/uuid/dist/esm-node/v6.js +32 -0
  63. package/dist/node_modules/uuid/dist/esm-node/v6ToV1.js +20 -0
  64. package/dist/node_modules/uuid/dist/esm-node/v7.js +146 -0
  65. package/dist/node_modules/uuid/dist/esm-node/validate.js +5 -0
  66. package/dist/node_modules/uuid/dist/esm-node/version.js +8 -0
  67. package/dist/node_modules/uuid/dist/index.js +1 -0
  68. package/dist/node_modules/uuid/dist/max.js +7 -0
  69. package/dist/node_modules/uuid/dist/md5-browser.js +200 -0
  70. package/dist/node_modules/uuid/dist/md5.js +17 -0
  71. package/dist/node_modules/uuid/dist/native-browser.js +10 -0
  72. package/dist/node_modules/uuid/dist/native.js +11 -0
  73. package/dist/node_modules/uuid/dist/nil.js +7 -0
  74. package/dist/node_modules/uuid/dist/parse.js +44 -0
  75. package/dist/node_modules/uuid/dist/regex.js +7 -0
  76. package/dist/node_modules/uuid/dist/rng-browser.js +23 -0
  77. package/dist/node_modules/uuid/dist/rng.js +17 -0
  78. package/dist/node_modules/uuid/dist/sha1-browser.js +82 -0
  79. package/dist/node_modules/uuid/dist/sha1.js +17 -0
  80. package/dist/node_modules/uuid/dist/stringify.js +38 -0
  81. package/dist/node_modules/uuid/dist/uuid-bin.js +75 -0
  82. package/dist/node_modules/uuid/dist/v1.js +131 -0
  83. package/dist/node_modules/uuid/dist/v1ToV6.js +26 -0
  84. package/dist/node_modules/uuid/dist/v3.js +11 -0
  85. package/dist/node_modules/uuid/dist/v35.js +63 -0
  86. package/dist/node_modules/uuid/dist/v4.js +32 -0
  87. package/dist/node_modules/uuid/dist/v5.js +11 -0
  88. package/dist/node_modules/uuid/dist/v6.js +38 -0
  89. package/dist/node_modules/uuid/dist/v6ToV1.js +26 -0
  90. package/dist/node_modules/uuid/dist/v7.js +152 -0
  91. package/dist/node_modules/uuid/dist/validate.js +12 -0
  92. package/dist/node_modules/uuid/dist/version.js +15 -0
  93. package/dist/node_modules/uuid/package.json +1 -0
  94. package/dist/server/InAppNotificationChannel.d.ts +5 -0
  95. package/dist/server/InAppNotificationChannel.js +92 -34
  96. package/dist/server/parseUserSelectionConf.d.ts +2 -1
  97. package/dist/server/parseUserSelectionConf.js +3 -2
  98. package/package.json +3 -2
  99. package/dist/client/components/UsersAddition.d.ts +0 -10
  100. package/dist/client/components/UsersSelect.d.ts +0 -18
@@ -40,11 +40,61 @@ __export(InAppNotificationChannel_exports, {
40
40
  });
41
41
  module.exports = __toCommonJS(InAppNotificationChannel_exports);
42
42
  var import_plugin_notification_manager = require("@nocobase/plugin-notification-manager");
43
+ var import_uuid = require("uuid");
43
44
  var import_types2 = require("../types");
44
45
  var import_parseUserSelectionConf = require("./parseUserSelectionConf");
45
46
  var import_defineMyInAppMessages = __toESM(require("./defineMyInAppMessages"));
46
47
  var import_defineMyInAppChannels = __toESM(require("./defineMyInAppChannels"));
47
48
  class InAppNotificationChannel extends import_plugin_notification_manager.BaseNotificationChannel {
49
+ static SLOW_SEND_THRESHOLD_MS = 200;
50
+ getMessagePayload(message) {
51
+ return typeof (message == null ? void 0 : message.toJSON) === "function" ? message.toJSON() : message;
52
+ }
53
+ emitMessageEventsAsync(type, messages) {
54
+ setImmediate(() => {
55
+ try {
56
+ const startedAt = Date.now();
57
+ this.emitMessageEvents(type, messages);
58
+ const elapsed = Date.now() - startedAt;
59
+ if (elapsed >= InAppNotificationChannel.SLOW_SEND_THRESHOLD_MS) {
60
+ this.app.logger.warn("in-app notification websocket dispatch is slow", {
61
+ type,
62
+ count: messages.length,
63
+ elapsed
64
+ });
65
+ }
66
+ } catch (error) {
67
+ this.app.logger.error(`failed to emit in-app message events: ${error.message}`, {
68
+ error,
69
+ type,
70
+ count: messages.length
71
+ });
72
+ }
73
+ });
74
+ }
75
+ scheduleMessageEvents(type, messages, transaction) {
76
+ if (!messages.length) {
77
+ return;
78
+ }
79
+ if (transaction == null ? void 0 : transaction.afterCommit) {
80
+ transaction.afterCommit(() => {
81
+ this.emitMessageEventsAsync(type, messages);
82
+ });
83
+ return;
84
+ }
85
+ this.emitMessageEventsAsync(type, messages);
86
+ }
87
+ emitMessageEvents(type, messages) {
88
+ for (const message of messages) {
89
+ this.app.emit("ws:sendToUser", {
90
+ userId: message.userId,
91
+ message: {
92
+ type: `in-app-message:${type}`,
93
+ payload: message
94
+ }
95
+ });
96
+ }
97
+ }
48
98
  async load() {
49
99
  this.app.db.on(`${import_types2.InAppMessagesDefinition.name}.afterCreate`, this.onMessageCreated);
50
100
  this.app.db.on(`${import_types2.InAppMessagesDefinition.name}.afterBulkCreate`, this.onMessageCreated);
@@ -53,53 +103,61 @@ class InAppNotificationChannel extends import_plugin_notification_manager.BaseNo
53
103
  this.defineActions();
54
104
  }
55
105
  onMessageCreated = async (model, options) => {
56
- const models = Array.isArray(model) ? model : [model];
57
- for (const m of models) {
58
- const userId = m.userId;
59
- this.app.emit("ws:sendToUser", {
60
- userId,
61
- message: {
62
- type: "in-app-message:created",
63
- payload: m.toJSON()
64
- }
65
- });
66
- }
106
+ const messages = (Array.isArray(model) ? model : [model]).map((item) => this.getMessagePayload(item));
107
+ this.scheduleMessageEvents("created", messages, options == null ? void 0 : options.transaction);
67
108
  };
68
109
  onMessageUpdated = async (model, options) => {
69
- const models = Array.isArray(model) ? model : [model];
70
- for (const m of models) {
71
- const userId = m.userId;
72
- this.app.emit("ws:sendToUser", {
73
- userId,
74
- message: {
75
- type: "in-app-message:updated",
76
- payload: m.toJSON()
77
- }
78
- });
79
- }
110
+ const messages = (Array.isArray(model) ? model : [model]).map((item) => this.getMessagePayload(item));
111
+ this.scheduleMessageEvents("updated", messages, options == null ? void 0 : options.transaction);
80
112
  };
81
113
  send = async (params) => {
82
- const { channel, message, receivers } = params;
114
+ const startedAt = Date.now();
115
+ const { channel, message, receivers, transaction } = params;
83
116
  let userIds;
84
117
  const { content, title, options = {} } = message;
85
118
  const userRepo = this.app.db.getRepository("users");
119
+ const resolveReceiversStartedAt = Date.now();
86
120
  if ((receivers == null ? void 0 : receivers.type) === "userId") {
87
121
  userIds = receivers.value;
88
122
  } else {
89
- userIds = (await (0, import_parseUserSelectionConf.parseUserSelectionConf)(message.receivers, userRepo)).map((i) => parseInt(i));
123
+ userIds = (await (0, import_parseUserSelectionConf.parseUserSelectionConf)(message.receivers, userRepo, { transaction })).map((i) => parseInt(i));
90
124
  }
125
+ const resolveReceiversMs = Date.now() - resolveReceiversStartedAt;
126
+ const uniqueUserIds = [...new Set(userIds)];
127
+ if (!uniqueUserIds.length) {
128
+ return { status: "success", message };
129
+ }
130
+ const receiveTimestamp = Date.now();
131
+ const messages = uniqueUserIds.map((userId) => ({
132
+ id: (0, import_uuid.v4)(),
133
+ title,
134
+ content,
135
+ status: "unread",
136
+ userId,
137
+ channelName: channel.name,
138
+ receiveTimestamp,
139
+ options
140
+ }));
91
141
  const MessageModel = this.app.db.getModel(import_types2.InAppMessagesDefinition.name);
92
- await MessageModel.bulkCreate(
93
- userIds.map((userId) => ({
94
- title,
95
- content,
96
- status: "unread",
97
- userId,
142
+ const persistStartedAt = Date.now();
143
+ await MessageModel.bulkCreate(messages, {
144
+ hooks: false,
145
+ transaction,
146
+ validate: false,
147
+ returning: false
148
+ });
149
+ const persistMs = Date.now() - persistStartedAt;
150
+ this.scheduleMessageEvents("created", messages, transaction);
151
+ const totalMs = Date.now() - startedAt;
152
+ if (totalMs >= InAppNotificationChannel.SLOW_SEND_THRESHOLD_MS) {
153
+ this.app.logger.warn("in-app notification send is slow", {
98
154
  channelName: channel.name,
99
- receiveTimestamp: Date.now(),
100
- options
101
- }))
102
- );
155
+ userCount: messages.length,
156
+ resolveReceiversMs,
157
+ persistMs,
158
+ totalMs
159
+ });
160
+ }
103
161
  return { status: "success", message };
104
162
  };
105
163
  defineActions() {
@@ -6,5 +6,6 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
+ import { Transactionable } from '@nocobase/database';
9
10
  import { Repository } from '@nocobase/database';
10
- export declare function parseUserSelectionConf(userSelectionConfig: Array<Record<any, any> | string>, UserRepo: Repository): Promise<string[]>;
11
+ export declare function parseUserSelectionConf(userSelectionConfig: Array<Record<any, any> | string>, UserRepo: Repository, options?: Transactionable): Promise<string[]>;
@@ -30,7 +30,7 @@ __export(parseUserSelectionConf_exports, {
30
30
  });
31
31
  module.exports = __toCommonJS(parseUserSelectionConf_exports);
32
32
  var import_utils = require("@nocobase/utils");
33
- async function parseUserSelectionConf(userSelectionConfig, UserRepo) {
33
+ async function parseUserSelectionConf(userSelectionConfig, UserRepo, options = {}) {
34
34
  const SelectionConfigs = userSelectionConfig.flat().filter(Boolean);
35
35
  const users = /* @__PURE__ */ new Set();
36
36
  for (const item of SelectionConfigs) {
@@ -40,7 +40,8 @@ async function parseUserSelectionConf(userSelectionConfig, UserRepo) {
40
40
  }
41
41
  const result = await UserRepo.find({
42
42
  ...item,
43
- fields: ["id"]
43
+ fields: ["id"],
44
+ transaction: options.transaction
44
45
  });
45
46
  result.forEach((item2) => users.add(item2.id));
46
47
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/plugin-notification-in-app-message",
3
- "version": "2.1.0-beta.12",
3
+ "version": "2.1.0-beta.14",
4
4
  "displayName": "Notification: In-app message",
5
5
  "displayName.ru-RU": "Уведомления: Всплывающие сообщения внутри приложения",
6
6
  "displayName.zh-CN": "通知:站内信",
@@ -25,10 +25,11 @@
25
25
  "@formily/reactive-react": "^2",
26
26
  "@nocobase/client": "2.x",
27
27
  "@nocobase/plugin-notification-manager": "2.x",
28
+ "@nocobase/plugin-workflow": "2.x",
28
29
  "@nocobase/server": "2.x",
29
30
  "@nocobase/test": "2.x",
30
31
  "react-router-dom": "^6.x"
31
32
  },
32
33
  "license": "Apache-2.0",
33
- "gitHead": "25cee9643f42f850afc4adc33c55a56850ac730d"
34
+ "gitHead": "cd55c9a14596d834c30c83a82c38f1f719f7aac4"
34
35
  }
@@ -1,10 +0,0 @@
1
- /**
2
- * This file is part of the NocoBase (R) project.
3
- * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
- * Authors: NocoBase Team.
5
- *
6
- * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
- * For more information, please refer to: https://www.nocobase.com/agreement.
8
- */
9
- import React from 'react';
10
- export declare function UsersAddition(): React.JSX.Element;
@@ -1,18 +0,0 @@
1
- /**
2
- * This file is part of the NocoBase (R) project.
3
- * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
- * Authors: NocoBase Team.
5
- *
6
- * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
- * For more information, please refer to: https://www.nocobase.com/agreement.
8
- */
9
- /**
10
- * This file is part of the NocoBase (R) project.
11
- * Copyright (c) 2020-2024 NocoBase Co., Ltd.
12
- * Authors: NocoBase Team.
13
- *
14
- * This program is offered under a commercial license.
15
- * For more information, see <https://www.nocobase.com/agreement>
16
- */
17
- import React from 'react';
18
- export declare function UsersSelect(props: any): React.JSX.Element;