@gravito/ripple 3.1.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/README.md +260 -19
  2. package/dist/atlas/src/DB.d.ts +348 -0
  3. package/dist/atlas/src/OrbitAtlas.d.ts +9 -0
  4. package/dist/atlas/src/config/defineConfig.d.ts +14 -0
  5. package/dist/atlas/src/config/index.d.ts +7 -0
  6. package/dist/atlas/src/config/loadConfig.d.ts +41 -0
  7. package/dist/atlas/src/connection/Connection.d.ts +112 -0
  8. package/dist/atlas/src/connection/ConnectionManager.d.ts +180 -0
  9. package/dist/atlas/src/connection/ReplicaConnectionPool.d.ts +54 -0
  10. package/dist/atlas/src/drivers/BunSQLDriver.d.ts +32 -0
  11. package/dist/atlas/src/drivers/BunSQLPreparedStatement.d.ts +118 -0
  12. package/dist/atlas/src/drivers/MongoDBDriver.d.ts +36 -0
  13. package/dist/atlas/src/drivers/MySQLDriver.d.ts +79 -0
  14. package/dist/atlas/src/drivers/PostgresDriver.d.ts +96 -0
  15. package/dist/atlas/src/drivers/RedisDriver.d.ts +43 -0
  16. package/dist/atlas/src/drivers/SQLiteDriver.d.ts +45 -0
  17. package/dist/atlas/src/drivers/types.d.ts +260 -0
  18. package/dist/atlas/src/errors/index.d.ts +45 -0
  19. package/dist/atlas/src/grammar/Grammar.d.ts +342 -0
  20. package/dist/atlas/src/grammar/MongoGrammar.d.ts +47 -0
  21. package/dist/atlas/src/grammar/MySQLGrammar.d.ts +54 -0
  22. package/dist/atlas/src/grammar/NullGrammar.d.ts +35 -0
  23. package/dist/atlas/src/grammar/PostgresGrammar.d.ts +62 -0
  24. package/dist/atlas/src/grammar/SQLiteGrammar.d.ts +32 -0
  25. package/dist/atlas/src/index.d.ts +79 -0
  26. package/dist/atlas/src/migration/Migration.d.ts +64 -0
  27. package/dist/atlas/src/migration/MigrationRepository.d.ts +65 -0
  28. package/dist/atlas/src/migration/Migrator.d.ts +110 -0
  29. package/dist/atlas/src/migration/index.d.ts +6 -0
  30. package/dist/atlas/src/observability/AtlasMetrics.d.ts +33 -0
  31. package/dist/atlas/src/observability/AtlasObservability.d.ts +15 -0
  32. package/dist/atlas/src/observability/AtlasTracer.d.ts +12 -0
  33. package/dist/atlas/src/observability/index.d.ts +9 -0
  34. package/dist/atlas/src/orm/Repository.d.ts +247 -0
  35. package/dist/atlas/src/orm/index.d.ts +6 -0
  36. package/dist/atlas/src/orm/model/DirtyTracker.d.ts +121 -0
  37. package/dist/atlas/src/orm/model/Model.d.ts +458 -0
  38. package/dist/atlas/src/orm/model/ModelRegistry.d.ts +20 -0
  39. package/dist/atlas/src/orm/model/concerns/HasAttributes.d.ts +150 -0
  40. package/dist/atlas/src/orm/model/concerns/HasEvents.d.ts +36 -0
  41. package/dist/atlas/src/orm/model/concerns/HasPersistence.d.ts +92 -0
  42. package/dist/atlas/src/orm/model/concerns/HasRelationships.d.ts +117 -0
  43. package/dist/atlas/src/orm/model/concerns/HasSerialization.d.ts +64 -0
  44. package/dist/atlas/src/orm/model/concerns/applyMixins.d.ts +15 -0
  45. package/dist/atlas/src/orm/model/concerns/index.d.ts +12 -0
  46. package/dist/atlas/src/orm/model/decorators.d.ts +138 -0
  47. package/dist/atlas/src/orm/model/errors.d.ts +52 -0
  48. package/dist/atlas/src/orm/model/index.d.ts +10 -0
  49. package/dist/atlas/src/orm/model/relationships.d.ts +207 -0
  50. package/dist/atlas/src/orm/model/types.d.ts +12 -0
  51. package/dist/atlas/src/orm/schema/SchemaRegistry.d.ts +124 -0
  52. package/dist/atlas/src/orm/schema/SchemaSniffer.d.ts +54 -0
  53. package/dist/atlas/src/orm/schema/index.d.ts +6 -0
  54. package/dist/atlas/src/orm/schema/types.d.ts +85 -0
  55. package/dist/atlas/src/pool/AdaptivePoolManager.d.ts +98 -0
  56. package/dist/atlas/src/pool/PoolHealthChecker.d.ts +91 -0
  57. package/dist/atlas/src/pool/PoolStrategy.d.ts +129 -0
  58. package/dist/atlas/src/pool/PoolWarmer.d.ts +92 -0
  59. package/dist/atlas/src/query/Expression.d.ts +60 -0
  60. package/dist/atlas/src/query/NPlusOneDetector.d.ts +10 -0
  61. package/dist/atlas/src/query/QueryBuilder.d.ts +643 -0
  62. package/dist/atlas/src/query/RelationshipResolver.d.ts +23 -0
  63. package/dist/atlas/src/query/clauses/GroupByClause.d.ts +51 -0
  64. package/dist/atlas/src/query/clauses/HavingClause.d.ts +70 -0
  65. package/dist/atlas/src/query/clauses/JoinClause.d.ts +87 -0
  66. package/dist/atlas/src/query/clauses/LimitClause.d.ts +82 -0
  67. package/dist/atlas/src/query/clauses/OrderByClause.d.ts +69 -0
  68. package/dist/atlas/src/query/clauses/SelectClause.d.ts +71 -0
  69. package/dist/atlas/src/query/clauses/WhereClause.d.ts +167 -0
  70. package/dist/atlas/src/query/clauses/index.d.ts +11 -0
  71. package/dist/atlas/src/schema/Blueprint.d.ts +276 -0
  72. package/dist/atlas/src/schema/ColumnDefinition.d.ts +154 -0
  73. package/dist/atlas/src/schema/ForeignKeyDefinition.d.ts +37 -0
  74. package/dist/atlas/src/schema/MigrationGenerator.d.ts +45 -0
  75. package/dist/atlas/src/schema/Schema.d.ts +131 -0
  76. package/dist/atlas/src/schema/SchemaDiff.d.ts +73 -0
  77. package/dist/atlas/src/schema/TypeGenerator.d.ts +57 -0
  78. package/dist/atlas/src/schema/TypeWriter.d.ts +42 -0
  79. package/dist/atlas/src/schema/grammars/MySQLSchemaGrammar.d.ts +23 -0
  80. package/dist/atlas/src/schema/grammars/PostgresSchemaGrammar.d.ts +26 -0
  81. package/dist/atlas/src/schema/grammars/SQLiteSchemaGrammar.d.ts +28 -0
  82. package/dist/atlas/src/schema/grammars/SchemaGrammar.d.ts +97 -0
  83. package/dist/atlas/src/schema/grammars/index.d.ts +7 -0
  84. package/dist/atlas/src/schema/index.d.ts +8 -0
  85. package/dist/atlas/src/seed/Factory.d.ts +90 -0
  86. package/dist/atlas/src/seed/Seeder.d.ts +28 -0
  87. package/dist/atlas/src/seed/SeederRunner.d.ts +74 -0
  88. package/dist/atlas/src/seed/index.d.ts +6 -0
  89. package/dist/atlas/src/sharding/ShardingManager.d.ts +59 -0
  90. package/dist/atlas/src/types/index.d.ts +1182 -0
  91. package/dist/atlas/src/utils/CursorEncoding.d.ts +63 -0
  92. package/dist/atlas/src/utils/levenshtein.d.ts +9 -0
  93. package/dist/core/src/CommandKernel.d.ts +33 -0
  94. package/dist/core/src/ConfigManager.d.ts +39 -0
  95. package/dist/core/src/Container/RequestScopeManager.d.ts +62 -0
  96. package/dist/core/src/Container/RequestScopeMetrics.d.ts +144 -0
  97. package/dist/core/src/Container.d.ts +86 -11
  98. package/dist/core/src/ErrorHandler.d.ts +3 -0
  99. package/dist/core/src/HookManager.d.ts +511 -4
  100. package/dist/core/src/PlanetCore.d.ts +89 -0
  101. package/dist/core/src/RequestContext.d.ts +97 -0
  102. package/dist/core/src/Router.d.ts +1 -5
  103. package/dist/core/src/ServiceProvider.d.ts +22 -0
  104. package/dist/core/src/adapters/GravitoEngineAdapter.d.ts +1 -0
  105. package/dist/core/src/adapters/PhotonAdapter.d.ts +5 -0
  106. package/dist/core/src/adapters/bun/BunContext.d.ts +4 -0
  107. package/dist/core/src/adapters/bun/BunNativeAdapter.d.ts +1 -0
  108. package/dist/core/src/adapters/types.d.ts +27 -0
  109. package/dist/core/src/cli/queue-commands.d.ts +6 -0
  110. package/dist/core/src/engine/AOTRouter.d.ts +7 -12
  111. package/dist/core/src/engine/FastContext.d.ts +27 -2
  112. package/dist/core/src/engine/Gravito.d.ts +0 -1
  113. package/dist/core/src/engine/MinimalContext.d.ts +25 -2
  114. package/dist/core/src/engine/types.d.ts +9 -1
  115. package/dist/core/src/error-handling/RequestScopeErrorContext.d.ts +126 -0
  116. package/dist/core/src/events/BackpressureManager.d.ts +215 -0
  117. package/dist/core/src/events/CircuitBreaker.d.ts +229 -0
  118. package/dist/core/src/events/DeadLetterQueue.d.ts +219 -0
  119. package/dist/core/src/events/EventBackend.d.ts +12 -0
  120. package/dist/core/src/events/EventOptions.d.ts +204 -0
  121. package/dist/core/src/events/EventPriorityQueue.d.ts +301 -0
  122. package/dist/core/src/events/FlowControlStrategy.d.ts +109 -0
  123. package/dist/core/src/events/IdempotencyCache.d.ts +60 -0
  124. package/dist/core/src/events/MessageQueueBridge.d.ts +184 -0
  125. package/dist/core/src/events/PriorityEscalationManager.d.ts +82 -0
  126. package/dist/core/src/events/RetryScheduler.d.ts +104 -0
  127. package/dist/core/src/events/WorkerPool.d.ts +98 -0
  128. package/dist/core/src/events/WorkerPoolConfig.d.ts +153 -0
  129. package/dist/core/src/events/WorkerPoolMetrics.d.ts +65 -0
  130. package/dist/core/src/events/aggregation/AggregationWindow.d.ts +77 -0
  131. package/dist/core/src/events/aggregation/DeduplicationManager.d.ts +135 -0
  132. package/dist/core/src/events/aggregation/EventAggregationManager.d.ts +108 -0
  133. package/dist/core/src/events/aggregation/EventBatcher.d.ts +99 -0
  134. package/dist/core/src/events/aggregation/types.d.ts +117 -0
  135. package/dist/core/src/events/index.d.ts +25 -0
  136. package/dist/core/src/events/observability/EventMetrics.d.ts +132 -0
  137. package/dist/core/src/events/observability/EventTracer.d.ts +68 -0
  138. package/dist/core/src/events/observability/EventTracing.d.ts +161 -0
  139. package/dist/core/src/events/observability/OTelEventMetrics.d.ts +332 -0
  140. package/dist/core/src/events/observability/ObservableHookManager.d.ts +108 -0
  141. package/dist/core/src/events/observability/StreamWorkerMetrics.d.ts +76 -0
  142. package/dist/core/src/events/observability/index.d.ts +24 -0
  143. package/dist/core/src/events/observability/metrics-types.d.ts +16 -0
  144. package/dist/core/src/events/types.d.ts +134 -0
  145. package/dist/core/src/exceptions/CircularDependencyException.d.ts +9 -0
  146. package/dist/core/src/exceptions/index.d.ts +1 -0
  147. package/dist/core/src/health/HealthProvider.d.ts +67 -0
  148. package/dist/core/src/http/types.d.ts +40 -0
  149. package/dist/core/src/index.d.ts +25 -4
  150. package/dist/core/src/instrumentation/index.d.ts +35 -0
  151. package/dist/core/src/instrumentation/opentelemetry.d.ts +178 -0
  152. package/dist/core/src/instrumentation/types.d.ts +182 -0
  153. package/dist/core/src/observability/Metrics.d.ts +244 -0
  154. package/dist/core/src/observability/QueueDashboard.d.ts +136 -0
  155. package/dist/core/src/reliability/DeadLetterQueueManager.d.ts +350 -0
  156. package/dist/core/src/reliability/RetryPolicy.d.ts +217 -0
  157. package/dist/core/src/reliability/index.d.ts +6 -0
  158. package/dist/core/src/router/ControllerDispatcher.d.ts +12 -0
  159. package/dist/core/src/router/RequestValidator.d.ts +20 -0
  160. package/dist/index.js +6709 -9888
  161. package/dist/index.js.map +64 -62
  162. package/dist/photon/src/index.d.ts +19 -0
  163. package/dist/photon/src/middleware/ratelimit-redis.d.ts +50 -0
  164. package/dist/photon/src/middleware/ratelimit.d.ts +161 -0
  165. package/dist/photon/src/openapi.d.ts +19 -0
  166. package/dist/proto/ripple.proto +120 -0
  167. package/dist/ripple/src/RippleServer.d.ts +64 -445
  168. package/dist/ripple/src/channels/ChannelManager.d.ts +25 -10
  169. package/dist/ripple/src/drivers/NATSDriver.d.ts +87 -0
  170. package/dist/ripple/src/drivers/RedisDriver.d.ts +30 -1
  171. package/dist/ripple/src/drivers/index.d.ts +1 -0
  172. package/dist/ripple/src/engines/BunEngine.d.ts +98 -0
  173. package/dist/ripple/src/engines/IRippleEngine.d.ts +205 -0
  174. package/dist/ripple/src/engines/UWebSocketsEngine.d.ts +97 -0
  175. package/dist/ripple/src/engines/WsEngine.d.ts +69 -0
  176. package/dist/ripple/src/engines/index.d.ts +15 -0
  177. package/dist/ripple/src/index.d.ts +2 -0
  178. package/dist/ripple/src/middleware/InterceptorManager.d.ts +21 -0
  179. package/dist/ripple/src/observability/RippleMetrics.d.ts +24 -0
  180. package/dist/ripple/src/reliability/AckManager.d.ts +48 -0
  181. package/dist/ripple/src/serializers/ISerializer.d.ts +39 -0
  182. package/dist/ripple/src/serializers/JsonSerializer.d.ts +19 -0
  183. package/dist/ripple/src/serializers/ProtobufSerializer.d.ts +41 -0
  184. package/dist/ripple/src/serializers/index.d.ts +3 -0
  185. package/dist/ripple/src/tracking/SessionManager.d.ts +104 -0
  186. package/dist/ripple/src/tracking/index.d.ts +1 -0
  187. package/dist/ripple/src/types.d.ts +188 -12
  188. package/dist/ripple/src/utils/MessageSerializer.d.ts +33 -23
  189. package/dist/ripple/src/utils/TokenBucket.d.ts +25 -0
  190. package/package.json +25 -8
package/dist/index.js.map CHANGED
@@ -1,75 +1,77 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../node_modules/.bun/@ioredis+commands@1.5.0/node_modules/@ioredis/commands/built/index.js", "../../../node_modules/.bun/standard-as-callback@2.1.0/node_modules/standard-as-callback/built/utils.js", "../../../node_modules/.bun/standard-as-callback@2.1.0/node_modules/standard-as-callback/built/index.js", "../../../node_modules/.bun/redis-errors@1.2.0/node_modules/redis-errors/lib/old.js", "../../../node_modules/.bun/redis-errors@1.2.0/node_modules/redis-errors/lib/modern.js", "../../../node_modules/.bun/redis-errors@1.2.0/node_modules/redis-errors/index.js", "../../../node_modules/.bun/cluster-key-slot@1.1.2/node_modules/cluster-key-slot/lib/index.js", "../../../node_modules/.bun/lodash.defaults@4.2.0/node_modules/lodash.defaults/index.js", "../../../node_modules/.bun/lodash.isarguments@3.1.0/node_modules/lodash.isarguments/index.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/utils/lodash.js", "../../../node_modules/.bun/ms@2.1.3/node_modules/ms/index.js", "../../../node_modules/.bun/debug@4.4.3/node_modules/debug/src/common.js", "../../../node_modules/.bun/debug@4.4.3/node_modules/debug/src/browser.js", "../../../node_modules/.bun/debug@4.4.3/node_modules/debug/src/node.js", "../../../node_modules/.bun/debug@4.4.3/node_modules/debug/src/index.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/utils/debug.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/constants/TLSProfiles.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/utils/index.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/utils/argumentParsers.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/Command.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/errors/ClusterAllFailedError.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/ScanStream.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/autoPipelining.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/Script.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/utils/Commander.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/Pipeline.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/transaction.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/utils/applyMixin.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/cluster/ClusterOptions.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/cluster/util.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/cluster/ClusterSubscriber.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/cluster/ConnectionPool.js", "../../../node_modules/.bun/denque@2.1.0/node_modules/denque/index.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/cluster/DelayQueue.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/cluster/ShardedSubscriber.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/cluster/ClusterSubscriberGroup.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/cluster/index.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/connectors/AbstractConnector.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/connectors/StandaloneConnector.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/connectors/SentinelConnector/SentinelIterator.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/connectors/SentinelConnector/FailoverDetector.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/connectors/SentinelConnector/index.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/connectors/index.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/errors/MaxRetriesPerRequestError.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/errors/index.js", "../../../node_modules/.bun/redis-parser@3.0.0/node_modules/redis-parser/lib/parser.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/SubscriptionSet.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/DataHandler.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/redis/event_handler.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/redis/RedisOptions.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/Redis.js", "../../../node_modules/.bun/ioredis@5.9.2/node_modules/ioredis/built/index.js", "../src/channels/Channel.ts", "../src/channels/ChannelManager.ts", "../src/drivers/LocalDriver.ts", "../src/errors/RippleError.ts", "../src/logging/Logger.ts", "../src/drivers/RedisDriver.ts", "../src/events/BroadcastEvent.ts", "../src/events/BroadcastManager.ts", "../src/events/Broadcaster.ts", "../src/health/HealthChecker.ts", "../src/tracking/ConnectionTracker.ts", "../src/utils/MessageSerializer.ts", "../src/RippleServer.ts", "../src/OrbitRipple.ts"],
3
+ "sources": ["../../../node_modules/.bun/@protobufjs+aspromise@1.1.2/node_modules/@protobufjs/aspromise/index.js", "../../../node_modules/.bun/@protobufjs+base64@1.1.2/node_modules/@protobufjs/base64/index.js", "../../../node_modules/.bun/@protobufjs+eventemitter@1.1.0/node_modules/@protobufjs/eventemitter/index.js", "../../../node_modules/.bun/@protobufjs+float@1.0.2/node_modules/@protobufjs/float/index.js", "../../../node_modules/.bun/@protobufjs+inquire@1.1.0/node_modules/@protobufjs/inquire/index.js", "../../../node_modules/.bun/@protobufjs+utf8@1.1.0/node_modules/@protobufjs/utf8/index.js", "../../../node_modules/.bun/@protobufjs+pool@1.1.0/node_modules/@protobufjs/pool/index.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/util/longbits.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/util/minimal.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/writer.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/writer_buffer.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/reader.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/reader_buffer.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/rpc/service.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/rpc.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/roots.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/index-minimal.js", "../../../node_modules/.bun/@protobufjs+codegen@2.0.4/node_modules/@protobufjs/codegen/index.js", "../../../node_modules/.bun/@protobufjs+fetch@1.1.0/node_modules/@protobufjs/fetch/index.js", "../../../node_modules/.bun/@protobufjs+path@1.1.2/node_modules/@protobufjs/path/index.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/namespace.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/mapfield.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/method.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/service.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/message.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/decoder.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/verifier.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/converter.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/wrappers.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/type.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/root.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/util.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/types.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/field.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/oneof.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/object.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/enum.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/encoder.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/index-light.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/tokenize.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/parse.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/common.js", "../../../node_modules/.bun/protobufjs@8.0.0/node_modules/protobufjs/src/index.js", "../src/channels/Channel.ts", "../src/channels/ChannelManager.ts", "../src/drivers/LocalDriver.ts", "../src/errors/RippleError.ts", "../src/logging/Logger.ts", "../src/drivers/NATSDriver.ts", "../src/drivers/RedisDriver.ts", "../src/events/BroadcastEvent.ts", "../src/events/BroadcastManager.ts", "../src/events/Broadcaster.ts", "../src/health/HealthChecker.ts", "../src/engines/BunEngine.ts", "../src/engines/UWebSocketsEngine.ts", "../src/engines/WsEngine.ts", "../src/middleware/InterceptorManager.ts", "../src/observability/RippleMetrics.ts", "../src/reliability/AckManager.ts", "../src/serializers/JsonSerializer.ts", "../src/serializers/ProtobufSerializer.ts", "../src/tracking/ConnectionTracker.ts", "../src/tracking/SessionManager.ts", "../src/utils/TokenBucket.ts", "../src/RippleServer.ts", "../src/OrbitRipple.ts", "../src/utils/MessageSerializer.ts"],
4
4
  "sourcesContent": [
5
- "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getKeyIndexes = exports.hasFlag = exports.exists = exports.list = void 0;\nconst commands_json_1 = __importDefault(require(\"./commands.json\"));\n/**\n * Redis command list\n *\n * All commands are lowercased.\n */\nexports.list = Object.keys(commands_json_1.default);\nconst flags = {};\nexports.list.forEach((commandName) => {\n flags[commandName] = commands_json_1.default[commandName].flags.reduce(function (flags, flag) {\n flags[flag] = true;\n return flags;\n }, {});\n});\n/**\n * Check if the command exists\n */\nfunction exists(commandName, options) {\n commandName = (options === null || options === void 0 ? void 0 : options.caseInsensitive)\n ? String(commandName).toLowerCase()\n : commandName;\n return Boolean(commands_json_1.default[commandName]);\n}\nexports.exists = exists;\n/**\n * Check if the command has the flag\n *\n * Some of possible flags: readonly, noscript, loading\n */\nfunction hasFlag(commandName, flag, options) {\n commandName = (options === null || options === void 0 ? void 0 : options.nameCaseInsensitive)\n ? String(commandName).toLowerCase()\n : commandName;\n if (!flags[commandName]) {\n throw new Error(\"Unknown command \" + commandName);\n }\n return Boolean(flags[commandName][flag]);\n}\nexports.hasFlag = hasFlag;\n/**\n * Get indexes of keys in the command arguments\n *\n * @example\n * ```javascript\n * getKeyIndexes('set', ['key', 'value']) // [0]\n * getKeyIndexes('mget', ['key1', 'key2']) // [0, 1]\n * ```\n */\nfunction getKeyIndexes(commandName, args, options) {\n commandName = (options === null || options === void 0 ? void 0 : options.nameCaseInsensitive)\n ? String(commandName).toLowerCase()\n : commandName;\n const command = commands_json_1.default[commandName];\n if (!command) {\n throw new Error(\"Unknown command \" + commandName);\n }\n if (!Array.isArray(args)) {\n throw new Error(\"Expect args to be an array\");\n }\n const keys = [];\n const parseExternalKey = Boolean(options && options.parseExternalKey);\n const takeDynamicKeys = (args, startIndex) => {\n const keys = [];\n const keyStop = Number(args[startIndex]);\n for (let i = 0; i < keyStop; i++) {\n keys.push(i + startIndex + 1);\n }\n return keys;\n };\n const takeKeyAfterToken = (args, startIndex, token) => {\n for (let i = startIndex; i < args.length - 1; i += 1) {\n if (String(args[i]).toLowerCase() === token.toLowerCase()) {\n return i + 1;\n }\n }\n return null;\n };\n switch (commandName) {\n case \"zunionstore\":\n case \"zinterstore\":\n case \"zdiffstore\":\n keys.push(0, ...takeDynamicKeys(args, 1));\n break;\n case \"eval\":\n case \"evalsha\":\n case \"eval_ro\":\n case \"evalsha_ro\":\n case \"fcall\":\n case \"fcall_ro\":\n case \"blmpop\":\n case \"bzmpop\":\n keys.push(...takeDynamicKeys(args, 1));\n break;\n case \"sintercard\":\n case \"lmpop\":\n case \"zunion\":\n case \"zinter\":\n case \"zmpop\":\n case \"zintercard\":\n case \"zdiff\": {\n keys.push(...takeDynamicKeys(args, 0));\n break;\n }\n case \"georadius\": {\n keys.push(0);\n const storeKey = takeKeyAfterToken(args, 5, \"STORE\");\n if (storeKey)\n keys.push(storeKey);\n const distKey = takeKeyAfterToken(args, 5, \"STOREDIST\");\n if (distKey)\n keys.push(distKey);\n break;\n }\n case \"georadiusbymember\": {\n keys.push(0);\n const storeKey = takeKeyAfterToken(args, 4, \"STORE\");\n if (storeKey)\n keys.push(storeKey);\n const distKey = takeKeyAfterToken(args, 4, \"STOREDIST\");\n if (distKey)\n keys.push(distKey);\n break;\n }\n case \"sort\":\n case \"sort_ro\":\n keys.push(0);\n for (let i = 1; i < args.length - 1; i++) {\n let arg = args[i];\n if (typeof arg !== \"string\") {\n continue;\n }\n const directive = arg.toUpperCase();\n if (directive === \"GET\") {\n i += 1;\n arg = args[i];\n if (arg !== \"#\") {\n if (parseExternalKey) {\n keys.push([i, getExternalKeyNameLength(arg)]);\n }\n else {\n keys.push(i);\n }\n }\n }\n else if (directive === \"BY\") {\n i += 1;\n if (parseExternalKey) {\n keys.push([i, getExternalKeyNameLength(args[i])]);\n }\n else {\n keys.push(i);\n }\n }\n else if (directive === \"STORE\") {\n i += 1;\n keys.push(i);\n }\n }\n break;\n case \"migrate\":\n if (args[2] === \"\") {\n for (let i = 5; i < args.length - 1; i++) {\n const arg = args[i];\n if (typeof arg === \"string\" && arg.toUpperCase() === \"KEYS\") {\n for (let j = i + 1; j < args.length; j++) {\n keys.push(j);\n }\n break;\n }\n }\n }\n else {\n keys.push(2);\n }\n break;\n case \"xreadgroup\":\n case \"xread\":\n // Keys are 1st half of the args after STREAMS argument.\n for (let i = commandName === \"xread\" ? 0 : 3; i < args.length - 1; i++) {\n if (String(args[i]).toUpperCase() === \"STREAMS\") {\n for (let j = i + 1; j <= i + (args.length - 1 - i) / 2; j++) {\n keys.push(j);\n }\n break;\n }\n }\n break;\n default:\n // Step has to be at least one in this case, otherwise the command does\n // not contain a key.\n if (command.step > 0) {\n const keyStart = command.keyStart - 1;\n const keyStop = command.keyStop > 0\n ? command.keyStop\n : args.length + command.keyStop + 1;\n for (let i = keyStart; i < keyStop; i += command.step) {\n keys.push(i);\n }\n }\n break;\n }\n return keys;\n}\nexports.getKeyIndexes = getKeyIndexes;\nfunction getExternalKeyNameLength(key) {\n if (typeof key !== \"string\") {\n key = String(key);\n }\n const hashPos = key.indexOf(\"->\");\n return hashPos === -1 ? key.length : hashPos;\n}\n",
6
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.tryCatch = exports.errorObj = void 0;\n//Try catch is not supported in optimizing\n//compiler, so it is isolated\nexports.errorObj = { e: {} };\nlet tryCatchTarget;\nfunction tryCatcher(err, val) {\n try {\n const target = tryCatchTarget;\n tryCatchTarget = null;\n return target.apply(this, arguments);\n }\n catch (e) {\n exports.errorObj.e = e;\n return exports.errorObj;\n }\n}\nfunction tryCatch(fn) {\n tryCatchTarget = fn;\n return tryCatcher;\n}\nexports.tryCatch = tryCatch;\n",
7
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"./utils\");\nfunction throwLater(e) {\n setTimeout(function () {\n throw e;\n }, 0);\n}\nfunction asCallback(promise, nodeback, options) {\n if (typeof nodeback === \"function\") {\n promise.then((val) => {\n let ret;\n if (options !== undefined &&\n Object(options).spread &&\n Array.isArray(val)) {\n ret = utils_1.tryCatch(nodeback).apply(undefined, [null].concat(val));\n }\n else {\n ret =\n val === undefined\n ? utils_1.tryCatch(nodeback)(null)\n : utils_1.tryCatch(nodeback)(null, val);\n }\n if (ret === utils_1.errorObj) {\n throwLater(ret.e);\n }\n }, (cause) => {\n if (!cause) {\n const newReason = new Error(cause + \"\");\n Object.assign(newReason, { cause });\n cause = newReason;\n }\n const ret = utils_1.tryCatch(nodeback)(cause);\n if (ret === utils_1.errorObj) {\n throwLater(ret.e);\n }\n });\n }\n return promise;\n}\nexports.default = asCallback;\n",
8
- "'use strict'\n\nconst assert = require('assert')\nconst util = require('util')\n\n// RedisError\n\nfunction RedisError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n Error.captureStackTrace(this, this.constructor)\n}\n\nutil.inherits(RedisError, Error)\n\nObject.defineProperty(RedisError.prototype, 'name', {\n value: 'RedisError',\n configurable: true,\n writable: true\n})\n\n// ParserError\n\nfunction ParserError (message, buffer, offset) {\n assert(buffer)\n assert.strictEqual(typeof offset, 'number')\n\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n Error.captureStackTrace(this, this.constructor)\n Error.stackTraceLimit = tmp\n this.offset = offset\n this.buffer = buffer\n}\n\nutil.inherits(ParserError, RedisError)\n\nObject.defineProperty(ParserError.prototype, 'name', {\n value: 'ParserError',\n configurable: true,\n writable: true\n})\n\n// ReplyError\n\nfunction ReplyError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n Error.captureStackTrace(this, this.constructor)\n Error.stackTraceLimit = tmp\n}\n\nutil.inherits(ReplyError, RedisError)\n\nObject.defineProperty(ReplyError.prototype, 'name', {\n value: 'ReplyError',\n configurable: true,\n writable: true\n})\n\n// AbortError\n\nfunction AbortError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n Error.captureStackTrace(this, this.constructor)\n}\n\nutil.inherits(AbortError, RedisError)\n\nObject.defineProperty(AbortError.prototype, 'name', {\n value: 'AbortError',\n configurable: true,\n writable: true\n})\n\n// InterruptError\n\nfunction InterruptError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n Error.captureStackTrace(this, this.constructor)\n}\n\nutil.inherits(InterruptError, AbortError)\n\nObject.defineProperty(InterruptError.prototype, 'name', {\n value: 'InterruptError',\n configurable: true,\n writable: true\n})\n\nmodule.exports = {\n RedisError,\n ParserError,\n ReplyError,\n AbortError,\n InterruptError\n}\n",
9
- "'use strict'\n\nconst assert = require('assert')\n\nclass RedisError extends Error {\n get name () {\n return this.constructor.name\n }\n}\n\nclass ParserError extends RedisError {\n constructor (message, buffer, offset) {\n assert(buffer)\n assert.strictEqual(typeof offset, 'number')\n\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n super(message)\n Error.stackTraceLimit = tmp\n this.offset = offset\n this.buffer = buffer\n }\n\n get name () {\n return this.constructor.name\n }\n}\n\nclass ReplyError extends RedisError {\n constructor (message) {\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n super(message)\n Error.stackTraceLimit = tmp\n }\n get name () {\n return this.constructor.name\n }\n}\n\nclass AbortError extends RedisError {\n get name () {\n return this.constructor.name\n }\n}\n\nclass InterruptError extends AbortError {\n get name () {\n return this.constructor.name\n }\n}\n\nmodule.exports = {\n RedisError,\n ParserError,\n ReplyError,\n AbortError,\n InterruptError\n}\n",
10
- "'use strict'\n\nconst Errors = process.version.charCodeAt(1) < 55 && process.version.charCodeAt(2) === 46\n ? require('./lib/old') // Node.js < 7\n : require('./lib/modern')\n\nmodule.exports = Errors\n",
11
- "/*\n * Copyright 2001-2010 Georges Menie (www.menie.org)\n * Copyright 2010 Salvatore Sanfilippo (adapted to Redis coding style)\n * Copyright 2015 Zihua Li (http://zihua.li) (ported to JavaScript)\n * Copyright 2016 Mike Diarmid (http://github.com/salakar) (re-write for performance, ~700% perf inc)\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of the University of California, Berkeley nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* CRC16 implementation according to CCITT standards.\n *\n * Note by @antirez: this is actually the XMODEM CRC 16 algorithm, using the\n * following parameters:\n *\n * Name : \"XMODEM\", also known as \"ZMODEM\", \"CRC-16/ACORN\"\n * Width : 16 bit\n * Poly : 1021 (That is actually x^16 + x^12 + x^5 + 1)\n * Initialization : 0000\n * Reflect Input byte : False\n * Reflect Output CRC : False\n * Xor constant to output CRC : 0000\n * Output for \"123456789\" : 31C3\n */\n\nvar lookup = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n\n/**\n * Convert a string to a UTF8 array - faster than via buffer\n * @param str\n * @returns {Array}\n */\nvar toUTF8Array = function toUTF8Array(str) {\n var char;\n var i = 0;\n var p = 0;\n var utf8 = [];\n var len = str.length;\n\n for (; i < len; i++) {\n char = str.charCodeAt(i);\n if (char < 128) {\n utf8[p++] = char;\n } else if (char < 2048) {\n utf8[p++] = (char >> 6) | 192;\n utf8[p++] = (char & 63) | 128;\n } else if (\n ((char & 0xFC00) === 0xD800) && (i + 1) < str.length &&\n ((str.charCodeAt(i + 1) & 0xFC00) === 0xDC00)) {\n char = 0x10000 + ((char & 0x03FF) << 10) + (str.charCodeAt(++i) & 0x03FF);\n utf8[p++] = (char >> 18) | 240;\n utf8[p++] = ((char >> 12) & 63) | 128;\n utf8[p++] = ((char >> 6) & 63) | 128;\n utf8[p++] = (char & 63) | 128;\n } else {\n utf8[p++] = (char >> 12) | 224;\n utf8[p++] = ((char >> 6) & 63) | 128;\n utf8[p++] = (char & 63) | 128;\n }\n }\n\n return utf8;\n};\n\n/**\n * Convert a string into a redis slot hash.\n * @param str\n * @returns {number}\n */\nvar generate = module.exports = function generate(str) {\n var char;\n var i = 0;\n var start = -1;\n var result = 0;\n var resultHash = 0;\n var utf8 = typeof str === 'string' ? toUTF8Array(str) : str;\n var len = utf8.length;\n\n while (i < len) {\n char = utf8[i++];\n if (start === -1) {\n if (char === 0x7B) {\n start = i;\n }\n } else if (char !== 0x7D) {\n resultHash = lookup[(char ^ (resultHash >> 8)) & 0xFF] ^ (resultHash << 8);\n } else if (i - 1 !== start) {\n return resultHash & 0x3FFF;\n }\n\n result = lookup[(char ^ (result >> 8)) & 0xFF] ^ (result << 8);\n }\n\n return result & 0x3FFF;\n};\n\n/**\n * Convert an array of multiple strings into a redis slot hash.\n * Returns -1 if one of the keys is not for the same slot as the others\n * @param keys\n * @returns {number}\n */\nmodule.exports.generateMulti = function generateMulti(keys) {\n var i = 1;\n var len = keys.length;\n var base = generate(keys[0]);\n\n while (i < len) {\n if (generate(keys[i++]) !== base) return -1;\n }\n\n return base;\n};\n",
12
- "/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Used by `_.defaults` to customize its `_.assignIn` use.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\nfunction assignInDefaults(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n assignValue(object, key, newValue === undefined ? source[key] : newValue);\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n});\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(args) {\n args.push(undefined, assignInDefaults);\n return apply(assignInWith, undefined, args);\n});\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = defaults;\n",
13
- "/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\nmodule.exports = isArguments;\n",
14
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isArguments = exports.defaults = exports.noop = void 0;\nconst defaults = require(\"lodash.defaults\");\nexports.defaults = defaults;\nconst isArguments = require(\"lodash.isarguments\");\nexports.isArguments = isArguments;\nfunction noop() { }\nexports.noop = noop;\n",
15
- "/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n",
16
- "\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n",
17
- "/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n",
18
- "/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n",
19
- "/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n",
20
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.genRedactedString = exports.getStringValue = exports.MAX_ARGUMENT_LENGTH = void 0;\nconst debug_1 = require(\"debug\");\nconst MAX_ARGUMENT_LENGTH = 200;\nexports.MAX_ARGUMENT_LENGTH = MAX_ARGUMENT_LENGTH;\nconst NAMESPACE_PREFIX = \"ioredis\";\n/**\n * helper function that tried to get a string value for\n * arbitrary \"debug\" arg\n */\nfunction getStringValue(v) {\n if (v === null) {\n return;\n }\n switch (typeof v) {\n case \"boolean\":\n return;\n case \"number\":\n return;\n case \"object\":\n if (Buffer.isBuffer(v)) {\n return v.toString(\"hex\");\n }\n if (Array.isArray(v)) {\n return v.join(\",\");\n }\n try {\n return JSON.stringify(v);\n }\n catch (e) {\n return;\n }\n case \"string\":\n return v;\n }\n}\nexports.getStringValue = getStringValue;\n/**\n * helper function that redacts a string representation of a \"debug\" arg\n */\nfunction genRedactedString(str, maxLen) {\n const { length } = str;\n return length <= maxLen\n ? str\n : str.slice(0, maxLen) + ' ... <REDACTED full-length=\"' + length + '\">';\n}\nexports.genRedactedString = genRedactedString;\n/**\n * a wrapper for the `debug` module, used to generate\n * \"debug functions\" that trim the values in their output\n */\nfunction genDebugFunction(namespace) {\n const fn = (0, debug_1.default)(`${NAMESPACE_PREFIX}:${namespace}`);\n function wrappedDebug(...args) {\n if (!fn.enabled) {\n return; // no-op\n }\n // we skip the first arg because that is the message\n for (let i = 1; i < args.length; i++) {\n const str = getStringValue(args[i]);\n if (typeof str === \"string\" && str.length > MAX_ARGUMENT_LENGTH) {\n args[i] = genRedactedString(str, MAX_ARGUMENT_LENGTH);\n }\n }\n return fn.apply(null, args);\n }\n Object.defineProperties(wrappedDebug, {\n namespace: {\n get() {\n return fn.namespace;\n },\n },\n enabled: {\n get() {\n return fn.enabled;\n },\n },\n destroy: {\n get() {\n return fn.destroy;\n },\n },\n log: {\n get() {\n return fn.log;\n },\n set(l) {\n fn.log = l;\n },\n },\n });\n return wrappedDebug;\n}\nexports.default = genDebugFunction;\n",
21
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * TLS settings for Redis Cloud. Updated on 2022-08-19.\n */\nconst RedisCloudCA = `-----BEGIN CERTIFICATE-----\nMIIDTzCCAjegAwIBAgIJAKSVpiDswLcwMA0GCSqGSIb3DQEBBQUAMD4xFjAUBgNV\nBAoMDUdhcmFudGlhIERhdGExJDAiBgNVBAMMG1NTTCBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTAeFw0xMzEwMDExMjE0NTVaFw0yMzA5MjkxMjE0NTVaMD4xFjAUBgNV\nBAoMDUdhcmFudGlhIERhdGExJDAiBgNVBAMMG1NTTCBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALZqkh/DczWP\nJnxnHLQ7QL0T4B4CDKWBKCcisriGbA6ZePWVNo4hfKQC6JrzfR+081NeD6VcWUiz\nrmd+jtPhIY4c+WVQYm5PKaN6DT1imYdxQw7aqO5j2KUCEh/cznpLxeSHoTxlR34E\nQwF28Wl3eg2vc5ct8LjU3eozWVk3gb7alx9mSA2SgmuX5lEQawl++rSjsBStemY2\nBDwOpAMXIrdEyP/cVn8mkvi/BDs5M5G+09j0gfhyCzRWMQ7Hn71u1eolRxwVxgi3\nTMn+/vTaFSqxKjgck6zuAYjBRPaHe7qLxHNr1So/Mc9nPy+3wHebFwbIcnUojwbp\n4nctkWbjb2cCAwEAAaNQME4wHQYDVR0OBBYEFP1whtcrydmW3ZJeuSoKZIKjze3w\nMB8GA1UdIwQYMBaAFP1whtcrydmW3ZJeuSoKZIKjze3wMAwGA1UdEwQFMAMBAf8w\nDQYJKoZIhvcNAQEFBQADggEBAG2erXhwRAa7+ZOBs0B6X57Hwyd1R4kfmXcs0rta\nlbPpvgULSiB+TCbf3EbhJnHGyvdCY1tvlffLjdA7HJ0PCOn+YYLBA0pTU/dyvrN6\nSu8NuS5yubnt9mb13nDGYo1rnt0YRfxN+8DM3fXIVr038A30UlPX2Ou1ExFJT0MZ\nuFKY6ZvLdI6/1cbgmguMlAhM+DhKyV6Sr5699LM3zqeI816pZmlREETYkGr91q7k\nBpXJu/dtHaGxg1ZGu6w/PCsYGUcECWENYD4VQPd8N32JjOfu6vEgoEAwfPP+3oGp\nZ4m3ewACcWOAenqflb+cQYC4PsF7qbXDmRaWrbKntOlZ3n0=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGMTCCBBmgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwajELMAkGA1UEBhMCVVMx\nCzAJBgNVBAgMAkNBMQswCQYDVQQHDAJDQTESMBAGA1UECgwJUmVkaXNMYWJzMS0w\nKwYDVQQDDCRSZWRpc0xhYnMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN\nMTgwMjI1MTUzNzM3WhcNMjgwMjIzMTUzNzM3WjBfMQswCQYDVQQGEwJVUzELMAkG\nA1UECAwCQ0ExEjAQBgNVBAoMCVJlZGlzTGFiczEvMC0GA1UEAwwmUkNQIEludGVy\nbWVkaWF0ZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQDf9dqbxc8Bq7Ctq9rWcxrGNKKHivqLAFpPq02yLPx6fsOv\nTq7GsDChAYBBc4v7Y2Ap9RD5Vs3dIhEANcnolf27QwrG9RMnnvzk8pCvp1o6zSU4\nVuOE1W66/O1/7e2rVxyrnTcP7UgK43zNIXu7+tiAqWsO92uSnuMoGPGpeaUm1jym\nhjWKtkAwDFSqvHY+XL5qDVBEjeUe+WHkYUg40cAXjusAqgm2hZt29c2wnVrxW25W\nP0meNlzHGFdA2AC5z54iRiqj57dTfBTkHoBczQxcyw6hhzxZQ4e5I5zOKjXXEhZN\nr0tA3YC14CTabKRus/JmZieyZzRgEy2oti64tmLYTqSlAD78pRL40VNoaSYetXLw\nhhNsXCHgWaY6d5bLOc/aIQMAV5oLvZQKvuXAF1IDmhPA+bZbpWipp0zagf1P1H3s\nUzsMdn2KM0ejzgotbtNlj5TcrVwpmvE3ktvUAuA+hi3FkVx1US+2Gsp5x4YOzJ7u\nP1WPk6ShF0JgnJH2ILdj6kttTWwFzH17keSFICWDfH/+kM+k7Y1v3EXMQXE7y0T9\nMjvJskz6d/nv+sQhY04xt64xFMGTnZjlJMzfQNi7zWFLTZnDD0lPowq7l3YiPoTT\nt5Xky83lu0KZsZBo0WlWaDG00gLVdtRgVbcuSWxpi5BdLb1kRab66JptWjxwXQID\nAQABo4HrMIHoMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHBzOi8vcmwtY2Etc2VydmVy\nLnJlZGlzbGFicy5jb20vdjEvY3JsMEYGCCsGAQUFBwEBBDowODA2BggrBgEFBQcw\nAYYqaHR0cHM6Ly9ybC1jYS1zZXJ2ZXIucmVkaXNsYWJzLmNvbS92MS9vY3NwMB0G\nA1UdDgQWBBQHar5OKvQUpP2qWt6mckzToeCOHDAfBgNVHSMEGDAWgBQi42wH6hM4\nL2sujEvLM0/u8lRXTzASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIB\nhjANBgkqhkiG9w0BAQsFAAOCAgEAirEn/iTsAKyhd+pu2W3Z5NjCko4NPU0EYUbr\nAP7+POK2rzjIrJO3nFYQ/LLuC7KCXG+2qwan2SAOGmqWst13Y+WHp44Kae0kaChW\nvcYLXXSoGQGC8QuFSNUdaeg3RbMDYFT04dOkqufeWVccoHVxyTSg9eD8LZuHn5jw\n7QDLiEECBmIJHk5Eeo2TAZrx4Yx6ufSUX5HeVjlAzqwtAqdt99uCJ/EL8bgpWbe+\nXoSpvUv0SEC1I1dCAhCKAvRlIOA6VBcmzg5Am12KzkqTul12/VEFIgzqu0Zy2Jbc\nAUPrYVu/+tOGXQaijy7YgwH8P8n3s7ZeUa1VABJHcxrxYduDDJBLZi+MjheUDaZ1\njQRHYevI2tlqeSBqdPKG4zBY5lS0GiAlmuze5oENt0P3XboHoZPHiqcK3VECgTVh\n/BkJcuudETSJcZDmQ8YfoKfBzRQNg2sv/hwvUv73Ss51Sco8GEt2lD8uEdib1Q6z\nzDT5lXJowSzOD5ZA9OGDjnSRL+2riNtKWKEqvtEG3VBJoBzu9GoxbAc7wIZLxmli\niF5a/Zf5X+UXD3s4TMmy6C4QZJpAA2egsSQCnraWO2ULhh7iXMysSkF/nzVfZn43\niqpaB8++9a37hWq14ZmOv0TJIDz//b2+KC4VFXWQ5W5QC6whsjT+OlG4p5ZYG0jo\n616pxqo=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n\n-----BEGIN CERTIFICATE-----\nMIIEjzCCA3egAwIBAgIQe55B/ALCKJDZtdNT8kD6hTANBgkqhkiG9w0BAQsFADBM\nMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xv\nYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0yMjAxMjYxMjAwMDBaFw0y\nNTAxMjYwMDAwMDBaMFgxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWdu\nIG52LXNhMS4wLAYDVQQDEyVHbG9iYWxTaWduIEF0bGFzIFIzIE9WIFRMUyBDQSAy\nMDIyIFEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmGmg1LW9b7Lf\n8zDD83yBDTEkt+FOxKJZqF4veWc5KZsQj9HfnUS2e5nj/E+JImlGPsQuoiosLuXD\nBVBNAMcUFa11buFMGMeEMwiTmCXoXRrXQmH0qjpOfKgYc5gHG3BsRGaRrf7VR4eg\nofNMG9wUBw4/g/TT7+bQJdA4NfE7Y4d5gEryZiBGB/swaX6Jp/8MF4TgUmOWmalK\ndZCKyb4sPGQFRTtElk67F7vU+wdGcrcOx1tDcIB0ncjLPMnaFicagl+daWGsKqTh\ncounQb6QJtYHa91KvCfKWocMxQ7OIbB5UARLPmC4CJ1/f8YFm35ebfzAeULYdGXu\njE9CLor0OwIDAQABo4IBXzCCAVswDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQG\nCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQW\nBBSH5Zq7a7B/t95GfJWkDBpA8HHqdjAfBgNVHSMEGDAWgBSP8Et/qC5FJK5NUPpj\nmove4t0bvDB7BggrBgEFBQcBAQRvMG0wLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3Nw\nMi5nbG9iYWxzaWduLmNvbS9yb290cjMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9zZWN1\ncmUuZ2xvYmFsc2lnbi5jb20vY2FjZXJ0L3Jvb3QtcjMuY3J0MDYGA1UdHwQvMC0w\nK6ApoCeGJWh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5jb20vcm9vdC1yMy5jcmwwIQYD\nVR0gBBowGDAIBgZngQwBAgIwDAYKKwYBBAGgMgoBAjANBgkqhkiG9w0BAQsFAAOC\nAQEAKRic9/f+nmhQU/wz04APZLjgG5OgsuUOyUEZjKVhNGDwxGTvKhyXGGAMW2B/\n3bRi+aElpXwoxu3pL6fkElbX3B0BeS5LoDtxkyiVEBMZ8m+sXbocwlPyxrPbX6mY\n0rVIvnuUeBH8X0L5IwfpNVvKnBIilTbcebfHyXkPezGwz7E1yhUULjJFm2bt0SdX\ny+4X/WeiiYIv+fTVgZZgl+/2MKIsu/qdBJc3f3TvJ8nz+Eax1zgZmww+RSQWeOj3\n15Iw6Z5FX+NwzY/Ab+9PosR5UosSeq+9HhtaxZttXG1nVh+avYPGYddWmiMT90J5\nZgKnO/Fx2hBgTxhOTMYaD312kg==\n-----END CERTIFICATE-----\n\n-----BEGIN CERTIFICATE-----\nMIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G\nA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp\nZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4\nMTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG\nA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8\nRgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT\ngHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm\nKPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd\nQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ\nXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw\nDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o\nLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU\nRUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp\njjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK\n6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX\nmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs\nMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH\nWD9f\n-----END CERTIFICATE-----`;\nconst TLSProfiles = {\n RedisCloudFixed: { ca: RedisCloudCA },\n RedisCloudFlexible: { ca: RedisCloudCA },\n};\nexports.default = TLSProfiles;\n",
22
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.noop = exports.defaults = exports.Debug = exports.getPackageMeta = exports.zipMap = exports.CONNECTION_CLOSED_ERROR_MSG = exports.shuffle = exports.sample = exports.resolveTLSProfile = exports.parseURL = exports.optimizeErrorStack = exports.toArg = exports.convertMapToArray = exports.convertObjectToArray = exports.timeout = exports.packObject = exports.isInt = exports.wrapMultiResult = exports.convertBufferToString = void 0;\nconst fs_1 = require(\"fs\");\nconst path_1 = require(\"path\");\nconst url_1 = require(\"url\");\nconst lodash_1 = require(\"./lodash\");\nObject.defineProperty(exports, \"defaults\", { enumerable: true, get: function () { return lodash_1.defaults; } });\nObject.defineProperty(exports, \"noop\", { enumerable: true, get: function () { return lodash_1.noop; } });\nconst debug_1 = require(\"./debug\");\nexports.Debug = debug_1.default;\nconst TLSProfiles_1 = require(\"../constants/TLSProfiles\");\n/**\n * Convert a buffer to string, supports buffer array\n *\n * @example\n * ```js\n * const input = [Buffer.from('foo'), [Buffer.from('bar')]]\n * const res = convertBufferToString(input, 'utf8')\n * expect(res).to.eql(['foo', ['bar']])\n * ```\n */\nfunction convertBufferToString(value, encoding) {\n if (value instanceof Buffer) {\n return value.toString(encoding);\n }\n if (Array.isArray(value)) {\n const length = value.length;\n const res = Array(length);\n for (let i = 0; i < length; ++i) {\n res[i] =\n value[i] instanceof Buffer && encoding === \"utf8\"\n ? value[i].toString()\n : convertBufferToString(value[i], encoding);\n }\n return res;\n }\n return value;\n}\nexports.convertBufferToString = convertBufferToString;\n/**\n * Convert a list of results to node-style\n *\n * @example\n * ```js\n * const input = ['a', 'b', new Error('c'), 'd']\n * const output = exports.wrapMultiResult(input)\n * expect(output).to.eql([[null, 'a'], [null, 'b'], [new Error('c')], [null, 'd'])\n * ```\n */\nfunction wrapMultiResult(arr) {\n // When using WATCH/EXEC transactions, the EXEC will return\n // a null instead of an array\n if (!arr) {\n return null;\n }\n const result = [];\n const length = arr.length;\n for (let i = 0; i < length; ++i) {\n const item = arr[i];\n if (item instanceof Error) {\n result.push([item]);\n }\n else {\n result.push([null, item]);\n }\n }\n return result;\n}\nexports.wrapMultiResult = wrapMultiResult;\n/**\n * Detect if the argument is a int\n * @example\n * ```js\n * > isInt('123')\n * true\n * > isInt('123.3')\n * false\n * > isInt('1x')\n * false\n * > isInt(123)\n * true\n * > isInt(true)\n * false\n * ```\n */\nfunction isInt(value) {\n const x = parseFloat(value);\n return !isNaN(value) && (x | 0) === x;\n}\nexports.isInt = isInt;\n/**\n * Pack an array to an Object\n *\n * @example\n * ```js\n * > packObject(['a', 'b', 'c', 'd'])\n * { a: 'b', c: 'd' }\n * ```\n */\nfunction packObject(array) {\n const result = {};\n const length = array.length;\n for (let i = 1; i < length; i += 2) {\n result[array[i - 1]] = array[i];\n }\n return result;\n}\nexports.packObject = packObject;\n/**\n * Return a callback with timeout\n */\nfunction timeout(callback, timeout) {\n let timer = null;\n const run = function () {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n callback.apply(this, arguments);\n }\n };\n timer = setTimeout(run, timeout, new Error(\"timeout\"));\n return run;\n}\nexports.timeout = timeout;\n/**\n * Convert an object to an array\n * @example\n * ```js\n * > convertObjectToArray({ a: '1' })\n * ['a', '1']\n * ```\n */\nfunction convertObjectToArray(obj) {\n const result = [];\n const keys = Object.keys(obj); // Object.entries requires node 7+\n for (let i = 0, l = keys.length; i < l; i++) {\n result.push(keys[i], obj[keys[i]]);\n }\n return result;\n}\nexports.convertObjectToArray = convertObjectToArray;\n/**\n * Convert a map to an array\n * @example\n * ```js\n * > convertMapToArray(new Map([[1, '2']]))\n * [1, '2']\n * ```\n */\nfunction convertMapToArray(map) {\n const result = [];\n let pos = 0;\n map.forEach(function (value, key) {\n result[pos] = key;\n result[pos + 1] = value;\n pos += 2;\n });\n return result;\n}\nexports.convertMapToArray = convertMapToArray;\n/**\n * Convert a non-string arg to a string\n */\nfunction toArg(arg) {\n if (arg === null || typeof arg === \"undefined\") {\n return \"\";\n }\n return String(arg);\n}\nexports.toArg = toArg;\n/**\n * Optimize error stack\n *\n * @param error actually error\n * @param friendlyStack the stack that more meaningful\n * @param filterPath only show stacks with the specified path\n */\nfunction optimizeErrorStack(error, friendlyStack, filterPath) {\n const stacks = friendlyStack.split(\"\\n\");\n let lines = \"\";\n let i;\n for (i = 1; i < stacks.length; ++i) {\n if (stacks[i].indexOf(filterPath) === -1) {\n break;\n }\n }\n for (let j = i; j < stacks.length; ++j) {\n lines += \"\\n\" + stacks[j];\n }\n if (error.stack) {\n const pos = error.stack.indexOf(\"\\n\");\n error.stack = error.stack.slice(0, pos) + lines;\n }\n return error;\n}\nexports.optimizeErrorStack = optimizeErrorStack;\n/**\n * Parse the redis protocol url\n */\nfunction parseURL(url) {\n if (isInt(url)) {\n return { port: url };\n }\n let parsed = (0, url_1.parse)(url, true, true);\n if (!parsed.slashes && url[0] !== \"/\") {\n url = \"//\" + url;\n parsed = (0, url_1.parse)(url, true, true);\n }\n const options = parsed.query || {};\n const result = {};\n if (parsed.auth) {\n const index = parsed.auth.indexOf(\":\");\n result.username = index === -1 ? parsed.auth : parsed.auth.slice(0, index);\n result.password = index === -1 ? \"\" : parsed.auth.slice(index + 1);\n }\n if (parsed.pathname) {\n if (parsed.protocol === \"redis:\" || parsed.protocol === \"rediss:\") {\n if (parsed.pathname.length > 1) {\n result.db = parsed.pathname.slice(1);\n }\n }\n else {\n result.path = parsed.pathname;\n }\n }\n if (parsed.host) {\n result.host = parsed.hostname;\n }\n if (parsed.port) {\n result.port = parsed.port;\n }\n if (typeof options.family === \"string\") {\n const intFamily = Number.parseInt(options.family, 10);\n if (!Number.isNaN(intFamily)) {\n result.family = intFamily;\n }\n }\n (0, lodash_1.defaults)(result, options);\n return result;\n}\nexports.parseURL = parseURL;\n/**\n * Resolve TLS profile shortcut in connection options\n */\nfunction resolveTLSProfile(options) {\n let tls = options === null || options === void 0 ? void 0 : options.tls;\n if (typeof tls === \"string\")\n tls = { profile: tls };\n const profile = TLSProfiles_1.default[tls === null || tls === void 0 ? void 0 : tls.profile];\n if (profile) {\n tls = Object.assign({}, profile, tls);\n delete tls.profile;\n options = Object.assign({}, options, { tls });\n }\n return options;\n}\nexports.resolveTLSProfile = resolveTLSProfile;\n/**\n * Get a random element from `array`\n */\nfunction sample(array, from = 0) {\n const length = array.length;\n if (from >= length) {\n return null;\n }\n return array[from + Math.floor(Math.random() * (length - from))];\n}\nexports.sample = sample;\n/**\n * Shuffle the array using the Fisher-Yates Shuffle.\n * This method will mutate the original array.\n */\nfunction shuffle(array) {\n let counter = array.length;\n // While there are elements in the array\n while (counter > 0) {\n // Pick a random index\n const index = Math.floor(Math.random() * counter);\n // Decrease counter by 1\n counter--;\n // And swap the last element with it\n [array[counter], array[index]] = [array[index], array[counter]];\n }\n return array;\n}\nexports.shuffle = shuffle;\n/**\n * Error message for connection being disconnected\n */\nexports.CONNECTION_CLOSED_ERROR_MSG = \"Connection is closed.\";\nfunction zipMap(keys, values) {\n const map = new Map();\n keys.forEach((key, index) => {\n map.set(key, values[index]);\n });\n return map;\n}\nexports.zipMap = zipMap;\n/**\n * Memoized package metadata to avoid repeated file system reads.\n *\n * @internal\n */\nlet cachedPackageMeta = null;\n/**\n * Retrieves cached package metadata from package.json.\n *\n * @internal\n * @returns {Promise<{version: string} | null>} Package metadata or null if unavailable\n */\nasync function getPackageMeta() {\n if (cachedPackageMeta) {\n return cachedPackageMeta;\n }\n try {\n const filePath = (0, path_1.resolve)(__dirname, \"..\", \"..\", \"package.json\");\n const data = await fs_1.promises.readFile(filePath, \"utf8\");\n const parsed = JSON.parse(data);\n cachedPackageMeta = {\n version: parsed.version,\n };\n return cachedPackageMeta;\n }\n catch (err) {\n cachedPackageMeta = {\n version: \"error-fetching-version\",\n };\n return cachedPackageMeta;\n }\n}\nexports.getPackageMeta = getPackageMeta;\n",
23
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseBlockOption = exports.parseSecondsArgument = void 0;\n/**\n * Parses a command parameter to a number.\n * @param arg - The command parameter to parse (number, string, or Buffer)\n * @returns The parsed number, or undefined if parsing fails or arg is undefined\n */\nconst parseNumberArgument = (arg) => {\n if (typeof arg === \"number\") {\n return arg;\n }\n if (Buffer.isBuffer(arg)) {\n return parseNumberArgument(arg.toString());\n }\n if (typeof arg === \"string\") {\n const value = Number(arg);\n return Number.isFinite(value) ? value : undefined;\n }\n return undefined;\n};\n/**\n * Parses a command parameter to a string.\n * @param arg - The command parameter to parse (string or Buffer)\n * @returns The parsed string, or undefined if arg is not a string/Buffer or is undefined\n */\nconst parseStringArgument = (arg) => {\n if (typeof arg === \"string\") {\n return arg;\n }\n if (Buffer.isBuffer(arg)) {\n return arg.toString();\n }\n return undefined;\n};\n/**\n * Parses a command parameter as seconds and converts to milliseconds.\n * @param arg - The command parameter representing seconds\n * @returns The value in milliseconds, 0 if value is <= 0, or undefined if parsing fails\n */\nconst parseSecondsArgument = (arg) => {\n const value = parseNumberArgument(arg);\n if (value === undefined) {\n return undefined;\n }\n if (value <= 0) {\n return 0;\n }\n return value * 1000;\n};\nexports.parseSecondsArgument = parseSecondsArgument;\n/**\n * Parses the BLOCK option from Redis command arguments (e.g., XREAD, XREADGROUP).\n * @param args - Array of command parameters to search for the BLOCK option\n * @returns The block duration in milliseconds, 0 if duration is <= 0,\n * null if BLOCK option is not found, or undefined if BLOCK is found but duration is invalid\n */\nconst parseBlockOption = (args) => {\n for (let i = 0; i < args.length; i++) {\n const token = parseStringArgument(args[i]);\n if (token && token.toLowerCase() === \"block\") {\n const duration = parseNumberArgument(args[i + 1]);\n if (duration === undefined) {\n return undefined;\n }\n if (duration <= 0) {\n return 0;\n }\n return duration;\n }\n }\n return null;\n};\nexports.parseBlockOption = parseBlockOption;\n",
24
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst calculateSlot = require(\"cluster-key-slot\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst utils_1 = require(\"./utils\");\nconst argumentParsers_1 = require(\"./utils/argumentParsers\");\n/**\n * Command instance\n *\n * It's rare that you need to create a Command instance yourself.\n *\n * ```js\n * var infoCommand = new Command('info', null, function (err, result) {\n * console.log('result', result);\n * });\n *\n * redis.sendCommand(infoCommand);\n *\n * // When no callback provided, Command instance will have a `promise` property,\n * // which will resolve/reject with the result of the command.\n * var getCommand = new Command('get', ['foo']);\n * getCommand.promise.then(function (result) {\n * console.log('result', result);\n * });\n * ```\n */\nclass Command {\n /**\n * Creates an instance of Command.\n * @param name Command name\n * @param args An array of command arguments\n * @param options\n * @param callback The callback that handles the response.\n * If omit, the response will be handled via Promise\n */\n constructor(name, args = [], options = {}, callback) {\n this.name = name;\n this.inTransaction = false;\n this.isResolved = false;\n this.transformed = false;\n this.replyEncoding = options.replyEncoding;\n this.errorStack = options.errorStack;\n this.args = args.flat();\n this.callback = callback;\n this.initPromise();\n if (options.keyPrefix) {\n // @ts-expect-error\n const isBufferKeyPrefix = options.keyPrefix instanceof Buffer;\n // @ts-expect-error\n let keyPrefixBuffer = isBufferKeyPrefix\n ? options.keyPrefix\n : null;\n this._iterateKeys((key) => {\n if (key instanceof Buffer) {\n if (keyPrefixBuffer === null) {\n keyPrefixBuffer = Buffer.from(options.keyPrefix);\n }\n return Buffer.concat([keyPrefixBuffer, key]);\n }\n else if (isBufferKeyPrefix) {\n // @ts-expect-error\n return Buffer.concat([options.keyPrefix, Buffer.from(String(key))]);\n }\n return options.keyPrefix + key;\n });\n }\n if (options.readOnly) {\n this.isReadOnly = true;\n }\n }\n /**\n * Check whether the command has the flag\n */\n static checkFlag(flagName, commandName) {\n commandName = commandName.toLowerCase();\n return !!this.getFlagMap()[flagName][commandName];\n }\n static setArgumentTransformer(name, func) {\n this._transformer.argument[name] = func;\n }\n static setReplyTransformer(name, func) {\n this._transformer.reply[name] = func;\n }\n static getFlagMap() {\n if (!this.flagMap) {\n this.flagMap = Object.keys(Command.FLAGS).reduce((map, flagName) => {\n map[flagName] = {};\n Command.FLAGS[flagName].forEach((commandName) => {\n map[flagName][commandName] = true;\n });\n return map;\n }, {});\n }\n return this.flagMap;\n }\n getSlot() {\n if (typeof this.slot === \"undefined\") {\n const key = this.getKeys()[0];\n this.slot = key == null ? null : calculateSlot(key);\n }\n return this.slot;\n }\n getKeys() {\n return this._iterateKeys();\n }\n /**\n * Convert command to writable buffer or string\n */\n toWritable(_socket) {\n let result;\n const commandStr = \"*\" +\n (this.args.length + 1) +\n \"\\r\\n$\" +\n Buffer.byteLength(this.name) +\n \"\\r\\n\" +\n this.name +\n \"\\r\\n\";\n if (this.bufferMode) {\n const buffers = new MixedBuffers();\n buffers.push(commandStr);\n for (let i = 0; i < this.args.length; ++i) {\n const arg = this.args[i];\n if (arg instanceof Buffer) {\n if (arg.length === 0) {\n buffers.push(\"$0\\r\\n\\r\\n\");\n }\n else {\n buffers.push(\"$\" + arg.length + \"\\r\\n\");\n buffers.push(arg);\n buffers.push(\"\\r\\n\");\n }\n }\n else {\n buffers.push(\"$\" +\n Buffer.byteLength(arg) +\n \"\\r\\n\" +\n arg +\n \"\\r\\n\");\n }\n }\n result = buffers.toBuffer();\n }\n else {\n result = commandStr;\n for (let i = 0; i < this.args.length; ++i) {\n const arg = this.args[i];\n result +=\n \"$\" +\n Buffer.byteLength(arg) +\n \"\\r\\n\" +\n arg +\n \"\\r\\n\";\n }\n }\n return result;\n }\n stringifyArguments() {\n for (let i = 0; i < this.args.length; ++i) {\n const arg = this.args[i];\n if (typeof arg === \"string\") {\n // buffers and strings don't need any transformation\n }\n else if (arg instanceof Buffer) {\n this.bufferMode = true;\n }\n else {\n this.args[i] = (0, utils_1.toArg)(arg);\n }\n }\n }\n /**\n * Convert buffer/buffer[] to string/string[],\n * and apply reply transformer.\n */\n transformReply(result) {\n if (this.replyEncoding) {\n result = (0, utils_1.convertBufferToString)(result, this.replyEncoding);\n }\n const transformer = Command._transformer.reply[this.name];\n if (transformer) {\n result = transformer(result);\n }\n return result;\n }\n /**\n * Set the wait time before terminating the attempt to execute a command\n * and generating an error.\n */\n setTimeout(ms) {\n if (!this._commandTimeoutTimer) {\n this._commandTimeoutTimer = setTimeout(() => {\n if (!this.isResolved) {\n this.reject(new Error(\"Command timed out\"));\n }\n }, ms);\n }\n }\n /**\n * Set a timeout for blocking commands.\n * When the timeout expires, the command resolves with null (matching Redis behavior).\n * This handles the case of undetectable network failures (e.g., docker network disconnect)\n * where the TCP connection becomes a zombie and no close event fires.\n */\n setBlockingTimeout(ms) {\n if (ms <= 0) {\n return;\n }\n // Clear existing timer if any (can happen when command moves from offline to command queue)\n if (this._blockingTimeoutTimer) {\n clearTimeout(this._blockingTimeoutTimer);\n this._blockingTimeoutTimer = undefined;\n }\n const now = Date.now();\n // First call: establish absolute deadline\n if (this._blockingDeadline === undefined) {\n this._blockingDeadline = now + ms;\n }\n // Check if we've already exceeded the deadline\n const remaining = this._blockingDeadline - now;\n if (remaining <= 0) {\n // Resolve with null to indicate timeout (same as Redis behavior)\n this.resolve(null);\n return;\n }\n this._blockingTimeoutTimer = setTimeout(() => {\n if (this.isResolved) {\n this._blockingTimeoutTimer = undefined;\n return;\n }\n this._blockingTimeoutTimer = undefined;\n // Timeout expired - resolve with null (same as Redis behavior when blocking command times out)\n this.resolve(null);\n }, remaining);\n }\n /**\n * Extract the blocking timeout from the command arguments.\n *\n * @returns The timeout in seconds, null for indefinite blocking (timeout of 0),\n * or undefined if this is not a blocking command\n */\n extractBlockingTimeout() {\n const args = this.args;\n if (!args || args.length === 0) {\n return undefined;\n }\n const name = this.name.toLowerCase();\n if (Command.checkFlag(\"LAST_ARG_TIMEOUT_COMMANDS\", name)) {\n return (0, argumentParsers_1.parseSecondsArgument)(args[args.length - 1]);\n }\n if (Command.checkFlag(\"FIRST_ARG_TIMEOUT_COMMANDS\", name)) {\n return (0, argumentParsers_1.parseSecondsArgument)(args[0]);\n }\n if (Command.checkFlag(\"BLOCK_OPTION_COMMANDS\", name)) {\n return (0, argumentParsers_1.parseBlockOption)(args);\n }\n return undefined;\n }\n /**\n * Clear the command and blocking timers\n */\n _clearTimers() {\n const existingTimer = this._commandTimeoutTimer;\n if (existingTimer) {\n clearTimeout(existingTimer);\n delete this._commandTimeoutTimer;\n }\n const blockingTimer = this._blockingTimeoutTimer;\n if (blockingTimer) {\n clearTimeout(blockingTimer);\n delete this._blockingTimeoutTimer;\n }\n }\n initPromise() {\n const promise = new Promise((resolve, reject) => {\n if (!this.transformed) {\n this.transformed = true;\n const transformer = Command._transformer.argument[this.name];\n if (transformer) {\n this.args = transformer(this.args);\n }\n this.stringifyArguments();\n }\n this.resolve = this._convertValue(resolve);\n this.reject = (err) => {\n this._clearTimers();\n if (this.errorStack) {\n reject((0, utils_1.optimizeErrorStack)(err, this.errorStack.stack, __dirname));\n }\n else {\n reject(err);\n }\n };\n });\n this.promise = (0, standard_as_callback_1.default)(promise, this.callback);\n }\n /**\n * Iterate through the command arguments that are considered keys.\n */\n _iterateKeys(transform = (key) => key) {\n if (typeof this.keys === \"undefined\") {\n this.keys = [];\n if ((0, commands_1.exists)(this.name, { caseInsensitive: true })) {\n // @ts-expect-error\n const keyIndexes = (0, commands_1.getKeyIndexes)(this.name, this.args, {\n nameCaseInsensitive: true,\n });\n for (const index of keyIndexes) {\n this.args[index] = transform(this.args[index]);\n this.keys.push(this.args[index]);\n }\n }\n }\n return this.keys;\n }\n /**\n * Convert the value from buffer to the target encoding.\n */\n _convertValue(resolve) {\n return (value) => {\n try {\n this._clearTimers();\n resolve(this.transformReply(value));\n this.isResolved = true;\n }\n catch (err) {\n this.reject(err);\n }\n return this.promise;\n };\n }\n}\nexports.default = Command;\nCommand.FLAGS = {\n VALID_IN_SUBSCRIBER_MODE: [\n \"subscribe\",\n \"psubscribe\",\n \"unsubscribe\",\n \"punsubscribe\",\n \"ssubscribe\",\n \"sunsubscribe\",\n \"ping\",\n \"quit\",\n ],\n VALID_IN_MONITOR_MODE: [\"monitor\", \"auth\"],\n ENTER_SUBSCRIBER_MODE: [\"subscribe\", \"psubscribe\", \"ssubscribe\"],\n EXIT_SUBSCRIBER_MODE: [\"unsubscribe\", \"punsubscribe\", \"sunsubscribe\"],\n WILL_DISCONNECT: [\"quit\"],\n HANDSHAKE_COMMANDS: [\"auth\", \"select\", \"client\", \"readonly\", \"info\"],\n IGNORE_RECONNECT_ON_ERROR: [\"client\"],\n BLOCKING_COMMANDS: [\n \"blpop\",\n \"brpop\",\n \"brpoplpush\",\n \"blmove\",\n \"bzpopmin\",\n \"bzpopmax\",\n \"bzmpop\",\n \"blmpop\",\n \"xread\",\n \"xreadgroup\",\n ],\n LAST_ARG_TIMEOUT_COMMANDS: [\n \"blpop\",\n \"brpop\",\n \"brpoplpush\",\n \"blmove\",\n \"bzpopmin\",\n \"bzpopmax\",\n ],\n FIRST_ARG_TIMEOUT_COMMANDS: [\"bzmpop\", \"blmpop\"],\n BLOCK_OPTION_COMMANDS: [\"xread\", \"xreadgroup\"],\n};\nCommand._transformer = {\n argument: {},\n reply: {},\n};\nconst msetArgumentTransformer = function (args) {\n if (args.length === 1) {\n if (args[0] instanceof Map) {\n return (0, utils_1.convertMapToArray)(args[0]);\n }\n if (typeof args[0] === \"object\" && args[0] !== null) {\n return (0, utils_1.convertObjectToArray)(args[0]);\n }\n }\n return args;\n};\nconst hsetArgumentTransformer = function (args) {\n if (args.length === 2) {\n if (args[1] instanceof Map) {\n return [args[0]].concat((0, utils_1.convertMapToArray)(args[1]));\n }\n if (typeof args[1] === \"object\" && args[1] !== null) {\n return [args[0]].concat((0, utils_1.convertObjectToArray)(args[1]));\n }\n }\n return args;\n};\nCommand.setArgumentTransformer(\"mset\", msetArgumentTransformer);\nCommand.setArgumentTransformer(\"msetnx\", msetArgumentTransformer);\nCommand.setArgumentTransformer(\"hset\", hsetArgumentTransformer);\nCommand.setArgumentTransformer(\"hmset\", hsetArgumentTransformer);\nCommand.setReplyTransformer(\"hgetall\", function (result) {\n if (Array.isArray(result)) {\n const obj = {};\n for (let i = 0; i < result.length; i += 2) {\n const key = result[i];\n const value = result[i + 1];\n if (key in obj) {\n // can only be truthy if the property is special somehow, like '__proto__' or 'constructor'\n // https://github.com/luin/ioredis/issues/1267\n Object.defineProperty(obj, key, {\n value,\n configurable: true,\n enumerable: true,\n writable: true,\n });\n }\n else {\n obj[key] = value;\n }\n }\n return obj;\n }\n return result;\n});\nclass MixedBuffers {\n constructor() {\n this.length = 0;\n this.items = [];\n }\n push(x) {\n this.length += Buffer.byteLength(x);\n this.items.push(x);\n }\n toBuffer() {\n const result = Buffer.allocUnsafe(this.length);\n let offset = 0;\n for (const item of this.items) {\n const length = Buffer.byteLength(item);\n Buffer.isBuffer(item)\n ? item.copy(result, offset)\n : result.write(item, offset, length);\n offset += length;\n }\n return result;\n }\n}\n",
25
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst redis_errors_1 = require(\"redis-errors\");\nclass ClusterAllFailedError extends redis_errors_1.RedisError {\n constructor(message, lastNodeError) {\n super(message);\n this.lastNodeError = lastNodeError;\n Error.captureStackTrace(this, this.constructor);\n }\n get name() {\n return this.constructor.name;\n }\n}\nexports.default = ClusterAllFailedError;\nClusterAllFailedError.defaultMessage = \"Failed to refresh slots cache.\";\n",
26
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\n/**\n * Convenient class to convert the process of scanning keys to a readable stream.\n */\nclass ScanStream extends stream_1.Readable {\n constructor(opt) {\n super(opt);\n this.opt = opt;\n this._redisCursor = \"0\";\n this._redisDrained = false;\n }\n _read() {\n if (this._redisDrained) {\n this.push(null);\n return;\n }\n const args = [this._redisCursor];\n if (this.opt.key) {\n args.unshift(this.opt.key);\n }\n if (this.opt.match) {\n args.push(\"MATCH\", this.opt.match);\n }\n if (this.opt.type) {\n args.push(\"TYPE\", this.opt.type);\n }\n if (this.opt.count) {\n args.push(\"COUNT\", String(this.opt.count));\n }\n if (this.opt.noValues) {\n args.push(\"NOVALUES\");\n }\n this.opt.redis[this.opt.command](args, (err, res) => {\n if (err) {\n this.emit(\"error\", err);\n return;\n }\n this._redisCursor = res[0] instanceof Buffer ? res[0].toString() : res[0];\n if (this._redisCursor === \"0\") {\n this._redisDrained = true;\n }\n this.push(res[1]);\n });\n }\n close() {\n this._redisDrained = true;\n }\n}\nexports.default = ScanStream;\n",
27
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.executeWithAutoPipelining = exports.getFirstValueInFlattenedArray = exports.shouldUseAutoPipelining = exports.notAllowedAutoPipelineCommands = exports.kCallbacks = exports.kExec = void 0;\nconst lodash_1 = require(\"./utils/lodash\");\nconst calculateSlot = require(\"cluster-key-slot\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nexports.kExec = Symbol(\"exec\");\nexports.kCallbacks = Symbol(\"callbacks\");\nexports.notAllowedAutoPipelineCommands = [\n \"auth\",\n \"info\",\n \"script\",\n \"quit\",\n \"cluster\",\n \"pipeline\",\n \"multi\",\n \"subscribe\",\n \"psubscribe\",\n \"unsubscribe\",\n \"unpsubscribe\",\n \"select\",\n \"client\",\n];\nfunction executeAutoPipeline(client, slotKey) {\n /*\n If a pipeline is already executing, keep queueing up commands\n since ioredis won't serve two pipelines at the same time\n */\n if (client._runningAutoPipelines.has(slotKey)) {\n return;\n }\n if (!client._autoPipelines.has(slotKey)) {\n /*\n Rare edge case. Somehow, something has deleted this running autopipeline in an immediate\n call to executeAutoPipeline.\n \n Maybe the callback in the pipeline.exec is sometimes called in the same tick,\n e.g. if redis is disconnected?\n */\n return;\n }\n client._runningAutoPipelines.add(slotKey);\n // Get the pipeline and immediately delete it so that new commands are queued on a new pipeline\n const pipeline = client._autoPipelines.get(slotKey);\n client._autoPipelines.delete(slotKey);\n const callbacks = pipeline[exports.kCallbacks];\n // Stop keeping a reference to callbacks immediately after the callbacks stop being used.\n // This allows the GC to reclaim objects referenced by callbacks, especially with 16384 slots\n // in Redis.Cluster\n pipeline[exports.kCallbacks] = null;\n // Perform the call\n pipeline.exec(function (err, results) {\n client._runningAutoPipelines.delete(slotKey);\n /*\n Invoke all callback in nextTick so the stack is cleared\n and callbacks can throw errors without affecting other callbacks.\n */\n if (err) {\n for (let i = 0; i < callbacks.length; i++) {\n process.nextTick(callbacks[i], err);\n }\n }\n else {\n for (let i = 0; i < callbacks.length; i++) {\n process.nextTick(callbacks[i], ...results[i]);\n }\n }\n // If there is another pipeline on the same node, immediately execute it without waiting for nextTick\n if (client._autoPipelines.has(slotKey)) {\n executeAutoPipeline(client, slotKey);\n }\n });\n}\nfunction shouldUseAutoPipelining(client, functionName, commandName) {\n return (functionName &&\n client.options.enableAutoPipelining &&\n !client.isPipeline &&\n !exports.notAllowedAutoPipelineCommands.includes(commandName) &&\n !client.options.autoPipeliningIgnoredCommands.includes(commandName));\n}\nexports.shouldUseAutoPipelining = shouldUseAutoPipelining;\nfunction getFirstValueInFlattenedArray(args) {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (typeof arg === \"string\") {\n return arg;\n }\n else if (Array.isArray(arg) || (0, lodash_1.isArguments)(arg)) {\n if (arg.length === 0) {\n continue;\n }\n return arg[0];\n }\n const flattened = [arg].flat();\n if (flattened.length > 0) {\n return flattened[0];\n }\n }\n return undefined;\n}\nexports.getFirstValueInFlattenedArray = getFirstValueInFlattenedArray;\nfunction executeWithAutoPipelining(client, functionName, commandName, args, callback) {\n // On cluster mode let's wait for slots to be available\n if (client.isCluster && !client.slots.length) {\n if (client.status === \"wait\")\n client.connect().catch(lodash_1.noop);\n return (0, standard_as_callback_1.default)(new Promise(function (resolve, reject) {\n client.delayUntilReady((err) => {\n if (err) {\n reject(err);\n return;\n }\n executeWithAutoPipelining(client, functionName, commandName, args, null).then(resolve, reject);\n });\n }), callback);\n }\n // If we have slot information, we can improve routing by grouping slots served by the same subset of nodes\n // Note that the first value in args may be a (possibly empty) array.\n // ioredis will only flatten one level of the array, in the Command constructor.\n const prefix = client.options.keyPrefix || \"\";\n const slotKey = client.isCluster\n ? client.slots[calculateSlot(`${prefix}${getFirstValueInFlattenedArray(args)}`)].join(\",\")\n : \"main\";\n if (!client._autoPipelines.has(slotKey)) {\n const pipeline = client.pipeline();\n pipeline[exports.kExec] = false;\n pipeline[exports.kCallbacks] = [];\n client._autoPipelines.set(slotKey, pipeline);\n }\n const pipeline = client._autoPipelines.get(slotKey);\n /*\n Mark the pipeline as scheduled.\n The symbol will make sure that the pipeline is only scheduled once per tick.\n New commands are appended to an already scheduled pipeline.\n */\n if (!pipeline[exports.kExec]) {\n pipeline[exports.kExec] = true;\n /*\n Deferring with setImmediate so we have a chance to capture multiple\n commands that can be scheduled by I/O events already in the event loop queue.\n */\n setImmediate(executeAutoPipeline, client, slotKey);\n }\n // Create the promise which will execute the command in the pipeline.\n const autoPipelinePromise = new Promise(function (resolve, reject) {\n pipeline[exports.kCallbacks].push(function (err, value) {\n if (err) {\n reject(err);\n return;\n }\n resolve(value);\n });\n if (functionName === \"call\") {\n args.unshift(commandName);\n }\n pipeline[functionName](...args);\n });\n return (0, standard_as_callback_1.default)(autoPipelinePromise, callback);\n}\nexports.executeWithAutoPipelining = executeWithAutoPipelining;\n",
28
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nconst Command_1 = require(\"./Command\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nclass Script {\n constructor(lua, numberOfKeys = null, keyPrefix = \"\", readOnly = false) {\n this.lua = lua;\n this.numberOfKeys = numberOfKeys;\n this.keyPrefix = keyPrefix;\n this.readOnly = readOnly;\n this.sha = (0, crypto_1.createHash)(\"sha1\").update(lua).digest(\"hex\");\n const sha = this.sha;\n const socketHasScriptLoaded = new WeakSet();\n this.Command = class CustomScriptCommand extends Command_1.default {\n toWritable(socket) {\n const origReject = this.reject;\n this.reject = (err) => {\n if (err.message.indexOf(\"NOSCRIPT\") !== -1) {\n socketHasScriptLoaded.delete(socket);\n }\n origReject.call(this, err);\n };\n if (!socketHasScriptLoaded.has(socket)) {\n socketHasScriptLoaded.add(socket);\n this.name = \"eval\";\n this.args[0] = lua;\n }\n else if (this.name === \"eval\") {\n this.name = \"evalsha\";\n this.args[0] = sha;\n }\n return super.toWritable(socket);\n }\n };\n }\n execute(container, args, options, callback) {\n if (typeof this.numberOfKeys === \"number\") {\n args.unshift(this.numberOfKeys);\n }\n if (this.keyPrefix) {\n options.keyPrefix = this.keyPrefix;\n }\n if (this.readOnly) {\n options.readOnly = true;\n }\n const evalsha = new this.Command(\"evalsha\", [this.sha, ...args], options);\n evalsha.promise = evalsha.promise.catch((err) => {\n if (err.message.indexOf(\"NOSCRIPT\") === -1) {\n throw err;\n }\n // Resend the same custom evalsha command that gets transformed\n // to an eval in case it's not loaded yet on the connection.\n const resend = new this.Command(\"evalsha\", [this.sha, ...args], options);\n const client = container.isPipeline ? container.redis : container;\n return client.sendCommand(resend);\n });\n (0, standard_as_callback_1.default)(evalsha.promise, callback);\n return container.sendCommand(evalsha);\n }\n}\nexports.default = Script;\n",
29
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst autoPipelining_1 = require(\"../autoPipelining\");\nconst Command_1 = require(\"../Command\");\nconst Script_1 = require(\"../Script\");\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nclass Commander {\n constructor() {\n this.options = {};\n /**\n * @ignore\n */\n this.scriptsSet = {};\n /**\n * @ignore\n */\n this.addedBuiltinSet = new Set();\n }\n /**\n * Return supported builtin commands\n */\n getBuiltinCommands() {\n return commands.slice(0);\n }\n /**\n * Create a builtin command\n */\n createBuiltinCommand(commandName) {\n return {\n string: generateFunction(null, commandName, \"utf8\"),\n buffer: generateFunction(null, commandName, null),\n };\n }\n /**\n * Create add builtin command\n */\n addBuiltinCommand(commandName) {\n this.addedBuiltinSet.add(commandName);\n this[commandName] = generateFunction(commandName, commandName, \"utf8\");\n this[commandName + \"Buffer\"] = generateFunction(commandName + \"Buffer\", commandName, null);\n }\n /**\n * Define a custom command using lua script\n */\n defineCommand(name, definition) {\n const script = new Script_1.default(definition.lua, definition.numberOfKeys, this.options.keyPrefix, definition.readOnly);\n this.scriptsSet[name] = script;\n this[name] = generateScriptingFunction(name, name, script, \"utf8\");\n this[name + \"Buffer\"] = generateScriptingFunction(name + \"Buffer\", name, script, null);\n }\n /**\n * @ignore\n */\n sendCommand(command, stream, node) {\n throw new Error('\"sendCommand\" is not implemented');\n }\n}\nconst commands = commands_1.list.filter((command) => command !== \"monitor\");\ncommands.push(\"sentinel\");\ncommands.forEach(function (commandName) {\n Commander.prototype[commandName] = generateFunction(commandName, commandName, \"utf8\");\n Commander.prototype[commandName + \"Buffer\"] = generateFunction(commandName + \"Buffer\", commandName, null);\n});\nCommander.prototype.call = generateFunction(\"call\", \"utf8\");\nCommander.prototype.callBuffer = generateFunction(\"callBuffer\", null);\n// @ts-expect-error\nCommander.prototype.send_command = Commander.prototype.call;\nfunction generateFunction(functionName, _commandName, _encoding) {\n if (typeof _encoding === \"undefined\") {\n _encoding = _commandName;\n _commandName = null;\n }\n return function (...args) {\n const commandName = (_commandName || args.shift());\n let callback = args[args.length - 1];\n if (typeof callback === \"function\") {\n args.pop();\n }\n else {\n callback = undefined;\n }\n const options = {\n errorStack: this.options.showFriendlyErrorStack ? new Error() : undefined,\n keyPrefix: this.options.keyPrefix,\n replyEncoding: _encoding,\n };\n // No auto pipeline, use regular command sending\n if (!(0, autoPipelining_1.shouldUseAutoPipelining)(this, functionName, commandName)) {\n return this.sendCommand(\n // @ts-expect-error\n new Command_1.default(commandName, args, options, callback));\n }\n // Create a new pipeline and make sure it's scheduled\n return (0, autoPipelining_1.executeWithAutoPipelining)(this, functionName, commandName, \n // @ts-expect-error\n args, callback);\n };\n}\nfunction generateScriptingFunction(functionName, commandName, script, encoding) {\n return function (...args) {\n const callback = typeof args[args.length - 1] === \"function\" ? args.pop() : undefined;\n const options = {\n replyEncoding: encoding,\n };\n if (this.options.showFriendlyErrorStack) {\n options.errorStack = new Error();\n }\n // No auto pipeline, use regular command sending\n if (!(0, autoPipelining_1.shouldUseAutoPipelining)(this, functionName, commandName)) {\n return script.execute(this, args, options, callback);\n }\n // Create a new pipeline and make sure it's scheduled\n return (0, autoPipelining_1.executeWithAutoPipelining)(this, functionName, commandName, args, callback);\n };\n}\nexports.default = Commander;\n",
30
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst calculateSlot = require(\"cluster-key-slot\");\nconst commands_1 = require(\"@ioredis/commands\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst util_1 = require(\"util\");\nconst Command_1 = require(\"./Command\");\nconst utils_1 = require(\"./utils\");\nconst Commander_1 = require(\"./utils/Commander\");\n/*\n This function derives from the cluster-key-slot implementation.\n Instead of checking that all keys have the same slot, it checks that all slots are served by the same set of nodes.\n If this is satisfied, it returns the first key's slot.\n*/\nfunction generateMultiWithNodes(redis, keys) {\n const slot = calculateSlot(keys[0]);\n const target = redis._groupsBySlot[slot];\n for (let i = 1; i < keys.length; i++) {\n if (redis._groupsBySlot[calculateSlot(keys[i])] !== target) {\n return -1;\n }\n }\n return slot;\n}\nclass Pipeline extends Commander_1.default {\n constructor(redis) {\n super();\n this.redis = redis;\n this.isPipeline = true;\n this.replyPending = 0;\n this._queue = [];\n this._result = [];\n this._transactions = 0;\n this._shaToScript = {};\n this.isCluster =\n this.redis.constructor.name === \"Cluster\" || this.redis.isCluster;\n this.options = redis.options;\n Object.keys(redis.scriptsSet).forEach((name) => {\n const script = redis.scriptsSet[name];\n this._shaToScript[script.sha] = script;\n this[name] = redis[name];\n this[name + \"Buffer\"] = redis[name + \"Buffer\"];\n });\n redis.addedBuiltinSet.forEach((name) => {\n this[name] = redis[name];\n this[name + \"Buffer\"] = redis[name + \"Buffer\"];\n });\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n const _this = this;\n Object.defineProperty(this, \"length\", {\n get: function () {\n return _this._queue.length;\n },\n });\n }\n fillResult(value, position) {\n if (this._queue[position].name === \"exec\" && Array.isArray(value[1])) {\n const execLength = value[1].length;\n for (let i = 0; i < execLength; i++) {\n if (value[1][i] instanceof Error) {\n continue;\n }\n const cmd = this._queue[position - (execLength - i)];\n try {\n value[1][i] = cmd.transformReply(value[1][i]);\n }\n catch (err) {\n value[1][i] = err;\n }\n }\n }\n this._result[position] = value;\n if (--this.replyPending) {\n return;\n }\n if (this.isCluster) {\n let retriable = true;\n let commonError;\n for (let i = 0; i < this._result.length; ++i) {\n const error = this._result[i][0];\n const command = this._queue[i];\n if (error) {\n if (command.name === \"exec\" &&\n error.message ===\n \"EXECABORT Transaction discarded because of previous errors.\") {\n continue;\n }\n if (!commonError) {\n commonError = {\n name: error.name,\n message: error.message,\n };\n }\n else if (commonError.name !== error.name ||\n commonError.message !== error.message) {\n retriable = false;\n break;\n }\n }\n else if (!command.inTransaction) {\n const isReadOnly = (0, commands_1.exists)(command.name, { caseInsensitive: true }) &&\n (0, commands_1.hasFlag)(command.name, \"readonly\", { nameCaseInsensitive: true });\n if (!isReadOnly) {\n retriable = false;\n break;\n }\n }\n }\n if (commonError && retriable) {\n const _this = this;\n const errv = commonError.message.split(\" \");\n const queue = this._queue;\n let inTransaction = false;\n this._queue = [];\n for (let i = 0; i < queue.length; ++i) {\n if (errv[0] === \"ASK\" &&\n !inTransaction &&\n queue[i].name !== \"asking\" &&\n (!queue[i - 1] || queue[i - 1].name !== \"asking\")) {\n const asking = new Command_1.default(\"asking\");\n asking.ignore = true;\n this.sendCommand(asking);\n }\n queue[i].initPromise();\n this.sendCommand(queue[i]);\n inTransaction = queue[i].inTransaction;\n }\n let matched = true;\n if (typeof this.leftRedirections === \"undefined\") {\n this.leftRedirections = {};\n }\n const exec = function () {\n _this.exec();\n };\n const cluster = this.redis;\n cluster.handleError(commonError, this.leftRedirections, {\n moved: function (_slot, key) {\n _this.preferKey = key;\n cluster.slots[errv[1]] = [key];\n cluster._groupsBySlot[errv[1]] =\n cluster._groupsIds[cluster.slots[errv[1]].join(\";\")];\n cluster.refreshSlotsCache();\n _this.exec();\n },\n ask: function (_slot, key) {\n _this.preferKey = key;\n _this.exec();\n },\n tryagain: exec,\n clusterDown: exec,\n connectionClosed: exec,\n maxRedirections: () => {\n matched = false;\n },\n defaults: () => {\n matched = false;\n },\n });\n if (matched) {\n return;\n }\n }\n }\n let ignoredCount = 0;\n for (let i = 0; i < this._queue.length - ignoredCount; ++i) {\n if (this._queue[i + ignoredCount].ignore) {\n ignoredCount += 1;\n }\n this._result[i] = this._result[i + ignoredCount];\n }\n this.resolve(this._result.slice(0, this._result.length - ignoredCount));\n }\n sendCommand(command) {\n if (this._transactions > 0) {\n command.inTransaction = true;\n }\n const position = this._queue.length;\n command.pipelineIndex = position;\n command.promise\n .then((result) => {\n this.fillResult([null, result], position);\n })\n .catch((error) => {\n this.fillResult([error], position);\n });\n this._queue.push(command);\n return this;\n }\n addBatch(commands) {\n let command, commandName, args;\n for (let i = 0; i < commands.length; ++i) {\n command = commands[i];\n commandName = command[0];\n args = command.slice(1);\n this[commandName].apply(this, args);\n }\n return this;\n }\n}\nexports.default = Pipeline;\n// @ts-expect-error\nconst multi = Pipeline.prototype.multi;\n// @ts-expect-error\nPipeline.prototype.multi = function () {\n this._transactions += 1;\n return multi.apply(this, arguments);\n};\n// @ts-expect-error\nconst execBuffer = Pipeline.prototype.execBuffer;\n// @ts-expect-error\nPipeline.prototype.execBuffer = (0, util_1.deprecate)(function () {\n if (this._transactions > 0) {\n this._transactions -= 1;\n }\n return execBuffer.apply(this, arguments);\n}, \"Pipeline#execBuffer: Use Pipeline#exec instead\");\n// NOTE: To avoid an unhandled promise rejection, this will unconditionally always return this.promise,\n// which always has the rejection handled by standard-as-callback\n// adding the provided rejection callback.\n//\n// If a different promise instance were returned, that promise would cause its own unhandled promise rejection\n// errors, even if that promise unconditionally resolved to **the resolved value of** this.promise.\nPipeline.prototype.exec = function (callback) {\n // Wait for the cluster to be connected, since we need nodes information before continuing\n if (this.isCluster && !this.redis.slots.length) {\n if (this.redis.status === \"wait\")\n this.redis.connect().catch(utils_1.noop);\n if (callback && !this.nodeifiedPromise) {\n this.nodeifiedPromise = true;\n (0, standard_as_callback_1.default)(this.promise, callback);\n }\n this.redis.delayUntilReady((err) => {\n if (err) {\n this.reject(err);\n return;\n }\n this.exec(callback);\n });\n return this.promise;\n }\n if (this._transactions > 0) {\n this._transactions -= 1;\n return execBuffer.apply(this, arguments);\n }\n if (!this.nodeifiedPromise) {\n this.nodeifiedPromise = true;\n (0, standard_as_callback_1.default)(this.promise, callback);\n }\n if (!this._queue.length) {\n this.resolve([]);\n }\n let pipelineSlot;\n if (this.isCluster) {\n // List of the first key for each command\n const sampleKeys = [];\n for (let i = 0; i < this._queue.length; i++) {\n const keys = this._queue[i].getKeys();\n if (keys.length) {\n sampleKeys.push(keys[0]);\n }\n // For each command, check that the keys belong to the same slot\n if (keys.length && calculateSlot.generateMulti(keys) < 0) {\n this.reject(new Error(\"All the keys in a pipeline command should belong to the same slot\"));\n return this.promise;\n }\n }\n if (sampleKeys.length) {\n pipelineSlot = generateMultiWithNodes(this.redis, sampleKeys);\n if (pipelineSlot < 0) {\n this.reject(new Error(\"All keys in the pipeline should belong to the same slots allocation group\"));\n return this.promise;\n }\n }\n else {\n // Send the pipeline to a random node\n pipelineSlot = (Math.random() * 16384) | 0;\n }\n }\n const _this = this;\n execPipeline();\n return this.promise;\n function execPipeline() {\n let writePending = (_this.replyPending = _this._queue.length);\n let node;\n if (_this.isCluster) {\n node = {\n slot: pipelineSlot,\n redis: _this.redis.connectionPool.nodes.all[_this.preferKey],\n };\n }\n let data = \"\";\n let buffers;\n const stream = {\n isPipeline: true,\n destination: _this.isCluster ? node : { redis: _this.redis },\n write(writable) {\n if (typeof writable !== \"string\") {\n if (!buffers) {\n buffers = [];\n }\n if (data) {\n buffers.push(Buffer.from(data, \"utf8\"));\n data = \"\";\n }\n buffers.push(writable);\n }\n else {\n data += writable;\n }\n if (!--writePending) {\n if (buffers) {\n if (data) {\n buffers.push(Buffer.from(data, \"utf8\"));\n }\n stream.destination.redis.stream.write(Buffer.concat(buffers));\n }\n else {\n stream.destination.redis.stream.write(data);\n }\n // Reset writePending for resending\n writePending = _this._queue.length;\n data = \"\";\n buffers = undefined;\n }\n },\n };\n for (let i = 0; i < _this._queue.length; ++i) {\n _this.redis.sendCommand(_this._queue[i], stream, node);\n }\n return _this.promise;\n }\n};\n",
31
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.addTransactionSupport = void 0;\nconst utils_1 = require(\"./utils\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst Pipeline_1 = require(\"./Pipeline\");\nfunction addTransactionSupport(redis) {\n redis.pipeline = function (commands) {\n const pipeline = new Pipeline_1.default(this);\n if (Array.isArray(commands)) {\n pipeline.addBatch(commands);\n }\n return pipeline;\n };\n const { multi } = redis;\n redis.multi = function (commands, options) {\n if (typeof options === \"undefined\" && !Array.isArray(commands)) {\n options = commands;\n commands = null;\n }\n if (options && options.pipeline === false) {\n return multi.call(this);\n }\n const pipeline = new Pipeline_1.default(this);\n // @ts-expect-error\n pipeline.multi();\n if (Array.isArray(commands)) {\n pipeline.addBatch(commands);\n }\n const exec = pipeline.exec;\n pipeline.exec = function (callback) {\n // Wait for the cluster to be connected, since we need nodes information before continuing\n if (this.isCluster && !this.redis.slots.length) {\n if (this.redis.status === \"wait\")\n this.redis.connect().catch(utils_1.noop);\n return (0, standard_as_callback_1.default)(new Promise((resolve, reject) => {\n this.redis.delayUntilReady((err) => {\n if (err) {\n reject(err);\n return;\n }\n this.exec(pipeline).then(resolve, reject);\n });\n }), callback);\n }\n if (this._transactions > 0) {\n exec.call(pipeline);\n }\n // Returns directly when the pipeline\n // has been called multiple times (retries).\n if (this.nodeifiedPromise) {\n return exec.call(pipeline);\n }\n const promise = exec.call(pipeline);\n return (0, standard_as_callback_1.default)(promise.then(function (result) {\n const execResult = result[result.length - 1];\n if (typeof execResult === \"undefined\") {\n throw new Error(\"Pipeline cannot be used to send any commands when the `exec()` has been called on it.\");\n }\n if (execResult[0]) {\n execResult[0].previousErrors = [];\n for (let i = 0; i < result.length - 1; ++i) {\n if (result[i][0]) {\n execResult[0].previousErrors.push(result[i][0]);\n }\n }\n throw execResult[0];\n }\n return (0, utils_1.wrapMultiResult)(execResult[1]);\n }), callback);\n };\n // @ts-expect-error\n const { execBuffer } = pipeline;\n // @ts-expect-error\n pipeline.execBuffer = function (callback) {\n if (this._transactions > 0) {\n execBuffer.call(pipeline);\n }\n return pipeline.exec(callback);\n };\n return pipeline;\n };\n const { exec } = redis;\n redis.exec = function (callback) {\n return (0, standard_as_callback_1.default)(exec.call(this).then(function (results) {\n if (Array.isArray(results)) {\n results = (0, utils_1.wrapMultiResult)(results);\n }\n return results;\n }), callback);\n };\n}\nexports.addTransactionSupport = addTransactionSupport;\n",
32
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction applyMixin(derivedConstructor, mixinConstructor) {\n Object.getOwnPropertyNames(mixinConstructor.prototype).forEach((name) => {\n Object.defineProperty(derivedConstructor.prototype, name, Object.getOwnPropertyDescriptor(mixinConstructor.prototype, name));\n });\n}\nexports.default = applyMixin;\n",
33
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_CLUSTER_OPTIONS = void 0;\nconst dns_1 = require(\"dns\");\nexports.DEFAULT_CLUSTER_OPTIONS = {\n clusterRetryStrategy: (times) => Math.min(100 + times * 2, 2000),\n enableOfflineQueue: true,\n enableReadyCheck: true,\n scaleReads: \"master\",\n maxRedirections: 16,\n retryDelayOnMoved: 0,\n retryDelayOnFailover: 100,\n retryDelayOnClusterDown: 100,\n retryDelayOnTryAgain: 100,\n slotsRefreshTimeout: 1000,\n useSRVRecords: false,\n resolveSrv: dns_1.resolveSrv,\n dnsLookup: dns_1.lookup,\n enableAutoPipelining: false,\n autoPipeliningIgnoredCommands: [],\n shardedSubscribers: false,\n};\n",
34
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getConnectionName = exports.weightSrvRecords = exports.groupSrvRecords = exports.getUniqueHostnamesFromOptions = exports.normalizeNodeOptions = exports.nodeKeyToRedisOptions = exports.getNodeKey = void 0;\nconst utils_1 = require(\"../utils\");\nconst net_1 = require(\"net\");\nfunction getNodeKey(node) {\n node.port = node.port || 6379;\n node.host = node.host || \"127.0.0.1\";\n return node.host + \":\" + node.port;\n}\nexports.getNodeKey = getNodeKey;\nfunction nodeKeyToRedisOptions(nodeKey) {\n const portIndex = nodeKey.lastIndexOf(\":\");\n if (portIndex === -1) {\n throw new Error(`Invalid node key ${nodeKey}`);\n }\n return {\n host: nodeKey.slice(0, portIndex),\n port: Number(nodeKey.slice(portIndex + 1)),\n };\n}\nexports.nodeKeyToRedisOptions = nodeKeyToRedisOptions;\nfunction normalizeNodeOptions(nodes) {\n return nodes.map((node) => {\n const options = {};\n if (typeof node === \"object\") {\n Object.assign(options, node);\n }\n else if (typeof node === \"string\") {\n Object.assign(options, (0, utils_1.parseURL)(node));\n }\n else if (typeof node === \"number\") {\n options.port = node;\n }\n else {\n throw new Error(\"Invalid argument \" + node);\n }\n if (typeof options.port === \"string\") {\n options.port = parseInt(options.port, 10);\n }\n // Cluster mode only support db 0\n delete options.db;\n if (!options.port) {\n options.port = 6379;\n }\n if (!options.host) {\n options.host = \"127.0.0.1\";\n }\n return (0, utils_1.resolveTLSProfile)(options);\n });\n}\nexports.normalizeNodeOptions = normalizeNodeOptions;\nfunction getUniqueHostnamesFromOptions(nodes) {\n const uniqueHostsMap = {};\n nodes.forEach((node) => {\n uniqueHostsMap[node.host] = true;\n });\n return Object.keys(uniqueHostsMap).filter((host) => !(0, net_1.isIP)(host));\n}\nexports.getUniqueHostnamesFromOptions = getUniqueHostnamesFromOptions;\nfunction groupSrvRecords(records) {\n const recordsByPriority = {};\n for (const record of records) {\n if (!recordsByPriority.hasOwnProperty(record.priority)) {\n recordsByPriority[record.priority] = {\n totalWeight: record.weight,\n records: [record],\n };\n }\n else {\n recordsByPriority[record.priority].totalWeight += record.weight;\n recordsByPriority[record.priority].records.push(record);\n }\n }\n return recordsByPriority;\n}\nexports.groupSrvRecords = groupSrvRecords;\nfunction weightSrvRecords(recordsGroup) {\n if (recordsGroup.records.length === 1) {\n recordsGroup.totalWeight = 0;\n return recordsGroup.records.shift();\n }\n // + `recordsGroup.records.length` to support `weight` 0\n const random = Math.floor(Math.random() * (recordsGroup.totalWeight + recordsGroup.records.length));\n let total = 0;\n for (const [i, record] of recordsGroup.records.entries()) {\n total += 1 + record.weight;\n if (total > random) {\n recordsGroup.totalWeight -= record.weight;\n recordsGroup.records.splice(i, 1);\n return record;\n }\n }\n}\nexports.weightSrvRecords = weightSrvRecords;\nfunction getConnectionName(component, nodeConnectionName) {\n const prefix = `ioredis-cluster(${component})`;\n return nodeConnectionName ? `${prefix}:${nodeConnectionName}` : prefix;\n}\nexports.getConnectionName = getConnectionName;\n",
35
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst util_1 = require(\"./util\");\nconst utils_1 = require(\"../utils\");\nconst Redis_1 = require(\"../Redis\");\nconst debug = (0, utils_1.Debug)(\"cluster:subscriber\");\nclass ClusterSubscriber {\n constructor(connectionPool, emitter, isSharded = false) {\n this.connectionPool = connectionPool;\n this.emitter = emitter;\n this.isSharded = isSharded;\n this.started = false;\n //There is only one connection for the entire pool\n this.subscriber = null;\n //The slot range for which this subscriber is responsible\n this.slotRange = [];\n this.onSubscriberEnd = () => {\n if (!this.started) {\n debug(\"subscriber has disconnected, but ClusterSubscriber is not started, so not reconnecting.\");\n return;\n }\n // If the subscriber closes whilst it's still the active connection,\n // we might as well try to connecting to a new node if possible to\n // minimise the number of missed publishes.\n debug(\"subscriber has disconnected, selecting a new one...\");\n this.selectSubscriber();\n };\n // If the current node we're using as the subscriber disappears\n // from the node pool for some reason, we will select a new one\n // to connect to.\n // Note that this event is only triggered if the connection to\n // the node has been used; cluster subscriptions are setup with\n // lazyConnect = true. It's possible for the subscriber node to\n // disappear without this method being called!\n // See https://github.com/luin/ioredis/pull/1589\n this.connectionPool.on(\"-node\", (_, key) => {\n if (!this.started || !this.subscriber) {\n return;\n }\n if ((0, util_1.getNodeKey)(this.subscriber.options) === key) {\n debug(\"subscriber has left, selecting a new one...\");\n this.selectSubscriber();\n }\n });\n this.connectionPool.on(\"+node\", () => {\n if (!this.started || this.subscriber) {\n return;\n }\n debug(\"a new node is discovered and there is no subscriber, selecting a new one...\");\n this.selectSubscriber();\n });\n }\n getInstance() {\n return this.subscriber;\n }\n /**\n * Associate this subscriber to a specific slot range.\n *\n * Returns the range or an empty array if the slot range couldn't be associated.\n *\n * BTW: This is more for debugging and testing purposes.\n *\n * @param range\n */\n associateSlotRange(range) {\n if (this.isSharded) {\n this.slotRange = range;\n }\n return this.slotRange;\n }\n start() {\n this.started = true;\n this.selectSubscriber();\n debug(\"started\");\n }\n stop() {\n this.started = false;\n if (this.subscriber) {\n this.subscriber.disconnect();\n this.subscriber = null;\n }\n }\n isStarted() {\n return this.started;\n }\n selectSubscriber() {\n const lastActiveSubscriber = this.lastActiveSubscriber;\n // Disconnect the previous subscriber even if there\n // will not be a new one.\n if (lastActiveSubscriber) {\n lastActiveSubscriber.off(\"end\", this.onSubscriberEnd);\n lastActiveSubscriber.disconnect();\n }\n if (this.subscriber) {\n this.subscriber.off(\"end\", this.onSubscriberEnd);\n this.subscriber.disconnect();\n }\n const sampleNode = (0, utils_1.sample)(this.connectionPool.getNodes());\n if (!sampleNode) {\n debug(\"selecting subscriber failed since there is no node discovered in the cluster yet\");\n this.subscriber = null;\n return;\n }\n const { options } = sampleNode;\n debug(\"selected a subscriber %s:%s\", options.host, options.port);\n /*\n * Create a specialized Redis connection for the subscription.\n * Note that auto reconnection is enabled here.\n *\n * `enableReadyCheck` is also enabled because although subscription is allowed\n * while redis is loading data from the disk, we can check if the password\n * provided for the subscriber is correct, and if not, the current subscriber\n * will be disconnected and a new subscriber will be selected.\n */\n let connectionPrefix = \"subscriber\";\n if (this.isSharded)\n connectionPrefix = \"ssubscriber\";\n this.subscriber = new Redis_1.default({\n port: options.port,\n host: options.host,\n username: options.username,\n password: options.password,\n enableReadyCheck: true,\n connectionName: (0, util_1.getConnectionName)(connectionPrefix, options.connectionName),\n lazyConnect: true,\n tls: options.tls,\n // Don't try to reconnect the subscriber connection. If the connection fails\n // we will get an end event (handled below), at which point we'll pick a new\n // node from the pool and try to connect to that as the subscriber connection.\n retryStrategy: null,\n });\n // Ignore the errors since they're handled in the connection pool.\n this.subscriber.on(\"error\", utils_1.noop);\n this.subscriber.on(\"moved\", () => {\n this.emitter.emit(\"forceRefresh\");\n });\n // The node we lost connection to may not come back up in a\n // reasonable amount of time (e.g. a slave that's taken down\n // for maintainence), we could potentially miss many published\n // messages so we should reconnect as quickly as possible, to\n // a different node if needed.\n this.subscriber.once(\"end\", this.onSubscriberEnd);\n // Re-subscribe previous channels\n const previousChannels = { subscribe: [], psubscribe: [], ssubscribe: [] };\n if (lastActiveSubscriber) {\n const condition = lastActiveSubscriber.condition || lastActiveSubscriber.prevCondition;\n if (condition && condition.subscriber) {\n previousChannels.subscribe = condition.subscriber.channels(\"subscribe\");\n previousChannels.psubscribe =\n condition.subscriber.channels(\"psubscribe\");\n previousChannels.ssubscribe =\n condition.subscriber.channels(\"ssubscribe\");\n }\n }\n if (previousChannels.subscribe.length ||\n previousChannels.psubscribe.length ||\n previousChannels.ssubscribe.length) {\n let pending = 0;\n for (const type of [\"subscribe\", \"psubscribe\", \"ssubscribe\"]) {\n const channels = previousChannels[type];\n if (channels.length == 0) {\n continue;\n }\n debug(\"%s %d channels\", type, channels.length);\n if (type === \"ssubscribe\") {\n for (const channel of channels) {\n pending += 1;\n this.subscriber[type](channel)\n .then(() => {\n if (!--pending) {\n this.lastActiveSubscriber = this.subscriber;\n }\n })\n .catch(() => {\n // TODO: should probably disconnect the subscriber and try again.\n debug(\"failed to ssubscribe to channel: %s\", channel);\n });\n }\n }\n else {\n pending += 1;\n this.subscriber[type](channels)\n .then(() => {\n if (!--pending) {\n this.lastActiveSubscriber = this.subscriber;\n }\n })\n .catch(() => {\n // TODO: should probably disconnect the subscriber and try again.\n debug(\"failed to %s %d channels\", type, channels.length);\n });\n }\n }\n }\n else {\n this.lastActiveSubscriber = this.subscriber;\n }\n for (const event of [\n \"message\",\n \"messageBuffer\",\n ]) {\n this.subscriber.on(event, (arg1, arg2) => {\n this.emitter.emit(event, arg1, arg2);\n });\n }\n for (const event of [\"pmessage\", \"pmessageBuffer\"]) {\n this.subscriber.on(event, (arg1, arg2, arg3) => {\n this.emitter.emit(event, arg1, arg2, arg3);\n });\n }\n if (this.isSharded == true) {\n for (const event of [\n \"smessage\",\n \"smessageBuffer\",\n ]) {\n this.subscriber.on(event, (arg1, arg2) => {\n this.emitter.emit(event, arg1, arg2);\n });\n }\n }\n }\n}\nexports.default = ClusterSubscriber;\n",
36
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"events\");\nconst utils_1 = require(\"../utils\");\nconst util_1 = require(\"./util\");\nconst Redis_1 = require(\"../Redis\");\nconst debug = (0, utils_1.Debug)(\"cluster:connectionPool\");\nclass ConnectionPool extends events_1.EventEmitter {\n constructor(redisOptions) {\n super();\n this.redisOptions = redisOptions;\n // master + slave = all\n this.nodes = {\n all: {},\n master: {},\n slave: {},\n };\n this.specifiedOptions = {};\n }\n getNodes(role = \"all\") {\n const nodes = this.nodes[role];\n return Object.keys(nodes).map((key) => nodes[key]);\n }\n getInstanceByKey(key) {\n return this.nodes.all[key];\n }\n getSampleInstance(role) {\n const keys = Object.keys(this.nodes[role]);\n const sampleKey = (0, utils_1.sample)(keys);\n return this.nodes[role][sampleKey];\n }\n /**\n * Add a master node to the pool\n * @param node\n */\n addMasterNode(node) {\n const key = (0, util_1.getNodeKey)(node.options);\n const redis = this.createRedisFromOptions(node, node.options.readOnly);\n //Master nodes aren't read-only\n if (!node.options.readOnly) {\n this.nodes.all[key] = redis;\n this.nodes.master[key] = redis;\n return true;\n }\n return false;\n }\n /**\n * Creates a Redis connection instance from the node options\n * @param node\n * @param readOnly\n */\n createRedisFromOptions(node, readOnly) {\n const redis = new Redis_1.default((0, utils_1.defaults)({\n // Never try to reconnect when a node is lose,\n // instead, waiting for a `MOVED` error and\n // fetch the slots again.\n retryStrategy: null,\n // Offline queue should be enabled so that\n // we don't need to wait for the `ready` event\n // before sending commands to the node.\n enableOfflineQueue: true,\n readOnly: readOnly,\n }, node, this.redisOptions, { lazyConnect: true }));\n return redis;\n }\n /**\n * Find or create a connection to the node\n */\n findOrCreate(node, readOnly = false) {\n const key = (0, util_1.getNodeKey)(node);\n readOnly = Boolean(readOnly);\n if (this.specifiedOptions[key]) {\n Object.assign(node, this.specifiedOptions[key]);\n }\n else {\n this.specifiedOptions[key] = node;\n }\n let redis;\n if (this.nodes.all[key]) {\n redis = this.nodes.all[key];\n if (redis.options.readOnly !== readOnly) {\n redis.options.readOnly = readOnly;\n debug(\"Change role of %s to %s\", key, readOnly ? \"slave\" : \"master\");\n redis[readOnly ? \"readonly\" : \"readwrite\"]().catch(utils_1.noop);\n if (readOnly) {\n delete this.nodes.master[key];\n this.nodes.slave[key] = redis;\n }\n else {\n delete this.nodes.slave[key];\n this.nodes.master[key] = redis;\n }\n }\n }\n else {\n debug(\"Connecting to %s as %s\", key, readOnly ? \"slave\" : \"master\");\n redis = this.createRedisFromOptions(node, readOnly);\n this.nodes.all[key] = redis;\n this.nodes[readOnly ? \"slave\" : \"master\"][key] = redis;\n redis.once(\"end\", () => {\n this.removeNode(key);\n this.emit(\"-node\", redis, key);\n if (!Object.keys(this.nodes.all).length) {\n this.emit(\"drain\");\n }\n });\n this.emit(\"+node\", redis, key);\n redis.on(\"error\", function (error) {\n this.emit(\"nodeError\", error, key);\n });\n }\n return redis;\n }\n /**\n * Reset the pool with a set of nodes.\n * The old node will be removed.\n */\n reset(nodes) {\n debug(\"Reset with %O\", nodes);\n const newNodes = {};\n nodes.forEach((node) => {\n const key = (0, util_1.getNodeKey)(node);\n // Don't override the existing (master) node\n // when the current one is slave.\n if (!(node.readOnly && newNodes[key])) {\n newNodes[key] = node;\n }\n });\n Object.keys(this.nodes.all).forEach((key) => {\n if (!newNodes[key]) {\n debug(\"Disconnect %s because the node does not hold any slot\", key);\n this.nodes.all[key].disconnect();\n this.removeNode(key);\n }\n });\n Object.keys(newNodes).forEach((key) => {\n const node = newNodes[key];\n this.findOrCreate(node, node.readOnly);\n });\n }\n /**\n * Remove a node from the pool.\n */\n removeNode(key) {\n const { nodes } = this;\n if (nodes.all[key]) {\n debug(\"Remove %s from the pool\", key);\n delete nodes.all[key];\n }\n delete nodes.master[key];\n delete nodes.slave[key];\n }\n}\nexports.default = ConnectionPool;\n",
37
- "'use strict';\n\n/**\n * Custom implementation of a double ended queue.\n */\nfunction Denque(array, options) {\n var options = options || {};\n this._capacity = options.capacity;\n\n this._head = 0;\n this._tail = 0;\n\n if (Array.isArray(array)) {\n this._fromArray(array);\n } else {\n this._capacityMask = 0x3;\n this._list = new Array(4);\n }\n}\n\n/**\n * --------------\n * PUBLIC API\n * -------------\n */\n\n/**\n * Returns the item at the specified index from the list.\n * 0 is the first element, 1 is the second, and so on...\n * Elements at negative values are that many from the end: -1 is one before the end\n * (the last element), -2 is two before the end (one before last), etc.\n * @param index\n * @returns {*}\n */\nDenque.prototype.peekAt = function peekAt(index) {\n var i = index;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n var len = this.size();\n if (i >= len || i < -len) return undefined;\n if (i < 0) i += len;\n i = (this._head + i) & this._capacityMask;\n return this._list[i];\n};\n\n/**\n * Alias for peekAt()\n * @param i\n * @returns {*}\n */\nDenque.prototype.get = function get(i) {\n return this.peekAt(i);\n};\n\n/**\n * Returns the first item in the list without removing it.\n * @returns {*}\n */\nDenque.prototype.peek = function peek() {\n if (this._head === this._tail) return undefined;\n return this._list[this._head];\n};\n\n/**\n * Alias for peek()\n * @returns {*}\n */\nDenque.prototype.peekFront = function peekFront() {\n return this.peek();\n};\n\n/**\n * Returns the item that is at the back of the queue without removing it.\n * Uses peekAt(-1)\n */\nDenque.prototype.peekBack = function peekBack() {\n return this.peekAt(-1);\n};\n\n/**\n * Returns the current length of the queue\n * @return {Number}\n */\nObject.defineProperty(Denque.prototype, 'length', {\n get: function length() {\n return this.size();\n }\n});\n\n/**\n * Return the number of items on the list, or 0 if empty.\n * @returns {number}\n */\nDenque.prototype.size = function size() {\n if (this._head === this._tail) return 0;\n if (this._head < this._tail) return this._tail - this._head;\n else return this._capacityMask + 1 - (this._head - this._tail);\n};\n\n/**\n * Add an item at the beginning of the list.\n * @param item\n */\nDenque.prototype.unshift = function unshift(item) {\n if (arguments.length === 0) return this.size();\n var len = this._list.length;\n this._head = (this._head - 1 + len) & this._capacityMask;\n this._list[this._head] = item;\n if (this._tail === this._head) this._growArray();\n if (this._capacity && this.size() > this._capacity) this.pop();\n if (this._head < this._tail) return this._tail - this._head;\n else return this._capacityMask + 1 - (this._head - this._tail);\n};\n\n/**\n * Remove and return the first item on the list,\n * Returns undefined if the list is empty.\n * @returns {*}\n */\nDenque.prototype.shift = function shift() {\n var head = this._head;\n if (head === this._tail) return undefined;\n var item = this._list[head];\n this._list[head] = undefined;\n this._head = (head + 1) & this._capacityMask;\n if (head < 2 && this._tail > 10000 && this._tail <= this._list.length >>> 2) this._shrinkArray();\n return item;\n};\n\n/**\n * Add an item to the bottom of the list.\n * @param item\n */\nDenque.prototype.push = function push(item) {\n if (arguments.length === 0) return this.size();\n var tail = this._tail;\n this._list[tail] = item;\n this._tail = (tail + 1) & this._capacityMask;\n if (this._tail === this._head) {\n this._growArray();\n }\n if (this._capacity && this.size() > this._capacity) {\n this.shift();\n }\n if (this._head < this._tail) return this._tail - this._head;\n else return this._capacityMask + 1 - (this._head - this._tail);\n};\n\n/**\n * Remove and return the last item on the list.\n * Returns undefined if the list is empty.\n * @returns {*}\n */\nDenque.prototype.pop = function pop() {\n var tail = this._tail;\n if (tail === this._head) return undefined;\n var len = this._list.length;\n this._tail = (tail - 1 + len) & this._capacityMask;\n var item = this._list[this._tail];\n this._list[this._tail] = undefined;\n if (this._head < 2 && tail > 10000 && tail <= len >>> 2) this._shrinkArray();\n return item;\n};\n\n/**\n * Remove and return the item at the specified index from the list.\n * Returns undefined if the list is empty.\n * @param index\n * @returns {*}\n */\nDenque.prototype.removeOne = function removeOne(index) {\n var i = index;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n if (this._head === this._tail) return void 0;\n var size = this.size();\n var len = this._list.length;\n if (i >= size || i < -size) return void 0;\n if (i < 0) i += size;\n i = (this._head + i) & this._capacityMask;\n var item = this._list[i];\n var k;\n if (index < size / 2) {\n for (k = index; k > 0; k--) {\n this._list[i] = this._list[i = (i - 1 + len) & this._capacityMask];\n }\n this._list[i] = void 0;\n this._head = (this._head + 1 + len) & this._capacityMask;\n } else {\n for (k = size - 1 - index; k > 0; k--) {\n this._list[i] = this._list[i = (i + 1 + len) & this._capacityMask];\n }\n this._list[i] = void 0;\n this._tail = (this._tail - 1 + len) & this._capacityMask;\n }\n return item;\n};\n\n/**\n * Remove number of items from the specified index from the list.\n * Returns array of removed items.\n * Returns undefined if the list is empty.\n * @param index\n * @param count\n * @returns {array}\n */\nDenque.prototype.remove = function remove(index, count) {\n var i = index;\n var removed;\n var del_count = count;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n if (this._head === this._tail) return void 0;\n var size = this.size();\n var len = this._list.length;\n if (i >= size || i < -size || count < 1) return void 0;\n if (i < 0) i += size;\n if (count === 1 || !count) {\n removed = new Array(1);\n removed[0] = this.removeOne(i);\n return removed;\n }\n if (i === 0 && i + count >= size) {\n removed = this.toArray();\n this.clear();\n return removed;\n }\n if (i + count > size) count = size - i;\n var k;\n removed = new Array(count);\n for (k = 0; k < count; k++) {\n removed[k] = this._list[(this._head + i + k) & this._capacityMask];\n }\n i = (this._head + i) & this._capacityMask;\n if (index + count === size) {\n this._tail = (this._tail - count + len) & this._capacityMask;\n for (k = count; k > 0; k--) {\n this._list[i = (i + 1 + len) & this._capacityMask] = void 0;\n }\n return removed;\n }\n if (index === 0) {\n this._head = (this._head + count + len) & this._capacityMask;\n for (k = count - 1; k > 0; k--) {\n this._list[i = (i + 1 + len) & this._capacityMask] = void 0;\n }\n return removed;\n }\n if (i < size / 2) {\n this._head = (this._head + index + count + len) & this._capacityMask;\n for (k = index; k > 0; k--) {\n this.unshift(this._list[i = (i - 1 + len) & this._capacityMask]);\n }\n i = (this._head - 1 + len) & this._capacityMask;\n while (del_count > 0) {\n this._list[i = (i - 1 + len) & this._capacityMask] = void 0;\n del_count--;\n }\n if (index < 0) this._tail = i;\n } else {\n this._tail = i;\n i = (i + count + len) & this._capacityMask;\n for (k = size - (count + index); k > 0; k--) {\n this.push(this._list[i++]);\n }\n i = this._tail;\n while (del_count > 0) {\n this._list[i = (i + 1 + len) & this._capacityMask] = void 0;\n del_count--;\n }\n }\n if (this._head < 2 && this._tail > 10000 && this._tail <= len >>> 2) this._shrinkArray();\n return removed;\n};\n\n/**\n * Native splice implementation.\n * Remove number of items from the specified index from the list and/or add new elements.\n * Returns array of removed items or empty array if count == 0.\n * Returns undefined if the list is empty.\n *\n * @param index\n * @param count\n * @param {...*} [elements]\n * @returns {array}\n */\nDenque.prototype.splice = function splice(index, count) {\n var i = index;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n var size = this.size();\n if (i < 0) i += size;\n if (i > size) return void 0;\n if (arguments.length > 2) {\n var k;\n var temp;\n var removed;\n var arg_len = arguments.length;\n var len = this._list.length;\n var arguments_index = 2;\n if (!size || i < size / 2) {\n temp = new Array(i);\n for (k = 0; k < i; k++) {\n temp[k] = this._list[(this._head + k) & this._capacityMask];\n }\n if (count === 0) {\n removed = [];\n if (i > 0) {\n this._head = (this._head + i + len) & this._capacityMask;\n }\n } else {\n removed = this.remove(i, count);\n this._head = (this._head + i + len) & this._capacityMask;\n }\n while (arg_len > arguments_index) {\n this.unshift(arguments[--arg_len]);\n }\n for (k = i; k > 0; k--) {\n this.unshift(temp[k - 1]);\n }\n } else {\n temp = new Array(size - (i + count));\n var leng = temp.length;\n for (k = 0; k < leng; k++) {\n temp[k] = this._list[(this._head + i + count + k) & this._capacityMask];\n }\n if (count === 0) {\n removed = [];\n if (i != size) {\n this._tail = (this._head + i + len) & this._capacityMask;\n }\n } else {\n removed = this.remove(i, count);\n this._tail = (this._tail - leng + len) & this._capacityMask;\n }\n while (arguments_index < arg_len) {\n this.push(arguments[arguments_index++]);\n }\n for (k = 0; k < leng; k++) {\n this.push(temp[k]);\n }\n }\n return removed;\n } else {\n return this.remove(i, count);\n }\n};\n\n/**\n * Soft clear - does not reset capacity.\n */\nDenque.prototype.clear = function clear() {\n this._list = new Array(this._list.length);\n this._head = 0;\n this._tail = 0;\n};\n\n/**\n * Returns true or false whether the list is empty.\n * @returns {boolean}\n */\nDenque.prototype.isEmpty = function isEmpty() {\n return this._head === this._tail;\n};\n\n/**\n * Returns an array of all queue items.\n * @returns {Array}\n */\nDenque.prototype.toArray = function toArray() {\n return this._copyArray(false);\n};\n\n/**\n * -------------\n * INTERNALS\n * -------------\n */\n\n/**\n * Fills the queue with items from an array\n * For use in the constructor\n * @param array\n * @private\n */\nDenque.prototype._fromArray = function _fromArray(array) {\n var length = array.length;\n var capacity = this._nextPowerOf2(length);\n\n this._list = new Array(capacity);\n this._capacityMask = capacity - 1;\n this._tail = length;\n\n for (var i = 0; i < length; i++) this._list[i] = array[i];\n};\n\n/**\n *\n * @param fullCopy\n * @param size Initialize the array with a specific size. Will default to the current list size\n * @returns {Array}\n * @private\n */\nDenque.prototype._copyArray = function _copyArray(fullCopy, size) {\n var src = this._list;\n var capacity = src.length;\n var length = this.length;\n size = size | length;\n\n // No prealloc requested and the buffer is contiguous\n if (size == length && this._head < this._tail) {\n // Simply do a fast slice copy\n return this._list.slice(this._head, this._tail);\n }\n\n var dest = new Array(size);\n\n var k = 0;\n var i;\n if (fullCopy || this._head > this._tail) {\n for (i = this._head; i < capacity; i++) dest[k++] = src[i];\n for (i = 0; i < this._tail; i++) dest[k++] = src[i];\n } else {\n for (i = this._head; i < this._tail; i++) dest[k++] = src[i];\n }\n\n return dest;\n}\n\n/**\n * Grows the internal list array.\n * @private\n */\nDenque.prototype._growArray = function _growArray() {\n if (this._head != 0) {\n // double array size and copy existing data, head to end, then beginning to tail.\n var newList = this._copyArray(true, this._list.length << 1);\n\n this._tail = this._list.length;\n this._head = 0;\n\n this._list = newList;\n } else {\n this._tail = this._list.length;\n this._list.length <<= 1;\n }\n\n this._capacityMask = (this._capacityMask << 1) | 1;\n};\n\n/**\n * Shrinks the internal list array.\n * @private\n */\nDenque.prototype._shrinkArray = function _shrinkArray() {\n this._list.length >>>= 1;\n this._capacityMask >>>= 1;\n};\n\n/**\n * Find the next power of 2, at least 4\n * @private\n * @param {number} num \n * @returns {number}\n */\nDenque.prototype._nextPowerOf2 = function _nextPowerOf2(num) {\n var log2 = Math.log(num) / Math.log(2);\n var nextPow2 = 1 << (log2 + 1);\n\n return Math.max(nextPow2, 4);\n}\n\nmodule.exports = Denque;\n",
38
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst Deque = require(\"denque\");\nconst debug = (0, utils_1.Debug)(\"delayqueue\");\n/**\n * Queue that runs items after specified duration\n */\nclass DelayQueue {\n constructor() {\n this.queues = {};\n this.timeouts = {};\n }\n /**\n * Add a new item to the queue\n *\n * @param bucket bucket name\n * @param item function that will run later\n * @param options\n */\n push(bucket, item, options) {\n const callback = options.callback || process.nextTick;\n if (!this.queues[bucket]) {\n this.queues[bucket] = new Deque();\n }\n const queue = this.queues[bucket];\n queue.push(item);\n if (!this.timeouts[bucket]) {\n this.timeouts[bucket] = setTimeout(() => {\n callback(() => {\n this.timeouts[bucket] = null;\n this.execute(bucket);\n });\n }, options.timeout);\n }\n }\n execute(bucket) {\n const queue = this.queues[bucket];\n if (!queue) {\n return;\n }\n const { length } = queue;\n if (!length) {\n return;\n }\n debug(\"send %d commands in %s queue\", length, bucket);\n this.queues[bucket] = null;\n while (queue.length > 0) {\n queue.shift()();\n }\n }\n}\nexports.default = DelayQueue;\n",
39
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst util_1 = require(\"./util\");\nconst utils_1 = require(\"../utils\");\nconst Redis_1 = require(\"../Redis\");\nconst debug = (0, utils_1.Debug)(\"cluster:subscriberGroup:shardedSubscriber\");\nclass ShardedSubscriber {\n constructor(emitter, options) {\n this.emitter = emitter;\n this.started = false;\n this.instance = null;\n // Store listener references for cleanup\n this.messageListeners = new Map();\n this.onEnd = () => {\n this.started = false;\n this.emitter.emit(\"-node\", this.instance, this.nodeKey);\n };\n this.onError = (error) => {\n this.emitter.emit(\"nodeError\", error, this.nodeKey);\n };\n this.onMoved = () => {\n this.emitter.emit(\"moved\");\n };\n this.instance = new Redis_1.default({\n port: options.port,\n host: options.host,\n username: options.username,\n password: options.password,\n enableReadyCheck: false,\n offlineQueue: true,\n connectionName: (0, util_1.getConnectionName)(\"ssubscriber\", options.connectionName),\n lazyConnect: true,\n tls: options.tls,\n /**\n * Disable auto reconnection for subscribers.\n * The ClusterSubscriberGroup will handle the reconnection.\n */\n retryStrategy: null,\n });\n this.nodeKey = (0, util_1.getNodeKey)(options);\n // Register listeners\n this.instance.once(\"end\", this.onEnd);\n this.instance.on(\"error\", this.onError);\n this.instance.on(\"moved\", this.onMoved);\n for (const event of [\"smessage\", \"smessageBuffer\"]) {\n const listener = (...args) => {\n this.emitter.emit(event, ...args);\n };\n this.messageListeners.set(event, listener);\n this.instance.on(event, listener);\n }\n }\n async start() {\n if (this.started) {\n debug(\"already started %s\", this.nodeKey);\n return;\n }\n try {\n await this.instance.connect();\n debug(\"started %s\", this.nodeKey);\n this.started = true;\n }\n catch (err) {\n debug(\"failed to start %s: %s\", this.nodeKey, err);\n this.started = false;\n throw err; // Re-throw so caller knows it failed\n }\n }\n stop() {\n this.started = false;\n if (this.instance) {\n this.instance.disconnect();\n this.instance.removeAllListeners();\n this.messageListeners.clear();\n this.instance = null;\n }\n debug(\"stopped %s\", this.nodeKey);\n }\n isStarted() {\n return this.started;\n }\n getInstance() {\n return this.instance;\n }\n getNodeKey() {\n return this.nodeKey;\n }\n}\nexports.default = ShardedSubscriber;\n",
40
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst util_1 = require(\"./util\");\nconst calculateSlot = require(\"cluster-key-slot\");\nconst ShardedSubscriber_1 = require(\"./ShardedSubscriber\");\nconst debug = (0, utils_1.Debug)(\"cluster:subscriberGroup\");\n/**\n * Redis distinguishes between \"normal\" and sharded PubSub. When using the normal PubSub feature,\n * exactly one subscriber exists per cluster instance because the Redis cluster bus forwards\n * messages between shards. Sharded PubSub removes this limitation by making each shard\n * responsible for its own messages.\n *\n * This class coordinates one ShardedSubscriber per master node in the cluster, providing\n * sharded PubSub support while keeping the public API backward compatible.\n */\nclass ClusterSubscriberGroup {\n /**\n * Register callbacks\n *\n * @param cluster\n */\n constructor(subscriberGroupEmitter) {\n this.subscriberGroupEmitter = subscriberGroupEmitter;\n this.shardedSubscribers = new Map();\n this.clusterSlots = [];\n // Simple [min, max] slot ranges aren't enough because you can migrate single slots\n this.subscriberToSlotsIndex = new Map();\n this.channels = new Map();\n this.failedAttemptsByNode = new Map();\n // Only latest pending reset kept; throttled by refreshSlotsCache's isRefreshing + backoff delay\n this.isResetting = false;\n this.pendingReset = null;\n /**\n * Handles failed subscriber connections by emitting an event to refresh the slots cache\n * after a backoff period.\n *\n * @param error\n * @param nodeKey\n */\n this.handleSubscriberConnectFailed = (error, nodeKey) => {\n const currentAttempts = this.failedAttemptsByNode.get(nodeKey) || 0;\n const failedAttempts = currentAttempts + 1;\n this.failedAttemptsByNode.set(nodeKey, failedAttempts);\n const attempts = Math.min(failedAttempts, ClusterSubscriberGroup.MAX_RETRY_ATTEMPTS);\n const backoff = Math.min(ClusterSubscriberGroup.BASE_BACKOFF_MS * 2 ** attempts, ClusterSubscriberGroup.MAX_BACKOFF_MS);\n const jitter = Math.floor((Math.random() - 0.5) * (backoff * 0.5));\n const delay = Math.max(0, backoff + jitter);\n debug(\"Failed to connect subscriber for %s. Refreshing slots in %dms\", nodeKey, delay);\n this.subscriberGroupEmitter.emit(\"subscriberConnectFailed\", {\n delay,\n error,\n });\n };\n /**\n * Handles successful subscriber connections by resetting the failed attempts counter.\n *\n * @param nodeKey\n */\n this.handleSubscriberConnectSucceeded = (nodeKey) => {\n this.failedAttemptsByNode.delete(nodeKey);\n };\n }\n /**\n * Get the responsible subscriber.\n *\n * @param slot\n */\n getResponsibleSubscriber(slot) {\n const nodeKey = this.clusterSlots[slot][0];\n return this.shardedSubscribers.get(nodeKey);\n }\n /**\n * Adds a channel for which this subscriber group is responsible\n *\n * @param channels\n */\n addChannels(channels) {\n const slot = calculateSlot(channels[0]);\n // Check if the all channels belong to the same slot and otherwise reject the operation\n for (const c of channels) {\n if (calculateSlot(c) !== slot) {\n return -1;\n }\n }\n const currChannels = this.channels.get(slot);\n if (!currChannels) {\n this.channels.set(slot, channels);\n }\n else {\n this.channels.set(slot, currChannels.concat(channels));\n }\n return Array.from(this.channels.values()).reduce((sum, array) => sum + array.length, 0);\n }\n /**\n * Removes channels for which the subscriber group is responsible by optionally unsubscribing\n * @param channels\n */\n removeChannels(channels) {\n const slot = calculateSlot(channels[0]);\n // Check if the all channels belong to the same slot and otherwise reject the operation\n for (const c of channels) {\n if (calculateSlot(c) !== slot) {\n return -1;\n }\n }\n const slotChannels = this.channels.get(slot);\n if (slotChannels) {\n const updatedChannels = slotChannels.filter((c) => !channels.includes(c));\n this.channels.set(slot, updatedChannels);\n }\n return Array.from(this.channels.values()).reduce((sum, array) => sum + array.length, 0);\n }\n /**\n * Disconnect all subscribers and clear some of the internal state.\n */\n stop() {\n for (const s of this.shardedSubscribers.values()) {\n s.stop();\n }\n // Clear subscriber instances and pending operations.\n // Channels are preserved for resubscription on reconnect.\n this.pendingReset = null;\n this.shardedSubscribers.clear();\n this.subscriberToSlotsIndex.clear();\n }\n /**\n * Start all not yet started subscribers\n */\n start() {\n const startPromises = [];\n for (const s of this.shardedSubscribers.values()) {\n if (!s.isStarted()) {\n startPromises.push(s\n .start()\n .then(() => {\n this.handleSubscriberConnectSucceeded(s.getNodeKey());\n })\n .catch((err) => {\n this.handleSubscriberConnectFailed(err, s.getNodeKey());\n }));\n }\n }\n return Promise.all(startPromises);\n }\n /**\n * Resets the subscriber group by disconnecting all subscribers that are no longer needed and connecting new ones.\n */\n async reset(clusterSlots, clusterNodes) {\n if (this.isResetting) {\n this.pendingReset = { slots: clusterSlots, nodes: clusterNodes };\n return;\n }\n this.isResetting = true;\n try {\n const hasTopologyChanged = this._refreshSlots(clusterSlots);\n const hasFailedSubscribers = this.hasUnhealthySubscribers();\n if (!hasTopologyChanged && !hasFailedSubscribers) {\n debug(\"No topology change detected or failed subscribers. Skipping reset.\");\n return;\n }\n // For each of the sharded subscribers\n for (const [nodeKey, shardedSubscriber] of this.shardedSubscribers) {\n if (\n // If the subscriber is still responsible for a slot range and is running then keep it\n this.subscriberToSlotsIndex.has(nodeKey) &&\n shardedSubscriber.isStarted()) {\n debug(\"Skipping deleting subscriber for %s\", nodeKey);\n continue;\n }\n debug(\"Removing subscriber for %s\", nodeKey);\n // Otherwise stop the subscriber and remove it\n shardedSubscriber.stop();\n this.shardedSubscribers.delete(nodeKey);\n this.subscriberGroupEmitter.emit(\"-subscriber\");\n }\n const startPromises = [];\n // For each node in slots cache\n for (const [nodeKey, _] of this.subscriberToSlotsIndex) {\n // If we already have a subscriber for this node then keep it\n if (this.shardedSubscribers.has(nodeKey)) {\n debug(\"Skipping creating new subscriber for %s\", nodeKey);\n continue;\n }\n debug(\"Creating new subscriber for %s\", nodeKey);\n // Otherwise create a new subscriber\n const redis = clusterNodes.find((node) => {\n return (0, util_1.getNodeKey)(node.options) === nodeKey;\n });\n if (!redis) {\n debug(\"Failed to find node for key %s\", nodeKey);\n continue;\n }\n const sub = new ShardedSubscriber_1.default(this.subscriberGroupEmitter, redis.options);\n this.shardedSubscribers.set(nodeKey, sub);\n startPromises.push(sub\n .start()\n .then(() => {\n this.handleSubscriberConnectSucceeded(nodeKey);\n })\n .catch((error) => {\n this.handleSubscriberConnectFailed(error, nodeKey);\n }));\n this.subscriberGroupEmitter.emit(\"+subscriber\");\n }\n // It's vital to await the start promises before resubscribing\n // Otherwise we might try to resubscribe to a subscriber that is not yet connected\n // This can cause a race condition\n await Promise.all(startPromises);\n this._resubscribe();\n this.subscriberGroupEmitter.emit(\"subscribersReady\");\n }\n finally {\n this.isResetting = false;\n if (this.pendingReset) {\n const { slots, nodes } = this.pendingReset;\n this.pendingReset = null;\n await this.reset(slots, nodes);\n }\n }\n }\n /**\n * Refreshes the subscriber-related slot ranges\n *\n * Returns false if no refresh was needed\n *\n * @param targetSlots\n */\n _refreshSlots(targetSlots) {\n //If there was an actual change, then reassign the slot ranges\n if (this._slotsAreEqual(targetSlots)) {\n debug(\"Nothing to refresh because the new cluster map is equal to the previous one.\");\n return false;\n }\n debug(\"Refreshing the slots of the subscriber group.\");\n //Rebuild the slots index\n this.subscriberToSlotsIndex = new Map();\n for (let slot = 0; slot < targetSlots.length; slot++) {\n const node = targetSlots[slot][0];\n if (!this.subscriberToSlotsIndex.has(node)) {\n this.subscriberToSlotsIndex.set(node, []);\n }\n this.subscriberToSlotsIndex.get(node).push(Number(slot));\n }\n //Update the cached slots map\n this.clusterSlots = JSON.parse(JSON.stringify(targetSlots));\n return true;\n }\n /**\n * Resubscribes to the previous channels\n *\n * @private\n */\n _resubscribe() {\n if (this.shardedSubscribers) {\n this.shardedSubscribers.forEach((s, nodeKey) => {\n const subscriberSlots = this.subscriberToSlotsIndex.get(nodeKey);\n if (subscriberSlots) {\n //Resubscribe on the underlying connection\n subscriberSlots.forEach((ss) => {\n //Might return null if being disconnected\n const redis = s.getInstance();\n const channels = this.channels.get(ss);\n if (channels && channels.length > 0) {\n if (redis.status === \"end\") {\n return;\n }\n if (redis.status === \"ready\") {\n redis.ssubscribe(...channels).catch((err) => {\n // TODO: Should we emit an error event here?\n debug(\"Failed to ssubscribe on node %s: %s\", nodeKey, err);\n });\n }\n else {\n redis.once(\"ready\", () => {\n redis.ssubscribe(...channels).catch((err) => {\n // TODO: Should we emit an error event here?\n debug(\"Failed to ssubscribe on node %s: %s\", nodeKey, err);\n });\n });\n }\n }\n });\n }\n });\n }\n }\n /**\n * Deep equality of the cluster slots objects\n *\n * @param other\n * @private\n */\n _slotsAreEqual(other) {\n if (this.clusterSlots === undefined) {\n return false;\n }\n else {\n return JSON.stringify(this.clusterSlots) === JSON.stringify(other);\n }\n }\n /**\n * Checks if any subscribers are in an unhealthy state.\n *\n * A subscriber is considered unhealthy if:\n * - It exists but is not started (failed/disconnected)\n * - It's missing entirely for a node that should have one\n *\n * @returns true if any subscribers need to be recreated\n */\n hasUnhealthySubscribers() {\n const hasFailedSubscribers = Array.from(this.shardedSubscribers.values()).some((sub) => !sub.isStarted());\n const hasMissingSubscribers = Array.from(this.subscriberToSlotsIndex.keys()).some((nodeKey) => !this.shardedSubscribers.has(nodeKey));\n return hasFailedSubscribers || hasMissingSubscribers;\n }\n}\nexports.default = ClusterSubscriberGroup;\n// Retry strategy\nClusterSubscriberGroup.MAX_RETRY_ATTEMPTS = 10;\nClusterSubscriberGroup.MAX_BACKOFF_MS = 2000;\nClusterSubscriberGroup.BASE_BACKOFF_MS = 100;\n",
41
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst events_1 = require(\"events\");\nconst redis_errors_1 = require(\"redis-errors\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst Command_1 = require(\"../Command\");\nconst ClusterAllFailedError_1 = require(\"../errors/ClusterAllFailedError\");\nconst Redis_1 = require(\"../Redis\");\nconst ScanStream_1 = require(\"../ScanStream\");\nconst transaction_1 = require(\"../transaction\");\nconst utils_1 = require(\"../utils\");\nconst applyMixin_1 = require(\"../utils/applyMixin\");\nconst Commander_1 = require(\"../utils/Commander\");\nconst ClusterOptions_1 = require(\"./ClusterOptions\");\nconst ClusterSubscriber_1 = require(\"./ClusterSubscriber\");\nconst ConnectionPool_1 = require(\"./ConnectionPool\");\nconst DelayQueue_1 = require(\"./DelayQueue\");\nconst util_1 = require(\"./util\");\nconst Deque = require(\"denque\");\nconst ClusterSubscriberGroup_1 = require(\"./ClusterSubscriberGroup\");\nconst debug = (0, utils_1.Debug)(\"cluster\");\nconst REJECT_OVERWRITTEN_COMMANDS = new WeakSet();\n/**\n * Client for the official Redis Cluster\n */\nclass Cluster extends Commander_1.default {\n /**\n * Creates an instance of Cluster.\n */\n //TODO: Add an option that enables or disables sharded PubSub\n constructor(startupNodes, options = {}) {\n super();\n this.slots = [];\n /**\n * @ignore\n */\n this._groupsIds = {};\n /**\n * @ignore\n */\n this._groupsBySlot = Array(16384);\n /**\n * @ignore\n */\n this.isCluster = true;\n this.retryAttempts = 0;\n this.delayQueue = new DelayQueue_1.default();\n this.offlineQueue = new Deque();\n this.isRefreshing = false;\n this._refreshSlotsCacheCallbacks = [];\n this._autoPipelines = new Map();\n this._runningAutoPipelines = new Set();\n this._readyDelayedCallbacks = [];\n /**\n * Every time Cluster#connect() is called, this value will be\n * auto-incrementing. The purpose of this value is used for\n * discarding previous connect attampts when creating a new\n * connection.\n */\n this.connectionEpoch = 0;\n events_1.EventEmitter.call(this);\n this.startupNodes = startupNodes;\n this.options = (0, utils_1.defaults)({}, options, ClusterOptions_1.DEFAULT_CLUSTER_OPTIONS, this.options);\n if (this.options.shardedSubscribers) {\n this.createShardedSubscriberGroup();\n }\n if (this.options.redisOptions &&\n this.options.redisOptions.keyPrefix &&\n !this.options.keyPrefix) {\n this.options.keyPrefix = this.options.redisOptions.keyPrefix;\n }\n // validate options\n if (typeof this.options.scaleReads !== \"function\" &&\n [\"all\", \"master\", \"slave\"].indexOf(this.options.scaleReads) === -1) {\n throw new Error('Invalid option scaleReads \"' +\n this.options.scaleReads +\n '\". Expected \"all\", \"master\", \"slave\" or a custom function');\n }\n this.connectionPool = new ConnectionPool_1.default(this.options.redisOptions);\n this.connectionPool.on(\"-node\", (redis, key) => {\n this.emit(\"-node\", redis);\n });\n this.connectionPool.on(\"+node\", (redis) => {\n this.emit(\"+node\", redis);\n });\n this.connectionPool.on(\"drain\", () => {\n this.setStatus(\"close\");\n });\n this.connectionPool.on(\"nodeError\", (error, key) => {\n this.emit(\"node error\", error, key);\n });\n this.subscriber = new ClusterSubscriber_1.default(this.connectionPool, this);\n if (this.options.scripts) {\n Object.entries(this.options.scripts).forEach(([name, definition]) => {\n this.defineCommand(name, definition);\n });\n }\n if (this.options.lazyConnect) {\n this.setStatus(\"wait\");\n }\n else {\n this.connect().catch((err) => {\n debug(\"connecting failed: %s\", err);\n });\n }\n }\n /**\n * Connect to a cluster\n */\n connect() {\n return new Promise((resolve, reject) => {\n if (this.status === \"connecting\" ||\n this.status === \"connect\" ||\n this.status === \"ready\") {\n reject(new Error(\"Redis is already connecting/connected\"));\n return;\n }\n const epoch = ++this.connectionEpoch;\n this.setStatus(\"connecting\");\n this.resolveStartupNodeHostnames()\n .then((nodes) => {\n if (this.connectionEpoch !== epoch) {\n debug(\"discard connecting after resolving startup nodes because epoch not match: %d != %d\", epoch, this.connectionEpoch);\n reject(new redis_errors_1.RedisError(\"Connection is discarded because a new connection is made\"));\n return;\n }\n if (this.status !== \"connecting\") {\n debug(\"discard connecting after resolving startup nodes because the status changed to %s\", this.status);\n reject(new redis_errors_1.RedisError(\"Connection is aborted\"));\n return;\n }\n this.connectionPool.reset(nodes);\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers\n .reset(this.slots, this.connectionPool.getNodes(\"all\"))\n .catch((err) => {\n // TODO should we emit an error event here?\n debug(\"Error while starting subscribers: %s\", err);\n });\n }\n const readyHandler = () => {\n this.setStatus(\"ready\");\n this.retryAttempts = 0;\n this.executeOfflineCommands();\n this.resetNodesRefreshInterval();\n resolve();\n };\n let closeListener = undefined;\n const refreshListener = () => {\n this.invokeReadyDelayedCallbacks(undefined);\n this.removeListener(\"close\", closeListener);\n this.manuallyClosing = false;\n this.setStatus(\"connect\");\n if (this.options.enableReadyCheck) {\n this.readyCheck((err, fail) => {\n if (err || fail) {\n debug(\"Ready check failed (%s). Reconnecting...\", err || fail);\n if (this.status === \"connect\") {\n this.disconnect(true);\n }\n }\n else {\n readyHandler();\n }\n });\n }\n else {\n readyHandler();\n }\n };\n closeListener = () => {\n const error = new Error(\"None of startup nodes is available\");\n this.removeListener(\"refresh\", refreshListener);\n this.invokeReadyDelayedCallbacks(error);\n reject(error);\n };\n this.once(\"refresh\", refreshListener);\n this.once(\"close\", closeListener);\n this.once(\"close\", this.handleCloseEvent.bind(this));\n this.refreshSlotsCache((err) => {\n if (err && err.message === ClusterAllFailedError_1.default.defaultMessage) {\n Redis_1.default.prototype.silentEmit.call(this, \"error\", err);\n this.connectionPool.reset([]);\n }\n });\n this.subscriber.start();\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers.start().catch((err) => {\n // TODO should we emit an error event here?\n debug(\"Error while starting subscribers: %s\", err);\n });\n }\n })\n .catch((err) => {\n this.setStatus(\"close\");\n this.handleCloseEvent(err);\n this.invokeReadyDelayedCallbacks(err);\n reject(err);\n });\n });\n }\n /**\n * Disconnect from every node in the cluster.\n */\n disconnect(reconnect = false) {\n const status = this.status;\n this.setStatus(\"disconnecting\");\n if (!reconnect) {\n this.manuallyClosing = true;\n }\n if (this.reconnectTimeout && !reconnect) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n debug(\"Canceled reconnecting attempts\");\n }\n this.clearNodesRefreshInterval();\n this.subscriber.stop();\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers.stop();\n }\n if (status === \"wait\") {\n this.setStatus(\"close\");\n this.handleCloseEvent();\n }\n else {\n this.connectionPool.reset([]);\n }\n }\n /**\n * Quit the cluster gracefully.\n */\n quit(callback) {\n const status = this.status;\n this.setStatus(\"disconnecting\");\n this.manuallyClosing = true;\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n this.clearNodesRefreshInterval();\n this.subscriber.stop();\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers.stop();\n }\n if (status === \"wait\") {\n const ret = (0, standard_as_callback_1.default)(Promise.resolve(\"OK\"), callback);\n // use setImmediate to make sure \"close\" event\n // being emitted after quit() is returned\n setImmediate(function () {\n this.setStatus(\"close\");\n this.handleCloseEvent();\n }.bind(this));\n return ret;\n }\n return (0, standard_as_callback_1.default)(Promise.all(this.nodes().map((node) => node.quit().catch((err) => {\n // Ignore the error caused by disconnecting since\n // we're disconnecting...\n if (err.message === utils_1.CONNECTION_CLOSED_ERROR_MSG) {\n return \"OK\";\n }\n throw err;\n }))).then(() => \"OK\"), callback);\n }\n /**\n * Create a new instance with the same startup nodes and options as the current one.\n *\n * @example\n * ```js\n * var cluster = new Redis.Cluster([{ host: \"127.0.0.1\", port: \"30001\" }]);\n * var anotherCluster = cluster.duplicate();\n * ```\n */\n duplicate(overrideStartupNodes = [], overrideOptions = {}) {\n const startupNodes = overrideStartupNodes.length > 0\n ? overrideStartupNodes\n : this.startupNodes.slice(0);\n const options = Object.assign({}, this.options, overrideOptions);\n return new Cluster(startupNodes, options);\n }\n /**\n * Get nodes with the specified role\n */\n nodes(role = \"all\") {\n if (role !== \"all\" && role !== \"master\" && role !== \"slave\") {\n throw new Error('Invalid role \"' + role + '\". Expected \"all\", \"master\" or \"slave\"');\n }\n return this.connectionPool.getNodes(role);\n }\n /**\n * This is needed in order not to install a listener for each auto pipeline\n *\n * @ignore\n */\n delayUntilReady(callback) {\n this._readyDelayedCallbacks.push(callback);\n }\n /**\n * Get the number of commands queued in automatic pipelines.\n *\n * This is not available (and returns 0) until the cluster is connected and slots information have been received.\n */\n get autoPipelineQueueSize() {\n let queued = 0;\n for (const pipeline of this._autoPipelines.values()) {\n queued += pipeline.length;\n }\n return queued;\n }\n /**\n * Refresh the slot cache\n *\n * @ignore\n */\n refreshSlotsCache(callback) {\n if (callback) {\n this._refreshSlotsCacheCallbacks.push(callback);\n }\n if (this.isRefreshing) {\n return;\n }\n this.isRefreshing = true;\n const _this = this;\n const wrapper = (error) => {\n this.isRefreshing = false;\n for (const callback of this._refreshSlotsCacheCallbacks) {\n callback(error);\n }\n this._refreshSlotsCacheCallbacks = [];\n };\n const nodes = (0, utils_1.shuffle)(this.connectionPool.getNodes());\n let lastNodeError = null;\n function tryNode(index) {\n if (index === nodes.length) {\n const error = new ClusterAllFailedError_1.default(ClusterAllFailedError_1.default.defaultMessage, lastNodeError);\n return wrapper(error);\n }\n const node = nodes[index];\n const key = `${node.options.host}:${node.options.port}`;\n debug(\"getting slot cache from %s\", key);\n _this.getInfoFromNode(node, function (err) {\n switch (_this.status) {\n case \"close\":\n case \"end\":\n return wrapper(new Error(\"Cluster is disconnected.\"));\n case \"disconnecting\":\n return wrapper(new Error(\"Cluster is disconnecting.\"));\n }\n if (err) {\n _this.emit(\"node error\", err, key);\n lastNodeError = err;\n tryNode(index + 1);\n }\n else {\n _this.emit(\"refresh\");\n wrapper();\n }\n });\n }\n tryNode(0);\n }\n /**\n * @ignore\n */\n sendCommand(command, stream, node) {\n if (this.status === \"wait\") {\n this.connect().catch(utils_1.noop);\n }\n if (this.status === \"end\") {\n command.reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n return command.promise;\n }\n let to = this.options.scaleReads;\n if (to !== \"master\") {\n const isCommandReadOnly = command.isReadOnly ||\n ((0, commands_1.exists)(command.name) && (0, commands_1.hasFlag)(command.name, \"readonly\"));\n if (!isCommandReadOnly) {\n to = \"master\";\n }\n }\n let targetSlot = node ? node.slot : command.getSlot();\n const ttl = {};\n const _this = this;\n if (!node && !REJECT_OVERWRITTEN_COMMANDS.has(command)) {\n REJECT_OVERWRITTEN_COMMANDS.add(command);\n const reject = command.reject;\n command.reject = function (err) {\n const partialTry = tryConnection.bind(null, true);\n _this.handleError(err, ttl, {\n moved: function (slot, key) {\n debug(\"command %s is moved to %s\", command.name, key);\n targetSlot = Number(slot);\n if (_this.slots[slot]) {\n _this.slots[slot][0] = key;\n }\n else {\n _this.slots[slot] = [key];\n }\n _this._groupsBySlot[slot] =\n _this._groupsIds[_this.slots[slot].join(\";\")];\n _this.connectionPool.findOrCreate(_this.natMapper(key));\n tryConnection();\n debug(\"refreshing slot caches... (triggered by MOVED error)\");\n _this.refreshSlotsCache();\n },\n ask: function (slot, key) {\n debug(\"command %s is required to ask %s:%s\", command.name, key);\n const mapped = _this.natMapper(key);\n _this.connectionPool.findOrCreate(mapped);\n tryConnection(false, `${mapped.host}:${mapped.port}`);\n },\n tryagain: partialTry,\n clusterDown: partialTry,\n connectionClosed: partialTry,\n maxRedirections: function (redirectionError) {\n reject.call(command, redirectionError);\n },\n defaults: function () {\n reject.call(command, err);\n },\n });\n };\n }\n tryConnection();\n function tryConnection(random, asking) {\n if (_this.status === \"end\") {\n command.reject(new redis_errors_1.AbortError(\"Cluster is ended.\"));\n return;\n }\n let redis;\n if (_this.status === \"ready\" || command.name === \"cluster\") {\n if (node && node.redis) {\n redis = node.redis;\n }\n else if (Command_1.default.checkFlag(\"ENTER_SUBSCRIBER_MODE\", command.name) ||\n Command_1.default.checkFlag(\"EXIT_SUBSCRIBER_MODE\", command.name)) {\n if (_this.options.shardedSubscribers &&\n (command.name == \"ssubscribe\" || command.name == \"sunsubscribe\")) {\n const sub = _this.shardedSubscribers.getResponsibleSubscriber(targetSlot);\n if (!sub) {\n command.reject(new redis_errors_1.AbortError(`No sharded subscriber for slot: ${targetSlot}`));\n return;\n }\n let status = -1;\n if (command.name == \"ssubscribe\") {\n status = _this.shardedSubscribers.addChannels(command.getKeys());\n }\n if (command.name == \"sunsubscribe\") {\n status = _this.shardedSubscribers.removeChannels(command.getKeys());\n }\n if (status !== -1) {\n redis = sub.getInstance();\n }\n else {\n command.reject(new redis_errors_1.AbortError(\"Possible CROSSSLOT error: All channels must hash to the same slot\"));\n }\n }\n else {\n redis = _this.subscriber.getInstance();\n }\n if (!redis) {\n command.reject(new redis_errors_1.AbortError(\"No subscriber for the cluster\"));\n return;\n }\n }\n else {\n if (!random) {\n if (typeof targetSlot === \"number\" && _this.slots[targetSlot]) {\n const nodeKeys = _this.slots[targetSlot];\n if (typeof to === \"function\") {\n const nodes = nodeKeys.map(function (key) {\n return _this.connectionPool.getInstanceByKey(key);\n });\n redis = to(nodes, command);\n if (Array.isArray(redis)) {\n redis = (0, utils_1.sample)(redis);\n }\n if (!redis) {\n redis = nodes[0];\n }\n }\n else {\n let key;\n if (to === \"all\") {\n key = (0, utils_1.sample)(nodeKeys);\n }\n else if (to === \"slave\" && nodeKeys.length > 1) {\n key = (0, utils_1.sample)(nodeKeys, 1);\n }\n else {\n key = nodeKeys[0];\n }\n redis = _this.connectionPool.getInstanceByKey(key);\n }\n }\n if (asking) {\n redis = _this.connectionPool.getInstanceByKey(asking);\n redis.asking();\n }\n }\n if (!redis) {\n redis =\n (typeof to === \"function\"\n ? null\n : _this.connectionPool.getSampleInstance(to)) ||\n _this.connectionPool.getSampleInstance(\"all\");\n }\n }\n if (node && !node.redis) {\n node.redis = redis;\n }\n }\n if (redis) {\n redis.sendCommand(command, stream);\n }\n else if (_this.options.enableOfflineQueue) {\n _this.offlineQueue.push({\n command: command,\n stream: stream,\n node: node,\n });\n }\n else {\n command.reject(new Error(\"Cluster isn't ready and enableOfflineQueue options is false\"));\n }\n }\n return command.promise;\n }\n sscanStream(key, options) {\n return this.createScanStream(\"sscan\", { key, options });\n }\n sscanBufferStream(key, options) {\n return this.createScanStream(\"sscanBuffer\", { key, options });\n }\n hscanStream(key, options) {\n return this.createScanStream(\"hscan\", { key, options });\n }\n hscanBufferStream(key, options) {\n return this.createScanStream(\"hscanBuffer\", { key, options });\n }\n zscanStream(key, options) {\n return this.createScanStream(\"zscan\", { key, options });\n }\n zscanBufferStream(key, options) {\n return this.createScanStream(\"zscanBuffer\", { key, options });\n }\n /**\n * @ignore\n */\n handleError(error, ttl, handlers) {\n if (typeof ttl.value === \"undefined\") {\n ttl.value = this.options.maxRedirections;\n }\n else {\n ttl.value -= 1;\n }\n if (ttl.value <= 0) {\n handlers.maxRedirections(new Error(\"Too many Cluster redirections. Last error: \" + error));\n return;\n }\n const errv = error.message.split(\" \");\n if (errv[0] === \"MOVED\") {\n const timeout = this.options.retryDelayOnMoved;\n if (timeout && typeof timeout === \"number\") {\n this.delayQueue.push(\"moved\", handlers.moved.bind(null, errv[1], errv[2]), { timeout });\n }\n else {\n handlers.moved(errv[1], errv[2]);\n }\n }\n else if (errv[0] === \"ASK\") {\n handlers.ask(errv[1], errv[2]);\n }\n else if (errv[0] === \"TRYAGAIN\") {\n this.delayQueue.push(\"tryagain\", handlers.tryagain, {\n timeout: this.options.retryDelayOnTryAgain,\n });\n }\n else if (errv[0] === \"CLUSTERDOWN\" &&\n this.options.retryDelayOnClusterDown > 0) {\n this.delayQueue.push(\"clusterdown\", handlers.connectionClosed, {\n timeout: this.options.retryDelayOnClusterDown,\n callback: this.refreshSlotsCache.bind(this),\n });\n }\n else if (error.message === utils_1.CONNECTION_CLOSED_ERROR_MSG &&\n this.options.retryDelayOnFailover > 0 &&\n this.status === \"ready\") {\n this.delayQueue.push(\"failover\", handlers.connectionClosed, {\n timeout: this.options.retryDelayOnFailover,\n callback: this.refreshSlotsCache.bind(this),\n });\n }\n else {\n handlers.defaults();\n }\n }\n resetOfflineQueue() {\n this.offlineQueue = new Deque();\n }\n clearNodesRefreshInterval() {\n if (this.slotsTimer) {\n clearTimeout(this.slotsTimer);\n this.slotsTimer = null;\n }\n }\n resetNodesRefreshInterval() {\n if (this.slotsTimer || !this.options.slotsRefreshInterval) {\n return;\n }\n const nextRound = () => {\n this.slotsTimer = setTimeout(() => {\n debug('refreshing slot caches... (triggered by \"slotsRefreshInterval\" option)');\n this.refreshSlotsCache(() => {\n nextRound();\n });\n }, this.options.slotsRefreshInterval);\n };\n nextRound();\n }\n /**\n * Change cluster instance's status\n */\n setStatus(status) {\n debug(\"status: %s -> %s\", this.status || \"[empty]\", status);\n this.status = status;\n process.nextTick(() => {\n this.emit(status);\n });\n }\n /**\n * Called when closed to check whether a reconnection should be made\n */\n handleCloseEvent(reason) {\n var _a;\n if (reason) {\n debug(\"closed because %s\", reason);\n }\n let retryDelay;\n if (!this.manuallyClosing &&\n typeof this.options.clusterRetryStrategy === \"function\") {\n retryDelay = this.options.clusterRetryStrategy.call(this, ++this.retryAttempts, reason);\n }\n if (typeof retryDelay === \"number\") {\n this.setStatus(\"reconnecting\");\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n debug(\"Cluster is disconnected. Retrying after %dms\", retryDelay);\n this.connect().catch(function (err) {\n debug(\"Got error %s when reconnecting. Ignoring...\", err);\n });\n }, retryDelay);\n }\n else {\n if (this.options.shardedSubscribers) {\n (_a = this.subscriberGroupEmitter) === null || _a === void 0 ? void 0 : _a.removeAllListeners();\n }\n this.setStatus(\"end\");\n this.flushQueue(new Error(\"None of startup nodes is available\"));\n }\n }\n /**\n * Flush offline queue with error.\n */\n flushQueue(error) {\n let item;\n while ((item = this.offlineQueue.shift())) {\n item.command.reject(error);\n }\n }\n executeOfflineCommands() {\n if (this.offlineQueue.length) {\n debug(\"send %d commands in offline queue\", this.offlineQueue.length);\n const offlineQueue = this.offlineQueue;\n this.resetOfflineQueue();\n let item;\n while ((item = offlineQueue.shift())) {\n this.sendCommand(item.command, item.stream, item.node);\n }\n }\n }\n natMapper(nodeKey) {\n const key = typeof nodeKey === \"string\"\n ? nodeKey\n : `${nodeKey.host}:${nodeKey.port}`;\n let mapped = null;\n if (this.options.natMap && typeof this.options.natMap === \"function\") {\n mapped = this.options.natMap(key);\n }\n else if (this.options.natMap && typeof this.options.natMap === \"object\") {\n mapped = this.options.natMap[key];\n }\n if (mapped) {\n debug(\"NAT mapping %s -> %O\", key, mapped);\n return Object.assign({}, mapped);\n }\n return typeof nodeKey === \"string\"\n ? (0, util_1.nodeKeyToRedisOptions)(nodeKey)\n : nodeKey;\n }\n getInfoFromNode(redis, callback) {\n if (!redis) {\n return callback(new Error(\"Node is disconnected\"));\n }\n // Use a duplication of the connection to avoid\n // timeouts when the connection is in the blocking\n // mode (e.g. waiting for BLPOP).\n const duplicatedConnection = redis.duplicate({\n enableOfflineQueue: true,\n enableReadyCheck: false,\n retryStrategy: null,\n connectionName: (0, util_1.getConnectionName)(\"refresher\", this.options.redisOptions && this.options.redisOptions.connectionName),\n });\n // Ignore error events since we will handle\n // exceptions for the CLUSTER SLOTS command.\n duplicatedConnection.on(\"error\", utils_1.noop);\n duplicatedConnection.cluster(\"SLOTS\", (0, utils_1.timeout)((err, result) => {\n duplicatedConnection.disconnect();\n if (err) {\n debug(\"error encountered running CLUSTER.SLOTS: %s\", err);\n return callback(err);\n }\n if (this.status === \"disconnecting\" ||\n this.status === \"close\" ||\n this.status === \"end\") {\n debug(\"ignore CLUSTER.SLOTS results (count: %d) since cluster status is %s\", result.length, this.status);\n callback();\n return;\n }\n const nodes = [];\n debug(\"cluster slots result count: %d\", result.length);\n for (let i = 0; i < result.length; ++i) {\n const items = result[i];\n const slotRangeStart = items[0];\n const slotRangeEnd = items[1];\n const keys = [];\n for (let j = 2; j < items.length; j++) {\n if (!items[j][0]) {\n continue;\n }\n const node = this.natMapper({\n host: items[j][0],\n port: items[j][1],\n });\n node.readOnly = j !== 2;\n nodes.push(node);\n keys.push(node.host + \":\" + node.port);\n }\n debug(\"cluster slots result [%d]: slots %d~%d served by %s\", i, slotRangeStart, slotRangeEnd, keys);\n for (let slot = slotRangeStart; slot <= slotRangeEnd; slot++) {\n this.slots[slot] = keys;\n }\n }\n // Assign to each node keys a numeric value to make autopipeline comparison faster.\n this._groupsIds = Object.create(null);\n let j = 0;\n for (let i = 0; i < 16384; i++) {\n const target = (this.slots[i] || []).join(\";\");\n if (!target.length) {\n this._groupsBySlot[i] = undefined;\n continue;\n }\n if (!this._groupsIds[target]) {\n this._groupsIds[target] = ++j;\n }\n this._groupsBySlot[i] = this._groupsIds[target];\n }\n this.connectionPool.reset(nodes);\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers\n .reset(this.slots, this.connectionPool.getNodes(\"all\"))\n .catch((err) => {\n // TODO should we emit an error event here?\n debug(\"Error while starting subscribers: %s\", err);\n });\n }\n callback();\n }, this.options.slotsRefreshTimeout));\n }\n invokeReadyDelayedCallbacks(err) {\n for (const c of this._readyDelayedCallbacks) {\n process.nextTick(c, err);\n }\n this._readyDelayedCallbacks = [];\n }\n /**\n * Check whether Cluster is able to process commands\n */\n readyCheck(callback) {\n this.cluster(\"INFO\", (err, res) => {\n if (err) {\n return callback(err);\n }\n if (typeof res !== \"string\") {\n return callback();\n }\n let state;\n const lines = res.split(\"\\r\\n\");\n for (let i = 0; i < lines.length; ++i) {\n const parts = lines[i].split(\":\");\n if (parts[0] === \"cluster_state\") {\n state = parts[1];\n break;\n }\n }\n if (state === \"fail\") {\n debug(\"cluster state not ok (%s)\", state);\n callback(null, state);\n }\n else {\n callback();\n }\n });\n }\n resolveSrv(hostname) {\n return new Promise((resolve, reject) => {\n this.options.resolveSrv(hostname, (err, records) => {\n if (err) {\n return reject(err);\n }\n const self = this, groupedRecords = (0, util_1.groupSrvRecords)(records), sortedKeys = Object.keys(groupedRecords).sort((a, b) => parseInt(a) - parseInt(b));\n function tryFirstOne(err) {\n if (!sortedKeys.length) {\n return reject(err);\n }\n const key = sortedKeys[0], group = groupedRecords[key], record = (0, util_1.weightSrvRecords)(group);\n if (!group.records.length) {\n sortedKeys.shift();\n }\n self.dnsLookup(record.name).then((host) => resolve({\n host,\n port: record.port,\n }), tryFirstOne);\n }\n tryFirstOne();\n });\n });\n }\n dnsLookup(hostname) {\n return new Promise((resolve, reject) => {\n this.options.dnsLookup(hostname, (err, address) => {\n if (err) {\n debug(\"failed to resolve hostname %s to IP: %s\", hostname, err.message);\n reject(err);\n }\n else {\n debug(\"resolved hostname %s to IP %s\", hostname, address);\n resolve(address);\n }\n });\n });\n }\n /**\n * Normalize startup nodes, and resolving hostnames to IPs.\n *\n * This process happens every time when #connect() is called since\n * #startupNodes and DNS records may chanage.\n */\n async resolveStartupNodeHostnames() {\n if (!Array.isArray(this.startupNodes) || this.startupNodes.length === 0) {\n throw new Error(\"`startupNodes` should contain at least one node.\");\n }\n const startupNodes = (0, util_1.normalizeNodeOptions)(this.startupNodes);\n const hostnames = (0, util_1.getUniqueHostnamesFromOptions)(startupNodes);\n if (hostnames.length === 0) {\n return startupNodes;\n }\n const configs = await Promise.all(hostnames.map((this.options.useSRVRecords ? this.resolveSrv : this.dnsLookup).bind(this)));\n const hostnameToConfig = (0, utils_1.zipMap)(hostnames, configs);\n return startupNodes.map((node) => {\n const config = hostnameToConfig.get(node.host);\n if (!config) {\n return node;\n }\n if (this.options.useSRVRecords) {\n return Object.assign({}, node, config);\n }\n return Object.assign({}, node, { host: config });\n });\n }\n createScanStream(command, { key, options = {} }) {\n return new ScanStream_1.default({\n objectMode: true,\n key: key,\n redis: this,\n command: command,\n ...options,\n });\n }\n createShardedSubscriberGroup() {\n this.subscriberGroupEmitter = new events_1.EventEmitter();\n this.shardedSubscribers = new ClusterSubscriberGroup_1.default(this.subscriberGroupEmitter);\n // Error handler used only for sharded-subscriber-triggered slots cache refreshes.\n // Normal (non-subscriber) connections are created with lazyConnect: true and can\n // become zombied. For sharded subscribers, a ClusterAllFailedError means\n // we have lost all nodes from the subscriber perspective and must tear down.\n const refreshSlotsCacheCallback = (err) => {\n // Disconnect only when refreshing the slots cache fails with ClusterAllFailedError\n if (err instanceof ClusterAllFailedError_1.default) {\n this.disconnect(true);\n }\n };\n this.subscriberGroupEmitter.on(\"-node\", (redis, nodeKey) => {\n this.emit(\"-node\", redis, nodeKey);\n this.refreshSlotsCache(refreshSlotsCacheCallback);\n });\n this.subscriberGroupEmitter.on(\"subscriberConnectFailed\", ({ delay, error }) => {\n this.emit(\"error\", error);\n setTimeout(() => {\n this.refreshSlotsCache(refreshSlotsCacheCallback);\n }, delay);\n });\n this.subscriberGroupEmitter.on(\"moved\", () => {\n this.refreshSlotsCache(refreshSlotsCacheCallback);\n });\n this.subscriberGroupEmitter.on(\"-subscriber\", () => {\n this.emit(\"-subscriber\");\n });\n this.subscriberGroupEmitter.on(\"+subscriber\", () => {\n this.emit(\"+subscriber\");\n });\n this.subscriberGroupEmitter.on(\"nodeError\", (error, nodeKey) => {\n this.emit(\"nodeError\", error, nodeKey);\n });\n this.subscriberGroupEmitter.on(\"subscribersReady\", () => {\n this.emit(\"subscribersReady\");\n });\n for (const event of [\"smessage\", \"smessageBuffer\"]) {\n this.subscriberGroupEmitter.on(event, (arg1, arg2, arg3) => {\n this.emit(event, arg1, arg2, arg3);\n });\n }\n }\n}\n(0, applyMixin_1.default)(Cluster, events_1.EventEmitter);\n(0, transaction_1.addTransactionSupport)(Cluster.prototype);\nexports.default = Cluster;\n",
42
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst debug = (0, utils_1.Debug)(\"AbstractConnector\");\nclass AbstractConnector {\n constructor(disconnectTimeout) {\n this.connecting = false;\n this.disconnectTimeout = disconnectTimeout;\n }\n check(info) {\n return true;\n }\n disconnect() {\n this.connecting = false;\n if (this.stream) {\n const stream = this.stream; // Make sure callbacks refer to the same instance\n const timeout = setTimeout(() => {\n debug(\"stream %s:%s still open, destroying it\", stream.remoteAddress, stream.remotePort);\n stream.destroy();\n }, this.disconnectTimeout);\n stream.on(\"close\", () => clearTimeout(timeout));\n stream.end();\n }\n }\n}\nexports.default = AbstractConnector;\n",
43
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst net_1 = require(\"net\");\nconst tls_1 = require(\"tls\");\nconst utils_1 = require(\"../utils\");\nconst AbstractConnector_1 = require(\"./AbstractConnector\");\nclass StandaloneConnector extends AbstractConnector_1.default {\n constructor(options) {\n super(options.disconnectTimeout);\n this.options = options;\n }\n connect(_) {\n const { options } = this;\n this.connecting = true;\n let connectionOptions;\n if (\"path\" in options && options.path) {\n connectionOptions = {\n path: options.path,\n };\n }\n else {\n connectionOptions = {};\n if (\"port\" in options && options.port != null) {\n connectionOptions.port = options.port;\n }\n if (\"host\" in options && options.host != null) {\n connectionOptions.host = options.host;\n }\n if (\"family\" in options && options.family != null) {\n connectionOptions.family = options.family;\n }\n }\n if (options.tls) {\n Object.assign(connectionOptions, options.tls);\n }\n // TODO:\n // We use native Promise here since other Promise\n // implementation may use different schedulers that\n // cause issue when the stream is resolved in the\n // next tick.\n // Should use the provided promise in the next major\n // version and do not connect before resolved.\n return new Promise((resolve, reject) => {\n process.nextTick(() => {\n if (!this.connecting) {\n reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n return;\n }\n try {\n if (options.tls) {\n this.stream = (0, tls_1.connect)(connectionOptions);\n }\n else {\n this.stream = (0, net_1.createConnection)(connectionOptions);\n }\n }\n catch (err) {\n reject(err);\n return;\n }\n this.stream.once(\"error\", (err) => {\n this.firstError = err;\n });\n resolve(this.stream);\n });\n });\n }\n}\nexports.default = StandaloneConnector;\n",
44
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction isSentinelEql(a, b) {\n return ((a.host || \"127.0.0.1\") === (b.host || \"127.0.0.1\") &&\n (a.port || 26379) === (b.port || 26379));\n}\nclass SentinelIterator {\n constructor(sentinels) {\n this.cursor = 0;\n this.sentinels = sentinels.slice(0);\n }\n next() {\n const done = this.cursor >= this.sentinels.length;\n return { done, value: done ? undefined : this.sentinels[this.cursor++] };\n }\n reset(moveCurrentEndpointToFirst) {\n if (moveCurrentEndpointToFirst &&\n this.sentinels.length > 1 &&\n this.cursor !== 1) {\n this.sentinels.unshift(...this.sentinels.splice(this.cursor - 1));\n }\n this.cursor = 0;\n }\n add(sentinel) {\n for (let i = 0; i < this.sentinels.length; i++) {\n if (isSentinelEql(sentinel, this.sentinels[i])) {\n return false;\n }\n }\n this.sentinels.push(sentinel);\n return true;\n }\n toString() {\n return `${JSON.stringify(this.sentinels)} @${this.cursor}`;\n }\n}\nexports.default = SentinelIterator;\n",
45
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FailoverDetector = void 0;\nconst utils_1 = require(\"../../utils\");\nconst debug = (0, utils_1.Debug)(\"FailoverDetector\");\nconst CHANNEL_NAME = \"+switch-master\";\nclass FailoverDetector {\n // sentinels can't be used for regular commands after this\n constructor(connector, sentinels) {\n this.isDisconnected = false;\n this.connector = connector;\n this.sentinels = sentinels;\n }\n cleanup() {\n this.isDisconnected = true;\n for (const sentinel of this.sentinels) {\n sentinel.client.disconnect();\n }\n }\n async subscribe() {\n debug(\"Starting FailoverDetector\");\n const promises = [];\n for (const sentinel of this.sentinels) {\n const promise = sentinel.client.subscribe(CHANNEL_NAME).catch((err) => {\n debug(\"Failed to subscribe to failover messages on sentinel %s:%s (%s)\", sentinel.address.host || \"127.0.0.1\", sentinel.address.port || 26739, err.message);\n });\n promises.push(promise);\n sentinel.client.on(\"message\", (channel) => {\n if (!this.isDisconnected && channel === CHANNEL_NAME) {\n this.disconnect();\n }\n });\n }\n await Promise.all(promises);\n }\n disconnect() {\n // Avoid disconnecting more than once per failover.\n // A new FailoverDetector will be created after reconnecting.\n this.isDisconnected = true;\n debug(\"Failover detected, disconnecting\");\n // Will call this.cleanup()\n this.connector.disconnect();\n }\n}\nexports.FailoverDetector = FailoverDetector;\n",
46
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SentinelIterator = void 0;\nconst net_1 = require(\"net\");\nconst utils_1 = require(\"../../utils\");\nconst tls_1 = require(\"tls\");\nconst SentinelIterator_1 = require(\"./SentinelIterator\");\nexports.SentinelIterator = SentinelIterator_1.default;\nconst AbstractConnector_1 = require(\"../AbstractConnector\");\nconst Redis_1 = require(\"../../Redis\");\nconst FailoverDetector_1 = require(\"./FailoverDetector\");\nconst debug = (0, utils_1.Debug)(\"SentinelConnector\");\nclass SentinelConnector extends AbstractConnector_1.default {\n constructor(options) {\n super(options.disconnectTimeout);\n this.options = options;\n this.emitter = null;\n this.failoverDetector = null;\n if (!this.options.sentinels.length) {\n throw new Error(\"Requires at least one sentinel to connect to.\");\n }\n if (!this.options.name) {\n throw new Error(\"Requires the name of master.\");\n }\n this.sentinelIterator = new SentinelIterator_1.default(this.options.sentinels);\n }\n check(info) {\n const roleMatches = !info.role || this.options.role === info.role;\n if (!roleMatches) {\n debug(\"role invalid, expected %s, but got %s\", this.options.role, info.role);\n // Start from the next item.\n // Note that `reset` will move the cursor to the previous element,\n // so we advance two steps here.\n this.sentinelIterator.next();\n this.sentinelIterator.next();\n this.sentinelIterator.reset(true);\n }\n return roleMatches;\n }\n disconnect() {\n super.disconnect();\n if (this.failoverDetector) {\n this.failoverDetector.cleanup();\n }\n }\n connect(eventEmitter) {\n this.connecting = true;\n this.retryAttempts = 0;\n let lastError;\n const connectToNext = async () => {\n const endpoint = this.sentinelIterator.next();\n if (endpoint.done) {\n this.sentinelIterator.reset(false);\n const retryDelay = typeof this.options.sentinelRetryStrategy === \"function\"\n ? this.options.sentinelRetryStrategy(++this.retryAttempts)\n : null;\n let errorMsg = typeof retryDelay !== \"number\"\n ? \"All sentinels are unreachable and retry is disabled.\"\n : `All sentinels are unreachable. Retrying from scratch after ${retryDelay}ms.`;\n if (lastError) {\n errorMsg += ` Last error: ${lastError.message}`;\n }\n debug(errorMsg);\n const error = new Error(errorMsg);\n if (typeof retryDelay === \"number\") {\n eventEmitter(\"error\", error);\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n return connectToNext();\n }\n else {\n throw error;\n }\n }\n let resolved = null;\n let err = null;\n try {\n resolved = await this.resolve(endpoint.value);\n }\n catch (error) {\n err = error;\n }\n if (!this.connecting) {\n throw new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG);\n }\n const endpointAddress = endpoint.value.host + \":\" + endpoint.value.port;\n if (resolved) {\n debug(\"resolved: %s:%s from sentinel %s\", resolved.host, resolved.port, endpointAddress);\n if (this.options.enableTLSForSentinelMode && this.options.tls) {\n Object.assign(resolved, this.options.tls);\n this.stream = (0, tls_1.connect)(resolved);\n this.stream.once(\"secureConnect\", this.initFailoverDetector.bind(this));\n }\n else {\n this.stream = (0, net_1.createConnection)(resolved);\n this.stream.once(\"connect\", this.initFailoverDetector.bind(this));\n }\n this.stream.once(\"error\", (err) => {\n this.firstError = err;\n });\n return this.stream;\n }\n else {\n const errorMsg = err\n ? \"failed to connect to sentinel \" +\n endpointAddress +\n \" because \" +\n err.message\n : \"connected to sentinel \" +\n endpointAddress +\n \" successfully, but got an invalid reply: \" +\n resolved;\n debug(errorMsg);\n eventEmitter(\"sentinelError\", new Error(errorMsg));\n if (err) {\n lastError = err;\n }\n return connectToNext();\n }\n };\n return connectToNext();\n }\n async updateSentinels(client) {\n if (!this.options.updateSentinels) {\n return;\n }\n const result = await client.sentinel(\"sentinels\", this.options.name);\n if (!Array.isArray(result)) {\n return;\n }\n result\n .map(utils_1.packObject)\n .forEach((sentinel) => {\n const flags = sentinel.flags ? sentinel.flags.split(\",\") : [];\n if (flags.indexOf(\"disconnected\") === -1 &&\n sentinel.ip &&\n sentinel.port) {\n const endpoint = this.sentinelNatResolve(addressResponseToAddress(sentinel));\n if (this.sentinelIterator.add(endpoint)) {\n debug(\"adding sentinel %s:%s\", endpoint.host, endpoint.port);\n }\n }\n });\n debug(\"Updated internal sentinels: %s\", this.sentinelIterator);\n }\n async resolveMaster(client) {\n const result = await client.sentinel(\"get-master-addr-by-name\", this.options.name);\n await this.updateSentinels(client);\n return this.sentinelNatResolve(Array.isArray(result)\n ? { host: result[0], port: Number(result[1]) }\n : null);\n }\n async resolveSlave(client) {\n const result = await client.sentinel(\"slaves\", this.options.name);\n if (!Array.isArray(result)) {\n return null;\n }\n const availableSlaves = result\n .map(utils_1.packObject)\n .filter((slave) => slave.flags && !slave.flags.match(/(disconnected|s_down|o_down)/));\n return this.sentinelNatResolve(selectPreferredSentinel(availableSlaves, this.options.preferredSlaves));\n }\n sentinelNatResolve(item) {\n if (!item || !this.options.natMap)\n return item;\n const key = `${item.host}:${item.port}`;\n let result = item;\n if (typeof this.options.natMap === \"function\") {\n result = this.options.natMap(key) || item;\n }\n else if (typeof this.options.natMap === \"object\") {\n result = this.options.natMap[key] || item;\n }\n return result;\n }\n connectToSentinel(endpoint, options) {\n const redis = new Redis_1.default({\n port: endpoint.port || 26379,\n host: endpoint.host,\n username: this.options.sentinelUsername || null,\n password: this.options.sentinelPassword || null,\n family: endpoint.family ||\n // @ts-expect-error\n (\"path\" in this.options && this.options.path\n ? undefined\n : // @ts-expect-error\n this.options.family),\n tls: this.options.sentinelTLS,\n retryStrategy: null,\n enableReadyCheck: false,\n connectTimeout: this.options.connectTimeout,\n commandTimeout: this.options.sentinelCommandTimeout,\n ...options,\n });\n // @ts-expect-error\n return redis;\n }\n async resolve(endpoint) {\n const client = this.connectToSentinel(endpoint);\n // ignore the errors since resolve* methods will handle them\n client.on(\"error\", noop);\n try {\n if (this.options.role === \"slave\") {\n return await this.resolveSlave(client);\n }\n else {\n return await this.resolveMaster(client);\n }\n }\n finally {\n client.disconnect();\n }\n }\n async initFailoverDetector() {\n var _a;\n if (!this.options.failoverDetector) {\n return;\n }\n // Move the current sentinel to the first position\n this.sentinelIterator.reset(true);\n const sentinels = [];\n // In case of a large amount of sentinels, limit the number of concurrent connections\n while (sentinels.length < this.options.sentinelMaxConnections) {\n const { done, value } = this.sentinelIterator.next();\n if (done) {\n break;\n }\n const client = this.connectToSentinel(value, {\n lazyConnect: true,\n retryStrategy: this.options.sentinelReconnectStrategy,\n });\n client.on(\"reconnecting\", () => {\n var _a;\n // Tests listen to this event\n (_a = this.emitter) === null || _a === void 0 ? void 0 : _a.emit(\"sentinelReconnecting\");\n });\n sentinels.push({ address: value, client });\n }\n this.sentinelIterator.reset(false);\n if (this.failoverDetector) {\n // Clean up previous detector\n this.failoverDetector.cleanup();\n }\n this.failoverDetector = new FailoverDetector_1.FailoverDetector(this, sentinels);\n await this.failoverDetector.subscribe();\n // Tests listen to this event\n (_a = this.emitter) === null || _a === void 0 ? void 0 : _a.emit(\"failoverSubscribed\");\n }\n}\nexports.default = SentinelConnector;\nfunction selectPreferredSentinel(availableSlaves, preferredSlaves) {\n if (availableSlaves.length === 0) {\n return null;\n }\n let selectedSlave;\n if (typeof preferredSlaves === \"function\") {\n selectedSlave = preferredSlaves(availableSlaves);\n }\n else if (preferredSlaves !== null && typeof preferredSlaves === \"object\") {\n const preferredSlavesArray = Array.isArray(preferredSlaves)\n ? preferredSlaves\n : [preferredSlaves];\n // sort by priority\n preferredSlavesArray.sort((a, b) => {\n // default the priority to 1\n if (!a.prio) {\n a.prio = 1;\n }\n if (!b.prio) {\n b.prio = 1;\n }\n // lowest priority first\n if (a.prio < b.prio) {\n return -1;\n }\n if (a.prio > b.prio) {\n return 1;\n }\n return 0;\n });\n // loop over preferred slaves and return the first match\n for (let p = 0; p < preferredSlavesArray.length; p++) {\n for (let a = 0; a < availableSlaves.length; a++) {\n const slave = availableSlaves[a];\n if (slave.ip === preferredSlavesArray[p].ip) {\n if (slave.port === preferredSlavesArray[p].port) {\n selectedSlave = slave;\n break;\n }\n }\n }\n if (selectedSlave) {\n break;\n }\n }\n }\n // if none of the preferred slaves are available, a random available slave is returned\n if (!selectedSlave) {\n selectedSlave = (0, utils_1.sample)(availableSlaves);\n }\n return addressResponseToAddress(selectedSlave);\n}\nfunction addressResponseToAddress(input) {\n return { host: input.ip, port: Number(input.port) };\n}\nfunction noop() { }\n",
47
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SentinelConnector = exports.StandaloneConnector = void 0;\nconst StandaloneConnector_1 = require(\"./StandaloneConnector\");\nexports.StandaloneConnector = StandaloneConnector_1.default;\nconst SentinelConnector_1 = require(\"./SentinelConnector\");\nexports.SentinelConnector = SentinelConnector_1.default;\n",
48
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst redis_errors_1 = require(\"redis-errors\");\nclass MaxRetriesPerRequestError extends redis_errors_1.AbortError {\n constructor(maxRetriesPerRequest) {\n const message = `Reached the max retries per request limit (which is ${maxRetriesPerRequest}). Refer to \"maxRetriesPerRequest\" option for details.`;\n super(message);\n Error.captureStackTrace(this, this.constructor);\n }\n get name() {\n return this.constructor.name;\n }\n}\nexports.default = MaxRetriesPerRequestError;\n",
49
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaxRetriesPerRequestError = void 0;\nconst MaxRetriesPerRequestError_1 = require(\"./MaxRetriesPerRequestError\");\nexports.MaxRetriesPerRequestError = MaxRetriesPerRequestError_1.default;\n",
50
- "'use strict'\n\nconst Buffer = require('buffer').Buffer\nconst StringDecoder = require('string_decoder').StringDecoder\nconst decoder = new StringDecoder()\nconst errors = require('redis-errors')\nconst ReplyError = errors.ReplyError\nconst ParserError = errors.ParserError\nvar bufferPool = Buffer.allocUnsafe(32 * 1024)\nvar bufferOffset = 0\nvar interval = null\nvar counter = 0\nvar notDecreased = 0\n\n/**\n * Used for integer numbers only\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|number}\n */\nfunction parseSimpleNumbers (parser) {\n const length = parser.buffer.length - 1\n var offset = parser.offset\n var number = 0\n var sign = 1\n\n if (parser.buffer[offset] === 45) {\n sign = -1\n offset++\n }\n\n while (offset < length) {\n const c1 = parser.buffer[offset++]\n if (c1 === 13) { // \\r\\n\n parser.offset = offset + 1\n return sign * number\n }\n number = (number * 10) + (c1 - 48)\n }\n}\n\n/**\n * Used for integer numbers in case of the returnNumbers option\n *\n * Reading the string as parts of n SMI is more efficient than\n * using a string directly.\n *\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|string}\n */\nfunction parseStringNumbers (parser) {\n const length = parser.buffer.length - 1\n var offset = parser.offset\n var number = 0\n var res = ''\n\n if (parser.buffer[offset] === 45) {\n res += '-'\n offset++\n }\n\n while (offset < length) {\n var c1 = parser.buffer[offset++]\n if (c1 === 13) { // \\r\\n\n parser.offset = offset + 1\n if (number !== 0) {\n res += number\n }\n return res\n } else if (number > 429496728) {\n res += (number * 10) + (c1 - 48)\n number = 0\n } else if (c1 === 48 && number === 0) {\n res += 0\n } else {\n number = (number * 10) + (c1 - 48)\n }\n }\n}\n\n/**\n * Parse a '+' redis simple string response but forward the offsets\n * onto convertBufferRange to generate a string.\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|string|Buffer}\n */\nfunction parseSimpleString (parser) {\n const start = parser.offset\n const buffer = parser.buffer\n const length = buffer.length - 1\n var offset = start\n\n while (offset < length) {\n if (buffer[offset++] === 13) { // \\r\\n\n parser.offset = offset + 1\n if (parser.optionReturnBuffers === true) {\n return parser.buffer.slice(start, offset - 1)\n }\n return parser.buffer.toString('utf8', start, offset - 1)\n }\n }\n}\n\n/**\n * Returns the read length\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|number}\n */\nfunction parseLength (parser) {\n const length = parser.buffer.length - 1\n var offset = parser.offset\n var number = 0\n\n while (offset < length) {\n const c1 = parser.buffer[offset++]\n if (c1 === 13) {\n parser.offset = offset + 1\n return number\n }\n number = (number * 10) + (c1 - 48)\n }\n}\n\n/**\n * Parse a ':' redis integer response\n *\n * If stringNumbers is activated the parser always returns numbers as string\n * This is important for big numbers (number > Math.pow(2, 53)) as js numbers\n * are 64bit floating point numbers with reduced precision\n *\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|number|string}\n */\nfunction parseInteger (parser) {\n if (parser.optionStringNumbers === true) {\n return parseStringNumbers(parser)\n }\n return parseSimpleNumbers(parser)\n}\n\n/**\n * Parse a '$' redis bulk string response\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|null|string}\n */\nfunction parseBulkString (parser) {\n const length = parseLength(parser)\n if (length === undefined) {\n return\n }\n if (length < 0) {\n return null\n }\n const offset = parser.offset + length\n if (offset + 2 > parser.buffer.length) {\n parser.bigStrSize = offset + 2\n parser.totalChunkSize = parser.buffer.length\n parser.bufferCache.push(parser.buffer)\n return\n }\n const start = parser.offset\n parser.offset = offset + 2\n if (parser.optionReturnBuffers === true) {\n return parser.buffer.slice(start, offset)\n }\n return parser.buffer.toString('utf8', start, offset)\n}\n\n/**\n * Parse a '-' redis error response\n * @param {JavascriptRedisParser} parser\n * @returns {ReplyError}\n */\nfunction parseError (parser) {\n var string = parseSimpleString(parser)\n if (string !== undefined) {\n if (parser.optionReturnBuffers === true) {\n string = string.toString()\n }\n return new ReplyError(string)\n }\n}\n\n/**\n * Parsing error handler, resets parser buffer\n * @param {JavascriptRedisParser} parser\n * @param {number} type\n * @returns {undefined}\n */\nfunction handleError (parser, type) {\n const err = new ParserError(\n 'Protocol error, got ' + JSON.stringify(String.fromCharCode(type)) + ' as reply type byte',\n JSON.stringify(parser.buffer),\n parser.offset\n )\n parser.buffer = null\n parser.returnFatalError(err)\n}\n\n/**\n * Parse a '*' redis array response\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|null|any[]}\n */\nfunction parseArray (parser) {\n const length = parseLength(parser)\n if (length === undefined) {\n return\n }\n if (length < 0) {\n return null\n }\n const responses = new Array(length)\n return parseArrayElements(parser, responses, 0)\n}\n\n/**\n * Push a partly parsed array to the stack\n *\n * @param {JavascriptRedisParser} parser\n * @param {any[]} array\n * @param {number} pos\n * @returns {undefined}\n */\nfunction pushArrayCache (parser, array, pos) {\n parser.arrayCache.push(array)\n parser.arrayPos.push(pos)\n}\n\n/**\n * Parse chunked redis array response\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|any[]}\n */\nfunction parseArrayChunks (parser) {\n const tmp = parser.arrayCache.pop()\n var pos = parser.arrayPos.pop()\n if (parser.arrayCache.length) {\n const res = parseArrayChunks(parser)\n if (res === undefined) {\n pushArrayCache(parser, tmp, pos)\n return\n }\n tmp[pos++] = res\n }\n return parseArrayElements(parser, tmp, pos)\n}\n\n/**\n * Parse redis array response elements\n * @param {JavascriptRedisParser} parser\n * @param {Array} responses\n * @param {number} i\n * @returns {undefined|null|any[]}\n */\nfunction parseArrayElements (parser, responses, i) {\n const bufferLength = parser.buffer.length\n while (i < responses.length) {\n const offset = parser.offset\n if (parser.offset >= bufferLength) {\n pushArrayCache(parser, responses, i)\n return\n }\n const response = parseType(parser, parser.buffer[parser.offset++])\n if (response === undefined) {\n if (!(parser.arrayCache.length || parser.bufferCache.length)) {\n parser.offset = offset\n }\n pushArrayCache(parser, responses, i)\n return\n }\n responses[i] = response\n i++\n }\n\n return responses\n}\n\n/**\n * Called the appropriate parser for the specified type.\n *\n * 36: $\n * 43: +\n * 42: *\n * 58: :\n * 45: -\n *\n * @param {JavascriptRedisParser} parser\n * @param {number} type\n * @returns {*}\n */\nfunction parseType (parser, type) {\n switch (type) {\n case 36:\n return parseBulkString(parser)\n case 43:\n return parseSimpleString(parser)\n case 42:\n return parseArray(parser)\n case 58:\n return parseInteger(parser)\n case 45:\n return parseError(parser)\n default:\n return handleError(parser, type)\n }\n}\n\n/**\n * Decrease the bufferPool size over time\n *\n * Balance between increasing and decreasing the bufferPool.\n * Decrease the bufferPool by 10% by removing the first 10% of the current pool.\n * @returns {undefined}\n */\nfunction decreaseBufferPool () {\n if (bufferPool.length > 50 * 1024) {\n if (counter === 1 || notDecreased > counter * 2) {\n const minSliceLen = Math.floor(bufferPool.length / 10)\n const sliceLength = minSliceLen < bufferOffset\n ? bufferOffset\n : minSliceLen\n bufferOffset = 0\n bufferPool = bufferPool.slice(sliceLength, bufferPool.length)\n } else {\n notDecreased++\n counter--\n }\n } else {\n clearInterval(interval)\n counter = 0\n notDecreased = 0\n interval = null\n }\n}\n\n/**\n * Check if the requested size fits in the current bufferPool.\n * If it does not, reset and increase the bufferPool accordingly.\n *\n * @param {number} length\n * @returns {undefined}\n */\nfunction resizeBuffer (length) {\n if (bufferPool.length < length + bufferOffset) {\n const multiplier = length > 1024 * 1024 * 75 ? 2 : 3\n if (bufferOffset > 1024 * 1024 * 111) {\n bufferOffset = 1024 * 1024 * 50\n }\n bufferPool = Buffer.allocUnsafe(length * multiplier + bufferOffset)\n bufferOffset = 0\n counter++\n if (interval === null) {\n interval = setInterval(decreaseBufferPool, 50)\n }\n }\n}\n\n/**\n * Concat a bulk string containing multiple chunks\n *\n * Notes:\n * 1) The first chunk might contain the whole bulk string including the \\r\n * 2) We are only safe to fully add up elements that are neither the first nor any of the last two elements\n *\n * @param {JavascriptRedisParser} parser\n * @returns {String}\n */\nfunction concatBulkString (parser) {\n const list = parser.bufferCache\n const oldOffset = parser.offset\n var chunks = list.length\n var offset = parser.bigStrSize - parser.totalChunkSize\n parser.offset = offset\n if (offset <= 2) {\n if (chunks === 2) {\n return list[0].toString('utf8', oldOffset, list[0].length + offset - 2)\n }\n chunks--\n offset = list[list.length - 2].length + offset\n }\n var res = decoder.write(list[0].slice(oldOffset))\n for (var i = 1; i < chunks - 1; i++) {\n res += decoder.write(list[i])\n }\n res += decoder.end(list[i].slice(0, offset - 2))\n return res\n}\n\n/**\n * Concat the collected chunks from parser.bufferCache.\n *\n * Increases the bufferPool size beforehand if necessary.\n *\n * @param {JavascriptRedisParser} parser\n * @returns {Buffer}\n */\nfunction concatBulkBuffer (parser) {\n const list = parser.bufferCache\n const oldOffset = parser.offset\n const length = parser.bigStrSize - oldOffset - 2\n var chunks = list.length\n var offset = parser.bigStrSize - parser.totalChunkSize\n parser.offset = offset\n if (offset <= 2) {\n if (chunks === 2) {\n return list[0].slice(oldOffset, list[0].length + offset - 2)\n }\n chunks--\n offset = list[list.length - 2].length + offset\n }\n resizeBuffer(length)\n const start = bufferOffset\n list[0].copy(bufferPool, start, oldOffset, list[0].length)\n bufferOffset += list[0].length - oldOffset\n for (var i = 1; i < chunks - 1; i++) {\n list[i].copy(bufferPool, bufferOffset)\n bufferOffset += list[i].length\n }\n list[i].copy(bufferPool, bufferOffset, 0, offset - 2)\n bufferOffset += offset - 2\n return bufferPool.slice(start, bufferOffset)\n}\n\nclass JavascriptRedisParser {\n /**\n * Javascript Redis Parser constructor\n * @param {{returnError: Function, returnReply: Function, returnFatalError?: Function, returnBuffers: boolean, stringNumbers: boolean }} options\n * @constructor\n */\n constructor (options) {\n if (!options) {\n throw new TypeError('Options are mandatory.')\n }\n if (typeof options.returnError !== 'function' || typeof options.returnReply !== 'function') {\n throw new TypeError('The returnReply and returnError options have to be functions.')\n }\n this.setReturnBuffers(!!options.returnBuffers)\n this.setStringNumbers(!!options.stringNumbers)\n this.returnError = options.returnError\n this.returnFatalError = options.returnFatalError || options.returnError\n this.returnReply = options.returnReply\n this.reset()\n }\n\n /**\n * Reset the parser values to the initial state\n *\n * @returns {undefined}\n */\n reset () {\n this.offset = 0\n this.buffer = null\n this.bigStrSize = 0\n this.totalChunkSize = 0\n this.bufferCache = []\n this.arrayCache = []\n this.arrayPos = []\n }\n\n /**\n * Set the returnBuffers option\n *\n * @param {boolean} returnBuffers\n * @returns {undefined}\n */\n setReturnBuffers (returnBuffers) {\n if (typeof returnBuffers !== 'boolean') {\n throw new TypeError('The returnBuffers argument has to be a boolean')\n }\n this.optionReturnBuffers = returnBuffers\n }\n\n /**\n * Set the stringNumbers option\n *\n * @param {boolean} stringNumbers\n * @returns {undefined}\n */\n setStringNumbers (stringNumbers) {\n if (typeof stringNumbers !== 'boolean') {\n throw new TypeError('The stringNumbers argument has to be a boolean')\n }\n this.optionStringNumbers = stringNumbers\n }\n\n /**\n * Parse the redis buffer\n * @param {Buffer} buffer\n * @returns {undefined}\n */\n execute (buffer) {\n if (this.buffer === null) {\n this.buffer = buffer\n this.offset = 0\n } else if (this.bigStrSize === 0) {\n const oldLength = this.buffer.length\n const remainingLength = oldLength - this.offset\n const newBuffer = Buffer.allocUnsafe(remainingLength + buffer.length)\n this.buffer.copy(newBuffer, 0, this.offset, oldLength)\n buffer.copy(newBuffer, remainingLength, 0, buffer.length)\n this.buffer = newBuffer\n this.offset = 0\n if (this.arrayCache.length) {\n const arr = parseArrayChunks(this)\n if (arr === undefined) {\n return\n }\n this.returnReply(arr)\n }\n } else if (this.totalChunkSize + buffer.length >= this.bigStrSize) {\n this.bufferCache.push(buffer)\n var tmp = this.optionReturnBuffers ? concatBulkBuffer(this) : concatBulkString(this)\n this.bigStrSize = 0\n this.bufferCache = []\n this.buffer = buffer\n if (this.arrayCache.length) {\n this.arrayCache[0][this.arrayPos[0]++] = tmp\n tmp = parseArrayChunks(this)\n if (tmp === undefined) {\n return\n }\n }\n this.returnReply(tmp)\n } else {\n this.bufferCache.push(buffer)\n this.totalChunkSize += buffer.length\n return\n }\n\n while (this.offset < this.buffer.length) {\n const offset = this.offset\n const type = this.buffer[this.offset++]\n const response = parseType(this, type)\n if (response === undefined) {\n if (!(this.arrayCache.length || this.bufferCache.length)) {\n this.offset = offset\n }\n return\n }\n\n if (type === 45) {\n this.returnError(response)\n } else {\n this.returnReply(response)\n }\n }\n\n this.buffer = null\n }\n}\n\nmodule.exports = JavascriptRedisParser\n",
51
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Tiny class to simplify dealing with subscription set\n */\nclass SubscriptionSet {\n constructor() {\n this.set = {\n subscribe: {},\n psubscribe: {},\n ssubscribe: {},\n };\n }\n add(set, channel) {\n this.set[mapSet(set)][channel] = true;\n }\n del(set, channel) {\n delete this.set[mapSet(set)][channel];\n }\n channels(set) {\n return Object.keys(this.set[mapSet(set)]);\n }\n isEmpty() {\n return (this.channels(\"subscribe\").length === 0 &&\n this.channels(\"psubscribe\").length === 0 &&\n this.channels(\"ssubscribe\").length === 0);\n }\n}\nexports.default = SubscriptionSet;\nfunction mapSet(set) {\n if (set === \"unsubscribe\") {\n return \"subscribe\";\n }\n if (set === \"punsubscribe\") {\n return \"psubscribe\";\n }\n if (set === \"sunsubscribe\") {\n return \"ssubscribe\";\n }\n return set;\n}\n",
52
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Command_1 = require(\"./Command\");\nconst utils_1 = require(\"./utils\");\nconst RedisParser = require(\"redis-parser\");\nconst SubscriptionSet_1 = require(\"./SubscriptionSet\");\nconst debug = (0, utils_1.Debug)(\"dataHandler\");\nclass DataHandler {\n constructor(redis, parserOptions) {\n this.redis = redis;\n const parser = new RedisParser({\n stringNumbers: parserOptions.stringNumbers,\n returnBuffers: true,\n returnError: (err) => {\n this.returnError(err);\n },\n returnFatalError: (err) => {\n this.returnFatalError(err);\n },\n returnReply: (reply) => {\n this.returnReply(reply);\n },\n });\n // prependListener ensures the parser receives and processes data before socket timeout checks are performed\n redis.stream.prependListener(\"data\", (data) => {\n parser.execute(data);\n });\n // prependListener() doesn't enable flowing mode automatically - we need to resume the stream manually\n redis.stream.resume();\n }\n returnFatalError(err) {\n err.message += \". Please report this.\";\n this.redis.recoverFromFatalError(err, err, { offlineQueue: false });\n }\n returnError(err) {\n const item = this.shiftCommand(err);\n if (!item) {\n return;\n }\n err.command = {\n name: item.command.name,\n args: item.command.args,\n };\n if (item.command.name == \"ssubscribe\" && err.message.includes(\"MOVED\")) {\n this.redis.emit(\"moved\");\n return;\n }\n this.redis.handleReconnection(err, item);\n }\n returnReply(reply) {\n if (this.handleMonitorReply(reply)) {\n return;\n }\n if (this.handleSubscriberReply(reply)) {\n return;\n }\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n if (Command_1.default.checkFlag(\"ENTER_SUBSCRIBER_MODE\", item.command.name)) {\n this.redis.condition.subscriber = new SubscriptionSet_1.default();\n this.redis.condition.subscriber.add(item.command.name, reply[1].toString());\n if (!fillSubCommand(item.command, reply[2])) {\n this.redis.commandQueue.unshift(item);\n }\n }\n else if (Command_1.default.checkFlag(\"EXIT_SUBSCRIBER_MODE\", item.command.name)) {\n if (!fillUnsubCommand(item.command, reply[2])) {\n this.redis.commandQueue.unshift(item);\n }\n }\n else {\n item.command.resolve(reply);\n }\n }\n handleSubscriberReply(reply) {\n if (!this.redis.condition.subscriber) {\n return false;\n }\n const replyType = Array.isArray(reply) ? reply[0].toString() : null;\n debug('receive reply \"%s\" in subscriber mode', replyType);\n switch (replyType) {\n case \"message\":\n if (this.redis.listeners(\"message\").length > 0) {\n // Check if there're listeners to avoid unnecessary `toString()`.\n this.redis.emit(\"message\", reply[1].toString(), reply[2] ? reply[2].toString() : \"\");\n }\n this.redis.emit(\"messageBuffer\", reply[1], reply[2]);\n break;\n case \"pmessage\": {\n const pattern = reply[1].toString();\n if (this.redis.listeners(\"pmessage\").length > 0) {\n this.redis.emit(\"pmessage\", pattern, reply[2].toString(), reply[3].toString());\n }\n this.redis.emit(\"pmessageBuffer\", pattern, reply[2], reply[3]);\n break;\n }\n case \"smessage\": {\n if (this.redis.listeners(\"smessage\").length > 0) {\n this.redis.emit(\"smessage\", reply[1].toString(), reply[2] ? reply[2].toString() : \"\");\n }\n this.redis.emit(\"smessageBuffer\", reply[1], reply[2]);\n break;\n }\n case \"ssubscribe\":\n case \"subscribe\":\n case \"psubscribe\": {\n const channel = reply[1].toString();\n this.redis.condition.subscriber.add(replyType, channel);\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n if (!fillSubCommand(item.command, reply[2])) {\n this.redis.commandQueue.unshift(item);\n }\n break;\n }\n case \"sunsubscribe\":\n case \"unsubscribe\":\n case \"punsubscribe\": {\n const channel = reply[1] ? reply[1].toString() : null;\n if (channel) {\n this.redis.condition.subscriber.del(replyType, channel);\n }\n const count = reply[2];\n if (Number(count) === 0) {\n this.redis.condition.subscriber = false;\n }\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n if (!fillUnsubCommand(item.command, count)) {\n this.redis.commandQueue.unshift(item);\n }\n break;\n }\n default: {\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n item.command.resolve(reply);\n }\n }\n return true;\n }\n handleMonitorReply(reply) {\n if (this.redis.status !== \"monitoring\") {\n return false;\n }\n const replyStr = reply.toString();\n if (replyStr === \"OK\") {\n // Valid commands in the monitoring mode are AUTH and MONITOR,\n // both of which always reply with 'OK'.\n // So if we got an 'OK', we can make certain that\n // the reply is made to AUTH & MONITOR.\n return false;\n }\n // Since commands sent in the monitoring mode will trigger an exception,\n // any replies we received in the monitoring mode should consider to be\n // realtime monitor data instead of result of commands.\n const len = replyStr.indexOf(\" \");\n const timestamp = replyStr.slice(0, len);\n const argIndex = replyStr.indexOf('\"');\n const args = replyStr\n .slice(argIndex + 1, -1)\n .split('\" \"')\n .map((elem) => elem.replace(/\\\\\"/g, '\"'));\n const dbAndSource = replyStr.slice(len + 2, argIndex - 2).split(\" \");\n this.redis.emit(\"monitor\", timestamp, args, dbAndSource[1], dbAndSource[0]);\n return true;\n }\n shiftCommand(reply) {\n const item = this.redis.commandQueue.shift();\n if (!item) {\n const message = \"Command queue state error. If you can reproduce this, please report it.\";\n const error = new Error(message +\n (reply instanceof Error\n ? ` Last error: ${reply.message}`\n : ` Last reply: ${reply.toString()}`));\n this.redis.emit(\"error\", error);\n return null;\n }\n return item;\n }\n}\nexports.default = DataHandler;\nconst remainingRepliesMap = new WeakMap();\nfunction fillSubCommand(command, count) {\n let remainingReplies = remainingRepliesMap.has(command)\n ? remainingRepliesMap.get(command)\n : command.args.length;\n remainingReplies -= 1;\n if (remainingReplies <= 0) {\n command.resolve(count);\n remainingRepliesMap.delete(command);\n return true;\n }\n remainingRepliesMap.set(command, remainingReplies);\n return false;\n}\nfunction fillUnsubCommand(command, count) {\n let remainingReplies = remainingRepliesMap.has(command)\n ? remainingRepliesMap.get(command)\n : command.args.length;\n if (remainingReplies === 0) {\n if (Number(count) === 0) {\n remainingRepliesMap.delete(command);\n command.resolve(count);\n return true;\n }\n return false;\n }\n remainingReplies -= 1;\n if (remainingReplies <= 0) {\n command.resolve(count);\n return true;\n }\n remainingRepliesMap.set(command, remainingReplies);\n return false;\n}\n",
53
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readyHandler = exports.errorHandler = exports.closeHandler = exports.connectHandler = void 0;\nconst redis_errors_1 = require(\"redis-errors\");\nconst Command_1 = require(\"../Command\");\nconst errors_1 = require(\"../errors\");\nconst utils_1 = require(\"../utils\");\nconst DataHandler_1 = require(\"../DataHandler\");\nconst debug = (0, utils_1.Debug)(\"connection\");\nfunction connectHandler(self) {\n return function () {\n var _a;\n self.setStatus(\"connect\");\n self.resetCommandQueue();\n // AUTH command should be processed before any other commands\n let flushed = false;\n const { connectionEpoch } = self;\n if (self.condition.auth) {\n self.auth(self.condition.auth, function (err) {\n if (connectionEpoch !== self.connectionEpoch) {\n return;\n }\n if (err) {\n if (err.message.indexOf(\"no password is set\") !== -1) {\n console.warn(\"[WARN] Redis server does not require a password, but a password was supplied.\");\n }\n else if (err.message.indexOf(\"without any password configured for the default user\") !== -1) {\n console.warn(\"[WARN] This Redis server's `default` user does not require a password, but a password was supplied\");\n }\n else if (err.message.indexOf(\"wrong number of arguments for 'auth' command\") !== -1) {\n console.warn(`[ERROR] The server returned \"wrong number of arguments for 'auth' command\". You are probably passing both username and password to Redis version 5 or below. You should only pass the 'password' option for Redis version 5 and under.`);\n }\n else {\n flushed = true;\n self.recoverFromFatalError(err, err);\n }\n }\n });\n }\n if (self.condition.select) {\n self.select(self.condition.select).catch((err) => {\n // If the node is in cluster mode, select is disallowed.\n // In this case, reconnect won't help.\n self.silentEmit(\"error\", err);\n });\n }\n /*\n No need to keep the reference of DataHandler here\n because we don't need to do the cleanup.\n `Stream#end()` will remove all listeners for us.\n */\n new DataHandler_1.default(self, {\n stringNumbers: self.options.stringNumbers,\n });\n const clientCommandPromises = [];\n if (self.options.connectionName) {\n debug(\"set the connection name [%s]\", self.options.connectionName);\n clientCommandPromises.push(self.client(\"setname\", self.options.connectionName).catch(utils_1.noop));\n }\n if (!self.options.disableClientInfo) {\n debug(\"set the client info\");\n clientCommandPromises.push((0, utils_1.getPackageMeta)()\n .then((packageMeta) => {\n return self\n .client(\"SETINFO\", \"LIB-VER\", packageMeta.version)\n .catch(utils_1.noop);\n })\n .catch(utils_1.noop));\n clientCommandPromises.push(self\n .client(\"SETINFO\", \"LIB-NAME\", ((_a = self.options) === null || _a === void 0 ? void 0 : _a.clientInfoTag)\n ? `ioredis(${self.options.clientInfoTag})`\n : \"ioredis\")\n .catch(utils_1.noop));\n }\n Promise.all(clientCommandPromises)\n .catch(utils_1.noop)\n .finally(() => {\n if (!self.options.enableReadyCheck) {\n exports.readyHandler(self)();\n }\n if (self.options.enableReadyCheck) {\n self._readyCheck(function (err, info) {\n if (connectionEpoch !== self.connectionEpoch) {\n return;\n }\n if (err) {\n if (!flushed) {\n self.recoverFromFatalError(new Error(\"Ready check failed: \" + err.message), err);\n }\n }\n else {\n if (self.connector.check(info)) {\n exports.readyHandler(self)();\n }\n else {\n self.disconnect(true);\n }\n }\n });\n }\n });\n };\n}\nexports.connectHandler = connectHandler;\nfunction abortError(command) {\n const err = new redis_errors_1.AbortError(\"Command aborted due to connection close\");\n err.command = {\n name: command.name,\n args: command.args,\n };\n return err;\n}\n// If a contiguous set of pipeline commands starts from index zero then they\n// can be safely reattempted. If however we have a chain of pipelined commands\n// starting at index 1 or more it means we received a partial response before\n// the connection close and those pipelined commands must be aborted. For\n// example, if the queue looks like this: [2, 3, 4, 0, 1, 2] then after\n// aborting and purging we'll have a queue that looks like this: [0, 1, 2]\nfunction abortIncompletePipelines(commandQueue) {\n var _a;\n let expectedIndex = 0;\n for (let i = 0; i < commandQueue.length;) {\n const command = (_a = commandQueue.peekAt(i)) === null || _a === void 0 ? void 0 : _a.command;\n const pipelineIndex = command.pipelineIndex;\n if (pipelineIndex === undefined || pipelineIndex === 0) {\n expectedIndex = 0;\n }\n if (pipelineIndex !== undefined && pipelineIndex !== expectedIndex++) {\n commandQueue.remove(i, 1);\n command.reject(abortError(command));\n continue;\n }\n i++;\n }\n}\n// If only a partial transaction result was received before connection close,\n// we have to abort any transaction fragments that may have ended up in the\n// offline queue\nfunction abortTransactionFragments(commandQueue) {\n var _a;\n for (let i = 0; i < commandQueue.length;) {\n const command = (_a = commandQueue.peekAt(i)) === null || _a === void 0 ? void 0 : _a.command;\n if (command.name === \"multi\") {\n break;\n }\n if (command.name === \"exec\") {\n commandQueue.remove(i, 1);\n command.reject(abortError(command));\n break;\n }\n if (command.inTransaction) {\n commandQueue.remove(i, 1);\n command.reject(abortError(command));\n }\n else {\n i++;\n }\n }\n}\nfunction closeHandler(self) {\n return function () {\n const prevStatus = self.status;\n self.setStatus(\"close\");\n if (self.commandQueue.length) {\n abortIncompletePipelines(self.commandQueue);\n }\n if (self.offlineQueue.length) {\n abortTransactionFragments(self.offlineQueue);\n }\n if (prevStatus === \"ready\") {\n if (!self.prevCondition) {\n self.prevCondition = self.condition;\n }\n if (self.commandQueue.length) {\n self.prevCommandQueue = self.commandQueue;\n }\n }\n if (self.manuallyClosing) {\n self.manuallyClosing = false;\n debug(\"skip reconnecting since the connection is manually closed.\");\n return close();\n }\n if (typeof self.options.retryStrategy !== \"function\") {\n debug(\"skip reconnecting because `retryStrategy` is not a function\");\n return close();\n }\n const retryDelay = self.options.retryStrategy(++self.retryAttempts);\n if (typeof retryDelay !== \"number\") {\n debug(\"skip reconnecting because `retryStrategy` doesn't return a number\");\n return close();\n }\n debug(\"reconnect in %sms\", retryDelay);\n self.setStatus(\"reconnecting\", retryDelay);\n self.reconnectTimeout = setTimeout(function () {\n self.reconnectTimeout = null;\n self.connect().catch(utils_1.noop);\n }, retryDelay);\n const { maxRetriesPerRequest } = self.options;\n if (typeof maxRetriesPerRequest === \"number\") {\n if (maxRetriesPerRequest < 0) {\n debug(\"maxRetriesPerRequest is negative, ignoring...\");\n }\n else {\n const remainder = self.retryAttempts % (maxRetriesPerRequest + 1);\n if (remainder === 0) {\n debug(\"reach maxRetriesPerRequest limitation, flushing command queue...\");\n self.flushQueue(new errors_1.MaxRetriesPerRequestError(maxRetriesPerRequest));\n }\n }\n }\n };\n function close() {\n self.setStatus(\"end\");\n self.flushQueue(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n }\n}\nexports.closeHandler = closeHandler;\nfunction errorHandler(self) {\n return function (error) {\n debug(\"error: %s\", error);\n self.silentEmit(\"error\", error);\n };\n}\nexports.errorHandler = errorHandler;\nfunction readyHandler(self) {\n return function () {\n self.setStatus(\"ready\");\n self.retryAttempts = 0;\n if (self.options.monitor) {\n self.call(\"monitor\").then(() => self.setStatus(\"monitoring\"), (error) => self.emit(\"error\", error));\n const { sendCommand } = self;\n self.sendCommand = function (command) {\n if (Command_1.default.checkFlag(\"VALID_IN_MONITOR_MODE\", command.name)) {\n return sendCommand.call(self, command);\n }\n command.reject(new Error(\"Connection is in monitoring mode, can't process commands.\"));\n return command.promise;\n };\n self.once(\"close\", function () {\n delete self.sendCommand;\n });\n return;\n }\n const finalSelect = self.prevCondition\n ? self.prevCondition.select\n : self.condition.select;\n if (self.options.readOnly) {\n debug(\"set the connection to readonly mode\");\n self.readonly().catch(utils_1.noop);\n }\n if (self.prevCondition) {\n const condition = self.prevCondition;\n self.prevCondition = null;\n if (condition.subscriber && self.options.autoResubscribe) {\n // We re-select the previous db first since\n // `SELECT` command is not valid in sub mode.\n if (self.condition.select !== finalSelect) {\n debug(\"connect to db [%d]\", finalSelect);\n self.select(finalSelect);\n }\n const subscribeChannels = condition.subscriber.channels(\"subscribe\");\n if (subscribeChannels.length) {\n debug(\"subscribe %d channels\", subscribeChannels.length);\n self.subscribe(subscribeChannels);\n }\n const psubscribeChannels = condition.subscriber.channels(\"psubscribe\");\n if (psubscribeChannels.length) {\n debug(\"psubscribe %d channels\", psubscribeChannels.length);\n self.psubscribe(psubscribeChannels);\n }\n const ssubscribeChannels = condition.subscriber.channels(\"ssubscribe\");\n if (ssubscribeChannels.length) {\n debug(\"ssubscribe %s\", ssubscribeChannels.length);\n for (const channel of ssubscribeChannels) {\n self.ssubscribe(channel);\n }\n }\n }\n }\n if (self.prevCommandQueue) {\n if (self.options.autoResendUnfulfilledCommands) {\n debug(\"resend %d unfulfilled commands\", self.prevCommandQueue.length);\n while (self.prevCommandQueue.length > 0) {\n const item = self.prevCommandQueue.shift();\n if (item.select !== self.condition.select &&\n item.command.name !== \"select\") {\n self.select(item.select);\n }\n self.sendCommand(item.command, item.stream);\n }\n }\n else {\n self.prevCommandQueue = null;\n }\n }\n if (self.offlineQueue.length) {\n debug(\"send %d commands in offline queue\", self.offlineQueue.length);\n const offlineQueue = self.offlineQueue;\n self.resetOfflineQueue();\n while (offlineQueue.length > 0) {\n const item = offlineQueue.shift();\n if (item.select !== self.condition.select &&\n item.command.name !== \"select\") {\n self.select(item.select);\n }\n self.sendCommand(item.command, item.stream);\n }\n }\n if (self.condition.select !== finalSelect) {\n debug(\"connect to db [%d]\", finalSelect);\n self.select(finalSelect);\n }\n };\n}\nexports.readyHandler = readyHandler;\n",
54
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_REDIS_OPTIONS = void 0;\nexports.DEFAULT_REDIS_OPTIONS = {\n // Connection\n port: 6379,\n host: \"localhost\",\n family: 0,\n connectTimeout: 10000,\n disconnectTimeout: 2000,\n retryStrategy: function (times) {\n return Math.min(times * 50, 2000);\n },\n keepAlive: 0,\n noDelay: true,\n connectionName: null,\n disableClientInfo: false,\n clientInfoTag: undefined,\n // Sentinel\n sentinels: null,\n name: null,\n role: \"master\",\n sentinelRetryStrategy: function (times) {\n return Math.min(times * 10, 1000);\n },\n sentinelReconnectStrategy: function () {\n // This strategy only applies when sentinels are used for detecting\n // a failover, not during initial master resolution.\n // The deployment can still function when some of the sentinels are down\n // for a long period of time, so we may not want to attempt reconnection\n // very often. Therefore the default interval is fairly long (1 minute).\n return 60000;\n },\n natMap: null,\n enableTLSForSentinelMode: false,\n updateSentinels: true,\n failoverDetector: false,\n // Status\n username: null,\n password: null,\n db: 0,\n // Others\n enableOfflineQueue: true,\n enableReadyCheck: true,\n autoResubscribe: true,\n autoResendUnfulfilledCommands: true,\n lazyConnect: false,\n keyPrefix: \"\",\n reconnectOnError: null,\n readOnly: false,\n stringNumbers: false,\n maxRetriesPerRequest: 20,\n maxLoadingRetryTime: 10000,\n enableAutoPipelining: false,\n autoPipeliningIgnoredCommands: [],\n sentinelMaxConnections: 10,\n blockingTimeoutGrace: 100,\n};\n",
55
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst events_1 = require(\"events\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst cluster_1 = require(\"./cluster\");\nconst Command_1 = require(\"./Command\");\nconst connectors_1 = require(\"./connectors\");\nconst SentinelConnector_1 = require(\"./connectors/SentinelConnector\");\nconst eventHandler = require(\"./redis/event_handler\");\nconst RedisOptions_1 = require(\"./redis/RedisOptions\");\nconst ScanStream_1 = require(\"./ScanStream\");\nconst transaction_1 = require(\"./transaction\");\nconst utils_1 = require(\"./utils\");\nconst applyMixin_1 = require(\"./utils/applyMixin\");\nconst Commander_1 = require(\"./utils/Commander\");\nconst lodash_1 = require(\"./utils/lodash\");\nconst Deque = require(\"denque\");\nconst debug = (0, utils_1.Debug)(\"redis\");\n/**\n * This is the major component of ioredis.\n * Use it to connect to a standalone Redis server or Sentinels.\n *\n * ```typescript\n * const redis = new Redis(); // Default port is 6379\n * async function main() {\n * redis.set(\"foo\", \"bar\");\n * redis.get(\"foo\", (err, result) => {\n * // `result` should be \"bar\"\n * console.log(err, result);\n * });\n * // Or use Promise\n * const result = await redis.get(\"foo\");\n * }\n * ```\n */\nclass Redis extends Commander_1.default {\n constructor(arg1, arg2, arg3) {\n super();\n this.status = \"wait\";\n /**\n * @ignore\n */\n this.isCluster = false;\n this.reconnectTimeout = null;\n this.connectionEpoch = 0;\n this.retryAttempts = 0;\n this.manuallyClosing = false;\n // Prepare autopipelines structures\n this._autoPipelines = new Map();\n this._runningAutoPipelines = new Set();\n this.parseOptions(arg1, arg2, arg3);\n events_1.EventEmitter.call(this);\n this.resetCommandQueue();\n this.resetOfflineQueue();\n if (this.options.Connector) {\n this.connector = new this.options.Connector(this.options);\n }\n else if (this.options.sentinels) {\n const sentinelConnector = new SentinelConnector_1.default(this.options);\n sentinelConnector.emitter = this;\n this.connector = sentinelConnector;\n }\n else {\n this.connector = new connectors_1.StandaloneConnector(this.options);\n }\n if (this.options.scripts) {\n Object.entries(this.options.scripts).forEach(([name, definition]) => {\n this.defineCommand(name, definition);\n });\n }\n // end(or wait) -> connecting -> connect -> ready -> end\n if (this.options.lazyConnect) {\n this.setStatus(\"wait\");\n }\n else {\n this.connect().catch(lodash_1.noop);\n }\n }\n /**\n * Create a Redis instance.\n * This is the same as `new Redis()` but is included for compatibility with node-redis.\n */\n static createClient(...args) {\n return new Redis(...args);\n }\n get autoPipelineQueueSize() {\n let queued = 0;\n for (const pipeline of this._autoPipelines.values()) {\n queued += pipeline.length;\n }\n return queued;\n }\n /**\n * Create a connection to Redis.\n * This method will be invoked automatically when creating a new Redis instance\n * unless `lazyConnect: true` is passed.\n *\n * When calling this method manually, a Promise is returned, which will\n * be resolved when the connection status is ready. The promise can reject\n * if the connection fails, times out, or if Redis is already connecting/connected.\n */\n connect(callback) {\n const promise = new Promise((resolve, reject) => {\n if (this.status === \"connecting\" ||\n this.status === \"connect\" ||\n this.status === \"ready\") {\n reject(new Error(\"Redis is already connecting/connected\"));\n return;\n }\n this.connectionEpoch += 1;\n this.setStatus(\"connecting\");\n const { options } = this;\n this.condition = {\n select: options.db,\n auth: options.username\n ? [options.username, options.password]\n : options.password,\n subscriber: false,\n };\n const _this = this;\n (0, standard_as_callback_1.default)(this.connector.connect(function (type, err) {\n _this.silentEmit(type, err);\n }), function (err, stream) {\n if (err) {\n _this.flushQueue(err);\n _this.silentEmit(\"error\", err);\n reject(err);\n _this.setStatus(\"end\");\n return;\n }\n let CONNECT_EVENT = options.tls ? \"secureConnect\" : \"connect\";\n if (\"sentinels\" in options &&\n options.sentinels &&\n !options.enableTLSForSentinelMode) {\n CONNECT_EVENT = \"connect\";\n }\n _this.stream = stream;\n if (options.noDelay) {\n stream.setNoDelay(true);\n }\n // Node ignores setKeepAlive before connect, therefore we wait for the event:\n // https://github.com/nodejs/node/issues/31663\n if (typeof options.keepAlive === \"number\") {\n if (stream.connecting) {\n stream.once(CONNECT_EVENT, () => {\n stream.setKeepAlive(true, options.keepAlive);\n });\n }\n else {\n stream.setKeepAlive(true, options.keepAlive);\n }\n }\n if (stream.connecting) {\n stream.once(CONNECT_EVENT, eventHandler.connectHandler(_this));\n if (options.connectTimeout) {\n /*\n * Typically, Socket#setTimeout(0) will clear the timer\n * set before. However, in some platforms (Electron 3.x~4.x),\n * the timer will not be cleared. So we introduce a variable here.\n *\n * See https://github.com/electron/electron/issues/14915\n */\n let connectTimeoutCleared = false;\n stream.setTimeout(options.connectTimeout, function () {\n if (connectTimeoutCleared) {\n return;\n }\n stream.setTimeout(0);\n stream.destroy();\n const err = new Error(\"connect ETIMEDOUT\");\n // @ts-expect-error\n err.errorno = \"ETIMEDOUT\";\n // @ts-expect-error\n err.code = \"ETIMEDOUT\";\n // @ts-expect-error\n err.syscall = \"connect\";\n eventHandler.errorHandler(_this)(err);\n });\n stream.once(CONNECT_EVENT, function () {\n connectTimeoutCleared = true;\n stream.setTimeout(0);\n });\n }\n }\n else if (stream.destroyed) {\n const firstError = _this.connector.firstError;\n if (firstError) {\n process.nextTick(() => {\n eventHandler.errorHandler(_this)(firstError);\n });\n }\n process.nextTick(eventHandler.closeHandler(_this));\n }\n else {\n process.nextTick(eventHandler.connectHandler(_this));\n }\n if (!stream.destroyed) {\n stream.once(\"error\", eventHandler.errorHandler(_this));\n stream.once(\"close\", eventHandler.closeHandler(_this));\n }\n const connectionReadyHandler = function () {\n _this.removeListener(\"close\", connectionCloseHandler);\n resolve();\n };\n var connectionCloseHandler = function () {\n _this.removeListener(\"ready\", connectionReadyHandler);\n reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n };\n _this.once(\"ready\", connectionReadyHandler);\n _this.once(\"close\", connectionCloseHandler);\n });\n });\n return (0, standard_as_callback_1.default)(promise, callback);\n }\n /**\n * Disconnect from Redis.\n *\n * This method closes the connection immediately,\n * and may lose some pending replies that haven't written to client.\n * If you want to wait for the pending replies, use Redis#quit instead.\n */\n disconnect(reconnect = false) {\n if (!reconnect) {\n this.manuallyClosing = true;\n }\n if (this.reconnectTimeout && !reconnect) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n if (this.status === \"wait\") {\n eventHandler.closeHandler(this)();\n }\n else {\n this.connector.disconnect();\n }\n }\n /**\n * Disconnect from Redis.\n *\n * @deprecated\n */\n end() {\n this.disconnect();\n }\n /**\n * Create a new instance with the same options as the current one.\n *\n * @example\n * ```js\n * var redis = new Redis(6380);\n * var anotherRedis = redis.duplicate();\n * ```\n */\n duplicate(override) {\n return new Redis({ ...this.options, ...override });\n }\n /**\n * Mode of the connection.\n *\n * One of `\"normal\"`, `\"subscriber\"`, or `\"monitor\"`. When the connection is\n * not in `\"normal\"` mode, certain commands are not allowed.\n */\n get mode() {\n var _a;\n return this.options.monitor\n ? \"monitor\"\n : ((_a = this.condition) === null || _a === void 0 ? void 0 : _a.subscriber)\n ? \"subscriber\"\n : \"normal\";\n }\n /**\n * Listen for all requests received by the server in real time.\n *\n * This command will create a new connection to Redis and send a\n * MONITOR command via the new connection in order to avoid disturbing\n * the current connection.\n *\n * @param callback The callback function. If omit, a promise will be returned.\n * @example\n * ```js\n * var redis = new Redis();\n * redis.monitor(function (err, monitor) {\n * // Entering monitoring mode.\n * monitor.on('monitor', function (time, args, source, database) {\n * console.log(time + \": \" + util.inspect(args));\n * });\n * });\n *\n * // supports promise as well as other commands\n * redis.monitor().then(function (monitor) {\n * monitor.on('monitor', function (time, args, source, database) {\n * console.log(time + \": \" + util.inspect(args));\n * });\n * });\n * ```\n */\n monitor(callback) {\n const monitorInstance = this.duplicate({\n monitor: true,\n lazyConnect: false,\n });\n return (0, standard_as_callback_1.default)(new Promise(function (resolve, reject) {\n monitorInstance.once(\"error\", reject);\n monitorInstance.once(\"monitoring\", function () {\n resolve(monitorInstance);\n });\n }), callback);\n }\n /**\n * Send a command to Redis\n *\n * This method is used internally and in most cases you should not\n * use it directly. If you need to send a command that is not supported\n * by the library, you can use the `call` method:\n *\n * ```js\n * const redis = new Redis();\n *\n * redis.call('set', 'foo', 'bar');\n * // or\n * redis.call(['set', 'foo', 'bar']);\n * ```\n *\n * @ignore\n */\n sendCommand(command, stream) {\n var _a, _b;\n if (this.status === \"wait\") {\n this.connect().catch(lodash_1.noop);\n }\n if (this.status === \"end\") {\n command.reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n return command.promise;\n }\n if (((_a = this.condition) === null || _a === void 0 ? void 0 : _a.subscriber) &&\n !Command_1.default.checkFlag(\"VALID_IN_SUBSCRIBER_MODE\", command.name)) {\n command.reject(new Error(\"Connection in subscriber mode, only subscriber commands may be used\"));\n return command.promise;\n }\n if (typeof this.options.commandTimeout === \"number\") {\n command.setTimeout(this.options.commandTimeout);\n }\n const blockingTimeout = this.getBlockingTimeoutInMs(command);\n let writable = this.status === \"ready\" ||\n (!stream &&\n this.status === \"connect\" &&\n (0, commands_1.exists)(command.name, { caseInsensitive: true }) &&\n ((0, commands_1.hasFlag)(command.name, \"loading\", { nameCaseInsensitive: true }) ||\n Command_1.default.checkFlag(\"HANDSHAKE_COMMANDS\", command.name)));\n if (!this.stream) {\n writable = false;\n }\n else if (!this.stream.writable) {\n writable = false;\n // @ts-expect-error\n }\n else if (this.stream._writableState && this.stream._writableState.ended) {\n // TODO: We should be able to remove this as the PR has already been merged.\n // https://github.com/iojs/io.js/pull/1217\n writable = false;\n }\n if (!writable) {\n if (!this.options.enableOfflineQueue) {\n command.reject(new Error(\"Stream isn't writeable and enableOfflineQueue options is false\"));\n return command.promise;\n }\n if (command.name === \"quit\" && this.offlineQueue.length === 0) {\n this.disconnect();\n command.resolve(Buffer.from(\"OK\"));\n return command.promise;\n }\n // @ts-expect-error\n if (debug.enabled) {\n debug(\"queue command[%s]: %d -> %s(%o)\", this._getDescription(), this.condition.select, command.name, command.args);\n }\n this.offlineQueue.push({\n command: command,\n stream: stream,\n select: this.condition.select,\n });\n // For blocking commands in the offline queue, arm a client-side timeout\n // only when blockingTimeout is configured. Without this option, queued\n // blocking commands may wait indefinitely on a dead connection.\n if (Command_1.default.checkFlag(\"BLOCKING_COMMANDS\", command.name)) {\n const offlineTimeout = this.getConfiguredBlockingTimeout();\n if (offlineTimeout !== undefined) {\n command.setBlockingTimeout(offlineTimeout);\n }\n }\n }\n else {\n // @ts-expect-error\n if (debug.enabled) {\n debug(\"write command[%s]: %d -> %s(%o)\", this._getDescription(), (_b = this.condition) === null || _b === void 0 ? void 0 : _b.select, command.name, command.args);\n }\n if (stream) {\n if (\"isPipeline\" in stream && stream.isPipeline) {\n stream.write(command.toWritable(stream.destination.redis.stream));\n }\n else {\n stream.write(command.toWritable(stream));\n }\n }\n else {\n this.stream.write(command.toWritable(this.stream));\n }\n this.commandQueue.push({\n command: command,\n stream: stream,\n select: this.condition.select,\n });\n if (blockingTimeout !== undefined) {\n command.setBlockingTimeout(blockingTimeout);\n }\n if (Command_1.default.checkFlag(\"WILL_DISCONNECT\", command.name)) {\n this.manuallyClosing = true;\n }\n if (this.options.socketTimeout !== undefined && this.socketTimeoutTimer === undefined) {\n this.setSocketTimeout();\n }\n }\n if (command.name === \"select\" && (0, utils_1.isInt)(command.args[0])) {\n const db = parseInt(command.args[0], 10);\n if (this.condition.select !== db) {\n this.condition.select = db;\n this.emit(\"select\", db);\n debug(\"switch to db [%d]\", this.condition.select);\n }\n }\n return command.promise;\n }\n getBlockingTimeoutInMs(command) {\n var _a;\n if (!Command_1.default.checkFlag(\"BLOCKING_COMMANDS\", command.name)) {\n return undefined;\n }\n // Feature is opt-in: only enabled when blockingTimeout is set to a positive number\n const configuredTimeout = this.getConfiguredBlockingTimeout();\n if (configuredTimeout === undefined) {\n return undefined;\n }\n const timeout = command.extractBlockingTimeout();\n if (typeof timeout === \"number\") {\n if (timeout > 0) {\n // Finite timeout from command args - add grace period\n return timeout + ((_a = this.options.blockingTimeoutGrace) !== null && _a !== void 0 ? _a : RedisOptions_1.DEFAULT_REDIS_OPTIONS.blockingTimeoutGrace);\n }\n // Command has timeout=0 (block forever), use blockingTimeout option as safety net\n return configuredTimeout;\n }\n if (timeout === null) {\n // No BLOCK option found (e.g., XREAD without BLOCK), use blockingTimeout as safety net\n return configuredTimeout;\n }\n return undefined;\n }\n getConfiguredBlockingTimeout() {\n if (typeof this.options.blockingTimeout === \"number\" &&\n this.options.blockingTimeout > 0) {\n return this.options.blockingTimeout;\n }\n return undefined;\n }\n setSocketTimeout() {\n this.socketTimeoutTimer = setTimeout(() => {\n this.stream.destroy(new Error(`Socket timeout. Expecting data, but didn't receive any in ${this.options.socketTimeout}ms.`));\n this.socketTimeoutTimer = undefined;\n }, this.options.socketTimeout);\n // this handler must run after the \"data\" handler in \"DataHandler\"\n // so that `this.commandQueue.length` will be updated\n this.stream.once(\"data\", () => {\n clearTimeout(this.socketTimeoutTimer);\n this.socketTimeoutTimer = undefined;\n if (this.commandQueue.length === 0)\n return;\n this.setSocketTimeout();\n });\n }\n scanStream(options) {\n return this.createScanStream(\"scan\", { options });\n }\n scanBufferStream(options) {\n return this.createScanStream(\"scanBuffer\", { options });\n }\n sscanStream(key, options) {\n return this.createScanStream(\"sscan\", { key, options });\n }\n sscanBufferStream(key, options) {\n return this.createScanStream(\"sscanBuffer\", { key, options });\n }\n hscanStream(key, options) {\n return this.createScanStream(\"hscan\", { key, options });\n }\n hscanBufferStream(key, options) {\n return this.createScanStream(\"hscanBuffer\", { key, options });\n }\n zscanStream(key, options) {\n return this.createScanStream(\"zscan\", { key, options });\n }\n zscanBufferStream(key, options) {\n return this.createScanStream(\"zscanBuffer\", { key, options });\n }\n /**\n * Emit only when there's at least one listener.\n *\n * @ignore\n */\n silentEmit(eventName, arg) {\n let error;\n if (eventName === \"error\") {\n error = arg;\n if (this.status === \"end\") {\n return;\n }\n if (this.manuallyClosing) {\n // ignore connection related errors when manually disconnecting\n if (error instanceof Error &&\n (error.message === utils_1.CONNECTION_CLOSED_ERROR_MSG ||\n // @ts-expect-error\n error.syscall === \"connect\" ||\n // @ts-expect-error\n error.syscall === \"read\")) {\n return;\n }\n }\n }\n if (this.listeners(eventName).length > 0) {\n return this.emit.apply(this, arguments);\n }\n if (error && error instanceof Error) {\n console.error(\"[ioredis] Unhandled error event:\", error.stack);\n }\n return false;\n }\n /**\n * @ignore\n */\n recoverFromFatalError(_commandError, err, options) {\n this.flushQueue(err, options);\n this.silentEmit(\"error\", err);\n this.disconnect(true);\n }\n /**\n * @ignore\n */\n handleReconnection(err, item) {\n var _a;\n let needReconnect = false;\n if (this.options.reconnectOnError &&\n !Command_1.default.checkFlag(\"IGNORE_RECONNECT_ON_ERROR\", item.command.name)) {\n needReconnect = this.options.reconnectOnError(err);\n }\n switch (needReconnect) {\n case 1:\n case true:\n if (this.status !== \"reconnecting\") {\n this.disconnect(true);\n }\n item.command.reject(err);\n break;\n case 2:\n if (this.status !== \"reconnecting\") {\n this.disconnect(true);\n }\n if (((_a = this.condition) === null || _a === void 0 ? void 0 : _a.select) !== item.select &&\n item.command.name !== \"select\") {\n this.select(item.select);\n }\n // TODO\n // @ts-expect-error\n this.sendCommand(item.command);\n break;\n default:\n item.command.reject(err);\n }\n }\n /**\n * Get description of the connection. Used for debugging.\n */\n _getDescription() {\n let description;\n if (\"path\" in this.options && this.options.path) {\n description = this.options.path;\n }\n else if (this.stream &&\n this.stream.remoteAddress &&\n this.stream.remotePort) {\n description = this.stream.remoteAddress + \":\" + this.stream.remotePort;\n }\n else if (\"host\" in this.options && this.options.host) {\n description = this.options.host + \":\" + this.options.port;\n }\n else {\n // Unexpected\n description = \"\";\n }\n if (this.options.connectionName) {\n description += ` (${this.options.connectionName})`;\n }\n return description;\n }\n resetCommandQueue() {\n this.commandQueue = new Deque();\n }\n resetOfflineQueue() {\n this.offlineQueue = new Deque();\n }\n parseOptions(...args) {\n const options = {};\n let isTls = false;\n for (let i = 0; i < args.length; ++i) {\n const arg = args[i];\n if (arg === null || typeof arg === \"undefined\") {\n continue;\n }\n if (typeof arg === \"object\") {\n (0, lodash_1.defaults)(options, arg);\n }\n else if (typeof arg === \"string\") {\n (0, lodash_1.defaults)(options, (0, utils_1.parseURL)(arg));\n if (arg.startsWith(\"rediss://\")) {\n isTls = true;\n }\n }\n else if (typeof arg === \"number\") {\n options.port = arg;\n }\n else {\n throw new Error(\"Invalid argument \" + arg);\n }\n }\n if (isTls) {\n (0, lodash_1.defaults)(options, { tls: true });\n }\n (0, lodash_1.defaults)(options, Redis.defaultOptions);\n if (typeof options.port === \"string\") {\n options.port = parseInt(options.port, 10);\n }\n if (typeof options.db === \"string\") {\n options.db = parseInt(options.db, 10);\n }\n // @ts-expect-error\n this.options = (0, utils_1.resolveTLSProfile)(options);\n }\n /**\n * Change instance's status\n */\n setStatus(status, arg) {\n // @ts-expect-error\n if (debug.enabled) {\n debug(\"status[%s]: %s -> %s\", this._getDescription(), this.status || \"[empty]\", status);\n }\n this.status = status;\n process.nextTick(this.emit.bind(this, status, arg));\n }\n createScanStream(command, { key, options = {} }) {\n return new ScanStream_1.default({\n objectMode: true,\n key: key,\n redis: this,\n command: command,\n ...options,\n });\n }\n /**\n * Flush offline queue and command queue with error.\n *\n * @param error The error object to send to the commands\n * @param options options\n */\n flushQueue(error, options) {\n options = (0, lodash_1.defaults)({}, options, {\n offlineQueue: true,\n commandQueue: true,\n });\n let item;\n if (options.offlineQueue) {\n while ((item = this.offlineQueue.shift())) {\n item.command.reject(error);\n }\n }\n if (options.commandQueue) {\n if (this.commandQueue.length > 0) {\n if (this.stream) {\n this.stream.removeAllListeners(\"data\");\n }\n while ((item = this.commandQueue.shift())) {\n item.command.reject(error);\n }\n }\n }\n }\n /**\n * Check whether Redis has finished loading the persistent data and is able to\n * process commands.\n */\n _readyCheck(callback) {\n const _this = this;\n this.info(function (err, res) {\n if (err) {\n if (err.message && err.message.includes(\"NOPERM\")) {\n console.warn(`Skipping the ready check because INFO command fails: \"${err.message}\". You can disable ready check with \"enableReadyCheck\". More: https://github.com/luin/ioredis/wiki/Disable-ready-check.`);\n return callback(null, {});\n }\n return callback(err);\n }\n if (typeof res !== \"string\") {\n return callback(null, res);\n }\n const info = {};\n const lines = res.split(\"\\r\\n\");\n for (let i = 0; i < lines.length; ++i) {\n const [fieldName, ...fieldValueParts] = lines[i].split(\":\");\n const fieldValue = fieldValueParts.join(\":\");\n if (fieldValue) {\n info[fieldName] = fieldValue;\n }\n }\n if (!info.loading || info.loading === \"0\") {\n callback(null, info);\n }\n else {\n const loadingEtaMs = (info.loading_eta_seconds || 1) * 1000;\n const retryTime = _this.options.maxLoadingRetryTime &&\n _this.options.maxLoadingRetryTime < loadingEtaMs\n ? _this.options.maxLoadingRetryTime\n : loadingEtaMs;\n debug(\"Redis server still loading, trying again in \" + retryTime + \"ms\");\n setTimeout(function () {\n _this._readyCheck(callback);\n }, retryTime);\n }\n }).catch(lodash_1.noop);\n }\n}\nRedis.Cluster = cluster_1.default;\nRedis.Command = Command_1.default;\n/**\n * Default options\n */\nRedis.defaultOptions = RedisOptions_1.DEFAULT_REDIS_OPTIONS;\n(0, applyMixin_1.default)(Redis, events_1.EventEmitter);\n(0, transaction_1.addTransactionSupport)(Redis.prototype);\nexports.default = Redis;\n",
56
- "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.print = exports.ReplyError = exports.SentinelIterator = exports.SentinelConnector = exports.AbstractConnector = exports.Pipeline = exports.ScanStream = exports.Command = exports.Cluster = exports.Redis = exports.default = void 0;\nexports = module.exports = require(\"./Redis\").default;\nvar Redis_1 = require(\"./Redis\");\nObject.defineProperty(exports, \"default\", { enumerable: true, get: function () { return Redis_1.default; } });\nvar Redis_2 = require(\"./Redis\");\nObject.defineProperty(exports, \"Redis\", { enumerable: true, get: function () { return Redis_2.default; } });\nvar cluster_1 = require(\"./cluster\");\nObject.defineProperty(exports, \"Cluster\", { enumerable: true, get: function () { return cluster_1.default; } });\n/**\n * @ignore\n */\nvar Command_1 = require(\"./Command\");\nObject.defineProperty(exports, \"Command\", { enumerable: true, get: function () { return Command_1.default; } });\n/**\n * @ignore\n */\nvar ScanStream_1 = require(\"./ScanStream\");\nObject.defineProperty(exports, \"ScanStream\", { enumerable: true, get: function () { return ScanStream_1.default; } });\n/**\n * @ignore\n */\nvar Pipeline_1 = require(\"./Pipeline\");\nObject.defineProperty(exports, \"Pipeline\", { enumerable: true, get: function () { return Pipeline_1.default; } });\n/**\n * @ignore\n */\nvar AbstractConnector_1 = require(\"./connectors/AbstractConnector\");\nObject.defineProperty(exports, \"AbstractConnector\", { enumerable: true, get: function () { return AbstractConnector_1.default; } });\n/**\n * @ignore\n */\nvar SentinelConnector_1 = require(\"./connectors/SentinelConnector\");\nObject.defineProperty(exports, \"SentinelConnector\", { enumerable: true, get: function () { return SentinelConnector_1.default; } });\nObject.defineProperty(exports, \"SentinelIterator\", { enumerable: true, get: function () { return SentinelConnector_1.SentinelIterator; } });\n// No TS typings\nexports.ReplyError = require(\"redis-errors\").ReplyError;\n/**\n * @ignore\n */\nObject.defineProperty(exports, \"Promise\", {\n get() {\n console.warn(\"ioredis v5 does not support plugging third-party Promise library anymore. Native Promise will be used.\");\n return Promise;\n },\n set(_lib) {\n console.warn(\"ioredis v5 does not support plugging third-party Promise library anymore. Native Promise will be used.\");\n },\n});\n/**\n * @ignore\n */\nfunction print(err, reply) {\n if (err) {\n console.log(\"Error: \" + err);\n }\n else {\n console.log(\"Reply: \" + reply);\n }\n}\nexports.print = print;\n",
5
+ "\"use strict\";\r\nmodule.exports = asPromise;\r\n\r\n/**\r\n * Callback as used by {@link util.asPromise}.\r\n * @typedef asPromiseCallback\r\n * @type {function}\r\n * @param {Error|null} error Error, if any\r\n * @param {...*} params Additional arguments\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Returns a promise from a node-style callback function.\r\n * @memberof util\r\n * @param {asPromiseCallback} fn Function to call\r\n * @param {*} ctx Function context\r\n * @param {...*} params Function arguments\r\n * @returns {Promise<*>} Promisified function\r\n */\r\nfunction asPromise(fn, ctx/*, varargs */) {\r\n var params = new Array(arguments.length - 1),\r\n offset = 0,\r\n index = 2,\r\n pending = true;\r\n while (index < arguments.length)\r\n params[offset++] = arguments[index++];\r\n return new Promise(function executor(resolve, reject) {\r\n params[offset] = function callback(err/*, varargs */) {\r\n if (pending) {\r\n pending = false;\r\n if (err)\r\n reject(err);\r\n else {\r\n var params = new Array(arguments.length - 1),\r\n offset = 0;\r\n while (offset < params.length)\r\n params[offset++] = arguments[offset];\r\n resolve.apply(null, params);\r\n }\r\n }\r\n };\r\n try {\r\n fn.apply(ctx || null, params);\r\n } catch (err) {\r\n if (pending) {\r\n pending = false;\r\n reject(err);\r\n }\r\n }\r\n });\r\n}\r\n",
6
+ "\"use strict\";\r\n\r\n/**\r\n * A minimal base64 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar base64 = exports;\r\n\r\n/**\r\n * Calculates the byte length of a base64 encoded string.\r\n * @param {string} string Base64 encoded string\r\n * @returns {number} Byte length\r\n */\r\nbase64.length = function length(string) {\r\n var p = string.length;\r\n if (!p)\r\n return 0;\r\n var n = 0;\r\n while (--p % 4 > 1 && string.charAt(p) === \"=\")\r\n ++n;\r\n return Math.ceil(string.length * 3) / 4 - n;\r\n};\r\n\r\n// Base64 encoding table\r\nvar b64 = new Array(64);\r\n\r\n// Base64 decoding table\r\nvar s64 = new Array(123);\r\n\r\n// 65..90, 97..122, 48..57, 43, 47\r\nfor (var i = 0; i < 64;)\r\n s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r\n\r\n/**\r\n * Encodes a buffer to a base64 encoded string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} Base64 encoded string\r\n */\r\nbase64.encode = function encode(buffer, start, end) {\r\n var parts = null,\r\n chunk = [];\r\n var i = 0, // output index\r\n j = 0, // goto index\r\n t; // temporary\r\n while (start < end) {\r\n var b = buffer[start++];\r\n switch (j) {\r\n case 0:\r\n chunk[i++] = b64[b >> 2];\r\n t = (b & 3) << 4;\r\n j = 1;\r\n break;\r\n case 1:\r\n chunk[i++] = b64[t | b >> 4];\r\n t = (b & 15) << 2;\r\n j = 2;\r\n break;\r\n case 2:\r\n chunk[i++] = b64[t | b >> 6];\r\n chunk[i++] = b64[b & 63];\r\n j = 0;\r\n break;\r\n }\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (j) {\r\n chunk[i++] = b64[t];\r\n chunk[i++] = 61;\r\n if (j === 1)\r\n chunk[i++] = 61;\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\nvar invalidEncoding = \"invalid encoding\";\r\n\r\n/**\r\n * Decodes a base64 encoded string to a buffer.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Number of bytes written\r\n * @throws {Error} If encoding is invalid\r\n */\r\nbase64.decode = function decode(string, buffer, offset) {\r\n var start = offset;\r\n var j = 0, // goto index\r\n t; // temporary\r\n for (var i = 0; i < string.length;) {\r\n var c = string.charCodeAt(i++);\r\n if (c === 61 && j > 1)\r\n break;\r\n if ((c = s64[c]) === undefined)\r\n throw Error(invalidEncoding);\r\n switch (j) {\r\n case 0:\r\n t = c;\r\n j = 1;\r\n break;\r\n case 1:\r\n buffer[offset++] = t << 2 | (c & 48) >> 4;\r\n t = c;\r\n j = 2;\r\n break;\r\n case 2:\r\n buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;\r\n t = c;\r\n j = 3;\r\n break;\r\n case 3:\r\n buffer[offset++] = (t & 3) << 6 | c;\r\n j = 0;\r\n break;\r\n }\r\n }\r\n if (j === 1)\r\n throw Error(invalidEncoding);\r\n return offset - start;\r\n};\r\n\r\n/**\r\n * Tests if the specified string appears to be base64 encoded.\r\n * @param {string} string String to test\r\n * @returns {boolean} `true` if probably base64 encoded, otherwise false\r\n */\r\nbase64.test = function test(string) {\r\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);\r\n};\r\n",
7
+ "\"use strict\";\r\nmodule.exports = EventEmitter;\r\n\r\n/**\r\n * Constructs a new event emitter instance.\r\n * @classdesc A minimal event emitter.\r\n * @memberof util\r\n * @constructor\r\n */\r\nfunction EventEmitter() {\r\n\r\n /**\r\n * Registered listeners.\r\n * @type {Object.<string,*>}\r\n * @private\r\n */\r\n this._listeners = {};\r\n}\r\n\r\n/**\r\n * Registers an event listener.\r\n * @param {string} evt Event name\r\n * @param {function} fn Listener\r\n * @param {*} [ctx] Listener context\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.on = function on(evt, fn, ctx) {\r\n (this._listeners[evt] || (this._listeners[evt] = [])).push({\r\n fn : fn,\r\n ctx : ctx || this\r\n });\r\n return this;\r\n};\r\n\r\n/**\r\n * Removes an event listener or any matching listeners if arguments are omitted.\r\n * @param {string} [evt] Event name. Removes all listeners if omitted.\r\n * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.off = function off(evt, fn) {\r\n if (evt === undefined)\r\n this._listeners = {};\r\n else {\r\n if (fn === undefined)\r\n this._listeners[evt] = [];\r\n else {\r\n var listeners = this._listeners[evt];\r\n for (var i = 0; i < listeners.length;)\r\n if (listeners[i].fn === fn)\r\n listeners.splice(i, 1);\r\n else\r\n ++i;\r\n }\r\n }\r\n return this;\r\n};\r\n\r\n/**\r\n * Emits an event by calling its listeners with the specified arguments.\r\n * @param {string} evt Event name\r\n * @param {...*} args Arguments\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.emit = function emit(evt) {\r\n var listeners = this._listeners[evt];\r\n if (listeners) {\r\n var args = [],\r\n i = 1;\r\n for (; i < arguments.length;)\r\n args.push(arguments[i++]);\r\n for (i = 0; i < listeners.length;)\r\n listeners[i].fn.apply(listeners[i++].ctx, args);\r\n }\r\n return this;\r\n};\r\n",
8
+ "\"use strict\";\r\n\r\nmodule.exports = factory(factory);\r\n\r\n/**\r\n * Reads / writes floats / doubles from / to buffers.\r\n * @name util.float\r\n * @namespace\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using little endian byte order.\r\n * @name util.float.writeFloatLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using big endian byte order.\r\n * @name util.float.writeFloatBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using little endian byte order.\r\n * @name util.float.readFloatLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using big endian byte order.\r\n * @name util.float.readFloatBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using little endian byte order.\r\n * @name util.float.writeDoubleLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using big endian byte order.\r\n * @name util.float.writeDoubleBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using little endian byte order.\r\n * @name util.float.readDoubleLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using big endian byte order.\r\n * @name util.float.readDoubleBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n// Factory function for the purpose of node-based testing in modified global environments\r\nfunction factory(exports) {\r\n\r\n // float: typed array\r\n if (typeof Float32Array !== \"undefined\") (function() {\r\n\r\n var f32 = new Float32Array([ -0 ]),\r\n f8b = new Uint8Array(f32.buffer),\r\n le = f8b[3] === 128;\r\n\r\n function writeFloat_f32_cpy(val, buf, pos) {\r\n f32[0] = val;\r\n buf[pos ] = f8b[0];\r\n buf[pos + 1] = f8b[1];\r\n buf[pos + 2] = f8b[2];\r\n buf[pos + 3] = f8b[3];\r\n }\r\n\r\n function writeFloat_f32_rev(val, buf, pos) {\r\n f32[0] = val;\r\n buf[pos ] = f8b[3];\r\n buf[pos + 1] = f8b[2];\r\n buf[pos + 2] = f8b[1];\r\n buf[pos + 3] = f8b[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;\r\n /* istanbul ignore next */\r\n exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;\r\n\r\n function readFloat_f32_cpy(buf, pos) {\r\n f8b[0] = buf[pos ];\r\n f8b[1] = buf[pos + 1];\r\n f8b[2] = buf[pos + 2];\r\n f8b[3] = buf[pos + 3];\r\n return f32[0];\r\n }\r\n\r\n function readFloat_f32_rev(buf, pos) {\r\n f8b[3] = buf[pos ];\r\n f8b[2] = buf[pos + 1];\r\n f8b[1] = buf[pos + 2];\r\n f8b[0] = buf[pos + 3];\r\n return f32[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;\r\n /* istanbul ignore next */\r\n exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;\r\n\r\n // float: ieee754\r\n })(); else (function() {\r\n\r\n function writeFloat_ieee754(writeUint, val, buf, pos) {\r\n var sign = val < 0 ? 1 : 0;\r\n if (sign)\r\n val = -val;\r\n if (val === 0)\r\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos);\r\n else if (isNaN(val))\r\n writeUint(2143289344, buf, pos);\r\n else if (val > 3.4028234663852886e+38) // +-Infinity\r\n writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);\r\n else if (val < 1.1754943508222875e-38) // denormal\r\n writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);\r\n else {\r\n var exponent = Math.floor(Math.log(val) / Math.LN2),\r\n mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;\r\n writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);\r\n }\r\n }\r\n\r\n exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);\r\n exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);\r\n\r\n function readFloat_ieee754(readUint, buf, pos) {\r\n var uint = readUint(buf, pos),\r\n sign = (uint >> 31) * 2 + 1,\r\n exponent = uint >>> 23 & 255,\r\n mantissa = uint & 8388607;\r\n return exponent === 255\r\n ? mantissa\r\n ? NaN\r\n : sign * Infinity\r\n : exponent === 0 // denormal\r\n ? sign * 1.401298464324817e-45 * mantissa\r\n : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);\r\n }\r\n\r\n exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);\r\n exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);\r\n\r\n })();\r\n\r\n // double: typed array\r\n if (typeof Float64Array !== \"undefined\") (function() {\r\n\r\n var f64 = new Float64Array([-0]),\r\n f8b = new Uint8Array(f64.buffer),\r\n le = f8b[7] === 128;\r\n\r\n function writeDouble_f64_cpy(val, buf, pos) {\r\n f64[0] = val;\r\n buf[pos ] = f8b[0];\r\n buf[pos + 1] = f8b[1];\r\n buf[pos + 2] = f8b[2];\r\n buf[pos + 3] = f8b[3];\r\n buf[pos + 4] = f8b[4];\r\n buf[pos + 5] = f8b[5];\r\n buf[pos + 6] = f8b[6];\r\n buf[pos + 7] = f8b[7];\r\n }\r\n\r\n function writeDouble_f64_rev(val, buf, pos) {\r\n f64[0] = val;\r\n buf[pos ] = f8b[7];\r\n buf[pos + 1] = f8b[6];\r\n buf[pos + 2] = f8b[5];\r\n buf[pos + 3] = f8b[4];\r\n buf[pos + 4] = f8b[3];\r\n buf[pos + 5] = f8b[2];\r\n buf[pos + 6] = f8b[1];\r\n buf[pos + 7] = f8b[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;\r\n /* istanbul ignore next */\r\n exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;\r\n\r\n function readDouble_f64_cpy(buf, pos) {\r\n f8b[0] = buf[pos ];\r\n f8b[1] = buf[pos + 1];\r\n f8b[2] = buf[pos + 2];\r\n f8b[3] = buf[pos + 3];\r\n f8b[4] = buf[pos + 4];\r\n f8b[5] = buf[pos + 5];\r\n f8b[6] = buf[pos + 6];\r\n f8b[7] = buf[pos + 7];\r\n return f64[0];\r\n }\r\n\r\n function readDouble_f64_rev(buf, pos) {\r\n f8b[7] = buf[pos ];\r\n f8b[6] = buf[pos + 1];\r\n f8b[5] = buf[pos + 2];\r\n f8b[4] = buf[pos + 3];\r\n f8b[3] = buf[pos + 4];\r\n f8b[2] = buf[pos + 5];\r\n f8b[1] = buf[pos + 6];\r\n f8b[0] = buf[pos + 7];\r\n return f64[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;\r\n /* istanbul ignore next */\r\n exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;\r\n\r\n // double: ieee754\r\n })(); else (function() {\r\n\r\n function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {\r\n var sign = val < 0 ? 1 : 0;\r\n if (sign)\r\n val = -val;\r\n if (val === 0) {\r\n writeUint(0, buf, pos + off0);\r\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1);\r\n } else if (isNaN(val)) {\r\n writeUint(0, buf, pos + off0);\r\n writeUint(2146959360, buf, pos + off1);\r\n } else if (val > 1.7976931348623157e+308) { // +-Infinity\r\n writeUint(0, buf, pos + off0);\r\n writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);\r\n } else {\r\n var mantissa;\r\n if (val < 2.2250738585072014e-308) { // denormal\r\n mantissa = val / 5e-324;\r\n writeUint(mantissa >>> 0, buf, pos + off0);\r\n writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);\r\n } else {\r\n var exponent = Math.floor(Math.log(val) / Math.LN2);\r\n if (exponent === 1024)\r\n exponent = 1023;\r\n mantissa = val * Math.pow(2, -exponent);\r\n writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);\r\n writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);\r\n }\r\n }\r\n }\r\n\r\n exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);\r\n exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);\r\n\r\n function readDouble_ieee754(readUint, off0, off1, buf, pos) {\r\n var lo = readUint(buf, pos + off0),\r\n hi = readUint(buf, pos + off1);\r\n var sign = (hi >> 31) * 2 + 1,\r\n exponent = hi >>> 20 & 2047,\r\n mantissa = 4294967296 * (hi & 1048575) + lo;\r\n return exponent === 2047\r\n ? mantissa\r\n ? NaN\r\n : sign * Infinity\r\n : exponent === 0 // denormal\r\n ? sign * 5e-324 * mantissa\r\n : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);\r\n }\r\n\r\n exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);\r\n exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);\r\n\r\n })();\r\n\r\n return exports;\r\n}\r\n\r\n// uint helpers\r\n\r\nfunction writeUintLE(val, buf, pos) {\r\n buf[pos ] = val & 255;\r\n buf[pos + 1] = val >>> 8 & 255;\r\n buf[pos + 2] = val >>> 16 & 255;\r\n buf[pos + 3] = val >>> 24;\r\n}\r\n\r\nfunction writeUintBE(val, buf, pos) {\r\n buf[pos ] = val >>> 24;\r\n buf[pos + 1] = val >>> 16 & 255;\r\n buf[pos + 2] = val >>> 8 & 255;\r\n buf[pos + 3] = val & 255;\r\n}\r\n\r\nfunction readUintLE(buf, pos) {\r\n return (buf[pos ]\r\n | buf[pos + 1] << 8\r\n | buf[pos + 2] << 16\r\n | buf[pos + 3] << 24) >>> 0;\r\n}\r\n\r\nfunction readUintBE(buf, pos) {\r\n return (buf[pos ] << 24\r\n | buf[pos + 1] << 16\r\n | buf[pos + 2] << 8\r\n | buf[pos + 3]) >>> 0;\r\n}\r\n",
9
+ "\"use strict\";\r\nmodule.exports = inquire;\r\n\r\n/**\r\n * Requires a module only if available.\r\n * @memberof util\r\n * @param {string} moduleName Module to require\r\n * @returns {?Object} Required module if available and not empty, otherwise `null`\r\n */\r\nfunction inquire(moduleName) {\r\n try {\r\n var mod = eval(\"quire\".replace(/^/,\"re\"))(moduleName); // eslint-disable-line no-eval\r\n if (mod && (mod.length || Object.keys(mod).length))\r\n return mod;\r\n } catch (e) {} // eslint-disable-line no-empty\r\n return null;\r\n}\r\n",
10
+ "\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n var len = 0,\r\n c = 0;\r\n for (var i = 0; i < string.length; ++i) {\r\n c = string.charCodeAt(i);\r\n if (c < 128)\r\n len += 1;\r\n else if (c < 2048)\r\n len += 2;\r\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n ++i;\r\n len += 4;\r\n } else\r\n len += 3;\r\n }\r\n return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null,\r\n chunk = [],\r\n i = 0, // char offset\r\n t; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128)\r\n chunk[i++] = t;\r\n else if (t > 191 && t < 224)\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n } else\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n var start = offset,\r\n c1, // character 1\r\n c2; // character 2\r\n for (var i = 0; i < string.length; ++i) {\r\n c1 = string.charCodeAt(i);\r\n if (c1 < 128) {\r\n buffer[offset++] = c1;\r\n } else if (c1 < 2048) {\r\n buffer[offset++] = c1 >> 6 | 192;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n ++i;\r\n buffer[offset++] = c1 >> 18 | 240;\r\n buffer[offset++] = c1 >> 12 & 63 | 128;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else {\r\n buffer[offset++] = c1 >> 12 | 224;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n }\r\n }\r\n return offset - start;\r\n};\r\n",
11
+ "\"use strict\";\r\nmodule.exports = pool;\r\n\r\n/**\r\n * An allocator as used by {@link util.pool}.\r\n * @typedef PoolAllocator\r\n * @type {function}\r\n * @param {number} size Buffer size\r\n * @returns {Uint8Array} Buffer\r\n */\r\n\r\n/**\r\n * A slicer as used by {@link util.pool}.\r\n * @typedef PoolSlicer\r\n * @type {function}\r\n * @param {number} start Start offset\r\n * @param {number} end End offset\r\n * @returns {Uint8Array} Buffer slice\r\n * @this {Uint8Array}\r\n */\r\n\r\n/**\r\n * A general purpose buffer pool.\r\n * @memberof util\r\n * @function\r\n * @param {PoolAllocator} alloc Allocator\r\n * @param {PoolSlicer} slice Slicer\r\n * @param {number} [size=8192] Slab size\r\n * @returns {PoolAllocator} Pooled allocator\r\n */\r\nfunction pool(alloc, slice, size) {\r\n var SIZE = size || 8192;\r\n var MAX = SIZE >>> 1;\r\n var slab = null;\r\n var offset = SIZE;\r\n return function pool_alloc(size) {\r\n if (size < 1 || size > MAX)\r\n return alloc(size);\r\n if (offset + size > SIZE) {\r\n slab = alloc(SIZE);\r\n offset = 0;\r\n }\r\n var buf = slice.call(slab, offset, offset += size);\r\n if (offset & 7) // align to 32 bit\r\n offset = (offset | 7) + 1;\r\n return buf;\r\n };\r\n}\r\n",
12
+ "\"use strict\";\nmodule.exports = LongBits;\n\nvar util = require(\"../util/minimal\");\n\n/**\n * Constructs new long bits.\n * @classdesc Helper class for working with the low and high bits of a 64 bit value.\n * @memberof util\n * @constructor\n * @param {number} lo Low 32 bits, unsigned\n * @param {number} hi High 32 bits, unsigned\n */\nfunction LongBits(lo, hi) {\n\n // note that the casts below are theoretically unnecessary as of today, but older statically\n // generated converter code might still call the ctor with signed 32bits. kept for compat.\n\n /**\n * Low bits.\n * @type {number}\n */\n this.lo = lo >>> 0;\n\n /**\n * High bits.\n * @type {number}\n */\n this.hi = hi >>> 0;\n}\n\n/**\n * Zero bits.\n * @memberof util.LongBits\n * @type {util.LongBits}\n */\nvar zero = LongBits.zero = new LongBits(0, 0);\n\nzero.toNumber = function() { return 0; };\nzero.zzEncode = zero.zzDecode = function() { return this; };\nzero.length = function() { return 1; };\n\n/**\n * Zero hash.\n * @memberof util.LongBits\n * @type {string}\n */\nvar zeroHash = LongBits.zeroHash = \"\\0\\0\\0\\0\\0\\0\\0\\0\";\n\n/**\n * Constructs new long bits from the specified number.\n * @param {number} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.fromNumber = function fromNumber(value) {\n if (value === 0)\n return zero;\n var sign = value < 0;\n if (sign)\n value = -value;\n var lo = value >>> 0,\n hi = (value - lo) / 4294967296 >>> 0;\n if (sign) {\n hi = ~hi >>> 0;\n lo = ~lo >>> 0;\n if (++lo > 4294967295) {\n lo = 0;\n if (++hi > 4294967295)\n hi = 0;\n }\n }\n return new LongBits(lo, hi);\n};\n\n/**\n * Constructs new long bits from a number, long or string.\n * @param {Long|number|string} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.from = function from(value) {\n if (typeof value === \"number\")\n return LongBits.fromNumber(value);\n if (util.isString(value)) {\n /* istanbul ignore else */\n if (util.Long)\n value = util.Long.fromString(value);\n else\n return LongBits.fromNumber(parseInt(value, 10));\n }\n return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;\n};\n\n/**\n * Converts this long bits to a possibly unsafe JavaScript number.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {number} Possibly unsafe number\n */\nLongBits.prototype.toNumber = function toNumber(unsigned) {\n if (!unsigned && this.hi >>> 31) {\n var lo = ~this.lo + 1 >>> 0,\n hi = ~this.hi >>> 0;\n if (!lo)\n hi = hi + 1 >>> 0;\n return -(lo + hi * 4294967296);\n }\n return this.lo + this.hi * 4294967296;\n};\n\n/**\n * Converts this long bits to a long.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long} Long\n */\nLongBits.prototype.toLong = function toLong(unsigned) {\n return util.Long\n ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned))\n /* istanbul ignore next */\n : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };\n};\n\nvar charCodeAt = String.prototype.charCodeAt;\n\n/**\n * Constructs new long bits from the specified 8 characters long hash.\n * @param {string} hash Hash\n * @returns {util.LongBits} Bits\n */\nLongBits.fromHash = function fromHash(hash) {\n if (hash === zeroHash)\n return zero;\n return new LongBits(\n ( charCodeAt.call(hash, 0)\n | charCodeAt.call(hash, 1) << 8\n | charCodeAt.call(hash, 2) << 16\n | charCodeAt.call(hash, 3) << 24) >>> 0\n ,\n ( charCodeAt.call(hash, 4)\n | charCodeAt.call(hash, 5) << 8\n | charCodeAt.call(hash, 6) << 16\n | charCodeAt.call(hash, 7) << 24) >>> 0\n );\n};\n\n/**\n * Converts this long bits to a 8 characters long hash.\n * @returns {string} Hash\n */\nLongBits.prototype.toHash = function toHash() {\n return String.fromCharCode(\n this.lo & 255,\n this.lo >>> 8 & 255,\n this.lo >>> 16 & 255,\n this.lo >>> 24 ,\n this.hi & 255,\n this.hi >>> 8 & 255,\n this.hi >>> 16 & 255,\n this.hi >>> 24\n );\n};\n\n/**\n * Zig-zag encodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzEncode = function zzEncode() {\n var mask = this.hi >> 31;\n this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;\n this.lo = ( this.lo << 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Zig-zag decodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzDecode = function zzDecode() {\n var mask = -(this.lo & 1);\n this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;\n this.hi = ( this.hi >>> 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Calculates the length of this longbits when encoded as a varint.\n * @returns {number} Length\n */\nLongBits.prototype.length = function length() {\n var part0 = this.lo,\n part1 = (this.lo >>> 28 | this.hi << 4) >>> 0,\n part2 = this.hi >>> 24;\n return part2 === 0\n ? part1 === 0\n ? part0 < 16384\n ? part0 < 128 ? 1 : 2\n : part0 < 2097152 ? 3 : 4\n : part1 < 16384\n ? part1 < 128 ? 5 : 6\n : part1 < 2097152 ? 7 : 8\n : part2 < 128 ? 9 : 10;\n};\n",
13
+ "\"use strict\";\nvar util = exports;\n\n// used to return a Promise where callback is omitted\nutil.asPromise = require(\"@protobufjs/aspromise\");\n\n// converts to / from base64 encoded strings\nutil.base64 = require(\"@protobufjs/base64\");\n\n// base class of rpc.Service\nutil.EventEmitter = require(\"@protobufjs/eventemitter\");\n\n// float handling accross browsers\nutil.float = require(\"@protobufjs/float\");\n\n// requires modules optionally and hides the call from bundlers\nutil.inquire = require(\"@protobufjs/inquire\");\n\n// converts to / from utf8 encoded strings\nutil.utf8 = require(\"@protobufjs/utf8\");\n\n// provides a node-like buffer pool in the browser\nutil.pool = require(\"@protobufjs/pool\");\n\n// utility to work with the low and high bits of a 64 bit value\nutil.LongBits = require(\"./longbits\");\n\n/**\n * Whether running within node or not.\n * @memberof util\n * @type {boolean}\n */\nutil.isNode = Boolean(typeof global !== \"undefined\"\n && global\n && global.process\n && global.process.versions\n && global.process.versions.node);\n\n/**\n * Global object reference.\n * @memberof util\n * @type {Object}\n */\nutil.global = util.isNode && global\n || typeof window !== \"undefined\" && window\n || typeof self !== \"undefined\" && self\n || this; // eslint-disable-line no-invalid-this\n\n/**\n * An immuable empty array.\n * @memberof util\n * @type {Array.<*>}\n * @const\n */\nutil.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes\n\n/**\n * An immutable empty object.\n * @type {Object}\n * @const\n */\nutil.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes\n\n/**\n * Tests if the specified value is an integer.\n * @function\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is an integer\n */\nutil.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) {\n return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n};\n\n/**\n * Tests if the specified value is a string.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a string\n */\nutil.isString = function isString(value) {\n return typeof value === \"string\" || value instanceof String;\n};\n\n/**\n * Tests if the specified value is a non-null object.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a non-null object\n */\nutil.isObject = function isObject(value) {\n return value && typeof value === \"object\";\n};\n\n/**\n * Checks if a property on a message is considered to be present.\n * This is an alias of {@link util.isSet}.\n * @function\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isset =\n\n/**\n * Checks if a property on a message is considered to be present.\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isSet = function isSet(obj, prop) {\n var value = obj[prop];\n if (value != null && obj.hasOwnProperty(prop)) // eslint-disable-line eqeqeq, no-prototype-builtins\n return typeof value !== \"object\" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0;\n return false;\n};\n\n/**\n * Any compatible Buffer instance.\n * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings.\n * @interface Buffer\n * @extends Uint8Array\n */\n\n/**\n * Node's Buffer class if available.\n * @type {Constructor<Buffer>}\n */\nutil.Buffer = (function() {\n try {\n var Buffer = util.inquire(\"buffer\").Buffer;\n // refuse to use non-node buffers if not explicitly assigned (perf reasons):\n return Buffer.prototype.utf8Write ? Buffer : /* istanbul ignore next */ null;\n } catch (e) {\n /* istanbul ignore next */\n return null;\n }\n})();\n\n// Internal alias of or polyfull for Buffer.from.\nutil._Buffer_from = null;\n\n// Internal alias of or polyfill for Buffer.allocUnsafe.\nutil._Buffer_allocUnsafe = null;\n\n/**\n * Creates a new buffer of whatever type supported by the environment.\n * @param {number|number[]} [sizeOrArray=0] Buffer size or number array\n * @returns {Uint8Array|Buffer} Buffer\n */\nutil.newBuffer = function newBuffer(sizeOrArray) {\n /* istanbul ignore next */\n return typeof sizeOrArray === \"number\"\n ? util.Buffer\n ? util._Buffer_allocUnsafe(sizeOrArray)\n : new util.Array(sizeOrArray)\n : util.Buffer\n ? util._Buffer_from(sizeOrArray)\n : typeof Uint8Array === \"undefined\"\n ? sizeOrArray\n : new Uint8Array(sizeOrArray);\n};\n\n/**\n * Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`.\n * @type {Constructor<Uint8Array>}\n */\nutil.Array = typeof Uint8Array !== \"undefined\" ? Uint8Array /* istanbul ignore next */ : Array;\n\n/**\n * Any compatible Long instance.\n * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js.\n * @interface Long\n * @property {number} low Low bits\n * @property {number} high High bits\n * @property {boolean} unsigned Whether unsigned or not\n */\n\n/**\n * Long.js's Long class if available.\n * @type {Constructor<Long>}\n */\nutil.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long\n || /* istanbul ignore next */ util.global.Long\n || util.inquire(\"long\");\n\n/**\n * Regular expression used to verify 2 bit (`bool`) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key2Re = /^true|false|0|1$/;\n\n/**\n * Regular expression used to verify 32 bit (`int32` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key32Re = /^-?(?:0|[1-9][0-9]*)$/;\n\n/**\n * Regular expression used to verify 64 bit (`int64` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key64Re = /^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;\n\n/**\n * Converts a number or long to an 8 characters long hash string.\n * @param {Long|number} value Value to convert\n * @returns {string} Hash\n */\nutil.longToHash = function longToHash(value) {\n return value\n ? util.LongBits.from(value).toHash()\n : util.LongBits.zeroHash;\n};\n\n/**\n * Converts an 8 characters long hash string to a long or number.\n * @param {string} hash Hash\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long|number} Original value\n */\nutil.longFromHash = function longFromHash(hash, unsigned) {\n var bits = util.LongBits.fromHash(hash);\n if (util.Long)\n return util.Long.fromBits(bits.lo, bits.hi, unsigned);\n return bits.toNumber(Boolean(unsigned));\n};\n\n/**\n * Merges the properties of the source object into the destination object.\n * @memberof util\n * @param {Object.<string,*>} dst Destination object\n * @param {Object.<string,*>} src Source object\n * @param {boolean} [ifNotSet=false] Merges only if the key is not already set\n * @returns {Object.<string,*>} Destination object\n */\nfunction merge(dst, src, ifNotSet) { // used by converters\n for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)\n if (dst[keys[i]] === undefined || !ifNotSet)\n dst[keys[i]] = src[keys[i]];\n return dst;\n}\n\nutil.merge = merge;\n\n/**\n * Converts the first character of a string to lower case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.lcFirst = function lcFirst(str) {\n return str.charAt(0).toLowerCase() + str.substring(1);\n};\n\n/**\n * Creates a custom error constructor.\n * @memberof util\n * @param {string} name Error name\n * @returns {Constructor<Error>} Custom error constructor\n */\nfunction newError(name) {\n\n function CustomError(message, properties) {\n\n if (!(this instanceof CustomError))\n return new CustomError(message, properties);\n\n // Error.call(this, message);\n // ^ just returns a new error instance because the ctor can be called as a function\n\n Object.defineProperty(this, \"message\", { get: function() { return message; } });\n\n /* istanbul ignore next */\n if (Error.captureStackTrace) // node\n Error.captureStackTrace(this, CustomError);\n else\n Object.defineProperty(this, \"stack\", { value: new Error().stack || \"\" });\n\n if (properties)\n merge(this, properties);\n }\n\n CustomError.prototype = Object.create(Error.prototype, {\n constructor: {\n value: CustomError,\n writable: true,\n enumerable: false,\n configurable: true,\n },\n name: {\n get: function get() { return name; },\n set: undefined,\n enumerable: false,\n // configurable: false would accurately preserve the behavior of\n // the original, but I'm guessing that was not intentional.\n // For an actual error subclass, this property would\n // be configurable.\n configurable: true,\n },\n toString: {\n value: function value() { return this.name + \": \" + this.message; },\n writable: true,\n enumerable: false,\n configurable: true,\n },\n });\n\n return CustomError;\n}\n\nutil.newError = newError;\n\n/**\n * Constructs a new protocol error.\n * @classdesc Error subclass indicating a protocol specifc error.\n * @memberof util\n * @extends Error\n * @template T extends Message<T>\n * @constructor\n * @param {string} message Error message\n * @param {Object.<string,*>} [properties] Additional properties\n * @example\n * try {\n * MyMessage.decode(someBuffer); // throws if required fields are missing\n * } catch (e) {\n * if (e instanceof ProtocolError && e.instance)\n * console.log(\"decoded so far: \" + JSON.stringify(e.instance));\n * }\n */\nutil.ProtocolError = newError(\"ProtocolError\");\n\n/**\n * So far decoded message instance.\n * @name util.ProtocolError#instance\n * @type {Message<T>}\n */\n\n/**\n * A OneOf getter as returned by {@link util.oneOfGetter}.\n * @typedef OneOfGetter\n * @type {function}\n * @returns {string|undefined} Set field name, if any\n */\n\n/**\n * Builds a getter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfGetter} Unbound getter\n */\nutil.oneOfGetter = function getOneOf(fieldNames) {\n var fieldMap = {};\n for (var i = 0; i < fieldNames.length; ++i)\n fieldMap[fieldNames[i]] = 1;\n\n /**\n * @returns {string|undefined} Set field name, if any\n * @this Object\n * @ignore\n */\n return function() { // eslint-disable-line consistent-return\n for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)\n if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)\n return keys[i];\n };\n};\n\n/**\n * A OneOf setter as returned by {@link util.oneOfSetter}.\n * @typedef OneOfSetter\n * @type {function}\n * @param {string|undefined} value Field name\n * @returns {undefined}\n */\n\n/**\n * Builds a setter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfSetter} Unbound setter\n */\nutil.oneOfSetter = function setOneOf(fieldNames) {\n\n /**\n * @param {string} name Field name\n * @returns {undefined}\n * @this Object\n * @ignore\n */\n return function(name) {\n for (var i = 0; i < fieldNames.length; ++i)\n if (fieldNames[i] !== name)\n delete this[fieldNames[i]];\n };\n};\n\n/**\n * Default conversion options used for {@link Message#toJSON} implementations.\n *\n * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely:\n *\n * - Longs become strings\n * - Enums become string keys\n * - Bytes become base64 encoded strings\n * - (Sub-)Messages become plain objects\n * - Maps become plain objects with all string keys\n * - Repeated fields become arrays\n * - NaN and Infinity for float and double fields become strings\n *\n * @type {IConversionOptions}\n * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json\n */\nutil.toJSONOptions = {\n longs: String,\n enums: String,\n bytes: String,\n json: true\n};\n\n// Sets up buffer utility according to the environment (called in index-minimal)\nutil._configure = function() {\n var Buffer = util.Buffer;\n /* istanbul ignore if */\n if (!Buffer) {\n util._Buffer_from = util._Buffer_allocUnsafe = null;\n return;\n }\n // because node 4.x buffers are incompatible & immutable\n // see: https://github.com/dcodeIO/protobuf.js/pull/665\n util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from ||\n /* istanbul ignore next */\n function Buffer_from(value, encoding) {\n return new Buffer(value, encoding);\n };\n util._Buffer_allocUnsafe = Buffer.allocUnsafe ||\n /* istanbul ignore next */\n function Buffer_allocUnsafe(size) {\n return new Buffer(size);\n };\n};\n",
14
+ "\"use strict\";\nmodule.exports = Writer;\n\nvar util = require(\"./util/minimal\");\n\nvar BufferWriter; // cyclic\n\nvar LongBits = util.LongBits,\n base64 = util.base64,\n utf8 = util.utf8;\n\n/**\n * Constructs a new writer operation instance.\n * @classdesc Scheduled writer operation.\n * @constructor\n * @param {function(*, Uint8Array, number)} fn Function to call\n * @param {number} len Value byte length\n * @param {*} val Value to write\n * @ignore\n */\nfunction Op(fn, len, val) {\n\n /**\n * Function to call.\n * @type {function(Uint8Array, number, *)}\n */\n this.fn = fn;\n\n /**\n * Value byte length.\n * @type {number}\n */\n this.len = len;\n\n /**\n * Next operation.\n * @type {Writer.Op|undefined}\n */\n this.next = undefined;\n\n /**\n * Value to write.\n * @type {*}\n */\n this.val = val; // type varies\n}\n\n/* istanbul ignore next */\nfunction noop() {} // eslint-disable-line no-empty-function\n\n/**\n * Constructs a new writer state instance.\n * @classdesc Copied writer state.\n * @memberof Writer\n * @constructor\n * @param {Writer} writer Writer to copy state from\n * @ignore\n */\nfunction State(writer) {\n\n /**\n * Current head.\n * @type {Writer.Op}\n */\n this.head = writer.head;\n\n /**\n * Current tail.\n * @type {Writer.Op}\n */\n this.tail = writer.tail;\n\n /**\n * Current buffer length.\n * @type {number}\n */\n this.len = writer.len;\n\n /**\n * Next state.\n * @type {State|null}\n */\n this.next = writer.states;\n}\n\n/**\n * Constructs a new writer instance.\n * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n */\nfunction Writer() {\n\n /**\n * Current length.\n * @type {number}\n */\n this.len = 0;\n\n /**\n * Operations head.\n * @type {Object}\n */\n this.head = new Op(noop, 0, 0);\n\n /**\n * Operations tail\n * @type {Object}\n */\n this.tail = this.head;\n\n /**\n * Linked forked states.\n * @type {Object|null}\n */\n this.states = null;\n\n // When a value is written, the writer calculates its byte length and puts it into a linked\n // list of operations to perform when finish() is called. This both allows us to allocate\n // buffers of the exact required size and reduces the amount of work we have to do compared\n // to first calculating over objects and then encoding over objects. In our case, the encoding\n // part is just a linked list walk calling operations with already prepared values.\n}\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup() {\n return (Writer.create = function create_buffer() {\n return new BufferWriter();\n })();\n }\n /* istanbul ignore next */\n : function create_array() {\n return new Writer();\n };\n};\n\n/**\n * Creates a new writer.\n * @function\n * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}\n */\nWriter.create = create();\n\n/**\n * Allocates a buffer of the specified size.\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\nWriter.alloc = function alloc(size) {\n return new util.Array(size);\n};\n\n// Use Uint8Array buffer pool in the browser, just like node does with buffers\n/* istanbul ignore else */\nif (util.Array !== Array)\n Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);\n\n/**\n * Pushes a new operation to the queue.\n * @param {function(Uint8Array, number, *)} fn Function to call\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @returns {Writer} `this`\n * @private\n */\nWriter.prototype._push = function push(fn, len, val) {\n this.tail = this.tail.next = new Op(fn, len, val);\n this.len += len;\n return this;\n};\n\nfunction writeByte(val, buf, pos) {\n buf[pos] = val & 255;\n}\n\nfunction writeVarint32(val, buf, pos) {\n while (val > 127) {\n buf[pos++] = val & 127 | 128;\n val >>>= 7;\n }\n buf[pos] = val;\n}\n\n/**\n * Constructs a new varint writer operation instance.\n * @classdesc Scheduled varint writer operation.\n * @extends Op\n * @constructor\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @ignore\n */\nfunction VarintOp(len, val) {\n this.len = len;\n this.next = undefined;\n this.val = val;\n}\n\nVarintOp.prototype = Object.create(Op.prototype);\nVarintOp.prototype.fn = writeVarint32;\n\n/**\n * Writes an unsigned 32 bit value as a varint.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint32 = function write_uint32(value) {\n // here, the call to this.push has been inlined and a varint specific Op subclass is used.\n // uint32 is by far the most frequently used operation and benefits significantly from this.\n this.len += (this.tail = this.tail.next = new VarintOp(\n (value = value >>> 0)\n < 128 ? 1\n : value < 16384 ? 2\n : value < 2097152 ? 3\n : value < 268435456 ? 4\n : 5,\n value)).len;\n return this;\n};\n\n/**\n * Writes a signed 32 bit value as a varint.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int32 = function write_int32(value) {\n return value < 0\n ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec\n : this.uint32(value);\n};\n\n/**\n * Writes a 32 bit value as a varint, zig-zag encoded.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint32 = function write_sint32(value) {\n return this.uint32((value << 1 ^ value >> 31) >>> 0);\n};\n\nfunction writeVarint64(val, buf, pos) {\n while (val.hi) {\n buf[pos++] = val.lo & 127 | 128;\n val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;\n val.hi >>>= 7;\n }\n while (val.lo > 127) {\n buf[pos++] = val.lo & 127 | 128;\n val.lo = val.lo >>> 7;\n }\n buf[pos++] = val.lo;\n}\n\n/**\n * Writes an unsigned 64 bit value as a varint.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.uint64 = function write_uint64(value) {\n var bits = LongBits.from(value);\n return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a signed 64 bit value as a varint.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.int64 = Writer.prototype.uint64;\n\n/**\n * Writes a signed 64 bit value as a varint, zig-zag encoded.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sint64 = function write_sint64(value) {\n var bits = LongBits.from(value).zzEncode();\n return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a boolish value as a varint.\n * @param {boolean} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bool = function write_bool(value) {\n return this._push(writeByte, 1, value ? 1 : 0);\n};\n\nfunction writeFixed32(val, buf, pos) {\n buf[pos ] = val & 255;\n buf[pos + 1] = val >>> 8 & 255;\n buf[pos + 2] = val >>> 16 & 255;\n buf[pos + 3] = val >>> 24;\n}\n\n/**\n * Writes an unsigned 32 bit value as fixed 32 bits.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed32 = function write_fixed32(value) {\n return this._push(writeFixed32, 4, value >>> 0);\n};\n\n/**\n * Writes a signed 32 bit value as fixed 32 bits.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed32 = Writer.prototype.fixed32;\n\n/**\n * Writes an unsigned 64 bit value as fixed 64 bits.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.fixed64 = function write_fixed64(value) {\n var bits = LongBits.from(value);\n return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);\n};\n\n/**\n * Writes a signed 64 bit value as fixed 64 bits.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sfixed64 = Writer.prototype.fixed64;\n\n/**\n * Writes a float (32 bit).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.float = function write_float(value) {\n return this._push(util.float.writeFloatLE, 4, value);\n};\n\n/**\n * Writes a double (64 bit float).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.double = function write_double(value) {\n return this._push(util.float.writeDoubleLE, 8, value);\n};\n\nvar writeBytes = util.Array.prototype.set\n ? function writeBytes_set(val, buf, pos) {\n buf.set(val, pos); // also works for plain array values\n }\n /* istanbul ignore next */\n : function writeBytes_for(val, buf, pos) {\n for (var i = 0; i < val.length; ++i)\n buf[pos + i] = val[i];\n };\n\n/**\n * Writes a sequence of bytes.\n * @param {Uint8Array|string} value Buffer or base64 encoded string to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bytes = function write_bytes(value) {\n var len = value.length >>> 0;\n if (!len)\n return this._push(writeByte, 1, 0);\n if (util.isString(value)) {\n var buf = Writer.alloc(len = base64.length(value));\n base64.decode(value, buf, 0);\n value = buf;\n }\n return this.uint32(len)._push(writeBytes, len, value);\n};\n\n/**\n * Writes a string.\n * @param {string} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.string = function write_string(value) {\n var len = utf8.length(value);\n return len\n ? this.uint32(len)._push(utf8.write, len, value)\n : this._push(writeByte, 1, 0);\n};\n\n/**\n * Forks this writer's state by pushing it to a stack.\n * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.\n * @returns {Writer} `this`\n */\nWriter.prototype.fork = function fork() {\n this.states = new State(this);\n this.head = this.tail = new Op(noop, 0, 0);\n this.len = 0;\n return this;\n};\n\n/**\n * Resets this instance to the last state.\n * @returns {Writer} `this`\n */\nWriter.prototype.reset = function reset() {\n if (this.states) {\n this.head = this.states.head;\n this.tail = this.states.tail;\n this.len = this.states.len;\n this.states = this.states.next;\n } else {\n this.head = this.tail = new Op(noop, 0, 0);\n this.len = 0;\n }\n return this;\n};\n\n/**\n * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.\n * @returns {Writer} `this`\n */\nWriter.prototype.ldelim = function ldelim() {\n var head = this.head,\n tail = this.tail,\n len = this.len;\n this.reset().uint32(len);\n if (len) {\n this.tail.next = head.next; // skip noop\n this.tail = tail;\n this.len += len;\n }\n return this;\n};\n\n/**\n * Finishes the write operation.\n * @returns {Uint8Array} Finished buffer\n */\nWriter.prototype.finish = function finish() {\n var head = this.head.next, // skip noop\n buf = this.constructor.alloc(this.len),\n pos = 0;\n while (head) {\n head.fn(head.val, buf, pos);\n pos += head.len;\n head = head.next;\n }\n // this.head = this.tail = null;\n return buf;\n};\n\nWriter._configure = function(BufferWriter_) {\n BufferWriter = BufferWriter_;\n Writer.create = create();\n BufferWriter._configure();\n};\n",
15
+ "\"use strict\";\nmodule.exports = BufferWriter;\n\n// extends Writer\nvar Writer = require(\"./writer\");\n(BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer writer instance.\n * @classdesc Wire format writer using node buffers.\n * @extends Writer\n * @constructor\n */\nfunction BufferWriter() {\n Writer.call(this);\n}\n\nBufferWriter._configure = function () {\n /**\n * Allocates a buffer of the specified size.\n * @function\n * @param {number} size Buffer size\n * @returns {Buffer} Buffer\n */\n BufferWriter.alloc = util._Buffer_allocUnsafe;\n\n BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === \"set\"\n ? function writeBytesBuffer_set(val, buf, pos) {\n buf.set(val, pos); // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited)\n // also works for plain array values\n }\n /* istanbul ignore next */\n : function writeBytesBuffer_copy(val, buf, pos) {\n if (val.copy) // Buffer values\n val.copy(buf, pos, 0, val.length);\n else for (var i = 0; i < val.length;) // plain array values\n buf[pos++] = val[i++];\n };\n};\n\n\n/**\n * @override\n */\nBufferWriter.prototype.bytes = function write_bytes_buffer(value) {\n if (util.isString(value))\n value = util._Buffer_from(value, \"base64\");\n var len = value.length >>> 0;\n this.uint32(len);\n if (len)\n this._push(BufferWriter.writeBytesBuffer, len, value);\n return this;\n};\n\nfunction writeStringBuffer(val, buf, pos) {\n if (val.length < 40) // plain js is faster for short strings (probably due to redundant assertions)\n util.utf8.write(val, buf, pos);\n else if (buf.utf8Write)\n buf.utf8Write(val, pos);\n else\n buf.write(val, pos);\n}\n\n/**\n * @override\n */\nBufferWriter.prototype.string = function write_string_buffer(value) {\n var len = util.Buffer.byteLength(value);\n this.uint32(len);\n if (len)\n this._push(writeStringBuffer, len, value);\n return this;\n};\n\n\n/**\n * Finishes the write operation.\n * @name BufferWriter#finish\n * @function\n * @returns {Buffer} Finished buffer\n */\n\nBufferWriter._configure();\n",
16
+ "\"use strict\";\nmodule.exports = Reader;\n\nvar util = require(\"./util/minimal\");\n\nvar BufferReader; // cyclic\n\nvar LongBits = util.LongBits,\n utf8 = util.utf8;\n\n/* istanbul ignore next */\nfunction indexOutOfRange(reader, writeLength) {\n return RangeError(\"index out of range: \" + reader.pos + \" + \" + (writeLength || 1) + \" > \" + reader.len);\n}\n\n/**\n * Constructs a new reader instance using the specified buffer.\n * @classdesc Wire format reader using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n * @param {Uint8Array} buffer Buffer to read from\n */\nfunction Reader(buffer) {\n\n /**\n * Read buffer.\n * @type {Uint8Array}\n */\n this.buf = buffer;\n\n /**\n * Read buffer position.\n * @type {number}\n */\n this.pos = 0;\n\n /**\n * Read buffer length.\n * @type {number}\n */\n this.len = buffer.length;\n}\n\nvar create_array = typeof Uint8Array !== \"undefined\"\n ? function create_typed_array(buffer) {\n if (buffer instanceof Uint8Array || Array.isArray(buffer))\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n }\n /* istanbul ignore next */\n : function create_array(buffer) {\n if (Array.isArray(buffer))\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n };\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup(buffer) {\n return (Reader.create = function create_buffer(buffer) {\n return util.Buffer.isBuffer(buffer)\n ? new BufferReader(buffer)\n /* istanbul ignore next */\n : create_array(buffer);\n })(buffer);\n }\n /* istanbul ignore next */\n : create_array;\n};\n\n/**\n * Creates a new reader using the specified buffer.\n * @function\n * @param {Uint8Array|Buffer} buffer Buffer to read from\n * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader}\n * @throws {Error} If `buffer` is not a valid buffer\n */\nReader.create = create();\n\nReader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice;\n\n/**\n * Reads a varint as an unsigned 32 bit value.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.uint32 = (function read_uint32_setup() {\n var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!)\n return function read_uint32() {\n value = ( this.buf[this.pos] & 127 ) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value;\n\n /* istanbul ignore if */\n if ((this.pos += 5) > this.len) {\n this.pos = this.len;\n throw indexOutOfRange(this, 10);\n }\n return value;\n };\n})();\n\n/**\n * Reads a varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.int32 = function read_int32() {\n return this.uint32() | 0;\n};\n\n/**\n * Reads a zig-zag encoded varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.sint32 = function read_sint32() {\n var value = this.uint32();\n return value >>> 1 ^ -(value & 1) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readLongVarint() {\n // tends to deopt with local vars for octet etc.\n var bits = new LongBits(0, 0);\n var i = 0;\n if (this.len - this.pos > 4) { // fast route (lo)\n for (; i < 4; ++i) {\n // 1st..4th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 5th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n i = 0;\n } else {\n for (; i < 3; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 1st..3th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 4th\n bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0;\n return bits;\n }\n if (this.len - this.pos > 4) { // fast route (hi)\n for (; i < 5; ++i) {\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n } else {\n for (; i < 5; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n }\n /* istanbul ignore next */\n throw Error(\"invalid varint encoding\");\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads a varint as a signed 64 bit value.\n * @name Reader#int64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as an unsigned 64 bit value.\n * @name Reader#uint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a zig-zag encoded varint as a signed 64 bit value.\n * @name Reader#sint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as a boolean.\n * @returns {boolean} Value read\n */\nReader.prototype.bool = function read_bool() {\n return this.uint32() !== 0;\n};\n\nfunction readFixed32_end(buf, end) { // note that this uses `end`, not `pos`\n return (buf[end - 4]\n | buf[end - 3] << 8\n | buf[end - 2] << 16\n | buf[end - 1] << 24) >>> 0;\n}\n\n/**\n * Reads fixed 32 bits as an unsigned 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.fixed32 = function read_fixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4);\n};\n\n/**\n * Reads fixed 32 bits as a signed 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.sfixed32 = function read_sfixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readFixed64(/* this: Reader */) {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 8);\n\n return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads fixed 64 bits.\n * @name Reader#fixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads zig-zag encoded fixed 64 bits.\n * @name Reader#sfixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a float (32 bit) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.float = function read_float() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readFloatLE(this.buf, this.pos);\n this.pos += 4;\n return value;\n};\n\n/**\n * Reads a double (64 bit float) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.double = function read_double() {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readDoubleLE(this.buf, this.pos);\n this.pos += 8;\n return value;\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @returns {Uint8Array} Value read\n */\nReader.prototype.bytes = function read_bytes() {\n var length = this.uint32(),\n start = this.pos,\n end = this.pos + length;\n\n /* istanbul ignore if */\n if (end > this.len)\n throw indexOutOfRange(this, length);\n\n this.pos += length;\n if (Array.isArray(this.buf)) // plain array\n return this.buf.slice(start, end);\n\n if (start === end) { // fix for IE 10/Win8 and others' subarray returning array of size 1\n var nativeBuffer = util.Buffer;\n return nativeBuffer\n ? nativeBuffer.alloc(0)\n : new this.buf.constructor(0);\n }\n return this._slice.call(this.buf, start, end);\n};\n\n/**\n * Reads a string preceeded by its byte length as a varint.\n * @returns {string} Value read\n */\nReader.prototype.string = function read_string() {\n var bytes = this.bytes();\n return utf8.read(bytes, 0, bytes.length);\n};\n\n/**\n * Skips the specified number of bytes if specified, otherwise skips a varint.\n * @param {number} [length] Length if known, otherwise a varint is assumed\n * @returns {Reader} `this`\n */\nReader.prototype.skip = function skip(length) {\n if (typeof length === \"number\") {\n /* istanbul ignore if */\n if (this.pos + length > this.len)\n throw indexOutOfRange(this, length);\n this.pos += length;\n } else {\n do {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n } while (this.buf[this.pos++] & 128);\n }\n return this;\n};\n\n/**\n * Skips the next element of the specified wire type.\n * @param {number} wireType Wire type received\n * @returns {Reader} `this`\n */\nReader.prototype.skipType = function(wireType) {\n switch (wireType) {\n case 0:\n this.skip();\n break;\n case 1:\n this.skip(8);\n break;\n case 2:\n this.skip(this.uint32());\n break;\n case 3:\n while ((wireType = this.uint32() & 7) !== 4) {\n this.skipType(wireType);\n }\n break;\n case 5:\n this.skip(4);\n break;\n\n /* istanbul ignore next */\n default:\n throw Error(\"invalid wire type \" + wireType + \" at offset \" + this.pos);\n }\n return this;\n};\n\nReader._configure = function(BufferReader_) {\n BufferReader = BufferReader_;\n Reader.create = create();\n BufferReader._configure();\n\n var fn = util.Long ? \"toLong\" : /* istanbul ignore next */ \"toNumber\";\n util.merge(Reader.prototype, {\n\n int64: function read_int64() {\n return readLongVarint.call(this)[fn](false);\n },\n\n uint64: function read_uint64() {\n return readLongVarint.call(this)[fn](true);\n },\n\n sint64: function read_sint64() {\n return readLongVarint.call(this).zzDecode()[fn](false);\n },\n\n fixed64: function read_fixed64() {\n return readFixed64.call(this)[fn](true);\n },\n\n sfixed64: function read_sfixed64() {\n return readFixed64.call(this)[fn](false);\n }\n\n });\n};\n",
17
+ "\"use strict\";\nmodule.exports = BufferReader;\n\n// extends Reader\nvar Reader = require(\"./reader\");\n(BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer reader instance.\n * @classdesc Wire format reader using node buffers.\n * @extends Reader\n * @constructor\n * @param {Buffer} buffer Buffer to read from\n */\nfunction BufferReader(buffer) {\n Reader.call(this, buffer);\n\n /**\n * Read buffer.\n * @name BufferReader#buf\n * @type {Buffer}\n */\n}\n\nBufferReader._configure = function () {\n /* istanbul ignore else */\n if (util.Buffer)\n BufferReader.prototype._slice = util.Buffer.prototype.slice;\n};\n\n\n/**\n * @override\n */\nBufferReader.prototype.string = function read_string_buffer() {\n var len = this.uint32(); // modifies pos\n return this.buf.utf8Slice\n ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len))\n : this.buf.toString(\"utf-8\", this.pos, this.pos = Math.min(this.pos + len, this.len));\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @name BufferReader#bytes\n * @function\n * @returns {Buffer} Value read\n */\n\nBufferReader._configure();\n",
18
+ "\"use strict\";\nmodule.exports = Service;\n\nvar util = require(\"../util/minimal\");\n\n// Extends EventEmitter\n(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service;\n\n/**\n * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.\n *\n * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.\n * @typedef rpc.ServiceMethodCallback\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {TRes} [response] Response message\n * @returns {undefined}\n */\n\n/**\n * A service method part of a {@link rpc.Service} as created by {@link Service.create}.\n * @typedef rpc.ServiceMethod\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} [callback] Node-style callback called with the error, if any, and the response message\n * @returns {Promise<Message<TRes>>} Promise if `callback` has been omitted, otherwise `undefined`\n */\n\n/**\n * Constructs a new RPC service instance.\n * @classdesc An RPC service as returned by {@link Service#create}.\n * @exports rpc.Service\n * @extends util.EventEmitter\n * @constructor\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n */\nfunction Service(rpcImpl, requestDelimited, responseDelimited) {\n\n if (typeof rpcImpl !== \"function\")\n throw TypeError(\"rpcImpl must be a function\");\n\n util.EventEmitter.call(this);\n\n /**\n * RPC implementation. Becomes `null` once the service is ended.\n * @type {RPCImpl|null}\n */\n this.rpcImpl = rpcImpl;\n\n /**\n * Whether requests are length-delimited.\n * @type {boolean}\n */\n this.requestDelimited = Boolean(requestDelimited);\n\n /**\n * Whether responses are length-delimited.\n * @type {boolean}\n */\n this.responseDelimited = Boolean(responseDelimited);\n}\n\n/**\n * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.\n * @param {Method|rpc.ServiceMethod<TReq,TRes>} method Reflected or static method\n * @param {Constructor<TReq>} requestCtor Request constructor\n * @param {Constructor<TRes>} responseCtor Response constructor\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} callback Service callback\n * @returns {undefined}\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n */\nService.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {\n\n if (!request)\n throw TypeError(\"request must be specified\");\n\n var self = this;\n if (!callback)\n return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request);\n\n if (!self.rpcImpl) {\n setTimeout(function() { callback(Error(\"already ended\")); }, 0);\n return undefined;\n }\n\n try {\n return self.rpcImpl(\n method,\n requestCtor[self.requestDelimited ? \"encodeDelimited\" : \"encode\"](request).finish(),\n function rpcCallback(err, response) {\n\n if (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n\n if (response === null) {\n self.end(/* endedByRPC */ true);\n return undefined;\n }\n\n if (!(response instanceof responseCtor)) {\n try {\n response = responseCtor[self.responseDelimited ? \"decodeDelimited\" : \"decode\"](response);\n } catch (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n }\n\n self.emit(\"data\", response, method);\n return callback(null, response);\n }\n );\n } catch (err) {\n self.emit(\"error\", err, method);\n setTimeout(function() { callback(err); }, 0);\n return undefined;\n }\n};\n\n/**\n * Ends this service and emits the `end` event.\n * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation.\n * @returns {rpc.Service} `this`\n */\nService.prototype.end = function end(endedByRPC) {\n if (this.rpcImpl) {\n if (!endedByRPC) // signal end to rpcImpl\n this.rpcImpl(null, null, null);\n this.rpcImpl = null;\n this.emit(\"end\").off();\n }\n return this;\n};\n",
19
+ "\"use strict\";\n\n/**\n * Streaming RPC helpers.\n * @namespace\n */\nvar rpc = exports;\n\n/**\n * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets.\n * @typedef RPCImpl\n * @type {function}\n * @param {Method|rpc.ServiceMethod<Message<{}>,Message<{}>>} method Reflected or static method being called\n * @param {Uint8Array} requestData Request data\n * @param {RPCImplCallback} callback Callback function\n * @returns {undefined}\n * @example\n * function rpcImpl(method, requestData, callback) {\n * if (protobuf.util.lcFirst(method.name) !== \"myMethod\") // compatible with static code\n * throw Error(\"no such method\");\n * asynchronouslyObtainAResponse(requestData, function(err, responseData) {\n * callback(err, responseData);\n * });\n * }\n */\n\n/**\n * Node-style callback as used by {@link RPCImpl}.\n * @typedef RPCImplCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error\n * @returns {undefined}\n */\n\nrpc.Service = require(\"./rpc/service\");\n",
20
+ "\"use strict\";\nmodule.exports = {};\n\n/**\n * Named roots.\n * This is where pbjs stores generated structures (the option `-r, --root` specifies a name).\n * Can also be used manually to make roots available across modules.\n * @name roots\n * @type {Object.<string,Root>}\n * @example\n * // pbjs -r myroot -o compiled.js ...\n *\n * // in another module:\n * require(\"./compiled.js\");\n *\n * // in any subsequent module:\n * var root = protobuf.roots[\"myroot\"];\n */\n",
21
+ "\"use strict\";\nvar protobuf = exports;\n\n/**\n * Build type, one of `\"full\"`, `\"light\"` or `\"minimal\"`.\n * @name build\n * @type {string}\n * @const\n */\nprotobuf.build = \"minimal\";\n\n// Serialization\nprotobuf.Writer = require(\"./writer\");\nprotobuf.BufferWriter = require(\"./writer_buffer\");\nprotobuf.Reader = require(\"./reader\");\nprotobuf.BufferReader = require(\"./reader_buffer\");\n\n// Utility\nprotobuf.util = require(\"./util/minimal\");\nprotobuf.rpc = require(\"./rpc\");\nprotobuf.roots = require(\"./roots\");\nprotobuf.configure = configure;\n\n/* istanbul ignore next */\n/**\n * Reconfigures the library according to the environment.\n * @returns {undefined}\n */\nfunction configure() {\n protobuf.util._configure();\n protobuf.Writer._configure(protobuf.BufferWriter);\n protobuf.Reader._configure(protobuf.BufferReader);\n}\n\n// Set up buffer utility according to the environment\nconfigure();\n",
22
+ "\"use strict\";\r\nmodule.exports = codegen;\r\n\r\n/**\r\n * Begins generating a function.\r\n * @memberof util\r\n * @param {string[]} functionParams Function parameter names\r\n * @param {string} [functionName] Function name if not anonymous\r\n * @returns {Codegen} Appender that appends code to the function's body\r\n */\r\nfunction codegen(functionParams, functionName) {\r\n\r\n /* istanbul ignore if */\r\n if (typeof functionParams === \"string\") {\r\n functionName = functionParams;\r\n functionParams = undefined;\r\n }\r\n\r\n var body = [];\r\n\r\n /**\r\n * Appends code to the function's body or finishes generation.\r\n * @typedef Codegen\r\n * @type {function}\r\n * @param {string|Object.<string,*>} [formatStringOrScope] Format string or, to finish the function, an object of additional scope variables, if any\r\n * @param {...*} [formatParams] Format parameters\r\n * @returns {Codegen|Function} Itself or the generated function if finished\r\n * @throws {Error} If format parameter counts do not match\r\n */\r\n\r\n function Codegen(formatStringOrScope) {\r\n // note that explicit array handling below makes this ~50% faster\r\n\r\n // finish the function\r\n if (typeof formatStringOrScope !== \"string\") {\r\n var source = toString();\r\n if (codegen.verbose)\r\n console.log(\"codegen: \" + source); // eslint-disable-line no-console\r\n source = \"return \" + source;\r\n if (formatStringOrScope) {\r\n var scopeKeys = Object.keys(formatStringOrScope),\r\n scopeParams = new Array(scopeKeys.length + 1),\r\n scopeValues = new Array(scopeKeys.length),\r\n scopeOffset = 0;\r\n while (scopeOffset < scopeKeys.length) {\r\n scopeParams[scopeOffset] = scopeKeys[scopeOffset];\r\n scopeValues[scopeOffset] = formatStringOrScope[scopeKeys[scopeOffset++]];\r\n }\r\n scopeParams[scopeOffset] = source;\r\n return Function.apply(null, scopeParams).apply(null, scopeValues); // eslint-disable-line no-new-func\r\n }\r\n return Function(source)(); // eslint-disable-line no-new-func\r\n }\r\n\r\n // otherwise append to body\r\n var formatParams = new Array(arguments.length - 1),\r\n formatOffset = 0;\r\n while (formatOffset < formatParams.length)\r\n formatParams[formatOffset] = arguments[++formatOffset];\r\n formatOffset = 0;\r\n formatStringOrScope = formatStringOrScope.replace(/%([%dfijs])/g, function replace($0, $1) {\r\n var value = formatParams[formatOffset++];\r\n switch ($1) {\r\n case \"d\": case \"f\": return String(Number(value));\r\n case \"i\": return String(Math.floor(value));\r\n case \"j\": return JSON.stringify(value);\r\n case \"s\": return String(value);\r\n }\r\n return \"%\";\r\n });\r\n if (formatOffset !== formatParams.length)\r\n throw Error(\"parameter count mismatch\");\r\n body.push(formatStringOrScope);\r\n return Codegen;\r\n }\r\n\r\n function toString(functionNameOverride) {\r\n return \"function \" + (functionNameOverride || functionName || \"\") + \"(\" + (functionParams && functionParams.join(\",\") || \"\") + \"){\\n \" + body.join(\"\\n \") + \"\\n}\";\r\n }\r\n\r\n Codegen.toString = toString;\r\n return Codegen;\r\n}\r\n\r\n/**\r\n * Begins generating a function.\r\n * @memberof util\r\n * @function codegen\r\n * @param {string} [functionName] Function name if not anonymous\r\n * @returns {Codegen} Appender that appends code to the function's body\r\n * @variation 2\r\n */\r\n\r\n/**\r\n * When set to `true`, codegen will log generated code to console. Useful for debugging.\r\n * @name util.codegen.verbose\r\n * @type {boolean}\r\n */\r\ncodegen.verbose = false;\r\n",
23
+ "\"use strict\";\r\nmodule.exports = fetch;\r\n\r\nvar asPromise = require(\"@protobufjs/aspromise\"),\r\n inquire = require(\"@protobufjs/inquire\");\r\n\r\nvar fs = inquire(\"fs\");\r\n\r\n/**\r\n * Node-style callback as used by {@link util.fetch}.\r\n * @typedef FetchCallback\r\n * @type {function}\r\n * @param {?Error} error Error, if any, otherwise `null`\r\n * @param {string} [contents] File contents, if there hasn't been an error\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Options as used by {@link util.fetch}.\r\n * @typedef FetchOptions\r\n * @type {Object}\r\n * @property {boolean} [binary=false] Whether expecting a binary response\r\n * @property {boolean} [xhr=false] If `true`, forces the use of XMLHttpRequest\r\n */\r\n\r\n/**\r\n * Fetches the contents of a file.\r\n * @memberof util\r\n * @param {string} filename File path or url\r\n * @param {FetchOptions} options Fetch options\r\n * @param {FetchCallback} callback Callback function\r\n * @returns {undefined}\r\n */\r\nfunction fetch(filename, options, callback) {\r\n if (typeof options === \"function\") {\r\n callback = options;\r\n options = {};\r\n } else if (!options)\r\n options = {};\r\n\r\n if (!callback)\r\n return asPromise(fetch, this, filename, options); // eslint-disable-line no-invalid-this\r\n\r\n // if a node-like filesystem is present, try it first but fall back to XHR if nothing is found.\r\n if (!options.xhr && fs && fs.readFile)\r\n return fs.readFile(filename, function fetchReadFileCallback(err, contents) {\r\n return err && typeof XMLHttpRequest !== \"undefined\"\r\n ? fetch.xhr(filename, options, callback)\r\n : err\r\n ? callback(err)\r\n : callback(null, options.binary ? contents : contents.toString(\"utf8\"));\r\n });\r\n\r\n // use the XHR version otherwise.\r\n return fetch.xhr(filename, options, callback);\r\n}\r\n\r\n/**\r\n * Fetches the contents of a file.\r\n * @name util.fetch\r\n * @function\r\n * @param {string} path File path or url\r\n * @param {FetchCallback} callback Callback function\r\n * @returns {undefined}\r\n * @variation 2\r\n */\r\n\r\n/**\r\n * Fetches the contents of a file.\r\n * @name util.fetch\r\n * @function\r\n * @param {string} path File path or url\r\n * @param {FetchOptions} [options] Fetch options\r\n * @returns {Promise<string|Uint8Array>} Promise\r\n * @variation 3\r\n */\r\n\r\n/**/\r\nfetch.xhr = function fetch_xhr(filename, options, callback) {\r\n var xhr = new XMLHttpRequest();\r\n xhr.onreadystatechange /* works everywhere */ = function fetchOnReadyStateChange() {\r\n\r\n if (xhr.readyState !== 4)\r\n return undefined;\r\n\r\n // local cors security errors return status 0 / empty string, too. afaik this cannot be\r\n // reliably distinguished from an actually empty file for security reasons. feel free\r\n // to send a pull request if you are aware of a solution.\r\n if (xhr.status !== 0 && xhr.status !== 200)\r\n return callback(Error(\"status \" + xhr.status));\r\n\r\n // if binary data is expected, make sure that some sort of array is returned, even if\r\n // ArrayBuffers are not supported. the binary string fallback, however, is unsafe.\r\n if (options.binary) {\r\n var buffer = xhr.response;\r\n if (!buffer) {\r\n buffer = [];\r\n for (var i = 0; i < xhr.responseText.length; ++i)\r\n buffer.push(xhr.responseText.charCodeAt(i) & 255);\r\n }\r\n return callback(null, typeof Uint8Array !== \"undefined\" ? new Uint8Array(buffer) : buffer);\r\n }\r\n return callback(null, xhr.responseText);\r\n };\r\n\r\n if (options.binary) {\r\n // ref: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data#Receiving_binary_data_in_older_browsers\r\n if (\"overrideMimeType\" in xhr)\r\n xhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\r\n xhr.responseType = \"arraybuffer\";\r\n }\r\n\r\n xhr.open(\"GET\", filename);\r\n xhr.send();\r\n};\r\n",
24
+ "\"use strict\";\r\n\r\n/**\r\n * A minimal path module to resolve Unix, Windows and URL paths alike.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar path = exports;\r\n\r\nvar isAbsolute =\r\n/**\r\n * Tests if the specified path is absolute.\r\n * @param {string} path Path to test\r\n * @returns {boolean} `true` if path is absolute\r\n */\r\npath.isAbsolute = function isAbsolute(path) {\r\n return /^(?:\\/|\\w+:)/.test(path);\r\n};\r\n\r\nvar normalize =\r\n/**\r\n * Normalizes the specified path.\r\n * @param {string} path Path to normalize\r\n * @returns {string} Normalized path\r\n */\r\npath.normalize = function normalize(path) {\r\n path = path.replace(/\\\\/g, \"/\")\r\n .replace(/\\/{2,}/g, \"/\");\r\n var parts = path.split(\"/\"),\r\n absolute = isAbsolute(path),\r\n prefix = \"\";\r\n if (absolute)\r\n prefix = parts.shift() + \"/\";\r\n for (var i = 0; i < parts.length;) {\r\n if (parts[i] === \"..\") {\r\n if (i > 0 && parts[i - 1] !== \"..\")\r\n parts.splice(--i, 2);\r\n else if (absolute)\r\n parts.splice(i, 1);\r\n else\r\n ++i;\r\n } else if (parts[i] === \".\")\r\n parts.splice(i, 1);\r\n else\r\n ++i;\r\n }\r\n return prefix + parts.join(\"/\");\r\n};\r\n\r\n/**\r\n * Resolves the specified include path against the specified origin path.\r\n * @param {string} originPath Path to the origin file\r\n * @param {string} includePath Include path relative to origin path\r\n * @param {boolean} [alreadyNormalized=false] `true` if both paths are already known to be normalized\r\n * @returns {string} Path to the include file\r\n */\r\npath.resolve = function resolve(originPath, includePath, alreadyNormalized) {\r\n if (!alreadyNormalized)\r\n includePath = normalize(includePath);\r\n if (isAbsolute(includePath))\r\n return includePath;\r\n if (!alreadyNormalized)\r\n originPath = normalize(originPath);\r\n return (originPath = originPath.replace(/(?:\\/|^)[^/]+$/, \"\")).length ? normalize(originPath + \"/\" + includePath) : includePath;\r\n};\r\n",
25
+ "\"use strict\";\nmodule.exports = Namespace;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\n((Namespace.prototype = Object.create(ReflectionObject.prototype)).constructor = Namespace).className = \"Namespace\";\n\nvar Field = require(\"./field\"),\n util = require(\"./util\"),\n OneOf = require(\"./oneof\");\n\nvar Type, // cyclic\n Service,\n Enum;\n\n/**\n * Constructs a new namespace instance.\n * @name Namespace\n * @classdesc Reflected namespace.\n * @extends NamespaceBase\n * @constructor\n * @param {string} name Namespace name\n * @param {Object.<string,*>} [options] Declared options\n */\n\n/**\n * Constructs a namespace from JSON.\n * @memberof Namespace\n * @function\n * @param {string} name Namespace name\n * @param {Object.<string,*>} json JSON object\n * @returns {Namespace} Created namespace\n * @throws {TypeError} If arguments are invalid\n */\nNamespace.fromJSON = function fromJSON(name, json) {\n return new Namespace(name, json.options).addJSON(json.nested);\n};\n\n/**\n * Converts an array of reflection objects to JSON.\n * @memberof Namespace\n * @param {ReflectionObject[]} array Object array\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {Object.<string,*>|undefined} JSON object or `undefined` when array is empty\n */\nfunction arrayToJSON(array, toJSONOptions) {\n if (!(array && array.length))\n return undefined;\n var obj = {};\n for (var i = 0; i < array.length; ++i)\n obj[array[i].name] = array[i].toJSON(toJSONOptions);\n return obj;\n}\n\nNamespace.arrayToJSON = arrayToJSON;\n\n/**\n * Tests if the specified id is reserved.\n * @param {Array.<number[]|string>|undefined} reserved Array of reserved ranges and names\n * @param {number} id Id to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nNamespace.isReservedId = function isReservedId(reserved, id) {\n if (reserved)\n for (var i = 0; i < reserved.length; ++i)\n if (typeof reserved[i] !== \"string\" && reserved[i][0] <= id && reserved[i][1] > id)\n return true;\n return false;\n};\n\n/**\n * Tests if the specified name is reserved.\n * @param {Array.<number[]|string>|undefined} reserved Array of reserved ranges and names\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nNamespace.isReservedName = function isReservedName(reserved, name) {\n if (reserved)\n for (var i = 0; i < reserved.length; ++i)\n if (reserved[i] === name)\n return true;\n return false;\n};\n\n/**\n * Not an actual constructor. Use {@link Namespace} instead.\n * @classdesc Base class of all reflection objects containing nested objects. This is not an actual class but here for the sake of having consistent type definitions.\n * @exports NamespaceBase\n * @extends ReflectionObject\n * @abstract\n * @constructor\n * @param {string} name Namespace name\n * @param {Object.<string,*>} [options] Declared options\n * @see {@link Namespace}\n */\nfunction Namespace(name, options) {\n ReflectionObject.call(this, name, options);\n\n /**\n * Nested objects by name.\n * @type {Object.<string,ReflectionObject>|undefined}\n */\n this.nested = undefined; // toJSON\n\n /**\n * Cached nested objects as an array.\n * @type {ReflectionObject[]|null}\n * @private\n */\n this._nestedArray = null;\n\n /**\n * Cache lookup calls for any objects contains anywhere under this namespace.\n * This drastically speeds up resolve for large cross-linked protos where the same\n * types are looked up repeatedly.\n * @type {Object.<string,ReflectionObject|null>}\n * @private\n */\n this._lookupCache = {};\n\n /**\n * Whether or not objects contained in this namespace need feature resolution.\n * @type {boolean}\n * @protected\n */\n this._needsRecursiveFeatureResolution = true;\n\n /**\n * Whether or not objects contained in this namespace need a resolve.\n * @type {boolean}\n * @protected\n */\n this._needsRecursiveResolve = true;\n}\n\nfunction clearCache(namespace) {\n namespace._nestedArray = null;\n namespace._lookupCache = {};\n\n // Also clear parent caches, since they include nested lookups.\n var parent = namespace;\n while(parent = parent.parent) {\n parent._lookupCache = {};\n }\n return namespace;\n}\n\n/**\n * Nested objects of this namespace as an array for iteration.\n * @name NamespaceBase#nestedArray\n * @type {ReflectionObject[]}\n * @readonly\n */\nObject.defineProperty(Namespace.prototype, \"nestedArray\", {\n get: function() {\n return this._nestedArray || (this._nestedArray = util.toArray(this.nested));\n }\n});\n\n/**\n * Namespace descriptor.\n * @interface INamespace\n * @property {Object.<string,*>} [options] Namespace options\n * @property {Object.<string,AnyNestedObject>} [nested] Nested object descriptors\n */\n\n/**\n * Any extension field descriptor.\n * @typedef AnyExtensionField\n * @type {IExtensionField|IExtensionMapField}\n */\n\n/**\n * Any nested object descriptor.\n * @typedef AnyNestedObject\n * @type {IEnum|IType|IService|AnyExtensionField|INamespace|IOneOf}\n */\n\n/**\n * Converts this namespace to a namespace descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {INamespace} Namespace descriptor\n */\nNamespace.prototype.toJSON = function toJSON(toJSONOptions) {\n return util.toObject([\n \"options\" , this.options,\n \"nested\" , arrayToJSON(this.nestedArray, toJSONOptions)\n ]);\n};\n\n/**\n * Adds nested objects to this namespace from nested object descriptors.\n * @param {Object.<string,AnyNestedObject>} nestedJson Any nested object descriptors\n * @returns {Namespace} `this`\n */\nNamespace.prototype.addJSON = function addJSON(nestedJson) {\n var ns = this;\n /* istanbul ignore else */\n if (nestedJson) {\n for (var names = Object.keys(nestedJson), i = 0, nested; i < names.length; ++i) {\n nested = nestedJson[names[i]];\n ns.add( // most to least likely\n ( nested.fields !== undefined\n ? Type.fromJSON\n : nested.values !== undefined\n ? Enum.fromJSON\n : nested.methods !== undefined\n ? Service.fromJSON\n : nested.id !== undefined\n ? Field.fromJSON\n : Namespace.fromJSON )(names[i], nested)\n );\n }\n }\n return this;\n};\n\n/**\n * Gets the nested object of the specified name.\n * @param {string} name Nested object name\n * @returns {ReflectionObject|null} The reflection object or `null` if it doesn't exist\n */\nNamespace.prototype.get = function get(name) {\n return this.nested && this.nested[name]\n || null;\n};\n\n/**\n * Gets the values of the nested {@link Enum|enum} of the specified name.\n * This methods differs from {@link Namespace#get|get} in that it returns an enum's values directly and throws instead of returning `null`.\n * @param {string} name Nested enum name\n * @returns {Object.<string,number>} Enum values\n * @throws {Error} If there is no such enum\n */\nNamespace.prototype.getEnum = function getEnum(name) {\n if (this.nested && this.nested[name] instanceof Enum)\n return this.nested[name].values;\n throw Error(\"no such enum: \" + name);\n};\n\n/**\n * Adds a nested object to this namespace.\n * @param {ReflectionObject} object Nested object to add\n * @returns {Namespace} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If there is already a nested object with this name\n */\nNamespace.prototype.add = function add(object) {\n\n if (!(object instanceof Field && object.extend !== undefined || object instanceof Type || object instanceof OneOf || object instanceof Enum || object instanceof Service || object instanceof Namespace))\n throw TypeError(\"object must be a valid nested object\");\n\n if (!this.nested)\n this.nested = {};\n else {\n var prev = this.get(object.name);\n if (prev) {\n if (prev instanceof Namespace && object instanceof Namespace && !(prev instanceof Type || prev instanceof Service)) {\n // replace plain namespace but keep existing nested elements and options\n var nested = prev.nestedArray;\n for (var i = 0; i < nested.length; ++i)\n object.add(nested[i]);\n this.remove(prev);\n if (!this.nested)\n this.nested = {};\n object.setOptions(prev.options, true);\n\n } else\n throw Error(\"duplicate name '\" + object.name + \"' in \" + this);\n }\n }\n this.nested[object.name] = object;\n\n if (!(this instanceof Type || this instanceof Service || this instanceof Enum || this instanceof Field)) {\n // This is a package or a root namespace.\n if (!object._edition) {\n // Make sure that some edition is set if it hasn't already been specified.\n object._edition = object._defaultEdition;\n }\n }\n\n this._needsRecursiveFeatureResolution = true;\n this._needsRecursiveResolve = true;\n\n // Also clear parent caches, since they need to recurse down.\n var parent = this;\n while(parent = parent.parent) {\n parent._needsRecursiveFeatureResolution = true;\n parent._needsRecursiveResolve = true;\n }\n\n object.onAdd(this);\n return clearCache(this);\n};\n\n/**\n * Removes a nested object from this namespace.\n * @param {ReflectionObject} object Nested object to remove\n * @returns {Namespace} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If `object` is not a member of this namespace\n */\nNamespace.prototype.remove = function remove(object) {\n\n if (!(object instanceof ReflectionObject))\n throw TypeError(\"object must be a ReflectionObject\");\n if (object.parent !== this)\n throw Error(object + \" is not a member of \" + this);\n\n delete this.nested[object.name];\n if (!Object.keys(this.nested).length)\n this.nested = undefined;\n\n object.onRemove(this);\n return clearCache(this);\n};\n\n/**\n * Defines additial namespaces within this one if not yet existing.\n * @param {string|string[]} path Path to create\n * @param {*} [json] Nested types to create from JSON\n * @returns {Namespace} Pointer to the last namespace created or `this` if path is empty\n */\nNamespace.prototype.define = function define(path, json) {\n\n if (util.isString(path))\n path = path.split(\".\");\n else if (!Array.isArray(path))\n throw TypeError(\"illegal path\");\n if (path && path.length && path[0] === \"\")\n throw Error(\"path must be relative\");\n\n var ptr = this;\n while (path.length > 0) {\n var part = path.shift();\n if (ptr.nested && ptr.nested[part]) {\n ptr = ptr.nested[part];\n if (!(ptr instanceof Namespace))\n throw Error(\"path conflicts with non-namespace objects\");\n } else\n ptr.add(ptr = new Namespace(part));\n }\n if (json)\n ptr.addJSON(json);\n return ptr;\n};\n\n/**\n * Resolves this namespace's and all its nested objects' type references. Useful to validate a reflection tree, but comes at a cost.\n * @returns {Namespace} `this`\n */\nNamespace.prototype.resolveAll = function resolveAll() {\n if (!this._needsRecursiveResolve) return this;\n\n this._resolveFeaturesRecursive(this._edition);\n\n var nested = this.nestedArray, i = 0;\n this.resolve();\n while (i < nested.length)\n if (nested[i] instanceof Namespace)\n nested[i++].resolveAll();\n else\n nested[i++].resolve();\n this._needsRecursiveResolve = false;\n return this;\n};\n\n/**\n * @override\n */\nNamespace.prototype._resolveFeaturesRecursive = function _resolveFeaturesRecursive(edition) {\n if (!this._needsRecursiveFeatureResolution) return this;\n this._needsRecursiveFeatureResolution = false;\n\n edition = this._edition || edition;\n\n ReflectionObject.prototype._resolveFeaturesRecursive.call(this, edition);\n this.nestedArray.forEach(nested => {\n nested._resolveFeaturesRecursive(edition);\n });\n return this;\n};\n\n/**\n * Recursively looks up the reflection object matching the specified path in the scope of this namespace.\n * @param {string|string[]} path Path to look up\n * @param {*|Array.<*>} filterTypes Filter types, any combination of the constructors of `protobuf.Type`, `protobuf.Enum`, `protobuf.Service` etc.\n * @param {boolean} [parentAlreadyChecked=false] If known, whether the parent has already been checked\n * @returns {ReflectionObject|null} Looked up object or `null` if none could be found\n */\nNamespace.prototype.lookup = function lookup(path, filterTypes, parentAlreadyChecked) {\n /* istanbul ignore next */\n if (typeof filterTypes === \"boolean\") {\n parentAlreadyChecked = filterTypes;\n filterTypes = undefined;\n } else if (filterTypes && !Array.isArray(filterTypes))\n filterTypes = [ filterTypes ];\n\n if (util.isString(path) && path.length) {\n if (path === \".\")\n return this.root;\n path = path.split(\".\");\n } else if (!path.length)\n return this;\n\n var flatPath = path.join(\".\");\n\n // Start at root if path is absolute\n if (path[0] === \"\")\n return this.root.lookup(path.slice(1), filterTypes);\n\n // Early bailout for objects with matching absolute paths\n var found = this.root._fullyQualifiedObjects && this.root._fullyQualifiedObjects[\".\" + flatPath];\n if (found && (!filterTypes || filterTypes.indexOf(found.constructor) > -1)) {\n return found;\n }\n\n // Do a regular lookup at this namespace and below\n found = this._lookupImpl(path, flatPath);\n if (found && (!filterTypes || filterTypes.indexOf(found.constructor) > -1)) {\n return found;\n }\n\n if (parentAlreadyChecked)\n return null;\n\n // If there hasn't been a match, walk up the tree and look more broadly\n var current = this;\n while (current.parent) {\n found = current.parent._lookupImpl(path, flatPath);\n if (found && (!filterTypes || filterTypes.indexOf(found.constructor) > -1)) {\n return found;\n }\n current = current.parent;\n }\n return null;\n};\n\n/**\n * Internal helper for lookup that handles searching just at this namespace and below along with caching.\n * @param {string[]} path Path to look up\n * @param {string} flatPath Flattened version of the path to use as a cache key\n * @returns {ReflectionObject|null} Looked up object or `null` if none could be found\n * @private\n */\nNamespace.prototype._lookupImpl = function lookup(path, flatPath) {\n if(Object.prototype.hasOwnProperty.call(this._lookupCache, flatPath)) {\n return this._lookupCache[flatPath];\n }\n\n // Test if the first part matches any nested object, and if so, traverse if path contains more\n var found = this.get(path[0]);\n var exact = null;\n if (found) {\n if (path.length === 1) {\n exact = found;\n } else if (found instanceof Namespace) {\n path = path.slice(1);\n exact = found._lookupImpl(path, path.join(\".\"));\n }\n\n // Otherwise try each nested namespace\n } else {\n for (var i = 0; i < this.nestedArray.length; ++i)\n if (this._nestedArray[i] instanceof Namespace && (found = this._nestedArray[i]._lookupImpl(path, flatPath)))\n exact = found;\n }\n\n // Set this even when null, so that when we walk up the tree we can quickly bail on repeated checks back down.\n this._lookupCache[flatPath] = exact;\n return exact;\n};\n\n/**\n * Looks up the reflection object at the specified path, relative to this namespace.\n * @name NamespaceBase#lookup\n * @function\n * @param {string|string[]} path Path to look up\n * @param {boolean} [parentAlreadyChecked=false] Whether the parent has already been checked\n * @returns {ReflectionObject|null} Looked up object or `null` if none could be found\n * @variation 2\n */\n// lookup(path: string, [parentAlreadyChecked: boolean])\n\n/**\n * Looks up the {@link Type|type} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Type} Looked up type\n * @throws {Error} If `path` does not point to a type\n */\nNamespace.prototype.lookupType = function lookupType(path) {\n var found = this.lookup(path, [ Type ]);\n if (!found)\n throw Error(\"no such type: \" + path);\n return found;\n};\n\n/**\n * Looks up the values of the {@link Enum|enum} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Enum} Looked up enum\n * @throws {Error} If `path` does not point to an enum\n */\nNamespace.prototype.lookupEnum = function lookupEnum(path) {\n var found = this.lookup(path, [ Enum ]);\n if (!found)\n throw Error(\"no such Enum '\" + path + \"' in \" + this);\n return found;\n};\n\n/**\n * Looks up the {@link Type|type} or {@link Enum|enum} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Type} Looked up type or enum\n * @throws {Error} If `path` does not point to a type or enum\n */\nNamespace.prototype.lookupTypeOrEnum = function lookupTypeOrEnum(path) {\n var found = this.lookup(path, [ Type, Enum ]);\n if (!found)\n throw Error(\"no such Type or Enum '\" + path + \"' in \" + this);\n return found;\n};\n\n/**\n * Looks up the {@link Service|service} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Service} Looked up service\n * @throws {Error} If `path` does not point to a service\n */\nNamespace.prototype.lookupService = function lookupService(path) {\n var found = this.lookup(path, [ Service ]);\n if (!found)\n throw Error(\"no such Service '\" + path + \"' in \" + this);\n return found;\n};\n\n// Sets up cyclic dependencies (called in index-light)\nNamespace._configure = function(Type_, Service_, Enum_) {\n Type = Type_;\n Service = Service_;\n Enum = Enum_;\n};\n",
26
+ "\"use strict\";\nmodule.exports = MapField;\n\n// extends Field\nvar Field = require(\"./field\");\n((MapField.prototype = Object.create(Field.prototype)).constructor = MapField).className = \"MapField\";\n\nvar types = require(\"./types\"),\n util = require(\"./util\");\n\n/**\n * Constructs a new map field instance.\n * @classdesc Reflected map field.\n * @extends FieldBase\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {number} id Unique id within its namespace\n * @param {string} keyType Key type\n * @param {string} type Value type\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] Comment associated with this field\n */\nfunction MapField(name, id, keyType, type, options, comment) {\n Field.call(this, name, id, type, undefined, undefined, options, comment);\n\n /* istanbul ignore if */\n if (!util.isString(keyType))\n throw TypeError(\"keyType must be a string\");\n\n /**\n * Key type.\n * @type {string}\n */\n this.keyType = keyType; // toJSON, marker\n\n /**\n * Resolved key type if not a basic type.\n * @type {ReflectionObject|null}\n */\n this.resolvedKeyType = null;\n\n // Overrides Field#map\n this.map = true;\n}\n\n/**\n * Map field descriptor.\n * @interface IMapField\n * @extends {IField}\n * @property {string} keyType Key type\n */\n\n/**\n * Extension map field descriptor.\n * @interface IExtensionMapField\n * @extends IMapField\n * @property {string} extend Extended type\n */\n\n/**\n * Constructs a map field from a map field descriptor.\n * @param {string} name Field name\n * @param {IMapField} json Map field descriptor\n * @returns {MapField} Created map field\n * @throws {TypeError} If arguments are invalid\n */\nMapField.fromJSON = function fromJSON(name, json) {\n return new MapField(name, json.id, json.keyType, json.type, json.options, json.comment);\n};\n\n/**\n * Converts this map field to a map field descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IMapField} Map field descriptor\n */\nMapField.prototype.toJSON = function toJSON(toJSONOptions) {\n var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n return util.toObject([\n \"keyType\" , this.keyType,\n \"type\" , this.type,\n \"id\" , this.id,\n \"extend\" , this.extend,\n \"options\" , this.options,\n \"comment\" , keepComments ? this.comment : undefined\n ]);\n};\n\n/**\n * @override\n */\nMapField.prototype.resolve = function resolve() {\n if (this.resolved)\n return this;\n\n // Besides a value type, map fields have a key type that may be \"any scalar type except for floating point types and bytes\"\n if (types.mapKey[this.keyType] === undefined)\n throw Error(\"invalid key type: \" + this.keyType);\n\n return Field.prototype.resolve.call(this);\n};\n\n/**\n * Map field decorator (TypeScript).\n * @name MapField.d\n * @function\n * @param {number} fieldId Field id\n * @param {\"int32\"|\"uint32\"|\"sint32\"|\"fixed32\"|\"sfixed32\"|\"int64\"|\"uint64\"|\"sint64\"|\"fixed64\"|\"sfixed64\"|\"bool\"|\"string\"} fieldKeyType Field key type\n * @param {\"double\"|\"float\"|\"int32\"|\"uint32\"|\"sint32\"|\"fixed32\"|\"sfixed32\"|\"int64\"|\"uint64\"|\"sint64\"|\"fixed64\"|\"sfixed64\"|\"bool\"|\"string\"|\"bytes\"|Object|Constructor<{}>} fieldValueType Field value type\n * @returns {FieldDecorator} Decorator function\n * @template T extends { [key: string]: number | Long | string | boolean | Uint8Array | Buffer | number[] | Message<{}> }\n */\nMapField.d = function decorateMapField(fieldId, fieldKeyType, fieldValueType) {\n\n // submessage value: decorate the submessage and use its name as the type\n if (typeof fieldValueType === \"function\")\n fieldValueType = util.decorateType(fieldValueType).name;\n\n // enum reference value: create a reflected copy of the enum and keep reuseing it\n else if (fieldValueType && typeof fieldValueType === \"object\")\n fieldValueType = util.decorateEnum(fieldValueType).name;\n\n return function mapFieldDecorator(prototype, fieldName) {\n util.decorateType(prototype.constructor)\n .add(new MapField(fieldName, fieldId, fieldKeyType, fieldValueType));\n };\n};\n",
27
+ "\"use strict\";\nmodule.exports = Method;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\n((Method.prototype = Object.create(ReflectionObject.prototype)).constructor = Method).className = \"Method\";\n\nvar util = require(\"./util\");\n\n/**\n * Constructs a new service method instance.\n * @classdesc Reflected service method.\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Method name\n * @param {string|undefined} type Method type, usually `\"rpc\"`\n * @param {string} requestType Request message type\n * @param {string} responseType Response message type\n * @param {boolean|Object.<string,*>} [requestStream] Whether the request is streamed\n * @param {boolean|Object.<string,*>} [responseStream] Whether the response is streamed\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] The comment for this method\n * @param {Object.<string,*>} [parsedOptions] Declared options, properly parsed into an object\n */\nfunction Method(name, type, requestType, responseType, requestStream, responseStream, options, comment, parsedOptions) {\n\n /* istanbul ignore next */\n if (util.isObject(requestStream)) {\n options = requestStream;\n requestStream = responseStream = undefined;\n } else if (util.isObject(responseStream)) {\n options = responseStream;\n responseStream = undefined;\n }\n\n /* istanbul ignore if */\n if (!(type === undefined || util.isString(type)))\n throw TypeError(\"type must be a string\");\n\n /* istanbul ignore if */\n if (!util.isString(requestType))\n throw TypeError(\"requestType must be a string\");\n\n /* istanbul ignore if */\n if (!util.isString(responseType))\n throw TypeError(\"responseType must be a string\");\n\n ReflectionObject.call(this, name, options);\n\n /**\n * Method type.\n * @type {string}\n */\n this.type = type || \"rpc\"; // toJSON\n\n /**\n * Request type.\n * @type {string}\n */\n this.requestType = requestType; // toJSON, marker\n\n /**\n * Whether requests are streamed or not.\n * @type {boolean|undefined}\n */\n this.requestStream = requestStream ? true : undefined; // toJSON\n\n /**\n * Response type.\n * @type {string}\n */\n this.responseType = responseType; // toJSON\n\n /**\n * Whether responses are streamed or not.\n * @type {boolean|undefined}\n */\n this.responseStream = responseStream ? true : undefined; // toJSON\n\n /**\n * Resolved request type.\n * @type {Type|null}\n */\n this.resolvedRequestType = null;\n\n /**\n * Resolved response type.\n * @type {Type|null}\n */\n this.resolvedResponseType = null;\n\n /**\n * Comment for this method\n * @type {string|null}\n */\n this.comment = comment;\n\n /**\n * Options properly parsed into an object\n */\n this.parsedOptions = parsedOptions;\n}\n\n/**\n * Method descriptor.\n * @interface IMethod\n * @property {string} [type=\"rpc\"] Method type\n * @property {string} requestType Request type\n * @property {string} responseType Response type\n * @property {boolean} [requestStream=false] Whether requests are streamed\n * @property {boolean} [responseStream=false] Whether responses are streamed\n * @property {Object.<string,*>} [options] Method options\n * @property {string} comment Method comments\n * @property {Object.<string,*>} [parsedOptions] Method options properly parsed into an object\n */\n\n/**\n * Constructs a method from a method descriptor.\n * @param {string} name Method name\n * @param {IMethod} json Method descriptor\n * @returns {Method} Created method\n * @throws {TypeError} If arguments are invalid\n */\nMethod.fromJSON = function fromJSON(name, json) {\n return new Method(name, json.type, json.requestType, json.responseType, json.requestStream, json.responseStream, json.options, json.comment, json.parsedOptions);\n};\n\n/**\n * Converts this method to a method descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IMethod} Method descriptor\n */\nMethod.prototype.toJSON = function toJSON(toJSONOptions) {\n var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n return util.toObject([\n \"type\" , this.type !== \"rpc\" && /* istanbul ignore next */ this.type || undefined,\n \"requestType\" , this.requestType,\n \"requestStream\" , this.requestStream,\n \"responseType\" , this.responseType,\n \"responseStream\" , this.responseStream,\n \"options\" , this.options,\n \"comment\" , keepComments ? this.comment : undefined,\n \"parsedOptions\" , this.parsedOptions,\n ]);\n};\n\n/**\n * @override\n */\nMethod.prototype.resolve = function resolve() {\n\n /* istanbul ignore if */\n if (this.resolved)\n return this;\n\n this.resolvedRequestType = this.parent.lookupType(this.requestType);\n this.resolvedResponseType = this.parent.lookupType(this.responseType);\n\n return ReflectionObject.prototype.resolve.call(this);\n};\n",
28
+ "\"use strict\";\nmodule.exports = Service;\n\n// extends Namespace\nvar Namespace = require(\"./namespace\");\n((Service.prototype = Object.create(Namespace.prototype)).constructor = Service).className = \"Service\";\n\nvar Method = require(\"./method\"),\n util = require(\"./util\"),\n rpc = require(\"./rpc\");\n\n/**\n * Constructs a new service instance.\n * @classdesc Reflected service.\n * @extends NamespaceBase\n * @constructor\n * @param {string} name Service name\n * @param {Object.<string,*>} [options] Service options\n * @throws {TypeError} If arguments are invalid\n */\nfunction Service(name, options) {\n Namespace.call(this, name, options);\n\n /**\n * Service methods.\n * @type {Object.<string,Method>}\n */\n this.methods = {}; // toJSON, marker\n\n /**\n * Cached methods as an array.\n * @type {Method[]|null}\n * @private\n */\n this._methodsArray = null;\n}\n\n/**\n * Service descriptor.\n * @interface IService\n * @extends INamespace\n * @property {Object.<string,IMethod>} methods Method descriptors\n */\n\n/**\n * Constructs a service from a service descriptor.\n * @param {string} name Service name\n * @param {IService} json Service descriptor\n * @returns {Service} Created service\n * @throws {TypeError} If arguments are invalid\n */\nService.fromJSON = function fromJSON(name, json) {\n var service = new Service(name, json.options);\n /* istanbul ignore else */\n if (json.methods)\n for (var names = Object.keys(json.methods), i = 0; i < names.length; ++i)\n service.add(Method.fromJSON(names[i], json.methods[names[i]]));\n if (json.nested)\n service.addJSON(json.nested);\n if (json.edition)\n service._edition = json.edition;\n service.comment = json.comment;\n service._defaultEdition = \"proto3\"; // For backwards-compatibility.\n return service;\n};\n\n/**\n * Converts this service to a service descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IService} Service descriptor\n */\nService.prototype.toJSON = function toJSON(toJSONOptions) {\n var inherited = Namespace.prototype.toJSON.call(this, toJSONOptions);\n var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n return util.toObject([\n \"edition\" , this._editionToJSON(),\n \"options\" , inherited && inherited.options || undefined,\n \"methods\" , Namespace.arrayToJSON(this.methodsArray, toJSONOptions) || /* istanbul ignore next */ {},\n \"nested\" , inherited && inherited.nested || undefined,\n \"comment\" , keepComments ? this.comment : undefined\n ]);\n};\n\n/**\n * Methods of this service as an array for iteration.\n * @name Service#methodsArray\n * @type {Method[]}\n * @readonly\n */\nObject.defineProperty(Service.prototype, \"methodsArray\", {\n get: function() {\n return this._methodsArray || (this._methodsArray = util.toArray(this.methods));\n }\n});\n\nfunction clearCache(service) {\n service._methodsArray = null;\n return service;\n}\n\n/**\n * @override\n */\nService.prototype.get = function get(name) {\n return this.methods[name]\n || Namespace.prototype.get.call(this, name);\n};\n\n/**\n * @override\n */\nService.prototype.resolveAll = function resolveAll() {\n if (!this._needsRecursiveResolve) return this;\n\n Namespace.prototype.resolve.call(this);\n var methods = this.methodsArray;\n for (var i = 0; i < methods.length; ++i)\n methods[i].resolve();\n return this;\n};\n\n/**\n * @override\n */\nService.prototype._resolveFeaturesRecursive = function _resolveFeaturesRecursive(edition) {\n if (!this._needsRecursiveFeatureResolution) return this;\n\n edition = this._edition || edition;\n\n Namespace.prototype._resolveFeaturesRecursive.call(this, edition);\n this.methodsArray.forEach(method => {\n method._resolveFeaturesRecursive(edition);\n });\n return this;\n};\n\n/**\n * @override\n */\nService.prototype.add = function add(object) {\n\n /* istanbul ignore if */\n if (this.get(object.name))\n throw Error(\"duplicate name '\" + object.name + \"' in \" + this);\n\n if (object instanceof Method) {\n this.methods[object.name] = object;\n object.parent = this;\n return clearCache(this);\n }\n return Namespace.prototype.add.call(this, object);\n};\n\n/**\n * @override\n */\nService.prototype.remove = function remove(object) {\n if (object instanceof Method) {\n\n /* istanbul ignore if */\n if (this.methods[object.name] !== object)\n throw Error(object + \" is not a member of \" + this);\n\n delete this.methods[object.name];\n object.parent = null;\n return clearCache(this);\n }\n return Namespace.prototype.remove.call(this, object);\n};\n\n/**\n * Creates a runtime service using the specified rpc implementation.\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n * @returns {rpc.Service} RPC service. Useful where requests and/or responses are streamed.\n */\nService.prototype.create = function create(rpcImpl, requestDelimited, responseDelimited) {\n var rpcService = new rpc.Service(rpcImpl, requestDelimited, responseDelimited);\n for (var i = 0, method; i < /* initializes */ this.methodsArray.length; ++i) {\n var methodName = util.lcFirst((method = this._methodsArray[i]).resolve().name).replace(/[^$\\w_]/g, \"\");\n rpcService[methodName] = util.codegen([\"r\",\"c\"], util.isReserved(methodName) ? methodName + \"_\" : methodName)(\"return this.rpcCall(m,q,s,r,c)\")({\n m: method,\n q: method.resolvedRequestType.ctor,\n s: method.resolvedResponseType.ctor\n });\n }\n return rpcService;\n};\n",
29
+ "\"use strict\";\nmodule.exports = Message;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new message instance.\n * @classdesc Abstract runtime message.\n * @constructor\n * @param {Properties<T>} [properties] Properties to set\n * @template T extends object = object\n */\nfunction Message(properties) {\n // not used internally\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n this[keys[i]] = properties[keys[i]];\n}\n\n/**\n * Reference to the reflected type.\n * @name Message.$type\n * @type {Type}\n * @readonly\n */\n\n/**\n * Reference to the reflected type.\n * @name Message#$type\n * @type {Type}\n * @readonly\n */\n\n/*eslint-disable valid-jsdoc*/\n\n/**\n * Creates a new message of this type using the specified properties.\n * @param {Object.<string,*>} [properties] Properties to set\n * @returns {Message<T>} Message instance\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.create = function create(properties) {\n return this.$type.create(properties);\n};\n\n/**\n * Encodes a message of this type.\n * @param {T|Object.<string,*>} message Message to encode\n * @param {Writer} [writer] Writer to use\n * @returns {Writer} Writer\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.encode = function encode(message, writer) {\n return this.$type.encode(message, writer);\n};\n\n/**\n * Encodes a message of this type preceeded by its length as a varint.\n * @param {T|Object.<string,*>} message Message to encode\n * @param {Writer} [writer] Writer to use\n * @returns {Writer} Writer\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.encodeDelimited = function encodeDelimited(message, writer) {\n return this.$type.encodeDelimited(message, writer);\n};\n\n/**\n * Decodes a message of this type.\n * @name Message.decode\n * @function\n * @param {Reader|Uint8Array} reader Reader or buffer to decode\n * @returns {T} Decoded message\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.decode = function decode(reader) {\n return this.$type.decode(reader);\n};\n\n/**\n * Decodes a message of this type preceeded by its length as a varint.\n * @name Message.decodeDelimited\n * @function\n * @param {Reader|Uint8Array} reader Reader or buffer to decode\n * @returns {T} Decoded message\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.decodeDelimited = function decodeDelimited(reader) {\n return this.$type.decodeDelimited(reader);\n};\n\n/**\n * Verifies a message of this type.\n * @name Message.verify\n * @function\n * @param {Object.<string,*>} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\nMessage.verify = function verify(message) {\n return this.$type.verify(message);\n};\n\n/**\n * Creates a new message of this type from a plain object. Also converts values to their respective internal types.\n * @param {Object.<string,*>} object Plain object\n * @returns {T} Message instance\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.fromObject = function fromObject(object) {\n return this.$type.fromObject(object);\n};\n\n/**\n * Creates a plain object from a message of this type. Also converts values to other types if specified.\n * @param {T} message Message instance\n * @param {IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.toObject = function toObject(message, options) {\n return this.$type.toObject(message, options);\n};\n\n/**\n * Converts this message to JSON.\n * @returns {Object.<string,*>} JSON object\n */\nMessage.prototype.toJSON = function toJSON() {\n return this.$type.toObject(this, util.toJSONOptions);\n};\n\n/*eslint-enable valid-jsdoc*/",
30
+ "\"use strict\";\nmodule.exports = decoder;\n\nvar Enum = require(\"./enum\"),\n types = require(\"./types\"),\n util = require(\"./util\");\n\nfunction missing(field) {\n return \"missing required '\" + field.name + \"'\";\n}\n\n/**\n * Generates a decoder specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nfunction decoder(mtype) {\n /* eslint-disable no-unexpected-multiline */\n var gen = util.codegen([\"r\", \"l\", \"e\"], mtype.name + \"$decode\")\n (\"if(!(r instanceof Reader))\")\n (\"r=Reader.create(r)\")\n (\"var c=l===undefined?r.len:r.pos+l,m=new this.ctor\" + (mtype.fieldsArray.filter(function(field) { return field.map; }).length ? \",k,value\" : \"\"))\n (\"while(r.pos<c){\")\n (\"var t=r.uint32()\")\n (\"if(t===e)\")\n (\"break\")\n (\"switch(t>>>3){\");\n\n var i = 0;\n for (; i < /* initializes */ mtype.fieldsArray.length; ++i) {\n var field = mtype._fieldsArray[i].resolve(),\n type = field.resolvedType instanceof Enum ? \"int32\" : field.type,\n ref = \"m\" + util.safeProp(field.name); gen\n (\"case %i: {\", field.id);\n\n // Map fields\n if (field.map) { gen\n (\"if(%s===util.emptyObject)\", ref)\n (\"%s={}\", ref)\n (\"var c2 = r.uint32()+r.pos\");\n\n if (types.defaults[field.keyType] !== undefined) gen\n (\"k=%j\", types.defaults[field.keyType]);\n else gen\n (\"k=null\");\n\n if (types.defaults[type] !== undefined) gen\n (\"value=%j\", types.defaults[type]);\n else gen\n (\"value=null\");\n\n gen\n (\"while(r.pos<c2){\")\n (\"var tag2=r.uint32()\")\n (\"switch(tag2>>>3){\")\n (\"case 1: k=r.%s(); break\", field.keyType)\n (\"case 2:\");\n\n if (types.basic[type] === undefined) gen\n (\"value=types[%i].decode(r,r.uint32())\", i); // can't be groups\n else gen\n (\"value=r.%s()\", type);\n\n gen\n (\"break\")\n (\"default:\")\n (\"r.skipType(tag2&7)\")\n (\"break\")\n (\"}\")\n (\"}\");\n\n if (types.long[field.keyType] !== undefined) gen\n (\"%s[typeof k===\\\"object\\\"?util.longToHash(k):k]=value\", ref);\n else gen\n (\"%s[k]=value\", ref);\n\n // Repeated fields\n } else if (field.repeated) { gen\n\n (\"if(!(%s&&%s.length))\", ref, ref)\n (\"%s=[]\", ref);\n\n // Packable (always check for forward and backward compatiblity)\n if (types.packed[type] !== undefined) gen\n (\"if((t&7)===2){\")\n (\"var c2=r.uint32()+r.pos\")\n (\"while(r.pos<c2)\")\n (\"%s.push(r.%s())\", ref, type)\n (\"}else\");\n\n // Non-packed\n if (types.basic[type] === undefined) gen(field.delimited\n ? \"%s.push(types[%i].decode(r,undefined,((t&~7)|4)))\"\n : \"%s.push(types[%i].decode(r,r.uint32()))\", ref, i);\n else gen\n (\"%s.push(r.%s())\", ref, type);\n\n // Non-repeated\n } else if (types.basic[type] === undefined) gen(field.delimited\n ? \"%s=types[%i].decode(r,undefined,((t&~7)|4))\"\n : \"%s=types[%i].decode(r,r.uint32())\", ref, i);\n else gen\n (\"%s=r.%s()\", ref, type);\n gen\n (\"break\")\n (\"}\");\n // Unknown fields\n } gen\n (\"default:\")\n (\"r.skipType(t&7)\")\n (\"break\")\n\n (\"}\")\n (\"}\");\n\n // Field presence\n for (i = 0; i < mtype._fieldsArray.length; ++i) {\n var rfield = mtype._fieldsArray[i];\n if (rfield.required) gen\n (\"if(!m.hasOwnProperty(%j))\", rfield.name)\n (\"throw util.ProtocolError(%j,{instance:m})\", missing(rfield));\n }\n\n return gen\n (\"return m\");\n /* eslint-enable no-unexpected-multiline */\n}\n",
31
+ "\"use strict\";\nmodule.exports = verifier;\n\nvar Enum = require(\"./enum\"),\n util = require(\"./util\");\n\nfunction invalid(field, expected) {\n return field.name + \": \" + expected + (field.repeated && expected !== \"array\" ? \"[]\" : field.map && expected !== \"object\" ? \"{k:\"+field.keyType+\"}\" : \"\") + \" expected\";\n}\n\n/**\n * Generates a partial value verifier.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {number} fieldIndex Field index\n * @param {string} ref Variable reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genVerifyValue(gen, field, fieldIndex, ref) {\n /* eslint-disable no-unexpected-multiline */\n if (field.resolvedType) {\n if (field.resolvedType instanceof Enum) { gen\n (\"switch(%s){\", ref)\n (\"default:\")\n (\"return%j\", invalid(field, \"enum value\"));\n for (var keys = Object.keys(field.resolvedType.values), j = 0; j < keys.length; ++j) gen\n (\"case %i:\", field.resolvedType.values[keys[j]]);\n gen\n (\"break\")\n (\"}\");\n } else {\n gen\n (\"{\")\n (\"var e=types[%i].verify(%s);\", fieldIndex, ref)\n (\"if(e)\")\n (\"return%j+e\", field.name + \".\")\n (\"}\");\n }\n } else {\n switch (field.type) {\n case \"int32\":\n case \"uint32\":\n case \"sint32\":\n case \"fixed32\":\n case \"sfixed32\": gen\n (\"if(!util.isInteger(%s))\", ref)\n (\"return%j\", invalid(field, \"integer\"));\n break;\n case \"int64\":\n case \"uint64\":\n case \"sint64\":\n case \"fixed64\":\n case \"sfixed64\": gen\n (\"if(!util.isInteger(%s)&&!(%s&&util.isInteger(%s.low)&&util.isInteger(%s.high)))\", ref, ref, ref, ref)\n (\"return%j\", invalid(field, \"integer|Long\"));\n break;\n case \"float\":\n case \"double\": gen\n (\"if(typeof %s!==\\\"number\\\")\", ref)\n (\"return%j\", invalid(field, \"number\"));\n break;\n case \"bool\": gen\n (\"if(typeof %s!==\\\"boolean\\\")\", ref)\n (\"return%j\", invalid(field, \"boolean\"));\n break;\n case \"string\": gen\n (\"if(!util.isString(%s))\", ref)\n (\"return%j\", invalid(field, \"string\"));\n break;\n case \"bytes\": gen\n (\"if(!(%s&&typeof %s.length===\\\"number\\\"||util.isString(%s)))\", ref, ref, ref)\n (\"return%j\", invalid(field, \"buffer\"));\n break;\n }\n }\n return gen;\n /* eslint-enable no-unexpected-multiline */\n}\n\n/**\n * Generates a partial key verifier.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {string} ref Variable reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genVerifyKey(gen, field, ref) {\n /* eslint-disable no-unexpected-multiline */\n switch (field.keyType) {\n case \"int32\":\n case \"uint32\":\n case \"sint32\":\n case \"fixed32\":\n case \"sfixed32\": gen\n (\"if(!util.key32Re.test(%s))\", ref)\n (\"return%j\", invalid(field, \"integer key\"));\n break;\n case \"int64\":\n case \"uint64\":\n case \"sint64\":\n case \"fixed64\":\n case \"sfixed64\": gen\n (\"if(!util.key64Re.test(%s))\", ref) // see comment above: x is ok, d is not\n (\"return%j\", invalid(field, \"integer|Long key\"));\n break;\n case \"bool\": gen\n (\"if(!util.key2Re.test(%s))\", ref)\n (\"return%j\", invalid(field, \"boolean key\"));\n break;\n }\n return gen;\n /* eslint-enable no-unexpected-multiline */\n}\n\n/**\n * Generates a verifier specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nfunction verifier(mtype) {\n /* eslint-disable no-unexpected-multiline */\n\n var gen = util.codegen([\"m\"], mtype.name + \"$verify\")\n (\"if(typeof m!==\\\"object\\\"||m===null)\")\n (\"return%j\", \"object expected\");\n var oneofs = mtype.oneofsArray,\n seenFirstField = {};\n if (oneofs.length) gen\n (\"var p={}\");\n\n for (var i = 0; i < /* initializes */ mtype.fieldsArray.length; ++i) {\n var field = mtype._fieldsArray[i].resolve(),\n ref = \"m\" + util.safeProp(field.name);\n\n if (field.optional) gen\n (\"if(%s!=null&&m.hasOwnProperty(%j)){\", ref, field.name); // !== undefined && !== null\n\n // map fields\n if (field.map) { gen\n (\"if(!util.isObject(%s))\", ref)\n (\"return%j\", invalid(field, \"object\"))\n (\"var k=Object.keys(%s)\", ref)\n (\"for(var i=0;i<k.length;++i){\");\n genVerifyKey(gen, field, \"k[i]\");\n genVerifyValue(gen, field, i, ref + \"[k[i]]\")\n (\"}\");\n\n // repeated fields\n } else if (field.repeated) { gen\n (\"if(!Array.isArray(%s))\", ref)\n (\"return%j\", invalid(field, \"array\"))\n (\"for(var i=0;i<%s.length;++i){\", ref);\n genVerifyValue(gen, field, i, ref + \"[i]\")\n (\"}\");\n\n // required or present fields\n } else {\n if (field.partOf) {\n var oneofProp = util.safeProp(field.partOf.name);\n if (seenFirstField[field.partOf.name] === 1) gen\n (\"if(p%s===1)\", oneofProp)\n (\"return%j\", field.partOf.name + \": multiple values\");\n seenFirstField[field.partOf.name] = 1;\n gen\n (\"p%s=1\", oneofProp);\n }\n genVerifyValue(gen, field, i, ref);\n }\n if (field.optional) gen\n (\"}\");\n }\n return gen\n (\"return null\");\n /* eslint-enable no-unexpected-multiline */\n}",
32
+ "\"use strict\";\n/**\n * Runtime message from/to plain object converters.\n * @namespace\n */\nvar converter = exports;\n\nvar Enum = require(\"./enum\"),\n util = require(\"./util\");\n\n/**\n * Generates a partial value fromObject conveter.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {number} fieldIndex Field index\n * @param {string} prop Property reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genValuePartial_fromObject(gen, field, fieldIndex, prop) {\n var defaultAlreadyEmitted = false;\n /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n if (field.resolvedType) {\n if (field.resolvedType instanceof Enum) { gen\n (\"switch(d%s){\", prop);\n for (var values = field.resolvedType.values, keys = Object.keys(values), i = 0; i < keys.length; ++i) {\n // enum unknown values passthrough\n if (values[keys[i]] === field.typeDefault && !defaultAlreadyEmitted) { gen\n (\"default:\")\n (\"if(typeof(d%s)===\\\"number\\\"){m%s=d%s;break}\", prop, prop, prop);\n if (!field.repeated) gen // fallback to default value only for\n // arrays, to avoid leaving holes.\n (\"break\"); // for non-repeated fields, just ignore\n defaultAlreadyEmitted = true;\n }\n gen\n (\"case%j:\", keys[i])\n (\"case %i:\", values[keys[i]])\n (\"m%s=%j\", prop, values[keys[i]])\n (\"break\");\n } gen\n (\"}\");\n } else gen\n (\"if(typeof d%s!==\\\"object\\\")\", prop)\n (\"throw TypeError(%j)\", field.fullName + \": object expected\")\n (\"m%s=types[%i].fromObject(d%s)\", prop, fieldIndex, prop);\n } else {\n var isUnsigned = false;\n switch (field.type) {\n case \"double\":\n case \"float\": gen\n (\"m%s=Number(d%s)\", prop, prop); // also catches \"NaN\", \"Infinity\"\n break;\n case \"uint32\":\n case \"fixed32\": gen\n (\"m%s=d%s>>>0\", prop, prop);\n break;\n case \"int32\":\n case \"sint32\":\n case \"sfixed32\": gen\n (\"m%s=d%s|0\", prop, prop);\n break;\n case \"uint64\":\n isUnsigned = true;\n // eslint-disable-next-line no-fallthrough\n case \"int64\":\n case \"sint64\":\n case \"fixed64\":\n case \"sfixed64\": gen\n (\"if(util.Long)\")\n (\"(m%s=util.Long.fromValue(d%s)).unsigned=%j\", prop, prop, isUnsigned)\n (\"else if(typeof d%s===\\\"string\\\")\", prop)\n (\"m%s=parseInt(d%s,10)\", prop, prop)\n (\"else if(typeof d%s===\\\"number\\\")\", prop)\n (\"m%s=d%s\", prop, prop)\n (\"else if(typeof d%s===\\\"object\\\")\", prop)\n (\"m%s=new util.LongBits(d%s.low>>>0,d%s.high>>>0).toNumber(%s)\", prop, prop, prop, isUnsigned ? \"true\" : \"\");\n break;\n case \"bytes\": gen\n (\"if(typeof d%s===\\\"string\\\")\", prop)\n (\"util.base64.decode(d%s,m%s=util.newBuffer(util.base64.length(d%s)),0)\", prop, prop, prop)\n (\"else if(d%s.length >= 0)\", prop)\n (\"m%s=d%s\", prop, prop);\n break;\n case \"string\": gen\n (\"m%s=String(d%s)\", prop, prop);\n break;\n case \"bool\": gen\n (\"m%s=Boolean(d%s)\", prop, prop);\n break;\n /* default: gen\n (\"m%s=d%s\", prop, prop);\n break; */\n }\n }\n return gen;\n /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n}\n\n/**\n * Generates a plain object to runtime message converter specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nconverter.fromObject = function fromObject(mtype) {\n /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n var fields = mtype.fieldsArray;\n var gen = util.codegen([\"d\"], mtype.name + \"$fromObject\")\n (\"if(d instanceof this.ctor)\")\n (\"return d\");\n if (!fields.length) return gen\n (\"return new this.ctor\");\n gen\n (\"var m=new this.ctor\");\n for (var i = 0; i < fields.length; ++i) {\n var field = fields[i].resolve(),\n prop = util.safeProp(field.name);\n\n // Map fields\n if (field.map) { gen\n (\"if(d%s){\", prop)\n (\"if(typeof d%s!==\\\"object\\\")\", prop)\n (\"throw TypeError(%j)\", field.fullName + \": object expected\")\n (\"m%s={}\", prop)\n (\"for(var ks=Object.keys(d%s),i=0;i<ks.length;++i){\", prop);\n genValuePartial_fromObject(gen, field, /* not sorted */ i, prop + \"[ks[i]]\")\n (\"}\")\n (\"}\");\n\n // Repeated fields\n } else if (field.repeated) { gen\n (\"if(d%s){\", prop)\n (\"if(!Array.isArray(d%s))\", prop)\n (\"throw TypeError(%j)\", field.fullName + \": array expected\")\n (\"m%s=[]\", prop)\n (\"for(var i=0;i<d%s.length;++i){\", prop);\n genValuePartial_fromObject(gen, field, /* not sorted */ i, prop + \"[i]\")\n (\"}\")\n (\"}\");\n\n // Non-repeated fields\n } else {\n if (!(field.resolvedType instanceof Enum)) gen // no need to test for null/undefined if an enum (uses switch)\n (\"if(d%s!=null){\", prop); // !== undefined && !== null\n genValuePartial_fromObject(gen, field, /* not sorted */ i, prop);\n if (!(field.resolvedType instanceof Enum)) gen\n (\"}\");\n }\n } return gen\n (\"return m\");\n /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n};\n\n/**\n * Generates a partial value toObject converter.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {number} fieldIndex Field index\n * @param {string} prop Property reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genValuePartial_toObject(gen, field, fieldIndex, prop) {\n /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n if (field.resolvedType) {\n if (field.resolvedType instanceof Enum) gen\n (\"d%s=o.enums===String?(types[%i].values[m%s]===undefined?m%s:types[%i].values[m%s]):m%s\", prop, fieldIndex, prop, prop, fieldIndex, prop, prop);\n else gen\n (\"d%s=types[%i].toObject(m%s,o)\", prop, fieldIndex, prop);\n } else {\n var isUnsigned = false;\n switch (field.type) {\n case \"double\":\n case \"float\": gen\n (\"d%s=o.json&&!isFinite(m%s)?String(m%s):m%s\", prop, prop, prop, prop);\n break;\n case \"uint64\":\n isUnsigned = true;\n // eslint-disable-next-line no-fallthrough\n case \"int64\":\n case \"sint64\":\n case \"fixed64\":\n case \"sfixed64\": gen\n (\"if(typeof m%s===\\\"number\\\")\", prop)\n (\"d%s=o.longs===String?String(m%s):m%s\", prop, prop, prop)\n (\"else\") // Long-like\n (\"d%s=o.longs===String?util.Long.prototype.toString.call(m%s):o.longs===Number?new util.LongBits(m%s.low>>>0,m%s.high>>>0).toNumber(%s):m%s\", prop, prop, prop, prop, isUnsigned ? \"true\": \"\", prop);\n break;\n case \"bytes\": gen\n (\"d%s=o.bytes===String?util.base64.encode(m%s,0,m%s.length):o.bytes===Array?Array.prototype.slice.call(m%s):m%s\", prop, prop, prop, prop, prop);\n break;\n default: gen\n (\"d%s=m%s\", prop, prop);\n break;\n }\n }\n return gen;\n /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n}\n\n/**\n * Generates a runtime message to plain object converter specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nconverter.toObject = function toObject(mtype) {\n /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n var fields = mtype.fieldsArray.slice().sort(util.compareFieldsById);\n if (!fields.length)\n return util.codegen()(\"return {}\");\n var gen = util.codegen([\"m\", \"o\"], mtype.name + \"$toObject\")\n (\"if(!o)\")\n (\"o={}\")\n (\"var d={}\");\n\n var repeatedFields = [],\n mapFields = [],\n normalFields = [],\n i = 0;\n for (; i < fields.length; ++i)\n if (!fields[i].partOf)\n ( fields[i].resolve().repeated ? repeatedFields\n : fields[i].map ? mapFields\n : normalFields).push(fields[i]);\n\n if (repeatedFields.length) { gen\n (\"if(o.arrays||o.defaults){\");\n for (i = 0; i < repeatedFields.length; ++i) gen\n (\"d%s=[]\", util.safeProp(repeatedFields[i].name));\n gen\n (\"}\");\n }\n\n if (mapFields.length) { gen\n (\"if(o.objects||o.defaults){\");\n for (i = 0; i < mapFields.length; ++i) gen\n (\"d%s={}\", util.safeProp(mapFields[i].name));\n gen\n (\"}\");\n }\n\n if (normalFields.length) { gen\n (\"if(o.defaults){\");\n for (i = 0; i < normalFields.length; ++i) {\n var field = normalFields[i],\n prop = util.safeProp(field.name);\n if (field.resolvedType instanceof Enum) gen\n (\"d%s=o.enums===String?%j:%j\", prop, field.resolvedType.valuesById[field.typeDefault], field.typeDefault);\n else if (field.long) gen\n (\"if(util.Long){\")\n (\"var n=new util.Long(%i,%i,%j)\", field.typeDefault.low, field.typeDefault.high, field.typeDefault.unsigned)\n (\"d%s=o.longs===String?n.toString():o.longs===Number?n.toNumber():n\", prop)\n (\"}else\")\n (\"d%s=o.longs===String?%j:%i\", prop, field.typeDefault.toString(), field.typeDefault.toNumber());\n else if (field.bytes) {\n var arrayDefault = \"[\" + Array.prototype.slice.call(field.typeDefault).join(\",\") + \"]\";\n gen\n (\"if(o.bytes===String)d%s=%j\", prop, String.fromCharCode.apply(String, field.typeDefault))\n (\"else{\")\n (\"d%s=%s\", prop, arrayDefault)\n (\"if(o.bytes!==Array)d%s=util.newBuffer(d%s)\", prop, prop)\n (\"}\");\n } else gen\n (\"d%s=%j\", prop, field.typeDefault); // also messages (=null)\n } gen\n (\"}\");\n }\n var hasKs2 = false;\n for (i = 0; i < fields.length; ++i) {\n var field = fields[i],\n index = mtype._fieldsArray.indexOf(field),\n prop = util.safeProp(field.name);\n if (field.map) {\n if (!hasKs2) { hasKs2 = true; gen\n (\"var ks2\");\n } gen\n (\"if(m%s&&(ks2=Object.keys(m%s)).length){\", prop, prop)\n (\"d%s={}\", prop)\n (\"for(var j=0;j<ks2.length;++j){\");\n genValuePartial_toObject(gen, field, /* sorted */ index, prop + \"[ks2[j]]\")\n (\"}\");\n } else if (field.repeated) { gen\n (\"if(m%s&&m%s.length){\", prop, prop)\n (\"d%s=[]\", prop)\n (\"for(var j=0;j<m%s.length;++j){\", prop);\n genValuePartial_toObject(gen, field, /* sorted */ index, prop + \"[j]\")\n (\"}\");\n } else { gen\n (\"if(m%s!=null&&m.hasOwnProperty(%j)){\", prop, field.name); // !== undefined && !== null\n genValuePartial_toObject(gen, field, /* sorted */ index, prop);\n if (field.partOf) gen\n (\"if(o.oneofs)\")\n (\"d%s=%j\", util.safeProp(field.partOf.name), field.name);\n }\n gen\n (\"}\");\n }\n return gen\n (\"return d\");\n /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n};\n",
33
+ "\"use strict\";\n\n/**\n * Wrappers for common types.\n * @type {Object.<string,IWrapper>}\n * @const\n */\nvar wrappers = exports;\n\nvar Message = require(\"./message\");\n\n/**\n * From object converter part of an {@link IWrapper}.\n * @typedef WrapperFromObjectConverter\n * @type {function}\n * @param {Object.<string,*>} object Plain object\n * @returns {Message<{}>} Message instance\n * @this Type\n */\n\n/**\n * To object converter part of an {@link IWrapper}.\n * @typedef WrapperToObjectConverter\n * @type {function}\n * @param {Message<{}>} message Message instance\n * @param {IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n * @this Type\n */\n\n/**\n * Common type wrapper part of {@link wrappers}.\n * @interface IWrapper\n * @property {WrapperFromObjectConverter} [fromObject] From object converter\n * @property {WrapperToObjectConverter} [toObject] To object converter\n */\n\n// Custom wrapper for Any\nwrappers[\".google.protobuf.Any\"] = {\n\n fromObject: function(object) {\n\n // unwrap value type if mapped\n if (object && object[\"@type\"]) {\n // Only use fully qualified type name after the last '/'\n var name = object[\"@type\"].substring(object[\"@type\"].lastIndexOf(\"/\") + 1);\n var type = this.lookup(name);\n /* istanbul ignore else */\n if (type) {\n // type_url does not accept leading \".\"\n var type_url = object[\"@type\"].charAt(0) === \".\" ?\n object[\"@type\"].slice(1) : object[\"@type\"];\n // type_url prefix is optional, but path seperator is required\n if (type_url.indexOf(\"/\") === -1) {\n type_url = \"/\" + type_url;\n }\n return this.create({\n type_url: type_url,\n value: type.encode(type.fromObject(object)).finish()\n });\n }\n }\n\n return this.fromObject(object);\n },\n\n toObject: function(message, options) {\n\n // Default prefix\n var googleApi = \"type.googleapis.com/\";\n var prefix = \"\";\n var name = \"\";\n\n // decode value if requested and unmapped\n if (options && options.json && message.type_url && message.value) {\n // Only use fully qualified type name after the last '/'\n name = message.type_url.substring(message.type_url.lastIndexOf(\"/\") + 1);\n // Separate the prefix used\n prefix = message.type_url.substring(0, message.type_url.lastIndexOf(\"/\") + 1);\n var type = this.lookup(name);\n /* istanbul ignore else */\n if (type)\n message = type.decode(message.value);\n }\n\n // wrap value if unmapped\n if (!(message instanceof this.ctor) && message instanceof Message) {\n var object = message.$type.toObject(message, options);\n var messageName = message.$type.fullName[0] === \".\" ?\n message.$type.fullName.slice(1) : message.$type.fullName;\n // Default to type.googleapis.com prefix if no prefix is used\n if (prefix === \"\") {\n prefix = googleApi;\n }\n name = prefix + messageName;\n object[\"@type\"] = name;\n return object;\n }\n\n return this.toObject(message, options);\n }\n};\n",
34
+ "\"use strict\";\nmodule.exports = Type;\n\n// extends Namespace\nvar Namespace = require(\"./namespace\");\n((Type.prototype = Object.create(Namespace.prototype)).constructor = Type).className = \"Type\";\n\nvar Enum = require(\"./enum\"),\n OneOf = require(\"./oneof\"),\n Field = require(\"./field\"),\n MapField = require(\"./mapfield\"),\n Service = require(\"./service\"),\n Message = require(\"./message\"),\n Reader = require(\"./reader\"),\n Writer = require(\"./writer\"),\n util = require(\"./util\"),\n encoder = require(\"./encoder\"),\n decoder = require(\"./decoder\"),\n verifier = require(\"./verifier\"),\n converter = require(\"./converter\"),\n wrappers = require(\"./wrappers\");\n\n/**\n * Constructs a new reflected message type instance.\n * @classdesc Reflected message type.\n * @extends NamespaceBase\n * @constructor\n * @param {string} name Message name\n * @param {Object.<string,*>} [options] Declared options\n */\nfunction Type(name, options) {\n Namespace.call(this, name, options);\n\n /**\n * Message fields.\n * @type {Object.<string,Field>}\n */\n this.fields = {}; // toJSON, marker\n\n /**\n * Oneofs declared within this namespace, if any.\n * @type {Object.<string,OneOf>}\n */\n this.oneofs = undefined; // toJSON\n\n /**\n * Extension ranges, if any.\n * @type {number[][]}\n */\n this.extensions = undefined; // toJSON\n\n /**\n * Reserved ranges, if any.\n * @type {Array.<number[]|string>}\n */\n this.reserved = undefined; // toJSON\n\n /*?\n * Whether this type is a legacy group.\n * @type {boolean|undefined}\n */\n this.group = undefined; // toJSON\n\n /**\n * Cached fields by id.\n * @type {Object.<number,Field>|null}\n * @private\n */\n this._fieldsById = null;\n\n /**\n * Cached fields as an array.\n * @type {Field[]|null}\n * @private\n */\n this._fieldsArray = null;\n\n /**\n * Cached oneofs as an array.\n * @type {OneOf[]|null}\n * @private\n */\n this._oneofsArray = null;\n\n /**\n * Cached constructor.\n * @type {Constructor<{}>}\n * @private\n */\n this._ctor = null;\n}\n\nObject.defineProperties(Type.prototype, {\n\n /**\n * Message fields by id.\n * @name Type#fieldsById\n * @type {Object.<number,Field>}\n * @readonly\n */\n fieldsById: {\n get: function() {\n\n /* istanbul ignore if */\n if (this._fieldsById)\n return this._fieldsById;\n\n this._fieldsById = {};\n for (var names = Object.keys(this.fields), i = 0; i < names.length; ++i) {\n var field = this.fields[names[i]],\n id = field.id;\n\n /* istanbul ignore if */\n if (this._fieldsById[id])\n throw Error(\"duplicate id \" + id + \" in \" + this);\n\n this._fieldsById[id] = field;\n }\n return this._fieldsById;\n }\n },\n\n /**\n * Fields of this message as an array for iteration.\n * @name Type#fieldsArray\n * @type {Field[]}\n * @readonly\n */\n fieldsArray: {\n get: function() {\n return this._fieldsArray || (this._fieldsArray = util.toArray(this.fields));\n }\n },\n\n /**\n * Oneofs of this message as an array for iteration.\n * @name Type#oneofsArray\n * @type {OneOf[]}\n * @readonly\n */\n oneofsArray: {\n get: function() {\n return this._oneofsArray || (this._oneofsArray = util.toArray(this.oneofs));\n }\n },\n\n /**\n * The registered constructor, if any registered, otherwise a generic constructor.\n * Assigning a function replaces the internal constructor. If the function does not extend {@link Message} yet, its prototype will be setup accordingly and static methods will be populated. If it already extends {@link Message}, it will just replace the internal constructor.\n * @name Type#ctor\n * @type {Constructor<{}>}\n */\n ctor: {\n get: function() {\n return this._ctor || (this.ctor = Type.generateConstructor(this)());\n },\n set: function(ctor) {\n\n // Ensure proper prototype\n var prototype = ctor.prototype;\n if (!(prototype instanceof Message)) {\n (ctor.prototype = new Message()).constructor = ctor;\n util.merge(ctor.prototype, prototype);\n }\n\n // Classes and messages reference their reflected type\n ctor.$type = ctor.prototype.$type = this;\n\n // Mix in static methods\n util.merge(ctor, Message, true);\n\n this._ctor = ctor;\n\n // Messages have non-enumerable default values on their prototype\n var i = 0;\n for (; i < /* initializes */ this.fieldsArray.length; ++i)\n this._fieldsArray[i].resolve(); // ensures a proper value\n\n // Messages have non-enumerable getters and setters for each virtual oneof field\n var ctorProperties = {};\n for (i = 0; i < /* initializes */ this.oneofsArray.length; ++i)\n ctorProperties[this._oneofsArray[i].resolve().name] = {\n get: util.oneOfGetter(this._oneofsArray[i].oneof),\n set: util.oneOfSetter(this._oneofsArray[i].oneof)\n };\n if (i)\n Object.defineProperties(ctor.prototype, ctorProperties);\n }\n }\n});\n\n/**\n * Generates a constructor function for the specified type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nType.generateConstructor = function generateConstructor(mtype) {\n /* eslint-disable no-unexpected-multiline */\n var gen = util.codegen([\"p\"], mtype.name);\n // explicitly initialize mutable object/array fields so that these aren't just inherited from the prototype\n for (var i = 0, field; i < mtype.fieldsArray.length; ++i)\n if ((field = mtype._fieldsArray[i]).map) gen\n (\"this%s={}\", util.safeProp(field.name));\n else if (field.repeated) gen\n (\"this%s=[]\", util.safeProp(field.name));\n return gen\n (\"if(p)for(var ks=Object.keys(p),i=0;i<ks.length;++i)if(p[ks[i]]!=null)\") // omit undefined or null\n (\"this[ks[i]]=p[ks[i]]\");\n /* eslint-enable no-unexpected-multiline */\n};\n\nfunction clearCache(type) {\n type._fieldsById = type._fieldsArray = type._oneofsArray = null;\n delete type.encode;\n delete type.decode;\n delete type.verify;\n return type;\n}\n\n/**\n * Message type descriptor.\n * @interface IType\n * @extends INamespace\n * @property {Object.<string,IOneOf>} [oneofs] Oneof descriptors\n * @property {Object.<string,IField>} fields Field descriptors\n * @property {number[][]} [extensions] Extension ranges\n * @property {Array.<number[]|string>} [reserved] Reserved ranges\n * @property {boolean} [group=false] Whether a legacy group or not\n */\n\n/**\n * Creates a message type from a message type descriptor.\n * @param {string} name Message name\n * @param {IType} json Message type descriptor\n * @returns {Type} Created message type\n */\nType.fromJSON = function fromJSON(name, json) {\n var type = new Type(name, json.options);\n type.extensions = json.extensions;\n type.reserved = json.reserved;\n var names = Object.keys(json.fields),\n i = 0;\n for (; i < names.length; ++i)\n type.add(\n ( typeof json.fields[names[i]].keyType !== \"undefined\"\n ? MapField.fromJSON\n : Field.fromJSON )(names[i], json.fields[names[i]])\n );\n if (json.oneofs)\n for (names = Object.keys(json.oneofs), i = 0; i < names.length; ++i)\n type.add(OneOf.fromJSON(names[i], json.oneofs[names[i]]));\n if (json.nested)\n for (names = Object.keys(json.nested), i = 0; i < names.length; ++i) {\n var nested = json.nested[names[i]];\n type.add( // most to least likely\n ( nested.id !== undefined\n ? Field.fromJSON\n : nested.fields !== undefined\n ? Type.fromJSON\n : nested.values !== undefined\n ? Enum.fromJSON\n : nested.methods !== undefined\n ? Service.fromJSON\n : Namespace.fromJSON )(names[i], nested)\n );\n }\n if (json.extensions && json.extensions.length)\n type.extensions = json.extensions;\n if (json.reserved && json.reserved.length)\n type.reserved = json.reserved;\n if (json.group)\n type.group = true;\n if (json.comment)\n type.comment = json.comment;\n if (json.edition)\n type._edition = json.edition;\n type._defaultEdition = \"proto3\"; // For backwards-compatibility.\n return type;\n};\n\n/**\n * Converts this message type to a message type descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IType} Message type descriptor\n */\nType.prototype.toJSON = function toJSON(toJSONOptions) {\n var inherited = Namespace.prototype.toJSON.call(this, toJSONOptions);\n var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n return util.toObject([\n \"edition\" , this._editionToJSON(),\n \"options\" , inherited && inherited.options || undefined,\n \"oneofs\" , Namespace.arrayToJSON(this.oneofsArray, toJSONOptions),\n \"fields\" , Namespace.arrayToJSON(this.fieldsArray.filter(function(obj) { return !obj.declaringField; }), toJSONOptions) || {},\n \"extensions\" , this.extensions && this.extensions.length ? this.extensions : undefined,\n \"reserved\" , this.reserved && this.reserved.length ? this.reserved : undefined,\n \"group\" , this.group || undefined,\n \"nested\" , inherited && inherited.nested || undefined,\n \"comment\" , keepComments ? this.comment : undefined\n ]);\n};\n\n/**\n * @override\n */\nType.prototype.resolveAll = function resolveAll() {\n if (!this._needsRecursiveResolve) return this;\n\n Namespace.prototype.resolveAll.call(this);\n var oneofs = this.oneofsArray; i = 0;\n while (i < oneofs.length)\n oneofs[i++].resolve();\n var fields = this.fieldsArray, i = 0;\n while (i < fields.length)\n fields[i++].resolve();\n return this;\n};\n\n/**\n * @override\n */\nType.prototype._resolveFeaturesRecursive = function _resolveFeaturesRecursive(edition) {\n if (!this._needsRecursiveFeatureResolution) return this;\n\n edition = this._edition || edition;\n\n Namespace.prototype._resolveFeaturesRecursive.call(this, edition);\n this.oneofsArray.forEach(oneof => {\n oneof._resolveFeatures(edition);\n });\n this.fieldsArray.forEach(field => {\n field._resolveFeatures(edition);\n });\n return this;\n};\n\n/**\n * @override\n */\nType.prototype.get = function get(name) {\n return this.fields[name]\n || this.oneofs && this.oneofs[name]\n || this.nested && this.nested[name]\n || null;\n};\n\n/**\n * Adds a nested object to this type.\n * @param {ReflectionObject} object Nested object to add\n * @returns {Type} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If there is already a nested object with this name or, if a field, when there is already a field with this id\n */\nType.prototype.add = function add(object) {\n\n if (this.get(object.name))\n throw Error(\"duplicate name '\" + object.name + \"' in \" + this);\n\n if (object instanceof Field && object.extend === undefined) {\n // NOTE: Extension fields aren't actual fields on the declaring type, but nested objects.\n // The root object takes care of adding distinct sister-fields to the respective extended\n // type instead.\n\n // avoids calling the getter if not absolutely necessary because it's called quite frequently\n if (this._fieldsById ? /* istanbul ignore next */ this._fieldsById[object.id] : this.fieldsById[object.id])\n throw Error(\"duplicate id \" + object.id + \" in \" + this);\n if (this.isReservedId(object.id))\n throw Error(\"id \" + object.id + \" is reserved in \" + this);\n if (this.isReservedName(object.name))\n throw Error(\"name '\" + object.name + \"' is reserved in \" + this);\n\n if (object.parent)\n object.parent.remove(object);\n this.fields[object.name] = object;\n object.message = this;\n object.onAdd(this);\n return clearCache(this);\n }\n if (object instanceof OneOf) {\n if (!this.oneofs)\n this.oneofs = {};\n this.oneofs[object.name] = object;\n object.onAdd(this);\n return clearCache(this);\n }\n return Namespace.prototype.add.call(this, object);\n};\n\n/**\n * Removes a nested object from this type.\n * @param {ReflectionObject} object Nested object to remove\n * @returns {Type} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If `object` is not a member of this type\n */\nType.prototype.remove = function remove(object) {\n if (object instanceof Field && object.extend === undefined) {\n // See Type#add for the reason why extension fields are excluded here.\n\n /* istanbul ignore if */\n if (!this.fields || this.fields[object.name] !== object)\n throw Error(object + \" is not a member of \" + this);\n\n delete this.fields[object.name];\n object.parent = null;\n object.onRemove(this);\n return clearCache(this);\n }\n if (object instanceof OneOf) {\n\n /* istanbul ignore if */\n if (!this.oneofs || this.oneofs[object.name] !== object)\n throw Error(object + \" is not a member of \" + this);\n\n delete this.oneofs[object.name];\n object.parent = null;\n object.onRemove(this);\n return clearCache(this);\n }\n return Namespace.prototype.remove.call(this, object);\n};\n\n/**\n * Tests if the specified id is reserved.\n * @param {number} id Id to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nType.prototype.isReservedId = function isReservedId(id) {\n return Namespace.isReservedId(this.reserved, id);\n};\n\n/**\n * Tests if the specified name is reserved.\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nType.prototype.isReservedName = function isReservedName(name) {\n return Namespace.isReservedName(this.reserved, name);\n};\n\n/**\n * Creates a new message of this type using the specified properties.\n * @param {Object.<string,*>} [properties] Properties to set\n * @returns {Message<{}>} Message instance\n */\nType.prototype.create = function create(properties) {\n return new this.ctor(properties);\n};\n\n/**\n * Sets up {@link Type#encode|encode}, {@link Type#decode|decode} and {@link Type#verify|verify}.\n * @returns {Type} `this`\n */\nType.prototype.setup = function setup() {\n // Sets up everything at once so that the prototype chain does not have to be re-evaluated\n // multiple times (V8, soft-deopt prototype-check).\n\n var fullName = this.fullName,\n types = [];\n for (var i = 0; i < /* initializes */ this.fieldsArray.length; ++i)\n types.push(this._fieldsArray[i].resolve().resolvedType);\n\n // Replace setup methods with type-specific generated functions\n this.encode = encoder(this)({\n Writer : Writer,\n types : types,\n util : util\n });\n this.decode = decoder(this)({\n Reader : Reader,\n types : types,\n util : util\n });\n this.verify = verifier(this)({\n types : types,\n util : util\n });\n this.fromObject = converter.fromObject(this)({\n types : types,\n util : util\n });\n this.toObject = converter.toObject(this)({\n types : types,\n util : util\n });\n\n // Inject custom wrappers for common types\n var wrapper = wrappers[fullName];\n if (wrapper) {\n var originalThis = Object.create(this);\n // if (wrapper.fromObject) {\n originalThis.fromObject = this.fromObject;\n this.fromObject = wrapper.fromObject.bind(originalThis);\n // }\n // if (wrapper.toObject) {\n originalThis.toObject = this.toObject;\n this.toObject = wrapper.toObject.bind(originalThis);\n // }\n }\n\n return this;\n};\n\n/**\n * Encodes a message of this type. Does not implicitly {@link Type#verify|verify} messages.\n * @param {Message<{}>|Object.<string,*>} message Message instance or plain object\n * @param {Writer} [writer] Writer to encode to\n * @returns {Writer} writer\n */\nType.prototype.encode = function encode_setup(message, writer) {\n return this.setup().encode(message, writer); // overrides this method\n};\n\n/**\n * Encodes a message of this type preceeded by its byte length as a varint. Does not implicitly {@link Type#verify|verify} messages.\n * @param {Message<{}>|Object.<string,*>} message Message instance or plain object\n * @param {Writer} [writer] Writer to encode to\n * @returns {Writer} writer\n */\nType.prototype.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();\n};\n\n/**\n * Decodes a message of this type.\n * @param {Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Length of the message, if known beforehand\n * @returns {Message<{}>} Decoded message\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {util.ProtocolError<{}>} If required fields are missing\n */\nType.prototype.decode = function decode_setup(reader, length) {\n return this.setup().decode(reader, length); // overrides this method\n};\n\n/**\n * Decodes a message of this type preceeded by its byte length as a varint.\n * @param {Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {Message<{}>} Decoded message\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {util.ProtocolError} If required fields are missing\n */\nType.prototype.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof Reader))\n reader = Reader.create(reader);\n return this.decode(reader, reader.uint32());\n};\n\n/**\n * Verifies that field values are valid and that required fields are present.\n * @param {Object.<string,*>} message Plain object to verify\n * @returns {null|string} `null` if valid, otherwise the reason why it is not\n */\nType.prototype.verify = function verify_setup(message) {\n return this.setup().verify(message); // overrides this method\n};\n\n/**\n * Creates a new message of this type from a plain object. Also converts values to their respective internal types.\n * @param {Object.<string,*>} object Plain object to convert\n * @returns {Message<{}>} Message instance\n */\nType.prototype.fromObject = function fromObject(object) {\n return this.setup().fromObject(object);\n};\n\n/**\n * Conversion options as used by {@link Type#toObject} and {@link Message.toObject}.\n * @interface IConversionOptions\n * @property {Function} [longs] Long conversion type.\n * Valid values are `String` and `Number` (the global types).\n * Defaults to copy the present value, which is a possibly unsafe number without and a {@link Long} with a long library.\n * @property {Function} [enums] Enum value conversion type.\n * Only valid value is `String` (the global type).\n * Defaults to copy the present value, which is the numeric id.\n * @property {Function} [bytes] Bytes value conversion type.\n * Valid values are `Array` and (a base64 encoded) `String` (the global types).\n * Defaults to copy the present value, which usually is a Buffer under node and an Uint8Array in the browser.\n * @property {boolean} [defaults=false] Also sets default values on the resulting object\n * @property {boolean} [arrays=false] Sets empty arrays for missing repeated fields even if `defaults=false`\n * @property {boolean} [objects=false] Sets empty objects for missing map fields even if `defaults=false`\n * @property {boolean} [oneofs=false] Includes virtual oneof properties set to the present field's name, if any\n * @property {boolean} [json=false] Performs additional JSON compatibility conversions, i.e. NaN and Infinity to strings\n */\n\n/**\n * Creates a plain object from a message of this type. Also converts values to other types if specified.\n * @param {Message<{}>} message Message instance\n * @param {IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n */\nType.prototype.toObject = function toObject(message, options) {\n return this.setup().toObject(message, options);\n};\n\n/**\n * Decorator function as returned by {@link Type.d} (TypeScript).\n * @typedef TypeDecorator\n * @type {function}\n * @param {Constructor<T>} target Target constructor\n * @returns {undefined}\n * @template T extends Message<T>\n */\n\n/**\n * Type decorator (TypeScript).\n * @param {string} [typeName] Type name, defaults to the constructor's name\n * @returns {TypeDecorator<T>} Decorator function\n * @template T extends Message<T>\n */\nType.d = function decorateType(typeName) {\n return function typeDecorator(target) {\n util.decorateType(target, typeName);\n };\n};\n",
35
+ "\"use strict\";\nmodule.exports = Root;\n\n// extends Namespace\nvar Namespace = require(\"./namespace\");\n((Root.prototype = Object.create(Namespace.prototype)).constructor = Root).className = \"Root\";\n\nvar Field = require(\"./field\"),\n Enum = require(\"./enum\"),\n OneOf = require(\"./oneof\"),\n util = require(\"./util\");\n\nvar Type, // cyclic\n parse, // might be excluded\n common; // \"\n\n/**\n * Constructs a new root namespace instance.\n * @classdesc Root namespace wrapping all types, enums, services, sub-namespaces etc. that belong together.\n * @extends NamespaceBase\n * @constructor\n * @param {Object.<string,*>} [options] Top level options\n */\nfunction Root(options) {\n Namespace.call(this, \"\", options);\n\n /**\n * Deferred extension fields.\n * @type {Field[]}\n */\n this.deferred = [];\n\n /**\n * Resolved file names of loaded files.\n * @type {string[]}\n */\n this.files = [];\n\n /**\n * Edition, defaults to proto2 if unspecified.\n * @type {string}\n * @private\n */\n this._edition = \"proto2\";\n\n /**\n * Global lookup cache of fully qualified names.\n * @type {Object.<string,ReflectionObject>}\n * @private\n */\n this._fullyQualifiedObjects = {};\n}\n\n/**\n * Loads a namespace descriptor into a root namespace.\n * @param {INamespace} json Namespace descriptor\n * @param {Root} [root] Root namespace, defaults to create a new one if omitted\n * @returns {Root} Root namespace\n */\nRoot.fromJSON = function fromJSON(json, root) {\n if (!root)\n root = new Root();\n if (json.options)\n root.setOptions(json.options);\n return root.addJSON(json.nested).resolveAll();\n};\n\n/**\n * Resolves the path of an imported file, relative to the importing origin.\n * This method exists so you can override it with your own logic in case your imports are scattered over multiple directories.\n * @function\n * @param {string} origin The file name of the importing file\n * @param {string} target The file name being imported\n * @returns {string|null} Resolved path to `target` or `null` to skip the file\n */\nRoot.prototype.resolvePath = util.path.resolve;\n\n/**\n * Fetch content from file path or url\n * This method exists so you can override it with your own logic.\n * @function\n * @param {string} path File path or url\n * @param {FetchCallback} callback Callback function\n * @returns {undefined}\n */\nRoot.prototype.fetch = util.fetch;\n\n// A symbol-like function to safely signal synchronous loading\n/* istanbul ignore next */\nfunction SYNC() {} // eslint-disable-line no-empty-function\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {IParseOptions} options Parse options\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n */\nRoot.prototype.load = function load(filename, options, callback) {\n if (typeof options === \"function\") {\n callback = options;\n options = undefined;\n }\n var self = this;\n if (!callback) {\n return util.asPromise(load, self, filename, options);\n }\n\n var sync = callback === SYNC; // undocumented\n\n // Finishes loading by calling the callback (exactly once)\n function finish(err, root) {\n /* istanbul ignore if */\n if (!callback) {\n return;\n }\n if (sync) {\n throw err;\n }\n if (root) {\n root.resolveAll();\n }\n var cb = callback;\n callback = null;\n cb(err, root);\n }\n\n // Bundled definition existence checking\n function getBundledFileName(filename) {\n var idx = filename.lastIndexOf(\"google/protobuf/\");\n if (idx > -1) {\n var altname = filename.substring(idx);\n if (altname in common) return altname;\n }\n return null;\n }\n\n // Processes a single file\n function process(filename, source) {\n try {\n if (util.isString(source) && source.charAt(0) === \"{\")\n source = JSON.parse(source);\n if (!util.isString(source))\n self.setOptions(source.options).addJSON(source.nested);\n else {\n parse.filename = filename;\n var parsed = parse(source, self, options),\n resolved,\n i = 0;\n if (parsed.imports)\n for (; i < parsed.imports.length; ++i)\n if (resolved = getBundledFileName(parsed.imports[i]) || self.resolvePath(filename, parsed.imports[i]))\n fetch(resolved);\n if (parsed.weakImports)\n for (i = 0; i < parsed.weakImports.length; ++i)\n if (resolved = getBundledFileName(parsed.weakImports[i]) || self.resolvePath(filename, parsed.weakImports[i]))\n fetch(resolved, true);\n }\n } catch (err) {\n finish(err);\n }\n if (!sync && !queued) {\n finish(null, self); // only once anyway\n }\n }\n\n // Fetches a single file\n function fetch(filename, weak) {\n filename = getBundledFileName(filename) || filename;\n\n // Skip if already loaded / attempted\n if (self.files.indexOf(filename) > -1) {\n return;\n }\n self.files.push(filename);\n\n // Shortcut bundled definitions\n if (filename in common) {\n if (sync) {\n process(filename, common[filename]);\n } else {\n ++queued;\n setTimeout(function() {\n --queued;\n process(filename, common[filename]);\n });\n }\n return;\n }\n\n // Otherwise fetch from disk or network\n if (sync) {\n var source;\n try {\n source = util.fs.readFileSync(filename).toString(\"utf8\");\n } catch (err) {\n if (!weak)\n finish(err);\n return;\n }\n process(filename, source);\n } else {\n ++queued;\n self.fetch(filename, function(err, source) {\n --queued;\n /* istanbul ignore if */\n if (!callback) {\n return; // terminated meanwhile\n }\n if (err) {\n /* istanbul ignore else */\n if (!weak)\n finish(err);\n else if (!queued) // can't be covered reliably\n finish(null, self);\n return;\n }\n process(filename, source);\n });\n }\n }\n var queued = 0;\n\n // Assembling the root namespace doesn't require working type\n // references anymore, so we can load everything in parallel\n if (util.isString(filename)) {\n filename = [ filename ];\n }\n for (var i = 0, resolved; i < filename.length; ++i)\n if (resolved = self.resolvePath(\"\", filename[i]))\n fetch(resolved);\n if (sync) {\n self.resolveAll();\n return self;\n }\n if (!queued) {\n finish(null, self);\n }\n\n return self;\n};\n// function load(filename:string, options:IParseOptions, callback:LoadCallback):undefined\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.\n * @function Root#load\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n * @variation 2\n */\n// function load(filename:string, callback:LoadCallback):undefined\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into this root namespace and returns a promise.\n * @function Root#load\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {Promise<Root>} Promise\n * @variation 3\n */\n// function load(filename:string, [options:IParseOptions]):Promise<Root>\n\n/**\n * Synchronously loads one or multiple .proto or preprocessed .json files into this root namespace (node only).\n * @function Root#loadSync\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {Root} Root namespace\n * @throws {Error} If synchronous fetching is not supported (i.e. in browsers) or if a file's syntax is invalid\n */\nRoot.prototype.loadSync = function loadSync(filename, options) {\n if (!util.isNode)\n throw Error(\"not supported\");\n return this.load(filename, options, SYNC);\n};\n\n/**\n * @override\n */\nRoot.prototype.resolveAll = function resolveAll() {\n if (!this._needsRecursiveResolve) return this;\n\n if (this.deferred.length)\n throw Error(\"unresolvable extensions: \" + this.deferred.map(function(field) {\n return \"'extend \" + field.extend + \"' in \" + field.parent.fullName;\n }).join(\", \"));\n return Namespace.prototype.resolveAll.call(this);\n};\n\n// only uppercased (and thus conflict-free) children are exposed, see below\nvar exposeRe = /^[A-Z]/;\n\n/**\n * Handles a deferred declaring extension field by creating a sister field to represent it within its extended type.\n * @param {Root} root Root instance\n * @param {Field} field Declaring extension field witin the declaring type\n * @returns {boolean} `true` if successfully added to the extended type, `false` otherwise\n * @inner\n * @ignore\n */\nfunction tryHandleExtension(root, field) {\n var extendedType = field.parent.lookup(field.extend);\n if (extendedType) {\n var sisterField = new Field(field.fullName, field.id, field.type, field.rule, undefined, field.options);\n //do not allow to extend same field twice to prevent the error\n if (extendedType.get(sisterField.name)) {\n return true;\n }\n sisterField.declaringField = field;\n field.extensionField = sisterField;\n extendedType.add(sisterField);\n return true;\n }\n return false;\n}\n\n/**\n * Called when any object is added to this root or its sub-namespaces.\n * @param {ReflectionObject} object Object added\n * @returns {undefined}\n * @private\n */\nRoot.prototype._handleAdd = function _handleAdd(object) {\n if (object instanceof Field) {\n\n if (/* an extension field (implies not part of a oneof) */ object.extend !== undefined && /* not already handled */ !object.extensionField)\n if (!tryHandleExtension(this, object))\n this.deferred.push(object);\n\n } else if (object instanceof Enum) {\n\n if (exposeRe.test(object.name))\n object.parent[object.name] = object.values; // expose enum values as property of its parent\n\n } else if (!(object instanceof OneOf)) /* everything else is a namespace */ {\n\n if (object instanceof Type) // Try to handle any deferred extensions\n for (var i = 0; i < this.deferred.length;)\n if (tryHandleExtension(this, this.deferred[i]))\n this.deferred.splice(i, 1);\n else\n ++i;\n for (var j = 0; j < /* initializes */ object.nestedArray.length; ++j) // recurse into the namespace\n this._handleAdd(object._nestedArray[j]);\n if (exposeRe.test(object.name))\n object.parent[object.name] = object; // expose namespace as property of its parent\n }\n\n if (object instanceof Type || object instanceof Enum || object instanceof Field) {\n // Only store types and enums for quick lookup during resolve.\n this._fullyQualifiedObjects[object.fullName] = object;\n }\n\n // The above also adds uppercased (and thus conflict-free) nested types, services and enums as\n // properties of namespaces just like static code does. This allows using a .d.ts generated for\n // a static module with reflection-based solutions where the condition is met.\n};\n\n/**\n * Called when any object is removed from this root or its sub-namespaces.\n * @param {ReflectionObject} object Object removed\n * @returns {undefined}\n * @private\n */\nRoot.prototype._handleRemove = function _handleRemove(object) {\n if (object instanceof Field) {\n\n if (/* an extension field */ object.extend !== undefined) {\n if (/* already handled */ object.extensionField) { // remove its sister field\n object.extensionField.parent.remove(object.extensionField);\n object.extensionField = null;\n } else { // cancel the extension\n var index = this.deferred.indexOf(object);\n /* istanbul ignore else */\n if (index > -1)\n this.deferred.splice(index, 1);\n }\n }\n\n } else if (object instanceof Enum) {\n\n if (exposeRe.test(object.name))\n delete object.parent[object.name]; // unexpose enum values\n\n } else if (object instanceof Namespace) {\n\n for (var i = 0; i < /* initializes */ object.nestedArray.length; ++i) // recurse into the namespace\n this._handleRemove(object._nestedArray[i]);\n\n if (exposeRe.test(object.name))\n delete object.parent[object.name]; // unexpose namespaces\n\n }\n\n delete this._fullyQualifiedObjects[object.fullName];\n};\n\n// Sets up cyclic dependencies (called in index-light)\nRoot._configure = function(Type_, parse_, common_) {\n Type = Type_;\n parse = parse_;\n common = common_;\n};\n",
36
+ "\"use strict\";\n\n/**\n * Various utility functions.\n * @namespace\n */\nvar util = module.exports = require(\"./util/minimal\");\n\nvar roots = require(\"./roots\");\n\nvar Type, // cyclic\n Enum;\n\nutil.codegen = require(\"@protobufjs/codegen\");\nutil.fetch = require(\"@protobufjs/fetch\");\nutil.path = require(\"@protobufjs/path\");\n\n/**\n * Node's fs module if available.\n * @type {Object.<string,*>}\n */\nutil.fs = util.inquire(\"fs\");\n\n/**\n * Converts an object's values to an array.\n * @param {Object.<string,*>} object Object to convert\n * @returns {Array.<*>} Converted array\n */\nutil.toArray = function toArray(object) {\n if (object) {\n var keys = Object.keys(object),\n array = new Array(keys.length),\n index = 0;\n while (index < keys.length)\n array[index] = object[keys[index++]];\n return array;\n }\n return [];\n};\n\n/**\n * Converts an array of keys immediately followed by their respective value to an object, omitting undefined values.\n * @param {Array.<*>} array Array to convert\n * @returns {Object.<string,*>} Converted object\n */\nutil.toObject = function toObject(array) {\n var object = {},\n index = 0;\n while (index < array.length) {\n var key = array[index++],\n val = array[index++];\n if (val !== undefined)\n object[key] = val;\n }\n return object;\n};\n\nvar safePropBackslashRe = /\\\\/g,\n safePropQuoteRe = /\"/g;\n\n/**\n * Tests whether the specified name is a reserved word in JS.\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nutil.isReserved = function isReserved(name) {\n return /^(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)$/.test(name);\n};\n\n/**\n * Returns a safe property accessor for the specified property name.\n * @param {string} prop Property name\n * @returns {string} Safe accessor\n */\nutil.safeProp = function safeProp(prop) {\n if (!/^[$\\w_]+$/.test(prop) || util.isReserved(prop))\n return \"[\\\"\" + prop.replace(safePropBackslashRe, \"\\\\\\\\\").replace(safePropQuoteRe, \"\\\\\\\"\") + \"\\\"]\";\n return \".\" + prop;\n};\n\n/**\n * Converts the first character of a string to upper case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.ucFirst = function ucFirst(str) {\n return str.charAt(0).toUpperCase() + str.substring(1);\n};\n\nvar camelCaseRe = /_([a-z])/g;\n\n/**\n * Converts a string to camel case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.camelCase = function camelCase(str) {\n return str.substring(0, 1)\n + str.substring(1)\n .replace(camelCaseRe, function($0, $1) { return $1.toUpperCase(); });\n};\n\n/**\n * Compares reflected fields by id.\n * @param {Field} a First field\n * @param {Field} b Second field\n * @returns {number} Comparison value\n */\nutil.compareFieldsById = function compareFieldsById(a, b) {\n return a.id - b.id;\n};\n\n/**\n * Decorator helper for types (TypeScript).\n * @param {Constructor<T>} ctor Constructor function\n * @param {string} [typeName] Type name, defaults to the constructor's name\n * @returns {Type} Reflected type\n * @template T extends Message<T>\n * @property {Root} root Decorators root\n */\nutil.decorateType = function decorateType(ctor, typeName) {\n\n /* istanbul ignore if */\n if (ctor.$type) {\n if (typeName && ctor.$type.name !== typeName) {\n util.decorateRoot.remove(ctor.$type);\n ctor.$type.name = typeName;\n util.decorateRoot.add(ctor.$type);\n }\n return ctor.$type;\n }\n\n /* istanbul ignore next */\n if (!Type)\n Type = require(\"./type\");\n\n var type = new Type(typeName || ctor.name);\n util.decorateRoot.add(type);\n type.ctor = ctor; // sets up .encode, .decode etc.\n Object.defineProperty(ctor, \"$type\", { value: type, enumerable: false });\n Object.defineProperty(ctor.prototype, \"$type\", { value: type, enumerable: false });\n return type;\n};\n\nvar decorateEnumIndex = 0;\n\n/**\n * Decorator helper for enums (TypeScript).\n * @param {Object} object Enum object\n * @returns {Enum} Reflected enum\n */\nutil.decorateEnum = function decorateEnum(object) {\n\n /* istanbul ignore if */\n if (object.$type)\n return object.$type;\n\n /* istanbul ignore next */\n if (!Enum)\n Enum = require(\"./enum\");\n\n var enm = new Enum(\"Enum\" + decorateEnumIndex++, object);\n util.decorateRoot.add(enm);\n Object.defineProperty(object, \"$type\", { value: enm, enumerable: false });\n return enm;\n};\n\n\n/**\n * Sets the value of a property by property path. If a value already exists, it is turned to an array\n * @param {Object.<string,*>} dst Destination object\n * @param {string} path dot '.' delimited path of the property to set\n * @param {Object} value the value to set\n * @param {boolean|undefined} [ifNotSet] Sets the option only if it isn't currently set\n * @returns {Object.<string,*>} Destination object\n */\nutil.setProperty = function setProperty(dst, path, value, ifNotSet) {\n function setProp(dst, path, value) {\n var part = path.shift();\n if (part === \"__proto__\" || part === \"prototype\") {\n return dst;\n }\n if (path.length > 0) {\n dst[part] = setProp(dst[part] || {}, path, value);\n } else {\n var prevValue = dst[part];\n if (prevValue && ifNotSet)\n return dst;\n if (prevValue)\n value = [].concat(prevValue).concat(value);\n dst[part] = value;\n }\n return dst;\n }\n\n if (typeof dst !== \"object\")\n throw TypeError(\"dst must be an object\");\n if (!path)\n throw TypeError(\"path must be specified\");\n\n path = path.split(\".\");\n return setProp(dst, path, value);\n};\n\n/**\n * Decorator root (TypeScript).\n * @name util.decorateRoot\n * @type {Root}\n * @readonly\n */\nObject.defineProperty(util, \"decorateRoot\", {\n get: function() {\n return roots[\"decorated\"] || (roots[\"decorated\"] = new (require(\"./root\"))());\n }\n});\n",
37
+ "\"use strict\";\n\n/**\n * Common type constants.\n * @namespace\n */\nvar types = exports;\n\nvar util = require(\"./util\");\n\nvar s = [\n \"double\", // 0\n \"float\", // 1\n \"int32\", // 2\n \"uint32\", // 3\n \"sint32\", // 4\n \"fixed32\", // 5\n \"sfixed32\", // 6\n \"int64\", // 7\n \"uint64\", // 8\n \"sint64\", // 9\n \"fixed64\", // 10\n \"sfixed64\", // 11\n \"bool\", // 12\n \"string\", // 13\n \"bytes\" // 14\n];\n\nfunction bake(values, offset) {\n var i = 0, o = {};\n offset |= 0;\n while (i < values.length) o[s[i + offset]] = values[i++];\n return o;\n}\n\n/**\n * Basic type wire types.\n * @type {Object.<string,number>}\n * @const\n * @property {number} double=1 Fixed64 wire type\n * @property {number} float=5 Fixed32 wire type\n * @property {number} int32=0 Varint wire type\n * @property {number} uint32=0 Varint wire type\n * @property {number} sint32=0 Varint wire type\n * @property {number} fixed32=5 Fixed32 wire type\n * @property {number} sfixed32=5 Fixed32 wire type\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n * @property {number} bool=0 Varint wire type\n * @property {number} string=2 Ldelim wire type\n * @property {number} bytes=2 Ldelim wire type\n */\ntypes.basic = bake([\n /* double */ 1,\n /* float */ 5,\n /* int32 */ 0,\n /* uint32 */ 0,\n /* sint32 */ 0,\n /* fixed32 */ 5,\n /* sfixed32 */ 5,\n /* int64 */ 0,\n /* uint64 */ 0,\n /* sint64 */ 0,\n /* fixed64 */ 1,\n /* sfixed64 */ 1,\n /* bool */ 0,\n /* string */ 2,\n /* bytes */ 2\n]);\n\n/**\n * Basic type defaults.\n * @type {Object.<string,*>}\n * @const\n * @property {number} double=0 Double default\n * @property {number} float=0 Float default\n * @property {number} int32=0 Int32 default\n * @property {number} uint32=0 Uint32 default\n * @property {number} sint32=0 Sint32 default\n * @property {number} fixed32=0 Fixed32 default\n * @property {number} sfixed32=0 Sfixed32 default\n * @property {number} int64=0 Int64 default\n * @property {number} uint64=0 Uint64 default\n * @property {number} sint64=0 Sint32 default\n * @property {number} fixed64=0 Fixed64 default\n * @property {number} sfixed64=0 Sfixed64 default\n * @property {boolean} bool=false Bool default\n * @property {string} string=\"\" String default\n * @property {Array.<number>} bytes=Array(0) Bytes default\n * @property {null} message=null Message default\n */\ntypes.defaults = bake([\n /* double */ 0,\n /* float */ 0,\n /* int32 */ 0,\n /* uint32 */ 0,\n /* sint32 */ 0,\n /* fixed32 */ 0,\n /* sfixed32 */ 0,\n /* int64 */ 0,\n /* uint64 */ 0,\n /* sint64 */ 0,\n /* fixed64 */ 0,\n /* sfixed64 */ 0,\n /* bool */ false,\n /* string */ \"\",\n /* bytes */ util.emptyArray,\n /* message */ null\n]);\n\n/**\n * Basic long type wire types.\n * @type {Object.<string,number>}\n * @const\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n */\ntypes.long = bake([\n /* int64 */ 0,\n /* uint64 */ 0,\n /* sint64 */ 0,\n /* fixed64 */ 1,\n /* sfixed64 */ 1\n], 7);\n\n/**\n * Allowed types for map keys with their associated wire type.\n * @type {Object.<string,number>}\n * @const\n * @property {number} int32=0 Varint wire type\n * @property {number} uint32=0 Varint wire type\n * @property {number} sint32=0 Varint wire type\n * @property {number} fixed32=5 Fixed32 wire type\n * @property {number} sfixed32=5 Fixed32 wire type\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n * @property {number} bool=0 Varint wire type\n * @property {number} string=2 Ldelim wire type\n */\ntypes.mapKey = bake([\n /* int32 */ 0,\n /* uint32 */ 0,\n /* sint32 */ 0,\n /* fixed32 */ 5,\n /* sfixed32 */ 5,\n /* int64 */ 0,\n /* uint64 */ 0,\n /* sint64 */ 0,\n /* fixed64 */ 1,\n /* sfixed64 */ 1,\n /* bool */ 0,\n /* string */ 2\n], 2);\n\n/**\n * Allowed types for packed repeated fields with their associated wire type.\n * @type {Object.<string,number>}\n * @const\n * @property {number} double=1 Fixed64 wire type\n * @property {number} float=5 Fixed32 wire type\n * @property {number} int32=0 Varint wire type\n * @property {number} uint32=0 Varint wire type\n * @property {number} sint32=0 Varint wire type\n * @property {number} fixed32=5 Fixed32 wire type\n * @property {number} sfixed32=5 Fixed32 wire type\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n * @property {number} bool=0 Varint wire type\n */\ntypes.packed = bake([\n /* double */ 1,\n /* float */ 5,\n /* int32 */ 0,\n /* uint32 */ 0,\n /* sint32 */ 0,\n /* fixed32 */ 5,\n /* sfixed32 */ 5,\n /* int64 */ 0,\n /* uint64 */ 0,\n /* sint64 */ 0,\n /* fixed64 */ 1,\n /* sfixed64 */ 1,\n /* bool */ 0\n]);\n",
38
+ "\"use strict\";\nmodule.exports = Field;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\n((Field.prototype = Object.create(ReflectionObject.prototype)).constructor = Field).className = \"Field\";\n\nvar Enum = require(\"./enum\"),\n types = require(\"./types\"),\n util = require(\"./util\");\n\nvar Type; // cyclic\n\nvar ruleRe = /^required|optional|repeated$/;\n\n/**\n * Constructs a new message field instance. Note that {@link MapField|map fields} have their own class.\n * @name Field\n * @classdesc Reflected message field.\n * @extends FieldBase\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {number} id Unique id within its namespace\n * @param {string} type Value type\n * @param {string|Object.<string,*>} [rule=\"optional\"] Field rule\n * @param {string|Object.<string,*>} [extend] Extended type if different from parent\n * @param {Object.<string,*>} [options] Declared options\n */\n\n/**\n * Constructs a field from a field descriptor.\n * @param {string} name Field name\n * @param {IField} json Field descriptor\n * @returns {Field} Created field\n * @throws {TypeError} If arguments are invalid\n */\nField.fromJSON = function fromJSON(name, json) {\n var field = new Field(name, json.id, json.type, json.rule, json.extend, json.options, json.comment);\n if (json.edition)\n field._edition = json.edition;\n field._defaultEdition = \"proto3\"; // For backwards-compatibility.\n return field;\n};\n\n/**\n * Not an actual constructor. Use {@link Field} instead.\n * @classdesc Base class of all reflected message fields. This is not an actual class but here for the sake of having consistent type definitions.\n * @exports FieldBase\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {number} id Unique id within its namespace\n * @param {string} type Value type\n * @param {string|Object.<string,*>} [rule=\"optional\"] Field rule\n * @param {string|Object.<string,*>} [extend] Extended type if different from parent\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] Comment associated with this field\n */\nfunction Field(name, id, type, rule, extend, options, comment) {\n\n if (util.isObject(rule)) {\n comment = extend;\n options = rule;\n rule = extend = undefined;\n } else if (util.isObject(extend)) {\n comment = options;\n options = extend;\n extend = undefined;\n }\n\n ReflectionObject.call(this, name, options);\n\n if (!util.isInteger(id) || id < 0)\n throw TypeError(\"id must be a non-negative integer\");\n\n if (!util.isString(type))\n throw TypeError(\"type must be a string\");\n\n if (rule !== undefined && !ruleRe.test(rule = rule.toString().toLowerCase()))\n throw TypeError(\"rule must be a string rule\");\n\n if (extend !== undefined && !util.isString(extend))\n throw TypeError(\"extend must be a string\");\n\n /**\n * Field rule, if any.\n * @type {string|undefined}\n */\n if (rule === \"proto3_optional\") {\n rule = \"optional\";\n }\n this.rule = rule && rule !== \"optional\" ? rule : undefined; // toJSON\n\n /**\n * Field type.\n * @type {string}\n */\n this.type = type; // toJSON\n\n /**\n * Unique field id.\n * @type {number}\n */\n this.id = id; // toJSON, marker\n\n /**\n * Extended type if different from parent.\n * @type {string|undefined}\n */\n this.extend = extend || undefined; // toJSON\n\n /**\n * Whether this field is repeated.\n * @type {boolean}\n */\n this.repeated = rule === \"repeated\";\n\n /**\n * Whether this field is a map or not.\n * @type {boolean}\n */\n this.map = false;\n\n /**\n * Message this field belongs to.\n * @type {Type|null}\n */\n this.message = null;\n\n /**\n * OneOf this field belongs to, if any,\n * @type {OneOf|null}\n */\n this.partOf = null;\n\n /**\n * The field type's default value.\n * @type {*}\n */\n this.typeDefault = null;\n\n /**\n * The field's default value on prototypes.\n * @type {*}\n */\n this.defaultValue = null;\n\n /**\n * Whether this field's value should be treated as a long.\n * @type {boolean}\n */\n this.long = util.Long ? types.long[type] !== undefined : /* istanbul ignore next */ false;\n\n /**\n * Whether this field's value is a buffer.\n * @type {boolean}\n */\n this.bytes = type === \"bytes\";\n\n /**\n * Resolved type if not a basic type.\n * @type {Type|Enum|null}\n */\n this.resolvedType = null;\n\n /**\n * Sister-field within the extended type if a declaring extension field.\n * @type {Field|null}\n */\n this.extensionField = null;\n\n /**\n * Sister-field within the declaring namespace if an extended field.\n * @type {Field|null}\n */\n this.declaringField = null;\n\n /**\n * Comment for this field.\n * @type {string|null}\n */\n this.comment = comment;\n}\n\n/**\n * Determines whether this field is required.\n * @name Field#required\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"required\", {\n get: function() {\n return this._features.field_presence === \"LEGACY_REQUIRED\";\n }\n});\n\n/**\n * Determines whether this field is not required.\n * @name Field#optional\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"optional\", {\n get: function() {\n return !this.required;\n }\n});\n\n/**\n * Determines whether this field uses tag-delimited encoding. In proto2 this\n * corresponded to group syntax.\n * @name Field#delimited\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"delimited\", {\n get: function() {\n return this.resolvedType instanceof Type &&\n this._features.message_encoding === \"DELIMITED\";\n }\n});\n\n/**\n * Determines whether this field is packed. Only relevant when repeated.\n * @name Field#packed\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"packed\", {\n get: function() {\n return this._features.repeated_field_encoding === \"PACKED\";\n }\n});\n\n/**\n * Determines whether this field tracks presence.\n * @name Field#hasPresence\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"hasPresence\", {\n get: function() {\n if (this.repeated || this.map) {\n return false;\n }\n return this.partOf || // oneofs\n this.declaringField || this.extensionField || // extensions\n this._features.field_presence !== \"IMPLICIT\";\n }\n});\n\n/**\n * @override\n */\nField.prototype.setOption = function setOption(name, value, ifNotSet) {\n return ReflectionObject.prototype.setOption.call(this, name, value, ifNotSet);\n};\n\n/**\n * Field descriptor.\n * @interface IField\n * @property {string} [rule=\"optional\"] Field rule\n * @property {string} type Field type\n * @property {number} id Field id\n * @property {Object.<string,*>} [options] Field options\n */\n\n/**\n * Extension field descriptor.\n * @interface IExtensionField\n * @extends IField\n * @property {string} extend Extended type\n */\n\n/**\n * Converts this field to a field descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IField} Field descriptor\n */\nField.prototype.toJSON = function toJSON(toJSONOptions) {\n var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n return util.toObject([\n \"edition\" , this._editionToJSON(),\n \"rule\" , this.rule !== \"optional\" && this.rule || undefined,\n \"type\" , this.type,\n \"id\" , this.id,\n \"extend\" , this.extend,\n \"options\" , this.options,\n \"comment\" , keepComments ? this.comment : undefined\n ]);\n};\n\n/**\n * Resolves this field's type references.\n * @returns {Field} `this`\n * @throws {Error} If any reference cannot be resolved\n */\nField.prototype.resolve = function resolve() {\n\n if (this.resolved)\n return this;\n\n if ((this.typeDefault = types.defaults[this.type]) === undefined) { // if not a basic type, resolve it\n this.resolvedType = (this.declaringField ? this.declaringField.parent : this.parent).lookupTypeOrEnum(this.type);\n if (this.resolvedType instanceof Type)\n this.typeDefault = null;\n else // instanceof Enum\n this.typeDefault = this.resolvedType.values[Object.keys(this.resolvedType.values)[0]]; // first defined\n } else if (this.options && this.options.proto3_optional) {\n // proto3 scalar value marked optional; should default to null\n this.typeDefault = null;\n }\n\n // use explicitly set default value if present\n if (this.options && this.options[\"default\"] != null) {\n this.typeDefault = this.options[\"default\"];\n if (this.resolvedType instanceof Enum && typeof this.typeDefault === \"string\")\n this.typeDefault = this.resolvedType.values[this.typeDefault];\n }\n\n // remove unnecessary options\n if (this.options) {\n if (this.options.packed !== undefined && this.resolvedType && !(this.resolvedType instanceof Enum))\n delete this.options.packed;\n if (!Object.keys(this.options).length)\n this.options = undefined;\n }\n\n // convert to internal data type if necesssary\n if (this.long) {\n this.typeDefault = util.Long.fromNumber(this.typeDefault, this.type.charAt(0) === \"u\");\n\n /* istanbul ignore else */\n if (Object.freeze)\n Object.freeze(this.typeDefault); // long instances are meant to be immutable anyway (i.e. use small int cache that even requires it)\n\n } else if (this.bytes && typeof this.typeDefault === \"string\") {\n var buf;\n if (util.base64.test(this.typeDefault))\n util.base64.decode(this.typeDefault, buf = util.newBuffer(util.base64.length(this.typeDefault)), 0);\n else\n util.utf8.write(this.typeDefault, buf = util.newBuffer(util.utf8.length(this.typeDefault)), 0);\n this.typeDefault = buf;\n }\n\n // take special care of maps and repeated fields\n if (this.map)\n this.defaultValue = util.emptyObject;\n else if (this.repeated)\n this.defaultValue = util.emptyArray;\n else\n this.defaultValue = this.typeDefault;\n\n // ensure proper value on prototype\n if (this.parent instanceof Type)\n this.parent.ctor.prototype[this.name] = this.defaultValue;\n\n return ReflectionObject.prototype.resolve.call(this);\n};\n\n/**\n * Infers field features from legacy syntax that may have been specified differently.\n * in older editions.\n * @param {string|undefined} edition The edition this proto is on, or undefined if pre-editions\n * @returns {object} The feature values to override\n */\nField.prototype._inferLegacyProtoFeatures = function _inferLegacyProtoFeatures(edition) {\n if (edition !== \"proto2\" && edition !== \"proto3\") {\n return {};\n }\n\n var features = {};\n\n if (this.rule === \"required\") {\n features.field_presence = \"LEGACY_REQUIRED\";\n }\n if (this.parent && types.defaults[this.type] === undefined) {\n // We can't use resolvedType because types may not have been resolved yet. However,\n // legacy groups are always in the same scope as the field so we don't have to do a\n // full scan of the tree.\n var type = this.parent.get(this.type.split(\".\").pop());\n if (type && type instanceof Type && type.group) {\n features.message_encoding = \"DELIMITED\";\n }\n }\n if (this.getOption(\"packed\") === true) {\n features.repeated_field_encoding = \"PACKED\";\n } else if (this.getOption(\"packed\") === false) {\n features.repeated_field_encoding = \"EXPANDED\";\n }\n return features;\n};\n\n/**\n * @override\n */\nField.prototype._resolveFeatures = function _resolveFeatures(edition) {\n return ReflectionObject.prototype._resolveFeatures.call(this, this._edition || edition);\n};\n\n/**\n * Decorator function as returned by {@link Field.d} and {@link MapField.d} (TypeScript).\n * @typedef FieldDecorator\n * @type {function}\n * @param {Object} prototype Target prototype\n * @param {string} fieldName Field name\n * @returns {undefined}\n */\n\n/**\n * Field decorator (TypeScript).\n * @name Field.d\n * @function\n * @param {number} fieldId Field id\n * @param {\"double\"|\"float\"|\"int32\"|\"uint32\"|\"sint32\"|\"fixed32\"|\"sfixed32\"|\"int64\"|\"uint64\"|\"sint64\"|\"fixed64\"|\"sfixed64\"|\"string\"|\"bool\"|\"bytes\"|Object} fieldType Field type\n * @param {\"optional\"|\"required\"|\"repeated\"} [fieldRule=\"optional\"] Field rule\n * @param {T} [defaultValue] Default value\n * @returns {FieldDecorator} Decorator function\n * @template T extends number | number[] | Long | Long[] | string | string[] | boolean | boolean[] | Uint8Array | Uint8Array[] | Buffer | Buffer[]\n */\nField.d = function decorateField(fieldId, fieldType, fieldRule, defaultValue) {\n\n // submessage: decorate the submessage and use its name as the type\n if (typeof fieldType === \"function\")\n fieldType = util.decorateType(fieldType).name;\n\n // enum reference: create a reflected copy of the enum and keep reuseing it\n else if (fieldType && typeof fieldType === \"object\")\n fieldType = util.decorateEnum(fieldType).name;\n\n return function fieldDecorator(prototype, fieldName) {\n util.decorateType(prototype.constructor)\n .add(new Field(fieldName, fieldId, fieldType, fieldRule, { \"default\": defaultValue }));\n };\n};\n\n/**\n * Field decorator (TypeScript).\n * @name Field.d\n * @function\n * @param {number} fieldId Field id\n * @param {Constructor<T>|string} fieldType Field type\n * @param {\"optional\"|\"required\"|\"repeated\"} [fieldRule=\"optional\"] Field rule\n * @returns {FieldDecorator} Decorator function\n * @template T extends Message<T>\n * @variation 2\n */\n// like Field.d but without a default value\n\n// Sets up cyclic dependencies (called in index-light)\nField._configure = function configure(Type_) {\n Type = Type_;\n};\n",
39
+ "\"use strict\";\nmodule.exports = OneOf;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\n((OneOf.prototype = Object.create(ReflectionObject.prototype)).constructor = OneOf).className = \"OneOf\";\n\nvar Field = require(\"./field\"),\n util = require(\"./util\");\n\n/**\n * Constructs a new oneof instance.\n * @classdesc Reflected oneof.\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Oneof name\n * @param {string[]|Object.<string,*>} [fieldNames] Field names\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] Comment associated with this field\n */\nfunction OneOf(name, fieldNames, options, comment) {\n if (!Array.isArray(fieldNames)) {\n options = fieldNames;\n fieldNames = undefined;\n }\n ReflectionObject.call(this, name, options);\n\n /* istanbul ignore if */\n if (!(fieldNames === undefined || Array.isArray(fieldNames)))\n throw TypeError(\"fieldNames must be an Array\");\n\n /**\n * Field names that belong to this oneof.\n * @type {string[]}\n */\n this.oneof = fieldNames || []; // toJSON, marker\n\n /**\n * Fields that belong to this oneof as an array for iteration.\n * @type {Field[]}\n * @readonly\n */\n this.fieldsArray = []; // declared readonly for conformance, possibly not yet added to parent\n\n /**\n * Comment for this field.\n * @type {string|null}\n */\n this.comment = comment;\n}\n\n/**\n * Oneof descriptor.\n * @interface IOneOf\n * @property {Array.<string>} oneof Oneof field names\n * @property {Object.<string,*>} [options] Oneof options\n */\n\n/**\n * Constructs a oneof from a oneof descriptor.\n * @param {string} name Oneof name\n * @param {IOneOf} json Oneof descriptor\n * @returns {OneOf} Created oneof\n * @throws {TypeError} If arguments are invalid\n */\nOneOf.fromJSON = function fromJSON(name, json) {\n return new OneOf(name, json.oneof, json.options, json.comment);\n};\n\n/**\n * Converts this oneof to a oneof descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IOneOf} Oneof descriptor\n */\nOneOf.prototype.toJSON = function toJSON(toJSONOptions) {\n var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n return util.toObject([\n \"options\" , this.options,\n \"oneof\" , this.oneof,\n \"comment\" , keepComments ? this.comment : undefined\n ]);\n};\n\n/**\n * Adds the fields of the specified oneof to the parent if not already done so.\n * @param {OneOf} oneof The oneof\n * @returns {undefined}\n * @inner\n * @ignore\n */\nfunction addFieldsToParent(oneof) {\n if (oneof.parent)\n for (var i = 0; i < oneof.fieldsArray.length; ++i)\n if (!oneof.fieldsArray[i].parent)\n oneof.parent.add(oneof.fieldsArray[i]);\n}\n\n/**\n * Adds a field to this oneof and removes it from its current parent, if any.\n * @param {Field} field Field to add\n * @returns {OneOf} `this`\n */\nOneOf.prototype.add = function add(field) {\n\n /* istanbul ignore if */\n if (!(field instanceof Field))\n throw TypeError(\"field must be a Field\");\n\n if (field.parent && field.parent !== this.parent)\n field.parent.remove(field);\n this.oneof.push(field.name);\n this.fieldsArray.push(field);\n field.partOf = this; // field.parent remains null\n addFieldsToParent(this);\n return this;\n};\n\n/**\n * Removes a field from this oneof and puts it back to the oneof's parent.\n * @param {Field} field Field to remove\n * @returns {OneOf} `this`\n */\nOneOf.prototype.remove = function remove(field) {\n\n /* istanbul ignore if */\n if (!(field instanceof Field))\n throw TypeError(\"field must be a Field\");\n\n var index = this.fieldsArray.indexOf(field);\n\n /* istanbul ignore if */\n if (index < 0)\n throw Error(field + \" is not a member of \" + this);\n\n this.fieldsArray.splice(index, 1);\n index = this.oneof.indexOf(field.name);\n\n /* istanbul ignore else */\n if (index > -1) // theoretical\n this.oneof.splice(index, 1);\n\n field.partOf = null;\n return this;\n};\n\n/**\n * @override\n */\nOneOf.prototype.onAdd = function onAdd(parent) {\n ReflectionObject.prototype.onAdd.call(this, parent);\n var self = this;\n // Collect present fields\n for (var i = 0; i < this.oneof.length; ++i) {\n var field = parent.get(this.oneof[i]);\n if (field && !field.partOf) {\n field.partOf = self;\n self.fieldsArray.push(field);\n }\n }\n // Add not yet present fields\n addFieldsToParent(this);\n};\n\n/**\n * @override\n */\nOneOf.prototype.onRemove = function onRemove(parent) {\n for (var i = 0, field; i < this.fieldsArray.length; ++i)\n if ((field = this.fieldsArray[i]).parent)\n field.parent.remove(field);\n ReflectionObject.prototype.onRemove.call(this, parent);\n};\n\n/**\n * Determines whether this field corresponds to a synthetic oneof created for\n * a proto3 optional field. No behavioral logic should depend on this, but it\n * can be relevant for reflection.\n * @name OneOf#isProto3Optional\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(OneOf.prototype, \"isProto3Optional\", {\n get: function() {\n if (this.fieldsArray == null || this.fieldsArray.length !== 1) {\n return false;\n }\n\n var field = this.fieldsArray[0];\n return field.options != null && field.options[\"proto3_optional\"] === true;\n }\n});\n\n/**\n * Decorator function as returned by {@link OneOf.d} (TypeScript).\n * @typedef OneOfDecorator\n * @type {function}\n * @param {Object} prototype Target prototype\n * @param {string} oneofName OneOf name\n * @returns {undefined}\n */\n\n/**\n * OneOf decorator (TypeScript).\n * @function\n * @param {...string} fieldNames Field names\n * @returns {OneOfDecorator} Decorator function\n * @template T extends string\n */\nOneOf.d = function decorateOneOf() {\n var fieldNames = new Array(arguments.length),\n index = 0;\n while (index < arguments.length)\n fieldNames[index] = arguments[index++];\n return function oneOfDecorator(prototype, oneofName) {\n util.decorateType(prototype.constructor)\n .add(new OneOf(oneofName, fieldNames));\n Object.defineProperty(prototype, oneofName, {\n get: util.oneOfGetter(fieldNames),\n set: util.oneOfSetter(fieldNames)\n });\n };\n};\n",
40
+ "\"use strict\";\nmodule.exports = ReflectionObject;\n\nReflectionObject.className = \"ReflectionObject\";\n\nconst OneOf = require(\"./oneof\");\nvar util = require(\"./util\");\n\nvar Root; // cyclic\n\n/* eslint-disable no-warning-comments */\n// TODO: Replace with embedded proto.\nvar editions2024Defaults = {enum_type: \"OPEN\", field_presence: \"EXPLICIT\", json_format: \"ALLOW\", message_encoding: \"LENGTH_PREFIXED\", repeated_field_encoding: \"PACKED\", utf8_validation: \"VERIFY\", enforce_naming_style: \"STYLE2024\", default_symbol_visibility: \"EXPORT_TOP_LEVEL\" };\nvar editions2023Defaults = {enum_type: \"OPEN\", field_presence: \"EXPLICIT\", json_format: \"ALLOW\", message_encoding: \"LENGTH_PREFIXED\", repeated_field_encoding: \"PACKED\", utf8_validation: \"VERIFY\", enforce_naming_style: \"STYLE_LEGACY\", default_symbol_visibility: \"EXPORT_ALL\" };\nvar proto2Defaults = {enum_type: \"CLOSED\", field_presence: \"EXPLICIT\", json_format: \"LEGACY_BEST_EFFORT\", message_encoding: \"LENGTH_PREFIXED\", repeated_field_encoding: \"EXPANDED\", utf8_validation: \"NONE\", enforce_naming_style: \"STYLE_LEGACY\", default_symbol_visibility: \"EXPORT_ALL\" };\nvar proto3Defaults = {enum_type: \"OPEN\", field_presence: \"IMPLICIT\", json_format: \"ALLOW\", message_encoding: \"LENGTH_PREFIXED\", repeated_field_encoding: \"PACKED\", utf8_validation: \"VERIFY\", enforce_naming_style: \"STYLE_LEGACY\", default_symbol_visibility: \"EXPORT_ALL\" };\n\n/**\n * Constructs a new reflection object instance.\n * @classdesc Base class of all reflection objects.\n * @constructor\n * @param {string} name Object name\n * @param {Object.<string,*>} [options] Declared options\n * @abstract\n */\nfunction ReflectionObject(name, options) {\n\n if (!util.isString(name))\n throw TypeError(\"name must be a string\");\n\n if (options && !util.isObject(options))\n throw TypeError(\"options must be an object\");\n\n /**\n * Options.\n * @type {Object.<string,*>|undefined}\n */\n this.options = options; // toJSON\n\n /**\n * Parsed Options.\n * @type {Array.<Object.<string,*>>|undefined}\n */\n this.parsedOptions = null;\n\n /**\n * Unique name within its namespace.\n * @type {string}\n */\n this.name = name;\n\n /**\n * The edition specified for this object. Only relevant for top-level objects.\n * @type {string}\n * @private\n */\n this._edition = null;\n\n /**\n * The default edition to use for this object if none is specified. For legacy reasons,\n * this is proto2 except in the JSON parsing case where it was proto3.\n * @type {string}\n * @private\n */\n this._defaultEdition = \"proto2\";\n\n /**\n * Resolved Features.\n * @type {object}\n * @private\n */\n this._features = {};\n\n /**\n * Whether or not features have been resolved.\n * @type {boolean}\n * @private\n */\n this._featuresResolved = false;\n\n /**\n * Parent namespace.\n * @type {Namespace|null}\n */\n this.parent = null;\n\n /**\n * Whether already resolved or not.\n * @type {boolean}\n */\n this.resolved = false;\n\n /**\n * Comment text, if any.\n * @type {string|null}\n */\n this.comment = null;\n\n /**\n * Defining file name.\n * @type {string|null}\n */\n this.filename = null;\n}\n\nObject.defineProperties(ReflectionObject.prototype, {\n\n /**\n * Reference to the root namespace.\n * @name ReflectionObject#root\n * @type {Root}\n * @readonly\n */\n root: {\n get: function() {\n var ptr = this;\n while (ptr.parent !== null)\n ptr = ptr.parent;\n return ptr;\n }\n },\n\n /**\n * Full name including leading dot.\n * @name ReflectionObject#fullName\n * @type {string}\n * @readonly\n */\n fullName: {\n get: function() {\n var path = [ this.name ],\n ptr = this.parent;\n while (ptr) {\n path.unshift(ptr.name);\n ptr = ptr.parent;\n }\n return path.join(\".\");\n }\n }\n});\n\n/**\n * Converts this reflection object to its descriptor representation.\n * @returns {Object.<string,*>} Descriptor\n * @abstract\n */\nReflectionObject.prototype.toJSON = /* istanbul ignore next */ function toJSON() {\n throw Error(); // not implemented, shouldn't happen\n};\n\n/**\n * Called when this object is added to a parent.\n * @param {ReflectionObject} parent Parent added to\n * @returns {undefined}\n */\nReflectionObject.prototype.onAdd = function onAdd(parent) {\n if (this.parent && this.parent !== parent)\n this.parent.remove(this);\n this.parent = parent;\n this.resolved = false;\n var root = parent.root;\n if (root instanceof Root)\n root._handleAdd(this);\n};\n\n/**\n * Called when this object is removed from a parent.\n * @param {ReflectionObject} parent Parent removed from\n * @returns {undefined}\n */\nReflectionObject.prototype.onRemove = function onRemove(parent) {\n var root = parent.root;\n if (root instanceof Root)\n root._handleRemove(this);\n this.parent = null;\n this.resolved = false;\n};\n\n/**\n * Resolves this objects type references.\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.resolve = function resolve() {\n if (this.resolved)\n return this;\n if (this.root instanceof Root)\n this.resolved = true; // only if part of a root\n return this;\n};\n\n/**\n * Resolves this objects editions features.\n * @param {string} edition The edition we're currently resolving for.\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype._resolveFeaturesRecursive = function _resolveFeaturesRecursive(edition) {\n return this._resolveFeatures(this._edition || edition);\n};\n\n/**\n * Resolves child features from parent features\n * @param {string} edition The edition we're currently resolving for.\n * @returns {undefined}\n */\nReflectionObject.prototype._resolveFeatures = function _resolveFeatures(edition) {\n if (this._featuresResolved) {\n return;\n }\n\n var defaults = {};\n\n /* istanbul ignore if */\n if (!edition) {\n throw new Error(\"Unknown edition for \" + this.fullName);\n }\n\n var protoFeatures = Object.assign(this.options ? Object.assign({}, this.options.features) : {},\n this._inferLegacyProtoFeatures(edition));\n\n if (this._edition) {\n // For a namespace marked with a specific edition, reset defaults.\n /* istanbul ignore else */\n if (edition === \"proto2\") {\n defaults = Object.assign({}, proto2Defaults);\n } else if (edition === \"proto3\") {\n defaults = Object.assign({}, proto3Defaults);\n } else if (edition === \"2023\") {\n defaults = Object.assign({}, editions2023Defaults);\n } else if (edition === \"2024\") {\n defaults = Object.assign({}, editions2024Defaults);\n } else {\n throw new Error(\"Unknown edition: \" + edition);\n }\n this._features = Object.assign(defaults, protoFeatures || {});\n this._featuresResolved = true;\n return;\n }\n\n // fields in Oneofs aren't actually children of them, so we have to\n // special-case it\n /* istanbul ignore else */\n if (this.partOf instanceof OneOf) {\n var lexicalParentFeaturesCopy = Object.assign({}, this.partOf._features);\n this._features = Object.assign(lexicalParentFeaturesCopy, protoFeatures || {});\n } else if (this.declaringField) {\n // Skip feature resolution of sister fields.\n } else if (this.parent) {\n var parentFeaturesCopy = Object.assign({}, this.parent._features);\n this._features = Object.assign(parentFeaturesCopy, protoFeatures || {});\n } else {\n throw new Error(\"Unable to find a parent for \" + this.fullName);\n }\n if (this.extensionField) {\n // Sister fields should have the same features as their extensions.\n this.extensionField._features = this._features;\n }\n this._featuresResolved = true;\n};\n\n/**\n * Infers features from legacy syntax that may have been specified differently.\n * in older editions.\n * @param {string|undefined} edition The edition this proto is on, or undefined if pre-editions\n * @returns {object} The feature values to override\n */\nReflectionObject.prototype._inferLegacyProtoFeatures = function _inferLegacyProtoFeatures(/*edition*/) {\n return {};\n};\n\n/**\n * Gets an option value.\n * @param {string} name Option name\n * @returns {*} Option value or `undefined` if not set\n */\nReflectionObject.prototype.getOption = function getOption(name) {\n if (this.options)\n return this.options[name];\n return undefined;\n};\n\n/**\n * Sets an option.\n * @param {string} name Option name\n * @param {*} value Option value\n * @param {boolean|undefined} [ifNotSet] Sets the option only if it isn't currently set\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.setOption = function setOption(name, value, ifNotSet) {\n if (!this.options)\n this.options = {};\n if (/^features\\./.test(name)) {\n util.setProperty(this.options, name, value, ifNotSet);\n } else if (!ifNotSet || this.options[name] === undefined) {\n if (this.getOption(name) !== value) this.resolved = false;\n this.options[name] = value;\n }\n\n return this;\n};\n\n/**\n * Sets a parsed option.\n * @param {string} name parsed Option name\n * @param {*} value Option value\n * @param {string} propName dot '.' delimited full path of property within the option to set. if undefined\\empty, will add a new option with that value\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.setParsedOption = function setParsedOption(name, value, propName) {\n if (!this.parsedOptions) {\n this.parsedOptions = [];\n }\n var parsedOptions = this.parsedOptions;\n if (propName) {\n // If setting a sub property of an option then try to merge it\n // with an existing option\n var opt = parsedOptions.find(function (opt) {\n return Object.prototype.hasOwnProperty.call(opt, name);\n });\n if (opt) {\n // If we found an existing option - just merge the property value\n // (If it's a feature, will just write over)\n var newValue = opt[name];\n util.setProperty(newValue, propName, value);\n } else {\n // otherwise, create a new option, set its property and add it to the list\n opt = {};\n opt[name] = util.setProperty({}, propName, value);\n parsedOptions.push(opt);\n }\n } else {\n // Always create a new option when setting the value of the option itself\n var newOpt = {};\n newOpt[name] = value;\n parsedOptions.push(newOpt);\n }\n\n return this;\n};\n\n/**\n * Sets multiple options.\n * @param {Object.<string,*>} options Options to set\n * @param {boolean} [ifNotSet] Sets an option only if it isn't currently set\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.setOptions = function setOptions(options, ifNotSet) {\n if (options)\n for (var keys = Object.keys(options), i = 0; i < keys.length; ++i)\n this.setOption(keys[i], options[keys[i]], ifNotSet);\n return this;\n};\n\n/**\n * Converts this instance to its string representation.\n * @returns {string} Class name[, space, full name]\n */\nReflectionObject.prototype.toString = function toString() {\n var className = this.constructor.className,\n fullName = this.fullName;\n if (fullName.length)\n return className + \" \" + fullName;\n return className;\n};\n\n/**\n * Converts the edition this object is pinned to for JSON format.\n * @returns {string|undefined} The edition string for JSON representation\n */\nReflectionObject.prototype._editionToJSON = function _editionToJSON() {\n if (!this._edition || this._edition === \"proto3\") {\n // Avoid emitting proto3 since we need to default to it for backwards\n // compatibility anyway.\n return undefined;\n }\n return this._edition;\n};\n\n// Sets up cyclic dependencies (called in index-light)\nReflectionObject._configure = function(Root_) {\n Root = Root_;\n};\n",
41
+ "\"use strict\";\nmodule.exports = Enum;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\n((Enum.prototype = Object.create(ReflectionObject.prototype)).constructor = Enum).className = \"Enum\";\n\nvar Namespace = require(\"./namespace\"),\n util = require(\"./util\");\n\n/**\n * Constructs a new enum instance.\n * @classdesc Reflected enum.\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {Object.<string,number>} [values] Enum values as an object, by name\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] The comment for this enum\n * @param {Object.<string,string>} [comments] The value comments for this enum\n * @param {Object.<string,Object<string,*>>|undefined} [valuesOptions] The value options for this enum\n */\nfunction Enum(name, values, options, comment, comments, valuesOptions) {\n ReflectionObject.call(this, name, options);\n\n if (values && typeof values !== \"object\")\n throw TypeError(\"values must be an object\");\n\n /**\n * Enum values by id.\n * @type {Object.<number,string>}\n */\n this.valuesById = {};\n\n /**\n * Enum values by name.\n * @type {Object.<string,number>}\n */\n this.values = Object.create(this.valuesById); // toJSON, marker\n\n /**\n * Enum comment text.\n * @type {string|null}\n */\n this.comment = comment;\n\n /**\n * Value comment texts, if any.\n * @type {Object.<string,string>}\n */\n this.comments = comments || {};\n\n /**\n * Values options, if any\n * @type {Object<string, Object<string, *>>|undefined}\n */\n this.valuesOptions = valuesOptions;\n\n /**\n * Resolved values features, if any\n * @type {Object<string, Object<string, *>>|undefined}\n */\n this._valuesFeatures = {};\n\n /**\n * Reserved ranges, if any.\n * @type {Array.<number[]|string>}\n */\n this.reserved = undefined; // toJSON\n\n // Note that values inherit valuesById on their prototype which makes them a TypeScript-\n // compatible enum. This is used by pbts to write actual enum definitions that work for\n // static and reflection code alike instead of emitting generic object definitions.\n\n if (values)\n for (var keys = Object.keys(values), i = 0; i < keys.length; ++i)\n if (typeof values[keys[i]] === \"number\") // use forward entries only\n this.valuesById[ this.values[keys[i]] = values[keys[i]] ] = keys[i];\n}\n\n/**\n * @override\n */\nEnum.prototype._resolveFeatures = function _resolveFeatures(edition) {\n edition = this._edition || edition;\n ReflectionObject.prototype._resolveFeatures.call(this, edition);\n\n Object.keys(this.values).forEach(key => {\n var parentFeaturesCopy = Object.assign({}, this._features);\n this._valuesFeatures[key] = Object.assign(parentFeaturesCopy, this.valuesOptions && this.valuesOptions[key] && this.valuesOptions[key].features);\n });\n\n return this;\n};\n\n/**\n * Enum descriptor.\n * @interface IEnum\n * @property {Object.<string,number>} values Enum values\n * @property {Object.<string,*>} [options] Enum options\n */\n\n/**\n * Constructs an enum from an enum descriptor.\n * @param {string} name Enum name\n * @param {IEnum} json Enum descriptor\n * @returns {Enum} Created enum\n * @throws {TypeError} If arguments are invalid\n */\nEnum.fromJSON = function fromJSON(name, json) {\n var enm = new Enum(name, json.values, json.options, json.comment, json.comments);\n enm.reserved = json.reserved;\n if (json.edition)\n enm._edition = json.edition;\n enm._defaultEdition = \"proto3\"; // For backwards-compatibility.\n return enm;\n};\n\n/**\n * Converts this enum to an enum descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IEnum} Enum descriptor\n */\nEnum.prototype.toJSON = function toJSON(toJSONOptions) {\n var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n return util.toObject([\n \"edition\" , this._editionToJSON(),\n \"options\" , this.options,\n \"valuesOptions\" , this.valuesOptions,\n \"values\" , this.values,\n \"reserved\" , this.reserved && this.reserved.length ? this.reserved : undefined,\n \"comment\" , keepComments ? this.comment : undefined,\n \"comments\" , keepComments ? this.comments : undefined\n ]);\n};\n\n/**\n * Adds a value to this enum.\n * @param {string} name Value name\n * @param {number} id Value id\n * @param {string} [comment] Comment, if any\n * @param {Object.<string, *>|undefined} [options] Options, if any\n * @returns {Enum} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If there is already a value with this name or id\n */\nEnum.prototype.add = function add(name, id, comment, options) {\n // utilized by the parser but not by .fromJSON\n\n if (!util.isString(name))\n throw TypeError(\"name must be a string\");\n\n if (!util.isInteger(id))\n throw TypeError(\"id must be an integer\");\n\n if (this.values[name] !== undefined)\n throw Error(\"duplicate name '\" + name + \"' in \" + this);\n\n if (this.isReservedId(id))\n throw Error(\"id \" + id + \" is reserved in \" + this);\n\n if (this.isReservedName(name))\n throw Error(\"name '\" + name + \"' is reserved in \" + this);\n\n if (this.valuesById[id] !== undefined) {\n if (!(this.options && this.options.allow_alias))\n throw Error(\"duplicate id \" + id + \" in \" + this);\n this.values[name] = id;\n } else\n this.valuesById[this.values[name] = id] = name;\n\n if (options) {\n if (this.valuesOptions === undefined)\n this.valuesOptions = {};\n this.valuesOptions[name] = options || null;\n }\n\n this.comments[name] = comment || null;\n return this;\n};\n\n/**\n * Removes a value from this enum\n * @param {string} name Value name\n * @returns {Enum} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If `name` is not a name of this enum\n */\nEnum.prototype.remove = function remove(name) {\n\n if (!util.isString(name))\n throw TypeError(\"name must be a string\");\n\n var val = this.values[name];\n if (val == null)\n throw Error(\"name '\" + name + \"' does not exist in \" + this);\n\n delete this.valuesById[val];\n delete this.values[name];\n delete this.comments[name];\n if (this.valuesOptions)\n delete this.valuesOptions[name];\n\n return this;\n};\n\n/**\n * Tests if the specified id is reserved.\n * @param {number} id Id to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nEnum.prototype.isReservedId = function isReservedId(id) {\n return Namespace.isReservedId(this.reserved, id);\n};\n\n/**\n * Tests if the specified name is reserved.\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nEnum.prototype.isReservedName = function isReservedName(name) {\n return Namespace.isReservedName(this.reserved, name);\n};\n",
42
+ "\"use strict\";\nmodule.exports = encoder;\n\nvar Enum = require(\"./enum\"),\n types = require(\"./types\"),\n util = require(\"./util\");\n\n/**\n * Generates a partial message type encoder.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {number} fieldIndex Field index\n * @param {string} ref Variable reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genTypePartial(gen, field, fieldIndex, ref) {\n return field.delimited\n ? gen(\"types[%i].encode(%s,w.uint32(%i)).uint32(%i)\", fieldIndex, ref, (field.id << 3 | 3) >>> 0, (field.id << 3 | 4) >>> 0)\n : gen(\"types[%i].encode(%s,w.uint32(%i).fork()).ldelim()\", fieldIndex, ref, (field.id << 3 | 2) >>> 0);\n}\n\n/**\n * Generates an encoder specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nfunction encoder(mtype) {\n /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n var gen = util.codegen([\"m\", \"w\"], mtype.name + \"$encode\")\n (\"if(!w)\")\n (\"w=Writer.create()\");\n\n var i, ref;\n\n // \"when a message is serialized its known fields should be written sequentially by field number\"\n var fields = /* initializes */ mtype.fieldsArray.slice().sort(util.compareFieldsById);\n\n for (var i = 0; i < fields.length; ++i) {\n var field = fields[i].resolve(),\n index = mtype._fieldsArray.indexOf(field),\n type = field.resolvedType instanceof Enum ? \"int32\" : field.type,\n wireType = types.basic[type];\n ref = \"m\" + util.safeProp(field.name);\n\n // Map fields\n if (field.map) {\n gen\n (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j)){\", ref, field.name) // !== undefined && !== null\n (\"for(var ks=Object.keys(%s),i=0;i<ks.length;++i){\", ref)\n (\"w.uint32(%i).fork().uint32(%i).%s(ks[i])\", (field.id << 3 | 2) >>> 0, 8 | types.mapKey[field.keyType], field.keyType);\n if (wireType === undefined) gen\n (\"types[%i].encode(%s[ks[i]],w.uint32(18).fork()).ldelim().ldelim()\", index, ref); // can't be groups\n else gen\n (\".uint32(%i).%s(%s[ks[i]]).ldelim()\", 16 | wireType, type, ref);\n gen\n (\"}\")\n (\"}\");\n\n // Repeated fields\n } else if (field.repeated) { gen\n (\"if(%s!=null&&%s.length){\", ref, ref); // !== undefined && !== null\n\n // Packed repeated\n if (field.packed && types.packed[type] !== undefined) { gen\n\n (\"w.uint32(%i).fork()\", (field.id << 3 | 2) >>> 0)\n (\"for(var i=0;i<%s.length;++i)\", ref)\n (\"w.%s(%s[i])\", type, ref)\n (\"w.ldelim()\");\n\n // Non-packed\n } else { gen\n\n (\"for(var i=0;i<%s.length;++i)\", ref);\n if (wireType === undefined)\n genTypePartial(gen, field, index, ref + \"[i]\");\n else gen\n (\"w.uint32(%i).%s(%s[i])\", (field.id << 3 | wireType) >>> 0, type, ref);\n\n } gen\n (\"}\");\n\n // Non-repeated\n } else {\n if (field.optional) gen\n (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j))\", ref, field.name); // !== undefined && !== null\n\n if (wireType === undefined)\n genTypePartial(gen, field, index, ref);\n else gen\n (\"w.uint32(%i).%s(%s)\", (field.id << 3 | wireType) >>> 0, type, ref);\n\n }\n }\n\n return gen\n (\"return w\");\n /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n}\n",
43
+ "\"use strict\";\nvar protobuf = module.exports = require(\"./index-minimal\");\n\nprotobuf.build = \"light\";\n\n/**\n * A node-style callback as used by {@link load} and {@link Root#load}.\n * @typedef LoadCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Root} [root] Root, if there hasn't been an error\n * @returns {undefined}\n */\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into a common root namespace and calls the callback.\n * @param {string|string[]} filename One or multiple files to load\n * @param {Root} root Root namespace, defaults to create a new one if omitted.\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n * @see {@link Root#load}\n */\nfunction load(filename, root, callback) {\n if (typeof root === \"function\") {\n callback = root;\n root = new protobuf.Root();\n } else if (!root)\n root = new protobuf.Root();\n return root.load(filename, callback);\n}\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into a common root namespace and calls the callback.\n * @name load\n * @function\n * @param {string|string[]} filename One or multiple files to load\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n * @see {@link Root#load}\n * @variation 2\n */\n// function load(filename:string, callback:LoadCallback):undefined\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into a common root namespace and returns a promise.\n * @name load\n * @function\n * @param {string|string[]} filename One or multiple files to load\n * @param {Root} [root] Root namespace, defaults to create a new one if omitted.\n * @returns {Promise<Root>} Promise\n * @see {@link Root#load}\n * @variation 3\n */\n// function load(filename:string, [root:Root]):Promise<Root>\n\nprotobuf.load = load;\n\n/**\n * Synchronously loads one or multiple .proto or preprocessed .json files into a common root namespace (node only).\n * @param {string|string[]} filename One or multiple files to load\n * @param {Root} [root] Root namespace, defaults to create a new one if omitted.\n * @returns {Root} Root namespace\n * @throws {Error} If synchronous fetching is not supported (i.e. in browsers) or if a file's syntax is invalid\n * @see {@link Root#loadSync}\n */\nfunction loadSync(filename, root) {\n if (!root)\n root = new protobuf.Root();\n return root.loadSync(filename);\n}\n\nprotobuf.loadSync = loadSync;\n\n// Serialization\nprotobuf.encoder = require(\"./encoder\");\nprotobuf.decoder = require(\"./decoder\");\nprotobuf.verifier = require(\"./verifier\");\nprotobuf.converter = require(\"./converter\");\n\n// Reflection\nprotobuf.ReflectionObject = require(\"./object\");\nprotobuf.Namespace = require(\"./namespace\");\nprotobuf.Root = require(\"./root\");\nprotobuf.Enum = require(\"./enum\");\nprotobuf.Type = require(\"./type\");\nprotobuf.Field = require(\"./field\");\nprotobuf.OneOf = require(\"./oneof\");\nprotobuf.MapField = require(\"./mapfield\");\nprotobuf.Service = require(\"./service\");\nprotobuf.Method = require(\"./method\");\n\n// Runtime\nprotobuf.Message = require(\"./message\");\nprotobuf.wrappers = require(\"./wrappers\");\n\n// Utility\nprotobuf.types = require(\"./types\");\nprotobuf.util = require(\"./util\");\n\n// Set up possibly cyclic reflection dependencies\nprotobuf.ReflectionObject._configure(protobuf.Root);\nprotobuf.Namespace._configure(protobuf.Type, protobuf.Service, protobuf.Enum);\nprotobuf.Root._configure(protobuf.Type);\nprotobuf.Field._configure(protobuf.Type);\n",
44
+ "\"use strict\";\nmodule.exports = tokenize;\n\nvar delimRe = /[\\s{}=;:[\\],'\"()<>]/g,\n stringDoubleRe = /(?:\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\")/g,\n stringSingleRe = /(?:'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)')/g;\n\nvar setCommentRe = /^ *[*/]+ */,\n setCommentAltRe = /^\\s*\\*?\\/*/,\n setCommentSplitRe = /\\n/g,\n whitespaceRe = /\\s/,\n unescapeRe = /\\\\(.?)/g;\n\nvar unescapeMap = {\n \"0\": \"\\0\",\n \"r\": \"\\r\",\n \"n\": \"\\n\",\n \"t\": \"\\t\"\n};\n\n/**\n * Unescapes a string.\n * @param {string} str String to unescape\n * @returns {string} Unescaped string\n * @property {Object.<string,string>} map Special characters map\n * @memberof tokenize\n */\nfunction unescape(str) {\n return str.replace(unescapeRe, function($0, $1) {\n switch ($1) {\n case \"\\\\\":\n case \"\":\n return $1;\n default:\n return unescapeMap[$1] || \"\";\n }\n });\n}\n\ntokenize.unescape = unescape;\n\n/**\n * Gets the next token and advances.\n * @typedef TokenizerHandleNext\n * @type {function}\n * @returns {string|null} Next token or `null` on eof\n */\n\n/**\n * Peeks for the next token.\n * @typedef TokenizerHandlePeek\n * @type {function}\n * @returns {string|null} Next token or `null` on eof\n */\n\n/**\n * Pushes a token back to the stack.\n * @typedef TokenizerHandlePush\n * @type {function}\n * @param {string} token Token\n * @returns {undefined}\n */\n\n/**\n * Skips the next token.\n * @typedef TokenizerHandleSkip\n * @type {function}\n * @param {string} expected Expected token\n * @param {boolean} [optional=false] If optional\n * @returns {boolean} Whether the token matched\n * @throws {Error} If the token didn't match and is not optional\n */\n\n/**\n * Gets the comment on the previous line or, alternatively, the line comment on the specified line.\n * @typedef TokenizerHandleCmnt\n * @type {function}\n * @param {number} [line] Line number\n * @returns {string|null} Comment text or `null` if none\n */\n\n/**\n * Handle object returned from {@link tokenize}.\n * @interface ITokenizerHandle\n * @property {TokenizerHandleNext} next Gets the next token and advances (`null` on eof)\n * @property {TokenizerHandlePeek} peek Peeks for the next token (`null` on eof)\n * @property {TokenizerHandlePush} push Pushes a token back to the stack\n * @property {TokenizerHandleSkip} skip Skips a token, returns its presence and advances or, if non-optional and not present, throws\n * @property {TokenizerHandleCmnt} cmnt Gets the comment on the previous line or the line comment on the specified line, if any\n * @property {number} line Current line number\n */\n\n/**\n * Tokenizes the given .proto source and returns an object with useful utility functions.\n * @param {string} source Source contents\n * @param {boolean} alternateCommentMode Whether we should activate alternate comment parsing mode.\n * @returns {ITokenizerHandle} Tokenizer handle\n */\nfunction tokenize(source, alternateCommentMode) {\n /* eslint-disable callback-return */\n source = source.toString();\n\n var offset = 0,\n length = source.length,\n line = 1,\n lastCommentLine = 0,\n comments = {};\n\n var stack = [];\n\n var stringDelim = null;\n\n /* istanbul ignore next */\n /**\n * Creates an error for illegal syntax.\n * @param {string} subject Subject\n * @returns {Error} Error created\n * @inner\n */\n function illegal(subject) {\n return Error(\"illegal \" + subject + \" (line \" + line + \")\");\n }\n\n /**\n * Reads a string till its end.\n * @returns {string} String read\n * @inner\n */\n function readString() {\n var re = stringDelim === \"'\" ? stringSingleRe : stringDoubleRe;\n re.lastIndex = offset - 1;\n var match = re.exec(source);\n if (!match)\n throw illegal(\"string\");\n offset = re.lastIndex;\n push(stringDelim);\n stringDelim = null;\n return unescape(match[1]);\n }\n\n /**\n * Gets the character at `pos` within the source.\n * @param {number} pos Position\n * @returns {string} Character\n * @inner\n */\n function charAt(pos) {\n return source.charAt(pos);\n }\n\n /**\n * Sets the current comment text.\n * @param {number} start Start offset\n * @param {number} end End offset\n * @param {boolean} isLeading set if a leading comment\n * @returns {undefined}\n * @inner\n */\n function setComment(start, end, isLeading) {\n var comment = {\n type: source.charAt(start++),\n lineEmpty: false,\n leading: isLeading,\n };\n var lookback;\n if (alternateCommentMode) {\n lookback = 2; // alternate comment parsing: \"//\" or \"/*\"\n } else {\n lookback = 3; // \"///\" or \"/**\"\n }\n var commentOffset = start - lookback,\n c;\n do {\n if (--commentOffset < 0 ||\n (c = source.charAt(commentOffset)) === \"\\n\") {\n comment.lineEmpty = true;\n break;\n }\n } while (c === \" \" || c === \"\\t\");\n var lines = source\n .substring(start, end)\n .split(setCommentSplitRe);\n for (var i = 0; i < lines.length; ++i)\n lines[i] = lines[i]\n .replace(alternateCommentMode ? setCommentAltRe : setCommentRe, \"\")\n .trim();\n comment.text = lines\n .join(\"\\n\")\n .trim();\n\n comments[line] = comment;\n lastCommentLine = line;\n }\n\n function isDoubleSlashCommentLine(startOffset) {\n var endOffset = findEndOfLine(startOffset);\n\n // see if remaining line matches comment pattern\n var lineText = source.substring(startOffset, endOffset);\n var isComment = /^\\s*\\/\\//.test(lineText);\n return isComment;\n }\n\n function findEndOfLine(cursor) {\n // find end of cursor's line\n var endOffset = cursor;\n while (endOffset < length && charAt(endOffset) !== \"\\n\") {\n endOffset++;\n }\n return endOffset;\n }\n\n /**\n * Obtains the next token.\n * @returns {string|null} Next token or `null` on eof\n * @inner\n */\n function next() {\n if (stack.length > 0)\n return stack.shift();\n if (stringDelim)\n return readString();\n var repeat,\n prev,\n curr,\n start,\n isDoc,\n isLeadingComment = offset === 0;\n do {\n if (offset === length)\n return null;\n repeat = false;\n while (whitespaceRe.test(curr = charAt(offset))) {\n if (curr === \"\\n\") {\n isLeadingComment = true;\n ++line;\n }\n if (++offset === length)\n return null;\n }\n\n if (charAt(offset) === \"/\") {\n if (++offset === length) {\n throw illegal(\"comment\");\n }\n if (charAt(offset) === \"/\") { // Line\n if (!alternateCommentMode) {\n // check for triple-slash comment\n isDoc = charAt(start = offset + 1) === \"/\";\n\n while (charAt(++offset) !== \"\\n\") {\n if (offset === length) {\n return null;\n }\n }\n ++offset;\n if (isDoc) {\n setComment(start, offset - 1, isLeadingComment);\n // Trailing comment cannot not be multi-line,\n // so leading comment state should be reset to handle potential next comments\n isLeadingComment = true;\n }\n ++line;\n repeat = true;\n } else {\n // check for double-slash comments, consolidating consecutive lines\n start = offset;\n isDoc = false;\n if (isDoubleSlashCommentLine(offset - 1)) {\n isDoc = true;\n do {\n offset = findEndOfLine(offset);\n if (offset === length) {\n break;\n }\n offset++;\n if (!isLeadingComment) {\n // Trailing comment cannot not be multi-line\n break;\n }\n } while (isDoubleSlashCommentLine(offset));\n } else {\n offset = Math.min(length, findEndOfLine(offset) + 1);\n }\n if (isDoc) {\n setComment(start, offset, isLeadingComment);\n isLeadingComment = true;\n }\n line++;\n repeat = true;\n }\n } else if ((curr = charAt(offset)) === \"*\") { /* Block */\n // check for /** (regular comment mode) or /* (alternate comment mode)\n start = offset + 1;\n isDoc = alternateCommentMode || charAt(start) === \"*\";\n do {\n if (curr === \"\\n\") {\n ++line;\n }\n if (++offset === length) {\n throw illegal(\"comment\");\n }\n prev = curr;\n curr = charAt(offset);\n } while (prev !== \"*\" || curr !== \"/\");\n ++offset;\n if (isDoc) {\n setComment(start, offset - 2, isLeadingComment);\n isLeadingComment = true;\n }\n repeat = true;\n } else {\n return \"/\";\n }\n }\n } while (repeat);\n\n // offset !== length if we got here\n\n var end = offset;\n delimRe.lastIndex = 0;\n var delim = delimRe.test(charAt(end++));\n if (!delim)\n while (end < length && !delimRe.test(charAt(end)))\n ++end;\n var token = source.substring(offset, offset = end);\n if (token === \"\\\"\" || token === \"'\")\n stringDelim = token;\n return token;\n }\n\n /**\n * Pushes a token back to the stack.\n * @param {string} token Token\n * @returns {undefined}\n * @inner\n */\n function push(token) {\n stack.push(token);\n }\n\n /**\n * Peeks for the next token.\n * @returns {string|null} Token or `null` on eof\n * @inner\n */\n function peek() {\n if (!stack.length) {\n var token = next();\n if (token === null)\n return null;\n push(token);\n }\n return stack[0];\n }\n\n /**\n * Skips a token.\n * @param {string} expected Expected token\n * @param {boolean} [optional=false] Whether the token is optional\n * @returns {boolean} `true` when skipped, `false` if not\n * @throws {Error} When a required token is not present\n * @inner\n */\n function skip(expected, optional) {\n var actual = peek(),\n equals = actual === expected;\n if (equals) {\n next();\n return true;\n }\n if (!optional)\n throw illegal(\"token '\" + actual + \"', '\" + expected + \"' expected\");\n return false;\n }\n\n /**\n * Gets a comment.\n * @param {number} [trailingLine] Line number if looking for a trailing comment\n * @returns {string|null} Comment text\n * @inner\n */\n function cmnt(trailingLine) {\n var ret = null;\n var comment;\n if (trailingLine === undefined) {\n comment = comments[line - 1];\n delete comments[line - 1];\n if (comment && (alternateCommentMode || comment.type === \"*\" || comment.lineEmpty)) {\n ret = comment.leading ? comment.text : null;\n }\n } else {\n /* istanbul ignore else */\n if (lastCommentLine < trailingLine) {\n peek();\n }\n comment = comments[trailingLine];\n delete comments[trailingLine];\n if (comment && !comment.lineEmpty && (alternateCommentMode || comment.type === \"/\")) {\n ret = comment.leading ? null : comment.text;\n }\n }\n return ret;\n }\n\n return Object.defineProperty({\n next: next,\n peek: peek,\n push: push,\n skip: skip,\n cmnt: cmnt\n }, \"line\", {\n get: function() { return line; }\n });\n /* eslint-enable callback-return */\n}\n",
45
+ "\"use strict\";\nmodule.exports = parse;\n\nparse.filename = null;\nparse.defaults = { keepCase: false };\n\nvar tokenize = require(\"./tokenize\"),\n Root = require(\"./root\"),\n Type = require(\"./type\"),\n Field = require(\"./field\"),\n MapField = require(\"./mapfield\"),\n OneOf = require(\"./oneof\"),\n Enum = require(\"./enum\"),\n Service = require(\"./service\"),\n Method = require(\"./method\"),\n ReflectionObject = require(\"./object\"),\n types = require(\"./types\"),\n util = require(\"./util\");\n\nvar base10Re = /^[1-9][0-9]*$/,\n base10NegRe = /^-?[1-9][0-9]*$/,\n base16Re = /^0[x][0-9a-fA-F]+$/,\n base16NegRe = /^-?0[x][0-9a-fA-F]+$/,\n base8Re = /^0[0-7]+$/,\n base8NegRe = /^-?0[0-7]+$/,\n numberRe = /^(?![eE])[0-9]*(?:\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/,\n nameRe = /^[a-zA-Z_][a-zA-Z_0-9]*$/,\n typeRefRe = /^(?:\\.?[a-zA-Z_][a-zA-Z_0-9]*)(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)*$/;\n\n/**\n * Result object returned from {@link parse}.\n * @interface IParserResult\n * @property {string|undefined} package Package name, if declared\n * @property {string[]|undefined} imports Imports, if any\n * @property {string[]|undefined} weakImports Weak imports, if any\n * @property {Root} root Populated root instance\n */\n\n/**\n * Options modifying the behavior of {@link parse}.\n * @interface IParseOptions\n * @property {boolean} [keepCase=false] Keeps field casing instead of converting to camel case\n * @property {boolean} [alternateCommentMode=false] Recognize double-slash comments in addition to doc-block comments.\n * @property {boolean} [preferTrailingComment=false] Use trailing comment when both leading comment and trailing comment exist.\n */\n\n/**\n * Options modifying the behavior of JSON serialization.\n * @interface IToJSONOptions\n * @property {boolean} [keepComments=false] Serializes comments.\n */\n\n/**\n * Parses the given .proto source and returns an object with the parsed contents.\n * @param {string} source Source contents\n * @param {Root} root Root to populate\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {IParserResult} Parser result\n * @property {string} filename=null Currently processing file name for error reporting, if known\n * @property {IParseOptions} defaults Default {@link IParseOptions}\n */\nfunction parse(source, root, options) {\n /* eslint-disable callback-return */\n if (!(root instanceof Root)) {\n options = root;\n root = new Root();\n }\n if (!options)\n options = parse.defaults;\n\n var preferTrailingComment = options.preferTrailingComment || false;\n var tn = tokenize(source, options.alternateCommentMode || false),\n next = tn.next,\n push = tn.push,\n peek = tn.peek,\n skip = tn.skip,\n cmnt = tn.cmnt;\n\n var head = true,\n pkg,\n imports,\n weakImports,\n edition = \"proto2\";\n\n var ptr = root;\n\n var topLevelObjects = [];\n var topLevelOptions = {};\n\n var applyCase = options.keepCase ? function(name) { return name; } : util.camelCase;\n\n function resolveFileFeatures() {\n topLevelObjects.forEach(obj => {\n obj._edition = edition;\n Object.keys(topLevelOptions).forEach(opt => {\n if (obj.getOption(opt) !== undefined) return;\n obj.setOption(opt, topLevelOptions[opt], true);\n });\n });\n }\n\n /* istanbul ignore next */\n function illegal(token, name, insideTryCatch) {\n var filename = parse.filename;\n if (!insideTryCatch)\n parse.filename = null;\n return Error(\"illegal \" + (name || \"token\") + \" '\" + token + \"' (\" + (filename ? filename + \", \" : \"\") + \"line \" + tn.line + \")\");\n }\n\n function readString() {\n var values = [],\n token;\n do {\n /* istanbul ignore if */\n if ((token = next()) !== \"\\\"\" && token !== \"'\")\n throw illegal(token);\n\n values.push(next());\n skip(token);\n token = peek();\n } while (token === \"\\\"\" || token === \"'\");\n return values.join(\"\");\n }\n\n function readValue(acceptTypeRef) {\n var token = next();\n switch (token) {\n case \"'\":\n case \"\\\"\":\n push(token);\n return readString();\n case \"true\": case \"TRUE\":\n return true;\n case \"false\": case \"FALSE\":\n return false;\n }\n try {\n return parseNumber(token, /* insideTryCatch */ true);\n } catch (e) {\n /* istanbul ignore else */\n if (acceptTypeRef && typeRefRe.test(token))\n return token;\n\n /* istanbul ignore next */\n throw illegal(token, \"value\");\n }\n }\n\n function readRanges(target, acceptStrings) {\n var token, start;\n do {\n if (acceptStrings && ((token = peek()) === \"\\\"\" || token === \"'\")) {\n var str = readString();\n target.push(str);\n if (edition >= 2023) {\n throw illegal(str, \"id\");\n }\n } else {\n try {\n target.push([ start = parseId(next()), skip(\"to\", true) ? parseId(next()) : start ]);\n } catch (err) {\n if (acceptStrings && typeRefRe.test(token) && edition >= 2023) {\n target.push(token);\n } else {\n throw err;\n }\n }\n }\n } while (skip(\",\", true));\n var dummy = {options: undefined};\n dummy.setOption = function(name, value) {\n if (this.options === undefined) this.options = {};\n this.options[name] = value;\n };\n ifBlock(\n dummy,\n function parseRange_block(token) {\n /* istanbul ignore else */\n if (token === \"option\") {\n parseOption(dummy, token); // skip\n skip(\";\");\n } else\n throw illegal(token);\n },\n function parseRange_line() {\n parseInlineOptions(dummy); // skip\n });\n }\n\n function parseNumber(token, insideTryCatch) {\n var sign = 1;\n if (token.charAt(0) === \"-\") {\n sign = -1;\n token = token.substring(1);\n }\n switch (token) {\n case \"inf\": case \"INF\": case \"Inf\":\n return sign * Infinity;\n case \"nan\": case \"NAN\": case \"Nan\": case \"NaN\":\n return NaN;\n case \"0\":\n return 0;\n }\n if (base10Re.test(token))\n return sign * parseInt(token, 10);\n if (base16Re.test(token))\n return sign * parseInt(token, 16);\n if (base8Re.test(token))\n return sign * parseInt(token, 8);\n\n /* istanbul ignore else */\n if (numberRe.test(token))\n return sign * parseFloat(token);\n\n /* istanbul ignore next */\n throw illegal(token, \"number\", insideTryCatch);\n }\n\n function parseId(token, acceptNegative) {\n switch (token) {\n case \"max\": case \"MAX\": case \"Max\":\n return 536870911;\n case \"0\":\n return 0;\n }\n\n /* istanbul ignore if */\n if (!acceptNegative && token.charAt(0) === \"-\")\n throw illegal(token, \"id\");\n\n if (base10NegRe.test(token))\n return parseInt(token, 10);\n if (base16NegRe.test(token))\n return parseInt(token, 16);\n\n /* istanbul ignore else */\n if (base8NegRe.test(token))\n return parseInt(token, 8);\n\n /* istanbul ignore next */\n throw illegal(token, \"id\");\n }\n\n function parsePackage() {\n /* istanbul ignore if */\n if (pkg !== undefined)\n throw illegal(\"package\");\n\n pkg = next();\n\n /* istanbul ignore if */\n if (!typeRefRe.test(pkg))\n throw illegal(pkg, \"name\");\n\n ptr = ptr.define(pkg);\n\n skip(\";\");\n }\n\n function parseImport() {\n var token = peek();\n var whichImports;\n switch (token) {\n case \"option\":\n if (edition < \"2024\") {\n throw illegal(\"option\");\n }\n // Import options are only used for resolving options, which we don't\n // do. We can just throw them out.\n next();\n readString();\n skip(\";\");\n return;\n case \"weak\":\n whichImports = weakImports || (weakImports = []);\n next();\n break;\n case \"public\":\n next();\n // eslint-disable-next-line no-fallthrough\n default:\n whichImports = imports || (imports = []);\n break;\n }\n token = readString();\n skip(\";\");\n whichImports.push(token);\n }\n\n function parseSyntax() {\n skip(\"=\");\n edition = readString();\n\n /* istanbul ignore if */\n if (edition < 2023)\n throw illegal(edition, \"syntax\");\n\n skip(\";\");\n }\n\n function parseEdition() {\n skip(\"=\");\n edition = readString();\n const supportedEditions = [\"2023\", \"2024\"];\n\n /* istanbul ignore if */\n if (!supportedEditions.includes(edition))\n throw illegal(edition, \"edition\");\n\n skip(\";\");\n }\n\n\n function parseCommon(parent, token) {\n switch (token) {\n\n case \"option\":\n parseOption(parent, token);\n skip(\";\");\n return true;\n\n case \"message\":\n parseType(parent, token);\n return true;\n\n case \"enum\":\n parseEnum(parent, token);\n return true;\n\n case \"export\":\n case \"local\":\n if (edition < \"2024\") {\n return false;\n }\n token = next();\n if (token === \"export\" || token === \"local\") {\n return false;\n }\n if (token !== \"message\" && token !== \"enum\") {\n return false;\n }\n /* eslint-disable no-warning-comments */\n // TODO: actually enforce visiblity modifiers like protoc does.\n return parseCommon(parent, token);\n\n case \"service\":\n parseService(parent, token);\n return true;\n\n case \"extend\":\n parseExtension(parent, token);\n return true;\n }\n return false;\n }\n\n function ifBlock(obj, fnIf, fnElse) {\n var trailingLine = tn.line;\n if (obj) {\n if(typeof obj.comment !== \"string\") {\n obj.comment = cmnt(); // try block-type comment\n }\n obj.filename = parse.filename;\n }\n if (skip(\"{\", true)) {\n var token;\n while ((token = next()) !== \"}\")\n fnIf(token);\n skip(\";\", true);\n } else {\n if (fnElse)\n fnElse();\n skip(\";\");\n if (obj && (typeof obj.comment !== \"string\" || preferTrailingComment))\n obj.comment = cmnt(trailingLine) || obj.comment; // try line-type comment\n }\n }\n\n function parseType(parent, token) {\n\n /* istanbul ignore if */\n if (!nameRe.test(token = next()))\n throw illegal(token, \"type name\");\n\n var type = new Type(token);\n ifBlock(type, function parseType_block(token) {\n if (parseCommon(type, token))\n return;\n\n switch (token) {\n\n case \"map\":\n parseMapField(type, token);\n break;\n\n case \"required\":\n if (edition !== \"proto2\")\n throw illegal(token);\n /* eslint-disable no-fallthrough */\n case \"repeated\":\n parseField(type, token);\n break;\n\n case \"optional\":\n /* istanbul ignore if */\n if (edition === \"proto3\") {\n parseField(type, \"proto3_optional\");\n } else if (edition !== \"proto2\") {\n throw illegal(token);\n } else {\n parseField(type, \"optional\");\n }\n break;\n\n case \"oneof\":\n parseOneOf(type, token);\n break;\n\n case \"extensions\":\n readRanges(type.extensions || (type.extensions = []));\n break;\n\n case \"reserved\":\n readRanges(type.reserved || (type.reserved = []), true);\n break;\n\n default:\n /* istanbul ignore if */\n if (edition === \"proto2\" || !typeRefRe.test(token)) {\n throw illegal(token);\n }\n\n push(token);\n parseField(type, \"optional\");\n break;\n }\n });\n parent.add(type);\n if (parent === ptr) {\n topLevelObjects.push(type);\n }\n }\n\n function parseField(parent, rule, extend) {\n var type = next();\n if (type === \"group\") {\n parseGroup(parent, rule);\n return;\n }\n // Type names can consume multiple tokens, in multiple variants:\n // package.subpackage field tokens: \"package.subpackage\" [TYPE NAME ENDS HERE] \"field\"\n // package . subpackage field tokens: \"package\" \".\" \"subpackage\" [TYPE NAME ENDS HERE] \"field\"\n // package. subpackage field tokens: \"package.\" \"subpackage\" [TYPE NAME ENDS HERE] \"field\"\n // package .subpackage field tokens: \"package\" \".subpackage\" [TYPE NAME ENDS HERE] \"field\"\n // Keep reading tokens until we get a type name with no period at the end,\n // and the next token does not start with a period.\n while (type.endsWith(\".\") || peek().startsWith(\".\")) {\n type += next();\n }\n\n /* istanbul ignore if */\n if (!typeRefRe.test(type))\n throw illegal(type, \"type\");\n\n var name = next();\n\n /* istanbul ignore if */\n\n if (!nameRe.test(name))\n throw illegal(name, \"name\");\n\n name = applyCase(name);\n skip(\"=\");\n\n var field = new Field(name, parseId(next()), type, rule, extend);\n\n ifBlock(field, function parseField_block(token) {\n\n /* istanbul ignore else */\n if (token === \"option\") {\n parseOption(field, token);\n skip(\";\");\n } else\n throw illegal(token);\n\n }, function parseField_line() {\n parseInlineOptions(field);\n });\n\n if (rule === \"proto3_optional\") {\n // for proto3 optional fields, we create a single-member Oneof to mimic \"optional\" behavior\n var oneof = new OneOf(\"_\" + name);\n field.setOption(\"proto3_optional\", true);\n oneof.add(field);\n parent.add(oneof);\n } else {\n parent.add(field);\n }\n if (parent === ptr) {\n topLevelObjects.push(field);\n }\n }\n\n function parseGroup(parent, rule) {\n if (edition >= 2023) {\n throw illegal(\"group\");\n }\n var name = next();\n\n /* istanbul ignore if */\n if (!nameRe.test(name))\n throw illegal(name, \"name\");\n\n var fieldName = util.lcFirst(name);\n if (name === fieldName)\n name = util.ucFirst(name);\n skip(\"=\");\n var id = parseId(next());\n var type = new Type(name);\n type.group = true;\n var field = new Field(fieldName, id, name, rule);\n field.filename = parse.filename;\n ifBlock(type, function parseGroup_block(token) {\n switch (token) {\n\n case \"option\":\n parseOption(type, token);\n skip(\";\");\n break;\n case \"required\":\n case \"repeated\":\n parseField(type, token);\n break;\n\n case \"optional\":\n /* istanbul ignore if */\n if (edition === \"proto3\") {\n parseField(type, \"proto3_optional\");\n } else {\n parseField(type, \"optional\");\n }\n break;\n\n case \"message\":\n parseType(type, token);\n break;\n\n case \"enum\":\n parseEnum(type, token);\n break;\n\n case \"reserved\":\n readRanges(type.reserved || (type.reserved = []), true);\n break;\n\n case \"export\":\n case \"local\":\n if (edition < \"2024\") {\n throw illegal(token);\n }\n token = next();\n switch (token) {\n case \"message\":\n parseType(type, token);\n break;\n case \"enum\":\n parseType(type, token);\n break;\n default:\n throw illegal(token);\n }\n break;\n\n /* istanbul ignore next */\n default:\n throw illegal(token); // there are no groups with proto3 semantics\n }\n });\n parent.add(type)\n .add(field);\n }\n\n function parseMapField(parent) {\n skip(\"<\");\n var keyType = next();\n\n /* istanbul ignore if */\n if (types.mapKey[keyType] === undefined)\n throw illegal(keyType, \"type\");\n\n skip(\",\");\n var valueType = next();\n\n /* istanbul ignore if */\n if (!typeRefRe.test(valueType))\n throw illegal(valueType, \"type\");\n\n skip(\">\");\n var name = next();\n\n /* istanbul ignore if */\n if (!nameRe.test(name))\n throw illegal(name, \"name\");\n\n skip(\"=\");\n var field = new MapField(applyCase(name), parseId(next()), keyType, valueType);\n ifBlock(field, function parseMapField_block(token) {\n\n /* istanbul ignore else */\n if (token === \"option\") {\n parseOption(field, token);\n skip(\";\");\n } else\n throw illegal(token);\n\n }, function parseMapField_line() {\n parseInlineOptions(field);\n });\n parent.add(field);\n }\n\n function parseOneOf(parent, token) {\n\n /* istanbul ignore if */\n if (!nameRe.test(token = next()))\n throw illegal(token, \"name\");\n\n var oneof = new OneOf(applyCase(token));\n ifBlock(oneof, function parseOneOf_block(token) {\n if (token === \"option\") {\n parseOption(oneof, token);\n skip(\";\");\n } else {\n push(token);\n parseField(oneof, \"optional\");\n }\n });\n parent.add(oneof);\n }\n\n function parseEnum(parent, token) {\n\n /* istanbul ignore if */\n if (!nameRe.test(token = next()))\n throw illegal(token, \"name\");\n\n var enm = new Enum(token);\n ifBlock(enm, function parseEnum_block(token) {\n switch(token) {\n case \"option\":\n parseOption(enm, token);\n skip(\";\");\n break;\n\n case \"reserved\":\n readRanges(enm.reserved || (enm.reserved = []), true);\n if(enm.reserved === undefined) enm.reserved = [];\n break;\n\n default:\n parseEnumValue(enm, token);\n }\n });\n parent.add(enm);\n if (parent === ptr) {\n topLevelObjects.push(enm);\n }\n }\n\n function parseEnumValue(parent, token) {\n\n /* istanbul ignore if */\n if (!nameRe.test(token))\n throw illegal(token, \"name\");\n\n skip(\"=\");\n var value = parseId(next(), true),\n dummy = {\n options: undefined\n };\n dummy.getOption = function(name) {\n return this.options[name];\n };\n dummy.setOption = function(name, value) {\n ReflectionObject.prototype.setOption.call(dummy, name, value);\n };\n dummy.setParsedOption = function() {\n return undefined;\n };\n ifBlock(dummy, function parseEnumValue_block(token) {\n\n /* istanbul ignore else */\n if (token === \"option\") {\n parseOption(dummy, token); // skip\n skip(\";\");\n } else\n throw illegal(token);\n\n }, function parseEnumValue_line() {\n parseInlineOptions(dummy); // skip\n });\n parent.add(token, value, dummy.comment, dummy.parsedOptions || dummy.options);\n }\n\n function parseOption(parent, token) {\n var option;\n var propName;\n var isOption = true;\n if (token === \"option\") {\n token = next();\n }\n\n while (token !== \"=\") {\n if (token === \"(\") {\n var parensValue = next();\n skip(\")\");\n token = \"(\" + parensValue + \")\";\n }\n if (isOption) {\n isOption = false;\n if (token.includes(\".\") && !token.includes(\"(\")) {\n var tokens = token.split(\".\");\n option = tokens[0] + \".\";\n token = tokens[1];\n continue;\n }\n option = token;\n } else {\n propName = propName ? propName += token : token;\n }\n token = next();\n }\n var name = propName ? option.concat(propName) : option;\n var optionValue = parseOptionValue(parent, name);\n propName = propName && propName[0] === \".\" ? propName.slice(1) : propName;\n option = option && option[option.length - 1] === \".\" ? option.slice(0, -1) : option;\n setParsedOption(parent, option, optionValue, propName);\n }\n\n function parseOptionValue(parent, name) {\n // { a: \"foo\" b { c: \"bar\" } }\n if (skip(\"{\", true)) {\n var objectResult = {};\n\n while (!skip(\"}\", true)) {\n /* istanbul ignore if */\n if (!nameRe.test(token = next())) {\n throw illegal(token, \"name\");\n }\n if (token === null) {\n throw illegal(token, \"end of input\");\n }\n\n var value;\n var propName = token;\n\n skip(\":\", true);\n\n if (peek() === \"{\") {\n // option (my_option) = {\n // repeated_value: [ \"foo\", \"bar\" ]\n // };\n value = parseOptionValue(parent, name + \".\" + token);\n } else if (peek() === \"[\") {\n value = [];\n var lastValue;\n if (skip(\"[\", true)) {\n do {\n lastValue = readValue(true);\n value.push(lastValue);\n } while (skip(\",\", true));\n skip(\"]\");\n if (typeof lastValue !== \"undefined\") {\n setOption(parent, name + \".\" + token, lastValue);\n }\n }\n } else {\n value = readValue(true);\n setOption(parent, name + \".\" + token, value);\n }\n\n var prevValue = objectResult[propName];\n\n if (prevValue)\n value = [].concat(prevValue).concat(value);\n\n objectResult[propName] = value;\n\n // Semicolons and commas can be optional\n skip(\",\", true);\n skip(\";\", true);\n }\n\n return objectResult;\n }\n\n var simpleValue = readValue(true);\n setOption(parent, name, simpleValue);\n return simpleValue;\n // Does not enforce a delimiter to be universal\n }\n\n function setOption(parent, name, value) {\n if (ptr === parent && /^features\\./.test(name)) {\n topLevelOptions[name] = value;\n return;\n }\n if (parent.setOption)\n parent.setOption(name, value);\n }\n\n function setParsedOption(parent, name, value, propName) {\n if (parent.setParsedOption)\n parent.setParsedOption(name, value, propName);\n }\n\n function parseInlineOptions(parent) {\n if (skip(\"[\", true)) {\n do {\n parseOption(parent, \"option\");\n } while (skip(\",\", true));\n skip(\"]\");\n }\n return parent;\n }\n\n function parseService(parent, token) {\n\n /* istanbul ignore if */\n if (!nameRe.test(token = next()))\n throw illegal(token, \"service name\");\n\n var service = new Service(token);\n ifBlock(service, function parseService_block(token) {\n if (parseCommon(service, token)) {\n return;\n }\n\n /* istanbul ignore else */\n if (token === \"rpc\")\n parseMethod(service, token);\n else\n throw illegal(token);\n });\n parent.add(service);\n if (parent === ptr) {\n topLevelObjects.push(service);\n }\n }\n\n function parseMethod(parent, token) {\n // Get the comment of the preceding line now (if one exists) in case the\n // method is defined across multiple lines.\n var commentText = cmnt();\n\n var type = token;\n\n /* istanbul ignore if */\n if (!nameRe.test(token = next()))\n throw illegal(token, \"name\");\n\n var name = token,\n requestType, requestStream,\n responseType, responseStream;\n\n skip(\"(\");\n if (skip(\"stream\", true))\n requestStream = true;\n\n /* istanbul ignore if */\n if (!typeRefRe.test(token = next()))\n throw illegal(token);\n\n requestType = token;\n skip(\")\"); skip(\"returns\"); skip(\"(\");\n if (skip(\"stream\", true))\n responseStream = true;\n\n /* istanbul ignore if */\n if (!typeRefRe.test(token = next()))\n throw illegal(token);\n\n responseType = token;\n skip(\")\");\n\n var method = new Method(name, type, requestType, responseType, requestStream, responseStream);\n method.comment = commentText;\n ifBlock(method, function parseMethod_block(token) {\n\n /* istanbul ignore else */\n if (token === \"option\") {\n parseOption(method, token);\n skip(\";\");\n } else\n throw illegal(token);\n\n });\n parent.add(method);\n }\n\n function parseExtension(parent, token) {\n\n /* istanbul ignore if */\n if (!typeRefRe.test(token = next()))\n throw illegal(token, \"reference\");\n\n var reference = token;\n ifBlock(null, function parseExtension_block(token) {\n switch (token) {\n\n case \"required\":\n case \"repeated\":\n parseField(parent, token, reference);\n break;\n\n case \"optional\":\n /* istanbul ignore if */\n if (edition === \"proto3\") {\n parseField(parent, \"proto3_optional\", reference);\n } else {\n parseField(parent, \"optional\", reference);\n }\n break;\n\n default:\n /* istanbul ignore if */\n if (edition === \"proto2\" || !typeRefRe.test(token))\n throw illegal(token);\n push(token);\n parseField(parent, \"optional\", reference);\n break;\n }\n });\n }\n\n var token;\n while ((token = next()) !== null) {\n switch (token) {\n\n case \"package\":\n\n /* istanbul ignore if */\n if (!head)\n throw illegal(token);\n\n parsePackage();\n break;\n\n case \"import\":\n\n /* istanbul ignore if */\n if (!head)\n throw illegal(token);\n\n parseImport();\n break;\n\n case \"syntax\":\n\n /* istanbul ignore if */\n if (!head)\n throw illegal(token);\n\n parseSyntax();\n break;\n\n case \"edition\":\n /* istanbul ignore if */\n if (!head)\n throw illegal(token);\n parseEdition();\n break;\n\n case \"option\":\n parseOption(ptr, token);\n skip(\";\", true);\n break;\n\n default:\n\n /* istanbul ignore else */\n if (parseCommon(ptr, token)) {\n head = false;\n continue;\n }\n\n /* istanbul ignore next */\n throw illegal(token);\n }\n }\n\n resolveFileFeatures();\n\n parse.filename = null;\n return {\n \"package\" : pkg,\n \"imports\" : imports,\n weakImports : weakImports,\n root : root\n };\n}\n\n/**\n * Parses the given .proto source and returns an object with the parsed contents.\n * @name parse\n * @function\n * @param {string} source Source contents\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {IParserResult} Parser result\n * @property {string} filename=null Currently processing file name for error reporting, if known\n * @property {IParseOptions} defaults Default {@link IParseOptions}\n * @variation 2\n */\n",
46
+ "\"use strict\";\nmodule.exports = common;\n\nvar commonRe = /\\/|\\./;\n\n/**\n * Provides common type definitions.\n * Can also be used to provide additional google types or your own custom types.\n * @param {string} name Short name as in `google/protobuf/[name].proto` or full file name\n * @param {Object.<string,*>} json JSON definition within `google.protobuf` if a short name, otherwise the file's root definition\n * @returns {undefined}\n * @property {INamespace} google/protobuf/any.proto Any\n * @property {INamespace} google/protobuf/duration.proto Duration\n * @property {INamespace} google/protobuf/empty.proto Empty\n * @property {INamespace} google/protobuf/field_mask.proto FieldMask\n * @property {INamespace} google/protobuf/struct.proto Struct, Value, NullValue and ListValue\n * @property {INamespace} google/protobuf/timestamp.proto Timestamp\n * @property {INamespace} google/protobuf/wrappers.proto Wrappers\n * @example\n * // manually provides descriptor.proto (assumes google/protobuf/ namespace and .proto extension)\n * protobuf.common(\"descriptor\", descriptorJson);\n *\n * // manually provides a custom definition (uses my.foo namespace)\n * protobuf.common(\"my/foo/bar.proto\", myFooBarJson);\n */\nfunction common(name, json) {\n if (!commonRe.test(name)) {\n name = \"google/protobuf/\" + name + \".proto\";\n json = { nested: { google: { nested: { protobuf: { nested: json } } } } };\n }\n common[name] = json;\n}\n\n// Not provided because of limited use (feel free to discuss or to provide yourself):\n//\n// google/protobuf/descriptor.proto\n// google/protobuf/source_context.proto\n// google/protobuf/type.proto\n//\n// Stripped and pre-parsed versions of these non-bundled files are instead available as part of\n// the repository or package within the google/protobuf directory.\n\ncommon(\"any\", {\n\n /**\n * Properties of a google.protobuf.Any message.\n * @interface IAny\n * @type {Object}\n * @property {string} [typeUrl]\n * @property {Uint8Array} [bytes]\n * @memberof common\n */\n Any: {\n fields: {\n type_url: {\n type: \"string\",\n id: 1\n },\n value: {\n type: \"bytes\",\n id: 2\n }\n }\n }\n});\n\nvar timeType;\n\ncommon(\"duration\", {\n\n /**\n * Properties of a google.protobuf.Duration message.\n * @interface IDuration\n * @type {Object}\n * @property {number|Long} [seconds]\n * @property {number} [nanos]\n * @memberof common\n */\n Duration: timeType = {\n fields: {\n seconds: {\n type: \"int64\",\n id: 1\n },\n nanos: {\n type: \"int32\",\n id: 2\n }\n }\n }\n});\n\ncommon(\"timestamp\", {\n\n /**\n * Properties of a google.protobuf.Timestamp message.\n * @interface ITimestamp\n * @type {Object}\n * @property {number|Long} [seconds]\n * @property {number} [nanos]\n * @memberof common\n */\n Timestamp: timeType\n});\n\ncommon(\"empty\", {\n\n /**\n * Properties of a google.protobuf.Empty message.\n * @interface IEmpty\n * @memberof common\n */\n Empty: {\n fields: {}\n }\n});\n\ncommon(\"struct\", {\n\n /**\n * Properties of a google.protobuf.Struct message.\n * @interface IStruct\n * @type {Object}\n * @property {Object.<string,IValue>} [fields]\n * @memberof common\n */\n Struct: {\n fields: {\n fields: {\n keyType: \"string\",\n type: \"Value\",\n id: 1\n }\n }\n },\n\n /**\n * Properties of a google.protobuf.Value message.\n * @interface IValue\n * @type {Object}\n * @property {string} [kind]\n * @property {0} [nullValue]\n * @property {number} [numberValue]\n * @property {string} [stringValue]\n * @property {boolean} [boolValue]\n * @property {IStruct} [structValue]\n * @property {IListValue} [listValue]\n * @memberof common\n */\n Value: {\n oneofs: {\n kind: {\n oneof: [\n \"nullValue\",\n \"numberValue\",\n \"stringValue\",\n \"boolValue\",\n \"structValue\",\n \"listValue\"\n ]\n }\n },\n fields: {\n nullValue: {\n type: \"NullValue\",\n id: 1\n },\n numberValue: {\n type: \"double\",\n id: 2\n },\n stringValue: {\n type: \"string\",\n id: 3\n },\n boolValue: {\n type: \"bool\",\n id: 4\n },\n structValue: {\n type: \"Struct\",\n id: 5\n },\n listValue: {\n type: \"ListValue\",\n id: 6\n }\n }\n },\n\n NullValue: {\n values: {\n NULL_VALUE: 0\n }\n },\n\n /**\n * Properties of a google.protobuf.ListValue message.\n * @interface IListValue\n * @type {Object}\n * @property {Array.<IValue>} [values]\n * @memberof common\n */\n ListValue: {\n fields: {\n values: {\n rule: \"repeated\",\n type: \"Value\",\n id: 1\n }\n }\n }\n});\n\ncommon(\"wrappers\", {\n\n /**\n * Properties of a google.protobuf.DoubleValue message.\n * @interface IDoubleValue\n * @type {Object}\n * @property {number} [value]\n * @memberof common\n */\n DoubleValue: {\n fields: {\n value: {\n type: \"double\",\n id: 1\n }\n }\n },\n\n /**\n * Properties of a google.protobuf.FloatValue message.\n * @interface IFloatValue\n * @type {Object}\n * @property {number} [value]\n * @memberof common\n */\n FloatValue: {\n fields: {\n value: {\n type: \"float\",\n id: 1\n }\n }\n },\n\n /**\n * Properties of a google.protobuf.Int64Value message.\n * @interface IInt64Value\n * @type {Object}\n * @property {number|Long} [value]\n * @memberof common\n */\n Int64Value: {\n fields: {\n value: {\n type: \"int64\",\n id: 1\n }\n }\n },\n\n /**\n * Properties of a google.protobuf.UInt64Value message.\n * @interface IUInt64Value\n * @type {Object}\n * @property {number|Long} [value]\n * @memberof common\n */\n UInt64Value: {\n fields: {\n value: {\n type: \"uint64\",\n id: 1\n }\n }\n },\n\n /**\n * Properties of a google.protobuf.Int32Value message.\n * @interface IInt32Value\n * @type {Object}\n * @property {number} [value]\n * @memberof common\n */\n Int32Value: {\n fields: {\n value: {\n type: \"int32\",\n id: 1\n }\n }\n },\n\n /**\n * Properties of a google.protobuf.UInt32Value message.\n * @interface IUInt32Value\n * @type {Object}\n * @property {number} [value]\n * @memberof common\n */\n UInt32Value: {\n fields: {\n value: {\n type: \"uint32\",\n id: 1\n }\n }\n },\n\n /**\n * Properties of a google.protobuf.BoolValue message.\n * @interface IBoolValue\n * @type {Object}\n * @property {boolean} [value]\n * @memberof common\n */\n BoolValue: {\n fields: {\n value: {\n type: \"bool\",\n id: 1\n }\n }\n },\n\n /**\n * Properties of a google.protobuf.StringValue message.\n * @interface IStringValue\n * @type {Object}\n * @property {string} [value]\n * @memberof common\n */\n StringValue: {\n fields: {\n value: {\n type: \"string\",\n id: 1\n }\n }\n },\n\n /**\n * Properties of a google.protobuf.BytesValue message.\n * @interface IBytesValue\n * @type {Object}\n * @property {Uint8Array} [value]\n * @memberof common\n */\n BytesValue: {\n fields: {\n value: {\n type: \"bytes\",\n id: 1\n }\n }\n }\n});\n\ncommon(\"field_mask\", {\n\n /**\n * Properties of a google.protobuf.FieldMask message.\n * @interface IDoubleValue\n * @type {Object}\n * @property {number} [value]\n * @memberof common\n */\n FieldMask: {\n fields: {\n paths: {\n rule: \"repeated\",\n type: \"string\",\n id: 1\n }\n }\n }\n});\n\n/**\n * Gets the root definition of the specified common proto file.\n *\n * Bundled definitions are:\n * - google/protobuf/any.proto\n * - google/protobuf/duration.proto\n * - google/protobuf/empty.proto\n * - google/protobuf/field_mask.proto\n * - google/protobuf/struct.proto\n * - google/protobuf/timestamp.proto\n * - google/protobuf/wrappers.proto\n *\n * @param {string} file Proto file name\n * @returns {INamespace|null} Root definition or `null` if not defined\n */\ncommon.get = function get(file) {\n return common[file] || null;\n};\n",
47
+ "\"use strict\";\nvar protobuf = module.exports = require(\"./index-light\");\n\nprotobuf.build = \"full\";\n\n// Parser\nprotobuf.tokenize = require(\"./tokenize\");\nprotobuf.parse = require(\"./parse\");\nprotobuf.common = require(\"./common\");\n\n// Configure parser\nprotobuf.Root._configure(protobuf.Type, protobuf.parse, protobuf.common);\n",
57
48
  "/**\n * @fileoverview Channel implementations for @gravito/ripple\n * @module @gravito/ripple/channels\n */\n\nimport type { Channel, ChannelType } from '../types'\n\n// ─────────────────────────────────────────────────────────────\n// Channel Prefixes\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Standard prefixes used to identify private and presence channels.\n *\n * @public\n * @since 3.0.0\n */\nexport const CHANNEL_PREFIXES = {\n private: 'private-',\n presence: 'presence-',\n} as const\n\n// ─────────────────────────────────────────────────────────────\n// Base Channel Class\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for channels\n */\nabstract class BaseChannel implements Channel {\n abstract readonly type: ChannelType\n\n constructor(public readonly name: string) {}\n\n abstract get fullName(): string\n\n /**\n * Parse a full channel name to extract type and base name\n */\n static parse(fullName: string): { type: ChannelType; name: string } {\n if (fullName.startsWith(CHANNEL_PREFIXES.presence)) {\n return {\n type: 'presence',\n name: fullName.slice(CHANNEL_PREFIXES.presence.length),\n }\n }\n if (fullName.startsWith(CHANNEL_PREFIXES.private)) {\n return {\n type: 'private',\n name: fullName.slice(CHANNEL_PREFIXES.private.length),\n }\n }\n return { type: 'public', name: fullName }\n }\n\n /**\n * Check if a channel name requires authentication\n */\n static requiresAuth(fullName: string): boolean {\n return (\n fullName.startsWith(CHANNEL_PREFIXES.private) ||\n fullName.startsWith(CHANNEL_PREFIXES.presence)\n )\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Public Channel\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Public channel - no authentication required\n *\n * @example\n * ```typescript\n * const channel = new PublicChannel('news')\n * // fullName: 'news'\n * ```\n */\nexport class PublicChannel extends BaseChannel {\n readonly type = 'public' as const\n\n get fullName(): string {\n return this.name\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Private Channel\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Private channel - requires authentication\n *\n * @example\n * ```typescript\n * const channel = new PrivateChannel('orders.123')\n * // fullName: 'private-orders.123'\n * ```\n */\nexport class PrivateChannel extends BaseChannel {\n readonly type = 'private' as const\n\n get fullName(): string {\n return `${CHANNEL_PREFIXES.private}${this.name}`\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Presence Channel\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Presence channel - requires authentication, tracks online users\n *\n * @example\n * ```typescript\n * const channel = new PresenceChannel('chat.lobby')\n * // fullName: 'presence-chat.lobby'\n * ```\n */\nexport class PresenceChannel extends BaseChannel {\n readonly type = 'presence' as const\n\n get fullName(): string {\n return `${CHANNEL_PREFIXES.presence}${this.name}`\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Factory Functions\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Create a channel from a full name\n */\nexport function createChannel(fullName: string): Channel {\n const { type, name } = BaseChannel.parse(fullName)\n\n switch (type) {\n case 'presence':\n return new PresenceChannel(name)\n case 'private':\n return new PrivateChannel(name)\n default:\n return new PublicChannel(name)\n }\n}\n\n/**\n * Check if channel requires authentication\n */\nexport const requiresAuth = BaseChannel.requiresAuth\n",
58
- "/**\n * @fileoverview Channel Manager for @gravito/ripple\n *\n * Manages channel subscriptions and member tracking.\n *\n * @module @gravito/ripple/channels\n */\n\nimport type { PresenceUserInfo, RippleWebSocket } from '../types'\nimport { CHANNEL_PREFIXES } from './Channel'\n\n/**\n * Manages all channel subscriptions and presence tracking.\n *\n * The ChannelManager is the central coordinator for WebSocket channel subscriptions.\n * It maintains mappings between clients, channels, and presence information, providing\n * efficient lookups for broadcasting and presence tracking.\n *\n * **Internal Use**: This class is primarily used internally by RippleServer. Most developers\n * interact with channels through RippleServer's public API instead.\n *\n * @example\n * ```typescript\n * // Typically used internally by RippleServer\n * const manager = new ChannelManager()\n *\n * // Add a client when they connect\n * manager.addClient(ws)\n *\n * // Subscribe them to a channel\n * manager.subscribe(ws.data.id, 'news')\n *\n * // Get all subscribers for broadcasting\n * const subscribers = manager.getSubscribers('news')\n * subscribers.forEach(ws => ws.send(message))\n *\n * // For presence channels with user info\n * manager.subscribe(ws.data.id, 'presence-chat.room1', {\n * id: 'user-123',\n * info: { name: 'John Doe', avatar: '/avatars/john.jpg' }\n * })\n * const members = manager.getPresenceMembers('presence-chat.room1')\n * ```\n */\nexport class ChannelManager {\n /** Map of channel name -> Set of client IDs */\n private subscriptions = new Map<string, Set<string>>()\n\n /** Map of client ID -> WebSocket */\n private clients = new Map<string, RippleWebSocket>()\n\n /** Map of presence channel -> Map of user ID -> user info */\n private presenceMembers = new Map<string, Map<string | number, PresenceUserInfo>>()\n\n // ─────────────────────────────────────────────────────────────\n // Client Management\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Register a new client WebSocket connection.\n *\n * Adds the client to the internal clients map, making it available for channel subscriptions\n * and broadcasts. This should be called immediately when a WebSocket connection is established.\n *\n * @param ws - The WebSocket connection with client data\n *\n * @example\n * ```typescript\n * // Called internally by RippleServer on connection\n * private handleOpen(ws: RippleWebSocket): void {\n * this.channels.addClient(ws)\n * // ... other connection logic\n * }\n * ```\n */\n addClient(ws: RippleWebSocket): void {\n this.clients.set(ws.data.id, ws)\n }\n\n /**\n * Remove a client and unsubscribe from all channels.\n *\n * Performs cleanup when a client disconnects, removing them from all channel subscriptions\n * and the client registry. Returns the list of channels the client was subscribed to,\n * useful for sending presence leave events.\n *\n * @param clientId - The unique client identifier (ws.data.id)\n * @returns Array of channel names the client was subscribed to before removal\n *\n * @example\n * ```typescript\n * // Called internally by RippleServer on disconnect\n * private handleClose(ws: RippleWebSocket): void {\n * const leftChannels = this.channels.removeClient(ws.data.id)\n *\n * // Notify presence channels about user leaving\n * for (const channel of leftChannels) {\n * if (channel.startsWith('presence-')) {\n * this.broadcast(channel, 'presence', { event: 'leave', data: ... })\n * }\n * }\n * }\n * ```\n */\n removeClient(clientId: string): string[] {\n const ws = this.clients.get(clientId)\n if (!ws) {\n return []\n }\n\n const leftChannels: string[] = []\n\n // Unsubscribe from all channels\n for (const channel of ws.data.channels) {\n this.unsubscribe(clientId, channel)\n leftChannels.push(channel)\n }\n\n this.clients.delete(clientId)\n return leftChannels\n }\n\n /**\n * Get a client WebSocket by ID.\n *\n * @param clientId - The client identifier\n * @returns The WebSocket connection, or undefined if not found\n */\n getClient(clientId: string): RippleWebSocket | undefined {\n return this.clients.get(clientId)\n }\n\n /**\n * Get all currently connected WebSocket clients.\n *\n * @returns Array of all connected WebSocket instances\n */\n getAllClients(): RippleWebSocket[] {\n return Array.from(this.clients.values())\n }\n\n // ─────────────────────────────────────────────────────────────\n // Subscription Management\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Subscribe a client to a channel.\n *\n * @param clientId - The client identifier\n * @param channel - The channel name\n * @param userInfo - User information for presence channels (required for presence-* channels)\n * @returns true if subscription succeeded, false if client not found\n */\n subscribe(clientId: string, channel: string, userInfo?: PresenceUserInfo): boolean {\n const ws = this.clients.get(clientId)\n if (!ws) {\n return false\n }\n\n // Add to channel subscriptions\n if (!this.subscriptions.has(channel)) {\n this.subscriptions.set(channel, new Set())\n }\n this.subscriptions.get(channel)?.add(clientId)\n\n // Track in client's channel set\n ws.data.channels.add(channel)\n\n // Handle presence channel\n if (channel.startsWith(CHANNEL_PREFIXES.presence) && userInfo) {\n this.addPresenceMember(channel, userInfo)\n ws.data.userId = userInfo.id\n ws.data.userInfo = userInfo.info\n }\n\n return true\n }\n\n /**\n * Unsubscribe a client from a channel.\n *\n * @param clientId - The client identifier\n * @param channel - The channel name\n * @returns true if unsubscription succeeded, false if client not found\n */\n unsubscribe(clientId: string, channel: string): boolean {\n const ws = this.clients.get(clientId)\n if (!ws) {\n return false\n }\n\n // Remove from channel subscriptions\n const channelSubs = this.subscriptions.get(channel)\n if (channelSubs) {\n channelSubs.delete(clientId)\n if (channelSubs.size === 0) {\n this.subscriptions.delete(channel)\n }\n }\n\n // Remove from client's channel set\n ws.data.channels.delete(channel)\n\n // Handle presence channel\n if (channel.startsWith(CHANNEL_PREFIXES.presence) && ws.data.userId) {\n this.removePresenceMember(channel, ws.data.userId)\n }\n\n return true\n }\n\n /**\n * Get all WebSocket subscribers of a channel.\n *\n * @param channel - The channel name\n * @returns Array of WebSocket connections subscribed to the channel\n */\n getSubscribers(channel: string): RippleWebSocket[] {\n const clientIds = this.subscriptions.get(channel)\n if (!clientIds) {\n return []\n }\n\n return Array.from(clientIds)\n .map((id) => this.clients.get(id))\n .filter((ws): ws is RippleWebSocket => ws !== undefined)\n }\n\n /**\n * Check if a client is subscribed to a channel.\n *\n * @param clientId - The client identifier\n * @param channel - The channel name\n * @returns true if subscribed, false otherwise\n */\n isSubscribed(clientId: string, channel: string): boolean {\n const channelSubs = this.subscriptions.get(channel)\n return channelSubs?.has(clientId) ?? false\n }\n\n // ─────────────────────────────────────────────────────────────\n // Presence Management\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Add a member to a presence channel\n */\n private addPresenceMember(channel: string, userInfo: PresenceUserInfo): void {\n if (!this.presenceMembers.has(channel)) {\n this.presenceMembers.set(channel, new Map())\n }\n this.presenceMembers.get(channel)?.set(userInfo.id, userInfo)\n }\n\n /**\n * Remove a member from a presence channel\n */\n private removePresenceMember(channel: string, userId: string | number): void {\n const members = this.presenceMembers.get(channel)\n if (members) {\n members.delete(userId)\n if (members.size === 0) {\n this.presenceMembers.delete(channel)\n }\n }\n }\n\n /**\n * Get all members of a presence channel.\n *\n * @param channel - The presence channel name\n * @returns Array of user information for all members in the channel\n */\n getPresenceMembers(channel: string): PresenceUserInfo[] {\n const members = this.presenceMembers.get(channel)\n return members ? Array.from(members.values()) : []\n }\n\n /**\n * Get subscriber count for a channel.\n *\n * @param channel - The channel name\n * @returns Number of clients subscribed to the channel\n */\n getMemberCount(channel: string): number {\n return this.subscriptions.get(channel)?.size ?? 0\n }\n\n // ─────────────────────────────────────────────────────────────\n // Statistics\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Get comprehensive channel statistics.\n *\n * @returns Statistics object containing total clients, channels, and per-channel subscriber counts\n */\n getStats(): {\n totalClients: number\n totalChannels: number\n channels: { name: string; subscribers: number }[]\n } {\n return {\n totalClients: this.clients.size,\n totalChannels: this.subscriptions.size,\n channels: Array.from(this.subscriptions.entries()).map(([name, subs]) => ({\n name,\n subscribers: subs.size,\n })),\n }\n }\n}\n",
49
+ "/**\n * @fileoverview Channel Manager for @gravito/ripple\n *\n * Manages channel subscriptions and member tracking.\n *\n * @module @gravito/ripple/channels\n */\n\nimport type { RippleSocket } from '../engines/IRippleEngine'\nimport type { PresenceUserInfo, RippleDriver } from '../types'\nimport { CHANNEL_PREFIXES } from './Channel'\n\n/**\n * Manages all channel subscriptions and presence tracking.\n *\n * The ChannelManager is the central coordinator for WebSocket channel subscriptions.\n * It maintains mappings between clients, channels, and presence information, providing\n * efficient lookups for broadcasting and presence tracking.\n *\n * **Internal Use**: This class is primarily used internally by RippleServer. Most developers\n * interact with channels through RippleServer's public API instead.\n *\n * @example\n * ```typescript\n * // Typically used internally by RippleServer\n * const manager = new ChannelManager()\n *\n * // Add a client when they connect\n * manager.addClient(ws)\n *\n * // Subscribe them to a channel\n * manager.subscribe(ws.data.id, 'news')\n *\n * // Get all subscribers for broadcasting\n * const subscribers = manager.getSubscribers('news')\n * subscribers.forEach(ws => ws.send(message))\n *\n * // For presence channels with user info\n * manager.subscribe(ws.data.id, 'presence-chat.room1', {\n * id: 'user-123',\n * info: { name: 'John Doe', avatar: '/avatars/john.jpg' }\n * })\n * const members = manager.getPresenceMembers('presence-chat.room1')\n * ```\n */\nexport class ChannelManager {\n /** Map of channel name -> Set of client IDs */\n private subscriptions = new Map<string, Set<string>>()\n\n /** Map of client ID -> WebSocket */\n private clients = new Map<string, RippleSocket>()\n\n /** Map of presence channel -> Map of user ID -> user info */\n private presenceMembers = new Map<string, Map<string | number, PresenceUserInfo>>()\n\n /** Optional driver for distributed presence tracking */\n private driver?: RippleDriver\n\n /**\n * Create a new ChannelManager.\n *\n * @param driver - Optional driver for distributed presence tracking\n */\n constructor(driver?: RippleDriver) {\n this.driver = driver\n }\n\n // ─────────────────────────────────────────────────────────────\n // Client Management\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Register a new client WebSocket connection.\n *\n * Adds the client to the internal clients map, making it available for channel subscriptions\n * and broadcasts. This should be called immediately when a WebSocket connection is established.\n *\n * @param ws - The WebSocket connection with client data\n *\n * @example\n * ```typescript\n * // Called internally by RippleServer on connection\n * private handleOpen(ws: RippleWebSocket): void {\n * this.channels.addClient(ws)\n * // ... other connection logic\n * }\n * ```\n */\n addClient(ws: RippleSocket): void {\n this.clients.set(ws.data.id, ws)\n }\n\n /**\n * Remove a client and unsubscribe from all channels.\n *\n * Performs cleanup when a client disconnects, removing them from all channel subscriptions\n * and the client registry. Returns the list of channels the client was subscribed to,\n * useful for sending presence leave events.\n *\n * @param clientId - The unique client identifier (ws.data.id)\n * @returns Array of channel names the client was subscribed to before removal\n *\n * @example\n * ```typescript\n * // Called internally by RippleServer on disconnect\n * private handleClose(ws: RippleWebSocket): void {\n * const leftChannels = this.channels.removeClient(ws.data.id)\n *\n * // Notify presence channels about user leaving\n * for (const channel of leftChannels) {\n * if (channel.startsWith('presence-')) {\n * this.broadcast(channel, 'presence', { event: 'leave', data: ... })\n * }\n * }\n * }\n * ```\n */\n removeClient(clientId: string): string[] {\n const ws = this.clients.get(clientId)\n if (!ws) {\n return []\n }\n\n const leftChannels: string[] = []\n\n // Unsubscribe from all channels\n for (const channel of ws.data.channels) {\n this.unsubscribe(clientId, channel)\n leftChannels.push(channel)\n }\n\n this.clients.delete(clientId)\n return leftChannels\n }\n\n /**\n * Get a client WebSocket by ID.\n *\n * @param clientId - The client identifier\n * @returns The WebSocket connection, or undefined if not found\n */\n getClient(clientId: string): RippleSocket | undefined {\n return this.clients.get(clientId)\n }\n\n /**\n * Get all currently connected WebSocket clients.\n *\n * @returns Array of all connected WebSocket instances\n */\n getAllClients(): RippleSocket[] {\n return Array.from(this.clients.values())\n }\n\n // ─────────────────────────────────────────────────────────────\n // Subscription Management\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Subscribe a client to a channel.\n *\n * @param clientId - The client identifier\n * @param channel - The channel name\n * @param userInfo - User information for presence channels (required for presence-* channels)\n * @returns true if subscription succeeded, false if client not found\n */\n async subscribe(\n clientId: string,\n channel: string,\n userInfo?: PresenceUserInfo\n ): Promise<boolean> {\n const ws = this.clients.get(clientId)\n if (!ws) {\n return false\n }\n\n // Add to channel subscriptions\n if (!this.subscriptions.has(channel)) {\n this.subscriptions.set(channel, new Set())\n }\n this.subscriptions.get(channel)?.add(clientId)\n\n // Track in client's channel set\n ws.data.channels.add(channel)\n\n // Handle presence channel\n if (channel.startsWith(CHANNEL_PREFIXES.presence) && userInfo) {\n await this.addPresenceMember(channel, userInfo)\n ws.data.userId = userInfo.id\n ws.data.userInfo = userInfo.info\n }\n\n return true\n }\n\n /**\n * Unsubscribe a client from a channel.\n *\n * @param clientId - The client identifier\n * @param channel - The channel name\n * @returns true if unsubscription succeeded, false if client not found\n */\n async unsubscribe(clientId: string, channel: string): Promise<boolean> {\n const ws = this.clients.get(clientId)\n if (!ws) {\n return false\n }\n\n // Remove from channel subscriptions\n const channelSubs = this.subscriptions.get(channel)\n if (channelSubs) {\n channelSubs.delete(clientId)\n if (channelSubs.size === 0) {\n this.subscriptions.delete(channel)\n }\n }\n\n // Remove from client's channel set\n ws.data.channels.delete(channel)\n\n // Handle presence channel\n if (channel.startsWith(CHANNEL_PREFIXES.presence) && ws.data.userId) {\n await this.removePresenceMember(channel, ws.data.userId)\n }\n\n return true\n }\n\n /**\n * Get all WebSocket subscribers of a channel.\n *\n * @param channel - The channel name\n * @returns Array of WebSocket connections subscribed to the channel\n */\n getSubscribers(channel: string): RippleSocket[] {\n const clientIds = this.subscriptions.get(channel)\n if (!clientIds) {\n return []\n }\n\n return Array.from(clientIds)\n .map((id) => this.clients.get(id))\n .filter((ws): ws is RippleSocket => ws !== undefined)\n }\n\n /**\n * Check if a client is subscribed to a channel.\n *\n * @param clientId - The client identifier\n * @param channel - The channel name\n * @returns true if subscribed, false otherwise\n */\n isSubscribed(clientId: string, channel: string): boolean {\n return this.subscriptions.get(channel)?.has(clientId) ?? false\n }\n\n // ─────────────────────────────────────────────────────────────\n // Presence Management\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Add a member to a presence channel.\n *\n * Uses driver for distributed tracking if available.\n */\n private async addPresenceMember(channel: string, userInfo: PresenceUserInfo): Promise<void> {\n // Track in local memory\n if (!this.presenceMembers.has(channel)) {\n this.presenceMembers.set(channel, new Map())\n }\n this.presenceMembers.get(channel)?.set(userInfo.id, userInfo)\n\n // Track in driver if available\n if (this.driver?.trackPresence) {\n await this.driver.trackPresence(channel, userInfo)\n }\n }\n\n /**\n * Remove a member from a presence channel.\n *\n * Uses driver for distributed tracking if available.\n */\n private async removePresenceMember(channel: string, userId: string | number): Promise<void> {\n // Remove from local memory\n const members = this.presenceMembers.get(channel)\n if (members) {\n members.delete(userId)\n if (members.size === 0) {\n this.presenceMembers.delete(channel)\n }\n }\n\n // Remove from driver if available\n if (this.driver?.untrackPresence) {\n await this.driver.untrackPresence(channel, userId)\n }\n }\n\n /**\n * Get all members of a presence channel.\n *\n * Queries driver if available for distributed presence data.\n *\n * @param channel - The presence channel name\n * @returns Array of user information for all members in the channel\n */\n async getPresenceMembers(channel: string): Promise<PresenceUserInfo[]> {\n // Use driver if available for distributed presence\n if (this.driver?.getPresenceMembers) {\n return await this.driver.getPresenceMembers(channel)\n }\n\n // Fall back to local memory\n const members = this.presenceMembers.get(channel)\n return members ? Array.from(members.values()) : []\n }\n\n /**\n * Get subscriber count for a channel.\n *\n * @param channel - The channel name\n * @returns Number of clients subscribed to the channel\n */\n getMemberCount(channel: string): number {\n return this.subscriptions.get(channel)?.size ?? 0\n }\n\n // ─────────────────────────────────────────────────────────────\n // Statistics\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Get comprehensive channel statistics.\n *\n * @returns Statistics object containing total clients, channels, and per-channel subscriber counts\n */\n getStats(): {\n totalClients: number\n totalChannels: number\n channels: { name: string; subscribers: number }[]\n } {\n return {\n totalClients: this.clients.size,\n totalChannels: this.subscriptions.size,\n channels: Array.from(this.subscriptions.entries()).map(([name, subs]) => ({\n name,\n subscribers: subs.size,\n })),\n }\n }\n}\n",
59
50
  "/**\n * @fileoverview Local (in-memory) driver for @gravito/ripple\n *\n * @module @gravito/ripple/drivers\n */\n\nimport type { DriverStatus, RippleDriver } from '../types'\n\n/**\n * Local (in-memory) driver for Ripple.\n *\n * This driver is intended for development and single-server deployments.\n * It distributes messages directly within the current process memory.\n *\n * @example\n * ```typescript\n * import { RippleServer, LocalDriver } from '@gravito/ripple'\n *\n * const server = new RippleServer({\n * driver: 'local' // Uses LocalDriver internally\n * })\n * ```\n */\nexport class LocalDriver implements RippleDriver {\n /** Driver name identifier */\n readonly name = 'local'\n\n /** In-memory map of channel subscribers: channel -> set of callbacks */\n private listeners = new Map<string, Set<(event: string, data: unknown) => void>>()\n private _initialized = false\n\n /**\n * Publish a message to a channel within the current process.\n *\n * @param channel - Target channel name\n * @param event - Event name\n * @param data - Event payload\n */\n async publish(channel: string, event: string, data: unknown): Promise<void> {\n const callbacks = this.listeners.get(channel)\n if (callbacks) {\n for (const callback of callbacks) {\n callback(event, data)\n }\n }\n }\n\n /**\n * Subscribe to a channel in memory.\n *\n * @param channel - Channel name\n * @param callback - Function called when a message is published to this channel\n */\n async subscribe(\n channel: string,\n callback: (event: string, data: unknown) => void\n ): Promise<void> {\n if (!this.listeners.has(channel)) {\n this.listeners.set(channel, new Set())\n }\n this.listeners.get(channel)?.add(callback)\n }\n\n /**\n * Unsubscribe from a channel in memory.\n *\n * @param channel - Channel name\n */\n async unsubscribe(channel: string): Promise<void> {\n this.listeners.delete(channel)\n }\n\n /**\n * Initialize the local driver.\n */\n async init(): Promise<void> {\n this._initialized = true\n }\n\n /**\n * Shutdown the local driver and clear all listeners.\n */\n async shutdown(): Promise<void> {\n this.listeners.clear()\n this._initialized = false\n }\n\n /**\n * Get the current status of the local driver.\n */\n getStatus(): DriverStatus {\n return {\n name: this.name,\n initialized: this._initialized,\n connected: this._initialized,\n }\n }\n}\n",
60
51
  "/**\n * @fileoverview Ripple error types\n *\n * @module @gravito/ripple/errors\n */\n\n/**\n * Base error class for Ripple module.\n *\n * Provides structured error handling with error codes and messages.\n *\n * @example\n * ```typescript\n * throw new RippleError('INVALID_FORMAT', 'Invalid message format')\n * ```\n */\nexport class RippleError extends Error {\n /**\n * Creates a new RippleError instance.\n *\n * @param code - The error code.\n * @param message - The error message.\n */\n constructor(\n public readonly code: string,\n message: string\n ) {\n super(message)\n this.name = 'RippleError'\n // Ensure proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, RippleError.prototype)\n }\n}\n\n/**\n * Error class for driver-related issues.\n *\n * Used specifically for errors that occur in driver implementations\n * (LocalDriver, RedisDriver).\n *\n * @example\n * ```typescript\n * throw new RippleDriverError(\n * 'REDIS_NOT_INSTALLED',\n * 'ioredis is required for RedisDriver'\n * )\n * ```\n */\nexport class RippleDriverError extends RippleError {\n /**\n * Creates a new RippleDriverError instance.\n *\n * @param code - The error code.\n * @param message - The error message.\n */\n constructor(code: string, message: string) {\n super(code, message)\n this.name = 'RippleDriverError'\n Object.setPrototypeOf(this, RippleDriverError.prototype)\n }\n}\n",
61
52
  "/**\n * Supported log levels for Ripple.\n */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\n/**\n * Structured log context containing metadata for logs.\n */\nexport interface LogContext {\n /** ISO 8601 timestamp */\n timestamp: string\n /** Log level */\n level: LogLevel\n /** Module name where the log originated */\n module: string\n /** Unique client identifier if applicable */\n clientId?: string\n /** Channel name if applicable */\n channel?: string\n /** Event name if applicable */\n event?: string\n /** Error code if applicable */\n errorCode?: string\n /** Additional dynamic metadata */\n [key: string]: unknown\n}\n\n/**\n * Interface for Ripple logging implementations.\n *\n * Developers can implement this interface to integrate Ripple with their\n * preferred logging systems (e.g., Winston, Pino, Datadog).\n *\n * @example\n * ```typescript\n * const myLogger: RippleLogger = {\n * debug: (msg, ctx) => console.log('[DEBUG]', msg, ctx),\n * info: (msg, ctx) => console.log('[INFO]', msg, ctx),\n * warn: (msg, ctx) => console.warn('[WARN]', msg, ctx),\n * error: (msg, ctx) => console.error('[ERROR]', msg, ctx)\n * }\n * ```\n */\nexport interface RippleLogger {\n /** Log a debug message */\n debug(message: string, context?: Partial<LogContext>): void\n /** Log an info message */\n info(message: string, context?: Partial<LogContext>): void\n /** Log a warning message */\n warn(message: string, context?: Partial<LogContext>): void\n /** Log an error message */\n error(message: string, context?: Partial<LogContext>): void\n}\n\n/**\n * Default JSON-based console logger for Ripple.\n *\n * Formats logs as JSON strings to the console, suitable for cloud log aggregators.\n */\nexport class ConsoleLogger implements RippleLogger {\n /**\n * Create a new ConsoleLogger.\n *\n * @param module - Module name for identification\n * @param minLevel - Minimum level to log (default: 'info')\n */\n constructor(\n private readonly module: string,\n private readonly minLevel: LogLevel = 'info'\n ) {}\n\n /**\n * Check if a message should be logged based on its level.\n */\n private shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error']\n return levels.indexOf(level) >= levels.indexOf(this.minLevel)\n }\n\n /**\n * Format the log context with standard metadata.\n */\n private formatContext(level: LogLevel, context?: Partial<LogContext>): LogContext {\n return {\n timestamp: new Date().toISOString(),\n level,\n module: this.module,\n ...context,\n }\n }\n\n /**\n * Log a debug message as JSON.\n */\n debug(message: string, context?: Partial<LogContext>): void {\n if (this.shouldLog('debug')) {\n console.debug(\n JSON.stringify({\n message,\n ...this.formatContext('debug', context),\n })\n )\n }\n }\n\n /**\n * Log an info message as JSON.\n */\n info(message: string, context?: Partial<LogContext>): void {\n if (this.shouldLog('info')) {\n console.info(\n JSON.stringify({\n message,\n ...this.formatContext('info', context),\n })\n )\n }\n }\n\n /**\n * Log a warning message as JSON.\n */\n warn(message: string, context?: Partial<LogContext>): void {\n if (this.shouldLog('warn')) {\n console.warn(\n JSON.stringify({\n message,\n ...this.formatContext('warn', context),\n })\n )\n }\n }\n\n /**\n * Log an error message as JSON.\n */\n error(message: string, context?: Partial<LogContext>): void {\n if (this.shouldLog('error')) {\n console.error(\n JSON.stringify({\n message,\n ...this.formatContext('error', context),\n })\n )\n }\n }\n}\n\n/**\n * Utility function to create a new ConsoleLogger.\n *\n * @param module - Module name\n * @param minLevel - Minimum log level\n * @returns A new RippleLogger instance\n */\nexport function createLogger(module: string, minLevel?: LogLevel): RippleLogger {\n return new ConsoleLogger(module, minLevel)\n}\n",
62
- "/**\n * @fileoverview Redis driver for @gravito/ripple\n *\n * @module @gravito/ripple/drivers\n */\n\nimport type { Redis as RedisClient, RedisOptions } from 'ioredis'\nimport { RippleDriverError } from '../errors/RippleError'\nimport type { RippleLogger } from '../logging/Logger'\nimport { createLogger } from '../logging/Logger'\nimport type { DriverStatus, RippleDriver } from '../types'\n\n/**\n * Configuration for the RedisDriver.\n */\nexport interface RedisDriverConfig {\n /** Redis server hostname (default: 'localhost') */\n host?: string\n /** Redis server port (default: 6379) */\n port?: number\n /** Redis password for authentication */\n password?: string\n /** Redis database index (default: 0) */\n db?: number\n /** Prefix for Ripple Redis channels (default: 'ripple:') */\n keyPrefix?: string\n /** Custom logger instance */\n logger?: RippleLogger\n /** Connection timeout in milliseconds (default: 5000) */\n connectTimeout?: number\n /** Command timeout in milliseconds (default: 3000) */\n commandTimeout?: number\n /** Whether to enable ready check (default: true) */\n enableReadyCheck?: boolean\n /** Whether to connect lazily (default: false) */\n lazyConnect?: boolean\n}\n\n/**\n * Redis driver for Ripple, enabling horizontal scaling via Redis Pub/Sub.\n *\n * This driver distributes messages across multiple server instances, allowing\n * clients connected to different servers to receive the same broadcasts.\n *\n * @example\n * ```typescript\n * import { RippleServer, RedisDriver } from '@gravito/ripple'\n *\n * const server = new RippleServer({\n * driver: 'redis',\n * redis: {\n * host: 'localhost',\n * port: 6379,\n * password: 'secret_password'\n * }\n * })\n * ```\n */\nexport class RedisDriver implements RippleDriver {\n /** Driver name identifier */\n readonly name = 'redis'\n\n /** Redis client for publishing messages */\n private redis?: RedisClient\n /** Redis client for subscribing to messages */\n private subscriber?: RedisClient\n /** Prefix for Redis channels to avoid collisions */\n private channelPrefix: string\n /** Local subscription map: channel -> callbacks */\n private subscriptions = new Map<string, Set<(event: string, data: unknown) => void>>()\n private _initialized = false\n private _connected = false\n private _lastError?: string\n private logger: RippleLogger\n\n /**\n * Create a new RedisDriver.\n *\n * @param config - Redis connection and behavior configuration\n */\n constructor(private config: RedisDriverConfig = {}) {\n this.channelPrefix = config.keyPrefix ?? 'ripple:'\n this.logger = config.logger ?? createLogger('RedisDriver')\n }\n\n /**\n * Check if the driver has been initialized.\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the Redis connections (Publisher and Subscriber).\n *\n * This method performs dynamic import of 'ioredis' to avoid mandatory\n * dependency on users who only use the local driver.\n *\n * @throws {RippleDriverError} If 'ioredis' is not installed or connection fails\n */\n async init(): Promise<void> {\n if (this._initialized) {\n this.logger.debug('RedisDriver already initialized, skipping')\n return\n }\n\n this.logger.info('Initializing RedisDriver', {\n host: this.config.host ?? 'localhost',\n port: this.config.port ?? 6379,\n })\n\n try {\n const Redis = await this.getRedisClient()\n\n const redisOptions: RedisOptions = {\n host: this.config.host ?? 'localhost',\n port: this.config.port ?? 6379,\n password: this.config.password,\n db: this.config.db ?? 0,\n retryStrategy: (times) => Math.min(times * 50, 2000),\n maxRetriesPerRequest: 3,\n connectTimeout: this.config.connectTimeout ?? 5000,\n commandTimeout: this.config.commandTimeout ?? 3000,\n enableReadyCheck: this.config.enableReadyCheck ?? true,\n lazyConnect: this.config.lazyConnect ?? false,\n }\n\n this.redis = new Redis(redisOptions)\n this.subscriber = new Redis(redisOptions)\n\n this.subscriber.on('message', (channel: string, message: string) => {\n this.handleMessage(channel, message)\n })\n\n this.subscriber.on('error', (error: Error) => {\n this.handleError('subscriber', error)\n })\n\n this.subscriber.on('connect', () => {\n this._connected = true\n this.logger.info('Redis subscriber connected')\n })\n\n this.subscriber.on('close', () => {\n this._connected = false\n this.logger.warn('Redis subscriber connection closed')\n })\n\n this.redis.on('error', (error: Error) => {\n this.handleError('publisher', error)\n })\n\n this._initialized = true\n this.logger.info('RedisDriver initialized successfully')\n } catch (error) {\n this._lastError = error instanceof Error ? error.message : String(error)\n this.logger.error('Failed to initialize RedisDriver', {\n error: this._lastError,\n errorCode: 'REDIS_CONNECTION_FAILED',\n })\n throw error\n }\n }\n\n /**\n * Publish a message to Redis Pub/Sub.\n *\n * @param channel - Target channel name\n * @param event - Event name\n * @param data - Event payload\n * @throws {RippleDriverError} If driver is not initialized\n */\n async publish(channel: string, event: string, data: unknown): Promise<void> {\n if (!this.redis || !this._initialized) {\n throw new RippleDriverError(\n 'DRIVER_NOT_INITIALIZED',\n 'RedisDriver not initialized. Call init() first.'\n )\n }\n\n const prefixedChannel = this.channelPrefix + channel\n const message = JSON.stringify({ event, data })\n\n await this.redis.publish(prefixedChannel, message)\n }\n\n /**\n * Subscribe to a channel via Redis Pub/Sub.\n *\n * Multiple calls for the same channel will only result in one Redis subscription,\n * while maintaining all local callbacks.\n *\n * @param channel - Channel name\n * @param callback - Function called when a message is received from Redis\n * @throws {RippleDriverError} If driver is not initialized\n */\n async subscribe(\n channel: string,\n callback: (event: string, data: unknown) => void\n ): Promise<void> {\n if (!this.subscriber || !this._initialized) {\n throw new RippleDriverError(\n 'DRIVER_NOT_INITIALIZED',\n 'RedisDriver not initialized. Call init() first.'\n )\n }\n\n const prefixedChannel = this.channelPrefix + channel\n\n if (!this.subscriptions.has(prefixedChannel)) {\n this.subscriptions.set(prefixedChannel, new Set())\n await this.subscriber.subscribe(prefixedChannel)\n this.logger.debug('Subscribed to Redis channel', { channel: prefixedChannel })\n }\n\n this.subscriptions.get(prefixedChannel)?.add(callback)\n }\n\n /**\n * Unsubscribe from a channel via Redis Pub/Sub.\n *\n * If no local callbacks remain for the channel, the actual Redis unsubscription\n * is performed.\n *\n * @param channel - Channel name\n */\n async unsubscribe(channel: string): Promise<void> {\n if (!this.subscriber) {\n return\n }\n\n const prefixedChannel = this.channelPrefix + channel\n\n this.subscriptions.delete(prefixedChannel)\n\n if (!this.subscriptions.has(prefixedChannel)) {\n await this.subscriber.unsubscribe(prefixedChannel)\n }\n }\n\n /**\n * Shutdown the Redis driver and close all connections.\n */\n async shutdown(): Promise<void> {\n this.logger.info('Shutting down RedisDriver')\n\n this.subscriptions.clear()\n\n if (this.subscriber) {\n try {\n await this.subscriber.quit()\n this.logger.debug('Redis subscriber quit successfully')\n } catch (error) {\n this._lastError = error instanceof Error ? error.message : String(error)\n this.logger.error('Failed to quit Redis subscriber', { error: this._lastError })\n }\n this.subscriber = undefined\n }\n\n if (this.redis) {\n try {\n await this.redis.quit()\n this.logger.debug('Redis publisher quit successfully')\n } catch (error) {\n this._lastError = error instanceof Error ? error.message : String(error)\n this.logger.error('Failed to quit Redis publisher', { error: this._lastError })\n }\n this.redis = undefined\n }\n\n this._initialized = false\n this._connected = false\n this.logger.info('RedisDriver shutdown complete')\n }\n\n /**\n * Get the current status of the Redis driver.\n */\n getStatus(): DriverStatus {\n return {\n name: this.name,\n initialized: this._initialized,\n connected: this._connected,\n lastError: this._lastError,\n }\n }\n\n /**\n * Handle an incoming message from Redis Pub/Sub.\n *\n * Dispatches the message to all local callbacks registered for the channel.\n */\n private handleMessage(channel: string, message: string): void {\n try {\n const callbacks = this.subscriptions.get(channel)\n if (!callbacks || callbacks.size === 0) {\n return\n }\n\n const parsed = JSON.parse(message)\n const { event, data } = parsed\n\n for (const callback of callbacks) {\n callback(event, data)\n }\n } catch (error) {\n this._lastError = error instanceof Error ? error.message : String(error)\n this.logger.error('Failed to handle Redis message', {\n channel,\n error: this._lastError,\n })\n }\n }\n\n /**\n * Handle Redis client errors.\n */\n private handleError(source: 'publisher' | 'subscriber', error: Error): void {\n this._lastError = `${source}: ${error.message}`\n this.logger.error(`Redis ${source} error`, {\n error: error.message,\n errorCode: 'REDIS_CONNECTION_FAILED',\n })\n }\n\n /**\n * Dynamically import ioredis to check if it's available.\n *\n * @throws {RippleDriverError} If ioredis package is missing\n */\n private async getRedisClient(): Promise<typeof import('ioredis').default> {\n try {\n const ioredis = await import('ioredis')\n return ioredis.default\n } catch {\n throw new RippleDriverError(\n 'REDIS_NOT_INSTALLED',\n 'ioredis is required for RedisDriver. Install it with: bun add ioredis'\n )\n }\n }\n}\n",
53
+ "/**\n * @fileoverview NATS driver for @gravito/ripple\n *\n * @module @gravito/ripple/drivers\n */\n\n// @ts-expect-error\nimport type { ConnectionOptions, NatsConnection } from 'nats'\nimport { RippleDriverError } from '../errors/RippleError'\nimport type { RippleLogger } from '../logging/Logger'\nimport { createLogger } from '../logging/Logger'\nimport type { DriverStatus, PresenceUserInfo, RippleDriver } from '../types'\n\n/**\n * Configuration for the NATSDriver.\n */\nexport interface NATSDriverConfig {\n /** NATS server URL (default: 'nats://localhost:4222') */\n servers?: string | string[]\n /** Credentials for authentication */\n user?: string\n password?: string\n token?: string\n /** Prefix for Ripple NATS subjects (default: 'ripple.') */\n subjectPrefix?: string\n /** Custom logger instance */\n logger?: RippleLogger\n /** Optional NATS connection options */\n connectionOptions?: ConnectionOptions\n}\n\n/**\n * NATS driver for Ripple, offering high-performance distributed broadcasting.\n *\n * @example\n * ```typescript\n * import { RippleServer, NATSDriver } from '@gravito/ripple'\n *\n * const server = new RippleServer({\n * driver: 'nats',\n * nats: {\n * servers: 'nats://localhost:4222'\n * }\n * })\n * ```\n */\nexport class NATSDriver implements RippleDriver {\n readonly name = 'nats'\n\n private nats?: NatsConnection\n private subjectPrefix: string\n private subscriptions = new Map<string, any>()\n private callbacks = new Map<string, Set<(event: string, data: unknown) => void>>()\n private _initialized = false\n private _connected = false\n private _lastError?: string\n private logger: RippleLogger\n\n constructor(private config: NATSDriverConfig = {}) {\n this.subjectPrefix = config.subjectPrefix ?? 'ripple.'\n this.logger = config.logger ?? createLogger('NATSDriver')\n }\n\n get isInitialized(): boolean {\n return this._initialized\n }\n\n async init(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n this.logger.info('Initializing NATSDriver', {\n servers: this.config.servers ?? 'nats://localhost:4222',\n })\n\n try {\n // @ts-expect-error\n const { connect } = await import('nats')\n this.nats = await connect({\n servers: this.config.servers ?? 'nats://localhost:4222',\n user: this.config.user,\n password: this.config.password,\n token: this.config.token,\n ...this.config.connectionOptions,\n })\n\n this._connected = true\n this._initialized = true\n\n this.nats.closed().then((err: Error | null) => {\n this._connected = false\n if (err) {\n this.handleError(err)\n }\n })\n\n this.logger.info('NATSDriver initialized successfully')\n } catch (error) {\n this._lastError = error instanceof Error ? error.message : String(error)\n throw new RippleDriverError('NATS_CONNECTION_FAILED', this._lastError)\n }\n }\n\n async publish(channel: string, event: string, data: unknown): Promise<void> {\n if (!this.nats || !this._initialized) {\n throw new RippleDriverError('DRIVER_NOT_INITIALIZED', 'NATSDriver not initialized')\n }\n\n const subject = this.subjectPrefix + channel\n // @ts-expect-error\n const sc = (await import('nats')).JSONCodec()\n this.nats.publish(subject, sc.encode({ event, data }))\n }\n\n async subscribe(\n channel: string,\n callback: (event: string, data: unknown) => void\n ): Promise<void> {\n if (!this.nats || !this._initialized) {\n throw new RippleDriverError('DRIVER_NOT_INITIALIZED', 'NATSDriver not initialized')\n }\n\n const subject = this.subjectPrefix + channel\n\n if (!this.callbacks.has(subject)) {\n this.callbacks.set(subject, new Set())\n\n // @ts-expect-error\n const sc = (await import('nats')).JSONCodec()\n const sub = this.nats.subscribe(subject)\n this.subscriptions.set(subject, sub)\n\n ;(async () => {\n for await (const m of sub) {\n try {\n const { event, data } = sc.decode(m.data) as any\n const channelCallbacks = this.callbacks.get(subject)\n if (channelCallbacks) {\n for (const cb of channelCallbacks) {\n cb(event, data)\n }\n }\n } catch (_e) {\n this.logger.error('Failed to decode NATS message', { subject })\n }\n }\n })()\n }\n\n this.callbacks.get(subject)?.add(callback)\n }\n\n async unsubscribe(channel: string): Promise<void> {\n const subject = this.subjectPrefix + channel\n const sub = this.subscriptions.get(subject)\n if (sub) {\n sub.unsubscribe()\n this.subscriptions.delete(subject)\n this.callbacks.delete(subject)\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.nats) {\n await this.nats.close()\n }\n this._initialized = false\n this._connected = false\n }\n\n getStatus(): DriverStatus {\n return {\n name: this.name,\n initialized: this._initialized,\n connected: this._connected,\n lastError: this._lastError,\n }\n }\n\n // Presence logic using KV Store\n /**\n * Track presence member using NATS KV Store.\n *\n * Creates or updates a bucket for the channel and stores user info with TTL.\n *\n * @param channel - Presence channel name\n * @param userInfo - User information to store\n * @since 4.0.0-alpha\n */\n async trackPresence(channel: string, userInfo: PresenceUserInfo): Promise<void> {\n if (!this.nats || !this._initialized) {\n throw new RippleDriverError('DRIVER_NOT_INITIALIZED', 'NATSDriver not initialized')\n }\n\n try {\n // @ts-expect-error\n const { jetstream } = await import('nats')\n const js = this.nats.jetstream()\n const bucketName = `ripple_presence_${channel.replace(/[^a-zA-Z0-9_-]/g, '_')}`\n\n // Get or create KV bucket with 5-minute TTL\n let kv: any\n try {\n kv = await js.views.kv(bucketName)\n } catch {\n // Bucket doesn't exist, create it\n kv = await js.views.kv(bucketName, {\n ttl: 300000, // 5 minutes in milliseconds\n history: 1, // Only keep latest value\n max_bytes: 1024 * 1024, // 1MB max\n })\n this.logger.debug('Created NATS KV bucket for presence', { bucketName })\n }\n\n // Store user info\n const userId = String(userInfo.id)\n const codec = jetstream().StringCodec()\n await kv.put(userId, codec.encode(JSON.stringify(userInfo)))\n\n this.logger.debug('Tracked presence member in NATS KV', { channel, userId })\n } catch (error) {\n this.logger.error('Failed to track presence in NATS KV', {\n channel,\n error: error instanceof Error ? error.message : String(error),\n })\n throw new RippleDriverError(\n 'NATS_KV_OPERATION_FAILED',\n `Failed to track presence: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n }\n\n /**\n * Remove presence member from NATS KV Store.\n *\n * @param channel - Presence channel name\n * @param userId - User ID to remove\n * @since 4.0.0-alpha\n */\n async untrackPresence(channel: string, userId: string | number): Promise<void> {\n if (!this.nats || !this._initialized) {\n throw new RippleDriverError('DRIVER_NOT_INITIALIZED', 'NATSDriver not initialized')\n }\n\n try {\n // @ts-expect-error\n await import('nats')\n const js = this.nats.jetstream()\n const bucketName = `ripple_presence_${channel.replace(/[^a-zA-Z0-9_-]/g, '_')}`\n\n try {\n const kv = await js.views.kv(bucketName)\n await kv.delete(String(userId))\n this.logger.debug('Untracked presence member from NATS KV', { channel, userId })\n } catch (_error) {\n // Bucket or key might not exist, which is fine\n this.logger.debug('Presence member not found in NATS KV', { channel, userId })\n }\n } catch (error) {\n this.logger.error('Failed to untrack presence in NATS KV', {\n channel,\n userId,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n /**\n * Get all presence members from NATS KV Store.\n *\n * @param channel - Presence channel name\n * @returns Array of presence user information\n * @since 4.0.0-alpha\n */\n async getPresenceMembers(channel: string): Promise<PresenceUserInfo[]> {\n if (!this.nats || !this._initialized) {\n throw new RippleDriverError('DRIVER_NOT_INITIALIZED', 'NATSDriver not initialized')\n }\n\n const members: PresenceUserInfo[] = []\n\n try {\n // @ts-expect-error\n const { jetstream } = await import('nats')\n const js = this.nats.jetstream()\n const bucketName = `ripple_presence_${channel.replace(/[^a-zA-Z0-9_-]/g, '_')}`\n\n try {\n const kv = await js.views.kv(bucketName)\n const codec = jetstream().StringCodec()\n\n // Get all keys\n const keys = await kv.keys()\n\n // Fetch each member's info\n for await (const key of keys) {\n try {\n const entry = await kv.get(key)\n if (entry) {\n const userInfoJson = codec.decode(entry.value)\n const userInfo = JSON.parse(userInfoJson)\n members.push(userInfo)\n }\n } catch (parseError) {\n this.logger.error('Failed to parse presence member data', {\n channel,\n key,\n error: parseError instanceof Error ? parseError.message : String(parseError),\n })\n }\n }\n\n this.logger.debug('Retrieved presence members from NATS KV', {\n channel,\n count: members.length,\n })\n } catch (_error) {\n // Bucket doesn't exist, return empty array\n this.logger.debug('Presence bucket not found in NATS KV', { channel })\n }\n } catch (_error) {\n this.logger.error('Failed to get presence members from NATS KV', {\n channel,\n error: _error instanceof Error ? _error.message : String(_error),\n })\n }\n\n return members\n }\n\n private handleError(error: Error): void {\n this._lastError = error.message\n this.logger.error('NATS error', { error: error.message })\n }\n}\n",
54
+ "/**\n * @fileoverview Redis driver for @gravito/ripple\n *\n * @module @gravito/ripple/drivers\n */\n\nimport type { Redis as RedisClient, RedisOptions } from 'ioredis'\nimport { RippleDriverError } from '../errors/RippleError'\nimport type { RippleLogger } from '../logging/Logger'\nimport { createLogger } from '../logging/Logger'\nimport type { DriverStatus, PresenceUserInfo, RippleDriver } from '../types'\n\n/**\n * Configuration for the RedisDriver.\n */\nexport interface RedisDriverConfig {\n /** Redis server hostname (default: 'localhost') */\n host?: string\n /** Redis server port (default: 6379) */\n port?: number\n /** Redis password for authentication */\n password?: string\n /** Redis database index (default: 0) */\n db?: number\n /** Prefix for Ripple Redis channels (default: 'ripple:') */\n keyPrefix?: string\n /** Custom logger instance */\n logger?: RippleLogger\n /** Connection timeout in milliseconds (default: 5000) */\n connectTimeout?: number\n /** Command timeout in milliseconds (default: 3000) */\n commandTimeout?: number\n /** Whether to enable ready check (default: true) */\n enableReadyCheck?: boolean\n /** Whether to connect lazily (default: false) */\n lazyConnect?: boolean\n}\n\n/**\n * Redis driver for Ripple, enabling horizontal scaling via Redis Pub/Sub.\n *\n * This driver distributes messages across multiple server instances, allowing\n * clients connected to different servers to receive the same broadcasts.\n *\n * @example\n * ```typescript\n * import { RippleServer, RedisDriver } from '@gravito/ripple'\n *\n * const server = new RippleServer({\n * driver: 'redis',\n * redis: {\n * host: 'localhost',\n * port: 6379,\n * password: 'secret_password'\n * }\n * })\n * ```\n */\nexport class RedisDriver implements RippleDriver {\n /** Driver name identifier */\n readonly name = 'redis'\n\n /** Redis client for publishing messages */\n private redis?: RedisClient\n /** Redis client for subscribing to messages */\n private subscriber?: RedisClient\n /** Prefix for Redis channels to avoid collisions */\n private channelPrefix: string\n /** Local subscription map: channel -> callbacks */\n private subscriptions = new Map<string, Set<(event: string, data: unknown) => void>>()\n private _initialized = false\n private _connected = false\n private _lastError?: string\n private logger: RippleLogger\n\n /**\n * Create a new RedisDriver.\n *\n * @param config - Redis connection and behavior configuration\n */\n constructor(private config: RedisDriverConfig = {}) {\n this.channelPrefix = config.keyPrefix ?? 'ripple:'\n this.logger = config.logger ?? createLogger('RedisDriver')\n }\n\n /**\n * Check if the driver has been initialized.\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the Redis connections (Publisher and Subscriber).\n *\n * This method performs dynamic import of 'ioredis' to avoid mandatory\n * dependency on users who only use the local driver.\n *\n * @throws {RippleDriverError} If 'ioredis' is not installed or connection fails\n */\n async init(): Promise<void> {\n if (this._initialized) {\n this.logger.debug('RedisDriver already initialized, skipping')\n return\n }\n\n this.logger.info('Initializing RedisDriver', {\n host: this.config.host ?? 'localhost',\n port: this.config.port ?? 6379,\n })\n\n try {\n const Redis = await this.getRedisClient()\n\n const redisOptions: RedisOptions = {\n host: this.config.host ?? 'localhost',\n port: this.config.port ?? 6379,\n password: this.config.password,\n db: this.config.db ?? 0,\n retryStrategy: (times) => Math.min(times * 50, 2000),\n maxRetriesPerRequest: 3,\n connectTimeout: this.config.connectTimeout ?? 5000,\n commandTimeout: this.config.commandTimeout ?? 3000,\n enableReadyCheck: this.config.enableReadyCheck ?? true,\n lazyConnect: this.config.lazyConnect ?? false,\n }\n\n this.redis = new Redis(redisOptions)\n this.subscriber = new Redis(redisOptions)\n\n this.subscriber.on('message', (channel: string, message: string) => {\n this.handleMessage(channel, message)\n })\n\n this.subscriber.on('error', (error: Error) => {\n this.handleError('subscriber', error)\n })\n\n this.subscriber.on('connect', () => {\n this._connected = true\n this.logger.info('Redis subscriber connected')\n })\n\n this.subscriber.on('close', () => {\n this._connected = false\n this.logger.warn('Redis subscriber connection closed')\n })\n\n this.redis.on('error', (error: Error) => {\n this.handleError('publisher', error)\n })\n\n this._initialized = true\n this.logger.info('RedisDriver initialized successfully')\n } catch (error) {\n this._lastError = error instanceof Error ? error.message : String(error)\n this.logger.error('Failed to initialize RedisDriver', {\n error: this._lastError,\n errorCode: 'REDIS_CONNECTION_FAILED',\n })\n throw error\n }\n }\n\n /**\n * Publish a message to Redis Pub/Sub.\n *\n * @param channel - Target channel name\n * @param event - Event name\n * @param data - Event payload\n * @throws {RippleDriverError} If driver is not initialized\n */\n async publish(channel: string, event: string, data: unknown): Promise<void> {\n if (!this.redis || !this._initialized) {\n throw new RippleDriverError(\n 'DRIVER_NOT_INITIALIZED',\n 'RedisDriver not initialized. Call init() first.'\n )\n }\n\n const prefixedChannel = this.channelPrefix + channel\n const message = JSON.stringify({ event, data })\n\n await this.redis.publish(prefixedChannel, message)\n }\n\n /**\n * Subscribe to a channel via Redis Pub/Sub.\n *\n * Multiple calls for the same channel will only result in one Redis subscription,\n * while maintaining all local callbacks.\n *\n * @param channel - Channel name\n * @param callback - Function called when a message is received from Redis\n * @throws {RippleDriverError} If driver is not initialized\n */\n async subscribe(\n channel: string,\n callback: (event: string, data: unknown) => void\n ): Promise<void> {\n if (!this.subscriber || !this._initialized) {\n throw new RippleDriverError(\n 'DRIVER_NOT_INITIALIZED',\n 'RedisDriver not initialized. Call init() first.'\n )\n }\n\n const prefixedChannel = this.channelPrefix + channel\n\n if (!this.subscriptions.has(prefixedChannel)) {\n this.subscriptions.set(prefixedChannel, new Set())\n await this.subscriber.subscribe(prefixedChannel)\n this.logger.debug('Subscribed to Redis channel', { channel: prefixedChannel })\n }\n\n this.subscriptions.get(prefixedChannel)?.add(callback)\n }\n\n /**\n * Unsubscribe from a channel via Redis Pub/Sub.\n *\n * If no local callbacks remain for the channel, the actual Redis unsubscription\n * is performed.\n *\n * @param channel - Channel name\n */\n async unsubscribe(channel: string): Promise<void> {\n if (!this.subscriber) {\n return\n }\n\n const prefixedChannel = this.channelPrefix + channel\n\n this.subscriptions.delete(prefixedChannel)\n\n if (!this.subscriptions.has(prefixedChannel)) {\n await this.subscriber.unsubscribe(prefixedChannel)\n }\n }\n\n /**\n * Shutdown the Redis driver and close all connections.\n */\n async shutdown(): Promise<void> {\n this.logger.info('Shutting down RedisDriver')\n\n this.subscriptions.clear()\n\n if (this.subscriber) {\n try {\n await this.subscriber.quit()\n this.logger.debug('Redis subscriber quit successfully')\n } catch (error) {\n this._lastError = error instanceof Error ? error.message : String(error)\n this.logger.error('Failed to quit Redis subscriber', { error: this._lastError })\n }\n this.subscriber = undefined\n }\n\n if (this.redis) {\n try {\n await this.redis.quit()\n this.logger.debug('Redis publisher quit successfully')\n } catch (error) {\n this._lastError = error instanceof Error ? error.message : String(error)\n this.logger.error('Failed to quit Redis publisher', { error: this._lastError })\n }\n this.redis = undefined\n }\n\n this._initialized = false\n this._connected = false\n this.logger.info('RedisDriver shutdown complete')\n }\n\n /**\n * Get the current status of the Redis driver.\n */\n getStatus(): DriverStatus {\n return {\n name: this.name,\n initialized: this._initialized,\n connected: this._connected,\n lastError: this._lastError,\n }\n }\n\n /**\n * Track a presence member in a channel.\n *\n * Stores presence information in Redis Hash for cross-node sharing.\n * Sets TTL on the hash to prevent stale data.\n *\n * @param channel - Presence channel name\n * @param userInfo - User information to track\n * @since 3.6.0\n */\n async trackPresence(channel: string, userInfo: PresenceUserInfo): Promise<void> {\n if (!this.redis || !this._initialized) {\n throw new RippleDriverError(\n 'DRIVER_NOT_INITIALIZED',\n 'RedisDriver not initialized. Call init() first.'\n )\n }\n\n const presenceKey = `${this.channelPrefix}presence:${channel}`\n const userId = String(userInfo.id)\n\n // Store user info as JSON in hash field\n await this.redis.hset(presenceKey, userId, JSON.stringify(userInfo))\n\n // Set TTL on the presence hash (5 minutes)\n await this.redis.expire(presenceKey, 300)\n\n this.logger.debug('Tracked presence member', { channel, userId })\n }\n\n /**\n * Remove a presence member from a channel.\n *\n * @param channel - Presence channel name\n * @param userId - User ID to remove\n * @since 3.6.0\n */\n async untrackPresence(channel: string, userId: string | number): Promise<void> {\n if (!this.redis || !this._initialized) {\n throw new RippleDriverError(\n 'DRIVER_NOT_INITIALIZED',\n 'RedisDriver not initialized. Call init() first.'\n )\n }\n\n const presenceKey = `${this.channelPrefix}presence:${channel}`\n await this.redis.hdel(presenceKey, String(userId))\n\n this.logger.debug('Untracked presence member', { channel, userId })\n }\n\n /**\n * Get all presence members for a channel.\n *\n * Retrieves all members from the Redis Hash.\n *\n * @param channel - Presence channel name\n * @returns Array of presence user information\n * @since 3.6.0\n */\n async getPresenceMembers(channel: string): Promise<PresenceUserInfo[]> {\n if (!this.redis || !this._initialized) {\n throw new RippleDriverError(\n 'DRIVER_NOT_INITIALIZED',\n 'RedisDriver not initialized. Call init() first.'\n )\n }\n\n const presenceKey = `${this.channelPrefix}presence:${channel}`\n const membersHash = await this.redis.hgetall(presenceKey)\n\n const members: PresenceUserInfo[] = []\n for (const [_userId, userInfoJson] of Object.entries(membersHash)) {\n try {\n const userInfo = JSON.parse(userInfoJson)\n members.push(userInfo)\n } catch (error) {\n this.logger.error('Failed to parse presence member data', {\n channel,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n return members\n }\n\n /**\n * Handle an incoming message from Redis Pub/Sub.\n *\n * Dispatches the message to all local callbacks registered for the channel.\n */\n private handleMessage(channel: string, message: string): void {\n try {\n const callbacks = this.subscriptions.get(channel)\n if (!callbacks || callbacks.size === 0) {\n return\n }\n\n const parsed = JSON.parse(message)\n const { event, data } = parsed\n\n for (const callback of callbacks) {\n callback(event, data)\n }\n } catch (error) {\n this._lastError = error instanceof Error ? error.message : String(error)\n this.logger.error('Failed to handle Redis message', {\n channel,\n error: this._lastError,\n })\n }\n }\n\n /**\n * Handle Redis client errors.\n */\n private handleError(source: 'publisher' | 'subscriber', error: Error): void {\n this._lastError = `${source}: ${error.message}`\n this.logger.error(`Redis ${source} error`, {\n error: error.message,\n errorCode: 'REDIS_CONNECTION_FAILED',\n })\n }\n\n /**\n * Dynamically import ioredis to check if it's available.\n *\n * @throws {RippleDriverError} If ioredis package is missing\n */\n private async getRedisClient(): Promise<typeof import('ioredis').default> {\n try {\n const ioredis = await import('ioredis')\n return ioredis.default\n } catch {\n throw new RippleDriverError(\n 'REDIS_NOT_INSTALLED',\n 'ioredis is required for RedisDriver. Install it with: bun add ioredis'\n )\n }\n }\n}\n",
63
55
  "/**\n * @fileoverview Broadcast Event base class\n *\n * Events that can be broadcast to WebSocket channels.\n *\n * @module @gravito/ripple/events\n */\n\nimport type { Channel } from '../types'\n\n/**\n * Abstract base class for broadcast events\n *\n * @example\n * ```typescript\n * class OrderShipped extends BroadcastEvent {\n * constructor(public order: Order) {\n * super()\n * }\n *\n * broadcastOn() {\n * return new PrivateChannel(`orders.${this.order.userId}`)\n * }\n *\n * broadcastAs() {\n * return 'OrderShipped'\n * }\n * }\n *\n * // Broadcast\n * broadcast(new OrderShipped(order))\n * ```\n */\nexport abstract class BroadcastEvent {\n /**\n * Define which channel(s) this event should be broadcast on.\n *\n * @returns Single Channel or array of Channels for multi-channel broadcasting\n *\n * @example\n * ```typescript\n * // Broadcast to a single private channel\n * broadcastOn() {\n * return new PrivateChannel(`orders.${this.order.userId}`)\n * }\n *\n * // Broadcast to multiple channels\n * broadcastOn() {\n * return [\n * new PrivateChannel(`user.${this.userId}`),\n * new PublicChannel('notifications')\n * ]\n * }\n * ```\n */\n abstract broadcastOn(): Channel | Channel[]\n\n /**\n * Define the event name for client listeners.\n *\n * @returns The event name (defaults to class name if not overridden)\n *\n * @example\n * ```typescript\n * // Use class name (default behavior)\n * class OrderShipped extends BroadcastEvent {\n * // Event name will be 'OrderShipped'\n * }\n *\n * // Custom event name\n * broadcastAs() {\n * return 'order.shipped' // dot notation style\n * }\n * ```\n */\n broadcastAs(): string {\n return this.constructor.name\n }\n\n /**\n * Exclude specific socket IDs from receiving this broadcast.\n *\n * @returns Array of socket IDs to exclude (empty array by default)\n *\n * @example\n * ```typescript\n * // Exclude the sender\n * class MessageSent extends BroadcastEvent {\n * constructor(\n * public message: Message,\n * public senderSocketId: string\n * ) { super() }\n *\n * broadcastExcept() {\n * return [this.senderSocketId] // Don't send back to sender\n * }\n * }\n * ```\n */\n broadcastExcept(): string[] {\n return []\n }\n\n /**\n * Define the event payload data sent to clients.\n *\n * @returns The data object to broadcast (all public properties by default)\n *\n * @example\n * ```typescript\n * // Default: All public properties are included\n * class OrderShipped extends BroadcastEvent {\n * constructor(public order: Order) { super() }\n * // Broadcasts: { order: { id, status, ... } }\n * }\n *\n * // Custom payload\n * class OrderShipped extends BroadcastEvent {\n * constructor(public order: Order) { super() }\n *\n * broadcastWith() {\n * return {\n * orderId: this.order.id,\n * trackingNumber: this.order.trackingNumber,\n * // Exclude sensitive data\n * }\n * }\n * }\n * ```\n */\n broadcastWith(): Record<string, unknown> {\n // By default, return all public properties\n const data: Record<string, unknown> = {}\n for (const key of Object.keys(this)) {\n data[key] = (this as Record<string, unknown>)[key]\n }\n return data\n }\n}\n",
64
56
  "/**\n * @fileoverview Broadcast manager for Ripple\n *\n * @module @gravito/ripple/events\n */\n\nimport type { RippleServer } from '../RippleServer'\nimport type { BroadcastEvent } from './BroadcastEvent'\n\n/**\n * Modern broadcast manager with dependency injection.\n *\n * BroadcastManager is the recommended way to broadcast events in Ripple applications.\n * It accepts RippleServer explicitly through the constructor (dependency injection),\n * making it testable and avoiding global state.\n *\n * @example\n * ```typescript\n * // Setup with dependency injection\n * const ripple = new RippleServer({ path: '/ws' })\n * const manager = new BroadcastManager(ripple)\n *\n * // Or bind to IoC container\n * container.bind('broadcast').toValue(new BroadcastManager(ripple))\n *\n * // Broadcast BroadcastEvent instances\n * manager.broadcast(new OrderShipped(order))\n *\n * // Fluent API for direct broadcasting\n * manager.to('news').emit('article.published', { id: 123 })\n * manager.toPrivate('orders.456').emit('order.updated', { status: 'shipped' })\n * manager.toPresence('chat.lobby').except('socket-1').emit('message', { text: 'Hi!' })\n * ```\n */\nexport class BroadcastManager {\n constructor(private readonly server: RippleServer) {}\n\n /**\n * Broadcast a BroadcastEvent to its designated channels.\n *\n * @param event - The BroadcastEvent instance to broadcast\n *\n * @example\n * ```typescript\n * class OrderShipped extends BroadcastEvent {\n * constructor(public order: Order) { super() }\n * broadcastOn() { return new PrivateChannel(`orders.${this.order.userId}`) }\n * broadcastAs() { return 'OrderShipped' }\n * }\n *\n * manager.broadcast(new OrderShipped(order))\n * ```\n */\n broadcast(event: BroadcastEvent): void {\n const channels = event.broadcastOn()\n const eventName = event.broadcastAs()\n const data = event.broadcastWith()\n\n const channelList = Array.isArray(channels) ? channels : [channels]\n\n for (const channel of channelList) {\n this.server.broadcast(channel.fullName, eventName, data)\n }\n }\n\n /**\n * Broadcast to a public channel.\n *\n * @param channel - The channel name (without prefix)\n * @returns ChannelBroadcaster for chaining\n */\n to(channel: string): ChannelBroadcaster {\n return new ChannelBroadcaster(this.server, channel)\n }\n\n /**\n * Broadcast to a private channel.\n *\n * @param channel - The channel name (will be prefixed with 'private-')\n * @returns ChannelBroadcaster for chaining\n */\n toPrivate(channel: string): ChannelBroadcaster {\n return new ChannelBroadcaster(this.server, `private-${channel}`)\n }\n\n /**\n * Broadcast to a presence channel.\n *\n * @param channel - The channel name (will be prefixed with 'presence-')\n * @returns ChannelBroadcaster for chaining\n */\n toPresence(channel: string): ChannelBroadcaster {\n return new ChannelBroadcaster(this.server, `presence-${channel}`)\n }\n}\n\n/**\n * Fluent broadcaster for channel-specific operations.\n *\n * Returned by BroadcastManager's `to()`, `toPrivate()`, and `toPresence()` methods.\n * Provides a chainable API for broadcasting with optional exclusions.\n */\nexport class ChannelBroadcaster {\n private _except: string[] = []\n\n constructor(\n private readonly server: RippleServer,\n private readonly channel: string\n ) {}\n\n /**\n * Exclude specific socket IDs from the broadcast.\n *\n * @param socketIds - Single socket ID or array of IDs to exclude\n * @returns this for method chaining\n */\n except(socketIds: string | string[]): this {\n const ids = Array.isArray(socketIds) ? socketIds : [socketIds]\n this._except.push(...ids)\n return this\n }\n\n /**\n * Emit the event to the channel.\n *\n * @param event - The event name\n * @param data - The event payload (must be JSON-serializable)\n */\n emit(event: string, data: unknown): void {\n this.server.broadcast(this.channel, event, data)\n }\n}\n",
65
57
  "/**\n * @fileoverview Broadcaster for sending events to channels\n *\n * @module @gravito/ripple/events\n */\n\nimport type { RippleServer } from '../RippleServer'\nimport type { BroadcastEvent } from './BroadcastEvent'\nimport { BroadcastManager } from './BroadcastManager'\n\nlet globalRippleServer: RippleServer | null = null\n\n/**\n * Set the global RippleServer instance.\n *\n * **⚠️ DEPRECATED**: This function is deprecated and will be removed in v4.0.\n * Use dependency injection with `BroadcastManager` instead.\n *\n * @deprecated Use BroadcastManager with dependency injection instead. Will be removed in v4.0.\n * @param server - The RippleServer instance to use globally\n *\n * @example\n * ```typescript\n * // ❌ Old way (deprecated)\n * import { setRippleServer } from '@gravito/ripple'\n * const ripple = new RippleServer({ path: '/ws' })\n * setRippleServer(ripple)\n *\n * // ✅ New way (recommended)\n * import { BroadcastManager } from '@gravito/ripple'\n * const ripple = new RippleServer({ path: '/ws' })\n * const manager = new BroadcastManager(ripple)\n * // Or with dependency injection:\n * container.bind('broadcast').toValue(new BroadcastManager(ripple))\n * ```\n *\n * @see {@link BroadcastManager} - Recommended replacement\n */\nexport function setRippleServer(server: RippleServer): void {\n globalRippleServer = server\n}\n\n/**\n * Get the global RippleServer instance.\n *\n * **⚠️ DEPRECATED**: This function is deprecated and will be removed in v4.0.\n * Use dependency injection with `BroadcastManager` instead.\n *\n * @deprecated Use BroadcastManager with dependency injection instead. Will be removed in v4.0.\n * @returns The globally configured RippleServer instance, or null if not configured\n *\n * @example\n * ```typescript\n * // ❌ Old way (deprecated)\n * import { getRippleServer } from '@gravito/ripple'\n * const ripple = getRippleServer()\n * if (ripple) {\n * ripple.broadcast('news', 'article.published', data)\n * }\n *\n * // ✅ New way (recommended)\n * import { BroadcastManager } from '@gravito/ripple'\n * const manager = container.make<BroadcastManager>('broadcast')\n * manager.to('news').emit('article.published', data)\n * ```\n *\n * @see {@link BroadcastManager} - Recommended replacement\n */\nexport function getRippleServer(): RippleServer | null {\n return globalRippleServer\n}\n\n/**\n * Broadcast a BroadcastEvent to its designated channels.\n *\n * **⚠️ DEPRECATED**: This function is deprecated and will be removed in v4.0.\n * Use `BroadcastManager.broadcast()` with dependency injection instead.\n *\n * This function uses a global RippleServer instance. In modern applications,\n * prefer dependency injection with BroadcastManager for better testability\n * and cleaner architecture.\n *\n * @deprecated Use BroadcastManager.broadcast() instead. Will be removed in v4.0.\n * @param event - The BroadcastEvent to send (determines channels via broadcastOn())\n *\n * @example\n * ```typescript\n * // ❌ Old way (deprecated)\n * import { broadcast } from '@gravito/ripple'\n *\n * class OrderShipped extends BroadcastEvent {\n * constructor(public order: Order) { super() }\n * broadcastOn() { return new PrivateChannel(`orders.${this.order.userId}`) }\n * broadcastAs() { return 'OrderShipped' }\n * }\n *\n * broadcast(new OrderShipped(order))\n *\n * // ✅ New way (recommended)\n * import { BroadcastManager } from '@gravito/ripple'\n *\n * class OrderShipped extends BroadcastEvent {\n * constructor(public order: Order) { super() }\n * broadcastOn() { return new PrivateChannel(`orders.${this.order.userId}`) }\n * broadcastAs() { return 'OrderShipped' }\n * }\n *\n * const manager = container.make<BroadcastManager>('broadcast')\n * manager.broadcast(new OrderShipped(order))\n * ```\n *\n * @see {@link BroadcastManager.broadcast} - Recommended replacement\n * @see {@link BroadcastEvent} - For creating broadcast events\n */\nexport function broadcast(event: BroadcastEvent): void {\n if (!globalRippleServer) {\n console.warn('[Ripple] No server configured. Use BroadcastManager instead.')\n return\n }\n\n const manager = new BroadcastManager(globalRippleServer)\n manager.broadcast(event)\n}\n\n/**\n * Fluent API for broadcasting events to channels.\n *\n * **⚠️ DEPRECATED**: This class is deprecated and will be removed in v4.0.\n * Use `BroadcastManager` with dependency injection for a cleaner, more testable approach.\n *\n * The Broadcaster class uses a global RippleServer instance, which makes testing difficult\n * and creates hidden dependencies. BroadcastManager accepts the server explicitly through\n * dependency injection.\n *\n * @deprecated Use BroadcastManager instead. Will be removed in v4.0.\n *\n * @example\n * ```typescript\n * // ❌ Old way (deprecated)\n * import { Broadcaster } from '@gravito/ripple'\n *\n * Broadcaster.to('news').emit('article.published', { id: 123 })\n * Broadcaster.toPrivate('orders.456').emit('order.shipped', data)\n * Broadcaster.toPresence('chat.lobby')\n * .except(['socket-id-1', 'socket-id-2'])\n * .emit('message', { text: 'Hello!' })\n *\n * // ✅ New way (recommended)\n * import { BroadcastManager } from '@gravito/ripple'\n *\n * const manager = container.make<BroadcastManager>('broadcast')\n * manager.to('news').emit('article.published', { id: 123 })\n * manager.to('private-orders.456').emit('order.shipped', data)\n * manager.to('presence-chat.lobby')\n * .except(['socket-id-1', 'socket-id-2'])\n * .emit('message', { text: 'Hello!' })\n * ```\n *\n * @see {@link BroadcastManager} - Recommended replacement with dependency injection\n */\nexport class Broadcaster {\n private _channel: string\n private _except: string[] = []\n\n private constructor(channel: string) {\n this._channel = channel\n }\n\n /**\n * Create a broadcaster for a public channel.\n *\n * **⚠️ DEPRECATED**: Use `BroadcastManager.to()` instead.\n *\n * @deprecated Use BroadcastManager.to() instead. Will be removed in v4.0.\n * @param channel - The public channel name (without prefix)\n * @returns A Broadcaster instance for the channel\n *\n * @example\n * ```typescript\n * // ❌ Deprecated\n * Broadcaster.to('news').emit('article.published', data)\n *\n * // ✅ Recommended\n * manager.to('news').emit('article.published', data)\n * ```\n */\n static to(channel: string): Broadcaster {\n return new Broadcaster(channel)\n }\n\n /**\n * Create a broadcaster for a private channel.\n *\n * Automatically prefixes the channel name with 'private-'.\n *\n * **⚠️ DEPRECATED**: Use `BroadcastManager.to()` with manual prefix instead.\n *\n * @deprecated Use BroadcastManager.to() instead. Will be removed in v4.0.\n * @param channel - The channel name (will be prefixed with 'private-')\n * @returns A Broadcaster instance for the private channel\n *\n * @example\n * ```typescript\n * // ❌ Deprecated\n * Broadcaster.toPrivate('orders.123').emit('order.shipped', data)\n *\n * // ✅ Recommended\n * manager.to('private-orders.123').emit('order.shipped', data)\n * ```\n */\n static toPrivate(channel: string): Broadcaster {\n return new Broadcaster(`private-${channel}`)\n }\n\n /**\n * Create a broadcaster for a presence channel.\n *\n * Automatically prefixes the channel name with 'presence-'.\n *\n * **⚠️ DEPRECATED**: Use `BroadcastManager.to()` with manual prefix instead.\n *\n * @deprecated Use BroadcastManager.to() instead. Will be removed in v4.0.\n * @param channel - The channel name (will be prefixed with 'presence-')\n * @returns A Broadcaster instance for the presence channel\n *\n * @example\n * ```typescript\n * // ❌ Deprecated\n * Broadcaster.toPresence('chat.lobby').emit('message', { text: 'Hello!' })\n *\n * // ✅ Recommended\n * manager.to('presence-chat.lobby').emit('message', { text: 'Hello!' })\n * ```\n */\n static toPresence(channel: string): Broadcaster {\n return new Broadcaster(`presence-${channel}`)\n }\n\n /**\n * Exclude specific socket IDs from receiving the broadcast.\n *\n * Useful for preventing the sender from receiving their own message\n * or excluding specific users from a broadcast.\n *\n * **⚠️ DEPRECATED**: Use `BroadcastManager.to().except()` instead.\n *\n * @deprecated Use BroadcastManager instead. Will be removed in v4.0.\n * @param socketIds - Single socket ID or array of socket IDs to exclude\n * @returns The Broadcaster instance for method chaining\n *\n * @example\n * ```typescript\n * // ❌ Deprecated\n * Broadcaster.to('chat.room1')\n * .except('socket-id-sender')\n * .emit('message', { text: 'Hello!' })\n *\n * Broadcaster.to('chat.room1')\n * .except(['socket-id-1', 'socket-id-2'])\n * .emit('notification', { type: 'info' })\n *\n * // ✅ Recommended\n * manager.to('chat.room1')\n * .except('socket-id-sender')\n * .emit('message', { text: 'Hello!' })\n * ```\n */\n except(socketIds: string | string[]): this {\n const ids = Array.isArray(socketIds) ? socketIds : [socketIds]\n this._except.push(...ids)\n return this\n }\n\n /**\n * Emit an event to the configured channel.\n *\n * Sends the event to all subscribers of the channel, excluding any socket IDs\n * specified via the `except()` method.\n *\n * **⚠️ DEPRECATED**: Use `BroadcastManager.to().emit()` instead.\n *\n * @deprecated Use BroadcastManager instead. Will be removed in v4.0.\n * @param event - The event name that clients will listen for\n * @param data - The event payload (must be JSON-serializable)\n *\n * @example\n * ```typescript\n * // ❌ Deprecated\n * Broadcaster.to('news').emit('article.published', {\n * id: 123,\n * title: 'Breaking News'\n * })\n *\n * // ✅ Recommended\n * manager.to('news').emit('article.published', {\n * id: 123,\n * title: 'Breaking News'\n * })\n * ```\n */\n emit(event: string, data: unknown): void {\n if (!globalRippleServer) {\n console.warn('[Ripple] No server configured. Use BroadcastManager instead.')\n return\n }\n\n globalRippleServer.broadcast(this._channel, event, data)\n }\n}\n",
66
- "import type { RippleServer } from '../RippleServer'\nimport type { RippleDriver } from '../types'\n\n/**\n * Health status levels for individual components or the overall system.\n */\nexport type HealthStatus = 'healthy' | 'degraded' | 'unhealthy'\n\n/**\n * Health information for a specific system component.\n */\nexport interface ComponentHealth {\n /** Current health status */\n status: HealthStatus\n /** Descriptive message about the health state */\n message?: string\n /** ISO 8601 timestamp of the last check */\n lastCheck: string\n}\n\n/**\n * Result of a system-wide health check.\n */\nexport interface HealthCheckResult {\n /** Overall system health status */\n status: HealthStatus\n /** ISO 8601 timestamp of the check */\n timestamp: string\n /** Server uptime in milliseconds */\n uptime: number\n /** Health status of individual components */\n checks: {\n /** WebSocket server health */\n websocket: ComponentHealth\n /** Message distribution driver health */\n driver: ComponentHealth\n }\n /** Real-time performance statistics */\n stats: {\n /** Current number of active client connections */\n activeConnections: number\n /** Total number of active channels */\n totalChannels: number\n /** Average message throughput (messages per second) */\n messagesPerSecond: number\n }\n}\n\n/**\n * HealthChecker monitors the Ripple server and its driver.\n *\n * It provides real-time health diagnostics, performance metrics (MPS),\n * and tracks server uptime.\n */\nexport class HealthChecker {\n private startTime = Date.now()\n private messageCount = 0\n private lastMessageCountReset = Date.now()\n\n /**\n * Create a new HealthChecker.\n *\n * @param server - The Ripple server instance to monitor\n * @param driver - The message driver instance to monitor\n */\n constructor(\n private readonly server: RippleServer,\n private readonly driver: RippleDriver\n ) {}\n\n /**\n * Record a message being processed.\n *\n * Used to calculate messages-per-second (MPS) metrics.\n */\n recordMessage(): void {\n this.messageCount++\n }\n\n /**\n * Perform a full system health check.\n *\n * Resets the message counter and calculates MPS since the last check.\n *\n * @returns Detailed health check result\n */\n async check(): Promise<HealthCheckResult> {\n const now = new Date()\n const driverHealth = await this.checkDriver()\n const websocketHealth = this.checkWebSocket()\n\n const overallStatus = this.determineOverallStatus([driverHealth.status, websocketHealth.status])\n\n const elapsed = (Date.now() - this.lastMessageCountReset) / 1000\n const messagesPerSecond = elapsed > 0 ? this.messageCount / elapsed : 0\n\n this.messageCount = 0\n this.lastMessageCountReset = Date.now()\n\n const stats = this.server.getStats()\n\n return {\n status: overallStatus,\n timestamp: now.toISOString(),\n uptime: Date.now() - this.startTime,\n checks: {\n websocket: websocketHealth,\n driver: driverHealth,\n },\n stats: {\n activeConnections: stats.totalClients,\n totalChannels: stats.totalChannels,\n messagesPerSecond: Math.round(messagesPerSecond * 100) / 100,\n },\n }\n }\n\n /**\n * Check the health of the WebSocket server layer.\n */\n private checkWebSocket(): ComponentHealth {\n try {\n const stats = this.server.getStats()\n return {\n status: 'healthy',\n message: `${stats.totalClients} active connections`,\n lastCheck: new Date().toISOString(),\n }\n } catch (error) {\n return {\n status: 'unhealthy',\n message: error instanceof Error ? error.message : 'Unknown error',\n lastCheck: new Date().toISOString(),\n }\n }\n }\n\n /**\n * Check the health of the message distribution driver.\n */\n private async checkDriver(): Promise<ComponentHealth> {\n try {\n if ('isInitialized' in this.driver && !this.driver.isInitialized) {\n return {\n status: 'unhealthy',\n message: 'Driver not initialized',\n lastCheck: new Date().toISOString(),\n }\n }\n\n return {\n status: 'healthy',\n message: `${this.driver.name} driver operational`,\n lastCheck: new Date().toISOString(),\n }\n } catch (error) {\n return {\n status: 'unhealthy',\n message: error instanceof Error ? error.message : 'Unknown error',\n lastCheck: new Date().toISOString(),\n }\n }\n }\n\n /**\n * Determine the overall status based on component statuses.\n *\n * @param statuses - Array of component health statuses\n * @returns The most severe status found\n */\n private determineOverallStatus(statuses: HealthStatus[]): HealthStatus {\n if (statuses.includes('unhealthy')) return 'unhealthy'\n if (statuses.includes('degraded')) return 'degraded'\n return 'healthy'\n }\n}\n",
67
- "import type { RippleLogger } from '../logging/Logger'\nimport { createLogger } from '../logging/Logger'\n\n/**\n * Events tracked by the ConnectionTracker.\n */\nexport type ConnectionEvent =\n | { type: 'connected'; clientId: string; timestamp: Date }\n | {\n type: 'disconnected'\n clientId: string\n timestamp: Date\n code: number\n reason: string\n duration: number\n }\n | { type: 'subscribed'; clientId: string; channel: string; timestamp: Date }\n | { type: 'unsubscribed'; clientId: string; channel: string; timestamp: Date }\n | { type: 'error'; clientId: string; error: string; timestamp: Date }\n\n/**\n * Interface for tracking WebSocket connection lifecycles and statistics.\n *\n * Implementations are responsible for monitoring active connections,\n * subscription states, and providing metrics for observability.\n */\nexport interface ConnectionTracker {\n /** Called when a client establishes a connection */\n onConnect(clientId: string): void\n /** Called when a client disconnects */\n onDisconnect(clientId: string, code: number, reason: string): void\n /** Called when a client subscribes to a channel */\n onSubscribe(clientId: string, channel: string): void\n /** Called when a client unsubscribes from a channel */\n onUnsubscribe(clientId: string, channel: string): void\n /** Called when a client-related error occurs */\n onError(clientId: string, error: string): void\n /** Get the duration of an active connection in milliseconds */\n getConnectionDuration(clientId: string): number | null\n /** Get the total number of active connections */\n getActiveConnections(): number\n}\n\n/**\n * Default implementation of the ConnectionTracker.\n *\n * Maintains an in-memory map of active connections and logs lifecycle events.\n * Provides basic metrics like active connection count and connection duration.\n */\nexport class DefaultConnectionTracker implements ConnectionTracker {\n /** Map of active connection data: clientId -> connection info */\n private connections = new Map<\n string,\n {\n connectedAt: Date\n subscriptions: Set<string>\n }\n >()\n\n private logger: RippleLogger\n\n /**\n * Create a new DefaultConnectionTracker.\n *\n * @param logger - Optional custom logger (defaults to ConsoleLogger)\n */\n constructor(logger?: RippleLogger) {\n this.logger = logger ?? createLogger('ConnectionTracker')\n }\n\n /**\n * Track a new connection.\n *\n * @param clientId - Unique client identifier\n */\n onConnect(clientId: string): void {\n this.connections.set(clientId, {\n connectedAt: new Date(),\n subscriptions: new Set(),\n })\n\n this.logger.info('Client connected', {\n clientId,\n activeConnections: this.getActiveConnections(),\n })\n }\n\n /**\n * Clean up and log disconnection metrics.\n *\n * @param clientId - Client identifier\n * @param code - WebSocket close code\n * @param reason - Close reason\n */\n onDisconnect(clientId: string, code: number, reason: string): void {\n const connection = this.connections.get(clientId)\n const duration = connection ? Date.now() - connection.connectedAt.getTime() : 0\n\n this.logger.info('Client disconnected', {\n clientId,\n code: code.toString(),\n reason,\n durationMs: duration,\n subscriptions: connection?.subscriptions.size ?? 0,\n })\n\n this.connections.delete(clientId)\n }\n\n /**\n * Track channel subscription.\n *\n * @param clientId - Client identifier\n * @param channel - Channel name\n */\n onSubscribe(clientId: string, channel: string): void {\n const connection = this.connections.get(clientId)\n connection?.subscriptions.add(channel)\n\n this.logger.debug('Client subscribed', {\n clientId,\n channel,\n })\n }\n\n /**\n * Track channel unsubscription.\n *\n * @param clientId - Client identifier\n * @param channel - Channel name\n */\n onUnsubscribe(clientId: string, channel: string): void {\n const connection = this.connections.get(clientId)\n connection?.subscriptions.delete(channel)\n\n this.logger.debug('Client unsubscribed', {\n clientId,\n channel,\n })\n }\n\n /**\n * Log client errors.\n *\n * @param clientId - Client identifier\n * @param error - Error message\n */\n onError(clientId: string, error: string): void {\n this.logger.error('Client error', {\n clientId,\n error,\n })\n }\n\n /**\n * Calculate connection duration.\n *\n * @param clientId - Client identifier\n * @returns Duration in milliseconds, or null if not found\n */\n getConnectionDuration(clientId: string): number | null {\n const connection = this.connections.get(clientId)\n if (!connection) return null\n return Date.now() - connection.connectedAt.getTime()\n }\n\n /**\n * Get total active connection count.\n */\n getActiveConnections(): number {\n return this.connections.size\n }\n}\n",
68
- "import type { ServerMessage } from '../types'\n\n/**\n * Utility class for serializing server-to-client messages.\n *\n * Provides performance optimizations like pre-serialized common messages\n * and a per-broadcast cache to reduce JSON.stringify overhead during\n * multi-channel broadcasting.\n */\nexport class MessageSerializer {\n /** Pre-serialized pong message for heartbeat responses */\n private static readonly PONG_MESSAGE = JSON.stringify({ type: 'pong' })\n\n /** Cached serialized string for the current broadcast operation */\n private broadcastCache: string | null = null\n\n /**\n * Get the pre-serialized pong message.\n *\n * @returns Serialized {\"type\":\"pong\"} string\n */\n getPongMessage(): string {\n return MessageSerializer.PONG_MESSAGE\n }\n\n /**\n * Serialize a server message to a JSON string.\n *\n * @param message - The server message object to serialize\n * @returns Serialized JSON string\n */\n serialize(message: ServerMessage): string {\n return JSON.stringify(message)\n }\n\n /**\n * Serialize a message for broadcasting, with internal caching.\n *\n * If a broadcast cache already exists, it is returned immediately.\n * Otherwise, the message is serialized and stored in the cache.\n *\n * @param message - The server message to serialize and cache\n * @returns Serialized JSON string\n */\n serializeForBroadcast(message: ServerMessage): string {\n if (!this.broadcastCache) {\n this.broadcastCache = JSON.stringify(message)\n }\n return this.broadcastCache\n }\n\n /**\n * Clear the current broadcast cache.\n *\n * Should be called after a broadcast operation is complete to prepare\n * for the next broadcast.\n */\n clearBroadcastCache(): void {\n this.broadcastCache = null\n }\n}\n",
69
- "/**\n * @fileoverview Ripple WebSocket Server\n *\n * Core WebSocket server implementation using Bun's native WebSocket API.\n *\n * @module @gravito/ripple\n */\n\nimport type { Server } from 'bun'\nimport { ChannelManager, requiresAuth } from './channels'\nimport { LocalDriver, RedisDriver } from './drivers'\nimport { HealthChecker } from './health/HealthChecker'\nimport type { RippleLogger } from './logging/Logger'\nimport { createLogger } from './logging/Logger'\nimport type { ConnectionTracker } from './tracking/ConnectionTracker'\nimport { DefaultConnectionTracker } from './tracking/ConnectionTracker'\nimport type {\n ChannelAuthorizer,\n ClientData,\n ClientMessage,\n RippleConfig,\n RippleDriver,\n RippleWebSocket,\n ServerMessage,\n WebSocketHandlerConfig,\n} from './types'\nimport { MessageSerializer } from './utils/MessageSerializer'\n\n/**\n * Ripple WebSocket Server\n *\n * Provides channel-based real-time communication using Bun's native WebSocket.\n *\n * @example\n * ```typescript\n * const ripple = new RippleServer({\n * path: '/ws',\n * authorizer: async (channel, userId) => {\n * // Custom authorization logic\n * return true\n * }\n * })\n *\n * Bun.serve({\n * fetch: (req, server) => {\n * if (ripple.upgrade(req, server)) return\n * return new Response('Not found', { status: 404 })\n * },\n * websocket: ripple.getHandler()\n * })\n * ```\n */\nexport class RippleServer {\n private channels: ChannelManager\n private driver: RippleDriver\n private authorizer?: ChannelAuthorizer\n private pingInterval?: ReturnType<typeof setInterval>\n private eventListeners: Map<string, ((socket: RippleWebSocket, data: any) => void)[]> = new Map()\n private logger: RippleLogger\n private tracker: ConnectionTracker\n private healthChecker: HealthChecker\n private serializer: MessageSerializer\n\n readonly config: Required<Pick<RippleConfig, 'path' | 'authEndpoint' | 'pingInterval'>> &\n RippleConfig\n\n constructor(config: RippleConfig = {}) {\n this.config = {\n path: '/ws',\n authEndpoint: '/broadcasting/auth',\n pingInterval: 30000,\n ...config,\n }\n\n this.logger = config.logger ?? createLogger('RippleServer', config.logLevel)\n this.channels = new ChannelManager()\n this.driver =\n config.driver === 'redis'\n ? new RedisDriver({ ...config.redis, logger: this.logger })\n : new LocalDriver()\n this.authorizer = config.authorizer\n this.tracker = config.connectionTracker ?? new DefaultConnectionTracker(this.logger)\n this.healthChecker = new HealthChecker(this, this.driver)\n this.serializer = new MessageSerializer()\n }\n\n /**\n * Register an event listener for custom client events.\n *\n * Allows server-side code to react to custom events sent by WebSocket clients.\n * This is useful for handling client-initiated actions like typing indicators,\n * presence updates, or custom application logic.\n *\n * @param event - The event name to listen for (e.g., 'typing', 'user.online')\n * @param handler - Callback function invoked when the event is received\n * @param handler.socket - The WebSocket connection that sent the event\n * @param handler.data - The event payload sent by the client\n *\n * @example\n * ```typescript\n * // Listen for typing indicators\n * ripple.on('typing', (socket, data) => {\n * console.log(`User ${socket.data.userId} is typing in ${data.channel}`)\n * // Broadcast typing indicator to other users\n * ripple.to(data.channel).emit('user-typing', {\n * userId: socket.data.userId\n * })\n * })\n *\n * // Listen for custom game moves\n * ripple.on('game.move', async (socket, data) => {\n * await saveGameMove(data.gameId, data.move)\n * ripple.to(`game.${data.gameId}`).emit('move-made', data)\n * })\n * ```\n */\n on(event: string, handler: (socket: RippleWebSocket, data: any) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, [])\n }\n this.eventListeners.get(event)?.push(handler)\n }\n\n /**\n * Fluent API for broadcasting to a channel.\n *\n * Provides a chainable interface for emitting events to specific channels.\n * This is a convenience method that returns an object with an `emit()` function.\n *\n * @param channel - The channel name (e.g., 'news', 'private-orders.123', 'presence-chat.lobby')\n * @returns An object with an `emit` method for sending events\n *\n * @example\n * ```typescript\n * // Broadcast to a public channel\n * ripple.to('news').emit('article.published', {\n * id: 123,\n * title: 'Breaking News',\n * author: 'John Doe'\n * })\n *\n * // Broadcast to a private channel\n * ripple.to('private-orders.456').emit('order.shipped', {\n * orderId: 456,\n * trackingNumber: 'ABC123'\n * })\n *\n * // Broadcast to a presence channel\n * ripple.to('presence-chat.room1').emit('message', {\n * userId: 'user-789',\n * text: 'Hello everyone!'\n * })\n * ```\n */\n to(channel: string) {\n return {\n emit: (event: string, data: unknown) => this.broadcast(channel, event, data),\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Bun.serve Integration\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Attempt to upgrade an HTTP request to WebSocket.\n *\n * This method should be called in your Bun.serve fetch handler to check if an incoming\n * HTTP request should be upgraded to a WebSocket connection. It validates the request path\n * against the configured WebSocket endpoint and performs the upgrade if matched.\n *\n * **Important**: For private/presence channels, you must pass the authenticated `userId`\n * in the options parameter. This userId will be used for channel authorization.\n *\n * @param req - The incoming HTTP request from Bun.serve\n * @param server - The Bun server instance\n * @param options - Optional upgrade options\n * @param options.userId - The authenticated user ID (required for private/presence channels)\n * @returns `true` if the request was upgraded to WebSocket, `false` otherwise\n *\n * @example\n * ```typescript\n * // Basic setup (public channels only)\n * Bun.serve({\n * fetch: (req, server) => {\n * if (ripple.upgrade(req, server)) return\n * return new Response('Not found', { status: 404 })\n * },\n * websocket: ripple.getHandler()\n * })\n *\n * // With authentication (supports private/presence channels)\n * Bun.serve({\n * fetch: async (req, server) => {\n * // Extract userId from JWT, session, or other auth mechanism\n * const userId = await extractUserIdFromRequest(req)\n *\n * // Pass userId to enable private/presence channel authorization\n * if (ripple.upgrade(req, server, { userId })) return\n *\n * // Handle other HTTP routes\n * return app.fetch(req, server)\n * },\n * websocket: ripple.getHandler()\n * })\n *\n * // Integration with Sentinel auth\n * Bun.serve({\n * fetch: async (req, server) => {\n * const user = await sentinel.getUserFromRequest(req)\n * if (ripple.upgrade(req, server, { userId: user?.id })) return\n * return handleHttpRequest(req)\n * },\n * websocket: ripple.getHandler()\n * })\n * ```\n */\n upgrade(req: Request, server: Server<ClientData>, options?: { userId?: string }): boolean {\n const url = new URL(req.url)\n\n if (url.pathname !== this.config.path) {\n return false\n }\n\n const success = server.upgrade(req, {\n data: {\n id: crypto.randomUUID(),\n channels: new Set<string>(),\n userId: options?.userId,\n } satisfies ClientData,\n })\n\n return success\n }\n\n /**\n * Get WebSocket handler configuration for Bun.serve.\n *\n * Returns an object containing all WebSocket event handlers (open, message, close, drain)\n * that Bun requires for WebSocket server configuration. This should be passed to the\n * `websocket` property of `Bun.serve()`.\n *\n * @returns WebSocket handler configuration object with event handlers\n *\n * @example\n * ```typescript\n * const ripple = new RippleServer({ path: '/ws' })\n *\n * Bun.serve({\n * port: 3000,\n * fetch: (req, server) => {\n * if (ripple.upgrade(req, server)) return\n * return new Response('Not found', { status: 404 })\n * },\n * // Pass the handler configuration to Bun.serve\n * websocket: ripple.getHandler()\n * })\n * ```\n *\n * @see {@link https://bun.sh/docs/api/websockets Bun WebSocket API}\n */\n getHandler(): WebSocketHandlerConfig {\n return {\n open: (ws) => this.handleOpen(ws),\n message: (ws, message) => this.handleMessage(ws, message),\n close: (ws, code, reason) => this.handleClose(ws, code, reason),\n drain: (ws) => this.handleDrain(ws),\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // WebSocket Event Handlers\n // ─────────────────────────────────────────────────────────────\n\n private handleOpen(ws: RippleWebSocket): void {\n this.channels.addClient(ws)\n this.tracker.onConnect(ws.data.id)\n\n this.logger.info('Client connected', {\n clientId: ws.data.id,\n activeConnections: this.tracker.getActiveConnections(),\n })\n\n // Send connection confirmation with socket ID\n this.send(ws, {\n type: 'connected',\n socketId: ws.data.id,\n })\n }\n\n private async handleMessage(ws: RippleWebSocket, message: string | Buffer): Promise<void> {\n try {\n const data: ClientMessage = JSON.parse(message.toString())\n\n switch (data.type) {\n case 'subscribe':\n await this.handleSubscribe(ws, data.channel, data.auth)\n break\n\n case 'unsubscribe':\n this.handleUnsubscribe(ws, data.channel)\n break\n\n case 'whisper':\n this.handleWhisper(ws, data.channel, data.event, data.data)\n break\n\n case 'ping':\n this.send(ws, { type: 'pong' })\n break\n }\n } catch (error) {\n this.logger.error('Failed to parse message', {\n clientId: ws.data.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n })\n this.tracker.onError(ws.data.id, error instanceof Error ? error.message : 'Invalid message')\n this.send(ws, {\n type: 'error',\n message: error instanceof Error ? error.message : 'Invalid message',\n })\n }\n }\n\n private handleClose(ws: RippleWebSocket, code: number, reason: string): void {\n const leftChannels = this.channels.removeClient(ws.data.id)\n this.tracker.onDisconnect(ws.data.id, code, reason)\n\n this.logger.info('Client disconnected', {\n clientId: ws.data.id,\n code: code.toString(),\n reason,\n channelsLeft: leftChannels.length,\n activeConnections: this.tracker.getActiveConnections(),\n })\n\n // Notify presence channels about user leaving\n for (const channel of leftChannels) {\n if (channel.startsWith('presence-') && ws.data.userId) {\n this.broadcastToChannel(channel, 'presence', {\n event: 'leave',\n data: {\n id: ws.data.userId,\n info: ws.data.userInfo,\n },\n })\n }\n }\n }\n\n private handleDrain(_ws: RippleWebSocket): void {\n // Called when backpressure is relieved\n // Currently no-op, but useful for flow control\n }\n\n // ─────────────────────────────────────────────────────────────\n // Subscription Handlers\n // ─────────────────────────────────────────────────────────────\n\n private async handleSubscribe(\n ws: RippleWebSocket,\n channel: string,\n _auth?: { socketId: string; signature: string }\n ): Promise<void> {\n // Check if channel requires authentication\n if (requiresAuth(channel)) {\n if (!this.authorizer) {\n this.logger.warn('Auth required but no authorizer configured', {\n clientId: ws.data.id,\n channel,\n })\n this.send(ws, {\n type: 'error',\n message: 'No authorizer configured for private channels',\n channel,\n })\n return\n }\n\n const result = await this.authorizer(channel, ws.data.userId, ws.data.id)\n\n if (result === false) {\n this.logger.warn('Subscription denied', {\n clientId: ws.data.id,\n channel,\n userId: ws.data.userId,\n })\n this.send(ws, {\n type: 'error',\n message: 'Unauthorized',\n channel,\n })\n return\n }\n\n // For presence channels, result contains user info\n if (typeof result === 'object' && 'id' in result) {\n this.channels.subscribe(ws.data.id, channel, result)\n this.tracker.onSubscribe(ws.data.id, channel)\n\n this.logger.info('Client subscribed to presence channel', {\n clientId: ws.data.id,\n channel,\n userId: result.id,\n })\n\n // Notify other members about join\n this.broadcastToChannel(\n channel,\n 'presence',\n {\n event: 'join',\n data: result,\n },\n ws.data.id\n )\n\n // Send current members to new subscriber\n this.send(ws, {\n type: 'presence',\n channel,\n event: 'members',\n data: this.channels.getPresenceMembers(channel),\n })\n } else {\n this.channels.subscribe(ws.data.id, channel)\n this.tracker.onSubscribe(ws.data.id, channel)\n\n this.logger.info('Client subscribed to private channel', {\n clientId: ws.data.id,\n channel,\n })\n }\n } else {\n this.channels.subscribe(ws.data.id, channel)\n this.tracker.onSubscribe(ws.data.id, channel)\n\n this.logger.debug('Client subscribed to public channel', {\n clientId: ws.data.id,\n channel,\n })\n }\n\n this.send(ws, { type: 'subscribed', channel })\n }\n\n private handleUnsubscribe(ws: RippleWebSocket, channel: string): void {\n // Notify presence channel before leaving\n if (channel.startsWith('presence-') && ws.data.userId) {\n this.broadcastToChannel(\n channel,\n 'presence',\n {\n event: 'leave',\n data: {\n id: ws.data.userId,\n info: ws.data.userInfo,\n },\n },\n ws.data.id\n )\n }\n\n this.channels.unsubscribe(ws.data.id, channel)\n this.tracker.onUnsubscribe(ws.data.id, channel)\n\n this.logger.debug('Client unsubscribed', {\n clientId: ws.data.id,\n channel,\n })\n\n this.send(ws, { type: 'unsubscribed', channel })\n }\n\n private handleWhisper(ws: RippleWebSocket, channel: string, event: string, data: unknown): void {\n // Trigger server-side listeners\n const listeners = this.eventListeners.get(event)\n if (listeners && listeners.length > 0) {\n listeners.forEach((handler) => {\n handler(ws, data)\n })\n }\n\n // Whispers are client-to-client messages, excluding sender\n if (!this.channels.isSubscribed(ws.data.id, channel)) {\n this.logger.warn('Whisper to non-subscribed channel', {\n clientId: ws.data.id,\n channel,\n event,\n })\n this.send(ws, {\n type: 'error',\n message: 'Not subscribed to channel',\n channel,\n })\n return\n }\n\n this.logger.debug('Client whisper', {\n clientId: ws.data.id,\n channel,\n event,\n })\n\n this.broadcastToChannel(channel, event, data, ws.data.id)\n }\n\n // ─────────────────────────────────────────────────────────────\n // Broadcasting\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Broadcast an event to all subscribers of a channel.\n *\n * Sends an event with data to all WebSocket clients currently subscribed to the specified channel.\n * This method is the primary way to push server-side events to connected clients.\n *\n * **Note**: Use the fluent `to()` API for more readable code: `ripple.to(channel).emit(event, data)`\n *\n * @param channel - The full channel name (e.g., 'news', 'private-orders.123', 'presence-chat.lobby')\n * @param event - The event name that clients will listen for\n * @param data - The event payload (must be JSON-serializable)\n *\n * @example\n * ```typescript\n * // Broadcast to a public channel\n * ripple.broadcast('news', 'article.published', {\n * id: 123,\n * title: 'Breaking News',\n * publishedAt: new Date().toISOString()\n * })\n *\n * // Broadcast order update to a private channel\n * ripple.broadcast('private-orders.456', 'order.status.updated', {\n * orderId: 456,\n * status: 'shipped',\n * trackingNumber: 'ABC123XYZ'\n * })\n *\n * // Broadcast to presence channel\n * ripple.broadcast('presence-chat.room1', 'message', {\n * userId: 'user-789',\n * text: 'Hello everyone!',\n * timestamp: Date.now()\n * })\n * ```\n *\n * @see {@link to} - Fluent API alternative for broadcasting\n */\n broadcast(channel: string, event: string, data: unknown): void {\n this.broadcastToChannel(channel, event, data)\n }\n\n /**\n * Broadcast an event to specific client IDs.\n *\n * Sends an event directly to an array of client IDs, regardless of their channel subscriptions.\n * This is useful for targeted notifications or private messages to specific users.\n *\n * **Note**: The event is sent without a channel context. Clients receive it as a direct message.\n *\n * @param clientIds - Array of client socket IDs (from `ws.data.id`)\n * @param event - The event name that clients will listen for\n * @param data - The event payload (must be JSON-serializable)\n *\n * @example\n * ```typescript\n * // Send notification to specific clients\n * const clientIds = ['client-uuid-1', 'client-uuid-2', 'client-uuid-3']\n * ripple.broadcastToClients(clientIds, 'notification', {\n * type: 'alert',\n * message: 'Your order has been confirmed',\n * timestamp: Date.now()\n * })\n *\n * // Send direct message to a single client\n * const recipientId = 'client-uuid-xyz'\n * ripple.broadcastToClients([recipientId], 'private.message', {\n * from: 'admin',\n * text: 'Welcome to our platform!',\n * priority: 'high'\n * })\n *\n * // Notify users from a query result\n * const onlineUsers = await db.query('SELECT socket_id FROM online_users WHERE premium = true')\n * const clientIds = onlineUsers.map(u => u.socket_id)\n * ripple.broadcastToClients(clientIds, 'premium.announcement', {\n * title: 'Exclusive Offer',\n * discount: 20\n * })\n * ```\n *\n * @see {@link broadcast} - For broadcasting to channels\n */\n broadcastToClients(clientIds: string[], event: string, data: unknown): void {\n for (const clientId of clientIds) {\n const ws = this.channels.getClient(clientId)\n if (ws) {\n this.send(ws, {\n type: 'event',\n channel: '',\n event,\n data,\n })\n }\n }\n }\n\n private broadcastToChannel(\n channel: string,\n event: string,\n data: unknown,\n excludeClientId?: string\n ): void {\n const subscribers = this.channels.getSubscribers(channel)\n if (subscribers.length === 0) return\n\n const message: ServerMessage =\n event === 'presence'\n ? {\n type: 'presence',\n channel,\n event: (data as { event: 'join' | 'leave' | 'members' }).event,\n data: (data as { data: unknown }).data,\n }\n : { type: 'event', channel, event, data }\n\n const serialized = this.serializer.serializeForBroadcast(message)\n\n for (const ws of subscribers) {\n if (excludeClientId && ws.data.id === excludeClientId) {\n continue\n }\n this.sendRaw(ws, serialized)\n }\n\n this.serializer.clearBroadcastCache()\n }\n\n // ─────────────────────────────────────────────────────────────\n // Utilities\n // ─────────────────────────────────────────────────────────────\n\n private sendRaw(ws: RippleWebSocket, serialized: string): boolean {\n try {\n ws.send(serialized)\n return true\n } catch (error) {\n this.logger.error('Failed to send message', {\n clientId: ws.data.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n })\n return false\n }\n }\n\n private send(ws: RippleWebSocket, message: ServerMessage): boolean {\n return this.sendRaw(ws, this.serializer.serialize(message))\n }\n\n /**\n * Get real-time server statistics.\n *\n * Returns current metrics about active connections and channel subscriptions.\n * Useful for monitoring, debugging, and building admin dashboards.\n *\n * @returns Server statistics object\n * @returns stats.totalConnections - Number of active WebSocket connections\n * @returns stats.totalChannels - Number of channels with at least one subscriber\n * @returns stats.channelSubscriptions - Map of channel names to subscriber counts\n *\n * @example\n * ```typescript\n * // Get current stats\n * const stats = ripple.getStats()\n * console.log(`Active connections: ${stats.totalConnections}`)\n * console.log(`Active channels: ${stats.totalChannels}`)\n *\n * // Log channel-specific stats\n * for (const [channel, count] of Object.entries(stats.channelSubscriptions)) {\n * console.log(`${channel}: ${count} subscribers`)\n * }\n *\n * // Build monitoring endpoint\n * app.get('/admin/websocket-stats', (req, res) => {\n * const stats = ripple.getStats()\n * return res.json({\n * connections: stats.totalConnections,\n * channels: stats.totalChannels,\n * topChannels: Object.entries(stats.channelSubscriptions)\n * .sort(([, a], [, b]) => b - a)\n * .slice(0, 10)\n * .map(([name, count]) => ({ name, subscribers: count }))\n * })\n * })\n *\n * // Periodic logging\n * setInterval(() => {\n * const stats = ripple.getStats()\n * logger.info('WebSocket metrics', stats)\n * }, 60000) // Every minute\n * ```\n *\n * @see {@link getHealth} - For health check information\n */\n getStats() {\n return this.channels.getStats()\n }\n\n /**\n * Get server health status.\n *\n * Performs a comprehensive health check of the WebSocket server and its dependencies.\n * Checks include driver connectivity (Redis/Local), server responsiveness, and error metrics.\n *\n * **Use case**: Health check endpoints for load balancers, monitoring systems, and orchestration platforms.\n *\n * @returns Promise resolving to health check result\n * @returns result.healthy - Overall health status (true if all checks pass)\n * @returns result.checks - Detailed status of individual health checks\n *\n * @example\n * ```typescript\n * // Basic health check endpoint\n * app.get('/health', async (req, res) => {\n * const health = await ripple.getHealth()\n *\n * return res\n * .status(health.healthy ? 200 : 503)\n * .json(health)\n * })\n *\n * // Kubernetes liveness probe\n * app.get('/healthz', async (req, res) => {\n * try {\n * const health = await ripple.getHealth()\n * if (health.healthy) {\n * return res.status(200).send('OK')\n * } else {\n * return res.status(503).json({ error: 'Unhealthy', details: health.checks })\n * }\n * } catch (error) {\n * return res.status(503).json({ error: 'Health check failed' })\n * }\n * })\n *\n * // Detailed health monitoring\n * app.get('/admin/health-detail', async (req, res) => {\n * const [health, stats] = await Promise.all([\n * ripple.getHealth(),\n * Promise.resolve(ripple.getStats())\n * ])\n *\n * return res.json({\n * ...health,\n * metrics: {\n * connections: stats.totalConnections,\n * channels: stats.totalChannels,\n * uptime: process.uptime()\n * }\n * })\n * })\n * ```\n *\n * @see {@link getStats} - For connection and channel statistics\n */\n async getHealth() {\n return await this.healthChecker.check()\n }\n\n /**\n * Initialize the RippleServer.\n *\n * Performs initialization tasks including driver setup (Redis/Local) and starting\n * the ping interval for connection health monitoring. This method **must** be called\n * before the server starts accepting WebSocket connections.\n *\n * **Important**: Call this method during application startup, before `Bun.serve()`.\n *\n * @returns Promise that resolves when initialization is complete\n * @throws {Error} If driver initialization fails (e.g., Redis connection failed)\n *\n * @example\n * ```typescript\n * // Basic initialization\n * const ripple = new RippleServer({ path: '/ws' })\n * await ripple.init()\n *\n * Bun.serve({\n * fetch: (req, server) => {\n * if (ripple.upgrade(req, server)) return\n * return new Response('Not found', { status: 404 })\n * },\n * websocket: ripple.getHandler()\n * })\n *\n * // With Redis driver\n * const ripple = new RippleServer({\n * path: '/ws',\n * driver: 'redis',\n * redis: {\n * host: 'localhost',\n * port: 6379\n * }\n * })\n *\n * try {\n * await ripple.init()\n * console.log('RippleServer initialized successfully')\n * } catch (error) {\n * console.error('Failed to initialize RippleServer:', error)\n * process.exit(1)\n * }\n *\n * // With graceful shutdown\n * const ripple = new RippleServer({ path: '/ws' })\n * await ripple.init()\n *\n * process.on('SIGTERM', async () => {\n * console.log('SIGTERM received, shutting down...')\n * await ripple.shutdown()\n * process.exit(0)\n * })\n * ```\n *\n * @see {@link shutdown} - For graceful server shutdown\n */\n async init(): Promise<void> {\n this.logger.info('Initializing RippleServer', {\n driver: this.driver.name,\n path: this.config.path,\n pingInterval: this.config.pingInterval,\n })\n\n await this.driver.init?.()\n\n if (this.config.pingInterval > 0) {\n const pongMessage = this.serializer.getPongMessage()\n\n this.pingInterval = setInterval(() => {\n for (const ws of this.channels.getAllClients()) {\n try {\n ws.send(pongMessage)\n } catch {\n // Connection might be closed\n }\n }\n }, this.config.pingInterval)\n }\n\n this.logger.info('RippleServer initialized successfully')\n }\n\n /**\n * Shutdown the RippleServer gracefully.\n *\n * Performs cleanup tasks including stopping the ping interval, closing driver connections\n * (Redis/Local), and releasing resources. This method should be called during application\n * shutdown to ensure graceful cleanup.\n *\n * **Important**: Call this method when receiving shutdown signals (SIGTERM, SIGINT) or\n * during application teardown to prevent resource leaks.\n *\n * @returns Promise that resolves when shutdown is complete\n *\n * @example\n * ```typescript\n * // Basic shutdown\n * const ripple = new RippleServer({ path: '/ws' })\n * await ripple.init()\n *\n * // Later, during shutdown\n * await ripple.shutdown()\n *\n * // Graceful shutdown with signal handling\n * const ripple = new RippleServer({ path: '/ws' })\n * await ripple.init()\n *\n * process.on('SIGTERM', async () => {\n * console.log('SIGTERM received, shutting down gracefully...')\n * await ripple.shutdown()\n * console.log('RippleServer shutdown complete')\n * process.exit(0)\n * })\n *\n * process.on('SIGINT', async () => {\n * console.log('SIGINT received, shutting down gracefully...')\n * await ripple.shutdown()\n * process.exit(0)\n * })\n *\n * // Shutdown with timeout for Kubernetes\n * process.on('SIGTERM', async () => {\n * const timeout = setTimeout(() => {\n * console.error('Shutdown timeout, forcing exit')\n * process.exit(1)\n * }, 10000) // 10 second timeout\n *\n * try {\n * await ripple.shutdown()\n * clearTimeout(timeout)\n * process.exit(0)\n * } catch (error) {\n * console.error('Shutdown error:', error)\n * process.exit(1)\n * }\n * })\n *\n * // Test cleanup\n * afterAll(async () => {\n * await ripple.shutdown()\n * })\n * ```\n *\n * @see {@link init} - For server initialization\n */\n async shutdown(): Promise<void> {\n this.logger.info('Shutting down RippleServer', {\n activeConnections: this.tracker.getActiveConnections(),\n })\n\n if (this.pingInterval) {\n clearInterval(this.pingInterval)\n }\n await this.driver.shutdown?.()\n\n this.logger.info('RippleServer shutdown complete')\n }\n}\n",
70
- "import type { GravitoContext, GravitoNext, GravitoOrbit, PlanetCore } from '@gravito/core'\nimport { setRippleServer } from './events/Broadcaster'\nimport { BroadcastManager } from './events/BroadcastManager'\nimport { RippleServer } from './RippleServer'\nimport type { RippleConfig } from './types'\n\n/**\n * OrbitRipple integrates the Ripple WebSocket module into the Gravito framework.\n *\n * It handles the registration of the RippleServer in the IoC container,\n * adds middleware for context access, and manages the server lifecycle.\n *\n * @example\n * ```typescript\n * import { PlanetCore } from '@gravito/core'\n * import { OrbitRipple } from '@gravito/ripple'\n *\n * const core = new PlanetCore()\n *\n * // Install Ripple as an Orbit\n * core.install(new OrbitRipple({\n * path: '/ws',\n * authorizer: async (channel, userId) => userId !== undefined\n * }))\n * ```\n */\nexport class OrbitRipple implements GravitoOrbit {\n private server: RippleServer\n private config: RippleConfig\n\n /**\n * Create a new OrbitRipple.\n *\n * @param config - Ripple configuration options\n */\n constructor(config: RippleConfig = {}) {\n this.config = config\n this.server = new RippleServer(config)\n }\n\n /**\n * Install the orbit into the Gravito core.\n *\n * - Registers 'ripple' (RippleServer) and 'broadcast' (BroadcastManager) in the container.\n * - Adds middleware to inject 'ripple' and 'broadcast' into GravitoContext.\n * - Initializes the server and registers shutdown hooks.\n *\n * @param core - The PlanetCore instance\n */\n install(core: PlanetCore): void {\n core.logger.info('🌊 Orbit Ripple installed')\n\n // Set static reference for helper functions\n setRippleServer(this.server)\n\n // Register in IoC container\n core.container.instance('ripple', this.server)\n\n const broadcastManager = new BroadcastManager(this.server)\n core.container.instance('broadcast', broadcastManager)\n\n // Middleware to inject into context\n core.adapter.use('*', async (ctx: GravitoContext, next: GravitoNext) => {\n ctx.set('ripple', this.server)\n ctx.set('broadcast', broadcastManager)\n return await next()\n })\n\n // Async initialization\n this.server.init().then(() => {\n core.logger.info(`🌊 Ripple WebSocket ready at ${this.config.path || '/ws'}`)\n })\n\n // Lifecycle: Graceful shutdown\n core.hooks.doAction('core:shutdown', async () => {\n await this.server.shutdown()\n })\n }\n\n /**\n * Get the underlying RippleServer instance.\n *\n * @returns The RippleServer instance\n */\n getServer(): RippleServer {\n return this.server\n }\n\n /**\n * Get the WebSocket handler for Bun.serve.\n *\n * @returns The WebSocket handler object\n */\n getHandler() {\n return this.server.getHandler()\n }\n}\n\ndeclare module '@gravito/core' {\n interface GravitoVariables {\n /** RippleServer instance available in context */\n ripple?: RippleServer\n /** BroadcastManager instance available in context */\n broadcast?: BroadcastManager\n }\n}\n"
58
+ "import type { RippleServer } from '../RippleServer'\nimport type { RippleDriver } from '../types'\n\n/**\n * Health status levels for individual components or the overall system.\n */\nexport type HealthStatus = 'healthy' | 'degraded' | 'unhealthy'\n\n/**\n * Health information for a specific system component.\n */\nexport interface ComponentHealth {\n /** Current health status */\n status: HealthStatus\n /** Descriptive message about the health state */\n message?: string\n /** ISO 8601 timestamp of the last check */\n lastCheck: string\n}\n\n/**\n * Result of a system-wide health check.\n */\nexport interface HealthCheckResult {\n /** Overall system health status */\n status: HealthStatus\n /** ISO 8601 timestamp of the check */\n timestamp: string\n /** Server uptime in milliseconds */\n uptime: number\n /** Health status of individual components */\n checks: {\n /** WebSocket server health */\n websocket: ComponentHealth\n /** Message distribution driver health */\n driver: ComponentHealth\n }\n /** Real-time performance statistics */\n stats: {\n /** Current number of active client connections */\n activeConnections: number\n /** Total number of active channels */\n totalChannels: number\n /** Average message throughput (messages per second) */\n messagesPerSecond: number\n }\n}\n\n/**\n * HealthChecker monitors the Ripple server and its driver.\n *\n * It provides real-time health diagnostics, performance metrics (MPS),\n * and tracks server uptime.\n */\nexport class HealthChecker {\n private startTime = Date.now()\n private messageCount = 0\n private lastMessageCountReset = Date.now()\n\n /**\n * Create a new HealthChecker.\n *\n * @param server - The Ripple server instance to monitor\n * @param driver - The message driver instance to monitor\n */\n constructor(\n private readonly server: RippleServer,\n private readonly driver: RippleDriver\n ) {}\n\n /**\n * Record a message being processed.\n *\n * Used to calculate messages-per-second (MPS) metrics.\n */\n recordMessage(): void {\n this.messageCount++\n }\n\n /**\n * Perform a full system health check.\n *\n * Resets the message counter and calculates MPS since the last check.\n *\n * @returns Detailed health check result\n */\n async check(): Promise<HealthCheckResult> {\n const now = new Date()\n const driverHealth = await this.checkDriver()\n const websocketHealth = this.checkWebSocket()\n\n const overallStatus = this.determineOverallStatus([driverHealth.status, websocketHealth.status])\n\n const elapsed = (Date.now() - this.lastMessageCountReset) / 1000\n const messagesPerSecond = elapsed > 0 ? this.messageCount / elapsed : 0\n\n this.messageCount = 0\n this.lastMessageCountReset = Date.now()\n\n const stats = this.server.getStats()\n\n return {\n status: overallStatus,\n timestamp: now.toISOString(),\n uptime: Date.now() - this.startTime,\n checks: {\n websocket: websocketHealth,\n driver: driverHealth,\n },\n stats: {\n activeConnections: stats.totalClients,\n totalChannels: stats.totalChannels,\n messagesPerSecond: Math.round(messagesPerSecond * 100) / 100,\n },\n }\n }\n\n /**\n * Check the health of the WebSocket server layer.\n */\n private checkWebSocket(): ComponentHealth {\n try {\n const stats = this.server.getStats()\n return {\n status: 'healthy',\n message: `${stats.totalClients} active connections`,\n lastCheck: new Date().toISOString(),\n }\n } catch (error) {\n return {\n status: 'unhealthy',\n message: error instanceof Error ? error.message : 'Unknown error',\n lastCheck: new Date().toISOString(),\n }\n }\n }\n\n /**\n * Check the health of the message distribution driver.\n */\n private async checkDriver(): Promise<ComponentHealth> {\n try {\n if ('isInitialized' in this.driver && !this.driver.isInitialized) {\n return {\n status: 'unhealthy',\n message: 'Driver not initialized',\n lastCheck: new Date().toISOString(),\n }\n }\n\n return {\n status: 'healthy',\n message: `${this.driver.name} driver operational`,\n lastCheck: new Date().toISOString(),\n }\n } catch (error) {\n return {\n status: 'unhealthy',\n message: error instanceof Error ? error.message : 'Unknown error',\n lastCheck: new Date().toISOString(),\n }\n }\n }\n\n /**\n * Determine the overall status based on component statuses.\n *\n * @param statuses - Array of component health statuses\n * @returns The most severe status found\n */\n private determineOverallStatus(statuses: HealthStatus[]): HealthStatus {\n if (statuses.includes('unhealthy')) {\n return 'unhealthy'\n }\n if (statuses.includes('degraded')) {\n return 'degraded'\n }\n return 'healthy'\n }\n}\n",
59
+ "/**\n * @fileoverview Bun native WebSocket engine implementation\n *\n * Wraps Bun's native WebSocket API to implement the IRippleEngine interface.\n * This is the default and highest-performance engine for Ripple.\n *\n * @module @gravito/ripple/engines\n * @since 5.0.0\n */\n\nimport type { Server, ServerWebSocket } from 'bun'\nimport type { ClientData } from '../types'\nimport type { IRippleEngine, RippleSocket } from './IRippleEngine'\n\n/**\n * Wrapper around Bun's ServerWebSocket to implement RippleSocket interface.\n *\n * This is a zero-overhead wrapper that delegates all operations to the native\n * Bun WebSocket object. No proxies or additional allocations.\n */\nexport class BunRippleSocket implements RippleSocket {\n constructor(private ws: ServerWebSocket<ClientData>) {}\n\n get id(): string {\n return this.ws.data.id\n }\n\n get data(): ClientData {\n return this.ws.data\n }\n\n send(data: string | Uint8Array, compress?: boolean): void {\n this.ws.send(data, compress)\n }\n\n close(code?: number, reason?: string): void {\n this.ws.close(code, reason)\n }\n\n getBufferedAmount(): number {\n return this.ws.getBufferedAmount()\n }\n\n subscribe(topic: string): void {\n this.ws.subscribe(topic)\n }\n\n unsubscribe(topic: string): void {\n this.ws.unsubscribe(topic)\n }\n\n publish(topic: string, data: string | Uint8Array): void {\n this.ws.publish(topic, data)\n }\n\n get raw(): ServerWebSocket<ClientData> {\n return this.ws\n }\n}\n\n/**\n * Configuration for BunEngine.\n */\nexport interface BunEngineConfig {\n /** Port to listen on */\n port?: number\n /** Hostname to bind to */\n hostname?: string\n /** TLS configuration */\n tls?: {\n cert: string\n key: string\n }\n /** Development mode (enables verbose logging) */\n development?: boolean\n}\n\n/**\n * Bun native WebSocket engine.\n *\n * Leverages Bun's high-performance WebSocket implementation with native pub/sub support.\n * This engine provides the best performance and is the default choice for Bun runtime.\n *\n * @example\n * ```typescript\n * const engine = new BunEngine({ port: 3000 })\n *\n * engine.onConnection((socket) => {\n * console.log('Client connected:', socket.id)\n * })\n *\n * await engine.listen(3000)\n * ```\n */\nexport class BunEngine implements IRippleEngine {\n readonly name = 'bun'\n\n private server?: Server<ClientData>\n private connectionHandler?: (socket: RippleSocket) => void\n private disconnectionHandler?: (socket: RippleSocket, code: number, reason: string) => void\n private messageHandler?: (socket: RippleSocket, message: string | Uint8Array) => void\n private sockets = new Map<string, BunRippleSocket>()\n\n constructor(private config: BunEngineConfig = {}) {}\n\n onConnection(handler: (socket: RippleSocket) => void): void {\n this.connectionHandler = handler\n }\n\n onDisconnection(handler: (socket: RippleSocket, code: number, reason: string) => void): void {\n this.disconnectionHandler = handler\n }\n\n onMessage(handler: (socket: RippleSocket, message: string | Uint8Array) => void): void {\n this.messageHandler = handler\n }\n\n async listen(port: number): Promise<void> {\n this.server = Bun.serve<ClientData>({\n port: port,\n hostname: this.config.hostname,\n tls: this.config.tls,\n development: this.config.development,\n\n fetch: (_req, _server) => {\n // This will be called by RippleServer.upgrade()\n // We don't handle fetch here, just return 404\n return new Response('WebSocket endpoint. Use upgrade() to connect.', { status: 404 })\n },\n\n websocket: {\n open: (ws) => {\n const socket = new BunRippleSocket(ws)\n this.sockets.set(socket.id, socket)\n this.connectionHandler?.(socket)\n },\n\n message: (ws, message) => {\n const socket = this.sockets.get(ws.data.id)\n if (!socket) {\n return\n }\n\n const data =\n typeof message === 'string'\n ? message\n : message instanceof Buffer\n ? new Uint8Array(message.buffer, message.byteOffset, message.byteLength)\n : new Uint8Array(message as unknown as ArrayBuffer)\n\n this.messageHandler?.(socket, data)\n },\n\n close: (ws, code, reason) => {\n const socket = this.sockets.get(ws.data.id)\n if (!socket) {\n return\n }\n\n this.disconnectionHandler?.(socket, code, reason)\n this.sockets.delete(ws.data.id)\n },\n\n drain: (_ws) => {\n // Backpressure drained - no-op for now\n // Could emit event if needed\n },\n },\n })\n }\n\n async close(): Promise<void> {\n if (this.server) {\n this.server.stop()\n this.server = undefined\n }\n this.sockets.clear()\n }\n\n broadcast(topic: string, data: string | Uint8Array, excludeSocketId?: string): void {\n if (!this.server) {\n return\n }\n\n // Bun's native pub/sub - extremely efficient (C++ layer broadcast)\n // If we need to exclude a socket, we have to do it manually\n if (excludeSocketId) {\n // Iterate and send to each socket except the excluded one\n for (const [id, socket] of this.sockets) {\n if (id !== excludeSocketId && socket.raw.isSubscribed(topic)) {\n socket.send(data)\n }\n }\n } else {\n // Use native broadcast for maximum performance\n this.server.publish(topic, data)\n }\n }\n\n /**\n * Upgrade an HTTP request to a WebSocket connection.\n *\n * This method is called by RippleServer to handle WebSocket upgrade requests.\n *\n * @param req - HTTP request\n * @param options - Upgrade options (userId, reconnectionToken)\n * @returns true if upgrade succeeded, false otherwise\n */\n upgrade(req: Request, options?: { userId?: string; reconnectionToken?: string }): boolean {\n if (!this.server) {\n // Server not started - cannot upgrade\n return false\n }\n\n const url = new URL(req.url)\n const reconnectionToken =\n options?.reconnectionToken ?? url.searchParams.get('reconnection_token') ?? undefined\n\n const success = this.server.upgrade(req, {\n data: {\n id: crypto.randomUUID(),\n channels: new Set<string>(),\n userId: options?.userId,\n reconnectionToken,\n } satisfies ClientData,\n })\n\n return success\n }\n\n /**\n * Get the underlying Bun server instance.\n * Useful for advanced use cases.\n */\n getServer(): Server<ClientData> | undefined {\n return this.server\n }\n}\n",
60
+ "/**\n * @fileoverview uWebSockets.js engine implementation for Node.js\n *\n * Wraps uWebSockets.js API to implement the IRippleEngine interface.\n * This engine provides high performance on Node.js, close to Bun's native performance.\n *\n * @module @gravito/ripple/engines\n * @since 5.0.0\n */\n\nimport { randomUUID } from 'node:crypto'\nimport type { ClientData } from '../types'\nimport type { IRippleEngine, RippleSocket } from './IRippleEngine'\n\n// uWebSockets.js types (will be installed as optional peer dependency)\ninterface WebSocket {\n send(message: string | ArrayBuffer, isBinary?: boolean, compress?: boolean): number\n close(): void\n getBufferedAmount(): number\n subscribe(topic: string): void\n unsubscribe(topic: string): void\n publish(\n topic: string,\n message: string | ArrayBuffer,\n isBinary?: boolean,\n compress?: boolean\n ): boolean\n getUserData(): ClientData\n}\n\ninterface TemplatedApp {\n ws(\n pattern: string,\n behavior: {\n compression?: number\n maxPayloadLength?: number\n idleTimeout?: number\n maxBackpressure?: number\n upgrade?: (res: any, req: any, context: any) => void\n open?: (ws: WebSocket) => void\n message?: (ws: WebSocket, message: ArrayBuffer, isBinary: boolean) => void\n drain?: (ws: WebSocket) => void\n close?: (ws: WebSocket, code: number, message: ArrayBuffer) => void\n }\n ): TemplatedApp\n listen(port: number, callback: (listenSocket: any) => void): TemplatedApp\n publish(\n topic: string,\n message: string | ArrayBuffer,\n isBinary?: boolean,\n compress?: boolean\n ): boolean\n}\n\ninterface UWebSocketsModule {\n App(options?: { cert_file_name?: string; key_file_name?: string }): TemplatedApp\n DEDICATED_COMPRESSOR_3KB: number\n SHARED_COMPRESSOR: number\n DISABLED: number\n}\n\n/**\n * Wrapper around uWebSockets.js WebSocket to implement RippleSocket interface.\n *\n * This is a zero-overhead wrapper that delegates all operations to the uWebSockets.js\n * WebSocket object.\n */\nexport class UWebSocketsRippleSocket implements RippleSocket {\n constructor(private ws: WebSocket) {}\n\n get id(): string {\n return this.ws.getUserData().id\n }\n\n get data(): ClientData {\n return this.ws.getUserData()\n }\n\n send(data: string | Uint8Array, compress?: boolean): void {\n if (typeof data === 'string') {\n this.ws.send(data, false, compress)\n } else {\n // Convert Uint8Array to ArrayBuffer\n const buffer = data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer\n this.ws.send(buffer, true, compress)\n }\n }\n\n close(_code?: number, _reason?: string): void {\n // uWebSockets.js doesn't support close codes/reasons directly\n // We just close the connection\n this.ws.close()\n }\n\n getBufferedAmount(): number {\n return this.ws.getBufferedAmount()\n }\n\n subscribe(topic: string): void {\n this.ws.subscribe(topic)\n }\n\n unsubscribe(topic: string): void {\n this.ws.unsubscribe(topic)\n }\n\n publish(topic: string, data: string | Uint8Array): void {\n if (typeof data === 'string') {\n this.ws.publish(topic, data, false)\n } else {\n const buffer = data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer\n this.ws.publish(topic, buffer, true)\n }\n }\n\n get raw(): WebSocket {\n return this.ws as unknown as any // Cast to any because it's a uWS socket, not DOM WebSocket\n }\n}\n\n/**\n * Configuration for uWebSocketsEngine.\n */\nexport interface UWebSocketsEngineConfig {\n /** Port to listen on */\n port?: number\n /** Hostname to bind to */\n hostname?: string\n /** TLS configuration */\n tls?: {\n cert: string\n key: string\n }\n /** Compression mode (0 = disabled, 1 = shared, 3 = dedicated 3KB) */\n compression?: number\n /** Maximum payload length in bytes (default: 16MB) */\n maxPayloadLength?: number\n /** Idle timeout in seconds (default: 120) */\n idleTimeout?: number\n /** Maximum backpressure in bytes (default: 1MB) */\n maxBackpressure?: number\n /** Development mode (enables verbose logging) */\n development?: boolean\n}\n\n/**\n * uWebSockets.js engine for Node.js.\n *\n * Leverages uWebSockets.js high-performance WebSocket implementation with native pub/sub support.\n * This engine provides excellent performance on Node.js (~90% of Bun's performance).\n */\nexport class UWebSocketsEngine implements IRippleEngine {\n readonly name = 'node-uws'\n\n private app?: TemplatedApp\n private uws?: UWebSocketsModule\n private connectionHandler?: (socket: RippleSocket) => void\n private disconnectionHandler?: (socket: RippleSocket, code: number, reason: string) => void\n private messageHandler?: (socket: RippleSocket, message: string | Uint8Array) => void\n private sockets = new Map<string, UWebSocketsRippleSocket>()\n private listenSocket?: any\n\n constructor(private config: UWebSocketsEngineConfig = {}) {}\n\n onConnection(handler: (socket: RippleSocket) => void): void {\n this.connectionHandler = handler\n }\n\n onDisconnection(handler: (socket: RippleSocket, code: number, reason: string) => void): void {\n this.disconnectionHandler = handler\n }\n\n onMessage(handler: (socket: RippleSocket, message: string | Uint8Array) => void): void {\n this.messageHandler = handler\n }\n\n async listen(port: number): Promise<void> {\n // Dynamically import uWebSockets.js (optional peer dependency)\n try {\n // @ts-expect-error: uWebSockets.js is not installed locally\n this.uws = await import('uWebSockets.js')\n } catch (_error) {\n throw new Error(\n 'uWebSockets.js is not installed. Install it with: npm install uWebSockets.js@uNetworking/uWebSockets.js#v20.44.0'\n )\n }\n\n if (!this.uws) {\n throw new Error('Failed to load uWebSockets.js module')\n }\n\n // Create uWebSockets.js app\n this.app = this.config.tls\n ? this.uws.App({\n cert_file_name: this.config.tls.cert,\n key_file_name: this.config.tls.key,\n })\n : this.uws.App()\n\n // Configure WebSocket route\n this.app.ws('/*', {\n compression: this.config.compression ?? this.uws.SHARED_COMPRESSOR,\n maxPayloadLength: this.config.maxPayloadLength ?? 16 * 1024 * 1024, // 16MB\n idleTimeout: this.config.idleTimeout ?? 120,\n maxBackpressure: this.config.maxBackpressure ?? 1024 * 1024, // 1MB\n\n open: (ws) => {\n // Initialize ClientData on connection\n const data = ws.getUserData()\n\n // Use Node.js crypto for UUIDs\n const id = randomUUID()\n\n // Manually hydrate the ClientData object which is empty initially\n Object.assign(data, {\n id,\n channels: new Set<string>(),\n remoteAddress: undefined, // uWS usually provides remote address via specialized API, skipping for now\n })\n\n const socket = new UWebSocketsRippleSocket(ws)\n this.sockets.set(socket.id, socket)\n this.connectionHandler?.(socket)\n },\n\n message: (ws, message, isBinary) => {\n const data = ws.getUserData()\n const socket = this.sockets.get(data.id)\n if (!socket) {\n return\n }\n\n // Convert ArrayBuffer to Uint8Array or string\n const payload = isBinary ? new Uint8Array(message) : new TextDecoder().decode(message)\n\n this.messageHandler?.(socket, payload)\n },\n\n drain: (ws) => {\n // Handle backpressure\n if (this.config.development) {\n const buffered = ws.getBufferedAmount()\n if (buffered > 0) {\n console.log(`[uWS] Draining backpressure: ${buffered} bytes`)\n }\n }\n },\n\n close: (ws, code, message) => {\n const data = ws.getUserData()\n const socket = this.sockets.get(data.id)\n if (!socket) {\n return\n }\n\n const reason = new TextDecoder().decode(message)\n this.disconnectionHandler?.(socket, code, reason)\n this.sockets.delete(data.id)\n },\n })\n\n // Start listening\n return new Promise((resolve, reject) => {\n this.app?.listen(port, (listenSocket) => {\n if (listenSocket) {\n this.listenSocket = listenSocket\n resolve()\n } else {\n reject(new Error(`Failed to listen on port ${port}`))\n }\n })\n })\n }\n\n async close(): Promise<void> {\n // Close all active connections\n for (const socket of this.sockets.values()) {\n socket.close()\n }\n this.sockets.clear()\n\n // Close the listen socket\n if (this.listenSocket && this.uws) {\n this.listenSocket = undefined\n }\n\n this.app = undefined\n }\n\n broadcast(topic: string, data: string | Uint8Array, excludeSocketId?: string): void {\n if (!this.app) {\n throw new Error('Engine not started. Call listen() first.')\n }\n\n // Note: uWebSockets.js doesn't support excluding specific sockets in native pub/sub\n // If excludeSocketId is provided, we need to iterate manually\n if (excludeSocketId) {\n for (const socket of this.sockets.values()) {\n if (socket.id !== excludeSocketId) {\n socket.send(data)\n }\n }\n } else {\n // Use native pub/sub for better performance\n if (typeof data === 'string') {\n this.app.publish(topic, data, false)\n } else {\n // Safe cast for ArrayBufferLike\n const buffer = data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength\n ) as ArrayBuffer\n this.app.publish(topic, buffer, true)\n }\n }\n }\n\n getConnectedSockets(): RippleSocket[] {\n return Array.from(this.sockets.values())\n }\n\n getSocket(id: string): RippleSocket | undefined {\n return this.sockets.get(id)\n }\n\n /**\n * Upgrade an HTTP request to WebSocket.\n *\n * Note: This method is not used in the engine-based architecture.\n * uWebSockets.js handles upgrades internally via the ws() route.\n */\n upgrade(_req: Request, _data?: Record<string, unknown>): boolean {\n throw new Error('upgrade() is not supported in uWebSocketsEngine. Use the ws() route instead.')\n }\n}\n",
61
+ "/**\n * @fileoverview Node.js ws engine implementation\n *\n * Wraps the 'ws' library to implement the IRippleEngine interface.\n * Implements in-memory pub/sub since the ws library does not support it natively.\n *\n * @module @gravito/ripple/engines\n * @since 5.0.0\n */\n\nimport { type WebSocket, WebSocketServer } from 'ws'\nimport type { ClientData } from '../types'\nimport type { IRippleEngine, RippleSocket } from './IRippleEngine'\n\n/**\n * Wrapper around 'ws' WebSocket to implement RippleSocket interface.\n */\nexport class WsRippleSocket implements RippleSocket {\n constructor(\n private ws: WebSocket,\n private clientData: ClientData,\n private engine: WsEngine\n ) {}\n\n get id(): string {\n return this.clientData.id\n }\n\n get data(): ClientData {\n return this.clientData\n }\n\n send(data: string | Uint8Array, compress?: boolean): void {\n this.ws.send(data, { compress })\n }\n\n close(code?: number, reason?: string): void {\n this.ws.close(code, reason)\n }\n\n getBufferedAmount(): number {\n return this.ws.bufferedAmount\n }\n\n subscribe(topic: string): void {\n this.engine.subscribe(this.id, topic)\n }\n\n unsubscribe(topic: string): void {\n this.engine.unsubscribe(this.id, topic)\n }\n\n publish(topic: string, data: string | Uint8Array): void {\n this.engine.broadcast(topic, data)\n }\n\n get raw(): WebSocket {\n return this.ws\n }\n}\n\n/**\n * Configuration for WsEngine.\n */\nexport interface WsEngineConfig {\n /** Port to listen on */\n port?: number\n /** Hostname to bind to */\n hostname?: string\n /** Development mode */\n development?: boolean\n /** WebSocket path */\n path?: string\n}\n\n/**\n * Node.js ws engine.\n *\n * Uses the popular 'ws' library. Provides standard compatibility but\n * uses application-layer pub/sub.\n */\nexport class WsEngine implements IRippleEngine {\n readonly name = 'node-ws'\n\n private wss?: WebSocketServer\n private connectionHandler?: (socket: RippleSocket) => void\n private disconnectionHandler?: (socket: RippleSocket, code: number, reason: string) => void\n private messageHandler?: (socket: RippleSocket, message: string | Uint8Array) => void\n\n private sockets = new Map<string, WsRippleSocket>()\n private subscriptions = new Map<string, Set<string>>() // topic -> Set<socketId>\n\n constructor(private config: WsEngineConfig = {}) {}\n\n onConnection(handler: (socket: RippleSocket) => void): void {\n this.connectionHandler = handler\n }\n\n onDisconnection(handler: (socket: RippleSocket, code: number, reason: string) => void): void {\n this.disconnectionHandler = handler\n }\n\n onMessage(handler: (socket: RippleSocket, message: string | Uint8Array) => void): void {\n this.messageHandler = handler\n }\n\n async listen(port: number): Promise<void> {\n this.wss = new WebSocketServer({\n port: port,\n host: this.config.hostname,\n path: this.config.path,\n })\n\n this.wss.on('connection', (ws, req) => {\n // Create client data (Ripple context expects this)\n const clientData: ClientData = {\n id: crypto.randomUUID(),\n remoteAddress: req.socket.remoteAddress,\n channels: new Set<string>(),\n }\n\n const socket = new WsRippleSocket(ws, clientData, this)\n this.sockets.set(socket.id, socket)\n\n ws.on('message', (data: any, isBinary: boolean) => {\n let payload: string | Uint8Array\n if (isBinary) {\n payload = data instanceof Uint8Array ? data : new Uint8Array(data as any)\n } else {\n payload = data.toString()\n }\n this.messageHandler?.(socket, payload)\n })\n\n ws.on('close', (code: number, reason: Buffer) => {\n // Cleanup subscriptions\n this.cleanupSocket(socket.id)\n this.sockets.delete(socket.id)\n this.disconnectionHandler?.(socket, code, reason.toString())\n })\n\n this.connectionHandler?.(socket)\n })\n\n return new Promise((resolve) => {\n this.wss?.once('listening', () => resolve())\n })\n }\n\n async close(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.wss) {\n return resolve()\n }\n this.wss.close((err: any) => {\n if (err) {\n return reject(err)\n }\n this.sockets.clear()\n this.subscriptions.clear()\n resolve()\n })\n })\n }\n\n subscribe(socketId: string, topic: string): void {\n if (!this.subscriptions.has(topic)) {\n this.subscriptions.set(topic, new Set())\n }\n this.subscriptions.get(topic)?.add(socketId)\n }\n\n unsubscribe(socketId: string, topic: string): void {\n this.subscriptions.get(topic)?.delete(socketId)\n }\n\n private cleanupSocket(socketId: string): void {\n for (const subscribers of this.subscriptions.values()) {\n subscribers.delete(socketId)\n }\n }\n\n broadcast(topic: string, data: string | Uint8Array, excludeSocketId?: string): void {\n const subscribers = this.subscriptions.get(topic)\n if (!subscribers) {\n return\n }\n\n for (const socketId of subscribers) {\n if (socketId === excludeSocketId) {\n continue\n }\n const socket = this.sockets.get(socketId)\n socket?.send(data)\n }\n }\n}\n",
62
+ "import type { RippleContext, RippleInterceptor } from '../types'\n\n/**\n * Manages the execution of message interceptors in an onion model.\n *\n * @since 4.0.0\n */\nexport class InterceptorManager {\n private interceptors: RippleInterceptor[]\n\n constructor(interceptors: RippleInterceptor[] = []) {\n this.interceptors = interceptors\n }\n\n /**\n * Execute the interceptor pipeline for a given context.\n *\n * @param ctx - The ripple message context\n * @param finalHandler - The final handler to run after all interceptors\n */\n async execute(ctx: RippleContext, finalHandler: () => Promise<void> | void): Promise<void> {\n if (this.interceptors.length === 0) {\n await finalHandler()\n return\n }\n\n let index = -1\n\n const dispatch = async (i: number): Promise<void> => {\n if (i <= index) {\n throw new Error('next() called multiple times')\n }\n index = i\n\n const interceptor = i === this.interceptors.length ? null : this.interceptors[i]\n\n if (!interceptor) {\n await finalHandler()\n return\n }\n\n await interceptor(ctx, () => dispatch(i + 1))\n }\n\n return dispatch(0)\n }\n\n /**\n * Add a new interceptor to the end of the pipeline.\n */\n use(interceptor: RippleInterceptor): void {\n this.interceptors.push(interceptor)\n }\n}\n",
63
+ "import type { AckManager } from '../reliability/AckManager'\nimport type { ConnectionTracker } from '../tracking/ConnectionTracker'\n\n/**\n * Prometheus metrics exporter for Ripple.\n *\n * @since 3.7.0\n */\nexport class RippleMetrics {\n private prefix: string\n private tracker: ConnectionTracker\n private ackManager?: AckManager\n private slowClients = 0\n\n constructor(tracker: ConnectionTracker, prefix = 'ripple', ackManager?: AckManager) {\n this.tracker = tracker\n this.prefix = prefix\n this.ackManager = ackManager\n }\n\n /**\n * Increment the counter for slow clients isolated or disconnected.\n */\n incrementSlowClients(): void {\n this.slowClients++\n }\n\n /**\n * Export metrics in Prometheus text format.\n *\n * @returns String containing Prometheus metrics\n */\n export(): string {\n const activeConnections = this.tracker.getActiveConnections()\n const pendingAcks = this.ackManager?.getPendingCount() ?? 0\n\n return `${[\n `# HELP ${this.prefix}_connections_active Currently active WebSocket connections`,\n `# TYPE ${this.prefix}_connections_active gauge`,\n `${this.prefix}_connections_active ${activeConnections}`,\n\n `# HELP ${this.prefix}_acks_pending Current number of messages waiting for ACK`,\n `# TYPE ${this.prefix}_acks_pending gauge`,\n `${this.prefix}_acks_pending ${pendingAcks}`,\n\n `# HELP ${this.prefix}_slow_clients_total Total number of slow clients isolated/disconnected`,\n `# TYPE ${this.prefix}_slow_clients_total counter`,\n `${this.prefix}_slow_clients_total ${this.slowClients}`,\n ].join('\\n')}\\n`\n }\n}\n",
64
+ "import type { RippleLogger } from '../logging/Logger'\n\n/**\n * Interface for a message that is pending acknowledgement.\n */\nexport interface PendingAck {\n clientId: string\n seq: number\n timer: ReturnType<typeof setTimeout>\n resolve: (value: boolean) => void\n reject: (reason: any) => void\n}\n\n/**\n * Manages message acknowledgements for Ripple.\n *\n * @since 3.7.0\n */\nexport class AckManager {\n private pendingAcks: Map<string, PendingAck> = new Map()\n private nextSeq = 1\n private logger: RippleLogger\n\n constructor(logger: RippleLogger) {\n this.logger = logger\n }\n\n /**\n * Register a message that requires acknowledgement.\n *\n * @param clientId - The ID of the client the message was sent to\n * @param timeout - How long to wait for ACK in ms\n * @returns A promise that resolves to true when ACKed, or false if timed out\n */\n register(clientId: string, timeout = 5000): { seq: number; promise: Promise<boolean> } {\n const seq = this.nextSeq++\n const key = `${clientId}:${seq}`\n\n const promise = new Promise<boolean>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.logger.warn('Message ACK timeout', { clientId, seq })\n this.pendingAcks.delete(key)\n resolve(false)\n }, timeout)\n\n this.pendingAcks.set(key, {\n clientId,\n seq,\n timer,\n resolve,\n reject,\n })\n })\n\n return { seq, promise }\n }\n\n /**\n * Confirm receipt of a message.\n *\n * @param clientId - The ID of the client that sent the ACK\n * @param seq - The sequence number being confirmed\n */\n confirm(clientId: string, seq: number): boolean {\n const key = `${clientId}:${seq}`\n const pending = this.pendingAcks.get(key)\n\n if (pending) {\n clearTimeout(pending.timer)\n this.pendingAcks.delete(key)\n pending.resolve(true)\n return true\n }\n\n return false\n }\n\n /**\n * Clear all pending ACKs for a client (e.g., on disconnect).\n */\n clearClient(clientId: string): void {\n for (const [key, pending] of this.pendingAcks.entries()) {\n if (pending.clientId === clientId) {\n clearTimeout(pending.timer)\n this.pendingAcks.delete(key)\n pending.resolve(false)\n }\n }\n }\n\n /**\n * Get the number of pending ACKs.\n */\n getPendingCount(): number {\n return this.pendingAcks.size\n }\n}\n",
65
+ "import type { ClientMessage, ServerMessage } from '../types'\nimport type { ISerializer } from './ISerializer'\n\n/**\n * Default JSON serializer implementation.\n *\n * Handles standard JSON serialization with optimizations for broadcasting.\n */\nexport class JsonSerializer implements ISerializer {\n readonly contentType = 'json'\n\n /** Pre-serialized pong message */\n private static readonly PONG_MESSAGE = JSON.stringify({ type: 'pong' })\n\n /** Cached serialized string for the current broadcast operation */\n private broadcastCache: string | null = null\n\n serialize(message: ServerMessage): string {\n return JSON.stringify(message)\n }\n\n deserialize(data: string | Buffer | ArrayBuffer | Uint8Array): ClientMessage {\n let str: string\n if (typeof data === 'string') {\n str = data\n } else if (Buffer.isBuffer(data)) {\n str = data.toString()\n } else {\n str = new TextDecoder().decode(data)\n }\n return JSON.parse(str)\n }\n\n serializeForBroadcast(message: ServerMessage): string {\n if (!this.broadcastCache) {\n this.broadcastCache = JSON.stringify(message)\n }\n return this.broadcastCache\n }\n\n clearBroadcastCache(): void {\n this.broadcastCache = null\n }\n\n getPongMessage(): string {\n return JsonSerializer.PONG_MESSAGE\n }\n}\n",
66
+ "import { existsSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { ClientMessage, ServerMessage } from '../types'\nimport type { ISerializer } from './ISerializer'\n\n// ESM-compatible __dirname\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\n// We use dynamic import for protobufjs to avoid hard dependency if not used\n// This allows the package to be used without protobufjs if only JSON is needed\nlet protoRoot: any = null\nlet ClientMessageProto: any = null\nlet ServerMessageProto: any = null\n\n/**\n * Protobuf Serializer implementation.\n *\n * Uses 'ripple.proto' to serialize messages.\n * Requires 'protobufjs' to be installed.\n */\nexport class ProtobufSerializer implements ISerializer {\n readonly contentType = 'protobuf'\n\n private broadcastCache: Uint8Array | null = null\n private initialized = false\n\n constructor(private options: { protoPath?: string; pure?: boolean } = {}) {\n if (!options.protoPath) {\n this.options.protoPath = this.resolveProtoPath()\n }\n }\n\n /**\n * Resolves the proto file path using a multi-level fallback strategy.\n *\n * Search order:\n * 1. Relative to current file (ESM: import.meta.url)\n * 2. From cwd as package root (common in test environments)\n * 3. From cwd as monorepo root\n */\n private resolveProtoPath(): string {\n const candidatePaths = [\n // 1. 相對於當前檔案(開發環境:src/serializers -> ../proto)\n join(__dirname, '../proto/ripple.proto'),\n\n // 2. 相對於當前檔案,但在 dist 構建後(dist/serializers -> ../../src/proto)\n join(__dirname, '../../src/proto/ripple.proto'),\n\n // 3. 從 cwd 作為 package 根目錄(測試環境常見)\n join(process.cwd(), 'src/proto/ripple.proto'),\n join(process.cwd(), 'proto/ripple.proto'),\n join(process.cwd(), 'dist/proto/ripple.proto'),\n\n // 4. 從 cwd 作為 monorepo 根目錄\n join(process.cwd(), 'packages/ripple/src/proto/ripple.proto'),\n join(process.cwd(), 'packages/ripple/dist/proto/ripple.proto'),\n ]\n\n for (const candidatePath of candidatePaths) {\n const resolvedPath = resolve(candidatePath)\n if (existsSync(resolvedPath)) {\n return resolvedPath\n }\n }\n\n // 沒找到時返回預設路徑(讓後續的 init() 顯示詳細錯誤)\n return join(__dirname, '../proto/ripple.proto')\n }\n\n /**\n * Initialize the serializer by loading the .proto file\n */\n async init(): Promise<void> {\n if (this.initialized) {\n return\n }\n\n try {\n // 先檢查文件是否存在\n if (!existsSync(this.options.protoPath!)) {\n throw new Error(\n `Proto file not found at: ${this.options.protoPath}\\n` +\n `Working directory: ${process.cwd()}\\n` +\n `Please ensure ripple.proto exists or provide a custom protoPath.`\n )\n }\n\n let protobuf: any\n try {\n protobuf = await import('protobufjs')\n } catch (_importError) {\n throw new Error(\n `'protobufjs' is not installed.\\n` +\n `Install it with: npm install protobufjs\\n` +\n `Or use JSON serializer instead: new RippleServer({ serializer: 'json' })`\n )\n }\n\n protoRoot = await protobuf.load(this.options.protoPath!)\n ClientMessageProto = protoRoot.lookupType('ripple.ClientMessage')\n ServerMessageProto = protoRoot.lookupType('ripple.ServerMessage')\n this.initialized = true\n } catch (error) {\n throw new Error(\n `Failed to initialize ProtobufSerializer: ${(error as Error).message}\\n` +\n `Proto path attempted: ${this.options.protoPath}\\n` +\n `Ensure 'protobufjs' is installed or switch to JSON serializer.`\n )\n }\n }\n\n serialize(message: ServerMessage): Uint8Array {\n this.checkInitialized()\n\n // Convert generic message to Proto-compatible payload\n const payload = this.toProtoPayload(message)\n const errMsg = ServerMessageProto.verify(payload)\n if (errMsg) {\n throw Error(errMsg)\n }\n\n const msg = ServerMessageProto.create(payload)\n return ServerMessageProto.encode(msg).finish()\n }\n\n deserialize(data: string | Buffer | ArrayBuffer | Uint8Array): ClientMessage {\n this.checkInitialized()\n\n const buffer =\n data instanceof ArrayBuffer ? new Uint8Array(data) : (data as Buffer | Uint8Array)\n const decoded = ClientMessageProto.decode(buffer)\n const obj = ClientMessageProto.toObject(decoded, {\n enums: String,\n longs: String,\n bytes: this.options.pure ? undefined : String,\n defaults: true,\n oneofs: true,\n })\n\n return this.fromProtoPayload(obj)\n }\n\n serializeForBroadcast(message: ServerMessage): Uint8Array {\n if (!this.broadcastCache) {\n this.broadcastCache = this.serialize(message)\n }\n return this.broadcastCache\n }\n\n clearBroadcastCache(): void {\n this.broadcastCache = null\n }\n\n getPongMessage(): Uint8Array {\n this.checkInitialized()\n const payload = { pong: {} }\n const msg = ServerMessageProto.create(payload)\n return ServerMessageProto.encode(msg).finish()\n }\n\n private checkInitialized() {\n if (!this.initialized) {\n throw new Error('ProtobufSerializer not initialized. Call init() first.')\n }\n }\n\n private toProtoPayload(msg: ServerMessage): any {\n // Map internal ServerMessage union types to Proto oneof structure\n switch (msg.type) {\n case 'connected':\n return { connected: { socket_id: msg.socketId } }\n case 'subscribed':\n return { subscribed: { channel: msg.channel } }\n case 'unsubscribed':\n return { unsubscribed: { channel: msg.channel } }\n case 'pong':\n return { pong: {} }\n case 'ack_received':\n return { ack_received: { seq: msg.seq } }\n case 'reconnection_token':\n return { reconnection_token: { token: msg.token } }\n case 'error':\n return {\n error: { code: msg.code || 'UNKNOWN', message: msg.message, channel: msg.channel },\n }\n case 'event':\n return {\n event: {\n channel: msg.channel,\n event: msg.event,\n data: this.encodeData(msg.data),\n seq: msg.seq,\n need_ack: msg.needAck,\n },\n }\n case 'presence':\n return {\n presence: {\n channel: msg.channel,\n event: msg.event,\n data: this.encodeData(msg.data),\n },\n }\n case 'binary':\n return {\n binary: {\n channel: msg.channel,\n event: msg.event,\n data: msg.data instanceof ArrayBuffer ? new Uint8Array(msg.data) : msg.data,\n },\n }\n }\n throw new Error(`Unknown server message type: ${(msg as any).type}`)\n }\n\n private fromProtoPayload(obj: any): ClientMessage {\n // oneof field name is usually the key in `obj`\n if (obj.subscribe) {\n const auth = obj.subscribe.auth\n // Note: protobufjs converts snake_case to camelCase automatically\n return {\n type: 'subscribe',\n channel: obj.subscribe.channel,\n auth: auth\n ? {\n socketId: auth.socketId || '',\n signature: auth.signature || '',\n }\n : undefined,\n }\n }\n if (obj.unsubscribe) {\n return { type: 'unsubscribe', channel: obj.unsubscribe.channel }\n }\n if (obj.whisper) {\n return {\n type: 'whisper',\n channel: obj.whisper.channel,\n event: obj.whisper.event,\n data: this.decodeData(obj.whisper.data),\n }\n }\n if (obj.ping) {\n return { type: 'ping' }\n }\n if (obj.ack) {\n return { type: 'ack', seq: obj.ack.seq }\n }\n if (obj.binary) {\n return {\n type: 'binary',\n channel: obj.binary.channel,\n event: obj.binary.event,\n data: obj.binary.data, // keep as is (buffer/bytes)\n }\n }\n\n throw new Error('Unknown client message payload')\n }\n\n private encodeData(data: unknown): Uint8Array {\n if (this.options.pure) {\n if (data instanceof Uint8Array) {\n return data\n }\n if (Object.prototype.toString.call(data) === '[object Uint8Array]') {\n return data as Uint8Array\n }\n if (Buffer.isBuffer(data)) {\n return data\n }\n throw new Error('In pure mode, data must be Uint8Array or Buffer')\n }\n\n // In Hybrid mode, we put JSON string into bytes field for now\n // This is the \"Envelope\" strategy from RFC\n if (typeof data === 'string') {\n return new TextEncoder().encode(data)\n }\n if (data instanceof Uint8Array) {\n return data\n }\n return new TextEncoder().encode(JSON.stringify(data))\n }\n\n private decodeData(data: Uint8Array | string | Buffer): unknown {\n if (this.options.pure) {\n return data\n }\n\n if (typeof data === 'string') {\n try {\n return JSON.parse(atob(data))\n } catch {\n return data\n }\n }\n\n try {\n const str = new TextDecoder().decode(data)\n return JSON.parse(str)\n } catch {\n return data\n }\n }\n}\n",
67
+ "import type { RippleLogger } from '../logging/Logger'\nimport { createLogger } from '../logging/Logger'\n\n/**\n * Events tracked by the ConnectionTracker.\n */\nexport type ConnectionEvent =\n | { type: 'connected'; clientId: string; timestamp: Date }\n | {\n type: 'disconnected'\n clientId: string\n timestamp: Date\n code: number\n reason: string\n duration: number\n }\n | { type: 'subscribed'; clientId: string; channel: string; timestamp: Date }\n | { type: 'unsubscribed'; clientId: string; channel: string; timestamp: Date }\n | { type: 'error'; clientId: string; error: string; timestamp: Date }\n\n/**\n * Interface for tracking WebSocket connection lifecycles and statistics.\n *\n * Implementations are responsible for monitoring active connections,\n * subscription states, and providing metrics for observability.\n */\nexport interface ConnectionTracker {\n /** Called when a client establishes a connection */\n onConnect(clientId: string): void\n /** Called when a client disconnects */\n onDisconnect(clientId: string, code: number, reason: string): void\n /** Called when a client subscribes to a channel */\n onSubscribe(clientId: string, channel: string): void\n /** Called when a client unsubscribes from a channel */\n onUnsubscribe(clientId: string, channel: string): void\n /** Called when a client-related error occurs */\n onError(clientId: string, error: string): void\n /** Get the duration of an active connection in milliseconds */\n getConnectionDuration(clientId: string): number | null\n /** Get the total number of active connections */\n getActiveConnections(): number\n}\n\n/**\n * Default implementation of the ConnectionTracker.\n *\n * Maintains an in-memory map of active connections and logs lifecycle events.\n * Provides basic metrics like active connection count and connection duration.\n */\nexport class DefaultConnectionTracker implements ConnectionTracker {\n /** Map of active connection data: clientId -> connection info */\n private connections = new Map<\n string,\n {\n connectedAt: Date\n subscriptions: Set<string>\n }\n >()\n\n private logger: RippleLogger\n\n /**\n * Create a new DefaultConnectionTracker.\n *\n * @param logger - Optional custom logger (defaults to ConsoleLogger)\n */\n constructor(logger?: RippleLogger) {\n this.logger = logger ?? createLogger('ConnectionTracker')\n }\n\n /**\n * Track a new connection.\n *\n * @param clientId - Unique client identifier\n */\n onConnect(clientId: string): void {\n this.connections.set(clientId, {\n connectedAt: new Date(),\n subscriptions: new Set(),\n })\n\n this.logger.info('Client connected', {\n clientId,\n activeConnections: this.getActiveConnections(),\n })\n }\n\n /**\n * Clean up and log disconnection metrics.\n *\n * @param clientId - Client identifier\n * @param code - WebSocket close code\n * @param reason - Close reason\n */\n onDisconnect(clientId: string, code: number, reason: string): void {\n const connection = this.connections.get(clientId)\n const duration = connection ? Date.now() - connection.connectedAt.getTime() : 0\n\n this.logger.info('Client disconnected', {\n clientId,\n code: code.toString(),\n reason,\n durationMs: duration,\n subscriptions: connection?.subscriptions.size ?? 0,\n })\n\n this.connections.delete(clientId)\n }\n\n /**\n * Track channel subscription.\n *\n * @param clientId - Client identifier\n * @param channel - Channel name\n */\n onSubscribe(clientId: string, channel: string): void {\n const connection = this.connections.get(clientId)\n connection?.subscriptions.add(channel)\n\n this.logger.debug('Client subscribed', {\n clientId,\n channel,\n })\n }\n\n /**\n * Track channel unsubscription.\n *\n * @param clientId - Client identifier\n * @param channel - Channel name\n */\n onUnsubscribe(clientId: string, channel: string): void {\n const connection = this.connections.get(clientId)\n connection?.subscriptions.delete(channel)\n\n this.logger.debug('Client unsubscribed', {\n clientId,\n channel,\n })\n }\n\n /**\n * Log client errors.\n *\n * @param clientId - Client identifier\n * @param error - Error message\n */\n onError(clientId: string, error: string): void {\n this.logger.error('Client error', {\n clientId,\n error,\n })\n }\n\n /**\n * Calculate connection duration.\n *\n * @param clientId - Client identifier\n * @returns Duration in milliseconds, or null if not found\n */\n getConnectionDuration(clientId: string): number | null {\n const connection = this.connections.get(clientId)\n if (!connection) {\n return null\n }\n return Date.now() - connection.connectedAt.getTime()\n }\n\n /**\n * Get total active connection count.\n */\n getActiveConnections(): number {\n return this.connections.size\n }\n}\n",
68
+ "/**\n * @fileoverview Session Manager for reconnection support\n *\n * @module @gravito/ripple/tracking\n */\n\nimport type { RippleLogger } from '../logging/Logger'\nimport { createLogger } from '../logging/Logger'\n\n/**\n * Session data stored for reconnection.\n */\nexport interface SessionData {\n /** Client ID */\n clientId: string\n /** User ID if authenticated */\n userId?: string | number\n /** Channels the client was subscribed to */\n channels: string[]\n /** User info for presence channels */\n userInfo?: Record<string, unknown>\n /** Session expiry timestamp */\n expiresAt: number\n}\n\n/**\n * Manages disconnected client sessions for reconnection support.\n *\n * When a client disconnects, their session is stored temporarily to allow\n * them to reconnect and resume their subscriptions without re-authorization.\n *\n * @example\n * ```typescript\n * const sessionManager = new SessionManager({\n * sessionTTL: 60000, // 1 minute\n * maxSessions: 10000\n * })\n *\n * // On disconnect\n * const token = sessionManager.createSession({\n * clientId: 'client-123',\n * userId: 'user-456',\n * channels: ['news', 'presence-lobby'],\n * userInfo: { name: 'John' }\n * })\n *\n * // On reconnect\n * const session = sessionManager.getSession(token)\n * if (session) {\n * // Restore subscriptions\n * for (const channel of session.channels) {\n * await subscribe(session.clientId, channel)\n * }\n * }\n * ```\n */\nexport class SessionManager {\n private sessions = new Map<string, SessionData>()\n private cleanupInterval?: ReturnType<typeof setInterval>\n private logger: RippleLogger\n\n constructor(\n private config: {\n sessionTTL: number\n maxSessions: number\n logger?: RippleLogger\n }\n ) {\n this.logger = config.logger ?? createLogger('SessionManager')\n this.startCleanup()\n }\n\n /**\n * Create a new session for a disconnected client.\n *\n * @param data - Session data to store\n * @param token - Optional specific token to use (otherwise generates new UUID)\n * @returns Reconnection token\n */\n createSession(data: Omit<SessionData, 'expiresAt'>, token?: string): string {\n // Generate reconnection token if not provided\n const sessionToken = token ?? crypto.randomUUID()\n\n // Check session limit\n if (this.sessions.size >= this.config.maxSessions) {\n this.logger.warn('Session limit reached, removing oldest session')\n this.removeOldestSession()\n }\n\n // Store session\n this.sessions.set(sessionToken, {\n ...data,\n expiresAt: Date.now() + this.config.sessionTTL,\n })\n\n this.logger.debug('Created session', {\n token: sessionToken,\n clientId: data.clientId,\n channels: data.channels.length,\n })\n\n return sessionToken\n }\n\n /**\n * Get a session by reconnection token.\n *\n * @param token - Reconnection token\n * @returns Session data if found and not expired, undefined otherwise\n */\n getSession(token: string): SessionData | undefined {\n const session = this.sessions.get(token)\n\n if (!session) {\n return undefined\n }\n\n // Check expiry\n if (Date.now() > session.expiresAt) {\n this.sessions.delete(token)\n this.logger.debug('Session expired', { token })\n return undefined\n }\n\n return session\n }\n\n /**\n * Remove a session by token.\n *\n * @param token - Reconnection token\n */\n removeSession(token: string): void {\n this.sessions.delete(token)\n this.logger.debug('Removed session', { token })\n }\n\n /**\n * Get the number of active sessions.\n */\n getSessionCount(): number {\n return this.sessions.size\n }\n\n /**\n * Start periodic cleanup of expired sessions.\n */\n private startCleanup(): void {\n this.cleanupInterval = setInterval(() => {\n this.cleanupExpiredSessions()\n }, 30000) // Run every 30 seconds\n }\n\n /**\n * Clean up expired sessions.\n */\n private cleanupExpiredSessions(): void {\n const now = Date.now()\n let removed = 0\n\n for (const [token, session] of this.sessions.entries()) {\n if (now > session.expiresAt) {\n this.sessions.delete(token)\n removed++\n }\n }\n\n if (removed > 0) {\n this.logger.debug('Cleaned up expired sessions', { removed })\n }\n }\n\n /**\n * Remove the oldest session to make room for new ones.\n */\n private removeOldestSession(): void {\n let oldestToken: string | undefined\n let oldestExpiry = Infinity\n\n for (const [token, session] of this.sessions.entries()) {\n if (session.expiresAt < oldestExpiry) {\n oldestExpiry = session.expiresAt\n oldestToken = token\n }\n }\n\n if (oldestToken) {\n this.sessions.delete(oldestToken)\n this.logger.debug('Removed oldest session', { token: oldestToken })\n }\n }\n\n /**\n * Shutdown the session manager and clear all sessions.\n */\n shutdown(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval)\n this.cleanupInterval = undefined\n }\n\n this.sessions.clear()\n this.logger.info('SessionManager shutdown complete')\n }\n}\n",
69
+ "/**\n * Simple Token Bucket algorithm for rate limiting.\n *\n * @internal\n */\nexport class TokenBucket {\n private tokens: number\n private lastRefill: number\n\n /**\n * Create a new TokenBucket instance.\n *\n * @param capacity - Max tokens in the bucket.\n * @param fillRatePerMs - Rate at which tokens are added (tokens per millisecond).\n */\n constructor(\n private capacity: number,\n private fillRatePerMs: number\n ) {\n this.tokens = capacity\n this.lastRefill = Date.now()\n }\n\n /**\n * Consume a token from the bucket.\n *\n * @returns true if token was consumed, false if bucket is empty.\n */\n consume(): boolean {\n this.refill()\n\n if (this.tokens >= 1) {\n this.tokens -= 1\n return true\n }\n\n return false\n }\n\n private refill(): void {\n const now = Date.now()\n const elapsed = now - this.lastRefill\n const newTokens = elapsed * this.fillRatePerMs\n\n if (newTokens > 0) {\n this.tokens = Math.min(this.capacity, this.tokens + newTokens)\n this.lastRefill = now\n }\n }\n}\n",
70
+ "/**\n * @fileoverview Ripple WebSocket Server\n *\n * Core WebSocket server implementation using Bun's native WebSocket API.\n *\n * @module @gravito/ripple\n */\n\nimport { ChannelManager, requiresAuth } from './channels'\nimport { LocalDriver, NATSDriver, RedisDriver } from './drivers'\nimport { BunEngine } from './engines/BunEngine'\nimport type { IRippleEngine, RippleSocket } from './engines/IRippleEngine'\nimport { UWebSocketsEngine } from './engines/UWebSocketsEngine'\nimport { WsEngine } from './engines/WsEngine'\nimport { HealthChecker } from './health/HealthChecker'\nimport type { RippleLogger } from './logging/Logger'\nimport { createLogger } from './logging/Logger'\nimport { InterceptorManager } from './middleware/InterceptorManager'\nimport { RippleMetrics } from './observability/RippleMetrics'\nimport { AckManager } from './reliability/AckManager'\nimport type { ISerializer } from './serializers/ISerializer'\nimport { JsonSerializer } from './serializers/JsonSerializer'\nimport { ProtobufSerializer } from './serializers/ProtobufSerializer'\nimport type { ConnectionTracker } from './tracking/ConnectionTracker'\nimport { DefaultConnectionTracker } from './tracking/ConnectionTracker'\nimport { type SessionData, SessionManager } from './tracking/SessionManager'\nimport type {\n ChannelAuthorizer,\n RippleConfig,\n RippleDriver,\n RippleInterceptor,\n ServerMessage,\n WebSocketHandlerConfig,\n} from './types'\nimport { TokenBucket } from './utils/TokenBucket'\n\n/**\n * Ripple WebSocket Server\n *\n * Provides channel-based real-time communication with multi-runtime support.\n * Can run on Bun (native WebSocket), Node.js (uWebSockets.js or ws).\n *\n * @since 5.0.0 - Multi-runtime support via engine abstraction\n */\nexport class RippleServer {\n private channels: ChannelManager\n private driver: RippleDriver\n private engine: IRippleEngine\n private authorizer?: ChannelAuthorizer\n private pingInterval?: ReturnType<typeof setInterval>\n private eventListeners: Map<string, ((socket: RippleSocket, data: any) => void)[]> = new Map()\n private logger: RippleLogger\n private tracker: ConnectionTracker\n private healthChecker: HealthChecker\n private serializer: ISerializer\n private whisperLimiters: Map<string, TokenBucket> = new Map()\n private sessionManager?: SessionManager\n private ackManager: AckManager\n private rippleMetrics?: RippleMetrics\n private interceptors: InterceptorManager\n private clientSockets = new Map<string, RippleSocket>()\n\n readonly config: Required<Pick<RippleConfig, 'path' | 'authEndpoint' | 'pingInterval'>> &\n RippleConfig\n\n constructor(config: RippleConfig = {}) {\n this.config = {\n path: '/ws',\n authEndpoint: '/broadcasting/auth',\n pingInterval: 30000,\n ...config,\n }\n\n this.logger = config.logger ?? createLogger('RippleServer', config.logLevel)\n\n // Create WebSocket engine based on runtime\n this.engine = this.createEngine(config)\n\n this.driver =\n config.driver === 'redis'\n ? new RedisDriver({ ...config.redis, logger: this.logger })\n : config.driver === 'nats'\n ? new NATSDriver({ ...config.nats, logger: this.logger })\n : new LocalDriver()\n this.channels = new ChannelManager(this.driver)\n this.authorizer = config.authorizer\n this.tracker = config.connectionTracker ?? new DefaultConnectionTracker(this.logger)\n this.healthChecker = new HealthChecker(this, this.driver)\n\n // Initialize serializer based on config\n this.serializer =\n config.serializer === 'protobuf'\n ? new ProtobufSerializer(config.serializerOptions)\n : new JsonSerializer()\n\n // Initialize session manager if reconnection is enabled\n if (config.reconnection?.enabled) {\n this.sessionManager = new SessionManager({\n sessionTTL: config.reconnection.sessionTTL ?? 60000,\n maxSessions: config.reconnection.maxSessions ?? 10000,\n logger: this.logger,\n })\n }\n\n this.ackManager = new AckManager(this.logger)\n\n if (config.metrics?.enabled) {\n this.rippleMetrics = new RippleMetrics(this.tracker, config.metrics.prefix, this.ackManager)\n }\n\n this.interceptors = new InterceptorManager(config.interceptors ?? [])\n\n // Register engine event handlers\n this.setupEngineHandlers()\n }\n\n /**\n * Create the appropriate WebSocket engine based on configuration.\n */\n private createEngine(config: RippleConfig): IRippleEngine {\n const runtime = config.runtime ?? this.detectRuntime()\n\n this.logger.info('Creating WebSocket engine', { runtime })\n\n switch (runtime) {\n case 'bun':\n return new BunEngine({\n port: config.port,\n hostname: config.hostname,\n development: process.env.NODE_ENV === 'development',\n })\n\n case 'node-uws':\n return new UWebSocketsEngine({\n port: config.port,\n hostname: config.hostname,\n development: process.env.NODE_ENV === 'development',\n })\n\n case 'node-ws':\n return new WsEngine({\n port: config.port,\n hostname: config.hostname,\n path: config.path,\n development: process.env.NODE_ENV === 'development',\n })\n default:\n throw new Error(`Unsupported runtime: ${runtime}`)\n }\n }\n\n /**\n * Auto-detect the current JavaScript runtime.\n */\n private detectRuntime(): 'bun' | 'node-uws' | 'node-ws' {\n // Check if running in Bun\n if (typeof Bun !== 'undefined') {\n return 'bun'\n }\n\n // For Node.js, default to ws (most compatible)\n // User can explicitly set runtime: 'node-uws' for better performance\n return 'node-ws'\n }\n\n /**\n * Setup engine event handlers.\n */\n private setupEngineHandlers(): void {\n this.engine.onConnection((socket) => this.handleOpen(socket))\n this.engine.onMessage((socket, message) => this.handleMessage(socket, message))\n this.engine.onDisconnection((socket, code, reason) => this.handleClose(socket, code, reason))\n }\n\n private emit(event: string, socket: RippleSocket, data: any): void {\n const handlers = this.eventListeners.get(event)\n if (handlers) {\n for (const handler of handlers) {\n handler(socket, data)\n }\n }\n }\n\n on(event: string, handler: (socket: RippleSocket, data: any) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, [])\n }\n this.eventListeners.get(event)?.push(handler)\n }\n\n /**\n * Get the name of the active message driver.\n */\n get driverName(): string {\n return this.driver.name\n }\n\n to(channel: string) {\n return {\n emit: (event: string, data: unknown, options?: { needAck?: boolean; timeout?: number }) =>\n this.broadcast(channel, event, data, options),\n }\n }\n\n /**\n * Upgrade an HTTP request to WebSocket (Bun/uWS only).\n *\n * @deprecated Use engine-based initialization via init() instead.\n * This method is kept for backward compatibility with v4.x.\n */\n upgrade(req: Request, options?: { userId?: string }): boolean {\n const url = new URL(req.url)\n\n if (url.pathname !== this.config.path) {\n return false\n }\n\n const reconnectionToken = url.searchParams.get('reconnection_token')\n let sessionData: SessionData | undefined\n\n if (reconnectionToken && this.sessionManager) {\n sessionData = this.sessionManager.getSession(reconnectionToken)\n if (sessionData) {\n this.logger.info('Client reconnecting with token', {\n token: reconnectionToken,\n clientId: sessionData.clientId,\n })\n }\n }\n\n // Delegate to engine if it supports upgrade\n if ('upgrade' in this.engine && typeof this.engine.upgrade === 'function') {\n return this.engine.upgrade(req, {\n userId: sessionData?.userId?.toString() ?? options?.userId,\n reconnectionToken:\n sessionData && reconnectionToken\n ? reconnectionToken\n : this.sessionManager\n ? crypto.randomUUID()\n : undefined,\n })\n }\n\n throw new Error('Current engine does not support HTTP upgrade')\n }\n\n /**\n * Get WebSocket handler configuration (Bun only).\n *\n * @deprecated Use engine-based initialization via init() instead.\n * This method is kept for backward compatibility with v4.x.\n */\n getHandler(): WebSocketHandlerConfig {\n // For backward compatibility, we need to return Bun-specific handlers\n // This will only work if using BunEngine\n throw new Error('getHandler() is deprecated in v5.0. Use init() to start the server instead.')\n }\n\n private async handleOpen(ws: RippleSocket): Promise<void> {\n this.clientSockets.set(ws.id, ws)\n this.channels.addClient(ws)\n this.tracker.onConnect(ws.data.id)\n\n this.logger.info('Client connected', {\n clientId: ws.data.id,\n activeConnections: this.tracker.getActiveConnections(),\n })\n\n this.send(ws, {\n type: 'connected',\n socketId: ws.data.id,\n })\n\n if (ws.data.reconnectionToken) {\n this.send(ws, {\n type: 'reconnection_token',\n token: ws.data.reconnectionToken,\n })\n }\n\n if (ws.data.reconnectionToken && this.sessionManager) {\n const session = this.sessionManager.getSession(ws.data.reconnectionToken)\n if (session) {\n this.logger.info('Restoring session subscriptions', {\n clientId: ws.data.id,\n channels: session.channels.length,\n })\n\n for (const channel of session.channels) {\n if (channel.startsWith('presence-') && session.userInfo) {\n await this.channels.subscribe(ws.data.id, channel, {\n id: session.userId!,\n info: session.userInfo,\n })\n } else {\n await this.channels.subscribe(ws.data.id, channel)\n }\n\n this.send(ws, { type: 'subscribed', channel })\n }\n\n this.sessionManager.removeSession(ws.data.reconnectionToken)\n }\n }\n }\n\n private async handleMessage(\n ws: RippleSocket,\n message: string | Buffer | ArrayBuffer | Uint8Array\n ): Promise<void> {\n try {\n // Convert to string or Uint8Array\n let data: string | Uint8Array\n if (typeof message === 'string') {\n data = message\n } else if (message instanceof Uint8Array) {\n data = message\n } else if (message instanceof ArrayBuffer) {\n data = new Uint8Array(message)\n } else if (Buffer.isBuffer(message)) {\n const buf = message as any as {\n buffer: ArrayBuffer\n byteOffset: number\n byteLength: number\n }\n data = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength)\n } else {\n return // Unknown type\n }\n\n if (data instanceof Uint8Array) {\n // Check if it's a raw binary message or a serialized message\n await this.handleBinaryMessage(ws, data)\n return\n }\n\n const parsedData = this.serializer.deserialize(data)\n\n await this.interceptors.execute(\n { ws, message: parsedData, direction: 'incoming' },\n async () => {\n switch (parsedData.type) {\n case 'subscribe':\n await this.handleSubscribe(ws, parsedData.channel, parsedData.auth)\n break\n\n case 'unsubscribe':\n await this.handleUnsubscribe(ws, parsedData.channel)\n break\n\n case 'whisper':\n this.handleWhisper(ws, parsedData.channel, parsedData.event, parsedData.data)\n break\n\n case 'ping':\n this.send(ws, { type: 'pong' })\n break\n\n case 'ack':\n this.ackManager.confirm(ws.data.id, parsedData.seq)\n break\n }\n }\n )\n } catch (error) {\n this.logger.error('Failed to parse message', {\n clientId: ws.data.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n })\n this.tracker.onError(ws.data.id, error instanceof Error ? error.message : 'Invalid message')\n this.send(ws, {\n type: 'error',\n message: error instanceof Error ? error.message : 'Invalid message',\n })\n }\n }\n\n private async handleBinaryMessage(ws: RippleSocket, message: Uint8Array): Promise<void> {\n const buffer = message\n\n if (buffer.length < 4) {\n return\n }\n\n // Read header length (4 bytes, little-endian)\n const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n const headerLength = view.getInt32(0, true) // true = little-endian\n if (buffer.length < 4 + headerLength) {\n return\n }\n\n try {\n const headerBytes = buffer.subarray(4, 4 + headerLength)\n const headerRaw = new TextDecoder().decode(headerBytes)\n const header = JSON.parse(headerRaw)\n const payload = buffer.subarray(4 + headerLength)\n\n if (header.type === 'binary') {\n const { channel, event } = header\n\n const listeners = this.eventListeners.get(event)\n if (listeners) {\n for (const handler of listeners) {\n handler(ws, payload.buffer as ArrayBuffer)\n }\n }\n\n if (!this.channels.isSubscribed(ws.data.id, channel)) {\n this.send(ws, { type: 'error', message: 'Not subscribed to channel', channel })\n return\n }\n\n this.broadcastBinaryToChannel(channel, event, payload.buffer as ArrayBuffer, ws.data.id)\n }\n } catch (e) {\n this.logger.error('Failed to parse binary message header', { error: (e as any).message })\n }\n }\n\n private broadcastBinaryToChannel(\n channel: string,\n event: string,\n data: ArrayBuffer,\n excludeClientId?: string\n ): void {\n const subscribers = this.channels.getSubscribers(channel)\n if (subscribers.length === 0) {\n return\n }\n\n const header = JSON.stringify({ type: 'binary', channel, event })\n const headerBuffer = Buffer.from(header)\n const totalBuffer = Buffer.allocUnsafe(4 + headerBuffer.length + data.byteLength)\n\n totalBuffer.writeInt32LE(headerBuffer.length, 0)\n headerBuffer.copy(totalBuffer, 4)\n Buffer.from(data).copy(totalBuffer, 4 + headerBuffer.length)\n\n for (const ws of subscribers) {\n if (excludeClientId && ws.data.id === excludeClientId) {\n continue\n }\n ws.send(totalBuffer)\n }\n }\n\n broadcastBinary(channel: string, event: string, data: ArrayBuffer): void {\n this.broadcastBinaryToChannel(channel, event, data)\n }\n\n private handleClose(ws: RippleSocket, code: number, reason: string): void {\n if (this.sessionManager && ws.data.channels.size > 0) {\n const token = this.sessionManager.createSession(\n {\n clientId: ws.data.id,\n userId: ws.data.userId,\n channels: Array.from(ws.data.channels),\n userInfo: ws.data.userInfo,\n },\n ws.data.reconnectionToken\n )\n\n this.logger.info('Created reconnection session', {\n clientId: ws.data.id,\n token,\n channels: ws.data.channels.size,\n })\n }\n\n const leftChannels = this.channels.removeClient(ws.data.id)\n this.tracker.onDisconnect(ws.data.id, code, reason)\n\n this.logger.info('Client disconnected', {\n clientId: ws.data.id,\n code: code.toString(),\n reason,\n channelsLeft: leftChannels.length,\n activeConnections: this.tracker.getActiveConnections(),\n })\n\n for (const channel of leftChannels) {\n if (channel.startsWith('presence-') && ws.data.userId) {\n this.broadcastToChannel(channel, 'presence', {\n event: 'leave',\n data: {\n id: ws.data.userId,\n info: ws.data.userInfo,\n },\n })\n }\n }\n\n this.ackManager.clearClient(ws.data.id)\n }\n\n private async handleSubscribe(\n ws: RippleSocket,\n channel: string,\n _auth?: { socketId: string; signature: string }\n ): Promise<void> {\n if (requiresAuth(channel)) {\n if (!this.authorizer) {\n this.send(ws, {\n type: 'error',\n message: 'No authorizer configured for private channels',\n channel,\n })\n return\n }\n\n const result = await this.authorizer(channel, ws.data.userId, ws.data.id)\n\n if (result === false) {\n this.send(ws, { type: 'error', message: 'Unauthorized', channel })\n return\n }\n\n if (typeof result === 'object' && 'id' in result) {\n await this.channels.subscribe(ws.data.id, channel, result)\n this.tracker.onSubscribe(ws.data.id, channel)\n\n this.broadcastToChannel(channel, 'presence', { event: 'join', data: result }, ws.data.id)\n\n this.send(ws, {\n type: 'presence',\n channel,\n event: 'members',\n data: await this.channels.getPresenceMembers(channel),\n })\n } else {\n await this.channels.subscribe(ws.data.id, channel)\n this.tracker.onSubscribe(ws.data.id, channel)\n }\n } else {\n await this.channels.subscribe(ws.data.id, channel)\n this.tracker.onSubscribe(ws.data.id, channel)\n }\n\n this.send(ws, { type: 'subscribed', channel })\n }\n\n private async handleUnsubscribe(ws: RippleSocket, channel: string): Promise<void> {\n if (channel.startsWith('presence-') && ws.data.userId) {\n this.broadcastToChannel(\n channel,\n 'presence',\n {\n event: 'leave',\n data: { id: ws.data.userId, info: ws.data.userInfo },\n },\n ws.data.id\n )\n }\n\n await this.channels.unsubscribe(ws.data.id, channel)\n this.tracker.onUnsubscribe(ws.data.id, channel)\n this.send(ws, { type: 'unsubscribed', channel })\n }\n\n private handleWhisper(ws: RippleSocket, channel: string, event: string, data: unknown): void {\n if (this.config.rateLimit?.whisperMax) {\n let limiter = this.whisperLimiters.get(ws.data.id)\n if (!limiter) {\n limiter = new TokenBucket(\n this.config.rateLimit.whisperMax,\n this.config.rateLimit.whisperMax / (this.config.rateLimit.whisperInterval ?? 1000)\n )\n this.whisperLimiters.set(ws.data.id, limiter)\n }\n\n if (!limiter.consume()) {\n this.send(ws, { type: 'error', message: 'Rate limit exceeded' })\n return\n }\n }\n\n const listeners = this.eventListeners.get(event)\n if (listeners) {\n listeners.forEach((handler) => {\n handler(ws, data)\n })\n }\n\n this.emit('whisper', ws, { channel, event, data })\n\n if (!this.channels.isSubscribed(ws.data.id, channel)) {\n this.send(ws, { type: 'error', message: 'Not subscribed to channel', channel })\n return\n }\n\n this.broadcastToChannel(channel, event, data, ws.data.id)\n }\n\n broadcast(\n channel: string,\n event: string,\n data: unknown,\n options?: { needAck?: boolean; timeout?: number }\n ): void {\n this.broadcastToChannel(channel, event, data, undefined, options)\n }\n\n broadcastToClients(clientIds: string[], event: string, data: unknown): void {\n for (const clientId of clientIds) {\n const ws = this.channels.getClient(clientId)\n if (ws) {\n this.send(ws, { type: 'event', channel: '', event, data })\n }\n }\n }\n\n private broadcastToChannel(\n channel: string,\n event: string,\n data: unknown,\n excludeClientId?: string,\n options?: { needAck?: boolean; timeout?: number }\n ): void {\n const subscribers = this.channels.getSubscribers(channel)\n if (subscribers.length === 0) {\n return\n }\n\n const message: ServerMessage =\n event === 'presence'\n ? {\n type: 'presence',\n channel,\n event: (data as { event: 'join' | 'leave' | 'members' }).event,\n data: (data as { data: unknown }).data,\n }\n : { type: 'event', channel, event, data }\n\n const serialized = this.serializer.serializeForBroadcast(message)\n\n for (const ws of subscribers) {\n if (excludeClientId && ws.data.id === excludeClientId) {\n continue\n }\n\n // Execute outgoing interceptors\n this.interceptors.execute(\n { ws, message: message, direction: 'outgoing', channel, event },\n async () => {\n if (options?.needAck) {\n const { seq, promise } = this.ackManager.register(ws.data.id, options.timeout)\n const msgWithAck: ServerMessage = { ...message, seq, needAck: true }\n this.send(ws, msgWithAck)\n\n promise.then((success) => {\n if (!success) {\n this.logger.warn('ACK timeout', { clientId: ws.data.id, seq, channel })\n } else {\n this.send(ws, { type: 'ack_received', seq })\n }\n })\n } else {\n this.sendRaw(ws, serialized)\n }\n }\n )\n }\n\n this.serializer.clearBroadcastCache()\n }\n\n private sendRaw(ws: RippleSocket, serialized: string | Buffer | Uint8Array): boolean {\n const config = this.config.backpressure\n if (config?.enabled) {\n const buffered = ws.getBufferedAmount()\n if (config.hwmHigh && buffered >= config.hwmHigh) {\n this.logger.warn('Backpressure HWM High', { clientId: ws.data.id, buffered })\n this.rippleMetrics?.incrementSlowClients()\n ws.close(1011, 'Backpressure')\n return false\n }\n if (config.hwmLow && buffered >= config.hwmLow) {\n this.logger.debug('Backpressure HWM Low', { clientId: ws.data.id, buffered })\n }\n }\n\n try {\n ws.send(serialized)\n return true\n } catch {\n return false\n }\n }\n\n private send(ws: RippleSocket, message: ServerMessage): boolean {\n return this.sendRaw(ws, this.serializer.serialize(message))\n }\n\n /**\n * Add a middleware interceptor (v4.0+).\n */\n use(interceptor: RippleInterceptor): this {\n this.interceptors.use(interceptor)\n return this\n }\n\n /**\n * Get real-time server statistics.\n */\n getStats() {\n return this.channels.getStats()\n }\n\n /**\n * Get Prometheus metrics (v3.7+).\n */\n getMetrics(): string {\n return this.rippleMetrics?.export() ?? ''\n }\n\n /**\n * Get server health status.\n */\n async getHealth() {\n return await this.healthChecker.check()\n }\n\n /**\n * Initialize and start the RippleServer.\n *\n * This method:\n * 1. Initializes the driver (Redis/NATS/Local)\n * 2. Initializes the serializer (JSON/Protobuf)\n * 3. Starts the WebSocket engine (Bun/uWS/ws)\n * 4. Starts the ping interval\n *\n * @since 5.0.0\n */\n async start(): Promise<void> {\n const port = this.config.port ?? 3000\n\n this.logger.info('Starting RippleServer', {\n driver: this.driver.name,\n serializer: this.serializer.contentType,\n runtime: this.config.runtime ?? 'auto-detected',\n port,\n })\n\n // Initialize driver\n await this.driver.init?.()\n\n // Initialize serializer if needed (e.g. loading proto files)\n if ('init' in this.serializer) {\n await (this.serializer as any).init()\n }\n\n // Start the WebSocket engine\n await this.engine.listen(port)\n\n // Start ping interval\n if (this.config.pingInterval > 0) {\n const pong = this.serializer.getPongMessage()\n this.pingInterval = setInterval(() => {\n for (const ws of this.channels.getAllClients()) {\n try {\n ws.send(pong)\n } catch {}\n }\n }, this.config.pingInterval)\n }\n\n this.logger.info('RippleServer started successfully', { port })\n }\n\n /**\n * Initialize the RippleServer without starting the engine.\n *\n * @deprecated Use start() instead. This method is kept for backward compatibility.\n * @since 3.0.0\n */\n async init(): Promise<void> {\n this.logger.info('Initializing RippleServer', {\n driver: this.driver.name,\n serializer: this.serializer.contentType,\n })\n\n await this.driver.init?.()\n\n // Initialize serializer if needed (e.g. loading proto files)\n if ('init' in this.serializer) {\n await (this.serializer as any).init()\n }\n\n if (this.config.pingInterval > 0) {\n const pong = this.serializer.getPongMessage()\n this.pingInterval = setInterval(() => {\n for (const ws of this.channels.getAllClients()) {\n try {\n ws.send(pong)\n } catch {}\n }\n }, this.config.pingInterval)\n }\n }\n\n async shutdown(): Promise<void> {\n this.logger.info('Shutting down RippleServer')\n if (this.pingInterval) {\n clearInterval(this.pingInterval)\n }\n await this.driver.shutdown?.()\n }\n}\n",
71
+ "import type { GravitoContext, GravitoNext, GravitoOrbit, PlanetCore } from '@gravito/core'\nimport { setRippleServer } from './events/Broadcaster'\nimport { BroadcastManager } from './events/BroadcastManager'\nimport { RippleServer } from './RippleServer'\nimport type { RippleConfig } from './types'\n\n/**\n * OrbitRipple integrates the Ripple WebSocket module into the Gravito framework.\n *\n * It handles the registration of the RippleServer in the IoC container,\n * adds middleware for context access, and manages the server lifecycle.\n *\n * @example\n * ```typescript\n * import { PlanetCore } from '@gravito/core'\n * import { OrbitRipple } from '@gravito/ripple'\n *\n * const core = new PlanetCore()\n *\n * // Install Ripple as an Orbit\n * core.install(new OrbitRipple({\n * path: '/ws',\n * authorizer: async (channel, userId) => userId !== undefined\n * }))\n * ```\n */\nexport class OrbitRipple implements GravitoOrbit {\n private server: RippleServer\n private config: RippleConfig\n\n /**\n * Create a new OrbitRipple.\n *\n * @param config - Ripple configuration options\n */\n constructor(config: RippleConfig = {}) {\n this.config = config\n this.server = new RippleServer(config)\n }\n\n /**\n * Install the orbit into the Gravito core.\n *\n * - Registers 'ripple' (RippleServer) and 'broadcast' (BroadcastManager) in the container.\n * - Adds middleware to inject 'ripple' and 'broadcast' into GravitoContext.\n * - Initializes the server and registers shutdown hooks.\n *\n * @param core - The PlanetCore instance\n */\n install(core: PlanetCore): void {\n core.logger.info('🌊 Orbit Ripple installed')\n\n // Set static reference for helper functions\n setRippleServer(this.server)\n\n // Register in IoC container\n core.container.instance('ripple', this.server)\n\n const broadcastManager = new BroadcastManager(this.server)\n core.container.instance('broadcast', broadcastManager)\n\n // Middleware to inject into context\n core.adapter.use('*', async (ctx: GravitoContext, next: GravitoNext) => {\n ctx.set('ripple', this.server)\n ctx.set('broadcast', broadcastManager)\n return await next()\n })\n\n // Async initialization\n this.server.init().then(() => {\n core.logger.info(`🌊 Ripple WebSocket ready at ${this.config.path || '/ws'}`)\n })\n\n // Lifecycle: Graceful shutdown\n core.hooks.doAction('core:shutdown', async () => {\n await this.server.shutdown()\n })\n }\n\n /**\n * Get the underlying RippleServer instance.\n *\n * @returns The RippleServer instance\n */\n getServer(): RippleServer {\n return this.server\n }\n\n /**\n * Get the WebSocket handler for Bun.serve.\n *\n * @returns The WebSocket handler object\n */\n getHandler() {\n return this.server.getHandler()\n }\n}\n\ndeclare module '@gravito/core' {\n interface GravitoVariables {\n /** RippleServer instance available in context */\n ripple?: RippleServer\n /** BroadcastManager instance available in context */\n broadcast?: BroadcastManager\n }\n}\n",
72
+ "import type { ISerializer } from '../serializers/ISerializer'\nimport type { ClientMessage, ServerMessage } from '../types'\n\n/**\n * 訊息序列化器,用於 JSON 格式的訊息序列化與反序列化。\n *\n * 實現了廣播消息的緩存優化,確保相同的訊息只被序列化一次,\n * 然後發送給所有客戶端,從而減少 CPU 開銷。\n */\nexport class MessageSerializer implements ISerializer {\n readonly contentType = 'json'\n\n /** 預序列化的 PONG 訊息 */\n private static readonly PONG_MESSAGE = '{\"type\":\"pong\"}'\n\n /** 廣播訊息緩存 */\n private broadcastCache: Map<ServerMessage, string> = new Map()\n\n /**\n * 序列化伺服器訊息為 JSON 字符串。\n *\n * @param message - 要序列化的訊息\n * @returns JSON 字符串\n */\n serialize(message: ServerMessage): string {\n return JSON.stringify(message)\n }\n\n /**\n * 將訊息反序列化為客戶端訊息物件。\n *\n * @param data - 原始數據\n * @returns 解析後的客戶端訊息\n */\n deserialize(data: string | Buffer | ArrayBuffer): ClientMessage {\n const str = typeof data === 'string' ? data : new TextDecoder().decode(data)\n return JSON.parse(str) as ClientMessage\n }\n\n /**\n * 為廣播序列化訊息,支援緩存優化。\n *\n * 第一次序列化時會緩存結果,後續相同的訊息會直接返回緩存值,\n * 避免重複序列化。這在廣播給大量客戶端時可以顯著減少 CPU 使用。\n *\n * @param message - 要廣播的訊息\n * @returns 序列化的訊息\n */\n serializeForBroadcast(message: ServerMessage): string {\n let cached = this.broadcastCache.get(message)\n if (!cached) {\n cached = this.serialize(message)\n this.broadcastCache.set(message, cached)\n }\n return cached\n }\n\n /**\n * 清除廣播訊息緩存。\n *\n * 應在訊息發送完成後調用,以釋放記憶體。\n */\n clearBroadcastCache(): void {\n this.broadcastCache.clear()\n }\n\n /**\n * 取得預序列化的 PONG 訊息。\n *\n * PONG 訊息是一個常用的心跳訊息,為了效率我們將其預序列化為常數,\n * 每次都返回相同的字符串引用,無需重複序列化。\n *\n * @returns 預序列化的 PONG 訊息\n */\n getPongMessage(): string {\n return MessageSerializer.PONG_MESSAGE\n }\n}\n"
71
73
  ],
72
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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AA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IACxD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAA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",
73
- "debugId": "089300BB1B59F33364756E2164756E21",
74
+ "mappings": "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",
75
+ "debugId": "5BEEEDA722E6EBC364756E2164756E21",
74
76
  "names": []
75
77
  }