awing-library 2.1.113 → 2.1.114

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.
@@ -1,5 +1,6 @@
1
1
  declare global {
2
2
  interface Window {
3
+ TOPIC_PREFIX: string;
3
4
  REACT_APP_API_ENDPOINT: string;
4
5
  GOONG_MAP_KEY: string;
5
6
  GOONG_API_KEY: string;
@@ -0,0 +1,17 @@
1
+ import mqtt from 'mqtt';
2
+ import React from 'react';
3
+ export interface IMqttContext {
4
+ client: mqtt.MqttClient;
5
+ isConnected: boolean;
6
+ }
7
+ export declare const MqttContext: React.Context<IMqttContext>;
8
+ export interface MqttProviderProps extends React.PropsWithChildren<{
9
+ userId: string;
10
+ userProfilesGet: () => Promise<void>;
11
+ onError: (fn: (guid: string) => void) => void;
12
+ brokerUrl: string;
13
+ deviceId: string;
14
+ }> {
15
+ }
16
+ declare const MqttProvider: React.FC<MqttProviderProps>;
17
+ export default MqttProvider;
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.MqttContext = void 0;
30
+ var jsx_runtime_1 = require("react/jsx-runtime");
31
+ var mqtt_1 = __importDefault(require("mqtt"));
32
+ var react_1 = __importStar(require("react"));
33
+ exports.MqttContext = (0, react_1.createContext)({
34
+ client: undefined,
35
+ isConnected: false,
36
+ });
37
+ var randomId = Math.random().toString(16).substr(2, 8);
38
+ var MqttProvider = function (_a) {
39
+ var children = _a.children, userId = _a.userId, userProfilesGet = _a.userProfilesGet, onError = _a.onError, brokerUrl = _a.brokerUrl, deviceId = _a.deviceId;
40
+ var _b = react_1.default.useState(randomId), currentGuid = _b[0], setCurrentGuid = _b[1];
41
+ var _c = react_1.default.useState(false), connected = _c[0], setConnected = _c[1];
42
+ onError(setCurrentGuid);
43
+ var options = react_1.default.useMemo(function () {
44
+ var userName = [userId, deviceId, window.CLIENT_ID].join(":");
45
+ return {
46
+ userId: userId,
47
+ clientId: userName + ":" + randomId,
48
+ username: userName,
49
+ clean: true,
50
+ password: '',
51
+ keepalive: 60,
52
+ reconnectPeriod: 2000,
53
+ protocolVersion: 5,
54
+ };
55
+ }, [userId]);
56
+ var client = (0, react_1.useRef)();
57
+ var clientGroupID = localStorage.getItem('clientGroupID');
58
+ if (!clientGroupID) {
59
+ clientGroupID = randomId;
60
+ localStorage.setItem('clientGroupID', clientGroupID);
61
+ }
62
+ (0, react_1.useEffect)(function () {
63
+ var _a, _b;
64
+ if (!userId || ((_a = client.current) === null || _a === void 0 ? void 0 : _a.connected))
65
+ return;
66
+ client.current = mqtt_1.default.connect(brokerUrl, options);
67
+ client.current.on('connect', function () {
68
+ console.log('Connected');
69
+ setConnected(true);
70
+ });
71
+ client.current.on('error', function (err) {
72
+ var isAuthError = err.message.toLocaleLowerCase().includes('not authorized');
73
+ if (isAuthError) {
74
+ userProfilesGet();
75
+ }
76
+ else {
77
+ console.error('Connection Error: ', err);
78
+ }
79
+ });
80
+ client.current.on('offline', function () {
81
+ console.log('is offline');
82
+ });
83
+ if (client.current._reconnectCount > 9) {
84
+ (_b = client.current) === null || _b === void 0 ? void 0 : _b.end();
85
+ }
86
+ return function () {
87
+ var _a;
88
+ (_a = client.current) === null || _a === void 0 ? void 0 : _a.end();
89
+ client.current = undefined;
90
+ setConnected(false);
91
+ };
92
+ }, [userId, currentGuid]);
93
+ return ((0, jsx_runtime_1.jsx)(exports.MqttContext.Provider, { value: { client: client.current, isConnected: connected }, children: children }));
94
+ };
95
+ exports.default = MqttProvider;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ var jsx_runtime_1 = require("react/jsx-runtime");
54
+ /* eslint-disable testing-library/no-wait-for-multiple-assertions */
55
+ //yarn test --all src/Commons/MqttProvider.test
56
+ var react_1 = require("@testing-library/react");
57
+ var recoil_1 = require("recoil");
58
+ var mqtt_1 = __importDefault(require("mqtt"));
59
+ var react_2 = require("react");
60
+ // import TokenService from './TokenService'
61
+ jest.mock('./TokenService', function () { return ({
62
+ getUser: jest.fn(),
63
+ }); });
64
+ jest.mock('react', function () { return (__assign(__assign({}, jest.requireActual('react')), { useState: jest.fn() })); });
65
+ jest.mock('./UseAxiosProvider', function () { return ({
66
+ __esModule: true,
67
+ default: jest.fn(),
68
+ }); });
69
+ jest.mock('mqtt');
70
+ var renderUi = function (userId) {
71
+ if (userId === void 0) { userId = '123456'; }
72
+ var initializeState = function (_a) {
73
+ var set = _a.set;
74
+ // set(currentUserState, {
75
+ // userId,
76
+ // })
77
+ };
78
+ return (0, react_1.render)((0, jsx_runtime_1.jsx)(recoil_1.RecoilRoot, { initializeState: initializeState, children: (0, jsx_runtime_1.jsx)("div", {}) }));
79
+ };
80
+ describe('MqttProvider', function () {
81
+ var mockOn = jest.fn();
82
+ var mockEnd = jest.fn();
83
+ beforeEach(function () {
84
+ jest.clearAllMocks();
85
+ mqtt_1.default.connect.mockReturnValue({
86
+ on: mockOn,
87
+ end: mockEnd,
88
+ _reconnectCount: 8
89
+ });
90
+ // ;(TokenService.getUser as jest.Mock).mockReturnValue({deviceId: '123214sdfs'})
91
+ // ;(useState as jest.Mock).mockImplementation((init) => [init,jest.fn()])
92
+ // ;(UseAxiosProvider as jest.Mock).mockReturnValue({
93
+ // client: {
94
+ // authGetToken: jest.fn(() => Promise.resolve('token')),
95
+ // userProfilesGet: jest.fn(() => Promise.resolve('')),
96
+ // },
97
+ // onError: jest.fn((fn: any) => {
98
+ // fn(403, { })
99
+ // })
100
+ // })
101
+ });
102
+ it('should render/have no userId', function () { return __awaiter(void 0, void 0, void 0, function () {
103
+ return __generator(this, function (_a) {
104
+ switch (_a.label) {
105
+ case 0:
106
+ renderUi("");
107
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
108
+ expect(react_1.screen.getByText('MqttProvider')).toBeInTheDocument();
109
+ })];
110
+ case 1:
111
+ _a.sent();
112
+ return [2 /*return*/];
113
+ }
114
+ });
115
+ }); });
116
+ it('should handle MQTT Offline', function () { return __awaiter(void 0, void 0, void 0, function () {
117
+ var offlineCallback;
118
+ return __generator(this, function (_a) {
119
+ switch (_a.label) {
120
+ case 0:
121
+ renderUi();
122
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
123
+ expect(mockOn).toHaveBeenCalledWith('offline', expect.any(Function));
124
+ })];
125
+ case 1:
126
+ _a.sent();
127
+ offlineCallback = mockOn.mock.calls.find(function (call) { return call[0] === 'offline'; })[1];
128
+ offlineCallback();
129
+ expect(mockOn).toBeCalled();
130
+ return [2 /*return*/];
131
+ }
132
+ });
133
+ }); });
134
+ it('should handle MQTT error and retry connection', function () { return __awaiter(void 0, void 0, void 0, function () {
135
+ var errorCallback;
136
+ return __generator(this, function (_a) {
137
+ switch (_a.label) {
138
+ case 0:
139
+ renderUi();
140
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
141
+ expect(mockOn).toHaveBeenCalledWith('error', expect.any(Function));
142
+ })];
143
+ case 1:
144
+ _a.sent();
145
+ errorCallback = mockOn.mock.calls.find(function (call) { return call[0] === 'error'; })[1];
146
+ // Error Auth, retry
147
+ errorCallback({ message: 'not authorized' });
148
+ errorCallback({ message: 'unknown' });
149
+ expect(mockOn).toBeCalled();
150
+ return [2 /*return*/];
151
+ }
152
+ });
153
+ }); });
154
+ it('should handle MQTT connect', function () { return __awaiter(void 0, void 0, void 0, function () {
155
+ var connectCallback;
156
+ return __generator(this, function (_a) {
157
+ switch (_a.label) {
158
+ case 0:
159
+ renderUi();
160
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
161
+ expect(mockOn).toHaveBeenCalledWith('connect', expect.any(Function));
162
+ })];
163
+ case 1:
164
+ _a.sent();
165
+ connectCallback = mockOn.mock.calls.find(function (call) { return call[0] === 'connect'; })[1];
166
+ connectCallback();
167
+ expect(mockOn).toBeCalled();
168
+ return [2 /*return*/];
169
+ }
170
+ });
171
+ }); });
172
+ it('http error 419 & response Guid', function () {
173
+ // ;(UseAxiosProvider as jest.Mock).mockReturnValue({
174
+ // onError: jest.fn((fn: any) => {
175
+ // fn(419, { guid: 'xxx-xxxx-xxxx' })
176
+ // }),
177
+ // })
178
+ renderUi();
179
+ expect(react_2.useState).toBeCalled();
180
+ });
181
+ it('retryConnect count > 9', function () { return __awaiter(void 0, void 0, void 0, function () {
182
+ return __generator(this, function (_a) {
183
+ ;
184
+ mqtt_1.default.connect.mockReturnValue({
185
+ on: jest.fn(),
186
+ end: mockEnd,
187
+ _reconnectCount: 11
188
+ });
189
+ renderUi();
190
+ expect(mockEnd).toBeCalled();
191
+ return [2 /*return*/];
192
+ });
193
+ }); });
194
+ });
@@ -0,0 +1,2 @@
1
+ export declare function buildTopicPrefix(topic: string): string;
2
+ export declare function topicCompare(topic: string, topicReceive: string): boolean;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.topicCompare = exports.buildTopicPrefix = void 0;
4
+ function buildTopicPrefix(topic) {
5
+ return [window.TOPIC_PREFIX, topic].filter(Boolean).join('/');
6
+ }
7
+ exports.buildTopicPrefix = buildTopicPrefix;
8
+ function topicCompare(topic, topicReceive) {
9
+ var escapeRegExp = function (string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); };
10
+ var topicToRegex = function (topic) {
11
+ return new RegExp('^' + topic.split('/').map(function (part) {
12
+ if (part === '+')
13
+ return '[^/]+';
14
+ if (part === '#')
15
+ return '.*';
16
+ return escapeRegExp(part);
17
+ }).join('/') + '$');
18
+ };
19
+ var regex = topicToRegex(topic);
20
+ return regex.test(topicReceive);
21
+ }
22
+ exports.topicCompare = topicCompare;
@@ -0,0 +1,7 @@
1
+ /// <reference types="node" />
2
+ declare const useMqtt: (topic: string, handleMessage: (topic: string, message: Buffer) => void, opts?: {
3
+ qos?: 0 | 1 | 2;
4
+ retain?: boolean;
5
+ isShare?: boolean;
6
+ }, deps?: any[]) => void;
7
+ export default useMqtt;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4
+ if (ar || !(i in from)) {
5
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6
+ ar[i] = from[i];
7
+ }
8
+ }
9
+ return to.concat(ar || Array.prototype.slice.call(from));
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ var react_1 = require("react");
13
+ var MqttProvider_1 = require("./MqttProvider");
14
+ var Utils_1 = require("./Utils");
15
+ var useMqtt = function (topic, handleMessage, opts, deps) {
16
+ if (opts === void 0) { opts = {}; }
17
+ if (deps === void 0) { deps = []; }
18
+ var mqttClient = (0, react_1.useContext)(MqttProvider_1.MqttContext);
19
+ if (!mqttClient) {
20
+ throw new Error('useMqtt must be used within a MqttProvider');
21
+ }
22
+ (0, react_1.useEffect)(function () {
23
+ var clientGroupID = localStorage.getItem('clientGroupID');
24
+ if (!clientGroupID) {
25
+ clientGroupID = Math.random().toString(16).substr(2, 8);
26
+ localStorage.setItem('clientGroupID', clientGroupID);
27
+ }
28
+ var topicRebuild = (0, Utils_1.buildTopicPrefix)(topic);
29
+ if (mqttClient.isConnected) {
30
+ mqttClient.client.subscribe(opts.isShare ? "$share/".concat(clientGroupID, "/").concat(topicRebuild) : topicRebuild);
31
+ mqttClient.client.on('message', function (topicReceive, message) {
32
+ if ((0, Utils_1.topicCompare)(topicRebuild, topicReceive)) {
33
+ handleMessage(topic, message);
34
+ }
35
+ });
36
+ return function () {
37
+ var _a;
38
+ if (mqttClient === null || mqttClient === void 0 ? void 0 : mqttClient.client) {
39
+ (_a = mqttClient.client) === null || _a === void 0 ? void 0 : _a.unsubscribe(topic);
40
+ }
41
+ };
42
+ }
43
+ }, __spreadArray([mqttClient.isConnected, topic], deps, true));
44
+ };
45
+ exports.default = useMqtt;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ /* eslint-disable testing-library/no-wait-for-multiple-assertions */
54
+ var react_1 = require("@testing-library/react");
55
+ var useMqtt_1 = __importDefault(require("./useMqtt"));
56
+ // Mock MqttContext
57
+ var mockSubscribe = jest.fn();
58
+ var mockUnsubscribe = jest.fn();
59
+ var mockOn = jest.fn();
60
+ var mockRemoveListener = jest.fn();
61
+ var mockMqttClient = {
62
+ isConnected: true,
63
+ client: {
64
+ subscribe: mockSubscribe,
65
+ unsubscribe: mockUnsubscribe,
66
+ on: mockOn,
67
+ removeListener: mockRemoveListener,
68
+ connected: true,
69
+ disconnecting: false,
70
+ disconnected: false,
71
+ reconnecting: false,
72
+ incomingStore: {},
73
+ outgoingStore: {},
74
+ options: {},
75
+ queueQoSZero: true,
76
+ // Add other required properties here
77
+ },
78
+ };
79
+ jest.mock('react', function () { return (__assign(__assign({}, jest.requireActual('react')), { useContext: function () { return mockMqttClient; } })); });
80
+ jest.mock('Commons/MqttProvider', function () { return ({
81
+ MqttContext: {
82
+ Consumer: function (_a) {
83
+ var children = _a.children;
84
+ return children(mockMqttClient);
85
+ },
86
+ },
87
+ }); });
88
+ jest.mock('mqtt');
89
+ describe('useMqtt', function () {
90
+ beforeEach(function () {
91
+ jest.clearAllMocks();
92
+ });
93
+ it('Thông báo lỗi nếu không được gọi trong MqttProvider', function () {
94
+ var error;
95
+ try {
96
+ (0, react_1.renderHook)(function () { return (0, useMqtt_1.default)('test/topic', jest.fn()); });
97
+ }
98
+ catch (e) {
99
+ error = e;
100
+ }
101
+ expect(error).toBeUndefined();
102
+ });
103
+ it('sub topic khi được kết nối tới mqtt', function () { return __awaiter(void 0, void 0, void 0, function () {
104
+ var topic, handleMessage;
105
+ return __generator(this, function (_a) {
106
+ switch (_a.label) {
107
+ case 0:
108
+ topic = 'test/topic';
109
+ handleMessage = jest.fn();
110
+ (0, react_1.renderHook)(function () { return (0, useMqtt_1.default)(topic, handleMessage); }, {});
111
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
112
+ expect(mockSubscribe).toHaveBeenCalledWith(topic);
113
+ expect(mockOn).toHaveBeenCalledWith('message', expect.any(Function));
114
+ })];
115
+ case 1:
116
+ _a.sent();
117
+ return [2 /*return*/];
118
+ }
119
+ });
120
+ }); });
121
+ it('unSub topic nếu component bị unmount', function () {
122
+ var topic = 'test/topic';
123
+ var handleMessage = jest.fn();
124
+ var unmount = (0, react_1.renderHook)(function () { return (0, useMqtt_1.default)(topic, handleMessage); }, {}).unmount;
125
+ unmount();
126
+ expect(mockUnsubscribe).toHaveBeenCalledWith(topic);
127
+ });
128
+ it('Xử lý khi message trả về và topic trả về đúng với topic được sub', function () {
129
+ var sharedTopic = '$share/group/test/topic';
130
+ var handleMessage = jest.fn();
131
+ (0, react_1.renderHook)(function () { return (0, useMqtt_1.default)(sharedTopic, handleMessage); }, {});
132
+ var messageHandler = mockOn.mock.calls[0][1];
133
+ var message = Buffer.from('test message');
134
+ (0, react_1.act)(function () {
135
+ messageHandler('test/topic', message);
136
+ });
137
+ expect(handleMessage).toHaveBeenCalledWith('test/topic', message);
138
+ });
139
+ it('Không gọi handleMessage nếu không đúng topic đang sub', function () {
140
+ var topic = 'test/topic';
141
+ var handleMessage = jest.fn();
142
+ (0, react_1.renderHook)(function () { return (0, useMqtt_1.default)(topic, handleMessage); }, {});
143
+ var messageHandler = mockOn.mock.calls[0][1];
144
+ var message = Buffer.from('test message');
145
+ (0, react_1.act)(function () {
146
+ messageHandler('unrelated/topic', message);
147
+ });
148
+ expect(handleMessage).not.toHaveBeenCalled();
149
+ });
150
+ it('sub lại nếu thay đổi topic', function () {
151
+ var initialTopic = 'initial/topic';
152
+ var newTopic = 'new/topic';
153
+ var handleMessage = jest.fn();
154
+ var rerender = (0, react_1.renderHook)(function (_a) {
155
+ var topic = _a.topic;
156
+ return (0, useMqtt_1.default)(topic, handleMessage);
157
+ }, { initialProps: { topic: initialTopic } }).rerender;
158
+ expect(mockSubscribe).toHaveBeenCalledWith(initialTopic);
159
+ rerender({ topic: newTopic });
160
+ expect(mockUnsubscribe).toHaveBeenCalledWith(initialTopic);
161
+ expect(mockSubscribe).toHaveBeenCalledWith(newTopic);
162
+ });
163
+ it('Không sub được khi bị disconnect', function () { return __awaiter(void 0, void 0, void 0, function () {
164
+ var disconnectedMqttClient, topic, handleMessage;
165
+ return __generator(this, function (_a) {
166
+ switch (_a.label) {
167
+ case 0:
168
+ disconnectedMqttClient = __assign(__assign({}, mockMqttClient), { isConnected: false });
169
+ mockMqttClient = disconnectedMqttClient;
170
+ topic = 'test/topic';
171
+ handleMessage = jest.fn();
172
+ (0, react_1.renderHook)(function () { return (0, useMqtt_1.default)(topic, handleMessage); }, {});
173
+ return [4 /*yield*/, (0, react_1.waitFor)(function () {
174
+ expect(mockSubscribe).not.toHaveBeenCalled();
175
+ expect(mockOn).not.toHaveBeenCalled();
176
+ })];
177
+ case 1:
178
+ _a.sent();
179
+ return [2 /*return*/];
180
+ }
181
+ });
182
+ }); });
183
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awing-library",
3
- "version": "2.1.113",
3
+ "version": "2.1.114",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -53,6 +53,7 @@
53
53
  "immer": "^10.1.1",
54
54
  "lodash": "^4.17.21",
55
55
  "moment": "^2.29.4",
56
+ "mqtt": "^5.10.2",
56
57
  "prismjs": "^1.29.0",
57
58
  "process": "^0.11.10",
58
59
  "react": "^18.2.0",
@@ -126,9 +127,9 @@
126
127
  "copyfiles": "^2.4.1",
127
128
  "eslint-plugin-storybook": "^0.6.12",
128
129
  "prop-types": "^15.8.1",
130
+ "rimraf": "^6.0.1",
129
131
  "storybook": "^7.0.26",
130
132
  "tsc-alias": "^1.8.8",
131
- "webpack": "^5.88.1",
132
- "rimraf": "^6.0.1"
133
+ "webpack": "^5.88.1"
133
134
  }
134
135
  }