{"id":22122555,"url":"https://github.com/ndiing/util","last_synced_at":"2025-08-13T18:35:31.815Z","repository":{"id":258705164,"uuid":"872116982","full_name":"ndiing/util","owner":"ndiing","description":"Kumpulan kelas dan fungsi utilitas untuk pengelolaan fungsi asinkron di JavaScript, termasuk mekanisme penguncian, kontrol akses, dan format string.","archived":false,"fork":false,"pushed_at":"2024-10-18T12:31:08.000Z","size":34,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-24T07:19:19.944Z","etag":null,"topics":["async","bulkhead","circuit-breaker","mutex","rate-limiter","semaphore","utility"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/@ndiinginc/util","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ndiing.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-13T20:22:32.000Z","updated_at":"2024-10-18T12:31:12.000Z","dependencies_parsed_at":"2024-10-21T18:38:45.943Z","dependency_job_id":null,"html_url":"https://github.com/ndiing/util","commit_stats":{"total_commits":63,"total_committers":1,"mean_commits":63.0,"dds":0.0,"last_synced_commit":"32e8b9bc11846de6e7d083d88abc9f8a8dc2a3c9"},"previous_names":["ndiing/util"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ndiing/util","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ndiing%2Futil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ndiing%2Futil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ndiing%2Futil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ndiing%2Futil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ndiing","download_url":"https://codeload.github.com/ndiing/util/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ndiing%2Futil/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270289133,"owners_count":24558956,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-13T02:00:09.904Z","response_time":66,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","bulkhead","circuit-breaker","mutex","rate-limiter","semaphore","utility"],"created_at":"2024-12-01T15:22:29.392Z","updated_at":"2025-08-13T18:35:31.713Z","avatar_url":"https://github.com/ndiing.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Modules\n\n\u003cdl\u003e\n\u003cdt\u003e\u003ca href=\"#module_string\"\u003estring\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#module_file\"\u003efile\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#module_resilience\"\u003eresilience\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003c/dl\u003e\n\n\u003ca name=\"module_string\"\u003e\u003c/a\u003e\n\n## string\n\n* [string](#module_string)\n    * [.toPascalCase(string)](#module_string.toPascalCase) ⇒ \u003ccode\u003estring\u003c/code\u003e\n    * [.toCamelCase(string)](#module_string.toCamelCase) ⇒ \u003ccode\u003estring\u003c/code\u003e\n    * [.toSnakeCase(string)](#module_string.toSnakeCase) ⇒ \u003ccode\u003estring\u003c/code\u003e\n    * [.toKebabCase(string)](#module_string.toKebabCase) ⇒ \u003ccode\u003estring\u003c/code\u003e\n    * [.toTitleCase(string)](#module_string.toTitleCase) ⇒ \u003ccode\u003estring\u003c/code\u003e\n\n\u003ca name=\"module_string.toPascalCase\"\u003e\u003c/a\u003e\n\n### string.toPascalCase(string) ⇒ \u003ccode\u003estring\u003c/code\u003e\nMengubah string menjadi format PascalCase.\n\n**Kind**: static method of [\u003ccode\u003estring\u003c/code\u003e](#module_string)  \n**Returns**: \u003ccode\u003estring\u003c/code\u003e - - String dalam format PascalCase.  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| string | \u003ccode\u003estring\u003c/code\u003e | String input yang akan diubah. |\n\n\u003ca name=\"module_string.toCamelCase\"\u003e\u003c/a\u003e\n\n### string.toCamelCase(string) ⇒ \u003ccode\u003estring\u003c/code\u003e\nMengubah string menjadi format camelCase.\n\n**Kind**: static method of [\u003ccode\u003estring\u003c/code\u003e](#module_string)  \n**Returns**: \u003ccode\u003estring\u003c/code\u003e - - String dalam format camelCase.  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| string | \u003ccode\u003estring\u003c/code\u003e | String input yang akan diubah. |\n\n\u003ca name=\"module_string.toSnakeCase\"\u003e\u003c/a\u003e\n\n### string.toSnakeCase(string) ⇒ \u003ccode\u003estring\u003c/code\u003e\nMengubah string menjadi format snake_case.\n\n**Kind**: static method of [\u003ccode\u003estring\u003c/code\u003e](#module_string)  \n**Returns**: \u003ccode\u003estring\u003c/code\u003e - - String dalam format snake_case.  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| string | \u003ccode\u003estring\u003c/code\u003e | String input yang akan diubah. |\n\n\u003ca name=\"module_string.toKebabCase\"\u003e\u003c/a\u003e\n\n### string.toKebabCase(string) ⇒ \u003ccode\u003estring\u003c/code\u003e\nMengubah string menjadi format kebab-case.\n\n**Kind**: static method of [\u003ccode\u003estring\u003c/code\u003e](#module_string)  \n**Returns**: \u003ccode\u003estring\u003c/code\u003e - - String dalam format kebab-case.  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| string | \u003ccode\u003estring\u003c/code\u003e | String input yang akan diubah. |\n\n\u003ca name=\"module_string.toTitleCase\"\u003e\u003c/a\u003e\n\n### string.toTitleCase(string) ⇒ \u003ccode\u003estring\u003c/code\u003e\nMengubah string menjadi format Title Case.\n\n**Kind**: static method of [\u003ccode\u003estring\u003c/code\u003e](#module_string)  \n**Returns**: \u003ccode\u003estring\u003c/code\u003e - - String dalam format Title Case.  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| string | \u003ccode\u003estring\u003c/code\u003e | String input yang akan diubah. |\n\n\u003ca name=\"module_file\"\u003e\u003c/a\u003e\n\n## file\n\n* [file](#module_file)\n    * [.read(filename)](#module_file.read) ⇒ \u003ccode\u003estring\u003c/code\u003e \\| \u003ccode\u003enull\u003c/code\u003e\n    * [.write(filename, data)](#module_file.write)\n\n\u003ca name=\"module_file.read\"\u003e\u003c/a\u003e\n\n### file.read(filename) ⇒ \u003ccode\u003estring\u003c/code\u003e \\| \u003ccode\u003enull\u003c/code\u003e\nMembaca konten dari file dengan nama yang diberikan.\n\n**Kind**: static method of [\u003ccode\u003efile\u003c/code\u003e](#module_file)  \n**Returns**: \u003ccode\u003estring\u003c/code\u003e \\| \u003ccode\u003enull\u003c/code\u003e - - Mengembalikan konten file dalam bentuk string atau `null` jika terjadi kesalahan.  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| filename | \u003ccode\u003estring\u003c/code\u003e | Nama file yang akan dibaca. |\n\n\u003ca name=\"module_file.write\"\u003e\u003c/a\u003e\n\n### file.write(filename, data)\nMenulis data ke file dengan nama yang diberikan.\rJika direktori tidak ada, direktori akan dibuat.\n\n**Kind**: static method of [\u003ccode\u003efile\u003c/code\u003e](#module_file)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| filename | \u003ccode\u003estring\u003c/code\u003e | Nama file di mana data akan ditulis. |\n| data | \u003ccode\u003estring\u003c/code\u003e | Konten yang akan ditulis ke file. |\n\n\u003ca name=\"module_resilience\"\u003e\u003c/a\u003e\n\n## resilience\n\n* [resilience](#module_resilience)\n    * _static_\n        * [.retry(fn, [retries], [delay])](#module_resilience.retry) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\n        * [.timeout(fn, ms)](#module_resilience.timeout) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\n    * _inner_\n        * [~CircuitBreaker](#module_resilience..CircuitBreaker)\n            * [new CircuitBreaker([failureThreshold], [resetTimeout])](#new_module_resilience..CircuitBreaker_new)\n            * [.execute(fn)](#module_resilience..CircuitBreaker+execute) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\n            * [.reset()](#module_resilience..CircuitBreaker+reset)\n        * [~Bulkhead](#module_resilience..Bulkhead)\n            * [new Bulkhead(maxRequests)](#new_module_resilience..Bulkhead_new)\n            * [.execute(fn)](#module_resilience..Bulkhead+execute) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\n            * [.processQueue()](#module_resilience..Bulkhead+processQueue)\n        * [~RateLimiter](#module_resilience..RateLimiter)\n            * [new RateLimiter(maxRequests, interval)](#new_module_resilience..RateLimiter_new)\n            * [.execute(fn)](#module_resilience..RateLimiter+execute) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\n        * [~Mutex](#module_resilience..Mutex)\n            * [.lock()](#module_resilience..Mutex+lock) ⇒ \u003ccode\u003ePromise.\u0026lt;void\u0026gt;\u003c/code\u003e\n            * [.unlock()](#module_resilience..Mutex+unlock)\n        * [~Semaphore](#module_resilience..Semaphore)\n            * [new Semaphore(max)](#new_module_resilience..Semaphore_new)\n            * [.acquire()](#module_resilience..Semaphore+acquire) ⇒ \u003ccode\u003ePromise.\u0026lt;void\u0026gt;\u003c/code\u003e\n            * [.release()](#module_resilience..Semaphore+release)\n\n\u003ca name=\"module_resilience.retry\"\u003e\u003c/a\u003e\n\n### resilience.retry(fn, [retries], [delay]) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\nMencoba menjalankan fungsi secara berulang hingga berhasil atau mencapai batas retry.\n\n**Kind**: static method of [\u003ccode\u003eresilience\u003c/code\u003e](#module_resilience)  \n**Returns**: \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e - - Mengembalikan hasil dari fungsi yang berhasil.  \n**Throws**:\n\n- \u003ccode\u003eError\u003c/code\u003e - Melemparkan kesalahan jika semua percobaan gagal.\n\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| fn | \u003ccode\u003efunction\u003c/code\u003e |  | Fungsi yang akan dicoba. Harus mengembalikan sebuah promise. |\n| [retries] | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e3\u003c/code\u003e | Jumlah maksimum percobaan sebelum melemparkan kesalahan. |\n| [delay] | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e1000\u003c/code\u003e | Waktu dalam milidetik untuk menunggu sebelum mencoba lagi setelah gagal. |\n\n\u003ca name=\"module_resilience.timeout\"\u003e\u003c/a\u003e\n\n### resilience.timeout(fn, ms) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\nMenjalankan fungsi dan mengatur batas waktu. Jika fungsi tidak selesai dalam waktu yang ditentukan, akan melemparkan kesalahan \"Timeout\".\n\n**Kind**: static method of [\u003ccode\u003eresilience\u003c/code\u003e](#module_resilience)  \n**Returns**: \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e - - Mengembalikan hasil dari fungsi jika selesai dalam batas waktu.  \n**Throws**:\n\n- \u003ccode\u003eError\u003c/code\u003e - Melemparkan kesalahan jika fungsi tidak selesai dalam waktu yang ditentukan.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| fn | \u003ccode\u003efunction\u003c/code\u003e | Fungsi yang akan dijalankan. Harus mengembalikan sebuah promise. |\n| ms | \u003ccode\u003enumber\u003c/code\u003e | Waktu maksimum dalam milidetik sebelum timeout. |\n\n\u003ca name=\"module_resilience..CircuitBreaker\"\u003e\u003c/a\u003e\n\n### resilience~CircuitBreaker\nKelas CircuitBreaker untuk mengelola dan melindungi fungsi dari kesalahan yang berulang.\rCircuit Breaker mencegah fungsi dari pemanggilan berulang ketika kesalahan telah mencapai ambang batas.\n\n**Kind**: inner class of [\u003ccode\u003eresilience\u003c/code\u003e](#module_resilience)  \n\n* [~CircuitBreaker](#module_resilience..CircuitBreaker)\n    * [new CircuitBreaker([failureThreshold], [resetTimeout])](#new_module_resilience..CircuitBreaker_new)\n    * [.execute(fn)](#module_resilience..CircuitBreaker+execute) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\n    * [.reset()](#module_resilience..CircuitBreaker+reset)\n\n\u003ca name=\"new_module_resilience..CircuitBreaker_new\"\u003e\u003c/a\u003e\n\n#### new CircuitBreaker([failureThreshold], [resetTimeout])\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [failureThreshold] | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e3\u003c/code\u003e | Ambang batas jumlah kesalahan sebelum sirkuit terbuka. |\n| [resetTimeout] | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e5000\u003c/code\u003e | Waktu dalam milidetik sebelum sirkuit setengah terbuka setelah terbuka. |\n\n\u003ca name=\"module_resilience..CircuitBreaker+execute\"\u003e\u003c/a\u003e\n\n#### circuitBreaker.execute(fn) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\nMenjalankan fungsi dan menerapkan circuit breaker.\rJika sirkuit terbuka, fungsi tidak akan dieksekusi hingga waktu reset berlalu.\n\n**Kind**: instance method of [\u003ccode\u003eCircuitBreaker\u003c/code\u003e](#module_resilience..CircuitBreaker)  \n**Returns**: \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e - - Mengembalikan hasil dari fungsi jika berhasil.  \n**Throws**:\n\n- \u003ccode\u003eError\u003c/code\u003e - Melemparkan kesalahan jika fungsi gagal atau jika sirkuit terbuka.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| fn | \u003ccode\u003efunction\u003c/code\u003e | Fungsi yang akan dijalankan. Harus mengembalikan sebuah promise. |\n\n\u003ca name=\"module_resilience..CircuitBreaker+reset\"\u003e\u003c/a\u003e\n\n#### circuitBreaker.reset()\nMereset status circuit breaker ke keadaan tertutup dan mengatur ulang hitungan kesalahan.\n\n**Kind**: instance method of [\u003ccode\u003eCircuitBreaker\u003c/code\u003e](#module_resilience..CircuitBreaker)  \n\u003ca name=\"module_resilience..Bulkhead\"\u003e\u003c/a\u003e\n\n### resilience~Bulkhead\nKelas Bulkhead untuk mengelola batas maksimum permintaan yang dapat dieksekusi secara bersamaan.\rBulkhead membantu mencegah satu bagian dari aplikasi mempengaruhi bagian lainnya dengan membatasi\rjumlah permintaan yang dapat diproses dalam waktu bersamaan.\n\n**Kind**: inner class of [\u003ccode\u003eresilience\u003c/code\u003e](#module_resilience)  \n\n* [~Bulkhead](#module_resilience..Bulkhead)\n    * [new Bulkhead(maxRequests)](#new_module_resilience..Bulkhead_new)\n    * [.execute(fn)](#module_resilience..Bulkhead+execute) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\n    * [.processQueue()](#module_resilience..Bulkhead+processQueue)\n\n\u003ca name=\"new_module_resilience..Bulkhead_new\"\u003e\u003c/a\u003e\n\n#### new Bulkhead(maxRequests)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| maxRequests | \u003ccode\u003enumber\u003c/code\u003e | Jumlah maksimum permintaan yang dapat diproses secara bersamaan. |\n\n\u003ca name=\"module_resilience..Bulkhead+execute\"\u003e\u003c/a\u003e\n\n#### bulkhead.execute(fn) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\nMenjalankan fungsi dan mengatur antrian permintaan jika batas maksimum tercapai.\n\n**Kind**: instance method of [\u003ccode\u003eBulkhead\u003c/code\u003e](#module_resilience..Bulkhead)  \n**Returns**: \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e - - Mengembalikan hasil dari fungsi jika berhasil.  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| fn | \u003ccode\u003efunction\u003c/code\u003e | Fungsi yang akan dijalankan. Harus mengembalikan sebuah promise. |\n\n\u003ca name=\"module_resilience..Bulkhead+processQueue\"\u003e\u003c/a\u003e\n\n#### bulkhead.processQueue()\nMemproses antrian permintaan yang menunggu jika ada kapasitas yang tersedia.\n\n**Kind**: instance method of [\u003ccode\u003eBulkhead\u003c/code\u003e](#module_resilience..Bulkhead)  \n\u003ca name=\"module_resilience..RateLimiter\"\u003e\u003c/a\u003e\n\n### resilience~RateLimiter\nKelas RateLimiter untuk membatasi jumlah permintaan yang dapat dilakukan dalam jangka waktu tertentu.\rBerguna untuk menghindari kelebihan beban pada server atau API.\n\n**Kind**: inner class of [\u003ccode\u003eresilience\u003c/code\u003e](#module_resilience)  \n\n* [~RateLimiter](#module_resilience..RateLimiter)\n    * [new RateLimiter(maxRequests, interval)](#new_module_resilience..RateLimiter_new)\n    * [.execute(fn)](#module_resilience..RateLimiter+execute) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\n\n\u003ca name=\"new_module_resilience..RateLimiter_new\"\u003e\u003c/a\u003e\n\n#### new RateLimiter(maxRequests, interval)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| maxRequests | \u003ccode\u003enumber\u003c/code\u003e | Jumlah maksimum permintaan yang diizinkan dalam interval waktu. |\n| interval | \u003ccode\u003enumber\u003c/code\u003e | Interval waktu dalam milidetik untuk membatasi permintaan. |\n\n\u003ca name=\"module_resilience..RateLimiter+execute\"\u003e\u003c/a\u003e\n\n#### rateLimiter.execute(fn) ⇒ \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e\nMenjalankan fungsi jika batas permintaan belum terlampaui.\n\n**Kind**: instance method of [\u003ccode\u003eRateLimiter\u003c/code\u003e](#module_resilience..RateLimiter)  \n**Returns**: \u003ccode\u003ePromise.\u0026lt;any\u0026gt;\u003c/code\u003e - - Mengembalikan hasil dari fungsi jika batas permintaan belum terlampaui.  \n**Throws**:\n\n- \u003ccode\u003eError\u003c/code\u003e - Melempar error jika batas permintaan telah terlampaui.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| fn | \u003ccode\u003efunction\u003c/code\u003e | Fungsi yang akan dijalankan. Harus mengembalikan sebuah promise. |\n\n\u003ca name=\"module_resilience..Mutex\"\u003e\u003c/a\u003e\n\n### resilience~Mutex\nKelas yang mengimplementasikan mekanisme mutex untuk penguncian sumber daya.\n\n**Kind**: inner class of [\u003ccode\u003eresilience\u003c/code\u003e](#module_resilience)  \n\n* [~Mutex](#module_resilience..Mutex)\n    * [.lock()](#module_resilience..Mutex+lock) ⇒ \u003ccode\u003ePromise.\u0026lt;void\u0026gt;\u003c/code\u003e\n    * [.unlock()](#module_resilience..Mutex+unlock)\n\n\u003ca name=\"module_resilience..Mutex+lock\"\u003e\u003c/a\u003e\n\n#### mutex.lock() ⇒ \u003ccode\u003ePromise.\u0026lt;void\u0026gt;\u003c/code\u003e\nMengunci mutex. Jika sudah terkunci, menunggu sampai dapat mengunci.\n\n**Kind**: instance method of [\u003ccode\u003eMutex\u003c/code\u003e](#module_resilience..Mutex)  \n**Returns**: \u003ccode\u003ePromise.\u0026lt;void\u0026gt;\u003c/code\u003e - - Sebuah promise yang diselesaikan saat mutex terkunci.  \n\u003ca name=\"module_resilience..Mutex+unlock\"\u003e\u003c/a\u003e\n\n#### mutex.unlock()\nMembuka kunci mutex dan memberi kesempatan kepada antrean untuk mengunci.\n\n**Kind**: instance method of [\u003ccode\u003eMutex\u003c/code\u003e](#module_resilience..Mutex)  \n\u003ca name=\"module_resilience..Semaphore\"\u003e\u003c/a\u003e\n\n### resilience~Semaphore\nKelas yang mengimplementasikan mekanisme semaphore untuk pengelolaan akses ke sumber daya.\n\n**Kind**: inner class of [\u003ccode\u003eresilience\u003c/code\u003e](#module_resilience)  \n\n* [~Semaphore](#module_resilience..Semaphore)\n    * [new Semaphore(max)](#new_module_resilience..Semaphore_new)\n    * [.acquire()](#module_resilience..Semaphore+acquire) ⇒ \u003ccode\u003ePromise.\u0026lt;void\u0026gt;\u003c/code\u003e\n    * [.release()](#module_resilience..Semaphore+release)\n\n\u003ca name=\"new_module_resilience..Semaphore_new\"\u003e\u003c/a\u003e\n\n#### new Semaphore(max)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| max | \u003ccode\u003enumber\u003c/code\u003e | Jumlah maksimum akses yang diizinkan pada satu waktu. |\n\n\u003ca name=\"module_resilience..Semaphore+acquire\"\u003e\u003c/a\u003e\n\n#### semaphore.acquire() ⇒ \u003ccode\u003ePromise.\u0026lt;void\u0026gt;\u003c/code\u003e\nMengakuisisi akses semaphore. Jika sudah mencapai maksimum, menunggu sampai ada akses yang dilepaskan.\n\n**Kind**: instance method of [\u003ccode\u003eSemaphore\u003c/code\u003e](#module_resilience..Semaphore)  \n**Returns**: \u003ccode\u003ePromise.\u0026lt;void\u0026gt;\u003c/code\u003e - - Sebuah promise yang diselesaikan saat akses diperoleh.  \n\u003ca name=\"module_resilience..Semaphore+release\"\u003e\u003c/a\u003e\n\n#### semaphore.release()\nMembebaskan akses semaphore, memberi kesempatan kepada antrean untuk mengakuisisi akses.\n\n**Kind**: instance method of [\u003ccode\u003eSemaphore\u003c/code\u003e](#module_resilience..Semaphore)  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fndiing%2Futil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fndiing%2Futil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fndiing%2Futil/lists"}