From 1c4763732afb4f4d92699bb185ff1151861ce0a1 Mon Sep 17 00:00:00 2001
From: baileympearson <23407842+baileympearson@users.noreply.github.com>
Date: Mon, 17 Mar 2025 19:22:55 +0000
Subject: [PATCH] [create-pull-request] automated change
---
docs/Next/assets/highlight.css | 8 +-
docs/Next/assets/navigation.js | 2 +-
docs/Next/assets/search.js | 2 +-
docs/Next/classes/AbstractCursor.html | 68 ++++-----
docs/Next/classes/Admin.html | 2 +-
docs/Next/classes/AggregationCursor.html | 76 +++++-----
docs/Next/classes/BulkOperationBase.html | 4 +-
docs/Next/classes/CancellationToken.html | 62 ++++----
docs/Next/classes/ChangeStream.html | 62 ++++----
docs/Next/classes/ClientEncryption.html | 60 ++++----
docs/Next/classes/ClientSession.html | 62 ++++----
docs/Next/classes/Collection.html | 12 +-
docs/Next/classes/Db.html | 6 +-
docs/Next/classes/ExplainableCursor.html | 68 ++++-----
docs/Next/classes/FindCursor.html | 72 ++++-----
docs/Next/classes/GridFSBucket.html | 62 ++++----
docs/Next/classes/GridFSBucketReadStream.html | 142 +++++++++---------
.../Next/classes/GridFSBucketWriteStream.html | 120 +++++++--------
docs/Next/classes/ListCollectionsCursor.html | 68 ++++-----
docs/Next/classes/ListIndexesCursor.html | 68 ++++-----
.../Next/classes/ListSearchIndexesCursor.html | 76 +++++-----
docs/Next/classes/MongoClient.html | 68 ++++-----
docs/Next/classes/MongoCredentials.html | 18 +--
docs/Next/classes/OrderedBulkOperation.html | 4 +-
docs/Next/classes/RunCommandCursor.html | 68 ++++-----
docs/Next/classes/TypedEventEmitter.html | 62 ++++----
docs/Next/classes/UnorderedBulkOperation.html | 4 +-
.../configureExplicitResourceManagement.html | 2 +-
docs/Next/index.html | 21 ++-
docs/Next/interfaces/AWSCredentials.html | 7 +
.../interfaces/AWSEncryptionKeyOptions.html | 8 +-
.../AWSKMSProviderConfiguration.html | 8 +-
.../interfaces/AbstractCursorOptions.html | 6 +-
docs/Next/interfaces/AggregateOptions.html | 2 +-
.../interfaces/AggregationCursorOptions.html | 6 +-
.../interfaces/AuthMechanismProperties.html | 21 ++-
.../interfaces/AutoEncryptionOptions.html | 24 +--
.../interfaces/AzureEncryptionKeyOptions.html | 8 +-
.../interfaces/BSON.DeserializeOptions.html | 2 +-
.../Next/interfaces/BSONSerializeOptions.html | 2 +-
docs/Next/interfaces/BulkWriteOptions.html | 2 +-
docs/Next/interfaces/ChangeStreamOptions.html | 2 +-
.../interfaces/ClientBulkWriteOptions.html | 2 +-
...ncryptionCreateDataKeyProviderOptions.html | 6 +-
.../ClientEncryptionEncryptOptions.html | 14 +-
.../interfaces/ClientEncryptionOptions.html | 22 +--
...ptionRewrapManyDataKeyProviderOptions.html | 4 +-
...ientEncryptionRewrapManyDataKeyResult.html | 4 +-
docs/Next/interfaces/CollectionOptions.html | 2 +-
.../interfaces/CommandOperationOptions.html | 2 +-
.../interfaces/CountDocumentsOptions.html | 2 +-
docs/Next/interfaces/CountOptions.html | 2 +-
.../interfaces/CreateCollectionOptions.html | 2 +-
.../Next/interfaces/CreateIndexesOptions.html | 2 +-
docs/Next/interfaces/CredentialProviders.html | 3 +
docs/Next/interfaces/DataKey.html | 4 +-
docs/Next/interfaces/DbOptions.html | 2 +-
docs/Next/interfaces/DbStatsOptions.html | 2 +-
docs/Next/interfaces/DeleteOptions.html | 2 +-
.../interfaces/DropCollectionOptions.html | 2 +-
.../EstimatedDocumentCountOptions.html | 2 +-
docs/Next/interfaces/ExplainOptions.html | 2 +-
.../interfaces/FindOneAndDeleteOptions.html | 2 +-
.../interfaces/FindOneAndReplaceOptions.html | 2 +-
.../interfaces/FindOneAndUpdateOptions.html | 2 +-
docs/Next/interfaces/FindOptions.html | 2 +-
.../interfaces/GCPEncryptionKeyOptions.html | 14 +-
.../interfaces/IndexInformationOptions.html | 6 +-
docs/Next/interfaces/InsertOneOptions.html | 2 +-
.../interfaces/KMIPEncryptionKeyOptions.html | 8 +-
.../KMIPKMSProviderConfiguration.html | 4 +-
docs/Next/interfaces/KMSProviders.html | 12 +-
.../interfaces/ListCollectionsOptions.html | 4 +-
.../Next/interfaces/ListDatabasesOptions.html | 2 +-
.../LocalKMSProviderConfiguration.html | 4 +-
docs/Next/interfaces/MongoClientOptions.html | 2 +-
.../interfaces/MongoCredentialsOptions.html | 4 +-
docs/Next/interfaces/MongoOptions.html | 2 +-
docs/Next/interfaces/OperationOptions.html | 2 +-
docs/Next/interfaces/RangeOptions.html | 10 +-
docs/Next/interfaces/RenameOptions.html | 2 +-
docs/Next/interfaces/ReplaceOptions.html | 2 +-
docs/Next/interfaces/TransactionOptions.html | 2 +-
docs/Next/interfaces/UpdateOptions.html | 2 +-
.../interfaces/ValidateCollectionOptions.html | 2 +-
docs/Next/modules.html | 3 +
docs/Next/types/AWSCredentialProvider.html | 4 +
docs/Next/types/Abortable.html | 2 +-
.../types/AutoEncryptionExtraOptions.html | 2 +-
.../Next/types/AutoEncryptionLoggerLevel.html | 2 +-
.../types/AzureKMSProviderConfiguration.html | 2 +-
docs/Next/types/ClientBulkWriteModel.html | 2 +-
.../ClientEncryptionDataKeyProvider.html | 2 +-
.../types/GCPKMSProviderConfiguration.html | 2 +-
docs/Next/types/RunCursorCommandOptions.html | 4 +-
docs/Next/types/ServerEvents.html | 2 +-
.../AutoEncryptionLoggerLevel-1.html | 2 +-
docs/Next/variables/CursorTimeoutMode-1.html | 4 +-
docs/categories/index.xml | 2 +-
docs/index.html | 2 +-
docs/index.xml | 2 +-
docs/tags/index.xml | 2 +-
102 files changed, 847 insertions(+), 818 deletions(-)
create mode 100644 docs/Next/interfaces/AWSCredentials.html
create mode 100644 docs/Next/interfaces/CredentialProviders.html
create mode 100644 docs/Next/types/AWSCredentialProvider.html
diff --git a/docs/Next/assets/highlight.css b/docs/Next/assets/highlight.css
index 7dd8a693450..1daba588bc3 100644
--- a/docs/Next/assets/highlight.css
+++ b/docs/Next/assets/highlight.css
@@ -7,10 +7,10 @@
--dark-hl-2: #569CD6;
--light-hl-3: #A31515;
--dark-hl-3: #CE9178;
- --light-hl-4: #008000;
- --dark-hl-4: #6A9955;
- --light-hl-5: #0070C1;
- --dark-hl-5: #4FC1FF;
+ --light-hl-4: #0070C1;
+ --dark-hl-4: #4FC1FF;
+ --light-hl-5: #008000;
+ --dark-hl-5: #6A9955;
--light-hl-6: #001080;
--dark-hl-6: #9CDCFE;
--light-hl-7: #AF00DB;
diff --git a/docs/Next/assets/navigation.js b/docs/Next/assets/navigation.js
index 2ca85798226..e318a8f6e3c 100644
--- a/docs/Next/assets/navigation.js
+++ b/docs/Next/assets/navigation.js
@@ -1 +1 @@
-window.navigationData = "data:application/octet-stream;base64,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"
\ No newline at end of file
+window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA62d23LjuLWG38X7dmYn3XNIpu/cttyj+CCX5e6+SKW6YBKWsE2BCgh5rKTy7rtAUiQOC2stsnOn0vrx/SRI4gzy7/8+s/LNnn04+6i0MMezH872wm7PPpzt6vJQyeZ/t3ZX/c8QfFG6PPvw87vffv7pzz//54cx9Xp19yA3i7d9juALMMr6uHuqK4QyCDDK43EvEUYfzhEu6jKXug/lUl5+fJDPmaSnWDatLNROVO/e/zUH8AU5SikbaZSo1L9ypxAqskdTF4ed1DZ3LGM4Tzg8VbmDGIK51Ettf3qfSXyK5dLe1HqTSdqHcilvxdu1zD0FQzCbWmkk9SmYS716+j9Z2GWZSe+FcwTqynOu+6PaycaKXe5B9uM5xufPy8tM8j6EPbtJyj+5f9vkY8ofzopKNM3ZhzPblD+q5kf5ZqXRwkmKrapKI/XZh79ni7c29QndBUOHd+//mveIjnhhTG1y7FN8Pn71/NxIS5l4qvlWcRmeuHSC7zA4aKt2kjoZXzbfLK5LEptOMN/gi6gOEuG38e/AS9OoWlOZ5cvmmYUVXmDgQvOgUV0YUNvYTCxQTYbsQTDTIKq3QngbnAeOqrSA28bmYcPaLqC60DxoXBEG2C44ExzVkSG4Dc4Dp9VngD6F58GBWjGgD/F5+LDCDMguNLMEaWu1xZuVupRetihtpXkWRVj7nXSh1/tffp3hdSM3ojhyHTv1TN+hSmKcZ6L9b3mS55tJMd+/q7h45xxq53m6WoB281XzfNp64Ua9yLzJIJnpMNQO9Pmk2rmeQ8t7tbeq1g3mGWtneib9t8SpV8zlu4qQkYeBbp5XWznSVoFsnpOrMGkjXzXPp6tBaadQN9OrrVQZXoFunteplqXdYuX3+eFFhq+a57NmP7+xcp7f0J6gMzKRfk8Nvpb/PEhdeHlpj/uw2j5JIps///aXd7+8Z1dg4QCdb9IH5+MvRFUcKmFld9nX0FXzDPPy+Yew+JvrkCOmvmC+jSuHviq7rQ929SqNUaWE7SDhfNuVvpQ7oUvQ6hScjx9uaPycUtl8S9fITp80z8wX/Ddv/FdhlHiq4pv/x3ehyU8TbrssvI3O4kK3z0WbLOeVTTHLv05uuMjuJJiZb0VaBIxWzwddtM9pZwVoQ89fkbFJapw+8vI03+uxtkaKHcepU87yo8/o+85nSO1urY+H52dpznW51KV8ox3TNDOPwS5193dHQ+8WUD3B9x+e8/lTY40o7MXBNNB4YBhPxgx8UrlTGgC4v9F0m42RG+HOL3sQsQTjfRS22ALjHu5vNN2helntpWltPooGGqyLJRTvq1FWPsjmUFmY5gkw1oXQhayq1vexfpFAPicSlLcVepM8vgPKi6KUSkltF7owx7bRAZAiBU1by6ZBUH0Y5dRVJYvM8QwxnLBz5f6VUJUsF69Bf3ckxRoGcW2FsRTSF3GYh6KQsiSpgQznat3l0cVWFi+yXOosGlZOoq8Olos/SSfwVwdLXEZEPs2HuriYnulU1Q3HYJQxuUYK1pF7Oh75vq6ri0oKw6DH2ikOrHyJpBP4zPyJtXyH21orWxulNyyTSM73eZCiPLIsRiWPziPzqJdPKePyCUuxeNtXQmnXeM+1IRIJxrtSusyBxhhF6JoKtWlgyBDGOJ+MKq/WHw/FiwRy1o9yKe4a5Gp+WMclt40ZDtoTYuzf68ael6WRDZCDXhBj3KjGjrV+k7uooIzitu19iTIDCcVbS2GKLYMKCDH2ba039fn9MjPlH4Rpztc1yunDNOdfB5NbsREJSFbbtn+QizdZHGx+bUNeSzuc2uooOhCRTL+ZjWETHU1u28o5XBtkMoZT6u4y9DCzCaZ6TXCZx+fcJ2ga2rHe7YVVT6pS9ojaJEKabWQptVWiAorFWMGgHfe2fdaub9cPbhi+ya0Kw/U8p659dCmscNNClE+qnuLS9ztlOZbsTMdcSp47aTKBtdSvolLludm006okGtLznMbLeSftH7V5cWPh9YG2RBPS3l058bYVh8Y1nDE3QMrkL/XnBi9XIhnJvfw43ht3YiebvSiAIaO8luFAcyfQZFHv9qYbP8FyIhXSbKNeJVo5eAqShnGYhLe9MrJc0ycLKEn6p4t7DHkK05y2RXyxPegXlBfJmFy6XZHoSPKEwmhWOXQtzZM0dYOBAw1JvFVNo/TGqxAxdkbNdbmUezeXpwu0YoPFpEdftmJkX8LlMQr5OaX6XW37Xj9epCc6krxaXl5gxCFOk04j+Yw8ALWkw70weK0zCkgWvsY9kZC8tTSv0vTjYQg00THJNHMKbS0ZDThISvOtqOS9UTu3eBSDxzqafGysREtgT0HSHoWqxsErjAooaXq9r6t6c6TvB0BJ043QjSCvXywjuZ+1fNu3ZUd36R9ks681/sihaUjHrmtb60Ia9FQSHUZemVIaWQaziykXUmFUN37XH0EK84IU497IZ2nC9Vs+ZoyjpIPuZ6JyA1uxAqP1hZLYi7bjrCTQE041DCI2k5BIaN6lbAqjMpOjiWQSrxsVwo81I6d9fpfC2Ccp8MmzvHaCAz5thoineBBzpKic9lntpc5P3aQampidBQ/CKKdt1uP3XyzBeFGxD58qIOIw0aMERBOZ+JNCJOB44dcfUqHUsRYEYGMQZRz3/fEvdspaCRS3iQTjfdY1q46CdRjZryhTnh/lUjLV8qQaGRuG5o07h+umsAXeoDJaDvrLr8CCKXTZeCziAIflVRxwLEYNmqMuLlWzrxsR7IL0uaEGxR3sFmYc7JZKeCuLrdCq2d2bei9N2HaIWICWwNfjWic0EyEliv66Bof9fWYgIWCj+bU8okcKawn89e363tSvqpTmotbPanOIS4zQIqdHbdr5QfZ55NSYRbvRjbtJg9yjAa0NHMrIqLDx2bCWiUeOORJhQH8K0g1l39YluhUM0bNtuqkftksgn2bSTqRPdArScO0uZSUnnFMoZ5v0+nHKIdwInDMDk0033e0yj3lePtUk2OpNOCQ7v2n88JyB7VLCD0rMPgBT791c55NoJtwkQKJJhpOMZhhMe7qSFFyrpW6ksWyfUM43aWc1phRMaRKumZvbW4ezfxmPQclFY/UCoONiH+Sz0nIsQdZbYcpreWRnFgXgH4gWO/41CuV8k30liikugZ5v07hcGDNlgmEmJdd6PdM4k45tu69UvCg85zRIufDP+0mPbyhHTdBFTD6eXMKEgtFnF5ROgMd7VfJsaNMKhO4aMbdCH2/rUlYIOlJy0SsteeSTkAsm88KX0dCx8xGsajr1e+jLygNMOZD+1xTrMMkUsykuM/AP8g8j9u7u+Y6MpSDfdUDk/USmpe27Zg3jkQiFE8DkWURKGn0rrSiFFQjzJOHD6KseKWl0X38zMjdS0uh+QJ8+6FBIg7vqi1P6RkoumpEboZALJu8zX0ZD2zqLOtJRhAPrhqiFR0ECGvfllnJvZOF2CwUvmqjc4kbjLz3FvXJy/BTaVG4xC0Z1cRRT9xtO0SOMRBSwO4mlfq6zuFHCg1GHx8+3boJ66OTjYFCL408bpXBwpOIh3a4uHtZTMtAMJgt20EN3vMGZgJJEk0QOqG12MW8rWEvj+109NDsUEuB+WuDUnMlyYx2Kbad/GAMKqQ7D9i0eENXH0ORP2LEMURyxtgK/CUMJCmP0fyb0fBh9Hn5vp1di5+kraBRSaXM7S53O5a7MdtAjDYprF55na5MxjEPqPe+xB5UYeqFLRuMvUaFIN6BAjV3HIhTYWLVz7ZRx2J4oUdEUqFW3S3eoOxELSMlAM5gM2JWqbLuoJ97g69EiDY7T5UrLc13Sj2RGy8OfeiYsfijmGfSNfRY/0JJ4Cklj3M4M7nxxRovivR3OKDrVcbHjnmyuQZJitpV71dGDfFVNrkhhp+YegrdNnHu6aRLarN1ag5DbOI25UpmVLWMYg/wuyw363PgCDLQs77PVXR8jkocLo3OgUIUi2/k8okKKRSTQnYjZkd2wjBbHuxEs1xxD2jOxiAaijTb+eNygxM86FLGA5NmyBvWub5f8YjYnpgwmLTDCEuBGa7zD5AswUPR2CSxDYCkFPy0AINGxkA1G7g1Ah2LrQlSTrh+aArfaZIAbIpnbll/rdsD1VZp290A3RIhmMJ0Os72tS/WMFTm+AAcN7y/ADjeV0dBxgSFNTrQk/vLjTb1xVXh2lWgqI6H+rkjyoAExaUBCeSD3RicC5UkwmNsCeSGq6kkUL/fCiB0MTGUUFG0S+AIUxBk8nTJqev9yJQpbG3jIaIiiCFO/ofWUL8BAD27lAAbyBSgo2Fl1ZWq0CZxV8y3ca8z5Fp6ab8HHs9BuzQ6O9BQ4ip7YmzClx+hj83vWrrSnTtNTTJ5ueqhryxnMAHTYYXtvqKIa/rAUh7vm0WlfVT5nAB2OdcLzvcrA+iiKiLdUoYeXEWMGbkbOLTSXDW88EtGjNummKNQlK+eY9F8aQ8m9BsWNW6PQY01kGLRf/kXcwomKRuITAhMm4xnT8PwJeHr0jj1mR87ic+fvOx0+IRBpMNyXfjUu7/nJqjGLZKvZZW51C6ichEYyOKPl4rFsAXRc7Fpaq/SG5p6EGPj8qTZRZ6H7vsIQiFJ331UICP7uu3YlafJlCEhDcotCuheIXSlZlSkxiJKssnys19ICNXSPiwUksWrfBW/Vq4S+mRKFSZo+ppuUEiYkYpCjZadRKTewIRmDHq3SHXDQotw0vTHiuKiiYqlneDEW53TtQNApSJL8TYsJyQ8ySN4OxcWbNemSugGbUU7zuKk3G2lu5CtwfXNC0sHfE3kaPkrokIgk929AJEaxegdMTDm1LywFv2x0CpAEZf9Qjeya7wnFD5Kk/lMy55US4Ad0hiBFOg08xJDT/2R6YO9VwgI0U7hwbZAqSCajCJtTfsWrhqM1y7BFVj7VbV2DE52wVyCe6vQIjDbCNo+5scaMx+m9f/CFTiUktd3PmMF5MQanfQNjWh2MET7DbQ/Lc1yUZulSQSXbEGAQ+tWFudwJ43yeW61IMUcNyV1f3Syub9fIPZcoSGbbbryqxCZhDREeo3/73G3wZW0f5Qko4qVqrNLA+s2OF4VJmrcNNUdMJRxqbkHkCEVXQibMhd66T+WUq51Kagw/RnK8d6e41Q1t7zMBQiIWuQEHHTxqkx9vSIndwqYv0jzVjbLHBBjFp/LCL2XCTOA7mQkXbqLw2ib+6CR0p8RxklcJa2WS9/3fVOpPF4w56o6ISEkXqaVRhZuBdb8Schgmad5CGrhETRUkc70+v19eCF1rVbjXY7Tn9UVUh+SGQaSUy+8qbf25/6h08ahz+zb2IkFlZFPp4bIcGA0sz8lwlYm/cuUTT1EWa72XhXpWBXh7pgqa+SzNsoT6LF6Ipli5kQamDCGS0pzrpLhr/6RS/q1WSV64/6h01/LYrJ7PoeP2QjzKym7hHIjCFM37FEmmHk0VHGbwIRKEDOko/q3r3rrzPNdlWwgk5FRBMsclD3ABlwhYxHa06EY8pd26KMyiufGN9v2tp7UkIDRRMdhu/UD2vMcgRbqT7vX798JuE44XmkBZPUP3eCIgibX2P8qdGxbIyGi6xQd1EwFJPOxc9Qye+xiiKP4yjqv+Q6ExDtKQXC1X5rY2ybENAZpQHbucgC9wHCd5/ku4E5gfpElOKapl8mHmMcJlfNaVbBr3BQz3JYE8MdZR/HtTP6tK6Q04JBpGp7EyBTUoYpDdm/GO0PX1YyTnUFXnVZUbBY/CHBqG4nOabZ4zxiiO97pl8GrG8Sk8oOsVhTm0cGkPBAwV05jQgEWqoJmbxdt+5bYSKp2MpYRRmrWrX+XnBlhBcsJFApro1uFEX+c9sYYQTbEHA7xp5wTyoyTrkN1I1eNiAYfYjjPRXEBG0dfFVu7Erdw9pV1ZP0ZyTkt1kpUlPSuK83hww8mP8TjjxzuhpwLS8Lj9QHVaAUVhHg0qz8cIzbBwG2kIMAisSiuno/nt+uwjWBwHQZJUm+Q5df9x0mU78UGQJEWf3OwRwPc1wbSqsPC4mx/jceg+W07H43frfLCj9RUk87Df1+598nd1KZF3L/R8VM32QqfNYBWb/Xiz5p8GJJ7ixDuRWEg5PIrNWibPU/cvmbZfLAiX1GGUy4LKQT9GcbA7dsq9+jVO/JVMoew2rQy6fzlp64OFk7cBDqGvcnJT/YCEQ/UWcGJkQDZz9cyrMMqNtEQraH58F/J+ilDU0pYAC4tRC2BdyIgcgigCmmYeGWMUh3x+WK8evl3dnH9agxgvjmHyE5weKxahR5af9RqJsQYFsiYzRjYiR21uFp/Ob749Xtx/W68urheP31b3j8vVHZi7OS2Nv1nz8YkWwd+u7j6tvl3cLBd3j98WXxZ3jyAZkGHQ3DCrBwwlaA5T46wRNVGi8NzAzQgNFSgsP3Iw4mINCcx1zENkqCKgcK/VB/oKFJbvvo24WMMA5vpdMTTUMcC5MniMEhCwJ+JzPAGKghstI8mPo6Cin4SWrnhUhbIPsqkPpnBbEsQmWvD63A8oN39iJAtNf/35P//4fzaWr08upgAA"
\ No newline at end of file
diff --git a/docs/Next/assets/search.js b/docs/Next/assets/search.js
index 041ca4c704e..80c8928dbc3 100644
--- a/docs/Next/assets/search.js
+++ b/docs/Next/assets/search.js
@@ -1 +1 @@
-window.searchData = "data:application/octet-stream;base64,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";
\ No newline at end of file
+window.searchData = "data:application/octet-stream;base64,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";
\ No newline at end of file
diff --git a/docs/Next/classes/AbstractCursor.html b/docs/Next/classes/AbstractCursor.html
index aa891d22f4e..dc5548331da 100644
--- a/docs/Next/classes/AbstractCursor.html
+++ b/docs/Next/classes/AbstractCursor.html
@@ -75,7 +75,7 @@
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter
, the emitter.getMaxListeners()
and emitter.setMaxListeners()
methods can be used to
temporarily avoid this warning:
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings
command-line flag can be used to display the
@@ -113,13 +113,13 @@
Parameters
Optional
options: {
timeoutMS?: number;
}Optional
timeoutMS?: number
Returns Promise<void>
emit
- emit<EventKey>(event, ...args): boolean
Type Parameters
Parameters
- event: symbol | EventKey
Rest
...args: Parameters<CursorEvents[EventKey]>
Returns boolean
event Names
- event
Names(): string[] Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbol
s.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns string[]
Type Parameters
Parameters
- type: string | symbol | EventKey
Returns number
listeners
- listeners<EventKey>(event): CursorEvents[EventKey][]
Returns a copy of the array of listeners for the event named eventName
.
-server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns CursorEvents[EventKey][]
Returns AbstractCursor<T, AbstractCursorEvents>
Remarks
Note Cursors use null
internally to indicate that there are no more documents in the cursor. Providing a mapping
function that maps values to null
will result in the cursor closing itself before it has finished iterating
all documents. This will not result in a memory leak, just surprising behavior. For example:
-const cursor = collection.find({});
cursor.map(() => null);
const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.
+const cursor = collection.find({});
cursor.map(() => null);
const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.
Other falsey values are allowed:
-const cursor = collection.find({});
cursor.map(() => '');
const documents = await cursor.toArray();
// documents is now an array of empty strings
+const cursor = collection.find({});
cursor.map(() => '');
const documents = await cursor.toArray();
// documents is now an array of empty strings
Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor,
it does not return a new instance of a cursor. This means when calling map,
you should always assign the result to a new variable in order to get a correctly typed cursor variable.
Take note of the following example:
-Example
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
+Example
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
max TimeMS
- max
TimeMS(value): this Set a maxTimeMS on the cursor query, allowing for hard timeout limits on queries (Only supported on MongoDB 2.6 or higher)
@@ -181,7 +181,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: CursorEvents[EventKey]
The callback function
@@ -196,7 +196,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -211,7 +211,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -224,7 +224,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: CursorEvents[EventKey]
The callback function
@@ -237,7 +237,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -250,7 +250,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
Returns this
raw Listeners
- raw
Listeners<EventKey>(event): CursorEvents[EventKey][] Returns a copy of the array of listeners for the event named eventName
,
including any wrappers (such as those created by .once()
).
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns CursorEvents[EventKey][]
Since
v9.4.0
@@ -323,7 +323,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
Optional
event: string | symbol | EventKey
Returns this
remove Listener
- remove
Listener<EventKey>(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -333,7 +333,7 @@
ExampleOnce an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -344,13 +344,13 @@
ExampleWhen a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
- event: EventKey
- listener: CursorEvents[EventKey]
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -360,7 +360,7 @@
ExampleOnce an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -371,13 +371,13 @@
ExampleWhen a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
- (eventName, listener): void
Parameters
- eventName: string | symbol
- listener: GenericListener
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -387,7 +387,7 @@
ExampleOnce an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -398,7 +398,7 @@
ExampleWhen a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
@@ -430,7 +430,7 @@ ExamplestopImmediatePropagation
does
not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
-import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
Parameters
- signal: AbortSignal
- resource: ((event: Event) => void)
- (event): void
Parameters
- event: Event
Returns void
Returns Disposable
Disposable that removes the abort
listener.
@@ -440,7 +440,7 @@ Example
For EventTarget
s this is the only way to get the event listeners for the
event target. This is useful for debugging and diagnostic purposes.
-import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
- name: string | symbol
Returns Function[]
Since
v15.2.0, v14.17.0
@@ -450,19 +450,19 @@ ExampleFor EventTarget
s this is the only way to get the max event listeners for the
event target. If the number of event handlers on a single EventTarget exceeds
the max set, the EventTarget will print a warning.
-import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
Returns number
Static
listener Count
- listener
Count(emitter, eventName): number A class method that returns the number of listeners for the given eventName
registered on the given emitter
.
-import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
Parameters
- emitter: EventEmitter<DefaultEventMap>
The emitter to query
- eventName: string | symbol
The event name
Returns number
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
Returns an AsyncIterator
that iterates eventName
events. It will throw
@@ -470,11 +470,11 @@
Deprecat
exiting the loop. The value
returned by each iteration is an array
composed of the emitted event arguments.
An AbortSignal
can be used to cancel waiting on events:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
Use the close
option to specify an array of event names that will end the iteration:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterIteratorOptions
Returns AsyncIterator<any[], any, any>
An AsyncIterator
that iterates eventName
events emitted by the emitter
@@ -485,21 +485,21 @@ Deprecat
given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error'
event
semantics and does not listen to the 'error'
event.
-import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
The special handling of the 'error'
event is only used when events.once()
is used to wait for another event. If events.once()
is used to wait for the
'error'
event itself, then it is treated as any other kind of event without
special handling:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
An AbortSignal
can be used to cancel waiting for the event:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
Parameters
Optional
n: numberA non-negative number. The maximum number of listeners per EventTarget
event.
diff --git a/docs/Next/classes/Admin.html b/docs/Next/classes/Admin.html
index 0416fc83d16..6e5dcb824b2 100644
--- a/docs/Next/classes/Admin.html
+++ b/docs/Next/classes/Admin.html
@@ -1,7 +1,7 @@
Admin | mongodb Class Admin
The Admin class is an internal class that allows convenient access to
the admin functionality and commands for MongoDB.
ADMIN Cannot directly be instantiated
- Index
Methods
build Info
diff --git a/docs/Next/classes/AggregationCursor.html b/docs/Next/classes/AggregationCursor.html
index b6769945377..ec491105196 100644
--- a/docs/Next/classes/AggregationCursor.html
+++ b/docs/Next/classes/AggregationCursor.html
@@ -94,7 +94,7 @@
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter
, the emitter.getMaxListeners()
and emitter.setMaxListeners()
methods can be used to
temporarily avoid this warning:
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings
command-line flag can be used to display the
@@ -125,10 +125,10 @@
- add
Listener(event, listener): this Alias for emitter.on(eventName, listener)
.
Parameters
- event: string | symbol
- listener: GenericListener
Returns this
add Stage
- add
Stage(stage): this Add a stage to the aggregation pipeline
-Parameters
- stage: Document
Returns this
Example
const documents = await users.aggregate().addStage({ $match: { name: /Mike/ } }).toArray();
+
Parameters
- stage: Document
Returns this
Example
const documents = await users.aggregate().addStage({ $match: { name: /Mike/ } }).toArray();
-Example
const documents = await users.aggregate()
.addStage<{ name: string }>({ $project: { name: true } })
.toArray(); // type of documents is { name: string }[]
+Example
const documents = await users.aggregate()
.addStage<{ name: string }>({ $project: { name: true } })
.toArray(); // type of documents is { name: string }[]
- add
Stage<T>(stage): AggregationCursor<T> Type Parameters
- T = Document
Parameters
- stage: Document
Returns AggregationCursor<T>
batch Size
- batch
Size(value): this Set the batch size for the cursor.
@@ -139,13 +139,13 @@ ExampleParameters
Optional
options: {
timeoutMS?: number;
}Optional
timeoutMS?: number
Returns Promise<void>
emit
- emit<EventKey>(event, ...args): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Type Parameters
Parameters
- event: symbol | EventKey
Rest
...args: Parameters<AbstractCursorEvents[EventKey]>
Returns boolean
event Names
- event
Names(): string[] Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbol
s.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns string[]
Type Parameters
Parameters
- type: string | symbol | EventKey
Returns number
listeners
- listeners<EventKey>(event): AbstractCursorEvents[EventKey][]
Returns a copy of the array of listeners for the event named eventName
.
-server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns AbstractCursorEvents[EventKey][]
Returns AggregationCursor<T>
Remarks
Note Cursors use null
internally to indicate that there are no more documents in the cursor. Providing a mapping
function that maps values to null
will result in the cursor closing itself before it has finished iterating
all documents. This will not result in a memory leak, just surprising behavior. For example:
-const cursor = collection.find({});
cursor.map(() => null);
const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.
+const cursor = collection.find({});
cursor.map(() => null);
const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.
Other falsey values are allowed:
-const cursor = collection.find({});
cursor.map(() => '');
const documents = await cursor.toArray();
// documents is now an array of empty strings
+const cursor = collection.find({});
cursor.map(() => '');
const documents = await cursor.toArray();
// documents is now an array of empty strings
Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor,
it does not return a new instance of a cursor. This means when calling map,
you should always assign the result to a new variable in order to get a correctly typed cursor variable.
Take note of the following example:
-Example
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
+Example
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
match
- match($match): this
Add a match stage to the aggregation pipeline
@@ -216,7 +216,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: AbstractCursorEvents[EventKey]
The callback function
@@ -231,7 +231,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -246,7 +246,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -259,7 +259,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: AbstractCursorEvents[EventKey]
The callback function
@@ -272,7 +272,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -285,7 +285,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -350,15 +350,15 @@ Example
By default chaining a projection to your cursor changes the returned type to the generic Document type.
You should specify a parameterized type to have assertions on your final results.
-Example
// Best way
const docs: AggregationCursor<{ a: number }> = cursor.project<{ a: number }>({ _id: 0, a: true });
// Flexible way
const docs: AggregationCursor<Document> = cursor.project({ _id: 0, a: true });
+Example
// Best way
const docs: AggregationCursor<{ a: number }> = cursor.project<{ a: number }>({ _id: 0, a: true });
// Flexible way
const docs: AggregationCursor<Document> = cursor.project({ _id: 0, a: true });
-Example
const cursor: AggregationCursor<{ a: number; b: string }> = coll.aggregate([]);
const projectCursor = cursor.project<{ a: number }>({ _id: 0, a: true });
const aPropOnlyArray: {a: number}[] = await projectCursor.toArray();
// or always use chaining and save the final cursor
const cursor = coll.aggregate().project<{ a: string }>({
_id: 0,
a: { $convert: { input: '$a', to: 'string' }
}});
+Example
const cursor: AggregationCursor<{ a: number; b: string }> = coll.aggregate([]);
const projectCursor = cursor.project<{ a: number }>({ _id: 0, a: true });
const aPropOnlyArray: {a: number}[] = await projectCursor.toArray();
// or always use chaining and save the final cursor
const cursor = coll.aggregate().project<{ a: string }>({
_id: 0,
a: { $convert: { input: '$a', to: 'string' }
}});
raw Listeners
- raw
Listeners<EventKey>(event): AbstractCursorEvents[EventKey][] Returns a copy of the array of listeners for the event named eventName
,
including any wrappers (such as those created by .once()
).
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns AbstractCursorEvents[EventKey][]
Since
v9.4.0
@@ -371,7 +371,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
Optional
event: string | symbol | EventKey
Returns this
remove Listener
- remove
Listener<EventKey>(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -381,7 +381,7 @@
ExampleOnce an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -392,13 +392,13 @@
ExampleWhen a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
- event: EventKey
- listener: AbstractCursorEvents[EventKey]
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -408,7 +408,7 @@
ExampleOnce an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -419,13 +419,13 @@
ExampleWhen a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
- (eventName, listener): void
Parameters
- eventName: string | symbol
- listener: GenericListener
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -435,7 +435,7 @@
ExampleOnce an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -446,7 +446,7 @@
ExampleWhen a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
@@ -481,7 +481,7 @@ ExamplestopImmediatePropagation
does
not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
-import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
Parameters
- signal: AbortSignal
- resource: ((event: Event) => void)
- (event): void
Parameters
- event: Event
Returns void
Returns Disposable
Disposable that removes the abort
listener.
@@ -491,7 +491,7 @@ Example
For EventTarget
s this is the only way to get the event listeners for the
event target. This is useful for debugging and diagnostic purposes.
-import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
- name: string | symbol
Returns Function[]
Since
v15.2.0, v14.17.0
@@ -501,19 +501,19 @@ ExampleFor EventTarget
s this is the only way to get the max event listeners for the
event target. If the number of event handlers on a single EventTarget exceeds
the max set, the EventTarget will print a warning.
-import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
Returns number
Static
listener Count
- listener
Count(emitter, eventName): number A class method that returns the number of listeners for the given eventName
registered on the given emitter
.
-import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
Parameters
- emitter: EventEmitter<DefaultEventMap>
The emitter to query
- eventName: string | symbol
The event name
Returns number
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
Returns an AsyncIterator
that iterates eventName
events. It will throw
@@ -521,11 +521,11 @@
Deprecat
exiting the loop. The value
returned by each iteration is an array
composed of the emitted event arguments.
An AbortSignal
can be used to cancel waiting on events:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
Use the close
option to specify an array of event names that will end the iteration:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterIteratorOptions
Returns AsyncIterator<any[], any, any>
An AsyncIterator
that iterates eventName
events emitted by the emitter
@@ -536,21 +536,21 @@ Deprecat
given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error'
event
semantics and does not listen to the 'error'
event.
-import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
The special handling of the 'error'
event is only used when events.once()
is used to wait for another event. If events.once()
is used to wait for the
'error'
event itself, then it is treated as any other kind of event without
special handling:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
An AbortSignal
can be used to cancel waiting for the event:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
Parameters
Optional
n: numberA non-negative number. The maximum number of listeners per EventTarget
event.
diff --git a/docs/Next/classes/BulkOperationBase.html b/docs/Next/classes/BulkOperationBase.html
index 15483d66b58..bd987a558b7 100644
--- a/docs/Next/classes/BulkOperationBase.html
+++ b/docs/Next/classes/BulkOperationBase.html
@@ -11,11 +11,11 @@
raw
Accessors
batches
bson Options
- get bsonOptions(): BSONSerializeOptions
Returns BSONSerializeOptions
length
- get length(): number
Returns number
write Concern
- get writeConcern(): undefined | WriteConcern
Returns undefined | WriteConcern
Methods
Abstract
add To Operations List
- add
To Operations List(batchType, document): this Parameters
- batchType: BatchType
- document: Document | DeleteStatement | UpdateStatement
Returns this
execute
- execute(options?): Promise<BulkWriteResult>
Parameters
- options: BulkWriteOptions = {}
Returns Promise<BulkWriteResult>
find
- find(selector): FindOperators
Builds a find operation for an update/updateOne/delete/deleteOne/replaceOne.
Returns a builder object used to complete the definition of the operation.
-Parameters
- selector: Document
Returns FindOperators
Example
const bulkOp = collection.initializeOrderedBulkOp();
// Add an updateOne to the bulkOp
bulkOp.find({ a: 1 }).updateOne({ $set: { b: 2 } });
// Add an updateMany to the bulkOp
bulkOp.find({ c: 3 }).update({ $set: { d: 4 } });
// Add an upsert
bulkOp.find({ e: 5 }).upsert().updateOne({ $set: { f: 6 } });
// Add a deletion
bulkOp.find({ g: 7 }).deleteOne();
// Add a multi deletion
bulkOp.find({ h: 8 }).delete();
// Add a replaceOne
bulkOp.find({ i: 9 }).replaceOne({writeConcern: { j: 10 }});
// Update using a pipeline (requires Mongodb 4.2 or higher)
bulk.find({ k: 11, y: { $exists: true }, z: { $exists: true } }).updateOne([
{ $set: { total: { $sum: [ '$y', '$z' ] } } }
]);
// All of the ops will now be executed
await bulkOp.execute();
+
Parameters
- selector: Document
Returns FindOperators
Example
const bulkOp = collection.initializeOrderedBulkOp();
// Add an updateOne to the bulkOp
bulkOp.find({ a: 1 }).updateOne({ $set: { b: 2 } });
// Add an updateMany to the bulkOp
bulkOp.find({ c: 3 }).update({ $set: { d: 4 } });
// Add an upsert
bulkOp.find({ e: 5 }).upsert().updateOne({ $set: { f: 6 } });
// Add a deletion
bulkOp.find({ g: 7 }).deleteOne();
// Add a multi deletion
bulkOp.find({ h: 8 }).delete();
// Add a replaceOne
bulkOp.find({ i: 9 }).replaceOne({writeConcern: { j: 10 }});
// Update using a pipeline (requires Mongodb 4.2 or higher)
bulk.find({ k: 11, y: { $exists: true }, z: { $exists: true } }).updateOne([
{ $set: { total: { $sum: [ '$y', '$z' ] } } }
]);
// All of the ops will now be executed
await bulkOp.execute();
insert
- insert(document): BulkOperationBase
Add a single insert document to the bulk operation
-Parameters
- document: Document
Returns BulkOperationBase
Example
const bulkOp = collection.initializeOrderedBulkOp();
// Adds three inserts to the bulkOp.
bulkOp
.insert({ a: 1 })
.insert({ b: 2 })
.insert({ c: 3 });
await bulkOp.execute();
+
Parameters
- document: Document
Returns BulkOperationBase
raw
- raw(op): this
Specifies a raw operation to perform in the bulk write.
diff --git a/docs/Next/classes/CancellationToken.html b/docs/Next/classes/CancellationToken.html
index 23a60e76400..e3d129d00e6 100644
--- a/docs/Next/classes/CancellationToken.html
+++ b/docs/Next/classes/CancellationToken.html
@@ -46,7 +46,7 @@
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter
, the emitter.getMaxListeners()
and emitter.setMaxListeners()
methods can be used to
temporarily avoid this warning:
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings
command-line flag can be used to display the
@@ -70,13 +70,13 @@
emit
- emit<EventKey>(event, ...args): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Type Parameters
Returns boolean
event Names
- event
Names(): string[] Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbol
s.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns string[]
Type Parameters
Parameters
- type: string | symbol | EventKey
Returns number
listeners
- listeners<EventKey>(event): {
cancel(): void;
}[EventKey][] Returns a copy of the array of listeners for the event named eventName
.
-server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns {
cancel(): void;
}[EventKey][]
Since
v0.1.26
@@ -108,7 +108,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: {
cancel(): void;
}[EventKey]The callback function
@@ -123,7 +123,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -138,7 +138,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -151,7 +151,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: {
cancel(): void;
}[EventKey]The callback function
@@ -164,7 +164,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -177,7 +177,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -238,7 +238,7 @@
Returns this
raw Listeners
- raw
Listeners<EventKey>(event): {
cancel(): void;
}[EventKey][] Returns a copy of the array of listeners for the event named eventName
,
including any wrappers (such as those created by .once()
).
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns {
cancel(): void;
}[EventKey][]
Since
v9.4.0
@@ -249,7 +249,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
Optional
event: string | symbol | EventKey
Returns this
remove Listener
- remove
Listener<EventKey>(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -259,7 +259,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -270,13 +270,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -286,7 +286,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -297,13 +297,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
- (eventName, listener): void
Parameters
- eventName: string | symbol
- listener: GenericListener
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -313,7 +313,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -324,7 +324,7 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
@@ -345,7 +345,7 @@
two issues by listening to the event such that stopImmediatePropagation
does
not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
-import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
Parameters
- signal: AbortSignal
- resource: ((event: Event) => void)
- (event): void
Parameters
- event: Event
Returns void
Returns Disposable
Disposable that removes the abort
listener.
@@ -355,7 +355,7 @@
the emitter.
For EventTarget
s this is the only way to get the event listeners for the
event target. This is useful for debugging and diagnostic purposes.
-import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
- name: string | symbol
Returns Function[]
Since
v15.2.0, v14.17.0
@@ -365,19 +365,19 @@
For EventTarget
s this is the only way to get the max event listeners for the
event target. If the number of event handlers on a single EventTarget exceeds
the max set, the EventTarget will print a warning.
-import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
Returns number
Static
listener Count
- listener
Count(emitter, eventName): number A class method that returns the number of listeners for the given eventName
registered on the given emitter
.
-import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
Parameters
- emitter: EventEmitter<DefaultEventMap>
The emitter to query
- eventName: string | symbol
The event name
Returns number
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
Returns an AsyncIterator
that iterates eventName
events. It will throw
@@ -385,11 +385,11 @@
Deprecated
exiting the loop. The value
returned by each iteration is an array
composed of the emitted event arguments.
An AbortSignal
can be used to cancel waiting on events:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
Use the close
option to specify an array of event names that will end the iteration:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterIteratorOptions
Returns AsyncIterator<any[], any, any>
An AsyncIterator
that iterates eventName
events emitted by the emitter
@@ -400,21 +400,21 @@ Deprecated
given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error'
event
semantics and does not listen to the 'error'
event.
-import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
The special handling of the 'error'
event is only used when events.once()
is used to wait for another event. If events.once()
is used to wait for the
'error'
event itself, then it is treated as any other kind of event without
special handling:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
An AbortSignal
can be used to cancel waiting for the event:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
Parameters
Optional
n: numberA non-negative number. The maximum number of listeners per EventTarget
event.
diff --git a/docs/Next/classes/ChangeStream.html b/docs/Next/classes/ChangeStream.html
index 70dd8207742..81295485edf 100644
--- a/docs/Next/classes/ChangeStream.html
+++ b/docs/Next/classes/ChangeStream.html
@@ -78,7 +78,7 @@
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter
, the emitter.getMaxListeners()
and emitter.setMaxListeners()
methods can be used to
temporarily avoid this warning:
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings
command-line flag can be used to display the
@@ -106,13 +106,13 @@
Returns Promise<void>
emit
- emit<EventKey>(event, ...args): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Type Parameters
- EventKey extends keyof ChangeStreamEvents<TSchema, TChange>
Parameters
- event: symbol | EventKey
Rest
...args: Parameters<ChangeStreamEvents<TSchema, TChange>[EventKey]>
Returns boolean
event Names
- event
Names(): string[] Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbol
s.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns string[]
Type Parameters
- EventKey extends keyof ChangeStreamEvents<TSchema, TChange>
Parameters
- type: string | symbol | EventKey
Returns number
listeners
- listeners<EventKey>(event): ChangeStreamEvents<TSchema, TChange>[EventKey][]
Returns a copy of the array of listeners for the event named eventName
.
-server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
- EventKey extends keyof ChangeStreamEvents<TSchema, TChange>
Parameters
- event: string | symbol | EventKey
Returns ChangeStreamEvents<TSchema, TChange>[EventKey][]
Since
v0.1.26
@@ -146,7 +146,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
- EventKey extends keyof ChangeStreamEvents<TSchema, TChange>
Parameters
- event: EventKey
- listener: ChangeStreamEvents<TSchema, TChange>[EventKey]
The callback function
@@ -161,7 +161,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -176,7 +176,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -189,7 +189,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
- EventKey extends keyof ChangeStreamEvents<TSchema, TChange>
Parameters
- event: EventKey
- listener: ChangeStreamEvents<TSchema, TChange>[EventKey]
The callback function
@@ -202,7 +202,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -215,7 +215,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -276,7 +276,7 @@
Returns this
raw Listeners
- raw
Listeners<EventKey>(event): ChangeStreamEvents<TSchema, TChange>[EventKey][] Returns a copy of the array of listeners for the event named eventName
,
including any wrappers (such as those created by .once()
).
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
Type Parameters
- EventKey extends keyof ChangeStreamEvents<TSchema, TChange>
Parameters
- event: string | symbol | EventKey
Returns ChangeStreamEvents<TSchema, TChange>[EventKey][]
Since
v9.4.0
@@ -287,7 +287,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
- EventKey extends keyof ChangeStreamEvents<TSchema, TChange>
Parameters
Optional
event: string | symbol | EventKey
Returns this
remove Listener
- remove
Listener<EventKey>(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -297,7 +297,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -308,13 +308,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
- EventKey extends keyof ChangeStreamEvents<TSchema, TChange>
Parameters
- event: EventKey
- listener: ChangeStreamEvents<TSchema, TChange>[EventKey]
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -324,7 +324,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -335,13 +335,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
- (eventName, listener): void
Parameters
- eventName: string | symbol
- listener: GenericListener
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -351,7 +351,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -362,7 +362,7 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
@@ -388,7 +388,7 @@
two issues by listening to the event such that stopImmediatePropagation
does
not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
-import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
Parameters
- signal: AbortSignal
- resource: ((event: Event) => void)
- (event): void
Parameters
- event: Event
Returns void
Returns Disposable
Disposable that removes the abort
listener.
@@ -398,7 +398,7 @@
the emitter.
For EventTarget
s this is the only way to get the event listeners for the
event target. This is useful for debugging and diagnostic purposes.
-import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
- name: string | symbol
Returns Function[]
Since
v15.2.0, v14.17.0
@@ -408,19 +408,19 @@
For EventTarget
s this is the only way to get the max event listeners for the
event target. If the number of event handlers on a single EventTarget exceeds
the max set, the EventTarget will print a warning.
-import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
Returns number
Static
listener Count
- listener
Count(emitter, eventName): number A class method that returns the number of listeners for the given eventName
registered on the given emitter
.
-import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
Parameters
- emitter: EventEmitter<DefaultEventMap>
The emitter to query
- eventName: string | symbol
The event name
Returns number
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
Returns an AsyncIterator
that iterates eventName
events. It will throw
@@ -428,11 +428,11 @@
Deprecated
exiting the loop. The value
returned by each iteration is an array
composed of the emitted event arguments.
An AbortSignal
can be used to cancel waiting on events:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
Use the close
option to specify an array of event names that will end the iteration:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterIteratorOptions
Returns AsyncIterator<any[], any, any>
An AsyncIterator
that iterates eventName
events emitted by the emitter
@@ -443,21 +443,21 @@ Deprecated
given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error'
event
semantics and does not listen to the 'error'
event.
-import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
The special handling of the 'error'
event is only used when events.once()
is used to wait for another event. If events.once()
is used to wait for the
'error'
event itself, then it is treated as any other kind of event without
special handling:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
An AbortSignal
can be used to cancel waiting for the event:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
Parameters
Optional
n: numberA non-negative number. The maximum number of listeners per EventTarget
event.
diff --git a/docs/Next/classes/ClientEncryption.html b/docs/Next/classes/ClientEncryption.html
index 8b1dc6d5e22..f54a6ae9b0d 100644
--- a/docs/Next/classes/ClientEncryption.html
+++ b/docs/Next/classes/ClientEncryption.html
@@ -1,5 +1,5 @@
ClientEncryption | mongodb Class ClientEncryption
The public interface for explicit in-use encryption
- Index
Constructors
Index
Constructors
Accessors
Methods
Constructors
constructor
- new
Client Encryption(client, options): ClientEncryption Create a new encryption instance
-Parameters
- client: MongoClient
- options: ClientEncryptionOptions
Returns ClientEncryption
Example
new ClientEncryption(mongoClient, {
keyVaultNamespace: 'client.encryption',
kmsProviders: {
local: {
key: masterKey // The master key used for encryption/decryption. A 96-byte long Buffer
}
}
});
+
Parameters
- client: MongoClient
- options: ClientEncryptionOptions
Returns ClientEncryption
Example
new ClientEncryption(mongoClient, {
keyVaultNamespace: 'client.encryption',
kmsProviders: {
local: {
key: masterKey // The master key used for encryption/decryption. A 96-byte long Buffer
}
}
});
-Example
new ClientEncryption(mongoClient, {
keyVaultNamespace: 'client.encryption',
kmsProviders: {
aws: {
accessKeyId: AWS_ACCESS_KEY,
secretAccessKey: AWS_SECRET_KEY
}
}
});
+Example
new ClientEncryption(mongoClient, {
keyVaultNamespace: 'client.encryption',
kmsProviders: {
aws: {
accessKeyId: AWS_ACCESS_KEY,
secretAccessKey: AWS_SECRET_KEY
}
}
});
-
Methods
add Key Alt Name
- add
Key Alt Name(_id, keyAltName): Promise<null | WithId<DataKey>> Adds a keyAltName to a key identified by the provided _id.
This method resolves to/returns the old key value (prior to adding the new altKeyName).
Parameters
- _id: Binary
The id of the document to update.
- keyAltName: string
a keyAltName to search for a key
Returns Promise<null | WithId<DataKey>>
Returns a promise that either resolves to a DataKey if a document matches the key or null if no documents
match the id. The promise rejects with an error if an error is thrown.
-Example
// adding an keyAltName to a data key
const id = new Binary(); // id is a bson binary subtype 4 object
const keyAltName = 'keyAltName';
const oldKey = await clientEncryption.addKeyAltName(id, keyAltName);
if (!oldKey) {
// null is returned if there is no matching document with an id matching the supplied id
}
+Example
// adding an keyAltName to a data key
const id = new Binary(); // id is a bson binary subtype 4 object
const keyAltName = 'keyAltName';
const oldKey = await clientEncryption.addKeyAltName(id, keyAltName);
if (!oldKey) {
// null is returned if there is no matching document with an id matching the supplied id
}
-create Data Key
- create
Data Key(provider, options?): Promise<UUID> Creates a data key used for explicit encryption and inserts it into the key vault namespace
-Parameters
- provider: keyof KMSProviders
- options: ClientEncryptionCreateDataKeyProviderOptions = {}
Returns Promise<UUID>
create Data Key
- create
Data Key(provider, options?): Promise<UUID> Creates a data key used for explicit encryption and inserts it into the key vault namespace
+Parameters
- provider: keyof KMSProviders
- options: ClientEncryptionCreateDataKeyProviderOptions = {}
Returns Promise<UUID>
Example
// Using async/await to create a local key
const dataKeyId = await clientEncryption.createDataKey('local');
-Example
// Using async/await to create an aws key
const dataKeyId = await clientEncryption.createDataKey('aws', {
masterKey: {
region: 'us-east-1',
key: 'xxxxxxxxxxxxxx' // CMK ARN here
}
});
+Example
// Using async/await to create an aws key
const dataKeyId = await clientEncryption.createDataKey('aws', {
masterKey: {
region: 'us-east-1',
key: 'xxxxxxxxxxxxxx' // CMK ARN here
}
});
-Example
// Using async/await to create an aws key with a keyAltName
const dataKeyId = await clientEncryption.createDataKey('aws', {
masterKey: {
region: 'us-east-1',
key: 'xxxxxxxxxxxxxx' // CMK ARN here
},
keyAltNames: [ 'mySpecialKey' ]
});
+Example
// Using async/await to create an aws key with a keyAltName
const dataKeyId = await clientEncryption.createDataKey('aws', {
masterKey: {
region: 'us-east-1',
key: 'xxxxxxxxxxxxxx' // CMK ARN here
},
keyAltNames: [ 'mySpecialKey' ]
});
-
create Encrypted Collection
- create
Encrypted Collection<TSchema>(db, name, options): Promise<{
collection: Collection<TSchema>;
encryptedFields: Document;
}> A convenience method for creating an encrypted collection.
+
create Encrypted Collection
- create
Encrypted Collection<TSchema>(db, name, options): Promise<{
collection: Collection<TSchema>;
encryptedFields: Document;
}> A convenience method for creating an encrypted collection.
This method will create data keys for any encryptedFields that do not have a keyId
defined
and then create a new collection with the full set of encryptedFields.
Type Parameters
Parameters
- db: Db
A Node.js driver Db object with which to create the collection
@@ -48,27 +48,27 @@ Examplecreate Collection Options: Omit<CreateCollectionOptions, "encryptedFields"> & {
encryptedFields: Document;
}
Optional
master Key?: AWSEncryptionKeyOptions | AzureEncryptionKeyOptions | GCPEncryptionKeyOptions
provider: keyof KMSProviders
Returns Promise<{
collection: Collection<TSchema>;
encryptedFields: Document;
}>
created collection and generated encryptedFields
Throws
MongoCryptCreateDataKeyError - If part way through the process a createDataKey invocation fails, an error will be rejected that has the partial encryptedFields
that were created.
Throws
MongoCryptCreateEncryptedCollectionError - If creating the collection fails, an error will be rejected that has the entire encryptedFields
that were created.
-
decrypt
decrypt
- decrypt<T>(value): Promise<T>
Explicitly decrypt a provided encrypted value
Type Parameters
Parameters
- value: Binary
An encrypted value
Returns Promise<T>
a Promise that either resolves with the decrypted value, or rejects with an error
-Example
// Decrypting value with async/await API
async function decryptMyValue(value) {
return clientEncryption.decrypt(value);
}
+Example
// Decrypting value with async/await API
async function decryptMyValue(value) {
return clientEncryption.decrypt(value);
}
-delete Key
- delete
Key(_id): Promise<DeleteResult> Deletes the key with the provided id from the keyvault, if it exists.
-Parameters
- _id: Binary
Returns Promise<DeleteResult>
delete Key
- delete
Key(_id): Promise<DeleteResult> Deletes the key with the provided id from the keyvault, if it exists.
+Parameters
- _id: Binary
Returns Promise<DeleteResult>
encrypt
- encrypt(value, options): Promise<Binary>
Explicitly encrypt a provided value. Note that either options.keyId
or options.keyAltName
must
+
encrypt
- encrypt(value, options): Promise<Binary>
Explicitly encrypt a provided value. Note that either options.keyId
or options.keyAltName
must
be specified. Specifying both options.keyId
and options.keyAltName
is considered an error.
Parameters
- value: unknown
The value that you wish to serialize. Must be of a type that can be serialized into BSON
- options: ClientEncryptionEncryptOptions
Returns Promise<Binary>
a Promise that either resolves with the encrypted value, or rejects with an error.
-Example
// Encryption with async/await api
async function encryptMyData(value) {
const keyId = await clientEncryption.createDataKey('local');
return clientEncryption.encrypt(value, { keyId, algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic' });
}
+Example
// Encryption with async/await api
async function encryptMyData(value) {
const keyId = await clientEncryption.createDataKey('local');
return clientEncryption.encrypt(value, { keyId, algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic' });
}
-Example
// Encryption using a keyAltName
async function encryptMyData(value) {
await clientEncryption.createDataKey('local', { keyAltNames: 'mySpecialKey' });
return clientEncryption.encrypt(value, { keyAltName: 'mySpecialKey', algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic' });
}
+Example
// Encryption using a keyAltName
async function encryptMyData(value) {
await clientEncryption.createDataKey('local', { keyAltNames: 'mySpecialKey' });
return clientEncryption.encrypt(value, { keyAltName: 'mySpecialKey', algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic' });
}
-
encrypt Expression
- encrypt
Expression(expression, options): Promise<Binary> Encrypts a Match Expression or Aggregate Expression to query a range index.
+
encrypt Expression
- encrypt
Expression(expression, options): Promise<Binary> Encrypts a Match Expression or Aggregate Expression to query a range index.
Only supported when queryType is "range" and algorithm is "Range".
Parameters
- expression: Document
a BSON document of one of the following forms:
@@ -79,41 +79,41 @@ Example
$gt
may also be $gte
. $lt
may also be $lte
.
- options: ClientEncryptionEncryptOptions
Returns Promise<Binary>
Returns a Promise that either resolves with the encrypted value or rejects with an error.
-
get Key
- get
Key(_id): Promise<null | DataKey> Finds a key in the keyvault with the specified _id.
+get Key
- get
Key(_id): Promise<null | DataKey> Finds a key in the keyvault with the specified _id.
Returns a promise that either resolves to a DataKey if a document matches the key or null if no documents
match the id. The promise rejects with an error if an error is thrown.
-Parameters
- _id: Binary
Returns Promise<null | DataKey>
Example
// getting a key by id
const id = new Binary(); // id is a bson binary subtype 4 object
const key = await clientEncryption.getKey(id);
if (!key) {
// key is null if there was no matching key
}
+
Parameters
- _id: Binary
Returns Promise<null | DataKey>
get Key By Alt Name
get Key By Alt Name
- get
Key By Alt Name(keyAltName): Promise<null | WithId<DataKey>> Finds a key in the keyvault which has the specified keyAltName.
Parameters
- keyAltName: string
a keyAltName to search for a key
Returns Promise<null | WithId<DataKey>>
Returns a promise that either resolves to a DataKey if a document matches the key or null if no documents
match the keyAltName. The promise rejects with an error if an error is thrown.
-Example
// get a key by alt name
const keyAltName = 'keyAltName';
const key = await clientEncryption.getKeyByAltName(keyAltName);
if (!key) {
// key is null if there is no matching key
}
+Example
// get a key by alt name
const keyAltName = 'keyAltName';
const key = await clientEncryption.getKeyByAltName(keyAltName);
if (!key) {
// key is null if there is no matching key
}
-get Keys
- get
Keys(): FindCursor<DataKey> Finds all the keys currently stored in the keyvault.
+
get Keys
- get
Keys(): FindCursor<DataKey> Finds all the keys currently stored in the keyvault.
This method will not throw.
Returns FindCursor<DataKey>
a FindCursor over all keys in the keyvault.
-Example
// fetching all keys
const keys = await clientEncryption.getKeys().toArray();
+remove Key Alt Name
remove Key Alt Name
- remove
Key Alt Name(_id, keyAltName): Promise<null | WithId<DataKey>> Adds a keyAltName to a key identified by the provided _id.
This method resolves to/returns the old key value (prior to removing the new altKeyName).
If the removed keyAltName is the last keyAltName for that key, the altKeyNames
property is unset from the document.
Parameters
- _id: Binary
The id of the document to update.
- keyAltName: string
a keyAltName to search for a key
Returns Promise<null | WithId<DataKey>>
Returns a promise that either resolves to a DataKey if a document matches the key or null if no documents
match the id. The promise rejects with an error if an error is thrown.
-Example
// removing a key alt name from a data key
const id = new Binary(); // id is a bson binary subtype 4 object
const keyAltName = 'keyAltName';
const oldKey = await clientEncryption.removeKeyAltName(id, keyAltName);
if (!oldKey) {
// null is returned if there is no matching document with an id matching the supplied id
}
+Example
// removing a key alt name from a data key
const id = new Binary(); // id is a bson binary subtype 4 object
const keyAltName = 'keyAltName';
const oldKey = await clientEncryption.removeKeyAltName(id, keyAltName);
if (!oldKey) {
// null is returned if there is no matching document with an id matching the supplied id
}
-rewrap Many Data Key
- rewrap
Many Data Key(filter, options): Promise<{
bulkWriteResult?: BulkWriteResult;
}> Searches the keyvault for any data keys matching the provided filter. If there are matches, rewrapManyDataKey then attempts to re-wrap the data keys using the provided options.
+
rewrap Many Data Key
- rewrap
Many Data Key(filter, options): Promise<{
bulkWriteResult?: BulkWriteResult;
}> Searches the keyvault for any data keys matching the provided filter. If there are matches, rewrapManyDataKey then attempts to re-wrap the data keys using the provided options.
If no matches are found, then no bulk write is performed.
-Parameters
- filter: Filter<DataKey>
- options: ClientEncryptionRewrapManyDataKeyProviderOptions
Returns Promise<{
bulkWriteResult?: BulkWriteResult;
}>
Example
// rewrapping all data data keys (using a filter that matches all documents)
const filter = {};
const result = await clientEncryption.rewrapManyDataKey(filter);
if (result.bulkWriteResult != null) {
// keys were re-wrapped, results will be available in the bulkWrite object.
}
+
Parameters
- filter: Filter<DataKey>
- options: ClientEncryptionRewrapManyDataKeyProviderOptions
Returns Promise<{
bulkWriteResult?: BulkWriteResult;
}>
Example
// rewrapping all data data keys (using a filter that matches all documents)
const filter = {};
const result = await clientEncryption.rewrapManyDataKey(filter);
if (result.bulkWriteResult != null) {
// keys were re-wrapped, results will be available in the bulkWrite object.
}
-Example
// attempting to rewrap all data keys with no matches
const filter = { _id: new Binary() } // assume _id matches no documents in the database
const result = await clientEncryption.rewrapManyDataKey(filter);
if (result.bulkWriteResult == null) {
// no keys matched, `bulkWriteResult` does not exist on the result object
}
+Example
// attempting to rewrap all data keys with no matches
const filter = { _id: new Binary() } // assume _id matches no documents in the database
const result = await clientEncryption.rewrapManyDataKey(filter);
if (result.bulkWriteResult == null) {
// no keys matched, `bulkWriteResult` does not exist on the result object
}
-
+
diff --git a/docs/Next/classes/ClientSession.html b/docs/Next/classes/ClientSession.html
index 245e7c3614d..c1609a133a9 100644
--- a/docs/Next/classes/ClientSession.html
+++ b/docs/Next/classes/ClientSession.html
@@ -75,7 +75,7 @@
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter
, the emitter.getMaxListeners()
and emitter.setMaxListeners()
methods can be used to
temporarily avoid this warning:
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings
command-line flag can be used to display the
@@ -108,7 +108,7 @@
Optional
timeoutMS?: number
Returns Promise<void>
emit
- emit<EventKey>(event, ...args): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Type Parameters
Parameters
- event: symbol | EventKey
Rest
...args: Parameters<ClientSessionEvents[EventKey]>
Returns boolean
Parameters
- session: ClientSession
The session to compare to
Returns boolean
event Names
- event
Names(): string[] Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbol
s.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns string[]
Type Parameters
Parameters
- type: string | symbol | EventKey
Returns number
listeners
- listeners<EventKey>(event): ClientSessionEvents[EventKey][]
Returns a copy of the array of listeners for the event named eventName
.
-server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns ClientSessionEvents[EventKey][]
Since
v0.1.26
@@ -154,7 +154,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: ClientSessionEvents[EventKey]
The callback function
@@ -169,7 +169,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -184,7 +184,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -197,7 +197,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: ClientSessionEvents[EventKey]
The callback function
@@ -210,7 +210,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -223,7 +223,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -284,7 +284,7 @@
Returns this
raw Listeners
- raw
Listeners<EventKey>(event): ClientSessionEvents[EventKey][] Returns a copy of the array of listeners for the event named eventName
,
including any wrappers (such as those created by .once()
).
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns ClientSessionEvents[EventKey][]
Since
v9.4.0
@@ -295,7 +295,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
Optional
event: string | symbol | EventKey
Returns this
remove Listener
- remove
Listener<EventKey>(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -305,7 +305,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -316,13 +316,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
- event: EventKey
- listener: ClientSessionEvents[EventKey]
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -332,7 +332,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -343,13 +343,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
- (eventName, listener): void
Parameters
- eventName: string | symbol
- listener: GenericListener
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -359,7 +359,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -370,7 +370,7 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
@@ -427,7 +427,7 @@ SeestopImmediatePropagation
does
not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
-import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
Parameters
- signal: AbortSignal
- resource: ((event: Event) => void)
- (event): void
Parameters
- event: Event
Returns void
Returns Disposable
Disposable that removes the abort
listener.
@@ -437,7 +437,7 @@ See
For EventTarget
s this is the only way to get the event listeners for the
event target. This is useful for debugging and diagnostic purposes.
-import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
- name: string | symbol
Returns Function[]
Since
v15.2.0, v14.17.0
@@ -447,19 +447,19 @@ SeeFor EventTarget
s this is the only way to get the max event listeners for the
event target. If the number of event handlers on a single EventTarget exceeds
the max set, the EventTarget will print a warning.
-import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
Returns number
Static
listener Count
- listener
Count(emitter, eventName): number A class method that returns the number of listeners for the given eventName
registered on the given emitter
.
-import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
Parameters
- emitter: EventEmitter<DefaultEventMap>
The emitter to query
- eventName: string | symbol
The event name
Returns number
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
Returns an AsyncIterator
that iterates eventName
events. It will throw
@@ -467,11 +467,11 @@
Deprecated
exiting the loop. The value
returned by each iteration is an array
composed of the emitted event arguments.
An AbortSignal
can be used to cancel waiting on events:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
Use the close
option to specify an array of event names that will end the iteration:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterIteratorOptions
Returns AsyncIterator<any[], any, any>
An AsyncIterator
that iterates eventName
events emitted by the emitter
@@ -482,21 +482,21 @@ Deprecated
given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error'
event
semantics and does not listen to the 'error'
event.
-import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
The special handling of the 'error'
event is only used when events.once()
is used to wait for another event. If events.once()
is used to wait for the
'error'
event itself, then it is treated as any other kind of event without
special handling:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
An AbortSignal
can be used to cancel waiting for the event:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
Parameters
Optional
n: numberA non-negative number. The maximum number of listeners per EventTarget
event.
diff --git a/docs/Next/classes/Collection.html b/docs/Next/classes/Collection.html
index 09d60682bb9..eed29d3a701 100644
--- a/docs/Next/classes/Collection.html
+++ b/docs/Next/classes/Collection.html
@@ -1,7 +1,7 @@
Collection | mongodb Class Collection<TSchema>
The Collection class is an internal class that embodies a MongoDB collection
allowing for insert/find/update/delete and other command operation on that MongoDB collection.
COLLECTION Cannot directly be instantiated
-Example
import { MongoClient } from 'mongodb';
interface Pet {
name: string;
kind: 'dog' | 'cat' | 'fish';
}
const client = new MongoClient('mongodb://localhost:27017');
const pets = client.db().collection<Pet>('pets');
const petCursor = pets.find();
for await (const pet of petCursor) {
console.log(`${pet.name} is a ${pet.kind}!`);
}
+
Example
import { MongoClient } from 'mongodb';
interface Pet {
name: string;
kind: 'dog' | 'cat' | 'fish';
}
const client = new MongoClient('mongodb://localhost:27017');
const pets = client.db().collection<Pet>('pets');
const petCursor = pets.find();
for await (const pet of petCursor) {
console.log(`${pet.name} is a ${pet.kind}!`);
}
Type Parameters
Index
Accessors
bson Options
@@ -125,7 +125,7 @@
create Index
- create
Index(indexSpec, options?): Promise<string> Creates an index on the db and collection collection.
Parameters
- indexSpec: IndexSpecification
The field name or index specification to create an index for
Optional
options: CreateIndexesOptionsOptional settings for the command
-
Returns Promise<string>
Example
const collection = client.db('foo').collection('bar');
await collection.createIndex({ a: 1, b: -1 });
// Alternate syntax for { c: 1, d: -1 } that ensures order of indexes
await collection.createIndex([ [c, 1], [d, -1] ]);
// Equivalent to { e: 1 }
await collection.createIndex('e');
// Equivalent to { f: 1, g: 1 }
await collection.createIndex(['f', 'g'])
// Equivalent to { h: 1, i: -1 }
await collection.createIndex([ { h: 1 }, { i: -1 } ]);
// Equivalent to { j: 1, k: -1, l: 2d }
await collection.createIndex(['j', ['k', -1], { l: '2d' }])
+
Returns Promise<string>
Example
const collection = client.db('foo').collection('bar');
await collection.createIndex({ a: 1, b: -1 });
// Alternate syntax for { c: 1, d: -1 } that ensures order of indexes
await collection.createIndex([ [c, 1], [d, -1] ]);
// Equivalent to { e: 1 }
await collection.createIndex('e');
// Equivalent to { f: 1, g: 1 }
await collection.createIndex(['f', 'g'])
// Equivalent to { h: 1, i: -1 }
await collection.createIndex([ { h: 1 }, { i: -1 } ]);
// Equivalent to { j: 1, k: -1, l: 2d }
await collection.createIndex(['j', ['k', -1], { l: '2d' }])
create Indexes
- create
Indexes(indexSpecs, options?): Promise<string[]> Creates multiple indexes in the collection, this method is only supported for
@@ -135,7 +135,7 @@
Index specifications are defined here.
Parameters
- indexSpecs: IndexDescription[]
An array of index specifications to be created
Optional
options: CreateIndexesOptionsOptional settings for the command
-
Returns Promise<string[]>
Returns Promise<string[]>
Example
const collection = client.db('foo').collection('bar');
await collection.createIndexes([
// Simple index on field fizz
{
key: { fizz: 1 },
}
// wildcard index
{
key: { '$**': 1 }
},
// named index on darmok and jalad
{
key: { darmok: 1, jalad: -1 }
name: 'tanagra'
}
]);
create Search Index
- create
Search Index(description): Promise<string> Creates a single search index for the collection.
@@ -284,19 +284,19 @@ Example
-collection
.watch<Schema, ChangeStreamInsertDocument<Schema> & { comment: string }>([
{ $addFields: { comment: 'big changes' } },
{ $match: { operationType: 'insert' } }
])
.on('change', change => {
change.comment.startsWith('big');
change.operationType === 'insert';
// No need to narrow in code because the generics did that for us!
expectType<Schema>(change.fullDocument);
});
+collection
.watch<Schema, ChangeStreamInsertDocument<Schema> & { comment: string }>([
{ $addFields: { comment: 'big changes' } },
{ $match: { operationType: 'insert' } }
])
.on('change', change => {
change.comment.startsWith('big');
change.operationType === 'insert';
// No need to narrow in code because the generics did that for us!
expectType<Schema>(change.fullDocument);
});
Example
In iterator mode, if a next() call throws a timeout error, it will attempt to resume the change stream.
The next call can just be retried after this succeeds.
-const changeStream = collection.watch([], { timeoutMS: 100 });
try {
await changeStream.next();
} catch (e) {
if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
await changeStream.next();
}
throw e;
}
+const changeStream = collection.watch([], { timeoutMS: 100 });
try {
await changeStream.next();
} catch (e) {
if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
await changeStream.next();
}
throw e;
}
Example
In emitter mode, if the change stream goes timeoutMS
without emitting a change event, it will
emit an error event that returns a MongoOperationTimeoutError, but will not close the change
stream unless the resume attempt fails. There is no need to re-establish change listeners as
this will automatically continue emitting change events once the resume attempt completes.
-const changeStream = collection.watch([], { timeoutMS: 100 });
changeStream.on('change', console.log);
changeStream.on('error', e => {
if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
// do nothing
} else {
changeStream.close();
}
});
+const changeStream = collection.watch([], { timeoutMS: 100 });
changeStream.on('change', console.log);
changeStream.on('error', e => {
if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
// do nothing
} else {
changeStream.close();
}
});
diff --git a/docs/Next/classes/Db.html b/docs/Next/classes/Db.html
index b347ab7c697..c9451c5c326 100644
--- a/docs/Next/classes/Db.html
+++ b/docs/Next/classes/Db.html
@@ -1,5 +1,5 @@
Db | mongodb Class Db
The Db class is a class that represents a MongoDB Database.
-Example
import { MongoClient } from 'mongodb';
interface Pet {
name: string;
kind: 'dog' | 'cat' | 'fish';
}
const client = new MongoClient('mongodb://localhost:27017');
const db = client.db();
// Create a collection that validates our union
await db.createCollection<Pet>('pets', {
validator: { $expr: { $in: ['$kind', ['dog', 'cat', 'fish']] } }
})
+
Example
import { MongoClient } from 'mongodb';
interface Pet {
name: string;
kind: 'dog' | 'cat' | 'fish';
}
const client = new MongoClient('mongodb://localhost:27017');
const db = client.db();
// Create a collection that validates our union
await db.createCollection<Pet>('pets', {
validator: { $expr: { $in: ['$kind', ['dog', 'cat', 'fish']] } }
})
Index
Constructors
constructor
@@ -133,14 +133,14 @@
Example
In iterator mode, if a next() call throws a timeout error, it will attempt to resume the change stream.
The next call can just be retried after this succeeds.
-const changeStream = collection.watch([], { timeoutMS: 100 });
try {
await changeStream.next();
} catch (e) {
if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
await changeStream.next();
}
throw e;
}
+const changeStream = collection.watch([], { timeoutMS: 100 });
try {
await changeStream.next();
} catch (e) {
if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
await changeStream.next();
}
throw e;
}
Example
In emitter mode, if the change stream goes timeoutMS
without emitting a change event, it will
emit an error event that returns a MongoOperationTimeoutError, but will not close the change
stream unless the resume attempt fails. There is no need to re-establish change listeners as
this will automatically continue emitting change events once the resume attempt completes.
-const changeStream = collection.watch([], { timeoutMS: 100 });
changeStream.on('change', console.log);
changeStream.on('error', e => {
if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
// do nothing
} else {
changeStream.close();
}
});
+const changeStream = collection.watch([], { timeoutMS: 100 });
changeStream.on('change', console.log);
changeStream.on('error', e => {
if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
// do nothing
} else {
changeStream.close();
}
});
diff --git a/docs/Next/classes/ExplainableCursor.html b/docs/Next/classes/ExplainableCursor.html
index 67406f35a2f..ee95e489c99 100644
--- a/docs/Next/classes/ExplainableCursor.html
+++ b/docs/Next/classes/ExplainableCursor.html
@@ -78,7 +78,7 @@
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter
, the emitter.getMaxListeners()
and emitter.setMaxListeners()
methods can be used to
temporarily avoid this warning:
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings
command-line flag can be used to display the
@@ -116,13 +116,13 @@
Parameters
Optional
options: {
timeoutMS?: number;
}Optional
timeoutMS?: number
Returns Promise<void>
emit
- emit<EventKey>(event, ...args): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Type Parameters
Parameters
- event: symbol | EventKey
Rest
...args: Parameters<AbstractCursorEvents[EventKey]>
Returns boolean
event Names
- event
Names(): string[] Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbol
s.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns string[]
Type Parameters
Parameters
- type: string | symbol | EventKey
Returns number
listeners
- listeners<EventKey>(event): AbstractCursorEvents[EventKey][]
Returns a copy of the array of listeners for the event named eventName
.
-server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns AbstractCursorEvents[EventKey][]
Returns AbstractCursor<T, AbstractCursorEvents>
Remarks
Note Cursors use null
internally to indicate that there are no more documents in the cursor. Providing a mapping
function that maps values to null
will result in the cursor closing itself before it has finished iterating
all documents. This will not result in a memory leak, just surprising behavior. For example:
-const cursor = collection.find({});
cursor.map(() => null);
const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.
+const cursor = collection.find({});
cursor.map(() => null);
const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.
Other falsey values are allowed:
-const cursor = collection.find({});
cursor.map(() => '');
const documents = await cursor.toArray();
// documents is now an array of empty strings
+const cursor = collection.find({});
cursor.map(() => '');
const documents = await cursor.toArray();
// documents is now an array of empty strings
Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor,
it does not return a new instance of a cursor. This means when calling map,
you should always assign the result to a new variable in order to get a correctly typed cursor variable.
Take note of the following example:
-Example
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
+Example
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
max TimeMS
- max
TimeMS(value): this Set a maxTimeMS on the cursor query, allowing for hard timeout limits on queries (Only supported on MongoDB 2.6 or higher)
@@ -185,7 +185,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: AbstractCursorEvents[EventKey]
The callback function
@@ -200,7 +200,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -215,7 +215,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -228,7 +228,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: AbstractCursorEvents[EventKey]
The callback function
@@ -241,7 +241,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -254,7 +254,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
Returns this
raw Listeners
- raw
Listeners<EventKey>(event): AbstractCursorEvents[EventKey][] Returns a copy of the array of listeners for the event named eventName
,
including any wrappers (such as those created by .once()
).
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns AbstractCursorEvents[EventKey][]
Since
v9.4.0
@@ -327,7 +327,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
Optional
event: string | symbol | EventKey
Returns this
remove Listener
- remove
Listener<EventKey>(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -337,7 +337,7 @@
ExampleOnce an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -348,13 +348,13 @@
ExampleWhen a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
- event: EventKey
- listener: AbstractCursorEvents[EventKey]
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -364,7 +364,7 @@
ExampleOnce an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -375,13 +375,13 @@
ExampleWhen a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
- (eventName, listener): void
Parameters
- eventName: string | symbol
- listener: GenericListener
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -391,7 +391,7 @@
ExampleOnce an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -402,7 +402,7 @@
ExampleWhen a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
@@ -434,7 +434,7 @@ ExamplestopImmediatePropagation
does
not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
-import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
Parameters
- signal: AbortSignal
- resource: ((event: Event) => void)
- (event): void
Parameters
- event: Event
Returns void
Returns Disposable
Disposable that removes the abort
listener.
@@ -444,7 +444,7 @@ Example
For EventTarget
s this is the only way to get the event listeners for the
event target. This is useful for debugging and diagnostic purposes.
-import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
- name: string | symbol
Returns Function[]
Since
v15.2.0, v14.17.0
@@ -454,19 +454,19 @@ ExampleFor EventTarget
s this is the only way to get the max event listeners for the
event target. If the number of event handlers on a single EventTarget exceeds
the max set, the EventTarget will print a warning.
-import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
Returns number
Static
listener Count
- listener
Count(emitter, eventName): number A class method that returns the number of listeners for the given eventName
registered on the given emitter
.
-import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
Parameters
- emitter: EventEmitter<DefaultEventMap>
The emitter to query
- eventName: string | symbol
The event name
Returns number
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
Returns an AsyncIterator
that iterates eventName
events. It will throw
@@ -474,11 +474,11 @@
Deprecat
exiting the loop. The value
returned by each iteration is an array
composed of the emitted event arguments.
An AbortSignal
can be used to cancel waiting on events:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
Use the close
option to specify an array of event names that will end the iteration:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterIteratorOptions
Returns AsyncIterator<any[], any, any>
An AsyncIterator
that iterates eventName
events emitted by the emitter
@@ -489,21 +489,21 @@ Deprecat
given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error'
event
semantics and does not listen to the 'error'
event.
-import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
The special handling of the 'error'
event is only used when events.once()
is used to wait for another event. If events.once()
is used to wait for the
'error'
event itself, then it is treated as any other kind of event without
special handling:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
An AbortSignal
can be used to cancel waiting for the event:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
Parameters
Optional
n: numberA non-negative number. The maximum number of listeners per EventTarget
event.
diff --git a/docs/Next/classes/FindCursor.html b/docs/Next/classes/FindCursor.html
index 70a0148231a..40c2df6efc4 100644
--- a/docs/Next/classes/FindCursor.html
+++ b/docs/Next/classes/FindCursor.html
@@ -93,7 +93,7 @@
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter
, the emitter.getMaxListeners()
and emitter.setMaxListeners()
methods can be used to
temporarily avoid this warning:
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings
command-line flag can be used to display the
@@ -142,13 +142,13 @@
emit
- emit<EventKey>(event, ...args): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Type Parameters
Parameters
- event: symbol | EventKey
Rest
...args: Parameters<AbstractCursorEvents[EventKey]>
Returns boolean
event Names
- event
Names(): string[] Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbol
s.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns string[]
Type Parameters
Parameters
- type: string | symbol | EventKey
Returns number
listeners
- listeners<EventKey>(event): AbstractCursorEvents[EventKey][]
Returns a copy of the array of listeners for the event named eventName
.
-server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns AbstractCursorEvents[EventKey][]
Returns FindCursor<T>
Remarks
Note Cursors use null
internally to indicate that there are no more documents in the cursor. Providing a mapping
function that maps values to null
will result in the cursor closing itself before it has finished iterating
all documents. This will not result in a memory leak, just surprising behavior. For example:
-const cursor = collection.find({});
cursor.map(() => null);
const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.
+const cursor = collection.find({});
cursor.map(() => null);
const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.
Other falsey values are allowed:
-const cursor = collection.find({});
cursor.map(() => '');
const documents = await cursor.toArray();
// documents is now an array of empty strings
+const cursor = collection.find({});
cursor.map(() => '');
const documents = await cursor.toArray();
// documents is now an array of empty strings
Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor,
it does not return a new instance of a cursor. This means when calling map,
you should always assign the result to a new variable in order to get a correctly typed cursor variable.
Take note of the following example:
-Example
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
+Example
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
max
- max(max): this
Set the cursor max
@@ -225,7 +225,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: AbstractCursorEvents[EventKey]
The callback function
@@ -240,7 +240,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -255,7 +255,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -268,7 +268,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: AbstractCursorEvents[EventKey]
The callback function
@@ -281,7 +281,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -294,7 +294,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -359,15 +359,15 @@ ExampleBy default chaining a projection to your cursor changes the returned type to the generic
Document type.
You should specify a parameterized type to have assertions on your final results.
-Example
// Best way
const docs: FindCursor<{ a: number }> = cursor.project<{ a: number }>({ _id: 0, a: true });
// Flexible way
const docs: FindCursor<Document> = cursor.project({ _id: 0, a: true });
+Example
// Best way
const docs: FindCursor<{ a: number }> = cursor.project<{ a: number }>({ _id: 0, a: true });
// Flexible way
const docs: FindCursor<Document> = cursor.project({ _id: 0, a: true });
-Example
const cursor: FindCursor<{ a: number; b: string }> = coll.find();
const projectCursor = cursor.project<{ a: number }>({ _id: 0, a: true });
const aPropOnlyArray: {a: number}[] = await projectCursor.toArray();
// or always use chaining and save the final cursor
const cursor = coll.find().project<{ a: string }>({
_id: 0,
a: { $convert: { input: '$a', to: 'string' }
}});
+Example
const cursor: FindCursor<{ a: number; b: string }> = coll.find();
const projectCursor = cursor.project<{ a: number }>({ _id: 0, a: true });
const aPropOnlyArray: {a: number}[] = await projectCursor.toArray();
// or always use chaining and save the final cursor
const cursor = coll.find().project<{ a: string }>({
_id: 0,
a: { $convert: { input: '$a', to: 'string' }
}});
raw Listeners
- raw
Listeners<EventKey>(event): AbstractCursorEvents[EventKey][] Returns a copy of the array of listeners for the event named eventName
,
including any wrappers (such as those created by .once()
).
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns AbstractCursorEvents[EventKey][]
Since
v9.4.0
@@ -379,7 +379,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
Optional
event: string | symbol | EventKey
Returns this
remove Listener
- remove
Listener<EventKey>(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -389,7 +389,7 @@
ExampleOnce an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -400,13 +400,13 @@
ExampleWhen a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
- event: EventKey
- listener: AbstractCursorEvents[EventKey]
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -416,7 +416,7 @@
ExampleOnce an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -427,13 +427,13 @@
ExampleWhen a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
- (eventName, listener): void
Parameters
- eventName: string | symbol
- listener: GenericListener
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -443,7 +443,7 @@
ExampleOnce an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -454,7 +454,7 @@
ExampleWhen a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
@@ -497,7 +497,7 @@ ExamplestopImmediatePropagation
does
not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
-import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
Parameters
- signal: AbortSignal
- resource: ((event: Event) => void)
- (event): void
Parameters
- event: Event
Returns void
Returns Disposable
Disposable that removes the abort
listener.
@@ -507,7 +507,7 @@ Example
For EventTarget
s this is the only way to get the event listeners for the
event target. This is useful for debugging and diagnostic purposes.
-import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
- name: string | symbol
Returns Function[]
Since
v15.2.0, v14.17.0
@@ -517,19 +517,19 @@ ExampleFor EventTarget
s this is the only way to get the max event listeners for the
event target. If the number of event handlers on a single EventTarget exceeds
the max set, the EventTarget will print a warning.
-import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
Returns number
Static
listener Count
- listener
Count(emitter, eventName): number A class method that returns the number of listeners for the given eventName
registered on the given emitter
.
-import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
Parameters
- emitter: EventEmitter<DefaultEventMap>
The emitter to query
- eventName: string | symbol
The event name
Returns number
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
Returns an AsyncIterator
that iterates eventName
events. It will throw
@@ -537,11 +537,11 @@
Deprecat
exiting the loop. The value
returned by each iteration is an array
composed of the emitted event arguments.
An AbortSignal
can be used to cancel waiting on events:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
Use the close
option to specify an array of event names that will end the iteration:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterIteratorOptions
Returns AsyncIterator<any[], any, any>
An AsyncIterator
that iterates eventName
events emitted by the emitter
@@ -552,21 +552,21 @@ Deprecat
given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error'
event
semantics and does not listen to the 'error'
event.
-import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
The special handling of the 'error'
event is only used when events.once()
is used to wait for another event. If events.once()
is used to wait for the
'error'
event itself, then it is treated as any other kind of event without
special handling:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
An AbortSignal
can be used to cancel waiting for the event:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
Parameters
Optional
n: numberA non-negative number. The maximum number of listeners per EventTarget
event.
diff --git a/docs/Next/classes/GridFSBucket.html b/docs/Next/classes/GridFSBucket.html
index 1a4b5d6b59c..02a74af7cf8 100644
--- a/docs/Next/classes/GridFSBucket.html
+++ b/docs/Next/classes/GridFSBucket.html
@@ -56,7 +56,7 @@
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter
, the emitter.getMaxListeners()
and emitter.setMaxListeners()
methods can be used to
temporarily avoid this warning:
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings
command-line flag can be used to display the
@@ -88,13 +88,13 @@
Parameters
Optional
options: {
timeoutMS: number;
}timeoutMS: number
Returns Promise<void>
emit
- emit<EventKey>(event, ...args): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Type Parameters
Parameters
- event: symbol | EventKey
Rest
...args: Parameters<GridFSBucketEvents[EventKey]>
Returns boolean
event Names
- event
Names(): string[] Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbol
s.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns string[]
Type Parameters
Parameters
- type: string | symbol | EventKey
Returns number
listeners
- listeners<EventKey>(event): GridFSBucketEvents[EventKey][]
Returns a copy of the array of listeners for the event named eventName
.
-server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns GridFSBucketEvents[EventKey][]
Since
v0.1.26
@@ -127,7 +127,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: GridFSBucketEvents[EventKey]
The callback function
@@ -142,7 +142,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -157,7 +157,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -170,7 +170,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: GridFSBucketEvents[EventKey]
The callback function
@@ -183,7 +183,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -196,7 +196,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -271,7 +271,7 @@
Returns this
raw Listeners
- raw
Listeners<EventKey>(event): GridFSBucketEvents[EventKey][] Returns a copy of the array of listeners for the event named eventName
,
including any wrappers (such as those created by .once()
).
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns GridFSBucketEvents[EventKey][]
Since
v9.4.0
@@ -282,7 +282,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
Optional
event: string | symbol | EventKey
Returns this
remove Listener
- remove
Listener<EventKey>(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -292,7 +292,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -303,13 +303,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Type Parameters
Parameters
- event: EventKey
- listener: GridFSBucketEvents[EventKey]
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -319,7 +319,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -330,13 +330,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
- (eventName, listener): void
Parameters
- eventName: string | symbol
- listener: GenericListener
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -346,7 +346,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -357,7 +357,7 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
@@ -381,7 +381,7 @@
two issues by listening to the event such that stopImmediatePropagation
does
not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
-import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
Parameters
- signal: AbortSignal
- resource: ((event: Event) => void)
- (event): void
Parameters
- event: Event
Returns void
Returns Disposable
Disposable that removes the abort
listener.
@@ -391,7 +391,7 @@
the emitter.
For EventTarget
s this is the only way to get the event listeners for the
event target. This is useful for debugging and diagnostic purposes.
-import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
- name: string | symbol
Returns Function[]
Since
v15.2.0, v14.17.0
@@ -401,19 +401,19 @@
For EventTarget
s this is the only way to get the max event listeners for the
event target. If the number of event handlers on a single EventTarget exceeds
the max set, the EventTarget will print a warning.
-import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
Returns number
Static
listener Count
- listener
Count(emitter, eventName): number A class method that returns the number of listeners for the given eventName
registered on the given emitter
.
-import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
Parameters
- emitter: EventEmitter<DefaultEventMap>
The emitter to query
- eventName: string | symbol
The event name
Returns number
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
Returns an AsyncIterator
that iterates eventName
events. It will throw
@@ -421,11 +421,11 @@
Deprecated
exiting the loop. The value
returned by each iteration is an array
composed of the emitted event arguments.
An AbortSignal
can be used to cancel waiting on events:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
Use the close
option to specify an array of event names that will end the iteration:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterIteratorOptions
Returns AsyncIterator<any[], any, any>
An AsyncIterator
that iterates eventName
events emitted by the emitter
@@ -436,21 +436,21 @@ Deprecated
given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error'
event
semantics and does not listen to the 'error'
event.
-import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
The special handling of the 'error'
event is only used when events.once()
is used to wait for another event. If events.once()
is used to wait for the
'error'
event itself, then it is treated as any other kind of event without
special handling:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
An AbortSignal
can be used to cancel waiting for the event:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
Parameters
Optional
n: numberA non-negative number. The maximum number of listeners per EventTarget
event.
diff --git a/docs/Next/classes/GridFSBucketReadStream.html b/docs/Next/classes/GridFSBucketReadStream.html
index d99ae08305b..66080a66623 100644
--- a/docs/Next/classes/GridFSBucketReadStream.html
+++ b/docs/Next/classes/GridFSBucketReadStream.html
@@ -124,7 +124,7 @@
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter
, the emitter.getMaxListeners()
and emitter.setMaxListeners()
methods can be used to
temporarily avoid this warning:
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings
command-line flag can be used to display the
@@ -188,56 +188,56 @@
emit
- emit(event): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "close"
Returns boolean
- emit(event, chunk): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "data"
- chunk: any
Returns boolean
- emit(event): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "end"
Returns boolean
- emit(event, err): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "error"
- err: Error
Returns boolean
- emit(event): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "pause"
Returns boolean
- emit(event): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "readable"
Returns boolean
- emit(event): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "resume"
Returns boolean
- emit(event, ...args): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: string | symbol
Rest
...args: any[]
Returns boolean
Parameters
- end: number = 0
Offset in bytes to stop reading at
Returns this
event Names
- event
Names(): (string | symbol)[] Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbol
s.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns (string | symbol)[]
is Paused
- is
Paused(): boolean The readable.isPaused()
method returns the current operating state of the Readable
.
This is used primarily by the mechanism that underlies the readable.pipe()
method.
In most typical cases, there will be no reason to use this method directly.
-const readable = new stream.Readable();
readable.isPaused(); // === false
readable.pause();
readable.isPaused(); // === true
readable.resume();
readable.isPaused(); // === false
+const readable = new stream.Readable();
readable.isPaused(); // === false
readable.pause();
readable.isPaused(); // === true
readable.resume();
readable.isPaused(); // === false
Returns boolean
Optional
listener: FunctionThe event handler function
Returns number
listeners
- listeners<K>(eventName): Function[]
Returns a copy of the array of listeners for the event named eventName
.
-server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
Parameters
- eventName: string | symbol
Returns Function[]
Since
v0.1.26
@@ -335,7 +335,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "close"
- listener: (() => void)
The callback function
@@ -350,7 +350,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "data"
- listener: ((chunk: any) => void)
The callback function
@@ -365,7 +365,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "end"
- listener: (() => void)
The callback function
@@ -380,7 +380,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "error"
- listener: ((err: Error) => void)
The callback function
@@ -395,7 +395,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "pause"
- listener: (() => void)
The callback function
@@ -410,7 +410,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "readable"
- listener: (() => void)
The callback function
@@ -425,7 +425,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "resume"
- listener: (() => void)
The callback function
@@ -440,7 +440,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: ((...args: any[]) => void)
The callback function
@@ -453,7 +453,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "close"
- listener: (() => void)
The callback function
@@ -466,7 +466,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "data"
- listener: ((chunk: any) => void)
The callback function
@@ -479,7 +479,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "end"
- listener: (() => void)
The callback function
@@ -492,7 +492,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "error"
- listener: ((err: Error) => void)
The callback function
@@ -505,7 +505,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "pause"
- listener: (() => void)
The callback function
@@ -518,7 +518,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "readable"
- listener: (() => void)
The callback function
@@ -531,7 +531,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "resume"
- listener: (() => void)
The callback function
@@ -544,7 +544,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: ((...args: any[]) => void)
The callback function
@@ -552,7 +552,7 @@
pause
- pause(): this
The readable.pause()
method will cause a stream in flowing mode to stop
emitting 'data'
events, switching out of flowing mode. Any data that
becomes available will remain in the internal buffer.
-const readable = getReadableStreamSomehow();
readable.on('data', (chunk) => {
console.log(`Received ${chunk.length} bytes of data.`);
readable.pause();
console.log('There will be no additional data for 1 second.');
setTimeout(() => {
console.log('Now data will start flowing again.');
readable.resume();
}, 1000);
});
+const readable = getReadableStreamSomehow();
readable.on('data', (chunk) => {
console.log(`Received ${chunk.length} bytes of data.`);
readable.pause();
console.log('There will be no additional data for 1 second.');
setTimeout(() => {
console.log('Now data will start flowing again.');
readable.resume();
}, 1000);
});
The readable.pause()
method has no effect if there is a 'readable'
event listener.
@@ -703,7 +703,7 @@
- (...args): void
Parameters
Rest
...args: any[]
Returns void
Returns this
push
raw Listeners
- raw
Listeners<K>(eventName): Function[] Returns a copy of the array of listeners for the event named eventName
,
including any wrappers (such as those created by .once()
).
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
Type Parameters
Parameters
- eventName: string | symbol
Returns Function[]
Since
v9.4.0
@@ -722,7 +722,7 @@
The readable.read()
method should only be called on Readable
streams
operating in paused mode. In flowing mode, readable.read()
is called
automatically until the internal buffer is fully drained.
-const readable = getReadableStreamSomehow();
// 'readable' may be triggered multiple times as data is buffered in
readable.on('readable', () => {
let chunk;
console.log('Stream is readable (new data received in buffer)');
// Use a loop to make sure we read all currently available data
while (null !== (chunk = readable.read())) {
console.log(`Read ${chunk.length} bytes of data...`);
}
});
// 'end' will be triggered once when there is no more data available
readable.on('end', () => {
console.log('Reached end of stream.');
});
+const readable = getReadableStreamSomehow();
// 'readable' may be triggered multiple times as data is buffered in
readable.on('readable', () => {
let chunk;
console.log('Stream is readable (new data received in buffer)');
// Use a loop to make sure we read all currently available data
while (null !== (chunk = readable.read())) {
console.log(`Read ${chunk.length} bytes of data...`);
}
});
// 'end' will be triggered once when there is no more data available
readable.on('end', () => {
console.log('Reached end of stream.');
});
Each call to readable.read()
returns a chunk of data, or null
. The chunks
@@ -734,7 +734,7 @@
emitted when there is no more data to come.
Therefore to read a file's whole contents from a readable
, it is necessary
to collect chunks across multiple 'readable'
events:
-const chunks = [];
readable.on('readable', () => {
let chunk;
while (null !== (chunk = readable.read())) {
chunks.push(chunk);
}
});
readable.on('end', () => {
const content = chunks.join('');
});
+const chunks = [];
readable.on('readable', () => {
let chunk;
while (null !== (chunk = readable.read())) {
chunks.push(chunk);
}
});
readable.on('end', () => {
const content = chunks.join('');
});
A Readable
stream in object mode will always return a single item from
@@ -762,7 +762,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
Optional
eventName: string | symbol
Returns this
remove Listener
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -772,7 +772,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -783,13 +783,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "close"
- listener: (() => void)
- (): void
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -799,7 +799,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -810,13 +810,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "data"
- listener: ((chunk: any) => void)
- (chunk): void
Parameters
- chunk: any
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -826,7 +826,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -837,13 +837,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "end"
- listener: (() => void)
- (): void
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -853,7 +853,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -864,13 +864,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "error"
- listener: ((err: Error) => void)
- (err): void
Parameters
- err: Error
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -880,7 +880,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -891,13 +891,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "pause"
- listener: (() => void)
- (): void
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -907,7 +907,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -918,13 +918,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "readable"
- listener: (() => void)
- (): void
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -934,7 +934,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -945,13 +945,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "resume"
- listener: (() => void)
- (): void
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -961,7 +961,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -972,7 +972,7 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
@@ -995,7 +995,7 @@
The Readable
stream will properly handle multi-byte characters delivered
through the stream that would otherwise become improperly decoded if simply
pulled from the stream as Buffer
objects.
-const readable = getReadableStreamSomehow();
readable.setEncoding('utf8');
readable.on('data', (chunk) => {
assert.equal(typeof chunk, 'string');
console.log('Got %d characters of string data:', chunk.length);
});
+const readable = getReadableStreamSomehow();
readable.setEncoding('utf8');
readable.on('data', (chunk) => {
assert.equal(typeof chunk, 'string');
console.log('Got %d characters of string data:', chunk.length);
});
Parameters
- encoding: BufferEncoding
The encoding to use.
@@ -1031,7 +1031,7 @@
If the destination
is not specified, then all pipes are detached.
If the destination
is specified, but no pipe is set up for it, then
the method does nothing.
-import fs from 'node:fs';
const readable = getReadableStreamSomehow();
const writable = fs.createWriteStream('file.txt');
// All the data from readable goes into 'file.txt',
// but only for the first second.
readable.pipe(writable);
setTimeout(() => {
console.log('Stop writing to file.txt.');
readable.unpipe(writable);
console.log('Manually close the file stream.');
writable.end();
}, 1000);
+import fs from 'node:fs';
const readable = getReadableStreamSomehow();
const writable = fs.createWriteStream('file.txt');
// All the data from readable goes into 'file.txt',
// but only for the first second.
readable.pipe(writable);
setTimeout(() => {
console.log('Stop writing to file.txt.');
readable.unpipe(writable);
console.log('Manually close the file stream.');
writable.end();
}, 1000);
Parameters
Optional
destination: WritableStreamOptional specific stream to unpipe
@@ -1048,7 +1048,7 @@
has been emitted or a runtime error will be thrown.
Developers using stream.unshift()
often should consider switching to
use of a Transform
stream instead. See the API for stream implementers
section for more information.
-// Pull off a header delimited by \n\n.
// Use unshift() if we get too much.
// Call the callback with (error, header, stream).
import { StringDecoder } from 'node:string_decoder';
function parseHeader(stream, callback) {
stream.on('error', callback);
stream.on('readable', onReadable);
const decoder = new StringDecoder('utf8');
let header = '';
function onReadable() {
let chunk;
while (null !== (chunk = stream.read())) {
const str = decoder.write(chunk);
if (str.includes('\n\n')) {
// Found the header boundary.
const split = str.split(/\n\n/);
header += split.shift();
const remaining = split.join('\n\n');
const buf = Buffer.from(remaining, 'utf8');
stream.removeListener('error', callback);
// Remove the 'readable' listener before unshifting.
stream.removeListener('readable', onReadable);
if (buf.length)
stream.unshift(buf);
// Now the body of the message can be read from the stream.
callback(null, header, stream);
return;
}
// Still reading the header.
header += str;
}
}
}
+// Pull off a header delimited by \n\n.
// Use unshift() if we get too much.
// Call the callback with (error, header, stream).
import { StringDecoder } from 'node:string_decoder';
function parseHeader(stream, callback) {
stream.on('error', callback);
stream.on('readable', onReadable);
const decoder = new StringDecoder('utf8');
let header = '';
function onReadable() {
let chunk;
while (null !== (chunk = stream.read())) {
const str = decoder.write(chunk);
if (str.includes('\n\n')) {
// Found the header boundary.
const split = str.split(/\n\n/);
header += split.shift();
const remaining = split.join('\n\n');
const buf = Buffer.from(remaining, 'utf8');
stream.removeListener('error', callback);
// Remove the 'readable' listener before unshifting.
stream.removeListener('readable', onReadable);
if (buf.length)
stream.unshift(buf);
// Now the body of the message can be read from the stream.
callback(null, header, stream);
return;
}
// Still reading the header.
header += str;
}
}
}
Unlike push, stream.unshift(chunk)
will not
@@ -1070,7 +1070,7 @@
It will rarely be necessary to use readable.wrap()
but the method has been
provided as a convenience for interacting with older Node.js applications and
libraries.
-import { OldReader } from './old-api-module.js';
import { Readable } from 'node:stream';
const oreader = new OldReader();
const myReader = new Readable().wrap(oreader);
myReader.on('readable', () => {
myReader.read(); // etc.
});
+import { OldReader } from './old-api-module.js';
import { Readable } from 'node:stream';
const oreader = new OldReader();
const myReader = new Readable().wrap(oreader);
myReader.on('readable', () => {
myReader.read(); // etc.
});
Parameters
- stream: ReadableStream
An "old style" readable stream
@@ -1085,7 +1085,7 @@
two issues by listening to the event such that stopImmediatePropagation
does
not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
-import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
Parameters
- signal: AbortSignal
- resource: ((event: Event) => void)
- (event): void
Parameters
- event: Event
Returns void
Returns Disposable
Disposable that removes the abort
listener.
@@ -1101,7 +1101,7 @@
the emitter.
For EventTarget
s this is the only way to get the event listeners for the
event target. This is useful for debugging and diagnostic purposes.
-import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
- name: string | symbol
Returns Function[]
Since
v15.2.0, v14.17.0
@@ -1111,21 +1111,21 @@
For EventTarget
s this is the only way to get the max event listeners for the
event target. If the number of event handlers on a single EventTarget exceeds
the max set, the EventTarget will print a warning.
-import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
Returns number
Static
is Disturbed
Static
listener Count
- listener
Count(emitter, eventName): number A class method that returns the number of listeners for the given eventName
registered on the given emitter
.
-import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
Parameters
- emitter: EventEmitter<DefaultEventMap>
The emitter to query
- eventName: string | symbol
The event name
Returns number
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
Returns an AsyncIterator
that iterates eventName
events. It will throw
@@ -1133,11 +1133,11 @@
Deprecated
exiting the loop. The value
returned by each iteration is an array
composed of the emitted event arguments.
An AbortSignal
can be used to cancel waiting on events:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
Use the close
option to specify an array of event names that will end the iteration:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterIteratorOptions
Returns AsyncIterator<any[], any, any>
An AsyncIterator
that iterates eventName
events emitted by the emitter
@@ -1148,21 +1148,21 @@ Deprecated
given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error'
event
semantics and does not listen to the 'error'
event.
-import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
The special handling of the 'error'
event is only used when events.once()
is used to wait for another event. If events.once()
is used to wait for the
'error'
event itself, then it is treated as any other kind of event without
special handling:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
An AbortSignal
can be used to cancel waiting for the event:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
Parameters
Optional
n: numberA non-negative number. The maximum number of listeners per EventTarget
event.
diff --git a/docs/Next/classes/GridFSBucketWriteStream.html b/docs/Next/classes/GridFSBucketWriteStream.html
index e2d37a70722..296cf071007 100644
--- a/docs/Next/classes/GridFSBucketWriteStream.html
+++ b/docs/Next/classes/GridFSBucketWriteStream.html
@@ -136,7 +136,7 @@
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter
, the emitter.getMaxListeners()
and emitter.setMaxListeners()
methods can be used to
temporarily avoid this warning:
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings
command-line flag can be used to display the
@@ -200,49 +200,49 @@
emit
- emit(event): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "close"
Returns boolean
- emit(event): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "drain"
Returns boolean
- emit(event, err): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "error"
- err: Error
Returns boolean
- emit(event): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "finish"
Returns boolean
- emit(event, src): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "pipe"
- src: Readable
Returns boolean
- emit(event, src): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: "unpipe"
- src: Readable
Returns boolean
- emit(event, ...args): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Parameters
- event: string | symbol
Rest
...args: any[]
Returns boolean
Since
v0.1.26
@@ -251,13 +251,13 @@
final additional chunk of data to be written immediately before closing the
stream.
Calling the write method after calling end will raise an error.
-// Write 'hello, ' and then end with 'world!'.
import fs from 'node:fs';
const file = fs.createWriteStream('example.txt');
file.write('hello, ');
file.end('world!');
// Writing more now is not allowed!
+// Write 'hello, ' and then end with 'world!'.
import fs from 'node:fs';
const file = fs.createWriteStream('example.txt');
file.write('hello, ');
file.end('world!');
// Writing more now is not allowed!
Parameters
Optional
cb: (() => void)- (): void
Returns void
Returns this
- end(chunk, cb?): this
Parameters
- chunk: any
Optional
cb: (() => void)- (): void
Returns void
Returns this
- end(chunk, encoding, cb?): this
Parameters
- chunk: any
- encoding: BufferEncoding
Optional
cb: (() => void)- (): void
Returns void
Returns this
event Names
- event
Names(): (string | symbol)[] Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbol
s.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns (string | symbol)[]
Optional
listener: FunctionThe event handler function
Returns number
listeners
- listeners<K>(eventName): Function[]
Returns a copy of the array of listeners for the event named eventName
.
-server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
Parameters
- eventName: string | symbol
Returns Function[]
Since
v0.1.26
@@ -287,7 +287,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "close"
- listener: (() => void)
The callback function
@@ -302,7 +302,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "drain"
- listener: (() => void)
The callback function
@@ -317,7 +317,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "error"
- listener: ((err: Error) => void)
The callback function
@@ -332,7 +332,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "finish"
- listener: (() => void)
The callback function
@@ -347,7 +347,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "pipe"
- listener: ((src: Readable) => void)
The callback function
@@ -362,7 +362,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "unpipe"
- listener: ((src: Readable) => void)
The callback function
@@ -377,7 +377,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: ((...args: any[]) => void)
The callback function
@@ -390,7 +390,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "close"
- listener: (() => void)
The callback function
@@ -403,7 +403,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "drain"
- listener: (() => void)
The callback function
@@ -416,7 +416,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "error"
- listener: ((err: Error) => void)
The callback function
@@ -429,7 +429,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "finish"
- listener: (() => void)
The callback function
@@ -442,7 +442,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "pipe"
- listener: ((src: Readable) => void)
The callback function
@@ -455,7 +455,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: "unpipe"
- listener: ((src: Readable) => void)
The callback function
@@ -468,7 +468,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: ((...args: any[]) => void)
The callback function
@@ -601,7 +601,7 @@
- (...args): void
Parameters
Rest
...args: any[]
Returns void
Returns this
raw Listeners
- raw
Listeners<K>(eventName): Function[] Returns a copy of the array of listeners for the event named eventName
,
including any wrappers (such as those created by .once()
).
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
Type Parameters
Parameters
- eventName: string | symbol
Returns Function[]
Since
v9.4.0
@@ -612,7 +612,7 @@
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
Optional
eventName: string | symbol
Returns this
remove Listener
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -622,7 +622,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -633,13 +633,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "close"
- listener: (() => void)
- (): void
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -649,7 +649,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -660,13 +660,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "drain"
- listener: (() => void)
- (): void
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -676,7 +676,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -687,13 +687,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "error"
- listener: ((err: Error) => void)
- (err): void
Parameters
- err: Error
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -703,7 +703,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -714,13 +714,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "finish"
- listener: (() => void)
- (): void
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -730,7 +730,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -741,13 +741,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "pipe"
- listener: ((src: Readable) => void)
- (src): void
Parameters
- src: Readable
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -757,7 +757,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -768,13 +768,13 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
Parameters
- event: "unpipe"
- listener: ((src: Readable) => void)
- (src): void
Parameters
- src: Readable
Returns void
Returns this
- remove
Listener(event, listener): this Removes the specified listener
from the listener array for the event named eventName
.
-const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
removeListener()
will remove, at most, one instance of a listener from the
@@ -784,7 +784,7 @@
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any removeListener()
or removeAllListeners()
calls after emitting and before the last listener finishes execution
will not remove them fromemit()
in progress. Subsequent events behave as expected.
-import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
Because listeners are managed using an internal array, calling this will
@@ -795,7 +795,7 @@
When a single function has been added as a handler multiple times for a single
event (as in the example below), removeListener()
will remove the most
recently added instance. In the example the once('ping')
listener is removed:
-import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
Returns a reference to the EventEmitter
, so that calls can be chained.
@@ -819,7 +819,7 @@
If the writable.cork()
method is called multiple times on a stream, the
same number of calls to writable.uncork()
must be called to flush the buffered
data.
-stream.cork();
stream.write('some ');
stream.cork();
stream.write('data ');
process.nextTick(() => {
stream.uncork();
// The data will not be flushed until uncork() is called a second time.
stream.uncork();
});
+stream.cork();
stream.write('some ');
stream.cork();
stream.write('data ');
process.nextTick(() => {
stream.uncork();
// The data will not be flushed until uncork() is called a second time.
stream.uncork();
});
See also: writable.cork()
.
@@ -851,7 +851,7 @@
If the data to be written can be generated or fetched on demand, it is
recommended to encapsulate the logic into a Readable
and use pipe. However, if calling write()
is preferred, it is
possible to respect backpressure and avoid memory issues using the 'drain'
event:
-function write(data, cb) {
if (!stream.write(data)) {
stream.once('drain', cb);
} else {
process.nextTick(cb);
}
}
// Wait for cb to be called before doing any other write.
write('hello', () => {
console.log('Write completed, do more writes now.');
});
+function write(data, cb) {
if (!stream.write(data)) {
stream.once('drain', cb);
} else {
process.nextTick(cb);
}
}
// Wait for cb to be called before doing any other write.
write('hello', () => {
console.log('Write completed, do more writes now.');
});
A Writable
stream in object mode will always ignore the encoding
argument.
@@ -870,7 +870,7 @@
two issues by listening to the event such that stopImmediatePropagation
does
not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
-import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
Parameters
- signal: AbortSignal
- resource: ((event: Event) => void)
- (event): void
Parameters
- event: Event
Returns void
Returns Disposable
Disposable that removes the abort
listener.
@@ -882,7 +882,7 @@
the emitter.
For EventTarget
s this is the only way to get the event listeners for the
event target. This is useful for debugging and diagnostic purposes.
-import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
- name: string | symbol
Returns Function[]
Since
v15.2.0, v14.17.0
@@ -892,19 +892,19 @@
For EventTarget
s this is the only way to get the max event listeners for the
event target. If the number of event handlers on a single EventTarget exceeds
the max set, the EventTarget will print a warning.
-import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
Parameters
- emitter: EventEmitter<DefaultEventMap> | EventTarget
Returns number
Static
listener Count
- listener
Count(emitter, eventName): number A class method that returns the number of listeners for the given eventName
registered on the given emitter
.
-import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
Parameters
- emitter: EventEmitter<DefaultEventMap>
The emitter to query
- eventName: string | symbol
The event name
Returns number
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
Static
on
- on(emitter, eventName, options?): AsyncIterator<any[], any, any>
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
Returns an AsyncIterator
that iterates eventName
events. It will throw
@@ -912,11 +912,11 @@
Deprecated
exiting the loop. The value
returned by each iteration is an array
composed of the emitted event arguments.
An AbortSignal
can be used to cancel waiting on events:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
Use the close
option to specify an array of event names that will end the iteration:
-import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterIteratorOptions
Returns AsyncIterator<any[], any, any>
An AsyncIterator
that iterates eventName
events emitted by the emitter
@@ -927,21 +927,21 @@ Deprecated
given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error'
event
semantics and does not listen to the 'error'
event.
-import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
The special handling of the 'error'
event is only used when events.once()
is used to wait for another event. If events.once()
is used to wait for the
'error'
event itself, then it is treated as any other kind of event without
special handling:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
An AbortSignal
can be used to cancel waiting for the event:
-import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
Parameters
- emitter: EventEmitter<DefaultEventMap>
- eventName: string | symbol
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
- once(emitter, eventName, options?): Promise<any[]>
Parameters
- emitter: EventTarget
- eventName: string
Optional
options: StaticEventEmitterOptions
Returns Promise<any[]>
Static
set Max Listeners
- set
Max Listeners(n?, ...eventTargets): void import { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
Parameters
Optional
n: numberA non-negative number. The maximum number of listeners per EventTarget
event.
diff --git a/docs/Next/classes/ListCollectionsCursor.html b/docs/Next/classes/ListCollectionsCursor.html
index bcedf716e55..b8c12bda081 100644
--- a/docs/Next/classes/ListCollectionsCursor.html
+++ b/docs/Next/classes/ListCollectionsCursor.html
@@ -79,7 +79,7 @@
that a "possible EventEmitter memory leak" has been detected. For any single
EventEmitter
, the emitter.getMaxListeners()
and emitter.setMaxListeners()
methods can be used to
temporarily avoid this warning:
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
The --trace-warnings
command-line flag can be used to display the
@@ -117,13 +117,13 @@
Parameters
Optional
options: {
timeoutMS?: number;
}Optional
timeoutMS?: number
Returns Promise<void>
emit
- emit<EventKey>(event, ...args): boolean
Synchronously calls each of the listeners registered for the event named eventName
, in the order they were registered, passing the supplied arguments
to each.
Returns true
if the event had listeners, false
otherwise.
-import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
Type Parameters
Parameters
- event: symbol | EventKey
Rest
...args: Parameters<AbstractCursorEvents[EventKey]>
Returns boolean
event Names
- event
Names(): string[] Returns an array listing the events for which the emitter has registered
listeners. The values in the array are strings or Symbol
s.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
Returns string[]
Type Parameters
Parameters
- type: string | symbol | EventKey
Returns number
listeners
- listeners<EventKey>(event): AbstractCursorEvents[EventKey][]
Returns a copy of the array of listeners for the event named eventName
.
-server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
Type Parameters
Parameters
- event: string | symbol | EventKey
Returns AbstractCursorEvents[EventKey][]
Returns AbstractCursor<T, AbstractCursorEvents>
Remarks
Note Cursors use null
internally to indicate that there are no more documents in the cursor. Providing a mapping
function that maps values to null
will result in the cursor closing itself before it has finished iterating
all documents. This will not result in a memory leak, just surprising behavior. For example:
-const cursor = collection.find({});
cursor.map(() => null);
const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.
+const cursor = collection.find({});
cursor.map(() => null);
const documents = await cursor.toArray();
// documents is always [], regardless of how many documents are in the collection.
Other falsey values are allowed:
-const cursor = collection.find({});
cursor.map(() => '');
const documents = await cursor.toArray();
// documents is now an array of empty strings
+const cursor = collection.find({});
cursor.map(() => '');
const documents = await cursor.toArray();
// documents is now an array of empty strings
Note for Typescript Users: adding a transform changes the return type of the iteration of this cursor,
it does not return a new instance of a cursor. This means when calling map,
you should always assign the result to a new variable in order to get a correctly typed cursor variable.
Take note of the following example:
-Example
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
+Example
const cursor: FindCursor<Document> = coll.find();
const mappedCursor: FindCursor<number> = cursor.map(doc => Object.keys(doc).length);
const keyCounts: number[] = await mappedCursor.toArray(); // cursor.toArray() still returns Document[]
max TimeMS
- max
TimeMS(value): this Set a maxTimeMS on the cursor query, allowing for hard timeout limits on queries (Only supported on MongoDB 2.6 or higher)
@@ -185,7 +185,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: AbstractCursorEvents[EventKey]
The callback function
@@ -200,7 +200,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -215,7 +215,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
The callback function
@@ -228,7 +228,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Type Parameters
Parameters
- event: EventKey
- listener: AbstractCursorEvents[EventKey]
The callback function
@@ -241,7 +241,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: CommonEvents
- listener: ((eventName: string | symbol, listener: GenericListener) => void)
The callback function
@@ -254,7 +254,7 @@ ExampleReturns a reference to the EventEmitter
, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener()
method can be used as an alternative to add the
event listener to the beginning of the listeners array.
-import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
Parameters
- event: string | symbol
- listener: GenericListener
Returns this
raw Listeners
- raw
Listeners<EventKey>(event): AbstractCursorEvents[EventKey][] Returns a copy of the array of listeners for the event named eventName
,
including any wrappers (such as those created by .once()
).
-import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+
Synchronously calls each of the listeners registered for the event named
eventName
, in the order they were registered, passing the supplied arguments to each.Returns
-true
if the event had listeners,false
otherwise.