@nocobase/plugin-notification-in-app-message 2.1.0-beta.13 → 2.1.0-beta.15
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/client/index.js +1 -1
- package/dist/externalVersion.js +9 -11
- package/dist/node_modules/uuid/dist/bin/uuid +2 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/index.js +104 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/max.js +7 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/md5.js +200 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/native.js +10 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/nil.js +7 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/parse.js +44 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/regex.js +7 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/rng.js +23 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/sha1.js +82 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/stringify.js +38 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/v1.js +131 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/v1ToV6.js +26 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/v3.js +11 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/v35.js +63 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/v4.js +32 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/v5.js +11 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/v6.js +42 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/v6ToV1.js +26 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/v7.js +152 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/validate.js +12 -0
- package/dist/node_modules/uuid/dist/commonjs-browser/version.js +15 -0
- package/dist/node_modules/uuid/dist/esm-browser/index.js +14 -0
- package/dist/node_modules/uuid/dist/esm-browser/max.js +1 -0
- package/dist/node_modules/uuid/dist/esm-browser/md5.js +194 -0
- package/dist/node_modules/uuid/dist/esm-browser/native.js +4 -0
- package/dist/node_modules/uuid/dist/esm-browser/nil.js +1 -0
- package/dist/node_modules/uuid/dist/esm-browser/parse.js +37 -0
- package/dist/node_modules/uuid/dist/esm-browser/regex.js +1 -0
- package/dist/node_modules/uuid/dist/esm-browser/rng.js +17 -0
- package/dist/node_modules/uuid/dist/esm-browser/sha1.js +76 -0
- package/dist/node_modules/uuid/dist/esm-browser/stringify.js +31 -0
- package/dist/node_modules/uuid/dist/esm-browser/v1.js +125 -0
- package/dist/node_modules/uuid/dist/esm-browser/v1ToV6.js +20 -0
- package/dist/node_modules/uuid/dist/esm-browser/v3.js +4 -0
- package/dist/node_modules/uuid/dist/esm-browser/v35.js +55 -0
- package/dist/node_modules/uuid/dist/esm-browser/v4.js +25 -0
- package/dist/node_modules/uuid/dist/esm-browser/v5.js +4 -0
- package/dist/node_modules/uuid/dist/esm-browser/v6.js +36 -0
- package/dist/node_modules/uuid/dist/esm-browser/v6ToV1.js +20 -0
- package/dist/node_modules/uuid/dist/esm-browser/v7.js +146 -0
- package/dist/node_modules/uuid/dist/esm-browser/validate.js +5 -0
- package/dist/node_modules/uuid/dist/esm-browser/version.js +8 -0
- package/dist/node_modules/uuid/dist/esm-node/index.js +14 -0
- package/dist/node_modules/uuid/dist/esm-node/max.js +1 -0
- package/dist/node_modules/uuid/dist/esm-node/md5.js +10 -0
- package/dist/node_modules/uuid/dist/esm-node/native.js +4 -0
- package/dist/node_modules/uuid/dist/esm-node/nil.js +1 -0
- package/dist/node_modules/uuid/dist/esm-node/parse.js +37 -0
- package/dist/node_modules/uuid/dist/esm-node/regex.js +1 -0
- package/dist/node_modules/uuid/dist/esm-node/rng.js +10 -0
- package/dist/node_modules/uuid/dist/esm-node/sha1.js +10 -0
- package/dist/node_modules/uuid/dist/esm-node/stringify.js +31 -0
- package/dist/node_modules/uuid/dist/esm-node/v1.js +125 -0
- package/dist/node_modules/uuid/dist/esm-node/v1ToV6.js +20 -0
- package/dist/node_modules/uuid/dist/esm-node/v3.js +4 -0
- package/dist/node_modules/uuid/dist/esm-node/v35.js +55 -0
- package/dist/node_modules/uuid/dist/esm-node/v4.js +25 -0
- package/dist/node_modules/uuid/dist/esm-node/v5.js +4 -0
- package/dist/node_modules/uuid/dist/esm-node/v6.js +32 -0
- package/dist/node_modules/uuid/dist/esm-node/v6ToV1.js +20 -0
- package/dist/node_modules/uuid/dist/esm-node/v7.js +146 -0
- package/dist/node_modules/uuid/dist/esm-node/validate.js +5 -0
- package/dist/node_modules/uuid/dist/esm-node/version.js +8 -0
- package/dist/node_modules/uuid/dist/index.js +1 -0
- package/dist/node_modules/uuid/dist/max.js +7 -0
- package/dist/node_modules/uuid/dist/md5-browser.js +200 -0
- package/dist/node_modules/uuid/dist/md5.js +17 -0
- package/dist/node_modules/uuid/dist/native-browser.js +10 -0
- package/dist/node_modules/uuid/dist/native.js +11 -0
- package/dist/node_modules/uuid/dist/nil.js +7 -0
- package/dist/node_modules/uuid/dist/parse.js +44 -0
- package/dist/node_modules/uuid/dist/regex.js +7 -0
- package/dist/node_modules/uuid/dist/rng-browser.js +23 -0
- package/dist/node_modules/uuid/dist/rng.js +17 -0
- package/dist/node_modules/uuid/dist/sha1-browser.js +82 -0
- package/dist/node_modules/uuid/dist/sha1.js +17 -0
- package/dist/node_modules/uuid/dist/stringify.js +38 -0
- package/dist/node_modules/uuid/dist/uuid-bin.js +75 -0
- package/dist/node_modules/uuid/dist/v1.js +131 -0
- package/dist/node_modules/uuid/dist/v1ToV6.js +26 -0
- package/dist/node_modules/uuid/dist/v3.js +11 -0
- package/dist/node_modules/uuid/dist/v35.js +63 -0
- package/dist/node_modules/uuid/dist/v4.js +32 -0
- package/dist/node_modules/uuid/dist/v5.js +11 -0
- package/dist/node_modules/uuid/dist/v6.js +38 -0
- package/dist/node_modules/uuid/dist/v6ToV1.js +26 -0
- package/dist/node_modules/uuid/dist/v7.js +152 -0
- package/dist/node_modules/uuid/dist/validate.js +12 -0
- package/dist/node_modules/uuid/dist/version.js +15 -0
- package/dist/node_modules/uuid/package.json +1 -0
- package/dist/server/InAppNotificationChannel.d.ts +5 -0
- package/dist/server/InAppNotificationChannel.js +92 -34
- package/dist/server/parseUserSelectionConf.d.ts +2 -1
- package/dist/server/parseUserSelectionConf.js +3 -2
- package/package.json +3 -2
- package/dist/client/components/UsersAddition.d.ts +0 -10
- 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
|
|
57
|
-
|
|
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
|
|
70
|
-
|
|
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
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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.
|
|
3
|
+
"version": "2.1.0-beta.15",
|
|
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": "
|
|
34
|
+
"gitHead": "dc1aceea6357e6ab149976c2a236fc4b6bee1370"
|
|
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;
|