Commit 746e63ab632b96772346d55f8ef7e57b1270d6bf
Merge branch 'develop/3.0' of https://github.com/thingsboard/thingsboard into map/3.0
Showing
56 changed files
with
1942 additions
and
663 deletions
Too many changes to show.
To preserve performance only 56 of 91 files are displayed.
@@ -193,8 +193,8 @@ | @@ -193,8 +193,8 @@ | ||
193 | <artifactId>logback-classic</artifactId> | 193 | <artifactId>logback-classic</artifactId> |
194 | </dependency> | 194 | </dependency> |
195 | <dependency> | 195 | <dependency> |
196 | - <groupId>javax.mail</groupId> | ||
197 | - <artifactId>mail</artifactId> | 196 | + <groupId>com.sun.mail</groupId> |
197 | + <artifactId>javax.mail</artifactId> | ||
198 | </dependency> | 198 | </dependency> |
199 | <dependency> | 199 | <dependency> |
200 | <groupId>org.apache.curator</groupId> | 200 | <groupId>org.apache.curator</groupId> |
@@ -17,7 +17,7 @@ | @@ -17,7 +17,7 @@ | ||
17 | }, | 17 | }, |
18 | "type": "org.thingsboard.rule.engine.filter.TbJsFilterNode", | 18 | "type": "org.thingsboard.rule.engine.filter.TbJsFilterNode", |
19 | "name": "Is Thermostat?", | 19 | "name": "Is Thermostat?", |
20 | - "debugMode": true, | 20 | + "debugMode": false, |
21 | "configuration": { | 21 | "configuration": { |
22 | "jsScript": "return msg.id.entityType === \"DEVICE\" && msg.type === \"thermostat\";" | 22 | "jsScript": "return msg.id.entityType === \"DEVICE\" && msg.type === \"thermostat\";" |
23 | } | 23 | } |
@@ -113,7 +113,7 @@ | @@ -113,7 +113,7 @@ | ||
113 | }, | 113 | }, |
114 | "type": "org.thingsboard.rule.engine.action.TbCreateRelationNode", | 114 | "type": "org.thingsboard.rule.engine.action.TbCreateRelationNode", |
115 | "name": "Relate to Asset", | 115 | "name": "Relate to Asset", |
116 | - "debugMode": true, | 116 | + "debugMode": false, |
117 | "configuration": { | 117 | "configuration": { |
118 | "direction": "FROM", | 118 | "direction": "FROM", |
119 | "relationType": "ToAlarmPropagationAsset", | 119 | "relationType": "ToAlarmPropagationAsset", |
@@ -81,7 +81,7 @@ | @@ -81,7 +81,7 @@ | ||
81 | }, | 81 | }, |
82 | "type": "org.thingsboard.rule.engine.filter.TbJsSwitchNode", | 82 | "type": "org.thingsboard.rule.engine.filter.TbJsSwitchNode", |
83 | "name": "Check Alarms", | 83 | "name": "Check Alarms", |
84 | - "debugMode": true, | 84 | + "debugMode": false, |
85 | "configuration": { | 85 | "configuration": { |
86 | "jsScript": "var relations = [];\nif(metadata[\"ss_alarmTemperature\"] === \"true\"){\n if(msg.temperature > metadata[\"ss_thresholdTemperature\"]){\n relations.push(\"NewTempAlarm\");\n } else {\n relations.push(\"ClearTempAlarm\");\n }\n}\nif(metadata[\"ss_alarmHumidity\"] === \"true\"){\n if(msg.humidity < metadata[\"ss_thresholdHumidity\"]){\n relations.push(\"NewHumidityAlarm\");\n } else {\n relations.push(\"ClearHumidityAlarm\");\n }\n}\n\nreturn relations;" | 86 | "jsScript": "var relations = [];\nif(metadata[\"ss_alarmTemperature\"] === \"true\"){\n if(msg.temperature > metadata[\"ss_thresholdTemperature\"]){\n relations.push(\"NewTempAlarm\");\n } else {\n relations.push(\"ClearTempAlarm\");\n }\n}\nif(metadata[\"ss_alarmHumidity\"] === \"true\"){\n if(msg.humidity < metadata[\"ss_thresholdHumidity\"]){\n relations.push(\"NewHumidityAlarm\");\n } else {\n relations.push(\"ClearHumidityAlarm\");\n }\n}\n\nreturn relations;" |
87 | } | 87 | } |
@@ -93,7 +93,7 @@ | @@ -93,7 +93,7 @@ | ||
93 | }, | 93 | }, |
94 | "type": "org.thingsboard.rule.engine.metadata.TbGetAttributesNode", | 94 | "type": "org.thingsboard.rule.engine.metadata.TbGetAttributesNode", |
95 | "name": "Fetch Configuration", | 95 | "name": "Fetch Configuration", |
96 | - "debugMode": true, | 96 | + "debugMode": false, |
97 | "configuration": { | 97 | "configuration": { |
98 | "clientAttributeNames": [], | 98 | "clientAttributeNames": [], |
99 | "sharedAttributeNames": [], | 99 | "sharedAttributeNames": [], |
@@ -163,7 +163,7 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | @@ -163,7 +163,7 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | ||
163 | String dispatcherName = tenantId.getId().equals(EntityId.NULL_UUID) ? | 163 | String dispatcherName = tenantId.getId().equals(EntityId.NULL_UUID) ? |
164 | DefaultActorService.SYSTEM_RULE_DISPATCHER_NAME : DefaultActorService.TENANT_RULE_DISPATCHER_NAME; | 164 | DefaultActorService.SYSTEM_RULE_DISPATCHER_NAME : DefaultActorService.TENANT_RULE_DISPATCHER_NAME; |
165 | return context.actorOf( | 165 | return context.actorOf( |
166 | - Props.create(new RuleNodeActor.ActorCreator(systemContext, tenantId, entityId, ruleNode.getId())) | 166 | + Props.create(new RuleNodeActor.ActorCreator(systemContext, tenantId, entityId, ruleNode.getName(), ruleNode.getId())) |
167 | .withDispatcher(dispatcherName), ruleNode.getId().toString()); | 167 | .withDispatcher(dispatcherName), ruleNode.getId().toString()); |
168 | } | 168 | } |
169 | 169 | ||
@@ -200,7 +200,7 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | @@ -200,7 +200,7 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | ||
200 | log.trace("[{}][{}] Processing message [{}]: {}", entityId, firstId, msg.getId(), msg); | 200 | log.trace("[{}][{}] Processing message [{}]: {}", entityId, firstId, msg.getId(), msg); |
201 | if (envelope.getRelationTypes() == null || envelope.getRelationTypes().isEmpty()) { | 201 | if (envelope.getRelationTypes() == null || envelope.getRelationTypes().isEmpty()) { |
202 | try { | 202 | try { |
203 | - checkActive(); | 203 | + checkActive(envelope.getTbMsg()); |
204 | RuleNodeId targetId = msg.getRuleNodeId(); | 204 | RuleNodeId targetId = msg.getRuleNodeId(); |
205 | RuleNodeCtx targetCtx; | 205 | RuleNodeCtx targetCtx; |
206 | if (targetId == null) { | 206 | if (targetId == null) { |
@@ -216,6 +216,8 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | @@ -216,6 +216,8 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | ||
216 | log.trace("[{}][{}] Rule node does not exist. Probably old message", entityId, targetId); | 216 | log.trace("[{}][{}] Rule node does not exist. Probably old message", entityId, targetId); |
217 | msg.getCallback().onSuccess(); | 217 | msg.getCallback().onSuccess(); |
218 | } | 218 | } |
219 | + } catch (RuleNodeException rne) { | ||
220 | + envelope.getTbMsg().getCallback().onFailure(rne); | ||
219 | } catch (Exception e) { | 221 | } catch (Exception e) { |
220 | envelope.getTbMsg().getCallback().onFailure(new RuleEngineException(e.getMessage())); | 222 | envelope.getTbMsg().getCallback().onFailure(new RuleEngineException(e.getMessage())); |
221 | } | 223 | } |
@@ -225,11 +227,15 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | @@ -225,11 +227,15 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | ||
225 | } | 227 | } |
226 | 228 | ||
227 | void onRuleChainToRuleChainMsg(RuleChainToRuleChainMsg envelope) { | 229 | void onRuleChainToRuleChainMsg(RuleChainToRuleChainMsg envelope) { |
228 | - checkActive(); | ||
229 | - if (firstNode != null) { | ||
230 | - pushMsgToNode(firstNode, envelope.getMsg(), envelope.getFromRelationType()); | ||
231 | - } else { | ||
232 | - envelope.getMsg().getCallback().onSuccess(); | 230 | + try { |
231 | + checkActive(envelope.getMsg()); | ||
232 | + if (firstNode != null) { | ||
233 | + pushMsgToNode(firstNode, envelope.getMsg(), envelope.getFromRelationType()); | ||
234 | + } else { | ||
235 | + envelope.getMsg().getCallback().onSuccess(); | ||
236 | + } | ||
237 | + } catch (RuleNodeException e) { | ||
238 | + log.debug("Rule Chain is not active. Current state [{}] for processor [{}][{}] tenant [{}]", state, entityId.getEntityType(), entityId, tenantId); | ||
233 | } | 239 | } |
234 | } | 240 | } |
235 | 241 | ||
@@ -239,7 +245,7 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | @@ -239,7 +245,7 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | ||
239 | 245 | ||
240 | private void onTellNext(TbMsg msg, RuleNodeId originatorNodeId, Set<String> relationTypes, String failureMessage) { | 246 | private void onTellNext(TbMsg msg, RuleNodeId originatorNodeId, Set<String> relationTypes, String failureMessage) { |
241 | try { | 247 | try { |
242 | - checkActive(); | 248 | + checkActive(msg); |
243 | EntityId entityId = msg.getOriginator(); | 249 | EntityId entityId = msg.getOriginator(); |
244 | TopicPartitionInfo tpi = systemContext.resolve(ServiceType.TB_RULE_ENGINE, tenantId, entityId); | 250 | TopicPartitionInfo tpi = systemContext.resolve(ServiceType.TB_RULE_ENGINE, tenantId, entityId); |
245 | List<RuleNodeRelation> relations = nodeRoutes.get(originatorNodeId).stream() | 251 | List<RuleNodeRelation> relations = nodeRoutes.get(originatorNodeId).stream() |
@@ -272,6 +278,8 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | @@ -272,6 +278,8 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | ||
272 | putToQueue(tpi, msg, callbackWrapper, target); | 278 | putToQueue(tpi, msg, callbackWrapper, target); |
273 | } | 279 | } |
274 | } | 280 | } |
281 | + } catch (RuleNodeException rne) { | ||
282 | + msg.getCallback().onFailure(rne); | ||
275 | } catch (Exception e) { | 283 | } catch (Exception e) { |
276 | msg.getCallback().onFailure(new RuleEngineException("onTellNext - " + e.getMessage())); | 284 | msg.getCallback().onFailure(new RuleEngineException("onTellNext - " + e.getMessage())); |
277 | } | 285 | } |
@@ -333,4 +341,9 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | @@ -333,4 +341,9 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | ||
333 | } | 341 | } |
334 | } | 342 | } |
335 | 343 | ||
344 | + @Override | ||
345 | + protected RuleNodeException getInactiveException() { | ||
346 | + RuleNode firstRuleNode = firstNode != null ? firstNode.getSelf() : null; | ||
347 | + return new RuleNodeException("Rule Chain is not active! Failed to initialize.", ruleChainName, firstRuleNode); | ||
348 | + } | ||
336 | } | 349 | } |
@@ -27,12 +27,14 @@ import org.thingsboard.server.common.msg.queue.PartitionChangeMsg; | @@ -27,12 +27,14 @@ import org.thingsboard.server.common.msg.queue.PartitionChangeMsg; | ||
27 | 27 | ||
28 | public class RuleNodeActor extends ComponentActor<RuleNodeId, RuleNodeActorMessageProcessor> { | 28 | public class RuleNodeActor extends ComponentActor<RuleNodeId, RuleNodeActorMessageProcessor> { |
29 | 29 | ||
30 | + private final String ruleChainName; | ||
30 | private final RuleChainId ruleChainId; | 31 | private final RuleChainId ruleChainId; |
31 | 32 | ||
32 | - private RuleNodeActor(ActorSystemContext systemContext, TenantId tenantId, RuleChainId ruleChainId, RuleNodeId ruleNodeId) { | 33 | + private RuleNodeActor(ActorSystemContext systemContext, TenantId tenantId, RuleChainId ruleChainId, String ruleChainName, RuleNodeId ruleNodeId) { |
33 | super(systemContext, tenantId, ruleNodeId); | 34 | super(systemContext, tenantId, ruleNodeId); |
35 | + this.ruleChainName = ruleChainName; | ||
34 | this.ruleChainId = ruleChainId; | 36 | this.ruleChainId = ruleChainId; |
35 | - setProcessor(new RuleNodeActorMessageProcessor(tenantId, ruleChainId, ruleNodeId, systemContext, | 37 | + setProcessor(new RuleNodeActorMessageProcessor(tenantId, this.ruleChainName, ruleNodeId, systemContext, |
36 | context().parent(), context().self())); | 38 | context().parent(), context().self())); |
37 | } | 39 | } |
38 | 40 | ||
@@ -96,19 +98,21 @@ public class RuleNodeActor extends ComponentActor<RuleNodeId, RuleNodeActorMessa | @@ -96,19 +98,21 @@ public class RuleNodeActor extends ComponentActor<RuleNodeId, RuleNodeActorMessa | ||
96 | 98 | ||
97 | private final TenantId tenantId; | 99 | private final TenantId tenantId; |
98 | private final RuleChainId ruleChainId; | 100 | private final RuleChainId ruleChainId; |
101 | + private final String ruleChainName; | ||
99 | private final RuleNodeId ruleNodeId; | 102 | private final RuleNodeId ruleNodeId; |
100 | 103 | ||
101 | - public ActorCreator(ActorSystemContext context, TenantId tenantId, RuleChainId ruleChainId, RuleNodeId ruleNodeId) { | 104 | + public ActorCreator(ActorSystemContext context, TenantId tenantId, RuleChainId ruleChainId, String ruleChainName, RuleNodeId ruleNodeId) { |
102 | super(context); | 105 | super(context); |
103 | this.tenantId = tenantId; | 106 | this.tenantId = tenantId; |
104 | this.ruleChainId = ruleChainId; | 107 | this.ruleChainId = ruleChainId; |
108 | + this.ruleChainName = ruleChainName; | ||
105 | this.ruleNodeId = ruleNodeId; | 109 | this.ruleNodeId = ruleNodeId; |
106 | 110 | ||
107 | } | 111 | } |
108 | 112 | ||
109 | @Override | 113 | @Override |
110 | public RuleNodeActor create() throws Exception { | 114 | public RuleNodeActor create() throws Exception { |
111 | - return new RuleNodeActor(context, tenantId, ruleChainId, ruleNodeId); | 115 | + return new RuleNodeActor(context, tenantId, ruleChainId, ruleChainName, ruleNodeId); |
112 | } | 116 | } |
113 | } | 117 | } |
114 | 118 |
application/src/main/java/org/thingsboard/server/actors/ruleChain/RuleNodeActorMessageProcessor.java
@@ -17,37 +17,33 @@ package org.thingsboard.server.actors.ruleChain; | @@ -17,37 +17,33 @@ package org.thingsboard.server.actors.ruleChain; | ||
17 | 17 | ||
18 | import akka.actor.ActorContext; | 18 | import akka.actor.ActorContext; |
19 | import akka.actor.ActorRef; | 19 | import akka.actor.ActorRef; |
20 | -import org.thingsboard.rule.engine.api.TbContext; | ||
21 | import org.thingsboard.rule.engine.api.TbNode; | 20 | import org.thingsboard.rule.engine.api.TbNode; |
22 | import org.thingsboard.rule.engine.api.TbNodeConfiguration; | 21 | import org.thingsboard.rule.engine.api.TbNodeConfiguration; |
23 | import org.thingsboard.server.actors.ActorSystemContext; | 22 | import org.thingsboard.server.actors.ActorSystemContext; |
24 | import org.thingsboard.server.actors.shared.ComponentMsgProcessor; | 23 | import org.thingsboard.server.actors.shared.ComponentMsgProcessor; |
25 | -import org.thingsboard.server.common.data.id.RuleChainId; | ||
26 | import org.thingsboard.server.common.data.id.RuleNodeId; | 24 | import org.thingsboard.server.common.data.id.RuleNodeId; |
27 | import org.thingsboard.server.common.data.id.TenantId; | 25 | import org.thingsboard.server.common.data.id.TenantId; |
28 | import org.thingsboard.server.common.data.plugin.ComponentLifecycleState; | 26 | import org.thingsboard.server.common.data.plugin.ComponentLifecycleState; |
29 | import org.thingsboard.server.common.data.rule.RuleNode; | 27 | import org.thingsboard.server.common.data.rule.RuleNode; |
30 | import org.thingsboard.server.common.msg.queue.PartitionChangeMsg; | 28 | import org.thingsboard.server.common.msg.queue.PartitionChangeMsg; |
31 | -import org.thingsboard.server.dao.rule.RuleChainService; | 29 | +import org.thingsboard.server.common.msg.queue.RuleNodeException; |
32 | 30 | ||
33 | /** | 31 | /** |
34 | * @author Andrew Shvayka | 32 | * @author Andrew Shvayka |
35 | */ | 33 | */ |
36 | public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNodeId> { | 34 | public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNodeId> { |
37 | 35 | ||
38 | - private final ActorRef parent; | 36 | + private final String ruleChainName; |
39 | private final ActorRef self; | 37 | private final ActorRef self; |
40 | - private final RuleChainService service; | ||
41 | private RuleNode ruleNode; | 38 | private RuleNode ruleNode; |
42 | private TbNode tbNode; | 39 | private TbNode tbNode; |
43 | private DefaultTbContext defaultCtx; | 40 | private DefaultTbContext defaultCtx; |
44 | 41 | ||
45 | - RuleNodeActorMessageProcessor(TenantId tenantId, RuleChainId ruleChainId, RuleNodeId ruleNodeId, ActorSystemContext systemContext | 42 | + RuleNodeActorMessageProcessor(TenantId tenantId, String ruleChainName, RuleNodeId ruleNodeId, ActorSystemContext systemContext |
46 | , ActorRef parent, ActorRef self) { | 43 | , ActorRef parent, ActorRef self) { |
47 | super(systemContext, tenantId, ruleNodeId); | 44 | super(systemContext, tenantId, ruleNodeId); |
48 | - this.parent = parent; | 45 | + this.ruleChainName = ruleChainName; |
49 | this.self = self; | 46 | this.self = self; |
50 | - this.service = systemContext.getRuleChainService(); | ||
51 | this.ruleNode = systemContext.getRuleChainService().findRuleNodeById(tenantId, entityId); | 47 | this.ruleNode = systemContext.getRuleChainService().findRuleNodeById(tenantId, entityId); |
52 | this.defaultCtx = new DefaultTbContext(systemContext, new RuleNodeCtx(tenantId, parent, self, ruleNode)); | 48 | this.defaultCtx = new DefaultTbContext(systemContext, new RuleNodeCtx(tenantId, parent, self, ruleNode)); |
53 | } | 49 | } |
@@ -63,8 +59,8 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod | @@ -63,8 +59,8 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod | ||
63 | @Override | 59 | @Override |
64 | public void onUpdate(ActorContext context) throws Exception { | 60 | public void onUpdate(ActorContext context) throws Exception { |
65 | RuleNode newRuleNode = systemContext.getRuleChainService().findRuleNodeById(tenantId, entityId); | 61 | RuleNode newRuleNode = systemContext.getRuleChainService().findRuleNodeById(tenantId, entityId); |
66 | - boolean restartRequired = !(ruleNode.getType().equals(newRuleNode.getType()) | ||
67 | - && ruleNode.getConfiguration().equals(newRuleNode.getConfiguration())); | 62 | + boolean restartRequired = state != ComponentLifecycleState.ACTIVE || |
63 | + !(ruleNode.getType().equals(newRuleNode.getType()) && ruleNode.getConfiguration().equals(newRuleNode.getConfiguration())); | ||
68 | this.ruleNode = newRuleNode; | 64 | this.ruleNode = newRuleNode; |
69 | this.defaultCtx.updateSelf(newRuleNode); | 65 | this.defaultCtx.updateSelf(newRuleNode); |
70 | if (restartRequired) { | 66 | if (restartRequired) { |
@@ -91,7 +87,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod | @@ -91,7 +87,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod | ||
91 | } | 87 | } |
92 | 88 | ||
93 | public void onRuleToSelfMsg(RuleNodeToSelfMsg msg) throws Exception { | 89 | public void onRuleToSelfMsg(RuleNodeToSelfMsg msg) throws Exception { |
94 | - checkActive(); | 90 | + checkActive(msg.getMsg()); |
95 | if (ruleNode.isDebugMode()) { | 91 | if (ruleNode.isDebugMode()) { |
96 | systemContext.persistDebugInput(tenantId, entityId, msg.getMsg(), "Self"); | 92 | systemContext.persistDebugInput(tenantId, entityId, msg.getMsg(), "Self"); |
97 | } | 93 | } |
@@ -103,7 +99,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod | @@ -103,7 +99,7 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod | ||
103 | } | 99 | } |
104 | 100 | ||
105 | void onRuleChainToRuleNodeMsg(RuleChainToRuleNodeMsg msg) throws Exception { | 101 | void onRuleChainToRuleNodeMsg(RuleChainToRuleNodeMsg msg) throws Exception { |
106 | - checkActive(); | 102 | + checkActive(msg.getMsg()); |
107 | if (ruleNode.isDebugMode()) { | 103 | if (ruleNode.isDebugMode()) { |
108 | systemContext.persistDebugInput(tenantId, entityId, msg.getMsg(), msg.getFromRelationType()); | 104 | systemContext.persistDebugInput(tenantId, entityId, msg.getMsg(), msg.getFromRelationType()); |
109 | } | 105 | } |
@@ -129,4 +125,8 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod | @@ -129,4 +125,8 @@ public class RuleNodeActorMessageProcessor extends ComponentMsgProcessor<RuleNod | ||
129 | return tbNode; | 125 | return tbNode; |
130 | } | 126 | } |
131 | 127 | ||
128 | + @Override | ||
129 | + protected RuleNodeException getInactiveException() { | ||
130 | + return new RuleNodeException("Rule Node is not active! Failed to initialize.", ruleChainName, ruleNode); | ||
131 | + } | ||
132 | } | 132 | } |
@@ -22,7 +22,10 @@ import org.thingsboard.server.actors.stats.StatsPersistTick; | @@ -22,7 +22,10 @@ import org.thingsboard.server.actors.stats.StatsPersistTick; | ||
22 | import org.thingsboard.server.common.data.id.EntityId; | 22 | import org.thingsboard.server.common.data.id.EntityId; |
23 | import org.thingsboard.server.common.data.id.TenantId; | 23 | import org.thingsboard.server.common.data.id.TenantId; |
24 | import org.thingsboard.server.common.data.plugin.ComponentLifecycleState; | 24 | import org.thingsboard.server.common.data.plugin.ComponentLifecycleState; |
25 | +import org.thingsboard.server.common.msg.TbMsg; | ||
25 | import org.thingsboard.server.common.msg.queue.PartitionChangeMsg; | 26 | import org.thingsboard.server.common.msg.queue.PartitionChangeMsg; |
27 | +import org.thingsboard.server.common.msg.queue.RuleEngineException; | ||
28 | +import org.thingsboard.server.common.msg.queue.RuleNodeException; | ||
26 | 29 | ||
27 | @Slf4j | 30 | @Slf4j |
28 | public abstract class ComponentMsgProcessor<T extends EntityId> extends AbstractContextAwareMsgProcessor { | 31 | public abstract class ComponentMsgProcessor<T extends EntityId> extends AbstractContextAwareMsgProcessor { |
@@ -74,11 +77,17 @@ public abstract class ComponentMsgProcessor<T extends EntityId> extends Abstract | @@ -74,11 +77,17 @@ public abstract class ComponentMsgProcessor<T extends EntityId> extends Abstract | ||
74 | schedulePeriodicMsgWithDelay(context, new StatsPersistTick(), statsPersistFrequency, statsPersistFrequency); | 77 | schedulePeriodicMsgWithDelay(context, new StatsPersistTick(), statsPersistFrequency, statsPersistFrequency); |
75 | } | 78 | } |
76 | 79 | ||
77 | - protected void checkActive() { | 80 | + protected void checkActive(TbMsg tbMsg) throws RuleNodeException { |
78 | if (state != ComponentLifecycleState.ACTIVE) { | 81 | if (state != ComponentLifecycleState.ACTIVE) { |
79 | log.debug("Component is not active. Current state [{}] for processor [{}][{}] tenant [{}]", state, entityId.getEntityType(), entityId, tenantId); | 82 | log.debug("Component is not active. Current state [{}] for processor [{}][{}] tenant [{}]", state, entityId.getEntityType(), entityId, tenantId); |
80 | - throw new IllegalStateException("Rule chain is not active! " + entityId + " - " + tenantId); | 83 | + RuleNodeException ruleNodeException = getInactiveException(); |
84 | + if (tbMsg != null) { | ||
85 | + tbMsg.getCallback().onFailure(ruleNodeException); | ||
86 | + } | ||
87 | + throw ruleNodeException; | ||
81 | } | 88 | } |
82 | } | 89 | } |
83 | 90 | ||
91 | + abstract protected RuleNodeException getInactiveException(); | ||
92 | + | ||
84 | } | 93 | } |
@@ -338,7 +338,7 @@ public class AuthController extends BaseController { | @@ -338,7 +338,7 @@ public class AuthController extends BaseController { | ||
338 | 338 | ||
339 | @RequestMapping(value = "/noauth/oauth2Clients", method = RequestMethod.POST) | 339 | @RequestMapping(value = "/noauth/oauth2Clients", method = RequestMethod.POST) |
340 | @ResponseBody | 340 | @ResponseBody |
341 | - public List<OAuth2ClientInfo> getOath2Clients() throws ThingsboardException { | 341 | + public List<OAuth2ClientInfo> getOAuth2Clients() throws ThingsboardException { |
342 | try { | 342 | try { |
343 | return oauth2Service.getOAuth2Clients(); | 343 | return oauth2Service.getOAuth2Clients(); |
344 | } catch (Exception e) { | 344 | } catch (Exception e) { |
@@ -23,6 +23,7 @@ import org.springframework.stereotype.Service; | @@ -23,6 +23,7 @@ import org.springframework.stereotype.Service; | ||
23 | import org.thingsboard.rule.engine.api.RpcError; | 23 | import org.thingsboard.rule.engine.api.RpcError; |
24 | import org.thingsboard.server.actors.ActorSystemContext; | 24 | import org.thingsboard.server.actors.ActorSystemContext; |
25 | import org.thingsboard.server.common.data.id.TenantId; | 25 | import org.thingsboard.server.common.data.id.TenantId; |
26 | +import org.thingsboard.server.common.msg.MsgType; | ||
26 | import org.thingsboard.server.common.msg.TbActorMsg; | 27 | import org.thingsboard.server.common.msg.TbActorMsg; |
27 | import org.thingsboard.server.common.msg.queue.ServiceType; | 28 | import org.thingsboard.server.common.msg.queue.ServiceType; |
28 | import org.thingsboard.server.common.msg.queue.TbCallback; | 29 | import org.thingsboard.server.common.msg.queue.TbCallback; |
@@ -45,6 +46,7 @@ import org.thingsboard.server.service.encoding.DataDecodingEncodingService; | @@ -45,6 +46,7 @@ import org.thingsboard.server.service.encoding.DataDecodingEncodingService; | ||
45 | import org.thingsboard.server.service.queue.processing.AbstractConsumerService; | 46 | import org.thingsboard.server.service.queue.processing.AbstractConsumerService; |
46 | import org.thingsboard.server.service.rpc.FromDeviceRpcResponse; | 47 | import org.thingsboard.server.service.rpc.FromDeviceRpcResponse; |
47 | import org.thingsboard.server.service.rpc.TbCoreDeviceRpcService; | 48 | import org.thingsboard.server.service.rpc.TbCoreDeviceRpcService; |
49 | +import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; | ||
48 | import org.thingsboard.server.service.state.DeviceStateService; | 50 | import org.thingsboard.server.service.state.DeviceStateService; |
49 | import org.thingsboard.server.service.subscription.SubscriptionManagerService; | 51 | import org.thingsboard.server.service.subscription.SubscriptionManagerService; |
50 | import org.thingsboard.server.service.subscription.TbLocalSubscriptionService; | 52 | import org.thingsboard.server.service.subscription.TbLocalSubscriptionService; |
@@ -100,7 +102,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore | @@ -100,7 +102,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore | ||
100 | } | 102 | } |
101 | 103 | ||
102 | @PreDestroy | 104 | @PreDestroy |
103 | - public void destroy(){ | 105 | + public void destroy() { |
104 | super.destroy(); | 106 | super.destroy(); |
105 | } | 107 | } |
106 | 108 | ||
@@ -143,8 +145,13 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore | @@ -143,8 +145,13 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore | ||
143 | } else if (toCoreMsg.getToDeviceActorNotificationMsg() != null && !toCoreMsg.getToDeviceActorNotificationMsg().isEmpty()) { | 145 | } else if (toCoreMsg.getToDeviceActorNotificationMsg() != null && !toCoreMsg.getToDeviceActorNotificationMsg().isEmpty()) { |
144 | Optional<TbActorMsg> actorMsg = encodingService.decode(toCoreMsg.getToDeviceActorNotificationMsg().toByteArray()); | 146 | Optional<TbActorMsg> actorMsg = encodingService.decode(toCoreMsg.getToDeviceActorNotificationMsg().toByteArray()); |
145 | if (actorMsg.isPresent()) { | 147 | if (actorMsg.isPresent()) { |
146 | - log.trace("[{}] Forwarding message to App Actor {}", id, actorMsg.get()); | ||
147 | - actorContext.tell(actorMsg.get(), ActorRef.noSender()); | 148 | + TbActorMsg tbActorMsg = actorMsg.get(); |
149 | + if (tbActorMsg.getMsgType().equals(MsgType.DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG)) { | ||
150 | + tbCoreDeviceRpcService.forwardRpcRequestToDeviceActor((ToDeviceRpcRequestActorMsg) tbActorMsg); | ||
151 | + } else { | ||
152 | + log.trace("[{}] Forwarding message to App Actor {}", id, actorMsg.get()); | ||
153 | + actorContext.tell(actorMsg.get(), ActorRef.noSender()); | ||
154 | + } | ||
148 | } | 155 | } |
149 | callback.onSuccess(); | 156 | callback.onSuccess(); |
150 | } | 157 | } |
@@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j; | @@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j; | ||
21 | import org.springframework.beans.factory.annotation.Value; | 21 | import org.springframework.beans.factory.annotation.Value; |
22 | import org.springframework.scheduling.annotation.Scheduled; | 22 | import org.springframework.scheduling.annotation.Scheduled; |
23 | import org.springframework.stereotype.Service; | 23 | import org.springframework.stereotype.Service; |
24 | +import org.thingsboard.rule.engine.api.RpcError; | ||
24 | import org.thingsboard.server.actors.ActorSystemContext; | 25 | import org.thingsboard.server.actors.ActorSystemContext; |
25 | import org.thingsboard.server.common.data.id.TenantId; | 26 | import org.thingsboard.server.common.data.id.TenantId; |
26 | import org.thingsboard.server.common.msg.TbActorMsg; | 27 | import org.thingsboard.server.common.msg.TbActorMsg; |
@@ -31,6 +32,7 @@ import org.thingsboard.server.common.msg.queue.ServiceQueue; | @@ -31,6 +32,7 @@ import org.thingsboard.server.common.msg.queue.ServiceQueue; | ||
31 | import org.thingsboard.server.common.msg.queue.ServiceType; | 32 | import org.thingsboard.server.common.msg.queue.ServiceType; |
32 | import org.thingsboard.server.common.msg.queue.TbCallback; | 33 | import org.thingsboard.server.common.msg.queue.TbCallback; |
33 | import org.thingsboard.server.common.msg.queue.TbMsgCallback; | 34 | import org.thingsboard.server.common.msg.queue.TbMsgCallback; |
35 | +import org.thingsboard.server.gen.transport.TransportProtos; | ||
34 | import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; | 36 | import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; |
35 | import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg; | 37 | import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg; |
36 | import org.thingsboard.server.queue.TbQueueConsumer; | 38 | import org.thingsboard.server.queue.TbQueueConsumer; |
@@ -48,6 +50,9 @@ import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingStr | @@ -48,6 +50,9 @@ import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingStr | ||
48 | import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingStrategyFactory; | 50 | import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingStrategyFactory; |
49 | import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategy; | 51 | import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategy; |
50 | import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategyFactory; | 52 | import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategyFactory; |
53 | +import org.thingsboard.server.service.rpc.FromDeviceRpcResponse; | ||
54 | +import org.thingsboard.server.service.rpc.TbCoreDeviceRpcService; | ||
55 | +import org.thingsboard.server.service.rpc.TbRuleEngineDeviceRpcService; | ||
51 | import org.thingsboard.server.service.stats.RuleEngineStatisticsService; | 56 | import org.thingsboard.server.service.stats.RuleEngineStatisticsService; |
52 | 57 | ||
53 | import javax.annotation.PostConstruct; | 58 | import javax.annotation.PostConstruct; |
@@ -81,6 +86,7 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService< | @@ -81,6 +86,7 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService< | ||
81 | private final TbRuleEngineQueueFactory tbRuleEngineQueueFactory; | 86 | private final TbRuleEngineQueueFactory tbRuleEngineQueueFactory; |
82 | private final TbQueueRuleEngineSettings ruleEngineSettings; | 87 | private final TbQueueRuleEngineSettings ruleEngineSettings; |
83 | private final RuleEngineStatisticsService statisticsService; | 88 | private final RuleEngineStatisticsService statisticsService; |
89 | + private final TbRuleEngineDeviceRpcService tbDeviceRpcService; | ||
84 | private final ConcurrentMap<String, TbQueueConsumer<TbProtoQueueMsg<ToRuleEngineMsg>>> consumers = new ConcurrentHashMap<>(); | 90 | private final ConcurrentMap<String, TbQueueConsumer<TbProtoQueueMsg<ToRuleEngineMsg>>> consumers = new ConcurrentHashMap<>(); |
85 | private final ConcurrentMap<String, TbRuleEngineQueueConfiguration> consumerConfigurations = new ConcurrentHashMap<>(); | 91 | private final ConcurrentMap<String, TbRuleEngineQueueConfiguration> consumerConfigurations = new ConcurrentHashMap<>(); |
86 | private final ConcurrentMap<String, TbRuleEngineConsumerStats> consumerStats = new ConcurrentHashMap<>(); | 92 | private final ConcurrentMap<String, TbRuleEngineConsumerStats> consumerStats = new ConcurrentHashMap<>(); |
@@ -90,13 +96,15 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService< | @@ -90,13 +96,15 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService< | ||
90 | TbRuleEngineSubmitStrategyFactory submitStrategyFactory, | 96 | TbRuleEngineSubmitStrategyFactory submitStrategyFactory, |
91 | TbQueueRuleEngineSettings ruleEngineSettings, | 97 | TbQueueRuleEngineSettings ruleEngineSettings, |
92 | TbRuleEngineQueueFactory tbRuleEngineQueueFactory, RuleEngineStatisticsService statisticsService, | 98 | TbRuleEngineQueueFactory tbRuleEngineQueueFactory, RuleEngineStatisticsService statisticsService, |
93 | - ActorSystemContext actorContext, DataDecodingEncodingService encodingService) { | 99 | + ActorSystemContext actorContext, DataDecodingEncodingService encodingService, |
100 | + TbRuleEngineDeviceRpcService tbDeviceRpcService) { | ||
94 | super(actorContext, encodingService, tbRuleEngineQueueFactory.createToRuleEngineNotificationsMsgConsumer()); | 101 | super(actorContext, encodingService, tbRuleEngineQueueFactory.createToRuleEngineNotificationsMsgConsumer()); |
95 | this.statisticsService = statisticsService; | 102 | this.statisticsService = statisticsService; |
96 | this.ruleEngineSettings = ruleEngineSettings; | 103 | this.ruleEngineSettings = ruleEngineSettings; |
97 | this.tbRuleEngineQueueFactory = tbRuleEngineQueueFactory; | 104 | this.tbRuleEngineQueueFactory = tbRuleEngineQueueFactory; |
98 | this.submitStrategyFactory = submitStrategyFactory; | 105 | this.submitStrategyFactory = submitStrategyFactory; |
99 | this.processingStrategyFactory = processingStrategyFactory; | 106 | this.processingStrategyFactory = processingStrategyFactory; |
107 | + this.tbDeviceRpcService = tbDeviceRpcService; | ||
100 | } | 108 | } |
101 | 109 | ||
102 | @PostConstruct | 110 | @PostConstruct |
@@ -227,7 +235,15 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService< | @@ -227,7 +235,15 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService< | ||
227 | actorContext.tell(actorMsg.get(), ActorRef.noSender()); | 235 | actorContext.tell(actorMsg.get(), ActorRef.noSender()); |
228 | } | 236 | } |
229 | callback.onSuccess(); | 237 | callback.onSuccess(); |
238 | + } else if (nfMsg.hasFromDeviceRpcResponse()) { | ||
239 | + TransportProtos.FromDeviceRPCResponseProto proto = nfMsg.getFromDeviceRpcResponse(); | ||
240 | + RpcError error = proto.getError() > 0 ? RpcError.values()[proto.getError()] : null; | ||
241 | + FromDeviceRpcResponse response = new FromDeviceRpcResponse(new UUID(proto.getRequestIdMSB(), proto.getRequestIdLSB()) | ||
242 | + , proto.getResponse(), error); | ||
243 | + tbDeviceRpcService.processRpcResponseFromDevice(response); | ||
244 | + callback.onSuccess(); | ||
230 | } else { | 245 | } else { |
246 | + log.trace("Received notification with missing handler"); | ||
231 | callback.onSuccess(); | 247 | callback.onSuccess(); |
232 | } | 248 | } |
233 | } | 249 | } |
@@ -23,7 +23,6 @@ import org.thingsboard.common.util.ThingsBoardThreadFactory; | @@ -23,7 +23,6 @@ import org.thingsboard.common.util.ThingsBoardThreadFactory; | ||
23 | import org.thingsboard.server.actors.ActorSystemContext; | 23 | import org.thingsboard.server.actors.ActorSystemContext; |
24 | import org.thingsboard.server.common.msg.queue.ServiceType; | 24 | import org.thingsboard.server.common.msg.queue.ServiceType; |
25 | import org.thingsboard.server.common.msg.queue.TbCallback; | 25 | import org.thingsboard.server.common.msg.queue.TbCallback; |
26 | -import org.thingsboard.server.gen.transport.TransportProtos; | ||
27 | import org.thingsboard.server.queue.TbQueueConsumer; | 26 | import org.thingsboard.server.queue.TbQueueConsumer; |
28 | import org.thingsboard.server.queue.common.TbProtoQueueMsg; | 27 | import org.thingsboard.server.queue.common.TbProtoQueueMsg; |
29 | import org.thingsboard.server.queue.discovery.PartitionChangeEvent; | 28 | import org.thingsboard.server.queue.discovery.PartitionChangeEvent; |
@@ -23,7 +23,6 @@ import java.util.LinkedHashMap; | @@ -23,7 +23,6 @@ import java.util.LinkedHashMap; | ||
23 | import java.util.Map; | 23 | import java.util.Map; |
24 | import java.util.UUID; | 24 | import java.util.UUID; |
25 | import java.util.concurrent.ConcurrentMap; | 25 | import java.util.concurrent.ConcurrentMap; |
26 | -import java.util.concurrent.ExecutorService; | ||
27 | import java.util.concurrent.atomic.AtomicInteger; | 26 | import java.util.concurrent.atomic.AtomicInteger; |
28 | import java.util.function.BiConsumer; | 27 | import java.util.function.BiConsumer; |
29 | 28 | ||
@@ -77,8 +76,8 @@ public class BatchTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSubmitS | @@ -77,8 +76,8 @@ public class BatchTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSubmitS | ||
77 | } | 76 | } |
78 | } | 77 | } |
79 | int submitSize = pendingPack.size(); | 78 | int submitSize = pendingPack.size(); |
80 | - if (log.isInfoEnabled() && submitSize > 0) { | ||
81 | - log.info("[{}] submitting [{}] messages to rule engine", queueName, submitSize); | 79 | + if (log.isDebugEnabled() && submitSize > 0) { |
80 | + log.debug("[{}] submitting [{}] messages to rule engine", queueName, submitSize); | ||
82 | } | 81 | } |
83 | pendingPack.forEach(msgConsumer); | 82 | pendingPack.forEach(msgConsumer); |
84 | } | 83 | } |
@@ -19,14 +19,8 @@ import lombok.extern.slf4j.Slf4j; | @@ -19,14 +19,8 @@ import lombok.extern.slf4j.Slf4j; | ||
19 | import org.thingsboard.server.gen.transport.TransportProtos; | 19 | import org.thingsboard.server.gen.transport.TransportProtos; |
20 | import org.thingsboard.server.queue.common.TbProtoQueueMsg; | 20 | import org.thingsboard.server.queue.common.TbProtoQueueMsg; |
21 | 21 | ||
22 | -import java.util.ArrayList; | ||
23 | -import java.util.List; | ||
24 | import java.util.UUID; | 22 | import java.util.UUID; |
25 | -import java.util.concurrent.ConcurrentMap; | ||
26 | -import java.util.concurrent.ExecutorService; | ||
27 | import java.util.function.BiConsumer; | 23 | import java.util.function.BiConsumer; |
28 | -import java.util.function.Function; | ||
29 | -import java.util.stream.Collectors; | ||
30 | 24 | ||
31 | @Slf4j | 25 | @Slf4j |
32 | public class BurstTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSubmitStrategy { | 26 | public class BurstTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSubmitStrategy { |
@@ -37,8 +31,8 @@ public class BurstTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSubmitS | @@ -37,8 +31,8 @@ public class BurstTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSubmitS | ||
37 | 31 | ||
38 | @Override | 32 | @Override |
39 | public void submitAttempt(BiConsumer<UUID, TbProtoQueueMsg<TransportProtos.ToRuleEngineMsg>> msgConsumer) { | 33 | public void submitAttempt(BiConsumer<UUID, TbProtoQueueMsg<TransportProtos.ToRuleEngineMsg>> msgConsumer) { |
40 | - if (log.isInfoEnabled()) { | ||
41 | - log.info("[{}] submitting [{}] messages to rule engine", queueName, orderedMsgList.size()); | 34 | + if (log.isDebugEnabled()) { |
35 | + log.debug("[{}] submitting [{}] messages to rule engine", queueName, orderedMsgList.size()); | ||
42 | } | 36 | } |
43 | orderedMsgList.forEach(pair -> msgConsumer.accept(pair.uuid, pair.msg)); | 37 | orderedMsgList.forEach(pair -> msgConsumer.accept(pair.uuid, pair.msg)); |
44 | } | 38 | } |
@@ -15,26 +15,18 @@ | @@ -15,26 +15,18 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.service.queue.processing; | 16 | package org.thingsboard.server.service.queue.processing; |
17 | 17 | ||
18 | -import com.google.protobuf.InvalidProtocolBufferException; | ||
19 | import lombok.extern.slf4j.Slf4j; | 18 | import lombok.extern.slf4j.Slf4j; |
20 | import org.thingsboard.server.common.data.id.EntityId; | 19 | import org.thingsboard.server.common.data.id.EntityId; |
21 | -import org.thingsboard.server.common.data.id.EntityIdFactory; | ||
22 | -import org.thingsboard.server.common.msg.TbMsg; | ||
23 | -import org.thingsboard.server.common.msg.gen.MsgProtos; | ||
24 | -import org.thingsboard.server.common.msg.queue.TbMsgCallback; | ||
25 | import org.thingsboard.server.gen.transport.TransportProtos; | 20 | import org.thingsboard.server.gen.transport.TransportProtos; |
26 | import org.thingsboard.server.queue.common.TbProtoQueueMsg; | 21 | import org.thingsboard.server.queue.common.TbProtoQueueMsg; |
27 | 22 | ||
28 | -import java.util.ArrayList; | ||
29 | import java.util.LinkedList; | 23 | import java.util.LinkedList; |
30 | import java.util.List; | 24 | import java.util.List; |
31 | import java.util.Queue; | 25 | import java.util.Queue; |
32 | import java.util.UUID; | 26 | import java.util.UUID; |
33 | import java.util.concurrent.ConcurrentHashMap; | 27 | import java.util.concurrent.ConcurrentHashMap; |
34 | import java.util.concurrent.ConcurrentMap; | 28 | import java.util.concurrent.ConcurrentMap; |
35 | -import java.util.concurrent.atomic.AtomicInteger; | ||
36 | import java.util.function.BiConsumer; | 29 | import java.util.function.BiConsumer; |
37 | -import java.util.stream.Collectors; | ||
38 | 30 | ||
39 | @Slf4j | 31 | @Slf4j |
40 | public abstract class SequentialByEntityIdTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSubmitStrategy { | 32 | public abstract class SequentialByEntityIdTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSubmitStrategy { |
@@ -30,6 +30,5 @@ public class SequentialByTenantIdTbRuleEngineSubmitStrategy extends SequentialBy | @@ -30,6 +30,5 @@ public class SequentialByTenantIdTbRuleEngineSubmitStrategy extends SequentialBy | ||
30 | @Override | 30 | @Override |
31 | protected EntityId getEntityId(TransportProtos.ToRuleEngineMsg msg) { | 31 | protected EntityId getEntityId(TransportProtos.ToRuleEngineMsg msg) { |
32 | return new TenantId(new UUID(msg.getTenantIdMSB(), msg.getTenantIdLSB())); | 32 | return new TenantId(new UUID(msg.getTenantIdMSB(), msg.getTenantIdLSB())); |
33 | - | ||
34 | } | 33 | } |
35 | } | 34 | } |
@@ -19,8 +19,6 @@ import lombok.extern.slf4j.Slf4j; | @@ -19,8 +19,6 @@ import lombok.extern.slf4j.Slf4j; | ||
19 | import org.thingsboard.server.gen.transport.TransportProtos; | 19 | import org.thingsboard.server.gen.transport.TransportProtos; |
20 | import org.thingsboard.server.queue.common.TbProtoQueueMsg; | 20 | import org.thingsboard.server.queue.common.TbProtoQueueMsg; |
21 | 21 | ||
22 | -import java.util.LinkedHashMap; | ||
23 | -import java.util.Map; | ||
24 | import java.util.UUID; | 22 | import java.util.UUID; |
25 | import java.util.concurrent.ConcurrentMap; | 23 | import java.util.concurrent.ConcurrentMap; |
26 | import java.util.concurrent.atomic.AtomicInteger; | 24 | import java.util.concurrent.atomic.AtomicInteger; |
@@ -63,8 +61,8 @@ public class SequentialTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSu | @@ -63,8 +61,8 @@ public class SequentialTbRuleEngineSubmitStrategy extends AbstractTbRuleEngineSu | ||
63 | if (idx < listSize) { | 61 | if (idx < listSize) { |
64 | IdMsgPair pair = orderedMsgList.get(idx); | 62 | IdMsgPair pair = orderedMsgList.get(idx); |
65 | expectedMsgId = pair.uuid; | 63 | expectedMsgId = pair.uuid; |
66 | - if (log.isInfoEnabled()) { | ||
67 | - log.info("[{}] submitting [{}] message to rule engine", queueName, pair.msg); | 64 | + if (log.isDebugEnabled()) { |
65 | + log.debug("[{}] submitting [{}] message to rule engine", queueName, pair.msg); | ||
68 | } | 66 | } |
69 | msgConsumer.accept(pair.uuid, pair.msg); | 67 | msgConsumer.accept(pair.uuid, pair.msg); |
70 | } | 68 | } |
@@ -82,10 +82,10 @@ public class TbRuleEngineProcessingStrategyFactory { | @@ -82,10 +82,10 @@ public class TbRuleEngineProcessingStrategyFactory { | ||
82 | retryCount++; | 82 | retryCount++; |
83 | double failedCount = result.getFailedMap().size() + result.getPendingMap().size(); | 83 | double failedCount = result.getFailedMap().size() + result.getPendingMap().size(); |
84 | if (maxRetries > 0 && retryCount > maxRetries) { | 84 | if (maxRetries > 0 && retryCount > maxRetries) { |
85 | - log.info("[{}] Skip reprocess of the rule engine pack due to max retries", queueName); | 85 | + log.debug("[{}] Skip reprocess of the rule engine pack due to max retries", queueName); |
86 | return new TbRuleEngineProcessingDecision(true, null); | 86 | return new TbRuleEngineProcessingDecision(true, null); |
87 | } else if (maxAllowedFailurePercentage > 0 && (failedCount / initialTotalCount) > maxAllowedFailurePercentage) { | 87 | } else if (maxAllowedFailurePercentage > 0 && (failedCount / initialTotalCount) > maxAllowedFailurePercentage) { |
88 | - log.info("[{}] Skip reprocess of the rule engine pack due to max allowed failure percentage", queueName); | 88 | + log.debug("[{}] Skip reprocess of the rule engine pack due to max allowed failure percentage", queueName); |
89 | return new TbRuleEngineProcessingDecision(true, null); | 89 | return new TbRuleEngineProcessingDecision(true, null); |
90 | } else { | 90 | } else { |
91 | ConcurrentMap<UUID, TbProtoQueueMsg<TransportProtos.ToRuleEngineMsg>> toReprocess = new ConcurrentHashMap<>(initialTotalCount); | 91 | ConcurrentMap<UUID, TbProtoQueueMsg<TransportProtos.ToRuleEngineMsg>> toReprocess = new ConcurrentHashMap<>(initialTotalCount); |
@@ -98,7 +98,7 @@ public class TbRuleEngineProcessingStrategyFactory { | @@ -98,7 +98,7 @@ public class TbRuleEngineProcessingStrategyFactory { | ||
98 | if (retrySuccessful) { | 98 | if (retrySuccessful) { |
99 | result.getSuccessMap().forEach(toReprocess::put); | 99 | result.getSuccessMap().forEach(toReprocess::put); |
100 | } | 100 | } |
101 | - log.info("[{}] Going to reprocess {} messages", queueName, toReprocess.size()); | 101 | + log.debug("[{}] Going to reprocess {} messages", queueName, toReprocess.size()); |
102 | if (log.isTraceEnabled()) { | 102 | if (log.isTraceEnabled()) { |
103 | toReprocess.forEach((id, msg) -> log.trace("Going to reprocess [{}]: {}", id, TbMsg.fromBytes(msg.getValue().getTbMsg().toByteArray(), TbMsgCallback.EMPTY))); | 103 | toReprocess.forEach((id, msg) -> log.trace("Going to reprocess [{}]: {}", id, TbMsg.fromBytes(msg.getValue().getTbMsg().toByteArray(), TbMsgCallback.EMPTY))); |
104 | } | 104 | } |
@@ -126,7 +126,7 @@ public class TbRuleEngineProcessingStrategyFactory { | @@ -126,7 +126,7 @@ public class TbRuleEngineProcessingStrategyFactory { | ||
126 | @Override | 126 | @Override |
127 | public TbRuleEngineProcessingDecision analyze(TbRuleEngineProcessingResult result) { | 127 | public TbRuleEngineProcessingDecision analyze(TbRuleEngineProcessingResult result) { |
128 | if (!result.isSuccess()) { | 128 | if (!result.isSuccess()) { |
129 | - log.info("[{}] Reprocessing skipped for {} failed and {} timeout messages", queueName, result.getFailedMap().size(), result.getPendingMap().size()); | 129 | + log.debug("[{}] Reprocessing skipped for {} failed and {} timeout messages", queueName, result.getFailedMap().size(), result.getPendingMap().size()); |
130 | } | 130 | } |
131 | if (log.isTraceEnabled()) { | 131 | if (log.isTraceEnabled()) { |
132 | result.getFailedMap().forEach((id, msg) -> log.trace("Failed messages [{}]: {}", id, TbMsg.fromBytes(msg.getValue().getTbMsg().toByteArray(), TbMsgCallback.EMPTY))); | 132 | result.getFailedMap().forEach((id, msg) -> log.trace("Failed messages [{}]: {}", id, TbMsg.fromBytes(msg.getValue().getTbMsg().toByteArray(), TbMsgCallback.EMPTY))); |
@@ -51,9 +51,9 @@ public class BasicOAuth2ClientMapper extends AbstractOAuth2ClientMapper implemen | @@ -51,9 +51,9 @@ public class BasicOAuth2ClientMapper extends AbstractOAuth2ClientMapper implemen | ||
51 | String firstName = getStringAttributeByKey(attributes, config.getBasic().getFirstNameAttributeKey()); | 51 | String firstName = getStringAttributeByKey(attributes, config.getBasic().getFirstNameAttributeKey()); |
52 | oauth2User.setFirstName(firstName); | 52 | oauth2User.setFirstName(firstName); |
53 | } | 53 | } |
54 | - if (!StringUtils.isEmpty(config.getBasic().getCustomerNameStrategyPattern())) { | 54 | + if (!StringUtils.isEmpty(config.getBasic().getCustomerNamePattern())) { |
55 | StrSubstitutor sub = new StrSubstitutor(attributes, START_PLACEHOLDER_PREFIX, END_PLACEHOLDER_PREFIX); | 55 | StrSubstitutor sub = new StrSubstitutor(attributes, START_PLACEHOLDER_PREFIX, END_PLACEHOLDER_PREFIX); |
56 | - String customerName = sub.replace(config.getBasic().getCustomerNameStrategyPattern()); | 56 | + String customerName = sub.replace(config.getBasic().getCustomerNamePattern()); |
57 | oauth2User.setCustomerName(customerName); | 57 | oauth2User.setCustomerName(customerName); |
58 | } | 58 | } |
59 | return getOrCreateSecurityUserFromOAuth2User(oauth2User, config.getBasic().isAllowUserCreation()); | 59 | return getOrCreateSecurityUserFromOAuth2User(oauth2User, config.getBasic().isAllowUserCreation()); |
@@ -68,7 +68,7 @@ public class BasicOAuth2ClientMapper extends AbstractOAuth2ClientMapper implemen | @@ -68,7 +68,7 @@ public class BasicOAuth2ClientMapper extends AbstractOAuth2ClientMapper implemen | ||
68 | return email.substring(email .indexOf("@") + 1); | 68 | return email.substring(email .indexOf("@") + 1); |
69 | case CUSTOM_TENANT_STRATEGY: | 69 | case CUSTOM_TENANT_STRATEGY: |
70 | StrSubstitutor sub = new StrSubstitutor(attributes, START_PLACEHOLDER_PREFIX, END_PLACEHOLDER_PREFIX); | 70 | StrSubstitutor sub = new StrSubstitutor(attributes, START_PLACEHOLDER_PREFIX, END_PLACEHOLDER_PREFIX); |
71 | - return sub.replace(config.getBasic().getTenantNameStrategyPattern()); | 71 | + return sub.replace(config.getBasic().getTenantNamePattern()); |
72 | default: | 72 | default: |
73 | throw new RuntimeException("Tenant Name Strategy with type " + config.getBasic().getTenantNameStrategy() + " is not supported!"); | 73 | throw new RuntimeException("Tenant Name Strategy with type " + config.getBasic().getTenantNameStrategy() + " is not supported!"); |
74 | } | 74 | } |
@@ -78,7 +78,6 @@ public class BasicOAuth2ClientMapper extends AbstractOAuth2ClientMapper implemen | @@ -78,7 +78,6 @@ public class BasicOAuth2ClientMapper extends AbstractOAuth2ClientMapper implemen | ||
78 | String result = null; | 78 | String result = null; |
79 | try { | 79 | try { |
80 | result = (String) attributes.get(key); | 80 | result = (String) attributes.get(key); |
81 | - | ||
82 | } catch (Exception e) { | 81 | } catch (Exception e) { |
83 | log.warn("Can't convert attribute to String by key " + key); | 82 | log.warn("Can't convert attribute to String by key " + key); |
84 | } | 83 | } |
@@ -41,7 +41,7 @@ public class CustomOAuth2ClientMapper extends AbstractOAuth2ClientMapper impleme | @@ -41,7 +41,7 @@ public class CustomOAuth2ClientMapper extends AbstractOAuth2ClientMapper impleme | ||
41 | return getOrCreateSecurityUserFromOAuth2User(oauth2User, config.getBasic().isAllowUserCreation()); | 41 | return getOrCreateSecurityUserFromOAuth2User(oauth2User, config.getBasic().isAllowUserCreation()); |
42 | } | 42 | } |
43 | 43 | ||
44 | - public OAuth2User getOAuth2User(OAuth2AuthenticationToken token, OAuth2ClientMapperConfig.CustomOAuth2ClientMapperConfig custom) { | 44 | + private synchronized OAuth2User getOAuth2User(OAuth2AuthenticationToken token, OAuth2ClientMapperConfig.CustomOAuth2ClientMapperConfig custom) { |
45 | if (!StringUtils.isEmpty(custom.getUsername()) && !StringUtils.isEmpty(custom.getPassword())) { | 45 | if (!StringUtils.isEmpty(custom.getUsername()) && !StringUtils.isEmpty(custom.getPassword())) { |
46 | restTemplateBuilder = restTemplateBuilder.basicAuthentication(custom.getUsername(), custom.getPassword()); | 46 | restTemplateBuilder = restTemplateBuilder.basicAuthentication(custom.getUsername(), custom.getPassword()); |
47 | } | 47 | } |
@@ -126,8 +126,8 @@ security: | @@ -126,8 +126,8 @@ security: | ||
126 | firstNameAttributeKey: "${SECURITY_OAUTH2_DEFAULT_MAPPER_BASIC_FIRST_NAME_ATTRIBUTE_KEY:}" | 126 | firstNameAttributeKey: "${SECURITY_OAUTH2_DEFAULT_MAPPER_BASIC_FIRST_NAME_ATTRIBUTE_KEY:}" |
127 | lastNameAttributeKey: "${SECURITY_OAUTH2_DEFAULT_MAPPER_BASIC_LAST_NAME_ATTRIBUTE_KEY:}" | 127 | lastNameAttributeKey: "${SECURITY_OAUTH2_DEFAULT_MAPPER_BASIC_LAST_NAME_ATTRIBUTE_KEY:}" |
128 | tenantNameStrategy: "${SECURITY_OAUTH2_DEFAULT_MAPPER_BASIC_TENANT_NAME_STRATEGY:domain}" # domain, email or custom | 128 | tenantNameStrategy: "${SECURITY_OAUTH2_DEFAULT_MAPPER_BASIC_TENANT_NAME_STRATEGY:domain}" # domain, email or custom |
129 | - tenantNameStrategyPattern: "${SECURITY_OAUTH2_DEFAULT_MAPPER_BASIC_TENANT_NAME_STRATEGY_PATTERN:}" | ||
130 | - customerNameStrategyPattern: "${SECURITY_OAUTH2_DEFAULT_MAPPER_BASIC_CUSTOMER_NAME_STRATEGY_PATTERN:}" | 129 | + tenantNamePattern: "${SECURITY_OAUTH2_DEFAULT_MAPPER_BASIC_TENANT_NAME_PATTERN:}" # %{attribute_key} as placeholder for attributes value by key |
130 | + customerNamePattern: "${SECURITY_OAUTH2_DEFAULT_MAPPER_BASIC_CUSTOMER_NAME_PATTERN:}" # %{attribute_key} as placeholder for attributes value by key | ||
131 | custom: | 131 | custom: |
132 | url: "${SECURITY_OAUTH2_DEFAULT_MAPPER_CUSTOM_URL:}" | 132 | url: "${SECURITY_OAUTH2_DEFAULT_MAPPER_CUSTOM_URL:}" |
133 | username: "${SECURITY_OAUTH2_DEFAULT_MAPPER_CUSTOM_USERNAME:}" | 133 | username: "${SECURITY_OAUTH2_DEFAULT_MAPPER_CUSTOM_USERNAME:}" |
@@ -637,7 +637,7 @@ queue: | @@ -637,7 +637,7 @@ queue: | ||
637 | pack-processing-timeout: "${TB_QUEUE_CORE_PACK_PROCESSING_TIMEOUT_MS:60000}" | 637 | pack-processing-timeout: "${TB_QUEUE_CORE_PACK_PROCESSING_TIMEOUT_MS:60000}" |
638 | stats: | 638 | stats: |
639 | enabled: "${TB_QUEUE_CORE_STATS_ENABLED:true}" | 639 | enabled: "${TB_QUEUE_CORE_STATS_ENABLED:true}" |
640 | - print-interval-ms: "${TB_QUEUE_CORE_STATS_PRINT_INTERVAL_MS:10000}" | 640 | + print-interval-ms: "${TB_QUEUE_CORE_STATS_PRINT_INTERVAL_MS:60000}" |
641 | js: | 641 | js: |
642 | # JS Eval request topic | 642 | # JS Eval request topic |
643 | request_topic: "${REMOTE_JS_EVAL_REQUEST_TOPIC:js_eval.requests}" | 643 | request_topic: "${REMOTE_JS_EVAL_REQUEST_TOPIC:js_eval.requests}" |
@@ -657,7 +657,7 @@ queue: | @@ -657,7 +657,7 @@ queue: | ||
657 | pack-processing-timeout: "${TB_QUEUE_RULE_ENGINE_PACK_PROCESSING_TIMEOUT_MS:60000}" | 657 | pack-processing-timeout: "${TB_QUEUE_RULE_ENGINE_PACK_PROCESSING_TIMEOUT_MS:60000}" |
658 | stats: | 658 | stats: |
659 | enabled: "${TB_QUEUE_RULE_ENGINE_STATS_ENABLED:true}" | 659 | enabled: "${TB_QUEUE_RULE_ENGINE_STATS_ENABLED:true}" |
660 | - print-interval-ms: "${TB_QUEUE_RULE_ENGINE_STATS_PRINT_INTERVAL_MS:10000}" | 660 | + print-interval-ms: "${TB_QUEUE_RULE_ENGINE_STATS_PRINT_INTERVAL_MS:60000}" |
661 | queues: | 661 | queues: |
662 | - name: "${TB_QUEUE_RE_MAIN_QUEUE_NAME:Main}" | 662 | - name: "${TB_QUEUE_RE_MAIN_QUEUE_NAME:Main}" |
663 | topic: "${TB_QUEUE_RE_MAIN_TOPIC:tb_rule_engine.main}" | 663 | topic: "${TB_QUEUE_RE_MAIN_TOPIC:tb_rule_engine.main}" |
@@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.id.RuleNodeId; | @@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.id.RuleNodeId; | ||
27 | import org.thingsboard.server.common.msg.gen.MsgProtos; | 27 | import org.thingsboard.server.common.msg.gen.MsgProtos; |
28 | import org.thingsboard.server.common.msg.queue.TbMsgCallback; | 28 | import org.thingsboard.server.common.msg.queue.TbMsgCallback; |
29 | 29 | ||
30 | +import java.io.IOException; | ||
30 | import java.io.Serializable; | 31 | import java.io.Serializable; |
31 | import java.util.UUID; | 32 | import java.util.UUID; |
32 | 33 | ||
@@ -47,7 +48,7 @@ public final class TbMsg implements Serializable { | @@ -47,7 +48,7 @@ public final class TbMsg implements Serializable { | ||
47 | private final RuleChainId ruleChainId; | 48 | private final RuleChainId ruleChainId; |
48 | private final RuleNodeId ruleNodeId; | 49 | private final RuleNodeId ruleNodeId; |
49 | //This field is not serialized because we use queues and there is no need to do it | 50 | //This field is not serialized because we use queues and there is no need to do it |
50 | - private final TbMsgCallback callback; | 51 | + transient private final TbMsgCallback callback; |
51 | 52 | ||
52 | public static TbMsg newMsg(String type, EntityId originator, TbMsgMetaData metaData, String data) { | 53 | public static TbMsg newMsg(String type, EntityId originator, TbMsgMetaData metaData, String data) { |
53 | return new TbMsg(UUID.randomUUID(), type, originator, metaData.copy(), TbMsgDataType.JSON, data, null, null, TbMsgCallback.EMPTY); | 54 | return new TbMsg(UUID.randomUUID(), type, originator, metaData.copy(), TbMsgDataType.JSON, data, null, null, TbMsgCallback.EMPTY); |
@@ -156,4 +157,13 @@ public final class TbMsg implements Serializable { | @@ -156,4 +157,13 @@ public final class TbMsg implements Serializable { | ||
156 | public TbMsg copyWithRuleNodeId(RuleChainId ruleChainId, RuleNodeId ruleNodeId) { | 157 | public TbMsg copyWithRuleNodeId(RuleChainId ruleChainId, RuleNodeId ruleNodeId) { |
157 | return new TbMsg(this.id, this.type, this.originator, this.metaData, this.dataType, this.data, ruleChainId, ruleNodeId, callback); | 158 | return new TbMsg(this.id, this.type, this.originator, this.metaData, this.dataType, this.data, ruleChainId, ruleNodeId, callback); |
158 | } | 159 | } |
160 | + | ||
161 | + public TbMsgCallback getCallback() { | ||
162 | + //May be null in case of deserialization; | ||
163 | + if (callback != null) { | ||
164 | + return callback; | ||
165 | + } else { | ||
166 | + return TbMsgCallback.EMPTY; | ||
167 | + } | ||
168 | + } | ||
159 | } | 169 | } |
@@ -36,9 +36,15 @@ public class RuleNodeException extends RuleEngineException { | @@ -36,9 +36,15 @@ public class RuleNodeException extends RuleEngineException { | ||
36 | public RuleNodeException(String message, String ruleChainName, RuleNode ruleNode) { | 36 | public RuleNodeException(String message, String ruleChainName, RuleNode ruleNode) { |
37 | super(message); | 37 | super(message); |
38 | this.ruleChainName = ruleChainName; | 38 | this.ruleChainName = ruleChainName; |
39 | - this.ruleNodeName = ruleNode.getName(); | ||
40 | - this.ruleChainId = ruleNode.getRuleChainId(); | ||
41 | - this.ruleNodeId = ruleNode.getId(); | 39 | + if (ruleNode != null) { |
40 | + this.ruleNodeName = ruleNode.getName(); | ||
41 | + this.ruleChainId = ruleNode.getRuleChainId(); | ||
42 | + this.ruleNodeId = ruleNode.getId(); | ||
43 | + } else { | ||
44 | + ruleNodeName = "Unknown"; | ||
45 | + ruleChainId = new RuleChainId(RuleChainId.NULL_UUID); | ||
46 | + ruleNodeId = new RuleNodeId(RuleNodeId.NULL_UUID); | ||
47 | + } | ||
42 | } | 48 | } |
43 | 49 | ||
44 | public String toJsonString() { | 50 | public String toJsonString() { |
@@ -67,6 +67,7 @@ public class TbServiceBusAdmin implements TbQueueAdmin { | @@ -67,6 +67,7 @@ public class TbServiceBusAdmin implements TbQueueAdmin { | ||
67 | 67 | ||
68 | try { | 68 | try { |
69 | QueueDescription queueDescription = new QueueDescription(topic); | 69 | QueueDescription queueDescription = new QueueDescription(topic); |
70 | + queueDescription.setRequiresDuplicateDetection(false); | ||
70 | setQueueConfigs(queueDescription); | 71 | setQueueConfigs(queueDescription); |
71 | 72 | ||
72 | client.createQueue(queueDescription); | 73 | client.createQueue(queueDescription); |
@@ -31,9 +31,9 @@ import org.apache.qpid.proton.amqp.transport.SenderSettleMode; | @@ -31,9 +31,9 @@ import org.apache.qpid.proton.amqp.transport.SenderSettleMode; | ||
31 | import org.springframework.util.CollectionUtils; | 31 | import org.springframework.util.CollectionUtils; |
32 | import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; | 32 | import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; |
33 | import org.thingsboard.server.queue.TbQueueAdmin; | 33 | import org.thingsboard.server.queue.TbQueueAdmin; |
34 | -import org.thingsboard.server.queue.TbQueueConsumer; | ||
35 | import org.thingsboard.server.queue.TbQueueMsg; | 34 | import org.thingsboard.server.queue.TbQueueMsg; |
36 | import org.thingsboard.server.queue.TbQueueMsgDecoder; | 35 | import org.thingsboard.server.queue.TbQueueMsgDecoder; |
36 | +import org.thingsboard.server.queue.common.AbstractTbQueueConsumerTemplate; | ||
37 | import org.thingsboard.server.queue.common.DefaultTbQueueMsg; | 37 | import org.thingsboard.server.queue.common.DefaultTbQueueMsg; |
38 | 38 | ||
39 | import java.time.Duration; | 39 | import java.time.Duration; |
@@ -50,102 +50,72 @@ import java.util.stream.Collectors; | @@ -50,102 +50,72 @@ import java.util.stream.Collectors; | ||
50 | import java.util.stream.Stream; | 50 | import java.util.stream.Stream; |
51 | 51 | ||
52 | @Slf4j | 52 | @Slf4j |
53 | -public class TbServiceBusConsumerTemplate<T extends TbQueueMsg> implements TbQueueConsumer<T> { | 53 | +public class TbServiceBusConsumerTemplate<T extends TbQueueMsg> extends AbstractTbQueueConsumerTemplate<MessageWithDeliveryTag, T> { |
54 | private final TbQueueAdmin admin; | 54 | private final TbQueueAdmin admin; |
55 | - private final String topic; | ||
56 | private final TbQueueMsgDecoder<T> decoder; | 55 | private final TbQueueMsgDecoder<T> decoder; |
57 | private final TbServiceBusSettings serviceBusSettings; | 56 | private final TbServiceBusSettings serviceBusSettings; |
58 | 57 | ||
59 | private final Gson gson = new Gson(); | 58 | private final Gson gson = new Gson(); |
60 | 59 | ||
61 | private Set<CoreMessageReceiver> receivers; | 60 | private Set<CoreMessageReceiver> receivers; |
62 | - private volatile Set<TopicPartitionInfo> partitions; | ||
63 | - private volatile boolean subscribed; | ||
64 | - private volatile boolean stopped = false; | ||
65 | - private Map<CoreMessageReceiver, Collection<MessageWithDeliveryTag>> pendingMessages = new ConcurrentHashMap<>(); | 61 | + private final Map<CoreMessageReceiver, Collection<MessageWithDeliveryTag>> pendingMessages = new ConcurrentHashMap<>(); |
66 | private volatile int messagesPerQueue; | 62 | private volatile int messagesPerQueue; |
67 | 63 | ||
68 | public TbServiceBusConsumerTemplate(TbQueueAdmin admin, TbServiceBusSettings serviceBusSettings, String topic, TbQueueMsgDecoder<T> decoder) { | 64 | public TbServiceBusConsumerTemplate(TbQueueAdmin admin, TbServiceBusSettings serviceBusSettings, String topic, TbQueueMsgDecoder<T> decoder) { |
65 | + super(topic); | ||
69 | this.admin = admin; | 66 | this.admin = admin; |
70 | this.decoder = decoder; | 67 | this.decoder = decoder; |
71 | - this.topic = topic; | ||
72 | this.serviceBusSettings = serviceBusSettings; | 68 | this.serviceBusSettings = serviceBusSettings; |
73 | } | 69 | } |
74 | 70 | ||
75 | @Override | 71 | @Override |
76 | - public String getTopic() { | ||
77 | - return topic; | 72 | + protected List<MessageWithDeliveryTag> doPoll(long durationInMillis) { |
73 | + List<CompletableFuture<Collection<MessageWithDeliveryTag>>> messageFutures = | ||
74 | + receivers.stream() | ||
75 | + .map(receiver -> receiver | ||
76 | + .receiveAsync(messagesPerQueue, Duration.ofMillis(durationInMillis)) | ||
77 | + .whenComplete((messages, err) -> { | ||
78 | + if (!CollectionUtils.isEmpty(messages)) { | ||
79 | + pendingMessages.put(receiver, messages); | ||
80 | + } else if (err != null) { | ||
81 | + log.error("Failed to receive messages.", err); | ||
82 | + } | ||
83 | + })) | ||
84 | + .collect(Collectors.toList()); | ||
85 | + try { | ||
86 | + return fromList(messageFutures) | ||
87 | + .get() | ||
88 | + .stream() | ||
89 | + .flatMap(messages -> CollectionUtils.isEmpty(messages) ? Stream.empty() : messages.stream()) | ||
90 | + .collect(Collectors.toList()); | ||
91 | + } catch (InterruptedException | ExecutionException e) { | ||
92 | + if (stopped) { | ||
93 | + log.info("[{}] Service Bus consumer is stopped.", getTopic()); | ||
94 | + } else { | ||
95 | + log.error("Failed to receive messages", e); | ||
96 | + } | ||
97 | + return Collections.emptyList(); | ||
98 | + } | ||
78 | } | 99 | } |
79 | 100 | ||
80 | @Override | 101 | @Override |
81 | - public void subscribe() { | ||
82 | - partitions = Collections.singleton(new TopicPartitionInfo(topic, null, null, true)); | ||
83 | - subscribed = false; | 102 | + protected void doSubscribe(List<String> topicNames) { |
103 | + createReceivers(); | ||
104 | + messagesPerQueue = receivers.size() / partitions.size(); | ||
84 | } | 105 | } |
85 | 106 | ||
86 | @Override | 107 | @Override |
87 | - public void subscribe(Set<TopicPartitionInfo> partitions) { | ||
88 | - this.partitions = partitions; | ||
89 | - subscribed = false; | 108 | + protected void doCommit() { |
109 | + pendingMessages.forEach((receiver, msgs) -> | ||
110 | + msgs.forEach(msg -> receiver.completeMessageAsync(msg.getDeliveryTag(), TransactionContext.NULL_TXN))); | ||
111 | + pendingMessages.clear(); | ||
90 | } | 112 | } |
91 | 113 | ||
92 | @Override | 114 | @Override |
93 | - public void unsubscribe() { | ||
94 | - stopped = true; | 115 | + protected void doUnsubscribe() { |
95 | receivers.forEach(CoreMessageReceiver::closeAsync); | 116 | receivers.forEach(CoreMessageReceiver::closeAsync); |
96 | } | 117 | } |
97 | 118 | ||
98 | - @Override | ||
99 | - public List<T> poll(long durationInMillis) { | ||
100 | - if (!subscribed && partitions == null) { | ||
101 | - try { | ||
102 | - Thread.sleep(durationInMillis); | ||
103 | - } catch (InterruptedException e) { | ||
104 | - log.debug("Failed to await subscription", e); | ||
105 | - } | ||
106 | - } else { | ||
107 | - if (!subscribed) { | ||
108 | - createReceivers(); | ||
109 | - messagesPerQueue = receivers.size() / partitions.size(); | ||
110 | - subscribed = true; | ||
111 | - } | ||
112 | - | ||
113 | - List<CompletableFuture<Collection<MessageWithDeliveryTag>>> messageFutures = | ||
114 | - receivers.stream() | ||
115 | - .map(receiver -> receiver | ||
116 | - .receiveAsync(messagesPerQueue, Duration.ofMillis(durationInMillis)) | ||
117 | - .whenComplete((messages, err) -> { | ||
118 | - if (!CollectionUtils.isEmpty(messages)) { | ||
119 | - pendingMessages.put(receiver, messages); | ||
120 | - } else if (err != null) { | ||
121 | - log.error("Failed to receive messages.", err); | ||
122 | - } | ||
123 | - })) | ||
124 | - .collect(Collectors.toList()); | ||
125 | - try { | ||
126 | - return fromList(messageFutures) | ||
127 | - .get() | ||
128 | - .stream() | ||
129 | - .flatMap(messages -> CollectionUtils.isEmpty(messages) ? Stream.empty() : messages.stream()) | ||
130 | - .map(message -> { | ||
131 | - try { | ||
132 | - return decode(message); | ||
133 | - } catch (InvalidProtocolBufferException e) { | ||
134 | - log.error("Failed to parse message.", e); | ||
135 | - throw new RuntimeException("Failed to parse message.", e); | ||
136 | - } | ||
137 | - }).collect(Collectors.toList()); | ||
138 | - } catch (InterruptedException | ExecutionException e) { | ||
139 | - if (stopped) { | ||
140 | - log.info("[{}] Service Bus consumer is stopped.", topic); | ||
141 | - } else { | ||
142 | - log.error("Failed to receive messages", e); | ||
143 | - } | ||
144 | - } | ||
145 | - } | ||
146 | - return Collections.emptyList(); | ||
147 | - } | ||
148 | - | ||
149 | private void createReceivers() { | 119 | private void createReceivers() { |
150 | List<CompletableFuture<CoreMessageReceiver>> receiverFutures = partitions.stream() | 120 | List<CompletableFuture<CoreMessageReceiver>> receiverFutures = partitions.stream() |
151 | .map(TopicPartitionInfo::getFullTopicName) | 121 | .map(TopicPartitionInfo::getFullTopicName) |
@@ -167,7 +137,7 @@ public class TbServiceBusConsumerTemplate<T extends TbQueueMsg> implements TbQue | @@ -167,7 +137,7 @@ public class TbServiceBusConsumerTemplate<T extends TbQueueMsg> implements TbQue | ||
167 | receivers = new HashSet<>(fromList(receiverFutures).get()); | 137 | receivers = new HashSet<>(fromList(receiverFutures).get()); |
168 | } catch (InterruptedException | ExecutionException e) { | 138 | } catch (InterruptedException | ExecutionException e) { |
169 | if (stopped) { | 139 | if (stopped) { |
170 | - log.info("[{}] Service Bus consumer is stopped.", topic); | 140 | + log.info("[{}] Service Bus consumer is stopped.", getTopic()); |
171 | } else { | 141 | } else { |
172 | log.error("Failed to create receivers", e); | 142 | log.error("Failed to create receivers", e); |
173 | } | 143 | } |
@@ -196,13 +166,7 @@ public class TbServiceBusConsumerTemplate<T extends TbQueueMsg> implements TbQue | @@ -196,13 +166,7 @@ public class TbServiceBusConsumerTemplate<T extends TbQueueMsg> implements TbQue | ||
196 | } | 166 | } |
197 | 167 | ||
198 | @Override | 168 | @Override |
199 | - public void commit() { | ||
200 | - pendingMessages.forEach((receiver, msgs) -> | ||
201 | - msgs.forEach(msg -> receiver.completeMessageAsync(msg.getDeliveryTag(), TransactionContext.NULL_TXN))); | ||
202 | - pendingMessages.clear(); | ||
203 | - } | ||
204 | - | ||
205 | - private T decode(MessageWithDeliveryTag data) throws InvalidProtocolBufferException { | 169 | + protected T decode(MessageWithDeliveryTag data) throws InvalidProtocolBufferException { |
206 | DefaultTbQueueMsg msg = gson.fromJson(new String(((Data) data.getMessage().getBody()).getValue().getArray()), DefaultTbQueueMsg.class); | 170 | DefaultTbQueueMsg msg = gson.fromJson(new String(((Data) data.getMessage().getBody()).getValue().getArray()), DefaultTbQueueMsg.class); |
207 | return decoder.decode(msg); | 171 | return decoder.decode(msg); |
208 | } | 172 | } |
@@ -33,6 +33,7 @@ import org.thingsboard.server.queue.common.DefaultTbQueueMsg; | @@ -33,6 +33,7 @@ import org.thingsboard.server.queue.common.DefaultTbQueueMsg; | ||
33 | import java.util.HashMap; | 33 | import java.util.HashMap; |
34 | import java.util.Map; | 34 | import java.util.Map; |
35 | import java.util.concurrent.CompletableFuture; | 35 | import java.util.concurrent.CompletableFuture; |
36 | +import java.util.concurrent.ConcurrentHashMap; | ||
36 | import java.util.concurrent.ExecutorService; | 37 | import java.util.concurrent.ExecutorService; |
37 | import java.util.concurrent.Executors; | 38 | import java.util.concurrent.Executors; |
38 | 39 | ||
@@ -42,14 +43,14 @@ public class TbServiceBusProducerTemplate<T extends TbQueueMsg> implements TbQue | @@ -42,14 +43,14 @@ public class TbServiceBusProducerTemplate<T extends TbQueueMsg> implements TbQue | ||
42 | private final Gson gson = new Gson(); | 43 | private final Gson gson = new Gson(); |
43 | private final TbQueueAdmin admin; | 44 | private final TbQueueAdmin admin; |
44 | private final TbServiceBusSettings serviceBusSettings; | 45 | private final TbServiceBusSettings serviceBusSettings; |
45 | - private final Map<String, QueueClient> clients = new HashMap<>(); | ||
46 | - private ExecutorService executorService; | 46 | + private final Map<String, QueueClient> clients = new ConcurrentHashMap<>(); |
47 | + private final ExecutorService executorService; | ||
47 | 48 | ||
48 | public TbServiceBusProducerTemplate(TbQueueAdmin admin, TbServiceBusSettings serviceBusSettings, String defaultTopic) { | 49 | public TbServiceBusProducerTemplate(TbQueueAdmin admin, TbServiceBusSettings serviceBusSettings, String defaultTopic) { |
49 | this.admin = admin; | 50 | this.admin = admin; |
50 | this.defaultTopic = defaultTopic; | 51 | this.defaultTopic = defaultTopic; |
51 | this.serviceBusSettings = serviceBusSettings; | 52 | this.serviceBusSettings = serviceBusSettings; |
52 | - executorService = Executors.newSingleThreadExecutor(); | 53 | + executorService = Executors.newCachedThreadPool(); |
53 | } | 54 | } |
54 | 55 | ||
55 | @Override | 56 | @Override |
1 | +/** | ||
2 | + * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.queue.common; | ||
17 | + | ||
18 | +import com.google.common.util.concurrent.ListeningExecutorService; | ||
19 | +import com.google.common.util.concurrent.MoreExecutors; | ||
20 | +import lombok.extern.slf4j.Slf4j; | ||
21 | +import org.thingsboard.server.queue.TbQueueMsg; | ||
22 | + | ||
23 | +import java.util.concurrent.Executors; | ||
24 | +import java.util.concurrent.TimeUnit; | ||
25 | + | ||
26 | +@Slf4j | ||
27 | +public abstract class AbstractParallelTbQueueConsumerTemplate<R, T extends TbQueueMsg> extends AbstractTbQueueConsumerTemplate<R, T> { | ||
28 | + | ||
29 | + protected ListeningExecutorService consumerExecutor; | ||
30 | + | ||
31 | + public AbstractParallelTbQueueConsumerTemplate(String topic) { | ||
32 | + super(topic); | ||
33 | + } | ||
34 | + | ||
35 | + protected void initNewExecutor(int threadPoolSize) { | ||
36 | + if (consumerExecutor != null) { | ||
37 | + consumerExecutor.shutdown(); | ||
38 | + try { | ||
39 | + consumerExecutor.awaitTermination(1, TimeUnit.MINUTES); | ||
40 | + } catch (InterruptedException e) { | ||
41 | + log.trace("Interrupted while waiting for consumer executor to stop"); | ||
42 | + } | ||
43 | + } | ||
44 | + consumerExecutor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(threadPoolSize)); | ||
45 | + } | ||
46 | + | ||
47 | + protected void shutdownExecutor() { | ||
48 | + if (consumerExecutor != null) { | ||
49 | + consumerExecutor.shutdownNow(); | ||
50 | + } | ||
51 | + } | ||
52 | + | ||
53 | +} |
common/queue/src/main/java/org/thingsboard/server/queue/common/AbstractTbQueueConsumerTemplate.java
0 → 100644
1 | +/** | ||
2 | + * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.queue.common; | ||
17 | + | ||
18 | +import lombok.Getter; | ||
19 | +import lombok.extern.slf4j.Slf4j; | ||
20 | +import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; | ||
21 | +import org.thingsboard.server.queue.TbQueueConsumer; | ||
22 | +import org.thingsboard.server.queue.TbQueueMsg; | ||
23 | + | ||
24 | +import java.io.IOException; | ||
25 | +import java.util.ArrayList; | ||
26 | +import java.util.Collections; | ||
27 | +import java.util.List; | ||
28 | +import java.util.Set; | ||
29 | +import java.util.concurrent.locks.Lock; | ||
30 | +import java.util.concurrent.locks.ReentrantLock; | ||
31 | +import java.util.stream.Collectors; | ||
32 | + | ||
33 | +@Slf4j | ||
34 | +public abstract class AbstractTbQueueConsumerTemplate<R, T extends TbQueueMsg> implements TbQueueConsumer<T> { | ||
35 | + | ||
36 | + private volatile boolean subscribed; | ||
37 | + protected volatile boolean stopped = false; | ||
38 | + protected volatile Set<TopicPartitionInfo> partitions; | ||
39 | + protected final Lock consumerLock = new ReentrantLock(); | ||
40 | + | ||
41 | + @Getter | ||
42 | + private final String topic; | ||
43 | + | ||
44 | + public AbstractTbQueueConsumerTemplate(String topic) { | ||
45 | + this.topic = topic; | ||
46 | + } | ||
47 | + | ||
48 | + @Override | ||
49 | + public void subscribe() { | ||
50 | + consumerLock.lock(); | ||
51 | + try { | ||
52 | + partitions = Collections.singleton(new TopicPartitionInfo(topic, null, null, true)); | ||
53 | + subscribed = false; | ||
54 | + } finally { | ||
55 | + consumerLock.unlock(); | ||
56 | + } | ||
57 | + } | ||
58 | + | ||
59 | + @Override | ||
60 | + public void subscribe(Set<TopicPartitionInfo> partitions) { | ||
61 | + consumerLock.lock(); | ||
62 | + try { | ||
63 | + this.partitions = partitions; | ||
64 | + subscribed = false; | ||
65 | + } finally { | ||
66 | + consumerLock.unlock(); | ||
67 | + } | ||
68 | + } | ||
69 | + | ||
70 | + @Override | ||
71 | + public List<T> poll(long durationInMillis) { | ||
72 | + if (!subscribed && partitions == null) { | ||
73 | + try { | ||
74 | + Thread.sleep(durationInMillis); | ||
75 | + } catch (InterruptedException e) { | ||
76 | + log.debug("Failed to await subscription", e); | ||
77 | + } | ||
78 | + } else { | ||
79 | + long pollStartTs = System.currentTimeMillis(); | ||
80 | + consumerLock.lock(); | ||
81 | + try { | ||
82 | + if (!subscribed) { | ||
83 | + List<String> topicNames = partitions.stream().map(TopicPartitionInfo::getFullTopicName).collect(Collectors.toList()); | ||
84 | + doSubscribe(topicNames); | ||
85 | + subscribed = true; | ||
86 | + } | ||
87 | + | ||
88 | + List<R> records = doPoll(durationInMillis); | ||
89 | + if (!records.isEmpty()) { | ||
90 | + List<T> result = new ArrayList<>(records.size()); | ||
91 | + records.forEach(record -> { | ||
92 | + try { | ||
93 | + if (record != null) { | ||
94 | + result.add(decode(record)); | ||
95 | + } | ||
96 | + } catch (IOException e) { | ||
97 | + log.error("Failed decode record: [{}]", record); | ||
98 | + throw new RuntimeException("Failed to decode record: ", e); | ||
99 | + } | ||
100 | + }); | ||
101 | + return result; | ||
102 | + } else { | ||
103 | + long pollDuration = System.currentTimeMillis() - pollStartTs; | ||
104 | + if (pollDuration < durationInMillis) { | ||
105 | + try { | ||
106 | + Thread.sleep(durationInMillis - pollDuration); | ||
107 | + } catch (InterruptedException e) { | ||
108 | + if (!stopped) { | ||
109 | + log.error("Failed to wait.", e); | ||
110 | + } | ||
111 | + } | ||
112 | + } | ||
113 | + } | ||
114 | + } finally { | ||
115 | + consumerLock.unlock(); | ||
116 | + } | ||
117 | + } | ||
118 | + return Collections.emptyList(); | ||
119 | + } | ||
120 | + | ||
121 | + @Override | ||
122 | + public void commit() { | ||
123 | + consumerLock.lock(); | ||
124 | + try { | ||
125 | + doCommit(); | ||
126 | + } finally { | ||
127 | + consumerLock.unlock(); | ||
128 | + } | ||
129 | + } | ||
130 | + | ||
131 | + @Override | ||
132 | + public void unsubscribe() { | ||
133 | + stopped = true; | ||
134 | + consumerLock.lock(); | ||
135 | + try { | ||
136 | + doUnsubscribe(); | ||
137 | + } finally { | ||
138 | + consumerLock.unlock(); | ||
139 | + } | ||
140 | + } | ||
141 | + | ||
142 | + abstract protected List<R> doPoll(long durationInMillis); | ||
143 | + | ||
144 | + abstract protected T decode(R record) throws IOException; | ||
145 | + | ||
146 | + abstract protected void doSubscribe(List<String> topicNames); | ||
147 | + | ||
148 | + abstract protected void doCommit(); | ||
149 | + | ||
150 | + abstract protected void doUnsubscribe(); | ||
151 | + | ||
152 | +} |
@@ -16,16 +16,14 @@ | @@ -16,16 +16,14 @@ | ||
16 | package org.thingsboard.server.queue.kafka; | 16 | package org.thingsboard.server.queue.kafka; |
17 | 17 | ||
18 | import lombok.Builder; | 18 | import lombok.Builder; |
19 | -import lombok.Getter; | ||
20 | import lombok.extern.slf4j.Slf4j; | 19 | import lombok.extern.slf4j.Slf4j; |
21 | import org.apache.kafka.clients.consumer.ConsumerConfig; | 20 | import org.apache.kafka.clients.consumer.ConsumerConfig; |
22 | import org.apache.kafka.clients.consumer.ConsumerRecord; | 21 | import org.apache.kafka.clients.consumer.ConsumerRecord; |
23 | import org.apache.kafka.clients.consumer.ConsumerRecords; | 22 | import org.apache.kafka.clients.consumer.ConsumerRecords; |
24 | import org.apache.kafka.clients.consumer.KafkaConsumer; | 23 | import org.apache.kafka.clients.consumer.KafkaConsumer; |
25 | -import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; | ||
26 | import org.thingsboard.server.queue.TbQueueAdmin; | 24 | import org.thingsboard.server.queue.TbQueueAdmin; |
27 | -import org.thingsboard.server.queue.TbQueueConsumer; | ||
28 | import org.thingsboard.server.queue.TbQueueMsg; | 25 | import org.thingsboard.server.queue.TbQueueMsg; |
26 | +import org.thingsboard.server.queue.common.AbstractTbQueueConsumerTemplate; | ||
29 | 27 | ||
30 | import java.io.IOException; | 28 | import java.io.IOException; |
31 | import java.time.Duration; | 29 | import java.time.Duration; |
@@ -33,26 +31,16 @@ import java.util.ArrayList; | @@ -33,26 +31,16 @@ import java.util.ArrayList; | ||
33 | import java.util.Collections; | 31 | import java.util.Collections; |
34 | import java.util.List; | 32 | import java.util.List; |
35 | import java.util.Properties; | 33 | import java.util.Properties; |
36 | -import java.util.Set; | ||
37 | -import java.util.concurrent.locks.Lock; | ||
38 | -import java.util.concurrent.locks.ReentrantLock; | ||
39 | -import java.util.stream.Collectors; | ||
40 | 34 | ||
41 | /** | 35 | /** |
42 | * Created by ashvayka on 24.09.18. | 36 | * Created by ashvayka on 24.09.18. |
43 | */ | 37 | */ |
44 | @Slf4j | 38 | @Slf4j |
45 | -public class TbKafkaConsumerTemplate<T extends TbQueueMsg> implements TbQueueConsumer<T> { | 39 | +public class TbKafkaConsumerTemplate<T extends TbQueueMsg> extends AbstractTbQueueConsumerTemplate<ConsumerRecord<String, byte[]>, T> { |
46 | 40 | ||
47 | private final TbQueueAdmin admin; | 41 | private final TbQueueAdmin admin; |
48 | private final KafkaConsumer<String, byte[]> consumer; | 42 | private final KafkaConsumer<String, byte[]> consumer; |
49 | private final TbKafkaDecoder<T> decoder; | 43 | private final TbKafkaDecoder<T> decoder; |
50 | - private volatile boolean subscribed; | ||
51 | - private volatile Set<TopicPartitionInfo> partitions; | ||
52 | - private final Lock consumerLock; | ||
53 | - | ||
54 | - @Getter | ||
55 | - private final String topic; | ||
56 | 44 | ||
57 | @Builder | 45 | @Builder |
58 | private TbKafkaConsumerTemplate(TbKafkaSettings settings, TbKafkaDecoder<T> decoder, | 46 | private TbKafkaConsumerTemplate(TbKafkaSettings settings, TbKafkaDecoder<T> decoder, |
@@ -60,6 +48,7 @@ public class TbKafkaConsumerTemplate<T extends TbQueueMsg> implements TbQueueCon | @@ -60,6 +48,7 @@ public class TbKafkaConsumerTemplate<T extends TbQueueMsg> implements TbQueueCon | ||
60 | boolean autoCommit, int autoCommitIntervalMs, | 48 | boolean autoCommit, int autoCommitIntervalMs, |
61 | int maxPollRecords, | 49 | int maxPollRecords, |
62 | TbQueueAdmin admin) { | 50 | TbQueueAdmin admin) { |
51 | + super(topic); | ||
63 | Properties props = settings.toProps(); | 52 | Properties props = settings.toProps(); |
64 | props.put(ConsumerConfig.CLIENT_ID_CONFIG, clientId); | 53 | props.put(ConsumerConfig.CLIENT_ID_CONFIG, clientId); |
65 | if (groupId != null) { | 54 | if (groupId != null) { |
@@ -75,94 +64,42 @@ public class TbKafkaConsumerTemplate<T extends TbQueueMsg> implements TbQueueCon | @@ -75,94 +64,42 @@ public class TbKafkaConsumerTemplate<T extends TbQueueMsg> implements TbQueueCon | ||
75 | this.admin = admin; | 64 | this.admin = admin; |
76 | this.consumer = new KafkaConsumer<>(props); | 65 | this.consumer = new KafkaConsumer<>(props); |
77 | this.decoder = decoder; | 66 | this.decoder = decoder; |
78 | - this.topic = topic; | ||
79 | - this.consumerLock = new ReentrantLock(); | ||
80 | } | 67 | } |
81 | 68 | ||
82 | @Override | 69 | @Override |
83 | - public void subscribe() { | ||
84 | - consumerLock.lock(); | ||
85 | - try { | ||
86 | - partitions = Collections.singleton(new TopicPartitionInfo(topic, null, null, true)); | ||
87 | - subscribed = false; | ||
88 | - } finally { | ||
89 | - consumerLock.unlock(); | ||
90 | - } | 70 | + protected void doSubscribe(List<String> topicNames) { |
71 | + topicNames.forEach(admin::createTopicIfNotExists); | ||
72 | + consumer.subscribe(topicNames); | ||
91 | } | 73 | } |
92 | 74 | ||
93 | @Override | 75 | @Override |
94 | - public void subscribe(Set<TopicPartitionInfo> partitions) { | ||
95 | - consumerLock.lock(); | ||
96 | - try { | ||
97 | - this.partitions = partitions; | ||
98 | - subscribed = false; | ||
99 | - } finally { | ||
100 | - consumerLock.unlock(); | 76 | + protected List<ConsumerRecord<String, byte[]>> doPoll(long durationInMillis) { |
77 | + ConsumerRecords<String, byte[]> records = consumer.poll(Duration.ofMillis(durationInMillis)); | ||
78 | + if (records.isEmpty()) { | ||
79 | + return Collections.emptyList(); | ||
80 | + } else { | ||
81 | + List<ConsumerRecord<String, byte[]>> recordList = new ArrayList<>(256); | ||
82 | + records.forEach(recordList::add); | ||
83 | + return recordList; | ||
101 | } | 84 | } |
102 | } | 85 | } |
103 | 86 | ||
104 | @Override | 87 | @Override |
105 | - public List<T> poll(long durationInMillis) { | ||
106 | - if (!subscribed && partitions == null) { | ||
107 | - try { | ||
108 | - Thread.sleep(durationInMillis); | ||
109 | - } catch (InterruptedException e) { | ||
110 | - log.debug("Failed to await subscription", e); | ||
111 | - } | ||
112 | - } else { | ||
113 | - consumerLock.lock(); | ||
114 | - try { | ||
115 | - if (!subscribed) { | ||
116 | - List<String> topicNames = partitions.stream().map(TopicPartitionInfo::getFullTopicName).collect(Collectors.toList()); | ||
117 | - topicNames.forEach(admin::createTopicIfNotExists); | ||
118 | - consumer.subscribe(topicNames); | ||
119 | - subscribed = true; | ||
120 | - } | ||
121 | - | ||
122 | - ConsumerRecords<String, byte[]> records = consumer.poll(Duration.ofMillis(durationInMillis)); | ||
123 | - if (records.count() > 0) { | ||
124 | - List<T> result = new ArrayList<>(); | ||
125 | - records.forEach(record -> { | ||
126 | - try { | ||
127 | - result.add(decode(record)); | ||
128 | - } catch (IOException e) { | ||
129 | - log.error("Failed decode record: [{}]", record); | ||
130 | - } | ||
131 | - }); | ||
132 | - return result; | ||
133 | - } | ||
134 | - } finally { | ||
135 | - consumerLock.unlock(); | ||
136 | - } | ||
137 | - } | ||
138 | - return Collections.emptyList(); | 88 | + public T decode(ConsumerRecord<String, byte[]> record) throws IOException { |
89 | + return decoder.decode(new KafkaTbQueueMsg(record)); | ||
139 | } | 90 | } |
140 | 91 | ||
141 | @Override | 92 | @Override |
142 | - public void commit() { | ||
143 | - consumerLock.lock(); | ||
144 | - try { | ||
145 | - consumer.commitAsync(); | ||
146 | - } finally { | ||
147 | - consumerLock.unlock(); | ||
148 | - } | 93 | + protected void doCommit() { |
94 | + consumer.commitAsync(); | ||
149 | } | 95 | } |
150 | 96 | ||
151 | @Override | 97 | @Override |
152 | - public void unsubscribe() { | ||
153 | - consumerLock.lock(); | ||
154 | - try { | ||
155 | - if (consumer != null) { | ||
156 | - consumer.unsubscribe(); | ||
157 | - consumer.close(); | ||
158 | - } | ||
159 | - } finally { | ||
160 | - consumerLock.unlock(); | 98 | + protected void doUnsubscribe() { |
99 | + if (consumer != null) { | ||
100 | + consumer.unsubscribe(); | ||
101 | + consumer.close(); | ||
161 | } | 102 | } |
162 | } | 103 | } |
163 | 104 | ||
164 | - public T decode(ConsumerRecord<String, byte[]> record) throws IOException { | ||
165 | - return decoder.decode(new KafkaTbQueueMsg(record)); | ||
166 | - } | ||
167 | - | ||
168 | } | 105 | } |
@@ -15,6 +15,7 @@ | @@ -15,6 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.queue.pubsub; | 16 | package org.thingsboard.server.queue.pubsub; |
17 | 17 | ||
18 | +import com.google.api.gax.rpc.AlreadyExistsException; | ||
18 | import com.google.cloud.pubsub.v1.SubscriptionAdminClient; | 19 | import com.google.cloud.pubsub.v1.SubscriptionAdminClient; |
19 | import com.google.cloud.pubsub.v1.SubscriptionAdminSettings; | 20 | import com.google.cloud.pubsub.v1.SubscriptionAdminSettings; |
20 | import com.google.cloud.pubsub.v1.TopicAdminClient; | 21 | import com.google.cloud.pubsub.v1.TopicAdminClient; |
@@ -24,9 +25,9 @@ import com.google.pubsub.v1.ListSubscriptionsRequest; | @@ -24,9 +25,9 @@ import com.google.pubsub.v1.ListSubscriptionsRequest; | ||
24 | import com.google.pubsub.v1.ListTopicsRequest; | 25 | import com.google.pubsub.v1.ListTopicsRequest; |
25 | import com.google.pubsub.v1.ProjectName; | 26 | import com.google.pubsub.v1.ProjectName; |
26 | import com.google.pubsub.v1.ProjectSubscriptionName; | 27 | import com.google.pubsub.v1.ProjectSubscriptionName; |
27 | -import com.google.pubsub.v1.ProjectTopicName; | ||
28 | import com.google.pubsub.v1.Subscription; | 28 | import com.google.pubsub.v1.Subscription; |
29 | import com.google.pubsub.v1.Topic; | 29 | import com.google.pubsub.v1.Topic; |
30 | +import com.google.pubsub.v1.TopicName; | ||
30 | import lombok.extern.slf4j.Slf4j; | 31 | import lombok.extern.slf4j.Slf4j; |
31 | import org.thingsboard.server.queue.TbQueueAdmin; | 32 | import org.thingsboard.server.queue.TbQueueAdmin; |
32 | 33 | ||
@@ -103,7 +104,10 @@ public class TbPubSubAdmin implements TbQueueAdmin { | @@ -103,7 +104,10 @@ public class TbPubSubAdmin implements TbQueueAdmin { | ||
103 | 104 | ||
104 | @Override | 105 | @Override |
105 | public void createTopicIfNotExists(String partition) { | 106 | public void createTopicIfNotExists(String partition) { |
106 | - ProjectTopicName topicName = ProjectTopicName.of(pubSubSettings.getProjectId(), partition); | 107 | + TopicName topicName = TopicName.newBuilder() |
108 | + .setTopic(partition) | ||
109 | + .setProject(pubSubSettings.getProjectId()) | ||
110 | + .build(); | ||
107 | 111 | ||
108 | if (topicSet.contains(topicName.toString())) { | 112 | if (topicSet.contains(topicName.toString())) { |
109 | createSubscriptionIfNotExists(partition, topicName); | 113 | createSubscriptionIfNotExists(partition, topicName); |
@@ -121,13 +125,18 @@ public class TbPubSubAdmin implements TbQueueAdmin { | @@ -121,13 +125,18 @@ public class TbPubSubAdmin implements TbQueueAdmin { | ||
121 | } | 125 | } |
122 | } | 126 | } |
123 | 127 | ||
124 | - topicAdminClient.createTopic(topicName); | ||
125 | - topicSet.add(topicName.toString()); | ||
126 | - log.info("Created new topic: [{}]", topicName.toString()); | 128 | + try { |
129 | + topicAdminClient.createTopic(topicName); | ||
130 | + log.info("Created new topic: [{}]", topicName.toString()); | ||
131 | + } catch (AlreadyExistsException e) { | ||
132 | + log.info("[{}] Topic already exist.", topicName.toString()); | ||
133 | + } finally { | ||
134 | + topicSet.add(topicName.toString()); | ||
135 | + } | ||
127 | createSubscriptionIfNotExists(partition, topicName); | 136 | createSubscriptionIfNotExists(partition, topicName); |
128 | } | 137 | } |
129 | 138 | ||
130 | - private void createSubscriptionIfNotExists(String partition, ProjectTopicName topicName) { | 139 | + private void createSubscriptionIfNotExists(String partition, TopicName topicName) { |
131 | ProjectSubscriptionName subscriptionName = | 140 | ProjectSubscriptionName subscriptionName = |
132 | ProjectSubscriptionName.of(pubSubSettings.getProjectId(), partition); | 141 | ProjectSubscriptionName.of(pubSubSettings.getProjectId(), partition); |
133 | 142 | ||
@@ -153,9 +162,14 @@ public class TbPubSubAdmin implements TbQueueAdmin { | @@ -153,9 +162,14 @@ public class TbPubSubAdmin implements TbQueueAdmin { | ||
153 | setAckDeadline(subscriptionBuilder); | 162 | setAckDeadline(subscriptionBuilder); |
154 | setMessageRetention(subscriptionBuilder); | 163 | setMessageRetention(subscriptionBuilder); |
155 | 164 | ||
156 | - subscriptionAdminClient.createSubscription(subscriptionBuilder.build()); | ||
157 | - subscriptionSet.add(subscriptionName.toString()); | ||
158 | - log.info("Created new subscription: [{}]", subscriptionName.toString()); | 165 | + try { |
166 | + subscriptionAdminClient.createSubscription(subscriptionBuilder.build()); | ||
167 | + log.info("Created new subscription: [{}]", subscriptionName.toString()); | ||
168 | + } catch (AlreadyExistsException e) { | ||
169 | + log.info("[{}] Subscription already exist.", subscriptionName.toString()); | ||
170 | + } finally { | ||
171 | + subscriptionSet.add(subscriptionName.toString()); | ||
172 | + } | ||
159 | } | 173 | } |
160 | 174 | ||
161 | private void setAckDeadline(Subscription.Builder builder) { | 175 | private void setAckDeadline(Subscription.Builder builder) { |
@@ -30,27 +30,25 @@ import com.google.pubsub.v1.PullResponse; | @@ -30,27 +30,25 @@ import com.google.pubsub.v1.PullResponse; | ||
30 | import com.google.pubsub.v1.ReceivedMessage; | 30 | import com.google.pubsub.v1.ReceivedMessage; |
31 | import lombok.extern.slf4j.Slf4j; | 31 | import lombok.extern.slf4j.Slf4j; |
32 | import org.springframework.util.CollectionUtils; | 32 | import org.springframework.util.CollectionUtils; |
33 | -import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; | ||
34 | import org.thingsboard.server.queue.TbQueueAdmin; | 33 | import org.thingsboard.server.queue.TbQueueAdmin; |
35 | -import org.thingsboard.server.queue.TbQueueConsumer; | ||
36 | import org.thingsboard.server.queue.TbQueueMsg; | 34 | import org.thingsboard.server.queue.TbQueueMsg; |
37 | import org.thingsboard.server.queue.TbQueueMsgDecoder; | 35 | import org.thingsboard.server.queue.TbQueueMsgDecoder; |
36 | +import org.thingsboard.server.queue.common.AbstractParallelTbQueueConsumerTemplate; | ||
38 | import org.thingsboard.server.queue.common.DefaultTbQueueMsg; | 37 | import org.thingsboard.server.queue.common.DefaultTbQueueMsg; |
39 | 38 | ||
40 | import java.io.IOException; | 39 | import java.io.IOException; |
41 | import java.util.ArrayList; | 40 | import java.util.ArrayList; |
42 | import java.util.Collections; | 41 | import java.util.Collections; |
42 | +import java.util.LinkedHashSet; | ||
43 | import java.util.List; | 43 | import java.util.List; |
44 | import java.util.Objects; | 44 | import java.util.Objects; |
45 | import java.util.Set; | 45 | import java.util.Set; |
46 | import java.util.concurrent.CopyOnWriteArrayList; | 46 | import java.util.concurrent.CopyOnWriteArrayList; |
47 | import java.util.concurrent.ExecutionException; | 47 | import java.util.concurrent.ExecutionException; |
48 | -import java.util.concurrent.ExecutorService; | ||
49 | -import java.util.concurrent.Executors; | ||
50 | import java.util.stream.Collectors; | 48 | import java.util.stream.Collectors; |
51 | 49 | ||
52 | @Slf4j | 50 | @Slf4j |
53 | -public class TbPubSubConsumerTemplate<T extends TbQueueMsg> implements TbQueueConsumer<T> { | 51 | +public class TbPubSubConsumerTemplate<T extends TbQueueMsg> extends AbstractParallelTbQueueConsumerTemplate<PubsubMessage, T> { |
54 | 52 | ||
55 | private final Gson gson = new Gson(); | 53 | private final Gson gson = new Gson(); |
56 | private final TbQueueAdmin admin; | 54 | private final TbQueueAdmin admin; |
@@ -58,23 +56,18 @@ public class TbPubSubConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | @@ -58,23 +56,18 @@ public class TbPubSubConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | ||
58 | private final TbQueueMsgDecoder<T> decoder; | 56 | private final TbQueueMsgDecoder<T> decoder; |
59 | private final TbPubSubSettings pubSubSettings; | 57 | private final TbPubSubSettings pubSubSettings; |
60 | 58 | ||
61 | - private volatile boolean subscribed; | ||
62 | - private volatile Set<TopicPartitionInfo> partitions; | ||
63 | private volatile Set<String> subscriptionNames; | 59 | private volatile Set<String> subscriptionNames; |
64 | private final List<AcknowledgeRequest> acknowledgeRequests = new CopyOnWriteArrayList<>(); | 60 | private final List<AcknowledgeRequest> acknowledgeRequests = new CopyOnWriteArrayList<>(); |
65 | 61 | ||
66 | - private ExecutorService consumerExecutor; | ||
67 | private final SubscriberStub subscriber; | 62 | private final SubscriberStub subscriber; |
68 | - private volatile boolean stopped; | ||
69 | - | ||
70 | private volatile int messagesPerTopic; | 63 | private volatile int messagesPerTopic; |
71 | 64 | ||
72 | public TbPubSubConsumerTemplate(TbQueueAdmin admin, TbPubSubSettings pubSubSettings, String topic, TbQueueMsgDecoder<T> decoder) { | 65 | public TbPubSubConsumerTemplate(TbQueueAdmin admin, TbPubSubSettings pubSubSettings, String topic, TbQueueMsgDecoder<T> decoder) { |
66 | + super(topic); | ||
73 | this.admin = admin; | 67 | this.admin = admin; |
74 | this.pubSubSettings = pubSubSettings; | 68 | this.pubSubSettings = pubSubSettings; |
75 | this.topic = topic; | 69 | this.topic = topic; |
76 | this.decoder = decoder; | 70 | this.decoder = decoder; |
77 | - | ||
78 | try { | 71 | try { |
79 | SubscriberStubSettings subscriberStubSettings = | 72 | SubscriberStubSettings subscriberStubSettings = |
80 | SubscriberStubSettings.newBuilder() | 73 | SubscriberStubSettings.newBuilder() |
@@ -84,89 +77,50 @@ public class TbPubSubConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | @@ -84,89 +77,50 @@ public class TbPubSubConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | ||
84 | .setMaxInboundMessageSize(pubSubSettings.getMaxMsgSize()) | 77 | .setMaxInboundMessageSize(pubSubSettings.getMaxMsgSize()) |
85 | .build()) | 78 | .build()) |
86 | .build(); | 79 | .build(); |
87 | - | ||
88 | this.subscriber = GrpcSubscriberStub.create(subscriberStubSettings); | 80 | this.subscriber = GrpcSubscriberStub.create(subscriberStubSettings); |
89 | } catch (IOException e) { | 81 | } catch (IOException e) { |
90 | log.error("Failed to create subscriber.", e); | 82 | log.error("Failed to create subscriber.", e); |
91 | throw new RuntimeException("Failed to create subscriber.", e); | 83 | throw new RuntimeException("Failed to create subscriber.", e); |
92 | } | 84 | } |
93 | - stopped = false; | ||
94 | } | 85 | } |
95 | 86 | ||
96 | @Override | 87 | @Override |
97 | - public String getTopic() { | ||
98 | - return topic; | 88 | + protected List<PubsubMessage> doPoll(long durationInMillis) { |
89 | + try { | ||
90 | + List<ReceivedMessage> messages = receiveMessages(); | ||
91 | + if (!messages.isEmpty()) { | ||
92 | + return messages.stream().map(ReceivedMessage::getMessage).collect(Collectors.toList()); | ||
93 | + } | ||
94 | + } catch (ExecutionException | InterruptedException e) { | ||
95 | + if (stopped) { | ||
96 | + log.info("[{}] Pub/Sub consumer is stopped.", topic); | ||
97 | + } else { | ||
98 | + log.error("Failed to receive messages", e); | ||
99 | + } | ||
100 | + } | ||
101 | + return Collections.emptyList(); | ||
99 | } | 102 | } |
100 | 103 | ||
101 | @Override | 104 | @Override |
102 | - public void subscribe() { | ||
103 | - partitions = Collections.singleton(new TopicPartitionInfo(topic, null, null, true)); | ||
104 | - subscribed = false; | 105 | + protected void doSubscribe(List<String> topicNames) { |
106 | + subscriptionNames = new LinkedHashSet<>(topicNames); | ||
107 | + subscriptionNames.forEach(admin::createTopicIfNotExists); | ||
108 | + initNewExecutor(subscriptionNames.size() + 1); | ||
109 | + messagesPerTopic = pubSubSettings.getMaxMessages() / subscriptionNames.size(); | ||
105 | } | 110 | } |
106 | 111 | ||
107 | @Override | 112 | @Override |
108 | - public void subscribe(Set<TopicPartitionInfo> partitions) { | ||
109 | - this.partitions = partitions; | ||
110 | - subscribed = false; | 113 | + protected void doCommit() { |
114 | + acknowledgeRequests.forEach(subscriber.acknowledgeCallable()::futureCall); | ||
115 | + acknowledgeRequests.clear(); | ||
111 | } | 116 | } |
112 | 117 | ||
113 | @Override | 118 | @Override |
114 | - public void unsubscribe() { | ||
115 | - stopped = true; | ||
116 | - if (consumerExecutor != null) { | ||
117 | - consumerExecutor.shutdownNow(); | ||
118 | - } | ||
119 | - | 119 | + protected void doUnsubscribe() { |
120 | if (subscriber != null) { | 120 | if (subscriber != null) { |
121 | subscriber.close(); | 121 | subscriber.close(); |
122 | } | 122 | } |
123 | - } | ||
124 | - | ||
125 | - @Override | ||
126 | - public List<T> poll(long durationInMillis) { | ||
127 | - if (!subscribed && partitions == null) { | ||
128 | - try { | ||
129 | - Thread.sleep(durationInMillis); | ||
130 | - } catch (InterruptedException e) { | ||
131 | - log.debug("Failed to await subscription", e); | ||
132 | - } | ||
133 | - } else { | ||
134 | - if (!subscribed) { | ||
135 | - subscriptionNames = partitions.stream().map(TopicPartitionInfo::getFullTopicName).collect(Collectors.toSet()); | ||
136 | - subscriptionNames.forEach(admin::createTopicIfNotExists); | ||
137 | - consumerExecutor = Executors.newFixedThreadPool(subscriptionNames.size()); | ||
138 | - messagesPerTopic = pubSubSettings.getMaxMessages() / subscriptionNames.size(); | ||
139 | - subscribed = true; | ||
140 | - } | ||
141 | - List<ReceivedMessage> messages; | ||
142 | - try { | ||
143 | - messages = receiveMessages(); | ||
144 | - if (!messages.isEmpty()) { | ||
145 | - List<T> result = new ArrayList<>(); | ||
146 | - messages.forEach(msg -> { | ||
147 | - try { | ||
148 | - result.add(decode(msg.getMessage())); | ||
149 | - } catch (InvalidProtocolBufferException e) { | ||
150 | - log.error("Failed decode record: [{}]", msg); | ||
151 | - } | ||
152 | - }); | ||
153 | - return result; | ||
154 | - } | ||
155 | - } catch (ExecutionException | InterruptedException e) { | ||
156 | - if (stopped) { | ||
157 | - log.info("[{}] Pub/Sub consumer is stopped.", topic); | ||
158 | - } else { | ||
159 | - log.error("Failed to receive messages", e); | ||
160 | - } | ||
161 | - } | ||
162 | - } | ||
163 | - return Collections.emptyList(); | ||
164 | - } | ||
165 | - | ||
166 | - @Override | ||
167 | - public void commit() { | ||
168 | - acknowledgeRequests.forEach(subscriber.acknowledgeCallable()::futureCall); | ||
169 | - acknowledgeRequests.clear(); | 123 | + shutdownExecutor(); |
170 | } | 124 | } |
171 | 125 | ||
172 | private List<ReceivedMessage> receiveMessages() throws ExecutionException, InterruptedException { | 126 | private List<ReceivedMessage> receiveMessages() throws ExecutionException, InterruptedException { |
@@ -175,7 +129,7 @@ public class TbPubSubConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | @@ -175,7 +129,7 @@ public class TbPubSubConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | ||
175 | PullRequest pullRequest = | 129 | PullRequest pullRequest = |
176 | PullRequest.newBuilder() | 130 | PullRequest.newBuilder() |
177 | .setMaxMessages(messagesPerTopic) | 131 | .setMaxMessages(messagesPerTopic) |
178 | - .setReturnImmediately(false) // return immediately if messages are not available | 132 | +// .setReturnImmediately(false) // return immediately if messages are not available |
179 | .setSubscription(subscriptionName) | 133 | .setSubscription(subscriptionName) |
180 | .build(); | 134 | .build(); |
181 | 135 | ||
@@ -211,6 +165,7 @@ public class TbPubSubConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | @@ -211,6 +165,7 @@ public class TbPubSubConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | ||
211 | return transform.get(); | 165 | return transform.get(); |
212 | } | 166 | } |
213 | 167 | ||
168 | + @Override | ||
214 | public T decode(PubsubMessage message) throws InvalidProtocolBufferException { | 169 | public T decode(PubsubMessage message) throws InvalidProtocolBufferException { |
215 | DefaultTbQueueMsg msg = gson.fromJson(message.getData().toStringUtf8(), DefaultTbQueueMsg.class); | 170 | DefaultTbQueueMsg msg = gson.fromJson(message.getData().toStringUtf8(), DefaultTbQueueMsg.class); |
216 | return decoder.decode(msg); | 171 | return decoder.decode(msg); |
@@ -49,7 +49,7 @@ public class TbPubSubProducerTemplate<T extends TbQueueMsg> implements TbQueuePr | @@ -49,7 +49,7 @@ public class TbPubSubProducerTemplate<T extends TbQueueMsg> implements TbQueuePr | ||
49 | 49 | ||
50 | private final Map<String, Publisher> publisherMap = new ConcurrentHashMap<>(); | 50 | private final Map<String, Publisher> publisherMap = new ConcurrentHashMap<>(); |
51 | 51 | ||
52 | - private ExecutorService pubExecutor = Executors.newCachedThreadPool(); | 52 | + private final ExecutorService pubExecutor = Executors.newCachedThreadPool(); |
53 | 53 | ||
54 | public TbPubSubProducerTemplate(TbQueueAdmin admin, TbPubSubSettings pubSubSettings, String defaultTopic) { | 54 | public TbPubSubProducerTemplate(TbQueueAdmin admin, TbPubSubSettings pubSubSettings, String defaultTopic) { |
55 | this.defaultTopic = defaultTopic; | 55 | this.defaultTopic = defaultTopic; |
@@ -124,8 +124,8 @@ public class TbPubSubProducerTemplate<T extends TbQueueMsg> implements TbQueuePr | @@ -124,8 +124,8 @@ public class TbPubSubProducerTemplate<T extends TbQueueMsg> implements TbQueuePr | ||
124 | publisherMap.put(topic, publisher); | 124 | publisherMap.put(topic, publisher); |
125 | return publisher; | 125 | return publisher; |
126 | } catch (IOException e) { | 126 | } catch (IOException e) { |
127 | - log.error("Failed to create topic [{}].", topic, e); | ||
128 | - throw new RuntimeException("Failed to create topic.", e); | 127 | + log.error("Failed to create Publisher for the topic [{}].", topic, e); |
128 | + throw new RuntimeException("Failed to create Publisher for the topic.", e); | ||
129 | } | 129 | } |
130 | } | 130 | } |
131 | 131 |
@@ -27,13 +27,11 @@ import java.util.concurrent.TimeoutException; | @@ -27,13 +27,11 @@ import java.util.concurrent.TimeoutException; | ||
27 | @Slf4j | 27 | @Slf4j |
28 | public class TbRabbitMqAdmin implements TbQueueAdmin { | 28 | public class TbRabbitMqAdmin implements TbQueueAdmin { |
29 | 29 | ||
30 | - private final TbRabbitMqSettings rabbitMqSettings; | ||
31 | private final Channel channel; | 30 | private final Channel channel; |
32 | private final Connection connection; | 31 | private final Connection connection; |
33 | private final Map<String, Object> arguments; | 32 | private final Map<String, Object> arguments; |
34 | 33 | ||
35 | public TbRabbitMqAdmin(TbRabbitMqSettings rabbitMqSettings, Map<String, Object> arguments) { | 34 | public TbRabbitMqAdmin(TbRabbitMqSettings rabbitMqSettings, Map<String, Object> arguments) { |
36 | - this.rabbitMqSettings = rabbitMqSettings; | ||
37 | this.arguments = arguments; | 35 | this.arguments = arguments; |
38 | 36 | ||
39 | try { | 37 | try { |
@@ -23,9 +23,9 @@ import com.rabbitmq.client.GetResponse; | @@ -23,9 +23,9 @@ import com.rabbitmq.client.GetResponse; | ||
23 | import lombok.extern.slf4j.Slf4j; | 23 | import lombok.extern.slf4j.Slf4j; |
24 | import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; | 24 | import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; |
25 | import org.thingsboard.server.queue.TbQueueAdmin; | 25 | import org.thingsboard.server.queue.TbQueueAdmin; |
26 | -import org.thingsboard.server.queue.TbQueueConsumer; | ||
27 | import org.thingsboard.server.queue.TbQueueMsg; | 26 | import org.thingsboard.server.queue.TbQueueMsg; |
28 | import org.thingsboard.server.queue.TbQueueMsgDecoder; | 27 | import org.thingsboard.server.queue.TbQueueMsgDecoder; |
28 | +import org.thingsboard.server.queue.common.AbstractTbQueueConsumerTemplate; | ||
29 | import org.thingsboard.server.queue.common.DefaultTbQueueMsg; | 29 | import org.thingsboard.server.queue.common.DefaultTbQueueMsg; |
30 | 30 | ||
31 | import java.io.IOException; | 31 | import java.io.IOException; |
@@ -37,33 +37,26 @@ import java.util.concurrent.TimeoutException; | @@ -37,33 +37,26 @@ import java.util.concurrent.TimeoutException; | ||
37 | import java.util.stream.Collectors; | 37 | import java.util.stream.Collectors; |
38 | 38 | ||
39 | @Slf4j | 39 | @Slf4j |
40 | -public class TbRabbitMqConsumerTemplate<T extends TbQueueMsg> implements TbQueueConsumer<T> { | 40 | +public class TbRabbitMqConsumerTemplate<T extends TbQueueMsg> extends AbstractTbQueueConsumerTemplate<GetResponse, T> { |
41 | 41 | ||
42 | private final Gson gson = new Gson(); | 42 | private final Gson gson = new Gson(); |
43 | private final TbQueueAdmin admin; | 43 | private final TbQueueAdmin admin; |
44 | - private final String topic; | ||
45 | private final TbQueueMsgDecoder<T> decoder; | 44 | private final TbQueueMsgDecoder<T> decoder; |
46 | - private final TbRabbitMqSettings rabbitMqSettings; | ||
47 | private final Channel channel; | 45 | private final Channel channel; |
48 | private final Connection connection; | 46 | private final Connection connection; |
49 | 47 | ||
50 | - private volatile Set<TopicPartitionInfo> partitions; | ||
51 | - private volatile boolean subscribed; | ||
52 | private volatile Set<String> queues; | 48 | private volatile Set<String> queues; |
53 | - private volatile boolean stopped; | ||
54 | 49 | ||
55 | public TbRabbitMqConsumerTemplate(TbQueueAdmin admin, TbRabbitMqSettings rabbitMqSettings, String topic, TbQueueMsgDecoder<T> decoder) { | 50 | public TbRabbitMqConsumerTemplate(TbQueueAdmin admin, TbRabbitMqSettings rabbitMqSettings, String topic, TbQueueMsgDecoder<T> decoder) { |
51 | + super(topic); | ||
56 | this.admin = admin; | 52 | this.admin = admin; |
57 | this.decoder = decoder; | 53 | this.decoder = decoder; |
58 | - this.topic = topic; | ||
59 | - this.rabbitMqSettings = rabbitMqSettings; | ||
60 | try { | 54 | try { |
61 | connection = rabbitMqSettings.getConnectionFactory().newConnection(); | 55 | connection = rabbitMqSettings.getConnectionFactory().newConnection(); |
62 | } catch (IOException | TimeoutException e) { | 56 | } catch (IOException | TimeoutException e) { |
63 | log.error("Failed to create connection.", e); | 57 | log.error("Failed to create connection.", e); |
64 | throw new RuntimeException("Failed to create connection.", e); | 58 | throw new RuntimeException("Failed to create connection.", e); |
65 | } | 59 | } |
66 | - | ||
67 | try { | 60 | try { |
68 | channel = connection.createChannel(); | 61 | channel = connection.createChannel(); |
69 | } catch (IOException e) { | 62 | } catch (IOException e) { |
@@ -74,25 +67,42 @@ public class TbRabbitMqConsumerTemplate<T extends TbQueueMsg> implements TbQueue | @@ -74,25 +67,42 @@ public class TbRabbitMqConsumerTemplate<T extends TbQueueMsg> implements TbQueue | ||
74 | } | 67 | } |
75 | 68 | ||
76 | @Override | 69 | @Override |
77 | - public String getTopic() { | ||
78 | - return topic; | 70 | + protected List<GetResponse> doPoll(long durationInMillis) { |
71 | + List<GetResponse> result = queues.stream() | ||
72 | + .map(queue -> { | ||
73 | + try { | ||
74 | + return channel.basicGet(queue, false); | ||
75 | + } catch (IOException e) { | ||
76 | + log.error("Failed to get messages from queue: [{}]", queue); | ||
77 | + throw new RuntimeException("Failed to get messages from queue.", e); | ||
78 | + } | ||
79 | + }).filter(Objects::nonNull).collect(Collectors.toList()); | ||
80 | + if (result.size() > 0) { | ||
81 | + return result; | ||
82 | + } else { | ||
83 | + return Collections.emptyList(); | ||
84 | + } | ||
79 | } | 85 | } |
80 | 86 | ||
81 | @Override | 87 | @Override |
82 | - public void subscribe() { | ||
83 | - partitions = Collections.singleton(new TopicPartitionInfo(topic, null, null, true)); | ||
84 | - subscribed = false; | 88 | + protected void doSubscribe(List<String> topicNames) { |
89 | + queues = partitions.stream() | ||
90 | + .map(TopicPartitionInfo::getFullTopicName) | ||
91 | + .collect(Collectors.toSet()); | ||
92 | + queues.forEach(admin::createTopicIfNotExists); | ||
85 | } | 93 | } |
86 | 94 | ||
87 | @Override | 95 | @Override |
88 | - public void subscribe(Set<TopicPartitionInfo> partitions) { | ||
89 | - this.partitions = partitions; | ||
90 | - subscribed = false; | 96 | + protected void doCommit() { |
97 | + try { | ||
98 | + channel.basicAck(0, true); | ||
99 | + } catch (IOException e) { | ||
100 | + log.error("Failed to ack messages.", e); | ||
101 | + } | ||
91 | } | 102 | } |
92 | 103 | ||
93 | @Override | 104 | @Override |
94 | - public void unsubscribe() { | ||
95 | - stopped = true; | 105 | + protected void doUnsubscribe() { |
96 | if (channel != null) { | 106 | if (channel != null) { |
97 | try { | 107 | try { |
98 | channel.close(); | 108 | channel.close(); |
@@ -109,63 +119,6 @@ public class TbRabbitMqConsumerTemplate<T extends TbQueueMsg> implements TbQueue | @@ -109,63 +119,6 @@ public class TbRabbitMqConsumerTemplate<T extends TbQueueMsg> implements TbQueue | ||
109 | } | 119 | } |
110 | } | 120 | } |
111 | 121 | ||
112 | - @Override | ||
113 | - public List<T> poll(long durationInMillis) { | ||
114 | - if (!subscribed && partitions == null) { | ||
115 | - try { | ||
116 | - Thread.sleep(durationInMillis); | ||
117 | - } catch (InterruptedException e) { | ||
118 | - log.debug("Failed to await subscription", e); | ||
119 | - } | ||
120 | - } else { | ||
121 | - if (!subscribed) { | ||
122 | - queues = partitions.stream() | ||
123 | - .map(TopicPartitionInfo::getFullTopicName) | ||
124 | - .collect(Collectors.toSet()); | ||
125 | - | ||
126 | - queues.forEach(admin::createTopicIfNotExists); | ||
127 | - subscribed = true; | ||
128 | - } | ||
129 | - | ||
130 | - List<T> result = queues.stream() | ||
131 | - .map(queue -> { | ||
132 | - try { | ||
133 | - return channel.basicGet(queue, false); | ||
134 | - } catch (IOException e) { | ||
135 | - log.error("Failed to get messages from queue: [{}]", queue); | ||
136 | - throw new RuntimeException("Failed to get messages from queue.", e); | ||
137 | - } | ||
138 | - }).filter(Objects::nonNull).map(message -> { | ||
139 | - try { | ||
140 | - return decode(message); | ||
141 | - } catch (InvalidProtocolBufferException e) { | ||
142 | - log.error("Failed to decode message: [{}].", message); | ||
143 | - throw new RuntimeException("Failed to decode message.", e); | ||
144 | - } | ||
145 | - }).collect(Collectors.toList()); | ||
146 | - if (result.size() > 0) { | ||
147 | - return result; | ||
148 | - } | ||
149 | - } | ||
150 | - try { | ||
151 | - Thread.sleep(durationInMillis); | ||
152 | - } catch (InterruptedException e) { | ||
153 | - if (!stopped) { | ||
154 | - log.error("Failed to wait.", e); | ||
155 | - } | ||
156 | - } | ||
157 | - return Collections.emptyList(); | ||
158 | - } | ||
159 | - | ||
160 | - @Override | ||
161 | - public void commit() { | ||
162 | - try { | ||
163 | - channel.basicAck(0, true); | ||
164 | - } catch (IOException e) { | ||
165 | - log.error("Failed to ack messages.", e); | ||
166 | - } | ||
167 | - } | ||
168 | - | ||
169 | public T decode(GetResponse message) throws InvalidProtocolBufferException { | 122 | public T decode(GetResponse message) throws InvalidProtocolBufferException { |
170 | DefaultTbQueueMsg msg = gson.fromJson(new String(message.getBody()), DefaultTbQueueMsg.class); | 123 | DefaultTbQueueMsg msg = gson.fromJson(new String(message.getBody()), DefaultTbQueueMsg.class); |
171 | return decoder.decode(msg); | 124 | return decoder.decode(msg); |
@@ -30,6 +30,8 @@ import org.thingsboard.server.queue.TbQueueProducer; | @@ -30,6 +30,8 @@ import org.thingsboard.server.queue.TbQueueProducer; | ||
30 | import org.thingsboard.server.queue.common.DefaultTbQueueMsg; | 30 | import org.thingsboard.server.queue.common.DefaultTbQueueMsg; |
31 | 31 | ||
32 | import java.io.IOException; | 32 | import java.io.IOException; |
33 | +import java.util.Set; | ||
34 | +import java.util.concurrent.ConcurrentHashMap; | ||
33 | import java.util.concurrent.Executors; | 35 | import java.util.concurrent.Executors; |
34 | import java.util.concurrent.TimeoutException; | 36 | import java.util.concurrent.TimeoutException; |
35 | 37 | ||
@@ -39,10 +41,12 @@ public class TbRabbitMqProducerTemplate<T extends TbQueueMsg> implements TbQueue | @@ -39,10 +41,12 @@ public class TbRabbitMqProducerTemplate<T extends TbQueueMsg> implements TbQueue | ||
39 | private final Gson gson = new Gson(); | 41 | private final Gson gson = new Gson(); |
40 | private final TbQueueAdmin admin; | 42 | private final TbQueueAdmin admin; |
41 | private final TbRabbitMqSettings rabbitMqSettings; | 43 | private final TbRabbitMqSettings rabbitMqSettings; |
42 | - private ListeningExecutorService producerExecutor; | 44 | + private final ListeningExecutorService producerExecutor; |
43 | private final Channel channel; | 45 | private final Channel channel; |
44 | private final Connection connection; | 46 | private final Connection connection; |
45 | 47 | ||
48 | + private final Set<TopicPartitionInfo> topics = ConcurrentHashMap.newKeySet(); | ||
49 | + | ||
46 | public TbRabbitMqProducerTemplate(TbQueueAdmin admin, TbRabbitMqSettings rabbitMqSettings, String defaultTopic) { | 50 | public TbRabbitMqProducerTemplate(TbQueueAdmin admin, TbRabbitMqSettings rabbitMqSettings, String defaultTopic) { |
47 | this.admin = admin; | 51 | this.admin = admin; |
48 | this.defaultTopic = defaultTopic; | 52 | this.defaultTopic = defaultTopic; |
@@ -75,6 +79,7 @@ public class TbRabbitMqProducerTemplate<T extends TbQueueMsg> implements TbQueue | @@ -75,6 +79,7 @@ public class TbRabbitMqProducerTemplate<T extends TbQueueMsg> implements TbQueue | ||
75 | 79 | ||
76 | @Override | 80 | @Override |
77 | public void send(TopicPartitionInfo tpi, T msg, TbQueueCallback callback) { | 81 | public void send(TopicPartitionInfo tpi, T msg, TbQueueCallback callback) { |
82 | + createTopicIfNotExist(tpi); | ||
78 | AMQP.BasicProperties properties = new AMQP.BasicProperties(); | 83 | AMQP.BasicProperties properties = new AMQP.BasicProperties(); |
79 | try { | 84 | try { |
80 | channel.basicPublish(rabbitMqSettings.getExchangeName(), tpi.getFullTopicName(), properties, gson.toJson(new DefaultTbQueueMsg(msg)).getBytes()); | 85 | channel.basicPublish(rabbitMqSettings.getExchangeName(), tpi.getFullTopicName(), properties, gson.toJson(new DefaultTbQueueMsg(msg)).getBytes()); |
@@ -110,4 +115,11 @@ public class TbRabbitMqProducerTemplate<T extends TbQueueMsg> implements TbQueue | @@ -110,4 +115,11 @@ public class TbRabbitMqProducerTemplate<T extends TbQueueMsg> implements TbQueue | ||
110 | } | 115 | } |
111 | } | 116 | } |
112 | 117 | ||
118 | + private void createTopicIfNotExist(TopicPartitionInfo tpi) { | ||
119 | + if (topics.contains(tpi)) { | ||
120 | + return; | ||
121 | + } | ||
122 | + admin.createTopicIfNotExists(tpi.getFullTopicName()); | ||
123 | + topics.add(tpi); | ||
124 | + } | ||
113 | } | 125 | } |
@@ -25,21 +25,17 @@ import com.amazonaws.services.sqs.model.Message; | @@ -25,21 +25,17 @@ import com.amazonaws.services.sqs.model.Message; | ||
25 | import com.amazonaws.services.sqs.model.ReceiveMessageRequest; | 25 | import com.amazonaws.services.sqs.model.ReceiveMessageRequest; |
26 | import com.google.common.util.concurrent.Futures; | 26 | import com.google.common.util.concurrent.Futures; |
27 | import com.google.common.util.concurrent.ListenableFuture; | 27 | import com.google.common.util.concurrent.ListenableFuture; |
28 | -import com.google.common.util.concurrent.ListeningExecutorService; | ||
29 | -import com.google.common.util.concurrent.MoreExecutors; | ||
30 | import com.google.gson.Gson; | 28 | import com.google.gson.Gson; |
31 | import com.google.protobuf.InvalidProtocolBufferException; | 29 | import com.google.protobuf.InvalidProtocolBufferException; |
32 | import lombok.Data; | 30 | import lombok.Data; |
33 | import lombok.extern.slf4j.Slf4j; | 31 | import lombok.extern.slf4j.Slf4j; |
34 | import org.springframework.util.CollectionUtils; | 32 | import org.springframework.util.CollectionUtils; |
35 | -import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; | ||
36 | import org.thingsboard.server.queue.TbQueueAdmin; | 33 | import org.thingsboard.server.queue.TbQueueAdmin; |
37 | -import org.thingsboard.server.queue.TbQueueConsumer; | ||
38 | import org.thingsboard.server.queue.TbQueueMsg; | 34 | import org.thingsboard.server.queue.TbQueueMsg; |
39 | import org.thingsboard.server.queue.TbQueueMsgDecoder; | 35 | import org.thingsboard.server.queue.TbQueueMsgDecoder; |
36 | +import org.thingsboard.server.queue.common.AbstractParallelTbQueueConsumerTemplate; | ||
40 | import org.thingsboard.server.queue.common.DefaultTbQueueMsg; | 37 | import org.thingsboard.server.queue.common.DefaultTbQueueMsg; |
41 | 38 | ||
42 | -import java.io.IOException; | ||
43 | import java.util.ArrayList; | 39 | import java.util.ArrayList; |
44 | import java.util.Collections; | 40 | import java.util.Collections; |
45 | import java.util.List; | 41 | import java.util.List; |
@@ -47,34 +43,28 @@ import java.util.Objects; | @@ -47,34 +43,28 @@ import java.util.Objects; | ||
47 | import java.util.Set; | 43 | import java.util.Set; |
48 | import java.util.concurrent.CopyOnWriteArrayList; | 44 | import java.util.concurrent.CopyOnWriteArrayList; |
49 | import java.util.concurrent.ExecutionException; | 45 | import java.util.concurrent.ExecutionException; |
50 | -import java.util.concurrent.Executors; | ||
51 | import java.util.concurrent.TimeUnit; | 46 | import java.util.concurrent.TimeUnit; |
52 | import java.util.stream.Collectors; | 47 | import java.util.stream.Collectors; |
53 | import java.util.stream.Stream; | 48 | import java.util.stream.Stream; |
54 | 49 | ||
55 | @Slf4j | 50 | @Slf4j |
56 | -public class TbAwsSqsConsumerTemplate<T extends TbQueueMsg> implements TbQueueConsumer<T> { | 51 | +public class TbAwsSqsConsumerTemplate<T extends TbQueueMsg> extends AbstractParallelTbQueueConsumerTemplate<Message, T> { |
57 | 52 | ||
58 | private static final int MAX_NUM_MSGS = 10; | 53 | private static final int MAX_NUM_MSGS = 10; |
59 | 54 | ||
60 | private final Gson gson = new Gson(); | 55 | private final Gson gson = new Gson(); |
61 | private final TbQueueAdmin admin; | 56 | private final TbQueueAdmin admin; |
62 | private final AmazonSQS sqsClient; | 57 | private final AmazonSQS sqsClient; |
63 | - private final String topic; | ||
64 | private final TbQueueMsgDecoder<T> decoder; | 58 | private final TbQueueMsgDecoder<T> decoder; |
65 | private final TbAwsSqsSettings sqsSettings; | 59 | private final TbAwsSqsSettings sqsSettings; |
66 | 60 | ||
67 | private final List<AwsSqsMsgWrapper> pendingMessages = new CopyOnWriteArrayList<>(); | 61 | private final List<AwsSqsMsgWrapper> pendingMessages = new CopyOnWriteArrayList<>(); |
68 | private volatile Set<String> queueUrls; | 62 | private volatile Set<String> queueUrls; |
69 | - private volatile Set<TopicPartitionInfo> partitions; | ||
70 | - private ListeningExecutorService consumerExecutor; | ||
71 | - private volatile boolean subscribed; | ||
72 | - private volatile boolean stopped = false; | ||
73 | 63 | ||
74 | public TbAwsSqsConsumerTemplate(TbQueueAdmin admin, TbAwsSqsSettings sqsSettings, String topic, TbQueueMsgDecoder<T> decoder) { | 64 | public TbAwsSqsConsumerTemplate(TbQueueAdmin admin, TbAwsSqsSettings sqsSettings, String topic, TbQueueMsgDecoder<T> decoder) { |
65 | + super(topic); | ||
75 | this.admin = admin; | 66 | this.admin = admin; |
76 | this.decoder = decoder; | 67 | this.decoder = decoder; |
77 | - this.topic = topic; | ||
78 | this.sqsSettings = sqsSettings; | 68 | this.sqsSettings = sqsSettings; |
79 | 69 | ||
80 | AWSCredentials awsCredentials = new BasicAWSCredentials(sqsSettings.getAccessKeyId(), sqsSettings.getSecretAccessKey()); | 70 | AWSCredentials awsCredentials = new BasicAWSCredentials(sqsSettings.getAccessKeyId(), sqsSettings.getSecretAccessKey()); |
@@ -87,81 +77,60 @@ public class TbAwsSqsConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | @@ -87,81 +77,60 @@ public class TbAwsSqsConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | ||
87 | } | 77 | } |
88 | 78 | ||
89 | @Override | 79 | @Override |
90 | - public String getTopic() { | ||
91 | - return topic; | 80 | + protected void doSubscribe(List<String> topicNames) { |
81 | + queueUrls = topicNames.stream().map(this::getQueueUrl).collect(Collectors.toSet()); | ||
82 | + initNewExecutor(queueUrls.size() * sqsSettings.getThreadsPerTopic() + 1); | ||
92 | } | 83 | } |
93 | 84 | ||
94 | @Override | 85 | @Override |
95 | - public void subscribe() { | ||
96 | - partitions = Collections.singleton(new TopicPartitionInfo(topic, null, null, true)); | ||
97 | - subscribed = false; | 86 | + protected List<Message> doPoll(long durationInMillis) { |
87 | + int duration = (int) TimeUnit.MILLISECONDS.toSeconds(durationInMillis); | ||
88 | + List<ListenableFuture<List<Message>>> futureList = queueUrls | ||
89 | + .stream() | ||
90 | + .map(url -> poll(url, duration)) | ||
91 | + .collect(Collectors.toList()); | ||
92 | + ListenableFuture<List<List<Message>>> futureResult = Futures.allAsList(futureList); | ||
93 | + try { | ||
94 | + return futureResult.get().stream() | ||
95 | + .flatMap(List::stream) | ||
96 | + .filter(Objects::nonNull) | ||
97 | + .collect(Collectors.toList()); | ||
98 | + } catch (InterruptedException | ExecutionException e) { | ||
99 | + if (stopped) { | ||
100 | + log.info("[{}] Aws SQS consumer is stopped.", getTopic()); | ||
101 | + } else { | ||
102 | + log.error("Failed to pool messages.", e); | ||
103 | + } | ||
104 | + return Collections.emptyList(); | ||
105 | + } | ||
98 | } | 106 | } |
99 | 107 | ||
100 | @Override | 108 | @Override |
101 | - public void subscribe(Set<TopicPartitionInfo> partitions) { | ||
102 | - this.partitions = partitions; | ||
103 | - subscribed = false; | 109 | + public T decode(Message message) throws InvalidProtocolBufferException { |
110 | + DefaultTbQueueMsg msg = gson.fromJson(message.getBody(), DefaultTbQueueMsg.class); | ||
111 | + return decoder.decode(msg); | ||
104 | } | 112 | } |
105 | 113 | ||
106 | @Override | 114 | @Override |
107 | - public void unsubscribe() { | ||
108 | - stopped = true; | ||
109 | - | ||
110 | - if (sqsClient != null) { | ||
111 | - sqsClient.shutdown(); | ||
112 | - } | ||
113 | - if (consumerExecutor != null) { | ||
114 | - consumerExecutor.shutdownNow(); | ||
115 | - } | 115 | + protected void doCommit() { |
116 | + pendingMessages.forEach(msg -> | ||
117 | + consumerExecutor.submit(() -> { | ||
118 | + List<DeleteMessageBatchRequestEntry> entries = msg.getMessages() | ||
119 | + .stream() | ||
120 | + .map(message -> new DeleteMessageBatchRequestEntry(message.getMessageId(), message.getReceiptHandle())) | ||
121 | + .collect(Collectors.toList()); | ||
122 | + sqsClient.deleteMessageBatch(msg.getUrl(), entries); | ||
123 | + })); | ||
124 | + pendingMessages.clear(); | ||
116 | } | 125 | } |
117 | 126 | ||
118 | @Override | 127 | @Override |
119 | - public List<T> poll(long durationInMillis) { | ||
120 | - if (!subscribed && partitions == null) { | ||
121 | - try { | ||
122 | - Thread.sleep(durationInMillis); | ||
123 | - } catch (InterruptedException e) { | ||
124 | - log.debug("Failed to await subscription", e); | ||
125 | - } | ||
126 | - } else { | ||
127 | - if (!subscribed) { | ||
128 | - List<String> topicNames = partitions.stream().map(TopicPartitionInfo::getFullTopicName).collect(Collectors.toList()); | ||
129 | - queueUrls = topicNames.stream().map(this::getQueueUrl).collect(Collectors.toSet()); | ||
130 | - consumerExecutor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(queueUrls.size() * sqsSettings.getThreadsPerTopic() + 1)); | ||
131 | - subscribed = true; | ||
132 | - } | ||
133 | - | ||
134 | - if (!pendingMessages.isEmpty()) { | ||
135 | - log.warn("Present {} non committed messages.", pendingMessages.size()); | ||
136 | - return Collections.emptyList(); | ||
137 | - } | ||
138 | - | ||
139 | - List<ListenableFuture<List<Message>>> futureList = queueUrls | ||
140 | - .stream() | ||
141 | - .map(url -> poll(url, (int) TimeUnit.MILLISECONDS.toSeconds(durationInMillis))) | ||
142 | - .collect(Collectors.toList()); | ||
143 | - ListenableFuture<List<List<Message>>> futureResult = Futures.allAsList(futureList); | ||
144 | - try { | ||
145 | - return futureResult.get().stream() | ||
146 | - .flatMap(List::stream) | ||
147 | - .map(msg -> { | ||
148 | - try { | ||
149 | - return decode(msg); | ||
150 | - } catch (IOException e) { | ||
151 | - log.error("Failed to decode message: [{}]", msg); | ||
152 | - return null; | ||
153 | - } | ||
154 | - }).filter(Objects::nonNull) | ||
155 | - .collect(Collectors.toList()); | ||
156 | - } catch (InterruptedException | ExecutionException e) { | ||
157 | - if (stopped) { | ||
158 | - log.info("[{}] Aws SQS consumer is stopped.", topic); | ||
159 | - } else { | ||
160 | - log.error("Failed to pool messages.", e); | ||
161 | - } | ||
162 | - } | 128 | + protected void doUnsubscribe() { |
129 | + stopped = true; | ||
130 | + if (sqsClient != null) { | ||
131 | + sqsClient.shutdown(); | ||
163 | } | 132 | } |
164 | - return Collections.emptyList(); | 133 | + shutdownExecutor(); |
165 | } | 134 | } |
166 | 135 | ||
167 | private ListenableFuture<List<Message>> poll(String url, int waitTimeSeconds) { | 136 | private ListenableFuture<List<Message>> poll(String url, int waitTimeSeconds) { |
@@ -172,7 +141,6 @@ public class TbAwsSqsConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | @@ -172,7 +141,6 @@ public class TbAwsSqsConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | ||
172 | ReceiveMessageRequest request = new ReceiveMessageRequest(); | 141 | ReceiveMessageRequest request = new ReceiveMessageRequest(); |
173 | request | 142 | request |
174 | .withWaitTimeSeconds(waitTimeSeconds) | 143 | .withWaitTimeSeconds(waitTimeSeconds) |
175 | - .withMessageAttributeNames("headers") | ||
176 | .withQueueUrl(url) | 144 | .withQueueUrl(url) |
177 | .withMaxNumberOfMessages(MAX_NUM_MSGS); | 145 | .withMaxNumberOfMessages(MAX_NUM_MSGS); |
178 | return sqsClient.receiveMessage(request).getMessages(); | 146 | return sqsClient.receiveMessage(request).getMessages(); |
@@ -194,25 +162,6 @@ public class TbAwsSqsConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | @@ -194,25 +162,6 @@ public class TbAwsSqsConsumerTemplate<T extends TbQueueMsg> implements TbQueueCo | ||
194 | }, consumerExecutor); | 162 | }, consumerExecutor); |
195 | } | 163 | } |
196 | 164 | ||
197 | - @Override | ||
198 | - public void commit() { | ||
199 | - pendingMessages.forEach(msg -> | ||
200 | - consumerExecutor.submit(() -> { | ||
201 | - List<DeleteMessageBatchRequestEntry> entries = msg.getMessages() | ||
202 | - .stream() | ||
203 | - .map(message -> new DeleteMessageBatchRequestEntry(message.getMessageId(), message.getReceiptHandle())) | ||
204 | - .collect(Collectors.toList()); | ||
205 | - sqsClient.deleteMessageBatch(msg.getUrl(), entries); | ||
206 | - })); | ||
207 | - | ||
208 | - pendingMessages.clear(); | ||
209 | - } | ||
210 | - | ||
211 | - public T decode(Message message) throws InvalidProtocolBufferException { | ||
212 | - DefaultTbQueueMsg msg = gson.fromJson(message.getBody(), DefaultTbQueueMsg.class); | ||
213 | - return decoder.decode(msg); | ||
214 | - } | ||
215 | - | ||
216 | @Data | 165 | @Data |
217 | private static class AwsSqsMsgWrapper { | 166 | private static class AwsSqsMsgWrapper { |
218 | private final String url; | 167 | private final String url; |
@@ -37,6 +37,7 @@ import org.thingsboard.server.queue.TbQueueProducer; | @@ -37,6 +37,7 @@ import org.thingsboard.server.queue.TbQueueProducer; | ||
37 | import org.thingsboard.server.queue.common.DefaultTbQueueMsg; | 37 | import org.thingsboard.server.queue.common.DefaultTbQueueMsg; |
38 | 38 | ||
39 | import java.util.Map; | 39 | import java.util.Map; |
40 | +import java.util.UUID; | ||
40 | import java.util.concurrent.ConcurrentHashMap; | 41 | import java.util.concurrent.ConcurrentHashMap; |
41 | import java.util.concurrent.Executors; | 42 | import java.util.concurrent.Executors; |
42 | 43 | ||
@@ -80,7 +81,9 @@ public class TbAwsSqsProducerTemplate<T extends TbQueueMsg> implements TbQueuePr | @@ -80,7 +81,9 @@ public class TbAwsSqsProducerTemplate<T extends TbQueueMsg> implements TbQueuePr | ||
80 | sendMsgRequest.withQueueUrl(getQueueUrl(tpi.getFullTopicName())); | 81 | sendMsgRequest.withQueueUrl(getQueueUrl(tpi.getFullTopicName())); |
81 | sendMsgRequest.withMessageBody(gson.toJson(new DefaultTbQueueMsg(msg))); | 82 | sendMsgRequest.withMessageBody(gson.toJson(new DefaultTbQueueMsg(msg))); |
82 | 83 | ||
83 | - sendMsgRequest.withMessageGroupId(msg.getKey().toString()); | 84 | + sendMsgRequest.withMessageGroupId(tpi.getTopic()); |
85 | + sendMsgRequest.withMessageDeduplicationId(UUID.randomUUID().toString()); | ||
86 | + | ||
84 | ListenableFuture<SendMessageResult> future = producerExecutor.submit(() -> sqsClient.sendMessage(sendMsgRequest)); | 87 | ListenableFuture<SendMessageResult> future = producerExecutor.submit(() -> sqsClient.sendMessage(sendMsgRequest)); |
85 | 88 | ||
86 | Futures.addCallback(future, new FutureCallback<SendMessageResult>() { | 89 | Futures.addCallback(future, new FutureCallback<SendMessageResult>() { |
@@ -55,7 +55,6 @@ public class TbAwsSqsQueueAttributes { | @@ -55,7 +55,6 @@ public class TbAwsSqsQueueAttributes { | ||
55 | @PostConstruct | 55 | @PostConstruct |
56 | private void init() { | 56 | private void init() { |
57 | defaultAttributes.put(QueueAttributeName.FifoQueue.toString(), "true"); | 57 | defaultAttributes.put(QueueAttributeName.FifoQueue.toString(), "true"); |
58 | - defaultAttributes.put(QueueAttributeName.ContentBasedDeduplication.toString(), "true"); | ||
59 | 58 | ||
60 | coreAttributes = getConfigs(coreProperties); | 59 | coreAttributes = getConfigs(coreProperties); |
61 | ruleEngineAttributes = getConfigs(ruleEngineProperties); | 60 | ruleEngineAttributes = getConfigs(ruleEngineProperties); |
common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java
@@ -37,6 +37,7 @@ import org.thingsboard.server.gen.transport.TransportProtos; | @@ -37,6 +37,7 @@ import org.thingsboard.server.gen.transport.TransportProtos; | ||
37 | import java.lang.reflect.Field; | 37 | import java.lang.reflect.Field; |
38 | import java.util.List; | 38 | import java.util.List; |
39 | import java.util.Optional; | 39 | import java.util.Optional; |
40 | +import java.util.Set; | ||
40 | import java.util.UUID; | 41 | import java.util.UUID; |
41 | import java.util.concurrent.ConcurrentHashMap; | 42 | import java.util.concurrent.ConcurrentHashMap; |
42 | import java.util.concurrent.ConcurrentMap; | 43 | import java.util.concurrent.ConcurrentMap; |
@@ -55,6 +56,8 @@ public class CoapTransportResource extends CoapResource { | @@ -55,6 +56,8 @@ public class CoapTransportResource extends CoapResource { | ||
55 | private final Field observerField; | 56 | private final Field observerField; |
56 | private final long timeout; | 57 | private final long timeout; |
57 | private final ConcurrentMap<String, TransportProtos.SessionInfoProto> tokenToSessionIdMap = new ConcurrentHashMap<>(); | 58 | private final ConcurrentMap<String, TransportProtos.SessionInfoProto> tokenToSessionIdMap = new ConcurrentHashMap<>(); |
59 | + private final Set<UUID> rpcSubscriptions = ConcurrentHashMap.newKeySet(); | ||
60 | + private final Set<UUID> attributeSubscriptions = ConcurrentHashMap.newKeySet(); | ||
58 | 61 | ||
59 | public CoapTransportResource(CoapTransportContext context, String name) { | 62 | public CoapTransportResource(CoapTransportContext context, String name) { |
60 | super(name); | 63 | super(name); |
@@ -149,11 +152,13 @@ public class CoapTransportResource extends CoapResource { | @@ -149,11 +152,13 @@ public class CoapTransportResource extends CoapResource { | ||
149 | transportService.process(sessionInfo, | 152 | transportService.process(sessionInfo, |
150 | transportContext.getAdaptor().convertToPostAttributes(sessionId, request), | 153 | transportContext.getAdaptor().convertToPostAttributes(sessionId, request), |
151 | new CoapOkCallback(exchange)); | 154 | new CoapOkCallback(exchange)); |
155 | + reportActivity(sessionId, sessionInfo); | ||
152 | break; | 156 | break; |
153 | case POST_TELEMETRY_REQUEST: | 157 | case POST_TELEMETRY_REQUEST: |
154 | transportService.process(sessionInfo, | 158 | transportService.process(sessionInfo, |
155 | transportContext.getAdaptor().convertToPostTelemetry(sessionId, request), | 159 | transportContext.getAdaptor().convertToPostTelemetry(sessionId, request), |
156 | new CoapOkCallback(exchange)); | 160 | new CoapOkCallback(exchange)); |
161 | + reportActivity(sessionId, sessionInfo); | ||
157 | break; | 162 | break; |
158 | case CLAIM_REQUEST: | 163 | case CLAIM_REQUEST: |
159 | transportService.process(sessionInfo, | 164 | transportService.process(sessionInfo, |
@@ -161,6 +166,7 @@ public class CoapTransportResource extends CoapResource { | @@ -161,6 +166,7 @@ public class CoapTransportResource extends CoapResource { | ||
161 | new CoapOkCallback(exchange)); | 166 | new CoapOkCallback(exchange)); |
162 | break; | 167 | break; |
163 | case SUBSCRIBE_ATTRIBUTES_REQUEST: | 168 | case SUBSCRIBE_ATTRIBUTES_REQUEST: |
169 | + attributeSubscriptions.add(sessionId); | ||
164 | advanced.setObserver(new CoapExchangeObserverProxy((ExchangeObserver) observerField.get(advanced), | 170 | advanced.setObserver(new CoapExchangeObserverProxy((ExchangeObserver) observerField.get(advanced), |
165 | registerAsyncCoapSession(exchange, request, sessionInfo, sessionId))); | 171 | registerAsyncCoapSession(exchange, request, sessionInfo, sessionId))); |
166 | transportService.process(sessionInfo, | 172 | transportService.process(sessionInfo, |
@@ -168,6 +174,7 @@ public class CoapTransportResource extends CoapResource { | @@ -168,6 +174,7 @@ public class CoapTransportResource extends CoapResource { | ||
168 | new CoapNoOpCallback(exchange)); | 174 | new CoapNoOpCallback(exchange)); |
169 | break; | 175 | break; |
170 | case UNSUBSCRIBE_ATTRIBUTES_REQUEST: | 176 | case UNSUBSCRIBE_ATTRIBUTES_REQUEST: |
177 | + attributeSubscriptions.remove(sessionId); | ||
171 | TransportProtos.SessionInfoProto attrSession = lookupAsyncSessionInfo(request); | 178 | TransportProtos.SessionInfoProto attrSession = lookupAsyncSessionInfo(request); |
172 | if (attrSession != null) { | 179 | if (attrSession != null) { |
173 | transportService.process(attrSession, | 180 | transportService.process(attrSession, |
@@ -177,6 +184,7 @@ public class CoapTransportResource extends CoapResource { | @@ -177,6 +184,7 @@ public class CoapTransportResource extends CoapResource { | ||
177 | } | 184 | } |
178 | break; | 185 | break; |
179 | case SUBSCRIBE_RPC_COMMANDS_REQUEST: | 186 | case SUBSCRIBE_RPC_COMMANDS_REQUEST: |
187 | + rpcSubscriptions.add(sessionId); | ||
180 | advanced.setObserver(new CoapExchangeObserverProxy((ExchangeObserver) observerField.get(advanced), | 188 | advanced.setObserver(new CoapExchangeObserverProxy((ExchangeObserver) observerField.get(advanced), |
181 | registerAsyncCoapSession(exchange, request, sessionInfo, sessionId))); | 189 | registerAsyncCoapSession(exchange, request, sessionInfo, sessionId))); |
182 | transportService.process(sessionInfo, | 190 | transportService.process(sessionInfo, |
@@ -184,13 +192,13 @@ public class CoapTransportResource extends CoapResource { | @@ -184,13 +192,13 @@ public class CoapTransportResource extends CoapResource { | ||
184 | new CoapNoOpCallback(exchange)); | 192 | new CoapNoOpCallback(exchange)); |
185 | break; | 193 | break; |
186 | case UNSUBSCRIBE_RPC_COMMANDS_REQUEST: | 194 | case UNSUBSCRIBE_RPC_COMMANDS_REQUEST: |
195 | + rpcSubscriptions.remove(sessionId); | ||
187 | TransportProtos.SessionInfoProto rpcSession = lookupAsyncSessionInfo(request); | 196 | TransportProtos.SessionInfoProto rpcSession = lookupAsyncSessionInfo(request); |
188 | if (rpcSession != null) { | 197 | if (rpcSession != null) { |
189 | transportService.process(rpcSession, | 198 | transportService.process(rpcSession, |
190 | TransportProtos.SubscribeToRPCMsg.newBuilder().setUnsubscribe(true).build(), | 199 | TransportProtos.SubscribeToRPCMsg.newBuilder().setUnsubscribe(true).build(), |
191 | new CoapOkCallback(exchange)); | 200 | new CoapOkCallback(exchange)); |
192 | - transportService.process(sessionInfo, getSessionEventMsg(TransportProtos.SessionEvent.CLOSED), null); | ||
193 | - transportService.deregisterSession(rpcSession); | 201 | + closeAndDeregister(sessionInfo); |
194 | } | 202 | } |
195 | break; | 203 | break; |
196 | case TO_DEVICE_RPC_RESPONSE: | 204 | case TO_DEVICE_RPC_RESPONSE: |
@@ -221,6 +229,14 @@ public class CoapTransportResource extends CoapResource { | @@ -221,6 +229,14 @@ public class CoapTransportResource extends CoapResource { | ||
221 | })); | 229 | })); |
222 | } | 230 | } |
223 | 231 | ||
232 | + private void reportActivity(UUID sessionId, TransportProtos.SessionInfoProto sessionInfo) { | ||
233 | + transportContext.getTransportService().process(sessionInfo, TransportProtos.SubscriptionInfoProto.newBuilder() | ||
234 | + .setAttributeSubscription(attributeSubscriptions.contains(sessionId)) | ||
235 | + .setRpcSubscription(rpcSubscriptions.contains(sessionId)) | ||
236 | + .setLastActivityTime(System.currentTimeMillis()) | ||
237 | + .build(), TransportServiceCallback.EMPTY); | ||
238 | + } | ||
239 | + | ||
224 | private TransportProtos.SessionInfoProto lookupAsyncSessionInfo(Request request) { | 240 | private TransportProtos.SessionInfoProto lookupAsyncSessionInfo(Request request) { |
225 | String token = request.getSource().getHostAddress() + ":" + request.getSourcePort() + ":" + request.getTokenString(); | 241 | String token = request.getSource().getHostAddress() + ":" + request.getSourcePort() + ":" + request.getTokenString(); |
226 | return tokenToSessionIdMap.remove(token); | 242 | return tokenToSessionIdMap.remove(token); |
@@ -438,6 +454,9 @@ public class CoapTransportResource extends CoapResource { | @@ -438,6 +454,9 @@ public class CoapTransportResource extends CoapResource { | ||
438 | private void closeAndDeregister(TransportProtos.SessionInfoProto session) { | 454 | private void closeAndDeregister(TransportProtos.SessionInfoProto session) { |
439 | transportService.process(session, getSessionEventMsg(TransportProtos.SessionEvent.CLOSED), null); | 455 | transportService.process(session, getSessionEventMsg(TransportProtos.SessionEvent.CLOSED), null); |
440 | transportService.deregisterSession(session); | 456 | transportService.deregisterSession(session); |
457 | + UUID sessionId = new UUID(session.getSessionIdMSB(), session.getSessionIdLSB()); | ||
458 | + rpcSubscriptions.remove(sessionId); | ||
459 | + attributeSubscriptions.remove(sessionId); | ||
441 | } | 460 | } |
442 | 461 | ||
443 | } | 462 | } |
@@ -36,6 +36,7 @@ import org.thingsboard.server.common.transport.TransportContext; | @@ -36,6 +36,7 @@ import org.thingsboard.server.common.transport.TransportContext; | ||
36 | import org.thingsboard.server.common.transport.TransportService; | 36 | import org.thingsboard.server.common.transport.TransportService; |
37 | import org.thingsboard.server.common.transport.TransportServiceCallback; | 37 | import org.thingsboard.server.common.transport.TransportServiceCallback; |
38 | import org.thingsboard.server.common.transport.adaptor.JsonConverter; | 38 | import org.thingsboard.server.common.transport.adaptor.JsonConverter; |
39 | +import org.thingsboard.server.gen.transport.TransportProtos; | ||
39 | import org.thingsboard.server.gen.transport.TransportProtos.AttributeUpdateNotificationMsg; | 40 | import org.thingsboard.server.gen.transport.TransportProtos.AttributeUpdateNotificationMsg; |
40 | import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto; | 41 | import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto; |
41 | import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestMsg; | 42 | import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestMsg; |
@@ -102,6 +103,7 @@ public class DeviceApiController { | @@ -102,6 +103,7 @@ public class DeviceApiController { | ||
102 | TransportService transportService = transportContext.getTransportService(); | 103 | TransportService transportService = transportContext.getTransportService(); |
103 | transportService.process(sessionInfo, JsonConverter.convertToAttributesProto(new JsonParser().parse(json)), | 104 | transportService.process(sessionInfo, JsonConverter.convertToAttributesProto(new JsonParser().parse(json)), |
104 | new HttpOkCallback(responseWriter)); | 105 | new HttpOkCallback(responseWriter)); |
106 | + reportActivity(sessionInfo); | ||
105 | })); | 107 | })); |
106 | return responseWriter; | 108 | return responseWriter; |
107 | } | 109 | } |
@@ -115,6 +117,7 @@ public class DeviceApiController { | @@ -115,6 +117,7 @@ public class DeviceApiController { | ||
115 | TransportService transportService = transportContext.getTransportService(); | 117 | TransportService transportService = transportContext.getTransportService(); |
116 | transportService.process(sessionInfo, JsonConverter.convertToTelemetryProto(new JsonParser().parse(json)), | 118 | transportService.process(sessionInfo, JsonConverter.convertToTelemetryProto(new JsonParser().parse(json)), |
117 | new HttpOkCallback(responseWriter)); | 119 | new HttpOkCallback(responseWriter)); |
120 | + reportActivity(sessionInfo); | ||
118 | })); | 121 | })); |
119 | return responseWriter; | 122 | return responseWriter; |
120 | } | 123 | } |
@@ -274,7 +277,6 @@ public class DeviceApiController { | @@ -274,7 +277,6 @@ public class DeviceApiController { | ||
274 | } | 277 | } |
275 | } | 278 | } |
276 | 279 | ||
277 | - | ||
278 | private static class HttpSessionListener implements SessionMsgListener { | 280 | private static class HttpSessionListener implements SessionMsgListener { |
279 | 281 | ||
280 | private final DeferredResult<ResponseEntity> responseWriter; | 282 | private final DeferredResult<ResponseEntity> responseWriter; |
@@ -308,4 +310,13 @@ public class DeviceApiController { | @@ -308,4 +310,13 @@ public class DeviceApiController { | ||
308 | responseWriter.setResult(new ResponseEntity<>(JsonConverter.toJson(msg).toString(), HttpStatus.OK)); | 310 | responseWriter.setResult(new ResponseEntity<>(JsonConverter.toJson(msg).toString(), HttpStatus.OK)); |
309 | } | 311 | } |
310 | } | 312 | } |
313 | + | ||
314 | + private void reportActivity(SessionInfoProto sessionInfo) { | ||
315 | + transportContext.getTransportService().process(sessionInfo, TransportProtos.SubscriptionInfoProto.newBuilder() | ||
316 | + .setAttributeSubscription(false) | ||
317 | + .setRpcSubscription(false) | ||
318 | + .setLastActivityTime(System.currentTimeMillis()) | ||
319 | + .build(), TransportServiceCallback.EMPTY); | ||
320 | + } | ||
321 | + | ||
311 | } | 322 | } |
@@ -20,7 +20,20 @@ package org.thingsboard.server.common.transport; | @@ -20,7 +20,20 @@ package org.thingsboard.server.common.transport; | ||
20 | */ | 20 | */ |
21 | public interface TransportServiceCallback<T> { | 21 | public interface TransportServiceCallback<T> { |
22 | 22 | ||
23 | + TransportServiceCallback<Void> EMPTY = new TransportServiceCallback<Void>() { | ||
24 | + @Override | ||
25 | + public void onSuccess(Void msg) { | ||
26 | + | ||
27 | + } | ||
28 | + | ||
29 | + @Override | ||
30 | + public void onError(Throwable e) { | ||
31 | + | ||
32 | + } | ||
33 | + }; | ||
34 | + | ||
23 | void onSuccess(T msg); | 35 | void onSuccess(T msg); |
36 | + | ||
24 | void onError(Throwable e); | 37 | void onError(Throwable e); |
25 | 38 | ||
26 | } | 39 | } |
@@ -31,8 +31,8 @@ public class OAuth2ClientMapperConfig { | @@ -31,8 +31,8 @@ public class OAuth2ClientMapperConfig { | ||
31 | private String firstNameAttributeKey; | 31 | private String firstNameAttributeKey; |
32 | private String lastNameAttributeKey; | 32 | private String lastNameAttributeKey; |
33 | private String tenantNameStrategy; | 33 | private String tenantNameStrategy; |
34 | - private String tenantNameStrategyPattern; | ||
35 | - private String customerNameStrategyPattern; | 34 | + private String tenantNamePattern; |
35 | + private String customerNamePattern; | ||
36 | } | 36 | } |
37 | 37 | ||
38 | @Data | 38 | @Data |
@@ -44,17 +44,19 @@ services: | @@ -44,17 +44,19 @@ services: | ||
44 | - cassandra | 44 | - cassandra |
45 | tb-core2: | 45 | tb-core2: |
46 | env_file: | 46 | env_file: |
47 | - - tb-node.cassandra.env | 47 | + - tb-node.hybrid.env |
48 | depends_on: | 48 | depends_on: |
49 | - kafka | 49 | - kafka |
50 | - redis | 50 | - redis |
51 | + - postgres | ||
51 | - cassandra | 52 | - cassandra |
52 | tb-rule-engine1: | 53 | tb-rule-engine1: |
53 | env_file: | 54 | env_file: |
54 | - - tb-node.cassandra.env | 55 | + - tb-node.hybrid.env |
55 | depends_on: | 56 | depends_on: |
56 | - kafka | 57 | - kafka |
57 | - redis | 58 | - redis |
59 | + - postgres | ||
58 | - cassandra | 60 | - cassandra |
59 | tb-rule-engine2: | 61 | tb-rule-engine2: |
60 | env_file: | 62 | env_file: |
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | # limitations under the License. | 14 | # limitations under the License. |
15 | # | 15 | # |
16 | 16 | ||
17 | -service-type: "TB_SERVICE_TYPE" #kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) | 17 | +queue_type: "TB_QUEUE_TYPE" #kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) |
18 | request_topic: "REMOTE_JS_EVAL_REQUEST_TOPIC" | 18 | request_topic: "REMOTE_JS_EVAL_REQUEST_TOPIC" |
19 | 19 | ||
20 | js: | 20 | js: |
@@ -25,18 +25,18 @@ kafka: | @@ -25,18 +25,18 @@ kafka: | ||
25 | # Kafka Bootstrap Servers | 25 | # Kafka Bootstrap Servers |
26 | servers: "TB_KAFKA_SERVERS" | 26 | servers: "TB_KAFKA_SERVERS" |
27 | replication_factor: "TB_QUEUE_KAFKA_REPLICATION_FACTOR" | 27 | replication_factor: "TB_QUEUE_KAFKA_REPLICATION_FACTOR" |
28 | - topic-properties: "TB_QUEUE_KAFKA_JE_TOPIC_PROPERTIES" | 28 | + topic_properties: "TB_QUEUE_KAFKA_JE_TOPIC_PROPERTIES" |
29 | 29 | ||
30 | pubsub: | 30 | pubsub: |
31 | project_id: "TB_QUEUE_PUBSUB_PROJECT_ID" | 31 | project_id: "TB_QUEUE_PUBSUB_PROJECT_ID" |
32 | service_account: "TB_QUEUE_PUBSUB_SERVICE_ACCOUNT" | 32 | service_account: "TB_QUEUE_PUBSUB_SERVICE_ACCOUNT" |
33 | - queue-properties: "TB_QUEUE_PUBSUB_JE_QUEUE_PROPERTIES" | 33 | + queue_properties: "TB_QUEUE_PUBSUB_JE_QUEUE_PROPERTIES" |
34 | 34 | ||
35 | aws_sqs: | 35 | aws_sqs: |
36 | access_key_id: "TB_QUEUE_AWS_SQS_ACCESS_KEY_ID" | 36 | access_key_id: "TB_QUEUE_AWS_SQS_ACCESS_KEY_ID" |
37 | secret_access_key: "TB_QUEUE_AWS_SQS_SECRET_ACCESS_KEY" | 37 | secret_access_key: "TB_QUEUE_AWS_SQS_SECRET_ACCESS_KEY" |
38 | region: "TB_QUEUE_AWS_SQS_REGION" | 38 | region: "TB_QUEUE_AWS_SQS_REGION" |
39 | - queue-properties: "TB_QUEUE_AWS_SQS_JE_QUEUE_PROPERTIES" | 39 | + queue_properties: "TB_QUEUE_AWS_SQS_JE_QUEUE_PROPERTIES" |
40 | 40 | ||
41 | rabbitmq: | 41 | rabbitmq: |
42 | host: "TB_QUEUE_RABBIT_MQ_HOST" | 42 | host: "TB_QUEUE_RABBIT_MQ_HOST" |
@@ -44,14 +44,14 @@ rabbitmq: | @@ -44,14 +44,14 @@ rabbitmq: | ||
44 | virtual_host: "TB_QUEUE_RABBIT_MQ_VIRTUAL_HOST" | 44 | virtual_host: "TB_QUEUE_RABBIT_MQ_VIRTUAL_HOST" |
45 | username: "TB_QUEUE_RABBIT_MQ_USERNAME" | 45 | username: "TB_QUEUE_RABBIT_MQ_USERNAME" |
46 | password: "TB_QUEUE_RABBIT_MQ_PASSWORD" | 46 | password: "TB_QUEUE_RABBIT_MQ_PASSWORD" |
47 | - queue-properties: "TB_QUEUE_RABBIT_MQ_JE_QUEUE_PROPERTIES" | 47 | + queue_properties: "TB_QUEUE_RABBIT_MQ_JE_QUEUE_PROPERTIES" |
48 | 48 | ||
49 | service_bus: | 49 | service_bus: |
50 | namespace_name: "TB_QUEUE_SERVICE_BUS_NAMESPACE_NAME" | 50 | namespace_name: "TB_QUEUE_SERVICE_BUS_NAMESPACE_NAME" |
51 | sas_key_name: "TB_QUEUE_SERVICE_BUS_SAS_KEY_NAME" | 51 | sas_key_name: "TB_QUEUE_SERVICE_BUS_SAS_KEY_NAME" |
52 | sas_key: "TB_QUEUE_SERVICE_BUS_SAS_KEY" | 52 | sas_key: "TB_QUEUE_SERVICE_BUS_SAS_KEY" |
53 | max_messages: "TB_QUEUE_SERVICE_BUS_MAX_MESSAGES" | 53 | max_messages: "TB_QUEUE_SERVICE_BUS_MAX_MESSAGES" |
54 | - queue-properties: "TB_QUEUE_SERVICE_BUS_JE_QUEUE_PROPERTIES" | 54 | + queue_properties: "TB_QUEUE_SERVICE_BUS_JE_QUEUE_PROPERTIES" |
55 | 55 | ||
56 | logger: | 56 | logger: |
57 | level: "LOGGER_LEVEL" | 57 | level: "LOGGER_LEVEL" |
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | # limitations under the License. | 14 | # limitations under the License. |
15 | # | 15 | # |
16 | 16 | ||
17 | -service-type: "kafka" | 17 | +queue_type: "kafka" |
18 | request_topic: "js_eval.requests" | 18 | request_topic: "js_eval.requests" |
19 | 19 | ||
20 | js: | 20 | js: |
@@ -25,13 +25,13 @@ kafka: | @@ -25,13 +25,13 @@ kafka: | ||
25 | # Kafka Bootstrap Servers | 25 | # Kafka Bootstrap Servers |
26 | servers: "localhost:9092" | 26 | servers: "localhost:9092" |
27 | replication_factor: "1" | 27 | replication_factor: "1" |
28 | - topic-properties: "retention.ms:604800000;segment.bytes:26214400;retention.bytes:104857600" | 28 | + topic_properties: "retention.ms:604800000;segment.bytes:26214400;retention.bytes:104857600" |
29 | 29 | ||
30 | pubsub: | 30 | pubsub: |
31 | - queue-properties: "ackDeadlineInSec:30;messageRetentionInSec:604800" | 31 | + queue_properties: "ackDeadlineInSec:30;messageRetentionInSec:604800" |
32 | 32 | ||
33 | aws_sqs: | 33 | aws_sqs: |
34 | - queue-properties: "VisibilityTimeout:30;MaximumMessageSize:262144;MessageRetentionPeriod:604800" | 34 | + queue_properties: "VisibilityTimeout:30;MaximumMessageSize:262144;MessageRetentionPeriod:604800" |
35 | 35 | ||
36 | rabbitmq: | 36 | rabbitmq: |
37 | host: "localhost" | 37 | host: "localhost" |
@@ -39,10 +39,10 @@ rabbitmq: | @@ -39,10 +39,10 @@ rabbitmq: | ||
39 | virtual_host: "/" | 39 | virtual_host: "/" |
40 | username: "admin" | 40 | username: "admin" |
41 | password: "password" | 41 | password: "password" |
42 | - queue-properties: "x-max-length-bytes:1048576000;x-message-ttl:604800000" | 42 | + queue_properties: "x-max-length-bytes:1048576000;x-message-ttl:604800000" |
43 | 43 | ||
44 | service_bus: | 44 | service_bus: |
45 | - queue-properties: "lockDurationInSec:30;maxSizeInMb:1024;messageTimeToLiveInSec:604800" | 45 | + queue_properties: "lockDurationInSec:30;maxSizeInMb:1024;messageTimeToLiveInSec:604800" |
46 | 46 | ||
47 | logger: | 47 | logger: |
48 | level: "info" | 48 | level: "info" |
@@ -4,6 +4,152 @@ | @@ -4,6 +4,152 @@ | ||
4 | "lockfileVersion": 1, | 4 | "lockfileVersion": 1, |
5 | "requires": true, | 5 | "requires": true, |
6 | "dependencies": { | 6 | "dependencies": { |
7 | + "@azure/abort-controller": { | ||
8 | + "version": "1.0.1", | ||
9 | + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.1.tgz", | ||
10 | + "integrity": "sha512-wP2Jw6uPp8DEDy0n4KNidvwzDjyVV2xnycEIq7nPzj1rHyb/r+t3OPeNT1INZePP2wy5ZqlwyuyOMTi0ePyY1A==", | ||
11 | + "requires": { | ||
12 | + "tslib": "^1.9.3" | ||
13 | + } | ||
14 | + }, | ||
15 | + "@azure/amqp-common": { | ||
16 | + "version": "1.0.0-preview.13", | ||
17 | + "resolved": "https://registry.npmjs.org/@azure/amqp-common/-/amqp-common-1.0.0-preview.13.tgz", | ||
18 | + "integrity": "sha512-v19NGXFm8Hzr2bj/DSWYc2anaDcoAeFQXJGuBT8QO7eS13vaELQNGaynOGipEcI313A1778R/FFCk4o+dylIiw==", | ||
19 | + "requires": { | ||
20 | + "@types/async-lock": "^1.1.0", | ||
21 | + "@types/is-buffer": "^2.0.0", | ||
22 | + "async-lock": "^1.1.3", | ||
23 | + "buffer": "^5.2.1", | ||
24 | + "debug": "^3.1.0", | ||
25 | + "events": "^3.0.0", | ||
26 | + "is-buffer": "^2.0.3", | ||
27 | + "jssha": "^2.3.1", | ||
28 | + "process": "^0.11.10", | ||
29 | + "rhea": "^1.0.18", | ||
30 | + "rhea-promise": "^0.1.15", | ||
31 | + "stream-browserify": "^2.0.2", | ||
32 | + "tslib": "^1.9.3", | ||
33 | + "url": "^0.11.0", | ||
34 | + "util": "^0.11.1" | ||
35 | + }, | ||
36 | + "dependencies": { | ||
37 | + "is-buffer": { | ||
38 | + "version": "2.0.4", | ||
39 | + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", | ||
40 | + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" | ||
41 | + } | ||
42 | + } | ||
43 | + }, | ||
44 | + "@azure/core-auth": { | ||
45 | + "version": "1.1.2", | ||
46 | + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.1.2.tgz", | ||
47 | + "integrity": "sha512-IUbP/f3v96dpHgXUwsAjUwDzjlUjawyUhWhGKKB6Qxy+iqppC/pVBPyc6kdpyTe7H30HN+4H3f0lar7Wp9Hx6A==", | ||
48 | + "requires": { | ||
49 | + "@azure/abort-controller": "^1.0.0", | ||
50 | + "@azure/core-tracing": "1.0.0-preview.8", | ||
51 | + "@opentelemetry/api": "^0.6.1", | ||
52 | + "tslib": "^1.10.0" | ||
53 | + } | ||
54 | + }, | ||
55 | + "@azure/core-http": { | ||
56 | + "version": "1.1.1", | ||
57 | + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-1.1.1.tgz", | ||
58 | + "integrity": "sha512-yBxH5CtYaCj0f1CKoi3OjQw5C5Go8TbgNA6Q2rX7XsDpN2eeKu0n3kRvzZnKW+brtO1u3YnBBuBLF2KcGoZv6g==", | ||
59 | + "requires": { | ||
60 | + "@azure/abort-controller": "^1.0.0", | ||
61 | + "@azure/core-auth": "^1.1.2", | ||
62 | + "@azure/core-tracing": "1.0.0-preview.8", | ||
63 | + "@azure/logger": "^1.0.0", | ||
64 | + "@opentelemetry/api": "^0.6.1", | ||
65 | + "@types/node-fetch": "^2.5.0", | ||
66 | + "@types/tunnel": "^0.0.1", | ||
67 | + "cross-env": "^6.0.3", | ||
68 | + "form-data": "^3.0.0", | ||
69 | + "node-fetch": "^2.6.0", | ||
70 | + "process": "^0.11.10", | ||
71 | + "tough-cookie": "^3.0.1", | ||
72 | + "tslib": "^1.10.0", | ||
73 | + "tunnel": "^0.0.6", | ||
74 | + "uuid": "^3.3.2", | ||
75 | + "xml2js": "^0.4.19" | ||
76 | + }, | ||
77 | + "dependencies": { | ||
78 | + "form-data": { | ||
79 | + "version": "3.0.0", | ||
80 | + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", | ||
81 | + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", | ||
82 | + "requires": { | ||
83 | + "asynckit": "^0.4.0", | ||
84 | + "combined-stream": "^1.0.8", | ||
85 | + "mime-types": "^2.1.12" | ||
86 | + } | ||
87 | + }, | ||
88 | + "tough-cookie": { | ||
89 | + "version": "3.0.1", | ||
90 | + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", | ||
91 | + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", | ||
92 | + "requires": { | ||
93 | + "ip-regex": "^2.1.0", | ||
94 | + "psl": "^1.1.28", | ||
95 | + "punycode": "^2.1.1" | ||
96 | + } | ||
97 | + } | ||
98 | + } | ||
99 | + }, | ||
100 | + "@azure/core-tracing": { | ||
101 | + "version": "1.0.0-preview.8", | ||
102 | + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.8.tgz", | ||
103 | + "integrity": "sha512-ZKUpCd7Dlyfn7bdc+/zC/sf0aRIaNQMDuSj2RhYRFe3p70hVAnYGp3TX4cnG2yoEALp/LTj/XnZGQ8Xzf6Ja/Q==", | ||
104 | + "requires": { | ||
105 | + "@opencensus/web-types": "0.0.7", | ||
106 | + "@opentelemetry/api": "^0.6.1", | ||
107 | + "tslib": "^1.10.0" | ||
108 | + } | ||
109 | + }, | ||
110 | + "@azure/logger": { | ||
111 | + "version": "1.0.0", | ||
112 | + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.0.tgz", | ||
113 | + "integrity": "sha512-g2qLDgvmhyIxR3JVS8N67CyIOeFRKQlX/llxYJQr1OSGQqM3HTpVP8MjmjcEKbL/OIt2N9C9UFaNQuKOw1laOA==", | ||
114 | + "requires": { | ||
115 | + "tslib": "^1.9.3" | ||
116 | + } | ||
117 | + }, | ||
118 | + "@azure/service-bus": { | ||
119 | + "version": "1.1.6", | ||
120 | + "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-1.1.6.tgz", | ||
121 | + "integrity": "sha512-eCJXcJZGWdlVwLEqMcoIqtUrh/NtyFcDDfq/y8gdCOy3Dzuv8JkPTxjdjcxDthwG9mc5Qter3dGOTwh0U8gwiw==", | ||
122 | + "requires": { | ||
123 | + "@azure/amqp-common": "1.0.0-preview.13", | ||
124 | + "@azure/core-http": "^1.0.0", | ||
125 | + "@opentelemetry/types": "^0.2.0", | ||
126 | + "@types/is-buffer": "^2.0.0", | ||
127 | + "@types/long": "^4.0.0", | ||
128 | + "buffer": "^5.2.1", | ||
129 | + "debug": "^4.1.1", | ||
130 | + "is-buffer": "^2.0.3", | ||
131 | + "long": "^4.0.0", | ||
132 | + "process": "^0.11.10", | ||
133 | + "rhea": "^1.0.18", | ||
134 | + "rhea-promise": "^0.1.15", | ||
135 | + "tslib": "^1.10.0" | ||
136 | + }, | ||
137 | + "dependencies": { | ||
138 | + "debug": { | ||
139 | + "version": "4.1.1", | ||
140 | + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", | ||
141 | + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", | ||
142 | + "requires": { | ||
143 | + "ms": "^2.1.1" | ||
144 | + } | ||
145 | + }, | ||
146 | + "is-buffer": { | ||
147 | + "version": "2.0.4", | ||
148 | + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", | ||
149 | + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" | ||
150 | + } | ||
151 | + } | ||
152 | + }, | ||
7 | "@babel/parser": { | 153 | "@babel/parser": { |
8 | "version": "7.8.4", | 154 | "version": "7.8.4", |
9 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", | 155 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", |
@@ -19,6 +165,69 @@ | @@ -19,6 +165,69 @@ | ||
19 | "regenerator-runtime": "^0.13.2" | 165 | "regenerator-runtime": "^0.13.2" |
20 | } | 166 | } |
21 | }, | 167 | }, |
168 | + "@google-cloud/paginator": { | ||
169 | + "version": "2.0.3", | ||
170 | + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-2.0.3.tgz", | ||
171 | + "integrity": "sha512-kp/pkb2p/p0d8/SKUu4mOq8+HGwF8NPzHWkj+VKrIPQPyMRw8deZtrO/OcSiy9C/7bpfU5Txah5ltUNfPkgEXg==", | ||
172 | + "requires": { | ||
173 | + "arrify": "^2.0.0", | ||
174 | + "extend": "^3.0.2" | ||
175 | + } | ||
176 | + }, | ||
177 | + "@google-cloud/precise-date": { | ||
178 | + "version": "1.0.3", | ||
179 | + "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-1.0.3.tgz", | ||
180 | + "integrity": "sha512-wWnDGh9y3cJHLuVEY8t6un78vizzMWsS7oIWKeFtPj+Ndy+dXvHW0HTx29ZUhen+tswSlQYlwFubvuRP5kKdzQ==" | ||
181 | + }, | ||
182 | + "@google-cloud/projectify": { | ||
183 | + "version": "1.0.4", | ||
184 | + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-1.0.4.tgz", | ||
185 | + "integrity": "sha512-ZdzQUN02eRsmTKfBj9FDL0KNDIFNjBn/d6tHQmA/+FImH5DO6ZV8E7FzxMgAUiVAUq41RFAkb25p1oHOZ8psfg==" | ||
186 | + }, | ||
187 | + "@google-cloud/promisify": { | ||
188 | + "version": "1.0.4", | ||
189 | + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-1.0.4.tgz", | ||
190 | + "integrity": "sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ==" | ||
191 | + }, | ||
192 | + "@google-cloud/pubsub": { | ||
193 | + "version": "1.7.2", | ||
194 | + "resolved": "https://registry.npmjs.org/@google-cloud/pubsub/-/pubsub-1.7.2.tgz", | ||
195 | + "integrity": "sha512-/TziioDSV4FS4wKF1sIaQ+1gvE+um83oHz1nRsZ3L87uWSoOciBjJAcocgPjqrpnW441+Nuw4w0QdSUV1Lka/g==", | ||
196 | + "requires": { | ||
197 | + "@google-cloud/paginator": "^2.0.0", | ||
198 | + "@google-cloud/precise-date": "^1.0.0", | ||
199 | + "@google-cloud/projectify": "^1.0.0", | ||
200 | + "@google-cloud/promisify": "^1.0.0", | ||
201 | + "@types/duplexify": "^3.6.0", | ||
202 | + "@types/long": "^4.0.0", | ||
203 | + "arrify": "^2.0.0", | ||
204 | + "async-each": "^1.0.1", | ||
205 | + "extend": "^3.0.2", | ||
206 | + "google-auth-library": "^5.5.0", | ||
207 | + "google-gax": "^1.14.2", | ||
208 | + "is-stream-ended": "^0.1.4", | ||
209 | + "lodash.snakecase": "^4.1.1", | ||
210 | + "p-defer": "^3.0.0", | ||
211 | + "protobufjs": "^6.8.1" | ||
212 | + } | ||
213 | + }, | ||
214 | + "@grpc/grpc-js": { | ||
215 | + "version": "1.0.3", | ||
216 | + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.0.3.tgz", | ||
217 | + "integrity": "sha512-JKV3f5Bv2TZxK6eJSB9EarsZrnLxrvcFNwI9goq0YRXa3S6NNoCSnI3cG3lkXVIJ03Wng1WXe76kc2JQtRe7AQ==", | ||
218 | + "requires": { | ||
219 | + "semver": "^6.2.0" | ||
220 | + } | ||
221 | + }, | ||
222 | + "@grpc/proto-loader": { | ||
223 | + "version": "0.5.4", | ||
224 | + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.4.tgz", | ||
225 | + "integrity": "sha512-HTM4QpI9B2XFkPz7pjwMyMgZchJ93TVkL3kWPW8GDMDKYxsMnmf4w2TNMJK7+KNiYHS5cJrCEAFlF+AwtXWVPA==", | ||
226 | + "requires": { | ||
227 | + "lodash.camelcase": "^4.3.0", | ||
228 | + "protobufjs": "^6.8.6" | ||
229 | + } | ||
230 | + }, | ||
22 | "@nodelib/fs.scandir": { | 231 | "@nodelib/fs.scandir": { |
23 | "version": "2.1.3", | 232 | "version": "2.1.3", |
24 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", | 233 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", |
@@ -45,23 +254,193 @@ | @@ -45,23 +254,193 @@ | ||
45 | "fastq": "^1.6.0" | 254 | "fastq": "^1.6.0" |
46 | } | 255 | } |
47 | }, | 256 | }, |
257 | + "@opencensus/web-types": { | ||
258 | + "version": "0.0.7", | ||
259 | + "resolved": "https://registry.npmjs.org/@opencensus/web-types/-/web-types-0.0.7.tgz", | ||
260 | + "integrity": "sha512-xB+w7ZDAu3YBzqH44rCmG9/RlrOmFuDPt/bpf17eJr8eZSrLt7nc7LnWdxM9Mmoj/YKMHpxRg28txu3TcpiL+g==" | ||
261 | + }, | ||
262 | + "@opentelemetry/api": { | ||
263 | + "version": "0.6.1", | ||
264 | + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.6.1.tgz", | ||
265 | + "integrity": "sha512-wpufGZa7tTxw7eAsjXJtiyIQ42IWQdX9iUQp7ACJcKo1hCtuhLU+K2Nv1U6oRwT1oAlZTE6m4CgWKZBhOiau3Q==", | ||
266 | + "requires": { | ||
267 | + "@opentelemetry/context-base": "^0.6.1" | ||
268 | + } | ||
269 | + }, | ||
270 | + "@opentelemetry/context-base": { | ||
271 | + "version": "0.6.1", | ||
272 | + "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.6.1.tgz", | ||
273 | + "integrity": "sha512-5bHhlTBBq82ti3qPT15TRxkYTFPPQWbnkkQkmHPtqiS1XcTB69cEKd3Jm7Cfi/vkPoyxapmePE9tyA7EzLt8SQ==" | ||
274 | + }, | ||
275 | + "@opentelemetry/types": { | ||
276 | + "version": "0.2.0", | ||
277 | + "resolved": "https://registry.npmjs.org/@opentelemetry/types/-/types-0.2.0.tgz", | ||
278 | + "integrity": "sha512-GtwNB6BNDdsIPAYEdpp3JnOGO/3AJxjPvny53s3HERBdXSJTGQw8IRhiaTEX0b3w9P8+FwFZde4k+qkjn67aVw==" | ||
279 | + }, | ||
280 | + "@protobufjs/aspromise": { | ||
281 | + "version": "1.1.2", | ||
282 | + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", | ||
283 | + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" | ||
284 | + }, | ||
285 | + "@protobufjs/base64": { | ||
286 | + "version": "1.1.2", | ||
287 | + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", | ||
288 | + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" | ||
289 | + }, | ||
290 | + "@protobufjs/codegen": { | ||
291 | + "version": "2.0.4", | ||
292 | + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", | ||
293 | + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" | ||
294 | + }, | ||
295 | + "@protobufjs/eventemitter": { | ||
296 | + "version": "1.1.0", | ||
297 | + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", | ||
298 | + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" | ||
299 | + }, | ||
300 | + "@protobufjs/fetch": { | ||
301 | + "version": "1.1.0", | ||
302 | + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", | ||
303 | + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", | ||
304 | + "requires": { | ||
305 | + "@protobufjs/aspromise": "^1.1.1", | ||
306 | + "@protobufjs/inquire": "^1.1.0" | ||
307 | + } | ||
308 | + }, | ||
309 | + "@protobufjs/float": { | ||
310 | + "version": "1.0.2", | ||
311 | + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", | ||
312 | + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" | ||
313 | + }, | ||
314 | + "@protobufjs/inquire": { | ||
315 | + "version": "1.1.0", | ||
316 | + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", | ||
317 | + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" | ||
318 | + }, | ||
319 | + "@protobufjs/path": { | ||
320 | + "version": "1.1.2", | ||
321 | + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", | ||
322 | + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" | ||
323 | + }, | ||
324 | + "@protobufjs/pool": { | ||
325 | + "version": "1.1.0", | ||
326 | + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", | ||
327 | + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" | ||
328 | + }, | ||
329 | + "@protobufjs/utf8": { | ||
330 | + "version": "1.1.0", | ||
331 | + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", | ||
332 | + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" | ||
333 | + }, | ||
334 | + "@types/async-lock": { | ||
335 | + "version": "1.1.2", | ||
336 | + "resolved": "https://registry.npmjs.org/@types/async-lock/-/async-lock-1.1.2.tgz", | ||
337 | + "integrity": "sha512-j9n4bb6RhgFIydBe0+kpjnBPYumDaDyU8zvbWykyVMkku+c2CSu31MZkLeaBfqIwU+XCxlDpYDfyMQRkM0AkeQ==" | ||
338 | + }, | ||
48 | "@types/color-name": { | 339 | "@types/color-name": { |
49 | "version": "1.1.1", | 340 | "version": "1.1.1", |
50 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", | 341 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", |
51 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", | 342 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", |
52 | "dev": true | 343 | "dev": true |
53 | }, | 344 | }, |
345 | + "@types/duplexify": { | ||
346 | + "version": "3.6.0", | ||
347 | + "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.0.tgz", | ||
348 | + "integrity": "sha512-5zOA53RUlzN74bvrSGwjudssD9F3a797sDZQkiYpUOxW+WHaXTCPz4/d5Dgi6FKnOqZ2CpaTo0DhgIfsXAOE/A==", | ||
349 | + "requires": { | ||
350 | + "@types/node": "*" | ||
351 | + } | ||
352 | + }, | ||
353 | + "@types/fs-extra": { | ||
354 | + "version": "8.1.0", | ||
355 | + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz", | ||
356 | + "integrity": "sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==", | ||
357 | + "requires": { | ||
358 | + "@types/node": "*" | ||
359 | + } | ||
360 | + }, | ||
361 | + "@types/is-buffer": { | ||
362 | + "version": "2.0.0", | ||
363 | + "resolved": "https://registry.npmjs.org/@types/is-buffer/-/is-buffer-2.0.0.tgz", | ||
364 | + "integrity": "sha512-0f7N/e3BAz32qDYvgB4d2cqv1DqUwvGxHkXsrucICn8la1Vb6Yl6Eg8mPScGwUiqHJeE7diXlzaK+QMA9m4Gxw==", | ||
365 | + "requires": { | ||
366 | + "@types/node": "*" | ||
367 | + } | ||
368 | + }, | ||
369 | + "@types/long": { | ||
370 | + "version": "4.0.1", | ||
371 | + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", | ||
372 | + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" | ||
373 | + }, | ||
374 | + "@types/node": { | ||
375 | + "version": "13.13.4", | ||
376 | + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", | ||
377 | + "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==" | ||
378 | + }, | ||
379 | + "@types/node-fetch": { | ||
380 | + "version": "2.5.7", | ||
381 | + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", | ||
382 | + "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", | ||
383 | + "requires": { | ||
384 | + "@types/node": "*", | ||
385 | + "form-data": "^3.0.0" | ||
386 | + }, | ||
387 | + "dependencies": { | ||
388 | + "form-data": { | ||
389 | + "version": "3.0.0", | ||
390 | + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", | ||
391 | + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", | ||
392 | + "requires": { | ||
393 | + "asynckit": "^0.4.0", | ||
394 | + "combined-stream": "^1.0.8", | ||
395 | + "mime-types": "^2.1.12" | ||
396 | + } | ||
397 | + } | ||
398 | + } | ||
399 | + }, | ||
400 | + "@types/tunnel": { | ||
401 | + "version": "0.0.1", | ||
402 | + "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.1.tgz", | ||
403 | + "integrity": "sha512-AOqu6bQu5MSWwYvehMXLukFHnupHrpZ8nvgae5Ggie9UwzDR1CCwoXgSSWNZJuyOlCdfdsWMA5F2LlmvyoTv8A==", | ||
404 | + "requires": { | ||
405 | + "@types/node": "*" | ||
406 | + } | ||
407 | + }, | ||
54 | "abbrev": { | 408 | "abbrev": { |
55 | "version": "1.1.1", | 409 | "version": "1.1.1", |
56 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", | 410 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", |
57 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", | 411 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", |
58 | "dev": true | 412 | "dev": true |
59 | }, | 413 | }, |
414 | + "abort-controller": { | ||
415 | + "version": "3.0.0", | ||
416 | + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", | ||
417 | + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", | ||
418 | + "requires": { | ||
419 | + "event-target-shim": "^5.0.0" | ||
420 | + } | ||
421 | + }, | ||
422 | + "agent-base": { | ||
423 | + "version": "6.0.0", | ||
424 | + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", | ||
425 | + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", | ||
426 | + "requires": { | ||
427 | + "debug": "4" | ||
428 | + }, | ||
429 | + "dependencies": { | ||
430 | + "debug": { | ||
431 | + "version": "4.1.1", | ||
432 | + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", | ||
433 | + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", | ||
434 | + "requires": { | ||
435 | + "ms": "^2.1.1" | ||
436 | + } | ||
437 | + } | ||
438 | + } | ||
439 | + }, | ||
60 | "ajv": { | 440 | "ajv": { |
61 | "version": "6.11.0", | 441 | "version": "6.11.0", |
62 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", | 442 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", |
63 | "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", | 443 | "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", |
64 | - "dev": true, | ||
65 | "requires": { | 444 | "requires": { |
66 | "fast-deep-equal": "^3.1.1", | 445 | "fast-deep-equal": "^3.1.1", |
67 | "fast-json-stable-stringify": "^2.0.0", | 446 | "fast-json-stable-stringify": "^2.0.0", |
@@ -69,6 +448,47 @@ | @@ -69,6 +448,47 @@ | ||
69 | "uri-js": "^4.2.2" | 448 | "uri-js": "^4.2.2" |
70 | } | 449 | } |
71 | }, | 450 | }, |
451 | + "amqplib": { | ||
452 | + "version": "0.5.5", | ||
453 | + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.5.tgz", | ||
454 | + "integrity": "sha512-sWx1hbfHbyKMw6bXOK2k6+lHL8TESWxjAx5hG8fBtT7wcxoXNIsFxZMnFyBjxt3yL14vn7WqBDe5U6BGOadtLg==", | ||
455 | + "requires": { | ||
456 | + "bitsyntax": "~0.1.0", | ||
457 | + "bluebird": "^3.5.2", | ||
458 | + "buffer-more-ints": "~1.0.0", | ||
459 | + "readable-stream": "1.x >=1.1.9", | ||
460 | + "safe-buffer": "~5.1.2", | ||
461 | + "url-parse": "~1.4.3" | ||
462 | + }, | ||
463 | + "dependencies": { | ||
464 | + "isarray": { | ||
465 | + "version": "0.0.1", | ||
466 | + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", | ||
467 | + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" | ||
468 | + }, | ||
469 | + "readable-stream": { | ||
470 | + "version": "1.1.14", | ||
471 | + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", | ||
472 | + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", | ||
473 | + "requires": { | ||
474 | + "core-util-is": "~1.0.0", | ||
475 | + "inherits": "~2.0.1", | ||
476 | + "isarray": "0.0.1", | ||
477 | + "string_decoder": "~0.10.x" | ||
478 | + } | ||
479 | + }, | ||
480 | + "safe-buffer": { | ||
481 | + "version": "5.1.2", | ||
482 | + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | ||
483 | + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | ||
484 | + }, | ||
485 | + "string_decoder": { | ||
486 | + "version": "0.10.31", | ||
487 | + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", | ||
488 | + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" | ||
489 | + } | ||
490 | + } | ||
491 | + }, | ||
72 | "ansi-align": { | 492 | "ansi-align": { |
73 | "version": "2.0.0", | 493 | "version": "2.0.0", |
74 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", | 494 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", |
@@ -152,11 +572,15 @@ | @@ -152,11 +572,15 @@ | ||
152 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", | 572 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", |
153 | "dev": true | 573 | "dev": true |
154 | }, | 574 | }, |
575 | + "arrify": { | ||
576 | + "version": "2.0.1", | ||
577 | + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", | ||
578 | + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" | ||
579 | + }, | ||
155 | "asn1": { | 580 | "asn1": { |
156 | "version": "0.2.4", | 581 | "version": "0.2.4", |
157 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", | 582 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", |
158 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", | 583 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", |
159 | - "dev": true, | ||
160 | "requires": { | 584 | "requires": { |
161 | "safer-buffer": "~2.1.0" | 585 | "safer-buffer": "~2.1.0" |
162 | } | 586 | } |
@@ -164,8 +588,7 @@ | @@ -164,8 +588,7 @@ | ||
164 | "assert-plus": { | 588 | "assert-plus": { |
165 | "version": "1.0.0", | 589 | "version": "1.0.0", |
166 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", | 590 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", |
167 | - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", | ||
168 | - "dev": true | 591 | + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" |
169 | }, | 592 | }, |
170 | "assign-symbols": { | 593 | "assign-symbols": { |
171 | "version": "1.0.0", | 594 | "version": "1.0.0", |
@@ -184,14 +607,17 @@ | @@ -184,14 +607,17 @@ | ||
184 | "async-each": { | 607 | "async-each": { |
185 | "version": "1.0.3", | 608 | "version": "1.0.3", |
186 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", | 609 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", |
187 | - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", | ||
188 | - "dev": true | 610 | + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" |
611 | + }, | ||
612 | + "async-lock": { | ||
613 | + "version": "1.2.2", | ||
614 | + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.2.2.tgz", | ||
615 | + "integrity": "sha512-uczz62z2fMWOFbyo6rG4NlV2SdxugJT6sZA2QcfB1XaSjEiOh8CuOb/TttyMnYQCda6nkWecJe465tGQDPJiKw==" | ||
189 | }, | 616 | }, |
190 | "asynckit": { | 617 | "asynckit": { |
191 | "version": "0.4.0", | 618 | "version": "0.4.0", |
192 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", | 619 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", |
193 | - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", | ||
194 | - "dev": true | 620 | + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" |
195 | }, | 621 | }, |
196 | "atob": { | 622 | "atob": { |
197 | "version": "2.1.2", | 623 | "version": "2.1.2", |
@@ -199,17 +625,126 @@ | @@ -199,17 +625,126 @@ | ||
199 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", | 625 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", |
200 | "dev": true | 626 | "dev": true |
201 | }, | 627 | }, |
628 | + "aws-sdk": { | ||
629 | + "version": "2.669.0", | ||
630 | + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.669.0.tgz", | ||
631 | + "integrity": "sha512-kuVcSRpDzvkgmeSmMX6Q32eTOb8UeihhUdavMrvUOP6fzSU19cNWS9HAIkYOi/jrEDK85cCZxXjxqE3JGZIGcw==", | ||
632 | + "requires": { | ||
633 | + "buffer": "4.9.1", | ||
634 | + "events": "1.1.1", | ||
635 | + "ieee754": "1.1.13", | ||
636 | + "jmespath": "0.15.0", | ||
637 | + "querystring": "0.2.0", | ||
638 | + "sax": "1.2.1", | ||
639 | + "url": "0.10.3", | ||
640 | + "uuid": "3.3.2", | ||
641 | + "xml2js": "0.4.19" | ||
642 | + }, | ||
643 | + "dependencies": { | ||
644 | + "buffer": { | ||
645 | + "version": "4.9.1", | ||
646 | + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", | ||
647 | + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", | ||
648 | + "requires": { | ||
649 | + "base64-js": "^1.0.2", | ||
650 | + "ieee754": "^1.1.4", | ||
651 | + "isarray": "^1.0.0" | ||
652 | + } | ||
653 | + }, | ||
654 | + "events": { | ||
655 | + "version": "1.1.1", | ||
656 | + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", | ||
657 | + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" | ||
658 | + }, | ||
659 | + "punycode": { | ||
660 | + "version": "1.3.2", | ||
661 | + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", | ||
662 | + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" | ||
663 | + }, | ||
664 | + "sax": { | ||
665 | + "version": "1.2.1", | ||
666 | + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", | ||
667 | + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" | ||
668 | + }, | ||
669 | + "url": { | ||
670 | + "version": "0.10.3", | ||
671 | + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", | ||
672 | + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", | ||
673 | + "requires": { | ||
674 | + "punycode": "1.3.2", | ||
675 | + "querystring": "0.2.0" | ||
676 | + } | ||
677 | + }, | ||
678 | + "uuid": { | ||
679 | + "version": "3.3.2", | ||
680 | + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", | ||
681 | + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" | ||
682 | + }, | ||
683 | + "xml2js": { | ||
684 | + "version": "0.4.19", | ||
685 | + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", | ||
686 | + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", | ||
687 | + "requires": { | ||
688 | + "sax": ">=0.6.0", | ||
689 | + "xmlbuilder": "~9.0.1" | ||
690 | + } | ||
691 | + }, | ||
692 | + "xmlbuilder": { | ||
693 | + "version": "9.0.7", | ||
694 | + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", | ||
695 | + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" | ||
696 | + } | ||
697 | + } | ||
698 | + }, | ||
202 | "aws-sign2": { | 699 | "aws-sign2": { |
203 | "version": "0.7.0", | 700 | "version": "0.7.0", |
204 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", | 701 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", |
205 | - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", | ||
206 | - "dev": true | 702 | + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" |
207 | }, | 703 | }, |
208 | "aws4": { | 704 | "aws4": { |
209 | "version": "1.9.1", | 705 | "version": "1.9.1", |
210 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", | 706 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", |
211 | - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", | ||
212 | - "dev": true | 707 | + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" |
708 | + }, | ||
709 | + "azure-common": { | ||
710 | + "version": "0.9.22", | ||
711 | + "resolved": "https://registry.npmjs.org/azure-common/-/azure-common-0.9.22.tgz", | ||
712 | + "integrity": "sha512-0r9tK9D+1xl2/VPVtfmGmtkMqfooiBLS87fX+Ab0hOCPVVe/6CgVC4in0wSf2Ta8r65DbvxV5P4/t8fp8Q3EsQ==", | ||
713 | + "requires": { | ||
714 | + "dateformat": "1.0.2-1.2.3", | ||
715 | + "duplexer": "~0.1.1", | ||
716 | + "envconf": "~0.0.4", | ||
717 | + "request": "^2.81.0", | ||
718 | + "through": "~2.3.4", | ||
719 | + "tunnel": "~0.0.2", | ||
720 | + "underscore": "1.4.x", | ||
721 | + "validator": "^9.4.1", | ||
722 | + "xml2js": "^0.4.19", | ||
723 | + "xmlbuilder": "0.4.3" | ||
724 | + }, | ||
725 | + "dependencies": { | ||
726 | + "underscore": { | ||
727 | + "version": "1.4.4", | ||
728 | + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", | ||
729 | + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=" | ||
730 | + }, | ||
731 | + "xmlbuilder": { | ||
732 | + "version": "0.4.3", | ||
733 | + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.3.tgz", | ||
734 | + "integrity": "sha1-xGFLp04K0ZbmCcknLNnh3bKKilg=" | ||
735 | + } | ||
736 | + } | ||
737 | + }, | ||
738 | + "azure-sb": { | ||
739 | + "version": "0.11.1", | ||
740 | + "resolved": "https://registry.npmjs.org/azure-sb/-/azure-sb-0.11.1.tgz", | ||
741 | + "integrity": "sha512-ZYgPeSDMD99i/Em+6wT78zvBkJ/dbh2ypb4DbqQ1Flaif5vWJFzC/iKxxcq/vq+THWoO3+UbqWa0JNXnW3zAvw==", | ||
742 | + "requires": { | ||
743 | + "azure-common": "^0.9.22", | ||
744 | + "mpns": "2.1.3", | ||
745 | + "underscore": "^1.8.3", | ||
746 | + "wns": "~0.5.3" | ||
747 | + } | ||
213 | }, | 748 | }, |
214 | "balanced-match": { | 749 | "balanced-match": { |
215 | "version": "1.0.0", | 750 | "version": "1.0.0", |
@@ -272,15 +807,24 @@ | @@ -272,15 +807,24 @@ | ||
272 | } | 807 | } |
273 | } | 808 | } |
274 | }, | 809 | }, |
810 | + "base64-js": { | ||
811 | + "version": "1.3.1", | ||
812 | + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", | ||
813 | + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" | ||
814 | + }, | ||
275 | "bcrypt-pbkdf": { | 815 | "bcrypt-pbkdf": { |
276 | "version": "1.0.2", | 816 | "version": "1.0.2", |
277 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", | 817 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", |
278 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", | 818 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", |
279 | - "dev": true, | ||
280 | "requires": { | 819 | "requires": { |
281 | "tweetnacl": "^0.14.3" | 820 | "tweetnacl": "^0.14.3" |
282 | } | 821 | } |
283 | }, | 822 | }, |
823 | + "bignumber.js": { | ||
824 | + "version": "7.2.1", | ||
825 | + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", | ||
826 | + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" | ||
827 | + }, | ||
284 | "binary-extensions": { | 828 | "binary-extensions": { |
285 | "version": "1.13.1", | 829 | "version": "1.13.1", |
286 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", | 830 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", |
@@ -297,6 +841,41 @@ | @@ -297,6 +841,41 @@ | ||
297 | "file-uri-to-path": "1.0.0" | 841 | "file-uri-to-path": "1.0.0" |
298 | } | 842 | } |
299 | }, | 843 | }, |
844 | + "bitsyntax": { | ||
845 | + "version": "0.1.0", | ||
846 | + "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.1.0.tgz", | ||
847 | + "integrity": "sha512-ikAdCnrloKmFOugAfxWws89/fPc+nw0OOG1IzIE72uSOg/A3cYptKCjSUhDTuj7fhsJtzkzlv7l3b8PzRHLN0Q==", | ||
848 | + "requires": { | ||
849 | + "buffer-more-ints": "~1.0.0", | ||
850 | + "debug": "~2.6.9", | ||
851 | + "safe-buffer": "~5.1.2" | ||
852 | + }, | ||
853 | + "dependencies": { | ||
854 | + "debug": { | ||
855 | + "version": "2.6.9", | ||
856 | + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", | ||
857 | + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", | ||
858 | + "requires": { | ||
859 | + "ms": "2.0.0" | ||
860 | + } | ||
861 | + }, | ||
862 | + "ms": { | ||
863 | + "version": "2.0.0", | ||
864 | + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", | ||
865 | + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" | ||
866 | + }, | ||
867 | + "safe-buffer": { | ||
868 | + "version": "5.1.2", | ||
869 | + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | ||
870 | + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | ||
871 | + } | ||
872 | + } | ||
873 | + }, | ||
874 | + "bluebird": { | ||
875 | + "version": "3.7.2", | ||
876 | + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", | ||
877 | + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" | ||
878 | + }, | ||
300 | "boxen": { | 879 | "boxen": { |
301 | "version": "1.3.0", | 880 | "version": "1.3.0", |
302 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", | 881 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", |
@@ -351,6 +930,25 @@ | @@ -351,6 +930,25 @@ | ||
351 | } | 930 | } |
352 | } | 931 | } |
353 | }, | 932 | }, |
933 | + "buffer": { | ||
934 | + "version": "5.6.0", | ||
935 | + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", | ||
936 | + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", | ||
937 | + "requires": { | ||
938 | + "base64-js": "^1.0.2", | ||
939 | + "ieee754": "^1.1.4" | ||
940 | + } | ||
941 | + }, | ||
942 | + "buffer-equal-constant-time": { | ||
943 | + "version": "1.0.1", | ||
944 | + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", | ||
945 | + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" | ||
946 | + }, | ||
947 | + "buffer-more-ints": { | ||
948 | + "version": "1.0.0", | ||
949 | + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", | ||
950 | + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" | ||
951 | + }, | ||
354 | "byline": { | 952 | "byline": { |
355 | "version": "5.0.0", | 953 | "version": "5.0.0", |
356 | "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", | 954 | "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", |
@@ -389,8 +987,7 @@ | @@ -389,8 +987,7 @@ | ||
389 | "caseless": { | 987 | "caseless": { |
390 | "version": "0.12.0", | 988 | "version": "0.12.0", |
391 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", | 989 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", |
392 | - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", | ||
393 | - "dev": true | 990 | + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" |
394 | }, | 991 | }, |
395 | "chalk": { | 992 | "chalk": { |
396 | "version": "2.4.2", | 993 | "version": "2.4.2", |
@@ -522,7 +1119,6 @@ | @@ -522,7 +1119,6 @@ | ||
522 | "version": "1.0.8", | 1119 | "version": "1.0.8", |
523 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", | 1120 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", |
524 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", | 1121 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", |
525 | - "dev": true, | ||
526 | "requires": { | 1122 | "requires": { |
527 | "delayed-stream": "~1.0.0" | 1123 | "delayed-stream": "~1.0.0" |
528 | } | 1124 | } |
@@ -581,6 +1177,52 @@ | @@ -581,6 +1177,52 @@ | ||
581 | "capture-stack-trace": "^1.0.0" | 1177 | "capture-stack-trace": "^1.0.0" |
582 | } | 1178 | } |
583 | }, | 1179 | }, |
1180 | + "cross-env": { | ||
1181 | + "version": "6.0.3", | ||
1182 | + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", | ||
1183 | + "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", | ||
1184 | + "requires": { | ||
1185 | + "cross-spawn": "^7.0.0" | ||
1186 | + }, | ||
1187 | + "dependencies": { | ||
1188 | + "cross-spawn": { | ||
1189 | + "version": "7.0.2", | ||
1190 | + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", | ||
1191 | + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", | ||
1192 | + "requires": { | ||
1193 | + "path-key": "^3.1.0", | ||
1194 | + "shebang-command": "^2.0.0", | ||
1195 | + "which": "^2.0.1" | ||
1196 | + } | ||
1197 | + }, | ||
1198 | + "path-key": { | ||
1199 | + "version": "3.1.1", | ||
1200 | + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", | ||
1201 | + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" | ||
1202 | + }, | ||
1203 | + "shebang-command": { | ||
1204 | + "version": "2.0.0", | ||
1205 | + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", | ||
1206 | + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", | ||
1207 | + "requires": { | ||
1208 | + "shebang-regex": "^3.0.0" | ||
1209 | + } | ||
1210 | + }, | ||
1211 | + "shebang-regex": { | ||
1212 | + "version": "3.0.0", | ||
1213 | + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", | ||
1214 | + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" | ||
1215 | + }, | ||
1216 | + "which": { | ||
1217 | + "version": "2.0.2", | ||
1218 | + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", | ||
1219 | + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", | ||
1220 | + "requires": { | ||
1221 | + "isexe": "^2.0.0" | ||
1222 | + } | ||
1223 | + } | ||
1224 | + } | ||
1225 | + }, | ||
584 | "cross-spawn": { | 1226 | "cross-spawn": { |
585 | "version": "5.1.0", | 1227 | "version": "5.1.0", |
586 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", | 1228 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", |
@@ -607,16 +1249,19 @@ | @@ -607,16 +1249,19 @@ | ||
607 | "version": "1.14.1", | 1249 | "version": "1.14.1", |
608 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", | 1250 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", |
609 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", | 1251 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", |
610 | - "dev": true, | ||
611 | "requires": { | 1252 | "requires": { |
612 | "assert-plus": "^1.0.0" | 1253 | "assert-plus": "^1.0.0" |
613 | } | 1254 | } |
614 | }, | 1255 | }, |
1256 | + "dateformat": { | ||
1257 | + "version": "1.0.2-1.2.3", | ||
1258 | + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", | ||
1259 | + "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=" | ||
1260 | + }, | ||
615 | "debug": { | 1261 | "debug": { |
616 | "version": "3.2.6", | 1262 | "version": "3.2.6", |
617 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", | 1263 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", |
618 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", | 1264 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", |
619 | - "dev": true, | ||
620 | "requires": { | 1265 | "requires": { |
621 | "ms": "^2.1.1" | 1266 | "ms": "^2.1.1" |
622 | } | 1267 | } |
@@ -683,8 +1328,7 @@ | @@ -683,8 +1328,7 @@ | ||
683 | "delayed-stream": { | 1328 | "delayed-stream": { |
684 | "version": "1.0.0", | 1329 | "version": "1.0.0", |
685 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", | 1330 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", |
686 | - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", | ||
687 | - "dev": true | 1331 | + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" |
688 | }, | 1332 | }, |
689 | "diagnostics": { | 1333 | "diagnostics": { |
690 | "version": "1.1.1", | 1334 | "version": "1.1.1", |
@@ -714,22 +1358,74 @@ | @@ -714,22 +1358,74 @@ | ||
714 | "is-obj": "^1.0.0" | 1358 | "is-obj": "^1.0.0" |
715 | } | 1359 | } |
716 | }, | 1360 | }, |
717 | - "duplexer3": { | ||
718 | - "version": "0.1.4", | ||
719 | - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", | ||
720 | - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", | ||
721 | - "dev": true | ||
722 | - }, | 1361 | + "duplexer": { |
1362 | + "version": "0.1.1", | ||
1363 | + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", | ||
1364 | + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" | ||
1365 | + }, | ||
1366 | + "duplexer3": { | ||
1367 | + "version": "0.1.4", | ||
1368 | + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", | ||
1369 | + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", | ||
1370 | + "dev": true | ||
1371 | + }, | ||
1372 | + "duplexify": { | ||
1373 | + "version": "3.7.1", | ||
1374 | + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", | ||
1375 | + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", | ||
1376 | + "requires": { | ||
1377 | + "end-of-stream": "^1.0.0", | ||
1378 | + "inherits": "^2.0.1", | ||
1379 | + "readable-stream": "^2.0.0", | ||
1380 | + "stream-shift": "^1.0.0" | ||
1381 | + }, | ||
1382 | + "dependencies": { | ||
1383 | + "readable-stream": { | ||
1384 | + "version": "2.3.7", | ||
1385 | + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", | ||
1386 | + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", | ||
1387 | + "requires": { | ||
1388 | + "core-util-is": "~1.0.0", | ||
1389 | + "inherits": "~2.0.3", | ||
1390 | + "isarray": "~1.0.0", | ||
1391 | + "process-nextick-args": "~2.0.0", | ||
1392 | + "safe-buffer": "~5.1.1", | ||
1393 | + "string_decoder": "~1.1.1", | ||
1394 | + "util-deprecate": "~1.0.1" | ||
1395 | + } | ||
1396 | + }, | ||
1397 | + "safe-buffer": { | ||
1398 | + "version": "5.1.2", | ||
1399 | + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | ||
1400 | + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | ||
1401 | + }, | ||
1402 | + "string_decoder": { | ||
1403 | + "version": "1.1.1", | ||
1404 | + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", | ||
1405 | + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", | ||
1406 | + "requires": { | ||
1407 | + "safe-buffer": "~5.1.0" | ||
1408 | + } | ||
1409 | + } | ||
1410 | + } | ||
1411 | + }, | ||
723 | "ecc-jsbn": { | 1412 | "ecc-jsbn": { |
724 | "version": "0.1.2", | 1413 | "version": "0.1.2", |
725 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", | 1414 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", |
726 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", | 1415 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", |
727 | - "dev": true, | ||
728 | "requires": { | 1416 | "requires": { |
729 | "jsbn": "~0.1.0", | 1417 | "jsbn": "~0.1.0", |
730 | "safer-buffer": "^2.1.0" | 1418 | "safer-buffer": "^2.1.0" |
731 | } | 1419 | } |
732 | }, | 1420 | }, |
1421 | + "ecdsa-sig-formatter": { | ||
1422 | + "version": "1.0.11", | ||
1423 | + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", | ||
1424 | + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", | ||
1425 | + "requires": { | ||
1426 | + "safe-buffer": "^5.0.1" | ||
1427 | + } | ||
1428 | + }, | ||
733 | "enabled": { | 1429 | "enabled": { |
734 | "version": "1.0.2", | 1430 | "version": "1.0.2", |
735 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", | 1431 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", |
@@ -738,11 +1434,24 @@ | @@ -738,11 +1434,24 @@ | ||
738 | "env-variable": "0.0.x" | 1434 | "env-variable": "0.0.x" |
739 | } | 1435 | } |
740 | }, | 1436 | }, |
1437 | + "end-of-stream": { | ||
1438 | + "version": "1.4.4", | ||
1439 | + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", | ||
1440 | + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", | ||
1441 | + "requires": { | ||
1442 | + "once": "^1.4.0" | ||
1443 | + } | ||
1444 | + }, | ||
741 | "env-variable": { | 1445 | "env-variable": { |
742 | "version": "0.0.6", | 1446 | "version": "0.0.6", |
743 | "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", | 1447 | "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", |
744 | "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==" | 1448 | "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==" |
745 | }, | 1449 | }, |
1450 | + "envconf": { | ||
1451 | + "version": "0.0.4", | ||
1452 | + "resolved": "https://registry.npmjs.org/envconf/-/envconf-0.0.4.tgz", | ||
1453 | + "integrity": "sha1-hWda+6I3xD+Y3i1GrcDlMqTc9Is=" | ||
1454 | + }, | ||
746 | "escape-string-regexp": { | 1455 | "escape-string-regexp": { |
747 | "version": "1.0.5", | 1456 | "version": "1.0.5", |
748 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", | 1457 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", |
@@ -788,6 +1497,16 @@ | @@ -788,6 +1497,16 @@ | ||
788 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", | 1497 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", |
789 | "dev": true | 1498 | "dev": true |
790 | }, | 1499 | }, |
1500 | + "event-target-shim": { | ||
1501 | + "version": "5.0.1", | ||
1502 | + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", | ||
1503 | + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" | ||
1504 | + }, | ||
1505 | + "events": { | ||
1506 | + "version": "3.1.0", | ||
1507 | + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", | ||
1508 | + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" | ||
1509 | + }, | ||
791 | "execa": { | 1510 | "execa": { |
792 | "version": "0.7.0", | 1511 | "version": "0.7.0", |
793 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", | 1512 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", |
@@ -862,8 +1581,7 @@ | @@ -862,8 +1581,7 @@ | ||
862 | "extend": { | 1581 | "extend": { |
863 | "version": "3.0.2", | 1582 | "version": "3.0.2", |
864 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", | 1583 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", |
865 | - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", | ||
866 | - "dev": true | 1584 | + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" |
867 | }, | 1585 | }, |
868 | "extend-shallow": { | 1586 | "extend-shallow": { |
869 | "version": "3.0.2", | 1587 | "version": "3.0.2", |
@@ -954,14 +1672,12 @@ | @@ -954,14 +1672,12 @@ | ||
954 | "extsprintf": { | 1672 | "extsprintf": { |
955 | "version": "1.3.0", | 1673 | "version": "1.3.0", |
956 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", | 1674 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", |
957 | - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", | ||
958 | - "dev": true | 1675 | + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" |
959 | }, | 1676 | }, |
960 | "fast-deep-equal": { | 1677 | "fast-deep-equal": { |
961 | "version": "3.1.1", | 1678 | "version": "3.1.1", |
962 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", | 1679 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", |
963 | - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", | ||
964 | - "dev": true | 1680 | + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" |
965 | }, | 1681 | }, |
966 | "fast-glob": { | 1682 | "fast-glob": { |
967 | "version": "3.1.1", | 1683 | "version": "3.1.1", |
@@ -1033,8 +1749,7 @@ | @@ -1033,8 +1749,7 @@ | ||
1033 | "fast-json-stable-stringify": { | 1749 | "fast-json-stable-stringify": { |
1034 | "version": "2.1.0", | 1750 | "version": "2.1.0", |
1035 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", | 1751 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", |
1036 | - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", | ||
1037 | - "dev": true | 1752 | + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" |
1038 | }, | 1753 | }, |
1039 | "fast-levenshtein": { | 1754 | "fast-levenshtein": { |
1040 | "version": "2.0.6", | 1755 | "version": "2.0.6", |
@@ -1047,6 +1762,11 @@ | @@ -1047,6 +1762,11 @@ | ||
1047 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", | 1762 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", |
1048 | "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" | 1763 | "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" |
1049 | }, | 1764 | }, |
1765 | + "fast-text-encoding": { | ||
1766 | + "version": "1.0.2", | ||
1767 | + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.2.tgz", | ||
1768 | + "integrity": "sha512-5rQdinSsycpzvAoHga2EDn+LRX1d5xLFsuNG0Kg61JrAT/tASXcLL0nf/33v+sAxlQcfYmWbTURa1mmAf55jGw==" | ||
1769 | + }, | ||
1050 | "fastq": { | 1770 | "fastq": { |
1051 | "version": "1.6.0", | 1771 | "version": "1.6.0", |
1052 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", | 1772 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", |
@@ -1108,14 +1828,12 @@ | @@ -1108,14 +1828,12 @@ | ||
1108 | "forever-agent": { | 1828 | "forever-agent": { |
1109 | "version": "0.6.1", | 1829 | "version": "0.6.1", |
1110 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", | 1830 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", |
1111 | - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", | ||
1112 | - "dev": true | 1831 | + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" |
1113 | }, | 1832 | }, |
1114 | "form-data": { | 1833 | "form-data": { |
1115 | "version": "2.3.3", | 1834 | "version": "2.3.3", |
1116 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", | 1835 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", |
1117 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", | 1836 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", |
1118 | - "dev": true, | ||
1119 | "requires": { | 1837 | "requires": { |
1120 | "asynckit": "^0.4.0", | 1838 | "asynckit": "^0.4.0", |
1121 | "combined-stream": "^1.0.6", | 1839 | "combined-stream": "^1.0.6", |
@@ -1226,12 +1944,14 @@ | @@ -1226,12 +1944,14 @@ | ||
1226 | "balanced-match": { | 1944 | "balanced-match": { |
1227 | "version": "1.0.0", | 1945 | "version": "1.0.0", |
1228 | "bundled": true, | 1946 | "bundled": true, |
1229 | - "dev": true | 1947 | + "dev": true, |
1948 | + "optional": true | ||
1230 | }, | 1949 | }, |
1231 | "brace-expansion": { | 1950 | "brace-expansion": { |
1232 | "version": "1.1.11", | 1951 | "version": "1.1.11", |
1233 | "bundled": true, | 1952 | "bundled": true, |
1234 | "dev": true, | 1953 | "dev": true, |
1954 | + "optional": true, | ||
1235 | "requires": { | 1955 | "requires": { |
1236 | "balanced-match": "^1.0.0", | 1956 | "balanced-match": "^1.0.0", |
1237 | "concat-map": "0.0.1" | 1957 | "concat-map": "0.0.1" |
@@ -1251,7 +1971,8 @@ | @@ -1251,7 +1971,8 @@ | ||
1251 | "concat-map": { | 1971 | "concat-map": { |
1252 | "version": "0.0.1", | 1972 | "version": "0.0.1", |
1253 | "bundled": true, | 1973 | "bundled": true, |
1254 | - "dev": true | 1974 | + "dev": true, |
1975 | + "optional": true | ||
1255 | }, | 1976 | }, |
1256 | "console-control-strings": { | 1977 | "console-control-strings": { |
1257 | "version": "1.1.0", | 1978 | "version": "1.1.0", |
@@ -1399,6 +2120,7 @@ | @@ -1399,6 +2120,7 @@ | ||
1399 | "version": "3.0.4", | 2120 | "version": "3.0.4", |
1400 | "bundled": true, | 2121 | "bundled": true, |
1401 | "dev": true, | 2122 | "dev": true, |
2123 | + "optional": true, | ||
1402 | "requires": { | 2124 | "requires": { |
1403 | "brace-expansion": "^1.1.7" | 2125 | "brace-expansion": "^1.1.7" |
1404 | } | 2126 | } |
@@ -1723,6 +2445,34 @@ | @@ -1723,6 +2445,34 @@ | ||
1723 | } | 2445 | } |
1724 | } | 2446 | } |
1725 | }, | 2447 | }, |
2448 | + "gaxios": { | ||
2449 | + "version": "2.3.4", | ||
2450 | + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", | ||
2451 | + "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", | ||
2452 | + "requires": { | ||
2453 | + "abort-controller": "^3.0.0", | ||
2454 | + "extend": "^3.0.2", | ||
2455 | + "https-proxy-agent": "^5.0.0", | ||
2456 | + "is-stream": "^2.0.0", | ||
2457 | + "node-fetch": "^2.3.0" | ||
2458 | + }, | ||
2459 | + "dependencies": { | ||
2460 | + "is-stream": { | ||
2461 | + "version": "2.0.0", | ||
2462 | + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", | ||
2463 | + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" | ||
2464 | + } | ||
2465 | + } | ||
2466 | + }, | ||
2467 | + "gcp-metadata": { | ||
2468 | + "version": "3.5.0", | ||
2469 | + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz", | ||
2470 | + "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==", | ||
2471 | + "requires": { | ||
2472 | + "gaxios": "^2.1.0", | ||
2473 | + "json-bigint": "^0.3.0" | ||
2474 | + } | ||
2475 | + }, | ||
1726 | "get-stream": { | 2476 | "get-stream": { |
1727 | "version": "3.0.0", | 2477 | "version": "3.0.0", |
1728 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", | 2478 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", |
@@ -1739,7 +2489,6 @@ | @@ -1739,7 +2489,6 @@ | ||
1739 | "version": "0.1.7", | 2489 | "version": "0.1.7", |
1740 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", | 2490 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", |
1741 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", | 2491 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", |
1742 | - "dev": true, | ||
1743 | "requires": { | 2492 | "requires": { |
1744 | "assert-plus": "^1.0.0" | 2493 | "assert-plus": "^1.0.0" |
1745 | } | 2494 | } |
@@ -1788,6 +2537,67 @@ | @@ -1788,6 +2537,67 @@ | ||
1788 | "slash": "^3.0.0" | 2537 | "slash": "^3.0.0" |
1789 | } | 2538 | } |
1790 | }, | 2539 | }, |
2540 | + "google-auth-library": { | ||
2541 | + "version": "5.10.1", | ||
2542 | + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz", | ||
2543 | + "integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==", | ||
2544 | + "requires": { | ||
2545 | + "arrify": "^2.0.0", | ||
2546 | + "base64-js": "^1.3.0", | ||
2547 | + "ecdsa-sig-formatter": "^1.0.11", | ||
2548 | + "fast-text-encoding": "^1.0.0", | ||
2549 | + "gaxios": "^2.1.0", | ||
2550 | + "gcp-metadata": "^3.4.0", | ||
2551 | + "gtoken": "^4.1.0", | ||
2552 | + "jws": "^4.0.0", | ||
2553 | + "lru-cache": "^5.0.0" | ||
2554 | + }, | ||
2555 | + "dependencies": { | ||
2556 | + "lru-cache": { | ||
2557 | + "version": "5.1.1", | ||
2558 | + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", | ||
2559 | + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", | ||
2560 | + "requires": { | ||
2561 | + "yallist": "^3.0.2" | ||
2562 | + } | ||
2563 | + }, | ||
2564 | + "yallist": { | ||
2565 | + "version": "3.1.1", | ||
2566 | + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", | ||
2567 | + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" | ||
2568 | + } | ||
2569 | + } | ||
2570 | + }, | ||
2571 | + "google-gax": { | ||
2572 | + "version": "1.15.3", | ||
2573 | + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-1.15.3.tgz", | ||
2574 | + "integrity": "sha512-3JKJCRumNm3x2EksUTw4P1Rad43FTpqrtW9jzpf3xSMYXx+ogaqTM1vGo7VixHB4xkAyATXVIa3OcNSh8H9zsQ==", | ||
2575 | + "requires": { | ||
2576 | + "@grpc/grpc-js": "~1.0.3", | ||
2577 | + "@grpc/proto-loader": "^0.5.1", | ||
2578 | + "@types/fs-extra": "^8.0.1", | ||
2579 | + "@types/long": "^4.0.0", | ||
2580 | + "abort-controller": "^3.0.0", | ||
2581 | + "duplexify": "^3.6.0", | ||
2582 | + "google-auth-library": "^5.0.0", | ||
2583 | + "is-stream-ended": "^0.1.4", | ||
2584 | + "lodash.at": "^4.6.0", | ||
2585 | + "lodash.has": "^4.5.2", | ||
2586 | + "node-fetch": "^2.6.0", | ||
2587 | + "protobufjs": "^6.8.9", | ||
2588 | + "retry-request": "^4.0.0", | ||
2589 | + "semver": "^6.0.0", | ||
2590 | + "walkdir": "^0.4.0" | ||
2591 | + } | ||
2592 | + }, | ||
2593 | + "google-p12-pem": { | ||
2594 | + "version": "2.0.4", | ||
2595 | + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz", | ||
2596 | + "integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==", | ||
2597 | + "requires": { | ||
2598 | + "node-forge": "^0.9.0" | ||
2599 | + } | ||
2600 | + }, | ||
1791 | "got": { | 2601 | "got": { |
1792 | "version": "6.7.1", | 2602 | "version": "6.7.1", |
1793 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", | 2603 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", |
@@ -1813,17 +2623,26 @@ | @@ -1813,17 +2623,26 @@ | ||
1813 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", | 2623 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", |
1814 | "dev": true | 2624 | "dev": true |
1815 | }, | 2625 | }, |
2626 | + "gtoken": { | ||
2627 | + "version": "4.1.4", | ||
2628 | + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz", | ||
2629 | + "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==", | ||
2630 | + "requires": { | ||
2631 | + "gaxios": "^2.1.0", | ||
2632 | + "google-p12-pem": "^2.0.0", | ||
2633 | + "jws": "^4.0.0", | ||
2634 | + "mime": "^2.2.0" | ||
2635 | + } | ||
2636 | + }, | ||
1816 | "har-schema": { | 2637 | "har-schema": { |
1817 | "version": "2.0.0", | 2638 | "version": "2.0.0", |
1818 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", | 2639 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", |
1819 | - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", | ||
1820 | - "dev": true | 2640 | + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" |
1821 | }, | 2641 | }, |
1822 | "har-validator": { | 2642 | "har-validator": { |
1823 | "version": "5.1.3", | 2643 | "version": "5.1.3", |
1824 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", | 2644 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", |
1825 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", | 2645 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", |
1826 | - "dev": true, | ||
1827 | "requires": { | 2646 | "requires": { |
1828 | "ajv": "^6.5.5", | 2647 | "ajv": "^6.5.5", |
1829 | "har-schema": "^2.0.0" | 2648 | "har-schema": "^2.0.0" |
@@ -1871,13 +2690,36 @@ | @@ -1871,13 +2690,36 @@ | ||
1871 | "version": "1.2.0", | 2690 | "version": "1.2.0", |
1872 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", | 2691 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", |
1873 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", | 2692 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", |
1874 | - "dev": true, | ||
1875 | "requires": { | 2693 | "requires": { |
1876 | "assert-plus": "^1.0.0", | 2694 | "assert-plus": "^1.0.0", |
1877 | "jsprim": "^1.2.2", | 2695 | "jsprim": "^1.2.2", |
1878 | "sshpk": "^1.7.0" | 2696 | "sshpk": "^1.7.0" |
1879 | } | 2697 | } |
1880 | }, | 2698 | }, |
2699 | + "https-proxy-agent": { | ||
2700 | + "version": "5.0.0", | ||
2701 | + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", | ||
2702 | + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", | ||
2703 | + "requires": { | ||
2704 | + "agent-base": "6", | ||
2705 | + "debug": "4" | ||
2706 | + }, | ||
2707 | + "dependencies": { | ||
2708 | + "debug": { | ||
2709 | + "version": "4.1.1", | ||
2710 | + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", | ||
2711 | + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", | ||
2712 | + "requires": { | ||
2713 | + "ms": "^2.1.1" | ||
2714 | + } | ||
2715 | + } | ||
2716 | + } | ||
2717 | + }, | ||
2718 | + "ieee754": { | ||
2719 | + "version": "1.1.13", | ||
2720 | + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", | ||
2721 | + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" | ||
2722 | + }, | ||
1881 | "ignore": { | 2723 | "ignore": { |
1882 | "version": "5.1.4", | 2724 | "version": "5.1.4", |
1883 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", | 2725 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", |
@@ -1923,6 +2765,11 @@ | @@ -1923,6 +2765,11 @@ | ||
1923 | "p-is-promise": "^3.0.0" | 2765 | "p-is-promise": "^3.0.0" |
1924 | } | 2766 | } |
1925 | }, | 2767 | }, |
2768 | + "ip-regex": { | ||
2769 | + "version": "2.1.0", | ||
2770 | + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", | ||
2771 | + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" | ||
2772 | + }, | ||
1926 | "is-accessor-descriptor": { | 2773 | "is-accessor-descriptor": { |
1927 | "version": "0.1.6", | 2774 | "version": "0.1.6", |
1928 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", | 2775 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", |
@@ -2115,11 +2962,15 @@ | @@ -2115,11 +2962,15 @@ | ||
2115 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", | 2962 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", |
2116 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" | 2963 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" |
2117 | }, | 2964 | }, |
2965 | + "is-stream-ended": { | ||
2966 | + "version": "0.1.4", | ||
2967 | + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", | ||
2968 | + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" | ||
2969 | + }, | ||
2118 | "is-typedarray": { | 2970 | "is-typedarray": { |
2119 | "version": "1.0.0", | 2971 | "version": "1.0.0", |
2120 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", | 2972 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", |
2121 | - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", | ||
2122 | - "dev": true | 2973 | + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" |
2123 | }, | 2974 | }, |
2124 | "is-windows": { | 2975 | "is-windows": { |
2125 | "version": "1.0.2", | 2976 | "version": "1.0.2", |
@@ -2135,8 +2986,7 @@ | @@ -2135,8 +2986,7 @@ | ||
2135 | "isexe": { | 2986 | "isexe": { |
2136 | "version": "2.0.0", | 2987 | "version": "2.0.0", |
2137 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", | 2988 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", |
2138 | - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", | ||
2139 | - "dev": true | 2989 | + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" |
2140 | }, | 2990 | }, |
2141 | "isobject": { | 2991 | "isobject": { |
2142 | "version": "3.0.1", | 2992 | "version": "3.0.1", |
@@ -2147,8 +2997,12 @@ | @@ -2147,8 +2997,12 @@ | ||
2147 | "isstream": { | 2997 | "isstream": { |
2148 | "version": "0.1.2", | 2998 | "version": "0.1.2", |
2149 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", | 2999 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", |
2150 | - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", | ||
2151 | - "dev": true | 3000 | + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" |
3001 | + }, | ||
3002 | + "jmespath": { | ||
3003 | + "version": "0.15.0", | ||
3004 | + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", | ||
3005 | + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" | ||
2152 | }, | 3006 | }, |
2153 | "js-yaml": { | 3007 | "js-yaml": { |
2154 | "version": "3.13.1", | 3008 | "version": "3.13.1", |
@@ -2162,26 +3016,30 @@ | @@ -2162,26 +3016,30 @@ | ||
2162 | "jsbn": { | 3016 | "jsbn": { |
2163 | "version": "0.1.1", | 3017 | "version": "0.1.1", |
2164 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", | 3018 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", |
2165 | - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", | ||
2166 | - "dev": true | 3019 | + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" |
3020 | + }, | ||
3021 | + "json-bigint": { | ||
3022 | + "version": "0.3.0", | ||
3023 | + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", | ||
3024 | + "integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=", | ||
3025 | + "requires": { | ||
3026 | + "bignumber.js": "^7.0.0" | ||
3027 | + } | ||
2167 | }, | 3028 | }, |
2168 | "json-schema": { | 3029 | "json-schema": { |
2169 | "version": "0.2.3", | 3030 | "version": "0.2.3", |
2170 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", | 3031 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", |
2171 | - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", | ||
2172 | - "dev": true | 3032 | + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" |
2173 | }, | 3033 | }, |
2174 | "json-schema-traverse": { | 3034 | "json-schema-traverse": { |
2175 | "version": "0.4.1", | 3035 | "version": "0.4.1", |
2176 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", | 3036 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", |
2177 | - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", | ||
2178 | - "dev": true | 3037 | + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" |
2179 | }, | 3038 | }, |
2180 | "json-stringify-safe": { | 3039 | "json-stringify-safe": { |
2181 | "version": "5.0.1", | 3040 | "version": "5.0.1", |
2182 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", | 3041 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", |
2183 | - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", | ||
2184 | - "dev": true | 3042 | + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" |
2185 | }, | 3043 | }, |
2186 | "json5": { | 3044 | "json5": { |
2187 | "version": "1.0.1", | 3045 | "version": "1.0.1", |
@@ -2204,7 +3062,6 @@ | @@ -2204,7 +3062,6 @@ | ||
2204 | "version": "1.4.1", | 3062 | "version": "1.4.1", |
2205 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", | 3063 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", |
2206 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", | 3064 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", |
2207 | - "dev": true, | ||
2208 | "requires": { | 3065 | "requires": { |
2209 | "assert-plus": "1.0.0", | 3066 | "assert-plus": "1.0.0", |
2210 | "extsprintf": "1.3.0", | 3067 | "extsprintf": "1.3.0", |
@@ -2212,6 +3069,30 @@ | @@ -2212,6 +3069,30 @@ | ||
2212 | "verror": "1.10.0" | 3069 | "verror": "1.10.0" |
2213 | } | 3070 | } |
2214 | }, | 3071 | }, |
3072 | + "jssha": { | ||
3073 | + "version": "2.4.2", | ||
3074 | + "resolved": "https://registry.npmjs.org/jssha/-/jssha-2.4.2.tgz", | ||
3075 | + "integrity": "sha512-/jsi/9C0S70zfkT/4UlKQa5E1xKurDnXcQizcww9JSR/Fv+uIbWM2btG+bFcL3iNoK9jIGS0ls9HWLr1iw0kFg==" | ||
3076 | + }, | ||
3077 | + "jwa": { | ||
3078 | + "version": "2.0.0", | ||
3079 | + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", | ||
3080 | + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", | ||
3081 | + "requires": { | ||
3082 | + "buffer-equal-constant-time": "1.0.1", | ||
3083 | + "ecdsa-sig-formatter": "1.0.11", | ||
3084 | + "safe-buffer": "^5.0.1" | ||
3085 | + } | ||
3086 | + }, | ||
3087 | + "jws": { | ||
3088 | + "version": "4.0.0", | ||
3089 | + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", | ||
3090 | + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", | ||
3091 | + "requires": { | ||
3092 | + "jwa": "^2.0.0", | ||
3093 | + "safe-buffer": "^5.0.1" | ||
3094 | + } | ||
3095 | + }, | ||
2215 | "kafkajs": { | 3096 | "kafkajs": { |
2216 | "version": "1.12.0", | 3097 | "version": "1.12.0", |
2217 | "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-1.12.0.tgz", | 3098 | "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-1.12.0.tgz", |
@@ -2258,6 +3139,26 @@ | @@ -2258,6 +3139,26 @@ | ||
2258 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", | 3139 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", |
2259 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" | 3140 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" |
2260 | }, | 3141 | }, |
3142 | + "lodash.at": { | ||
3143 | + "version": "4.6.0", | ||
3144 | + "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", | ||
3145 | + "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=" | ||
3146 | + }, | ||
3147 | + "lodash.camelcase": { | ||
3148 | + "version": "4.3.0", | ||
3149 | + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", | ||
3150 | + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" | ||
3151 | + }, | ||
3152 | + "lodash.has": { | ||
3153 | + "version": "4.5.2", | ||
3154 | + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", | ||
3155 | + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=" | ||
3156 | + }, | ||
3157 | + "lodash.snakecase": { | ||
3158 | + "version": "4.1.1", | ||
3159 | + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", | ||
3160 | + "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" | ||
3161 | + }, | ||
2261 | "logform": { | 3162 | "logform": { |
2262 | "version": "2.1.2", | 3163 | "version": "2.1.2", |
2263 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", | 3164 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", |
@@ -2342,17 +3243,20 @@ | @@ -2342,17 +3243,20 @@ | ||
2342 | "to-regex": "^3.0.2" | 3243 | "to-regex": "^3.0.2" |
2343 | } | 3244 | } |
2344 | }, | 3245 | }, |
3246 | + "mime": { | ||
3247 | + "version": "2.4.5", | ||
3248 | + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", | ||
3249 | + "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==" | ||
3250 | + }, | ||
2345 | "mime-db": { | 3251 | "mime-db": { |
2346 | "version": "1.43.0", | 3252 | "version": "1.43.0", |
2347 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", | 3253 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", |
2348 | - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", | ||
2349 | - "dev": true | 3254 | + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" |
2350 | }, | 3255 | }, |
2351 | "mime-types": { | 3256 | "mime-types": { |
2352 | "version": "2.1.26", | 3257 | "version": "2.1.26", |
2353 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", | 3258 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", |
2354 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", | 3259 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", |
2355 | - "dev": true, | ||
2356 | "requires": { | 3260 | "requires": { |
2357 | "mime-db": "1.43.0" | 3261 | "mime-db": "1.43.0" |
2358 | } | 3262 | } |
@@ -2414,6 +3318,11 @@ | @@ -2414,6 +3318,11 @@ | ||
2414 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", | 3318 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", |
2415 | "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" | 3319 | "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" |
2416 | }, | 3320 | }, |
3321 | + "mpns": { | ||
3322 | + "version": "2.1.3", | ||
3323 | + "resolved": "https://registry.npmjs.org/mpns/-/mpns-2.1.3.tgz", | ||
3324 | + "integrity": "sha512-gPLNoVqwYoKUmNYZ2shMSdaE2XvHSRxWNzyG4DUi6Av7MSujyeOw/nj61nnQeuV/vke5E0Dni468xn0qxTHIZQ==" | ||
3325 | + }, | ||
2417 | "ms": { | 3326 | "ms": { |
2418 | "version": "2.1.2", | 3327 | "version": "2.1.2", |
2419 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", | 3328 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", |
@@ -2487,6 +3396,16 @@ | @@ -2487,6 +3396,16 @@ | ||
2487 | "to-regex": "^3.0.1" | 3396 | "to-regex": "^3.0.1" |
2488 | } | 3397 | } |
2489 | }, | 3398 | }, |
3399 | + "node-fetch": { | ||
3400 | + "version": "2.6.0", | ||
3401 | + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", | ||
3402 | + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" | ||
3403 | + }, | ||
3404 | + "node-forge": { | ||
3405 | + "version": "0.9.1", | ||
3406 | + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", | ||
3407 | + "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==" | ||
3408 | + }, | ||
2490 | "nodemon": { | 3409 | "nodemon": { |
2491 | "version": "1.19.4", | 3410 | "version": "1.19.4", |
2492 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", | 3411 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", |
@@ -2540,8 +3459,7 @@ | @@ -2540,8 +3459,7 @@ | ||
2540 | "oauth-sign": { | 3459 | "oauth-sign": { |
2541 | "version": "0.9.0", | 3460 | "version": "0.9.0", |
2542 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", | 3461 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", |
2543 | - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", | ||
2544 | - "dev": true | 3462 | + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" |
2545 | }, | 3463 | }, |
2546 | "object-copy": { | 3464 | "object-copy": { |
2547 | "version": "0.1.0", | 3465 | "version": "0.1.0", |
@@ -2597,6 +3515,14 @@ | @@ -2597,6 +3515,14 @@ | ||
2597 | "isobject": "^3.0.1" | 3515 | "isobject": "^3.0.1" |
2598 | } | 3516 | } |
2599 | }, | 3517 | }, |
3518 | + "once": { | ||
3519 | + "version": "1.4.0", | ||
3520 | + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | ||
3521 | + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | ||
3522 | + "requires": { | ||
3523 | + "wrappy": "1" | ||
3524 | + } | ||
3525 | + }, | ||
2600 | "one-time": { | 3526 | "one-time": { |
2601 | "version": "0.0.4", | 3527 | "version": "0.0.4", |
2602 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", | 3528 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", |
@@ -2622,6 +3548,11 @@ | @@ -2622,6 +3548,11 @@ | ||
2622 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", | 3548 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", |
2623 | "dev": true | 3549 | "dev": true |
2624 | }, | 3550 | }, |
3551 | + "p-defer": { | ||
3552 | + "version": "3.0.0", | ||
3553 | + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", | ||
3554 | + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" | ||
3555 | + }, | ||
2625 | "p-finally": { | 3556 | "p-finally": { |
2626 | "version": "1.0.0", | 3557 | "version": "1.0.0", |
2627 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", | 3558 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", |
@@ -2699,8 +3630,7 @@ | @@ -2699,8 +3630,7 @@ | ||
2699 | "performance-now": { | 3630 | "performance-now": { |
2700 | "version": "2.1.0", | 3631 | "version": "2.1.0", |
2701 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", | 3632 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", |
2702 | - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", | ||
2703 | - "dev": true | 3633 | + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" |
2704 | }, | 3634 | }, |
2705 | "picomatch": { | 3635 | "picomatch": { |
2706 | "version": "2.2.1", | 3636 | "version": "2.2.1", |
@@ -2898,6 +3828,11 @@ | @@ -2898,6 +3828,11 @@ | ||
2898 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", | 3828 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", |
2899 | "dev": true | 3829 | "dev": true |
2900 | }, | 3830 | }, |
3831 | + "process": { | ||
3832 | + "version": "0.11.10", | ||
3833 | + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", | ||
3834 | + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" | ||
3835 | + }, | ||
2901 | "process-nextick-args": { | 3836 | "process-nextick-args": { |
2902 | "version": "2.0.1", | 3837 | "version": "2.0.1", |
2903 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", | 3838 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", |
@@ -2909,6 +3844,26 @@ | @@ -2909,6 +3844,26 @@ | ||
2909 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", | 3844 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", |
2910 | "dev": true | 3845 | "dev": true |
2911 | }, | 3846 | }, |
3847 | + "protobufjs": { | ||
3848 | + "version": "6.9.0", | ||
3849 | + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.9.0.tgz", | ||
3850 | + "integrity": "sha512-LlGVfEWDXoI/STstRDdZZKb/qusoAWUnmLg9R8OLSO473mBLWHowx8clbX5/+mKDEI+v7GzjoK9tRPZMMcoTrg==", | ||
3851 | + "requires": { | ||
3852 | + "@protobufjs/aspromise": "^1.1.2", | ||
3853 | + "@protobufjs/base64": "^1.1.2", | ||
3854 | + "@protobufjs/codegen": "^2.0.4", | ||
3855 | + "@protobufjs/eventemitter": "^1.1.0", | ||
3856 | + "@protobufjs/fetch": "^1.1.0", | ||
3857 | + "@protobufjs/float": "^1.0.2", | ||
3858 | + "@protobufjs/inquire": "^1.1.0", | ||
3859 | + "@protobufjs/path": "^1.1.2", | ||
3860 | + "@protobufjs/pool": "^1.1.0", | ||
3861 | + "@protobufjs/utf8": "^1.1.0", | ||
3862 | + "@types/long": "^4.0.1", | ||
3863 | + "@types/node": "^13.7.0", | ||
3864 | + "long": "^4.0.0" | ||
3865 | + } | ||
3866 | + }, | ||
2912 | "pseudomap": { | 3867 | "pseudomap": { |
2913 | "version": "1.0.2", | 3868 | "version": "1.0.2", |
2914 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", | 3869 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", |
@@ -2918,8 +3873,7 @@ | @@ -2918,8 +3873,7 @@ | ||
2918 | "psl": { | 3873 | "psl": { |
2919 | "version": "1.7.0", | 3874 | "version": "1.7.0", |
2920 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", | 3875 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", |
2921 | - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", | ||
2922 | - "dev": true | 3876 | + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" |
2923 | }, | 3877 | }, |
2924 | "pstree.remy": { | 3878 | "pstree.remy": { |
2925 | "version": "1.1.7", | 3879 | "version": "1.1.7", |
@@ -2930,14 +3884,22 @@ | @@ -2930,14 +3884,22 @@ | ||
2930 | "punycode": { | 3884 | "punycode": { |
2931 | "version": "2.1.1", | 3885 | "version": "2.1.1", |
2932 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", | 3886 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", |
2933 | - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", | ||
2934 | - "dev": true | 3887 | + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" |
2935 | }, | 3888 | }, |
2936 | "qs": { | 3889 | "qs": { |
2937 | "version": "6.5.2", | 3890 | "version": "6.5.2", |
2938 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", | 3891 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", |
2939 | - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", | ||
2940 | - "dev": true | 3892 | + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" |
3893 | + }, | ||
3894 | + "querystring": { | ||
3895 | + "version": "0.2.0", | ||
3896 | + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", | ||
3897 | + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" | ||
3898 | + }, | ||
3899 | + "querystringify": { | ||
3900 | + "version": "2.1.1", | ||
3901 | + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", | ||
3902 | + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" | ||
2941 | }, | 3903 | }, |
2942 | "rc": { | 3904 | "rc": { |
2943 | "version": "1.2.8", | 3905 | "version": "1.2.8", |
@@ -3061,7 +4023,6 @@ | @@ -3061,7 +4023,6 @@ | ||
3061 | "version": "2.88.2", | 4023 | "version": "2.88.2", |
3062 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", | 4024 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", |
3063 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", | 4025 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", |
3064 | - "dev": true, | ||
3065 | "requires": { | 4026 | "requires": { |
3066 | "aws-sign2": "~0.7.0", | 4027 | "aws-sign2": "~0.7.0", |
3067 | "aws4": "^1.8.0", | 4028 | "aws4": "^1.8.0", |
@@ -3094,6 +4055,11 @@ | @@ -3094,6 +4055,11 @@ | ||
3094 | "throttleit": "^1.0.0" | 4055 | "throttleit": "^1.0.0" |
3095 | } | 4056 | } |
3096 | }, | 4057 | }, |
4058 | + "requires-port": { | ||
4059 | + "version": "1.0.0", | ||
4060 | + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", | ||
4061 | + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" | ||
4062 | + }, | ||
3097 | "resolve": { | 4063 | "resolve": { |
3098 | "version": "1.15.1", | 4064 | "version": "1.15.1", |
3099 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", | 4065 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", |
@@ -3115,12 +4081,49 @@ | @@ -3115,12 +4081,49 @@ | ||
3115 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", | 4081 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", |
3116 | "dev": true | 4082 | "dev": true |
3117 | }, | 4083 | }, |
4084 | + "retry-request": { | ||
4085 | + "version": "4.1.1", | ||
4086 | + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz", | ||
4087 | + "integrity": "sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ==", | ||
4088 | + "requires": { | ||
4089 | + "debug": "^4.1.1", | ||
4090 | + "through2": "^3.0.1" | ||
4091 | + }, | ||
4092 | + "dependencies": { | ||
4093 | + "debug": { | ||
4094 | + "version": "4.1.1", | ||
4095 | + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", | ||
4096 | + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", | ||
4097 | + "requires": { | ||
4098 | + "ms": "^2.1.1" | ||
4099 | + } | ||
4100 | + } | ||
4101 | + } | ||
4102 | + }, | ||
3118 | "reusify": { | 4103 | "reusify": { |
3119 | "version": "1.0.4", | 4104 | "version": "1.0.4", |
3120 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", | 4105 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", |
3121 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", | 4106 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", |
3122 | "dev": true | 4107 | "dev": true |
3123 | }, | 4108 | }, |
4109 | + "rhea": { | ||
4110 | + "version": "1.0.20", | ||
4111 | + "resolved": "https://registry.npmjs.org/rhea/-/rhea-1.0.20.tgz", | ||
4112 | + "integrity": "sha512-qj4LSEykJ0SEYESQLg9Vee6VXH5xHN1pYj7ozPeUk+l+S1OaGKx1FugAu+g+3pPwK46WXV1PJD9XiRx8+tS4cw==", | ||
4113 | + "requires": { | ||
4114 | + "debug": "0.8.0 - 3.5.0" | ||
4115 | + } | ||
4116 | + }, | ||
4117 | + "rhea-promise": { | ||
4118 | + "version": "0.1.15", | ||
4119 | + "resolved": "https://registry.npmjs.org/rhea-promise/-/rhea-promise-0.1.15.tgz", | ||
4120 | + "integrity": "sha512-+6uilZXSJGyiqVeHQI3Krv6NTAd8cWRCY2uyCxmzR4/5IFtBqqFem1HV2OiwSj0Gu7OFChIJDfH2JyjN7J0vRA==", | ||
4121 | + "requires": { | ||
4122 | + "debug": "^3.1.0", | ||
4123 | + "rhea": "^1.0.4", | ||
4124 | + "tslib": "^1.9.3" | ||
4125 | + } | ||
4126 | + }, | ||
3124 | "run-parallel": { | 4127 | "run-parallel": { |
3125 | "version": "1.1.9", | 4128 | "version": "1.1.9", |
3126 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", | 4129 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", |
@@ -3144,8 +4147,12 @@ | @@ -3144,8 +4147,12 @@ | ||
3144 | "safer-buffer": { | 4147 | "safer-buffer": { |
3145 | "version": "2.1.2", | 4148 | "version": "2.1.2", |
3146 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", | 4149 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", |
3147 | - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", | ||
3148 | - "dev": true | 4150 | + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" |
4151 | + }, | ||
4152 | + "sax": { | ||
4153 | + "version": "1.2.4", | ||
4154 | + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", | ||
4155 | + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" | ||
3149 | }, | 4156 | }, |
3150 | "semver": { | 4157 | "semver": { |
3151 | "version": "6.3.0", | 4158 | "version": "6.3.0", |
@@ -3392,7 +4399,6 @@ | @@ -3392,7 +4399,6 @@ | ||
3392 | "version": "1.16.1", | 4399 | "version": "1.16.1", |
3393 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", | 4400 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", |
3394 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", | 4401 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", |
3395 | - "dev": true, | ||
3396 | "requires": { | 4402 | "requires": { |
3397 | "asn1": "~0.2.3", | 4403 | "asn1": "~0.2.3", |
3398 | "assert-plus": "^1.0.0", | 4404 | "assert-plus": "^1.0.0", |
@@ -3431,6 +4437,44 @@ | @@ -3431,6 +4437,44 @@ | ||
3431 | } | 4437 | } |
3432 | } | 4438 | } |
3433 | }, | 4439 | }, |
4440 | + "stream-browserify": { | ||
4441 | + "version": "2.0.2", | ||
4442 | + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", | ||
4443 | + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", | ||
4444 | + "requires": { | ||
4445 | + "inherits": "~2.0.1", | ||
4446 | + "readable-stream": "^2.0.2" | ||
4447 | + }, | ||
4448 | + "dependencies": { | ||
4449 | + "readable-stream": { | ||
4450 | + "version": "2.3.7", | ||
4451 | + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", | ||
4452 | + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", | ||
4453 | + "requires": { | ||
4454 | + "core-util-is": "~1.0.0", | ||
4455 | + "inherits": "~2.0.3", | ||
4456 | + "isarray": "~1.0.0", | ||
4457 | + "process-nextick-args": "~2.0.0", | ||
4458 | + "safe-buffer": "~5.1.1", | ||
4459 | + "string_decoder": "~1.1.1", | ||
4460 | + "util-deprecate": "~1.0.1" | ||
4461 | + } | ||
4462 | + }, | ||
4463 | + "safe-buffer": { | ||
4464 | + "version": "5.1.2", | ||
4465 | + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | ||
4466 | + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | ||
4467 | + }, | ||
4468 | + "string_decoder": { | ||
4469 | + "version": "1.1.1", | ||
4470 | + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", | ||
4471 | + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", | ||
4472 | + "requires": { | ||
4473 | + "safe-buffer": "~5.1.0" | ||
4474 | + } | ||
4475 | + } | ||
4476 | + } | ||
4477 | + }, | ||
3434 | "stream-meter": { | 4478 | "stream-meter": { |
3435 | "version": "1.0.4", | 4479 | "version": "1.0.4", |
3436 | "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", | 4480 | "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", |
@@ -3472,6 +4516,11 @@ | @@ -3472,6 +4516,11 @@ | ||
3472 | } | 4516 | } |
3473 | } | 4517 | } |
3474 | }, | 4518 | }, |
4519 | + "stream-shift": { | ||
4520 | + "version": "1.0.1", | ||
4521 | + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", | ||
4522 | + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" | ||
4523 | + }, | ||
3475 | "string-width": { | 4524 | "string-width": { |
3476 | "version": "2.1.1", | 4525 | "version": "2.1.1", |
3477 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", | 4526 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", |
@@ -3540,6 +4589,19 @@ | @@ -3540,6 +4589,19 @@ | ||
3540 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", | 4589 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", |
3541 | "dev": true | 4590 | "dev": true |
3542 | }, | 4591 | }, |
4592 | + "through": { | ||
4593 | + "version": "2.3.8", | ||
4594 | + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", | ||
4595 | + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" | ||
4596 | + }, | ||
4597 | + "through2": { | ||
4598 | + "version": "3.0.1", | ||
4599 | + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", | ||
4600 | + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", | ||
4601 | + "requires": { | ||
4602 | + "readable-stream": "2 || 3" | ||
4603 | + } | ||
4604 | + }, | ||
3543 | "timed-out": { | 4605 | "timed-out": { |
3544 | "version": "4.0.1", | 4606 | "version": "4.0.1", |
3545 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", | 4607 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", |
@@ -3601,7 +4663,6 @@ | @@ -3601,7 +4663,6 @@ | ||
3601 | "version": "2.5.0", | 4663 | "version": "2.5.0", |
3602 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", | 4664 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", |
3603 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", | 4665 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", |
3604 | - "dev": true, | ||
3605 | "requires": { | 4666 | "requires": { |
3606 | "psl": "^1.1.28", | 4667 | "psl": "^1.1.28", |
3607 | "punycode": "^2.1.1" | 4668 | "punycode": "^2.1.1" |
@@ -3612,11 +4673,20 @@ | @@ -3612,11 +4673,20 @@ | ||
3612 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", | 4673 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", |
3613 | "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" | 4674 | "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" |
3614 | }, | 4675 | }, |
4676 | + "tslib": { | ||
4677 | + "version": "1.11.1", | ||
4678 | + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", | ||
4679 | + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" | ||
4680 | + }, | ||
4681 | + "tunnel": { | ||
4682 | + "version": "0.0.6", | ||
4683 | + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", | ||
4684 | + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" | ||
4685 | + }, | ||
3615 | "tunnel-agent": { | 4686 | "tunnel-agent": { |
3616 | "version": "0.6.0", | 4687 | "version": "0.6.0", |
3617 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", | 4688 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", |
3618 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", | 4689 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", |
3619 | - "dev": true, | ||
3620 | "requires": { | 4690 | "requires": { |
3621 | "safe-buffer": "^5.0.1" | 4691 | "safe-buffer": "^5.0.1" |
3622 | } | 4692 | } |
@@ -3624,8 +4694,7 @@ | @@ -3624,8 +4694,7 @@ | ||
3624 | "tweetnacl": { | 4694 | "tweetnacl": { |
3625 | "version": "0.14.5", | 4695 | "version": "0.14.5", |
3626 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", | 4696 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", |
3627 | - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", | ||
3628 | - "dev": true | 4697 | + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" |
3629 | }, | 4698 | }, |
3630 | "type-check": { | 4699 | "type-check": { |
3631 | "version": "0.3.2", | 4700 | "version": "0.3.2", |
@@ -3668,6 +4737,11 @@ | @@ -3668,6 +4737,11 @@ | ||
3668 | } | 4737 | } |
3669 | } | 4738 | } |
3670 | }, | 4739 | }, |
4740 | + "underscore": { | ||
4741 | + "version": "1.10.2", | ||
4742 | + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", | ||
4743 | + "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==" | ||
4744 | + }, | ||
3671 | "union-value": { | 4745 | "union-value": { |
3672 | "version": "1.0.1", | 4746 | "version": "1.0.1", |
3673 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", | 4747 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", |
@@ -3780,7 +4854,6 @@ | @@ -3780,7 +4854,6 @@ | ||
3780 | "version": "4.2.2", | 4854 | "version": "4.2.2", |
3781 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", | 4855 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", |
3782 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", | 4856 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", |
3783 | - "dev": true, | ||
3784 | "requires": { | 4857 | "requires": { |
3785 | "punycode": "^2.1.0" | 4858 | "punycode": "^2.1.0" |
3786 | } | 4859 | } |
@@ -3791,6 +4864,31 @@ | @@ -3791,6 +4864,31 @@ | ||
3791 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", | 4864 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", |
3792 | "dev": true | 4865 | "dev": true |
3793 | }, | 4866 | }, |
4867 | + "url": { | ||
4868 | + "version": "0.11.0", | ||
4869 | + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", | ||
4870 | + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", | ||
4871 | + "requires": { | ||
4872 | + "punycode": "1.3.2", | ||
4873 | + "querystring": "0.2.0" | ||
4874 | + }, | ||
4875 | + "dependencies": { | ||
4876 | + "punycode": { | ||
4877 | + "version": "1.3.2", | ||
4878 | + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", | ||
4879 | + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" | ||
4880 | + } | ||
4881 | + } | ||
4882 | + }, | ||
4883 | + "url-parse": { | ||
4884 | + "version": "1.4.7", | ||
4885 | + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", | ||
4886 | + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", | ||
4887 | + "requires": { | ||
4888 | + "querystringify": "^2.1.1", | ||
4889 | + "requires-port": "^1.0.0" | ||
4890 | + } | ||
4891 | + }, | ||
3794 | "url-parse-lax": { | 4892 | "url-parse-lax": { |
3795 | "version": "1.0.0", | 4893 | "version": "1.0.0", |
3796 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", | 4894 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", |
@@ -3806,6 +4904,21 @@ | @@ -3806,6 +4904,21 @@ | ||
3806 | "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", | 4904 | "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", |
3807 | "dev": true | 4905 | "dev": true |
3808 | }, | 4906 | }, |
4907 | + "util": { | ||
4908 | + "version": "0.11.1", | ||
4909 | + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", | ||
4910 | + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", | ||
4911 | + "requires": { | ||
4912 | + "inherits": "2.0.3" | ||
4913 | + }, | ||
4914 | + "dependencies": { | ||
4915 | + "inherits": { | ||
4916 | + "version": "2.0.3", | ||
4917 | + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", | ||
4918 | + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" | ||
4919 | + } | ||
4920 | + } | ||
4921 | + }, | ||
3809 | "util-deprecate": { | 4922 | "util-deprecate": { |
3810 | "version": "1.0.2", | 4923 | "version": "1.0.2", |
3811 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", | 4924 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", |
@@ -3814,25 +4927,38 @@ | @@ -3814,25 +4927,38 @@ | ||
3814 | "uuid": { | 4927 | "uuid": { |
3815 | "version": "3.4.0", | 4928 | "version": "3.4.0", |
3816 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", | 4929 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", |
3817 | - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", | ||
3818 | - "dev": true | 4930 | + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" |
3819 | }, | 4931 | }, |
3820 | "uuid-parse": { | 4932 | "uuid-parse": { |
3821 | "version": "1.1.0", | 4933 | "version": "1.1.0", |
3822 | "resolved": "https://registry.npmjs.org/uuid-parse/-/uuid-parse-1.1.0.tgz", | 4934 | "resolved": "https://registry.npmjs.org/uuid-parse/-/uuid-parse-1.1.0.tgz", |
3823 | "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==" | 4935 | "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==" |
3824 | }, | 4936 | }, |
4937 | + "uuid-random": { | ||
4938 | + "version": "1.3.0", | ||
4939 | + "resolved": "https://registry.npmjs.org/uuid-random/-/uuid-random-1.3.0.tgz", | ||
4940 | + "integrity": "sha512-FSIlv8RFRPOjcHeDYStV7u6aJRfp+THrcWkbAJpw51JCyQLDxsFz+4dHgTYP8hSpZeSMXBpb/1qrK4bodXpSRA==" | ||
4941 | + }, | ||
4942 | + "validator": { | ||
4943 | + "version": "9.4.1", | ||
4944 | + "resolved": "https://registry.npmjs.org/validator/-/validator-9.4.1.tgz", | ||
4945 | + "integrity": "sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA==" | ||
4946 | + }, | ||
3825 | "verror": { | 4947 | "verror": { |
3826 | "version": "1.10.0", | 4948 | "version": "1.10.0", |
3827 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", | 4949 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", |
3828 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", | 4950 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", |
3829 | - "dev": true, | ||
3830 | "requires": { | 4951 | "requires": { |
3831 | "assert-plus": "^1.0.0", | 4952 | "assert-plus": "^1.0.0", |
3832 | "core-util-is": "1.0.2", | 4953 | "core-util-is": "1.0.2", |
3833 | "extsprintf": "^1.2.0" | 4954 | "extsprintf": "^1.2.0" |
3834 | } | 4955 | } |
3835 | }, | 4956 | }, |
4957 | + "walkdir": { | ||
4958 | + "version": "0.4.1", | ||
4959 | + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", | ||
4960 | + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==" | ||
4961 | + }, | ||
3836 | "which": { | 4962 | "which": { |
3837 | "version": "1.3.1", | 4963 | "version": "1.3.1", |
3838 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", | 4964 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", |
@@ -3942,12 +5068,22 @@ | @@ -3942,12 +5068,22 @@ | ||
3942 | } | 5068 | } |
3943 | } | 5069 | } |
3944 | }, | 5070 | }, |
5071 | + "wns": { | ||
5072 | + "version": "0.5.4", | ||
5073 | + "resolved": "https://registry.npmjs.org/wns/-/wns-0.5.4.tgz", | ||
5074 | + "integrity": "sha512-WYiJ7khIwUGBD5KAm+YYmwJDDRzFRs4YGAjtbFSoRIdbn9Jcix3p9khJmpvBTXGommaKkvduAn+pc9l4d9yzVQ==" | ||
5075 | + }, | ||
3945 | "word-wrap": { | 5076 | "word-wrap": { |
3946 | "version": "1.2.3", | 5077 | "version": "1.2.3", |
3947 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", | 5078 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", |
3948 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", | 5079 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", |
3949 | "dev": true | 5080 | "dev": true |
3950 | }, | 5081 | }, |
5082 | + "wrappy": { | ||
5083 | + "version": "1.0.2", | ||
5084 | + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", | ||
5085 | + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" | ||
5086 | + }, | ||
3951 | "write-file-atomic": { | 5087 | "write-file-atomic": { |
3952 | "version": "2.4.3", | 5088 | "version": "2.4.3", |
3953 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", | 5089 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", |
@@ -3965,6 +5101,20 @@ | @@ -3965,6 +5101,20 @@ | ||
3965 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", | 5101 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", |
3966 | "dev": true | 5102 | "dev": true |
3967 | }, | 5103 | }, |
5104 | + "xml2js": { | ||
5105 | + "version": "0.4.23", | ||
5106 | + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", | ||
5107 | + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", | ||
5108 | + "requires": { | ||
5109 | + "sax": ">=0.6.0", | ||
5110 | + "xmlbuilder": "~11.0.0" | ||
5111 | + } | ||
5112 | + }, | ||
5113 | + "xmlbuilder": { | ||
5114 | + "version": "11.0.1", | ||
5115 | + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", | ||
5116 | + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" | ||
5117 | + }, | ||
3968 | "yallist": { | 5118 | "yallist": { |
3969 | "version": "2.1.2", | 5119 | "version": "2.1.2", |
3970 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", | 5120 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", |
@@ -22,6 +22,7 @@ | @@ -22,6 +22,7 @@ | ||
22 | "azure-sb": "^0.11.1", | 22 | "azure-sb": "^0.11.1", |
23 | "long": "^4.0.0", | 23 | "long": "^4.0.0", |
24 | "uuid-parse": "^1.0.0", | 24 | "uuid-parse": "^1.0.0", |
25 | + "uuid-random": "^1.3.0", | ||
25 | "winston": "^3.0.0", | 26 | "winston": "^3.0.0", |
26 | "winston-daily-rotate-file": "^3.2.1" | 27 | "winston-daily-rotate-file": "^3.2.1" |
27 | }, | 28 | }, |
@@ -19,6 +19,7 @@ | @@ -19,6 +19,7 @@ | ||
19 | const config = require('config'), | 19 | const config = require('config'), |
20 | JsInvokeMessageProcessor = require('../api/jsInvokeMessageProcessor'), | 20 | JsInvokeMessageProcessor = require('../api/jsInvokeMessageProcessor'), |
21 | logger = require('../config/logger')._logger('awsSqsTemplate'); | 21 | logger = require('../config/logger')._logger('awsSqsTemplate'); |
22 | +const uuid = require('uuid-random'); | ||
22 | 23 | ||
23 | const requestTopic = config.get('request_topic'); | 24 | const requestTopic = config.get('request_topic'); |
24 | 25 | ||
@@ -26,10 +27,10 @@ const accessKeyId = config.get('aws_sqs.access_key_id'); | @@ -26,10 +27,10 @@ const accessKeyId = config.get('aws_sqs.access_key_id'); | ||
26 | const secretAccessKey = config.get('aws_sqs.secret_access_key'); | 27 | const secretAccessKey = config.get('aws_sqs.secret_access_key'); |
27 | const region = config.get('aws_sqs.region'); | 28 | const region = config.get('aws_sqs.region'); |
28 | const AWS = require('aws-sdk'); | 29 | const AWS = require('aws-sdk'); |
29 | -const queueProperties = config.get('aws_sqs.queue-properties'); | ||
30 | -const poolInterval = config.get('js.response_poll_interval'); | 30 | +const queueProperties = config.get('aws_sqs.queue_properties'); |
31 | +const pollInterval = config.get('js.response_poll_interval'); | ||
31 | 32 | ||
32 | -let queueAttributes = {FifoQueue: 'true', ContentBasedDeduplication: 'true'}; | 33 | +let queueAttributes = {FifoQueue: 'true'}; |
33 | let sqsClient; | 34 | let sqsClient; |
34 | let requestQueueURL; | 35 | let requestQueueURL; |
35 | const queueUrls = new Map(); | 36 | const queueUrls = new Map(); |
@@ -51,7 +52,12 @@ function AwsSqsProducer() { | @@ -51,7 +52,12 @@ function AwsSqsProducer() { | ||
51 | queueUrls.set(responseTopic, responseQueueUrl); | 52 | queueUrls.set(responseTopic, responseQueueUrl); |
52 | } | 53 | } |
53 | 54 | ||
54 | - let params = {MessageBody: msgBody, QueueUrl: responseQueueUrl, MessageGroupId: scriptId}; | 55 | + let params = { |
56 | + MessageBody: msgBody, | ||
57 | + QueueUrl: responseQueueUrl, | ||
58 | + MessageGroupId: 'js_eval', | ||
59 | + MessageDeduplicationId: uuid() | ||
60 | + }; | ||
55 | 61 | ||
56 | return new Promise((resolve, reject) => { | 62 | return new Promise((resolve, reject) => { |
57 | sqsClient.sendMessage(params, function (err, data) { | 63 | sqsClient.sendMessage(params, function (err, data) { |
@@ -74,11 +80,13 @@ function AwsSqsProducer() { | @@ -74,11 +80,13 @@ function AwsSqsProducer() { | ||
74 | 80 | ||
75 | const queues = await getQueues(); | 81 | const queues = await getQueues(); |
76 | 82 | ||
77 | - queues.forEach(queueUrl => { | ||
78 | - const delimiterPosition = queueUrl.lastIndexOf('/'); | ||
79 | - const queueName = queueUrl.substring(delimiterPosition + 1); | ||
80 | - queueUrls.set(queueName, queueUrl); | ||
81 | - }) | 83 | + if (queues) { |
84 | + queues.forEach(queueUrl => { | ||
85 | + const delimiterPosition = queueUrl.lastIndexOf('/'); | ||
86 | + const queueName = queueUrl.substring(delimiterPosition + 1); | ||
87 | + queueUrls.set(queueName, queueUrl); | ||
88 | + }); | ||
89 | + } | ||
82 | 90 | ||
83 | parseQueueProperties(); | 91 | parseQueueProperties(); |
84 | 92 | ||
@@ -95,6 +103,7 @@ function AwsSqsProducer() { | @@ -95,6 +103,7 @@ function AwsSqsProducer() { | ||
95 | WaitTimeSeconds: poolInterval / 1000 | 103 | WaitTimeSeconds: poolInterval / 1000 |
96 | }; | 104 | }; |
97 | while (!stopped) { | 105 | while (!stopped) { |
106 | + let pollStartTs = new Date().getTime(); | ||
98 | const messages = await new Promise((resolve, reject) => { | 107 | const messages = await new Promise((resolve, reject) => { |
99 | sqsClient.receiveMessage(params, function (err, data) { | 108 | sqsClient.receiveMessage(params, function (err, data) { |
100 | if (err) { | 109 | if (err) { |
@@ -127,6 +136,11 @@ function AwsSqsProducer() { | @@ -127,6 +136,11 @@ function AwsSqsProducer() { | ||
127 | //do nothing | 136 | //do nothing |
128 | } | 137 | } |
129 | }); | 138 | }); |
139 | + } else { | ||
140 | + let pollDuration = new Date().getTime() - pollStartTs; | ||
141 | + if (pollDuration < pollInterval) { | ||
142 | + await sleep(pollInterval - pollDuration); | ||
143 | + } | ||
130 | } | 144 | } |
131 | } | 145 | } |
132 | } catch (e) { | 146 | } catch (e) { |
@@ -175,6 +189,12 @@ function parseQueueProperties() { | @@ -175,6 +189,12 @@ function parseQueueProperties() { | ||
175 | }); | 189 | }); |
176 | } | 190 | } |
177 | 191 | ||
192 | +function sleep(ms) { | ||
193 | + return new Promise((resolve) => { | ||
194 | + setTimeout(resolve, ms); | ||
195 | + }); | ||
196 | +} | ||
197 | + | ||
178 | process.on('exit', () => { | 198 | process.on('exit', () => { |
179 | stopped = true; | 199 | stopped = true; |
180 | logger.info('Aws Sqs client stopped.'); | 200 | logger.info('Aws Sqs client stopped.'); |
@@ -20,7 +20,7 @@ const config = require('config'), | @@ -20,7 +20,7 @@ const config = require('config'), | ||
20 | logger = require('../config/logger')._logger('kafkaTemplate'), | 20 | logger = require('../config/logger')._logger('kafkaTemplate'), |
21 | KafkaJsWinstonLogCreator = require('../config/logger').KafkaJsWinstonLogCreator; | 21 | KafkaJsWinstonLogCreator = require('../config/logger').KafkaJsWinstonLogCreator; |
22 | const replicationFactor = config.get('kafka.replication_factor'); | 22 | const replicationFactor = config.get('kafka.replication_factor'); |
23 | -const topicProperties = config.get('kafka.topic-properties'); | 23 | +const topicProperties = config.get('kafka.topic_properties'); |
24 | 24 | ||
25 | let kafkaClient; | 25 | let kafkaClient; |
26 | let kafkaAdmin; | 26 | let kafkaAdmin; |
@@ -24,7 +24,7 @@ const {PubSub} = require('@google-cloud/pubsub'); | @@ -24,7 +24,7 @@ const {PubSub} = require('@google-cloud/pubsub'); | ||
24 | const projectId = config.get('pubsub.project_id'); | 24 | const projectId = config.get('pubsub.project_id'); |
25 | const credentials = JSON.parse(config.get('pubsub.service_account')); | 25 | const credentials = JSON.parse(config.get('pubsub.service_account')); |
26 | const requestTopic = config.get('request_topic'); | 26 | const requestTopic = config.get('request_topic'); |
27 | -const queueProperties = config.get('pubsub.queue-properties'); | 27 | +const queueProperties = config.get('pubsub.queue_properties'); |
28 | 28 | ||
29 | let pubSubClient; | 29 | let pubSubClient; |
30 | 30 | ||
@@ -98,23 +98,32 @@ function PubSubProducer() { | @@ -98,23 +98,32 @@ function PubSubProducer() { | ||
98 | 98 | ||
99 | async function createTopic(topic) { | 99 | async function createTopic(topic) { |
100 | if (!topics.includes(topic)) { | 100 | if (!topics.includes(topic)) { |
101 | - await pubSubClient.createTopic(topic); | 101 | + try { |
102 | + await pubSubClient.createTopic(topic); | ||
103 | + logger.info('Created new Pub/Sub topic: %s', topic); | ||
104 | + } catch (e) { | ||
105 | + logger.info('Pub/Sub topic already exists'); | ||
106 | + } | ||
102 | topics.push(topic); | 107 | topics.push(topic); |
103 | - logger.info('Created new Pub/Sub topic: %s', topic); | ||
104 | } | 108 | } |
105 | await createSubscription(topic) | 109 | await createSubscription(topic) |
106 | } | 110 | } |
107 | 111 | ||
108 | async function createSubscription(topic) { | 112 | async function createSubscription(topic) { |
109 | if (!subscriptions.includes(topic)) { | 113 | if (!subscriptions.includes(topic)) { |
110 | - await pubSubClient.createSubscription(topic, topic, { | ||
111 | - topic: topic, | ||
112 | - subscription: topic, | ||
113 | - ackDeadlineSeconds: queueProps['ackDeadlineInSec'], | ||
114 | - messageRetentionDuration: {seconds: queueProps['messageRetentionInSec']} | ||
115 | - }); | 114 | + try { |
115 | + await pubSubClient.createSubscription(topic, topic, { | ||
116 | + topic: topic, | ||
117 | + subscription: topic, | ||
118 | + ackDeadlineSeconds: queueProps['ackDeadlineInSec'], | ||
119 | + messageRetentionDuration: {seconds: queueProps['messageRetentionInSec']} | ||
120 | + }); | ||
121 | + logger.info('Created new Pub/Sub subscription: %s', topic); | ||
122 | + } catch (e) { | ||
123 | + logger.info('Pub/Sub subscription already exists.'); | ||
124 | + } | ||
125 | + | ||
116 | subscriptions.push(topic); | 126 | subscriptions.push(topic); |
117 | - logger.info('Created new Pub/Sub subscription: %s', topic); | ||
118 | } | 127 | } |
119 | } | 128 | } |
120 | 129 |
@@ -26,23 +26,23 @@ const port = config.get('rabbitmq.port'); | @@ -26,23 +26,23 @@ const port = config.get('rabbitmq.port'); | ||
26 | const vhost = config.get('rabbitmq.virtual_host'); | 26 | const vhost = config.get('rabbitmq.virtual_host'); |
27 | const username = config.get('rabbitmq.username'); | 27 | const username = config.get('rabbitmq.username'); |
28 | const password = config.get('rabbitmq.password'); | 28 | const password = config.get('rabbitmq.password'); |
29 | -const queueProperties = config.get('rabbitmq.queue-properties'); | ||
30 | -const poolInterval = config.get('js.response_poll_interval'); | 29 | +const queueProperties = config.get('rabbitmq.queue_properties'); |
30 | +const pollInterval = config.get('js.response_poll_interval'); | ||
31 | 31 | ||
32 | const amqp = require('amqplib/callback_api'); | 32 | const amqp = require('amqplib/callback_api'); |
33 | 33 | ||
34 | -let queueParams = {durable: false, exclusive: false, autoDelete: false}; | 34 | +let queueOptions = {durable: false, exclusive: false, autoDelete: false}; |
35 | let connection; | 35 | let connection; |
36 | let channel; | 36 | let channel; |
37 | let stopped = false; | 37 | let stopped = false; |
38 | -const responseTopics = []; | 38 | +let queues = []; |
39 | 39 | ||
40 | function RabbitMqProducer() { | 40 | function RabbitMqProducer() { |
41 | this.send = async (responseTopic, scriptId, rawResponse, headers) => { | 41 | this.send = async (responseTopic, scriptId, rawResponse, headers) => { |
42 | 42 | ||
43 | - if (!responseTopics.includes(responseTopic)) { | 43 | + if (!queues.includes(responseTopic)) { |
44 | await createQueue(responseTopic); | 44 | await createQueue(responseTopic); |
45 | - responseTopics.push(responseTopic); | 45 | + queues.push(responseTopic); |
46 | } | 46 | } |
47 | 47 | ||
48 | let data = JSON.stringify( | 48 | let data = JSON.stringify( |
@@ -98,6 +98,7 @@ function RabbitMqProducer() { | @@ -98,6 +98,7 @@ function RabbitMqProducer() { | ||
98 | const messageProcessor = new JsInvokeMessageProcessor(new RabbitMqProducer()); | 98 | const messageProcessor = new JsInvokeMessageProcessor(new RabbitMqProducer()); |
99 | 99 | ||
100 | while (!stopped) { | 100 | while (!stopped) { |
101 | + let pollStartTs = new Date().getTime(); | ||
101 | let message = await new Promise((resolve, reject) => { | 102 | let message = await new Promise((resolve, reject) => { |
102 | channel.get(requestTopic, {}, function (err, msg) { | 103 | channel.get(requestTopic, {}, function (err, msg) { |
103 | if (err) { | 104 | if (err) { |
@@ -112,7 +113,10 @@ function RabbitMqProducer() { | @@ -112,7 +113,10 @@ function RabbitMqProducer() { | ||
112 | messageProcessor.onJsInvokeMessage(JSON.parse(message.content.toString('utf8'))); | 113 | messageProcessor.onJsInvokeMessage(JSON.parse(message.content.toString('utf8'))); |
113 | channel.ack(message); | 114 | channel.ack(message); |
114 | } else { | 115 | } else { |
115 | - await sleep(poolInterval); | 116 | + let pollDuration = new Date().getTime() - pollStartTs; |
117 | + if (pollDuration < pollInterval) { | ||
118 | + await sleep(pollInterval - pollDuration); | ||
119 | + } | ||
116 | } | 120 | } |
117 | } | 121 | } |
118 | } catch (e) { | 122 | } catch (e) { |
@@ -123,16 +127,18 @@ function RabbitMqProducer() { | @@ -123,16 +127,18 @@ function RabbitMqProducer() { | ||
123 | })(); | 127 | })(); |
124 | 128 | ||
125 | function parseQueueProperties() { | 129 | function parseQueueProperties() { |
130 | + let args = {}; | ||
126 | const props = queueProperties.split(';'); | 131 | const props = queueProperties.split(';'); |
127 | props.forEach(p => { | 132 | props.forEach(p => { |
128 | const delimiterPosition = p.indexOf(':'); | 133 | const delimiterPosition = p.indexOf(':'); |
129 | - queueParams[p.substring(0, delimiterPosition)] = p.substring(delimiterPosition + 1); | 134 | + args[p.substring(0, delimiterPosition)] = +p.substring(delimiterPosition + 1); |
130 | }); | 135 | }); |
136 | + queueOptions['arguments'] = args; | ||
131 | } | 137 | } |
132 | 138 | ||
133 | -function createQueue(topic) { | 139 | +async function createQueue(topic) { |
134 | return new Promise((resolve, reject) => { | 140 | return new Promise((resolve, reject) => { |
135 | - channel.assertQueue(topic, queueParams, function (err) { | 141 | + channel.assertQueue(topic, queueOptions, function (err) { |
136 | if (err) { | 142 | if (err) { |
137 | reject(err); | 143 | reject(err); |
138 | } else { | 144 | } else { |
@@ -26,7 +26,7 @@ const requestTopic = config.get('request_topic'); | @@ -26,7 +26,7 @@ const requestTopic = config.get('request_topic'); | ||
26 | const namespaceName = config.get('service_bus.namespace_name'); | 26 | const namespaceName = config.get('service_bus.namespace_name'); |
27 | const sasKeyName = config.get('service_bus.sas_key_name'); | 27 | const sasKeyName = config.get('service_bus.sas_key_name'); |
28 | const sasKey = config.get('service_bus.sas_key'); | 28 | const sasKey = config.get('service_bus.sas_key'); |
29 | -const queueProperties = config.get('service_bus.queue-properties'); | 29 | +const queueProperties = config.get('service_bus.queue_properties'); |
30 | 30 | ||
31 | let sbClient; | 31 | let sbClient; |
32 | let receiverClient; | 32 | let receiverClient; |
@@ -140,6 +140,7 @@ function parseQueueProperties() { | @@ -140,6 +140,7 @@ function parseQueueProperties() { | ||
140 | properties[p.substring(0, delimiterPosition)] = p.substring(delimiterPosition + 1); | 140 | properties[p.substring(0, delimiterPosition)] = p.substring(delimiterPosition + 1); |
141 | }); | 141 | }); |
142 | queueOptions = { | 142 | queueOptions = { |
143 | + DuplicateDetection: 'false', | ||
143 | MaxSizeInMegabytes: properties['maxSizeInMb'], | 144 | MaxSizeInMegabytes: properties['maxSizeInMb'], |
144 | DefaultMessageTimeToLive: `PT${properties['messageTimeToLiveInSec']}S`, | 145 | DefaultMessageTimeToLive: `PT${properties['messageTimeToLiveInSec']}S`, |
145 | LockDuration: `PT${properties['lockDurationInSec']}S` | 146 | LockDuration: `PT${properties['lockDurationInSec']}S` |
@@ -16,7 +16,7 @@ | @@ -16,7 +16,7 @@ | ||
16 | 16 | ||
17 | const config = require('config'), logger = require('./config/logger')._logger('main'); | 17 | const config = require('config'), logger = require('./config/logger')._logger('main'); |
18 | 18 | ||
19 | -const serviceType = config.get('service-type'); | 19 | +const serviceType = config.get('queue_type'); |
20 | switch (serviceType) { | 20 | switch (serviceType) { |
21 | case 'kafka': | 21 | case 'kafka': |
22 | logger.info('Starting kafka template.'); | 22 | logger.info('Starting kafka template.'); |
@@ -30,10 +30,10 @@ | @@ -30,10 +30,10 @@ | ||
30 | <properties> | 30 | <properties> |
31 | <main.dir>${basedir}</main.dir> | 31 | <main.dir>${basedir}</main.dir> |
32 | <pkg.user>thingsboard</pkg.user> | 32 | <pkg.user>thingsboard</pkg.user> |
33 | - <spring-boot.version>2.2.4.RELEASE</spring-boot.version> | 33 | + <spring-boot.version>2.2.6.RELEASE</spring-boot.version> |
34 | <spring-oauth2.version>2.1.2.RELEASE</spring-oauth2.version> | 34 | <spring-oauth2.version>2.1.2.RELEASE</spring-oauth2.version> |
35 | - <spring.version>5.2.2.RELEASE</spring.version> | ||
36 | - <spring-security.version>5.2.2.RELEASE</spring-security.version> | 35 | + <spring.version>5.2.6.RELEASE</spring.version> |
36 | + <spring-security.version>5.2.3.RELEASE</spring-security.version> | ||
37 | <spring-data-redis.version>2.2.4.RELEASE</spring-data-redis.version> | 37 | <spring-data-redis.version>2.2.4.RELEASE</spring-data-redis.version> |
38 | <jedis.version>3.1.0</jedis.version> | 38 | <jedis.version>3.1.0</jedis.version> |
39 | <jjwt.version>0.7.0</jjwt.version> | 39 | <jjwt.version>0.7.0</jjwt.version> |
@@ -62,14 +62,14 @@ | @@ -62,14 +62,14 @@ | ||
62 | <gson.version>2.6.2</gson.version> | 62 | <gson.version>2.6.2</gson.version> |
63 | <velocity.version>1.7</velocity.version> | 63 | <velocity.version>1.7</velocity.version> |
64 | <velocity-tools.version>2.0</velocity-tools.version> | 64 | <velocity-tools.version>2.0</velocity-tools.version> |
65 | - <mail.version>1.4.3</mail.version> | 65 | + <mail.version>1.6.2</mail.version> |
66 | <curator.version>4.2.0</curator.version> | 66 | <curator.version>4.2.0</curator.version> |
67 | <zookeeper.version>3.5.5</zookeeper.version> | 67 | <zookeeper.version>3.5.5</zookeeper.version> |
68 | <protobuf.version>3.11.4</protobuf.version> | 68 | <protobuf.version>3.11.4</protobuf.version> |
69 | <grpc.version>1.22.1</grpc.version> | 69 | <grpc.version>1.22.1</grpc.version> |
70 | <lombok.version>1.16.18</lombok.version> | 70 | <lombok.version>1.16.18</lombok.version> |
71 | <paho.client.version>1.1.0</paho.client.version> | 71 | <paho.client.version>1.1.0</paho.client.version> |
72 | - <netty.version>4.1.45.Final</netty.version> | 72 | + <netty.version>4.1.49.Final</netty.version> |
73 | <os-maven-plugin.version>1.5.0</os-maven-plugin.version> | 73 | <os-maven-plugin.version>1.5.0</os-maven-plugin.version> |
74 | <rabbitmq.version>4.8.0</rabbitmq.version> | 74 | <rabbitmq.version>4.8.0</rabbitmq.version> |
75 | <surfire.version>2.19.1</surfire.version> | 75 | <surfire.version>2.19.1</surfire.version> |
@@ -96,7 +96,7 @@ | @@ -96,7 +96,7 @@ | ||
96 | <snakeyaml.version>1.25</snakeyaml.version> | 96 | <snakeyaml.version>1.25</snakeyaml.version> |
97 | <struts.version>1.3.10</struts.version> | 97 | <struts.version>1.3.10</struts.version> |
98 | <amazonaws.sqs.version>1.11.747</amazonaws.sqs.version> | 98 | <amazonaws.sqs.version>1.11.747</amazonaws.sqs.version> |
99 | - <pubsub.client.version>1.84.0</pubsub.client.version> | 99 | + <pubsub.client.version>1.105.0</pubsub.client.version> |
100 | <azure-servicebus.version>3.2.0</azure-servicebus.version> | 100 | <azure-servicebus.version>3.2.0</azure-servicebus.version> |
101 | <passay.version>1.5.0</passay.version> | 101 | <passay.version>1.5.0</passay.version> |
102 | <ua-parser.version>1.4.3</ua-parser.version> | 102 | <ua-parser.version>1.4.3</ua-parser.version> |
@@ -471,12 +471,12 @@ | @@ -471,12 +471,12 @@ | ||
471 | <dependency> | 471 | <dependency> |
472 | <groupId>org.springframework.security</groupId> | 472 | <groupId>org.springframework.security</groupId> |
473 | <artifactId>spring-security-oauth2-client</artifactId> | 473 | <artifactId>spring-security-oauth2-client</artifactId> |
474 | - <version>${spring.version}</version> | 474 | + <version>${spring-security.version}</version> |
475 | </dependency> | 475 | </dependency> |
476 | <dependency> | 476 | <dependency> |
477 | <groupId>org.springframework.security</groupId> | 477 | <groupId>org.springframework.security</groupId> |
478 | <artifactId>spring-security-oauth2-jose</artifactId> | 478 | <artifactId>spring-security-oauth2-jose</artifactId> |
479 | - <version>${spring.version}</version> | 479 | + <version>${spring-security.version}</version> |
480 | </dependency> | 480 | </dependency> |
481 | <dependency> | 481 | <dependency> |
482 | <groupId>org.springframework.boot</groupId> | 482 | <groupId>org.springframework.boot</groupId> |
@@ -591,8 +591,8 @@ | @@ -591,8 +591,8 @@ | ||
591 | <version>${rabbitmq.version}</version> | 591 | <version>${rabbitmq.version}</version> |
592 | </dependency> | 592 | </dependency> |
593 | <dependency> | 593 | <dependency> |
594 | - <groupId>javax.mail</groupId> | ||
595 | - <artifactId>mail</artifactId> | 594 | + <groupId>com.sun.mail</groupId> |
595 | + <artifactId>javax.mail</artifactId> | ||
596 | <version>${mail.version}</version> | 596 | <version>${mail.version}</version> |
597 | </dependency> | 597 | </dependency> |
598 | <dependency> | 598 | <dependency> |
@@ -610,6 +610,12 @@ | @@ -610,6 +610,12 @@ | ||
610 | <groupId>org.apache.zookeeper</groupId> | 610 | <groupId>org.apache.zookeeper</groupId> |
611 | <artifactId>zookeeper</artifactId> | 611 | <artifactId>zookeeper</artifactId> |
612 | <version>${zookeeper.version}</version> | 612 | <version>${zookeeper.version}</version> |
613 | + <exclusions> | ||
614 | + <exclusion> | ||
615 | + <groupId>log4j</groupId> | ||
616 | + <artifactId>log4j</artifactId> | ||
617 | + </exclusion> | ||
618 | + </exclusions> | ||
613 | </dependency> | 619 | </dependency> |
614 | <dependency> | 620 | <dependency> |
615 | <groupId>com.jayway.jsonpath</groupId> | 621 | <groupId>com.jayway.jsonpath</groupId> |
@@ -692,6 +698,12 @@ | @@ -692,6 +698,12 @@ | ||
692 | <groupId>com.github.fge</groupId> | 698 | <groupId>com.github.fge</groupId> |
693 | <artifactId>json-schema-validator</artifactId> | 699 | <artifactId>json-schema-validator</artifactId> |
694 | <version>${json-schema-validator.version}</version> | 700 | <version>${json-schema-validator.version}</version> |
701 | + <exclusions> | ||
702 | + <exclusion> | ||
703 | + <groupId>javax.mail</groupId> | ||
704 | + <artifactId>mailapi</artifactId> | ||
705 | + </exclusion> | ||
706 | + </exclusions> | ||
695 | </dependency> | 707 | </dependency> |
696 | <dependency> | 708 | <dependency> |
697 | <groupId>com.typesafe.akka</groupId> | 709 | <groupId>com.typesafe.akka</groupId> |
@@ -928,12 +940,6 @@ | @@ -928,12 +940,6 @@ | ||
928 | <groupId>com.microsoft.azure</groupId> | 940 | <groupId>com.microsoft.azure</groupId> |
929 | <artifactId>azure-servicebus</artifactId> | 941 | <artifactId>azure-servicebus</artifactId> |
930 | <version>${azure-servicebus.version}</version> | 942 | <version>${azure-servicebus.version}</version> |
931 | - <exclusions> | ||
932 | - <exclusion> | ||
933 | - <groupId>com.microsoft.azure</groupId> | ||
934 | - <artifactId>adal4j</artifactId> | ||
935 | - </exclusion> | ||
936 | - </exclusions> | ||
937 | </dependency> | 943 | </dependency> |
938 | <dependency> | 944 | <dependency> |
939 | <groupId>org.passay</groupId> | 945 | <groupId>org.passay</groupId> |
@@ -93,5 +93,10 @@ | @@ -93,5 +93,10 @@ | ||
93 | <artifactId>spring-data-redis</artifactId> | 93 | <artifactId>spring-data-redis</artifactId> |
94 | <scope>provided</scope> | 94 | <scope>provided</scope> |
95 | </dependency> | 95 | </dependency> |
96 | + <dependency> | ||
97 | + <groupId>com.sun.mail</groupId> | ||
98 | + <artifactId>javax.mail</artifactId> | ||
99 | + <scope>provided</scope> | ||
100 | + </dependency> | ||
96 | </dependencies> | 101 | </dependencies> |
97 | </project> | 102 | </project> |
@@ -81,8 +81,8 @@ public class TbClearAlarmNode extends TbAbstractAlarmNode<TbClearAlarmNodeConfig | @@ -81,8 +81,8 @@ public class TbClearAlarmNode extends TbAbstractAlarmNode<TbClearAlarmNodeConfig | ||
81 | } | 81 | } |
82 | alarm.setStatus(alarm.getStatus().isAck() ? AlarmStatus.CLEARED_ACK : AlarmStatus.CLEARED_UNACK); | 82 | alarm.setStatus(alarm.getStatus().isAck() ? AlarmStatus.CLEARED_ACK : AlarmStatus.CLEARED_UNACK); |
83 | return Futures.immediateFuture(new AlarmResult(false, false, true, alarm)); | 83 | return Futures.immediateFuture(new AlarmResult(false, false, true, alarm)); |
84 | - }, MoreExecutors.directExecutor()); | ||
85 | - }, MoreExecutors.directExecutor()); | 84 | + }, ctx.getDbCallbackExecutor()); |
85 | + }, ctx.getDbCallbackExecutor()); | ||
86 | }, ctx.getDbCallbackExecutor()); | 86 | }, ctx.getDbCallbackExecutor()); |
87 | } | 87 | } |
88 | } | 88 | } |