@discordeno/utils 19.0.0-next.3ebcce8 → 19.0.0-next.40c19da

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -149,6 +149,6 @@ and unofficial templates:
149
149
 
150
150
  ## Links
151
151
 
152
- - [Website](https://discordeno.mod.land)
152
+ - [Website](https://discordeno.github.io/discordeno/)
153
153
  - [Documentation](https://doc.deno.land/https/deno.land/x/discordeno/mod.ts)
154
154
  - [Discord](https://discord.com/invite/5vBgXk3UcZ)
@@ -1,2 +1,113 @@
1
- export class Collection extends Map{constructor(e,t){if(super(e??[]),this.maxSize=t?.maxSize,!t?.sweeper)return;this.startSweeper(t.sweeper)}startSweeper(e){return this.sweeper?.intervalId&&clearInterval(this.sweeper.intervalId),this.sweeper=e,this.sweeper.intervalId=setInterval(()=>{this.forEach((t,r)=>{if(this.sweeper?.filter(t,r,e.bot))return this.delete(r),r})},e.interval),this.sweeper.intervalId}stopSweeper(){return clearInterval(this.sweeper?.intervalId)}changeSweeperInterval(e){null!=this.sweeper&&this.startSweeper({filter:this.sweeper.filter,interval:e})}changeSweeperFilter(e){null!=this.sweeper&&this.startSweeper({filter:e,interval:this.sweeper.interval})}set(e,t){return(void 0!==this.maxSize||0===this.maxSize)&&this.size>=this.maxSize?this:super.set(e,t)}forceSet(e,t){return super.set(e,t)}array(){return[...this.values()]}first(){return this.values().next().value}last(){return[...this.values()][this.size-1]}random(){let e=[...this.values()];return e[Math.floor(Math.random()*e.length)]}find(e){for(let t of this.keys()){let r=this.get(t);if(e(r,t))return r}}filter(e){let t=new Collection;return this.forEach((r,s)=>{e(r,s)&&t.set(s,r)}),t}map(e){let t=[];for(let r of this.keys()){let s=this.get(r);t.push(e(s,r))}return t}some(e){for(let t of this.keys()){let r=this.get(t);if(e(r,t))return!0}return!1}every(e){for(let t of this.keys()){let r=this.get(t);if(!e(r,t))return!1}return!0}reduce(e,t){let r=t;for(let s of this.keys()){let i=this.get(s);r=e(r,i,s)}return r}}
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db2xsZWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIFBsYWNlSG9sZGVyQm90IHt9XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uPEssIFY+IGV4dGVuZHMgTWFwPEssIFY+IHtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBpdGVtcyBhbGxvd2VkIGluIHRoaXMgY29sbGVjdGlvbi4gVG8gZGlzYWJsZSBjYWNoZSwgc2V0IGl0IDAsIHNldCB0byB1bmRlZmluZWQgdG8gbWFrZSBpdCBpbmZpbml0ZS5cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBtYXhTaXplOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgLyoqIEhhbmRsZXIgdG8gcmVtb3ZlIGl0ZW1zIGZyb20gdGhlIGNvbGxlY3Rpb24gZXZlcnkgc28gb2Z0ZW4uICovXG4gIHN3ZWVwZXI6IChDb2xsZWN0aW9uU3dlZXBlcjxLLCBWPiAmIHsgaW50ZXJ2YWxJZD86IE5vZGVKUy5UaW1lciB9KSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGVudHJpZXM/OiAoUmVhZG9ubHlBcnJheTxyZWFkb25seSBbSywgVl0+IHwgbnVsbCkgfCBNYXA8SywgVj4sIG9wdGlvbnM/OiBDb2xsZWN0aW9uT3B0aW9uczxLLCBWPikge1xuICAgIHN1cGVyKGVudHJpZXMgPz8gW10pXG5cbiAgICB0aGlzLm1heFNpemUgPSBvcHRpb25zPy5tYXhTaXplXG5cbiAgICBpZiAoIW9wdGlvbnM/LnN3ZWVwZXIpIHJldHVyblxuXG4gICAgdGhpcy5zdGFydFN3ZWVwZXIob3B0aW9ucy5zd2VlcGVyKVxuICB9XG5cbiAgc3RhcnRTd2VlcGVyKG9wdGlvbnM6IENvbGxlY3Rpb25Td2VlcGVyPEssIFY+KTogTm9kZUpTLlRpbWVyIHtcbiAgICBpZiAodGhpcy5zd2VlcGVyPy5pbnRlcnZhbElkKSBjbGVhckludGVydmFsKHRoaXMuc3dlZXBlci5pbnRlcnZhbElkKVxuXG4gICAgdGhpcy5zd2VlcGVyID0gb3B0aW9uc1xuICAgIHRoaXMuc3dlZXBlci5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zd2VlcGVyPy5maWx0ZXIodmFsdWUsIGtleSwgb3B0aW9ucy5ib3QpKSByZXR1cm5cblxuICAgICAgICB0aGlzLmRlbGV0ZShrZXkpXG4gICAgICAgIHJldHVybiBrZXlcbiAgICAgIH0pXG4gICAgfSwgb3B0aW9ucy5pbnRlcnZhbClcblxuICAgIHJldHVybiB0aGlzLnN3ZWVwZXIuaW50ZXJ2YWxJZFxuICB9XG5cbiAgc3RvcFN3ZWVwZXIoKTogdm9pZCB7XG4gICAgcmV0dXJuIGNsZWFySW50ZXJ2YWwodGhpcy5zd2VlcGVyPy5pbnRlcnZhbElkKVxuICB9XG5cbiAgY2hhbmdlU3dlZXBlckludGVydmFsKG5ld0ludGVydmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zd2VlcGVyID09IG51bGwpIHJldHVyblxuXG4gICAgdGhpcy5zdGFydFN3ZWVwZXIoeyBmaWx0ZXI6IHRoaXMuc3dlZXBlci5maWx0ZXIsIGludGVydmFsOiBuZXdJbnRlcnZhbCB9KVxuICB9XG5cbiAgY2hhbmdlU3dlZXBlckZpbHRlcihuZXdGaWx0ZXI6ICh2YWx1ZTogViwga2V5OiBLLCBib3Q6IFBsYWNlSG9sZGVyQm90KSA9PiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3dlZXBlciA9PSBudWxsKSByZXR1cm5cblxuICAgIHRoaXMuc3RhcnRTd2VlcGVyKHsgZmlsdGVyOiBuZXdGaWx0ZXIsIGludGVydmFsOiB0aGlzLnN3ZWVwZXIuaW50ZXJ2YWwgfSlcbiAgfVxuXG4gIC8qKiBBZGQgYW4gaXRlbSB0byB0aGUgY29sbGVjdGlvbi4gTWFrZXMgc3VyZSBub3QgdG8gZ28gYWJvdmUgdGhlIG1heFNpemUuICovXG4gIHNldChrZXk6IEssIHZhbHVlOiBWKTogdGhpcyB7XG4gICAgLy8gV2hlbiB0aGlzIGNvbGxlY3Rpb24gaXMgbWF4U2l6ZWQgbWFrZSBzdXJlIHdlIGNhbiBhZGQgZmlyc3RcbiAgICBpZiAoKHRoaXMubWF4U2l6ZSAhPT0gdW5kZWZpbmVkIHx8IHRoaXMubWF4U2l6ZSA9PT0gMCkgJiYgdGhpcy5zaXplID49IHRoaXMubWF4U2l6ZSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuc2V0KGtleSwgdmFsdWUpXG4gIH1cblxuICAvKiogQWRkIGFuIGl0ZW0gdG8gdGhlIGNvbGxlY3Rpb24sIG5vIG1hdHRlciB3aGF0IHRoZSBtYXhTaXplIGlzLiAqL1xuICBmb3JjZVNldChrZXk6IEssIHZhbHVlOiBWKTogdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLnNldChrZXksIHZhbHVlKVxuICB9XG5cbiAgLyoqIENvbnZlcnQgdGhlIGNvbGxlY3Rpb24gdG8gYW4gYXJyYXkuICovXG4gIGFycmF5KCk6IFZbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnZhbHVlcygpXVxuICB9XG5cbiAgLyoqIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGlzIGNvbGxlY3Rpb24uICovXG4gIGZpcnN0KCk6IFYgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcygpLm5leHQoKS52YWx1ZVxuICB9XG5cbiAgLyoqIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBlbGVtZW50IGluIHRoaXMgY29sbGVjdGlvbi4gKi9cbiAgbGFzdCgpOiBWIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudmFsdWVzKCldW3RoaXMuc2l6ZSAtIDFdXG4gIH1cblxuICAvKiogUmV0cmlldmUgdGhlIHZhbHVlIG9mIGEgcmFuZG9tIGVsZW1lbnQgaW4gdGhpcyBjb2xsZWN0aW9uLiAqL1xuICByYW5kb20oKTogViB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYXJyYXkgPSBbLi4udGhpcy52YWx1ZXMoKV1cbiAgICByZXR1cm4gYXJyYXlbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyYXkubGVuZ3RoKV1cbiAgfVxuXG4gIC8qKiBGaW5kIGEgc3BlY2lmaWMgZWxlbWVudCBpbiB0aGlzIGNvbGxlY3Rpb24uICovXG4gIGZpbmQoY2FsbGJhY2s6ICh2YWx1ZTogViwga2V5OiBLKSA9PiBib29sZWFuKTogTm9uTnVsbGFibGU8Vj4gfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMua2V5cygpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KGtleSkhXG4gICAgICBpZiAoY2FsbGJhY2sodmFsdWUsIGtleSkpIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgICAvLyBJZiBub3RoaW5nIG1hdGNoZWRcbiAgfVxuXG4gIC8qKiBGaW5kIGFsbCBlbGVtZW50cyBpbiB0aGlzIGNvbGxlY3Rpb24gdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcGF0dGVybi4gKi9cbiAgZmlsdGVyKGNhbGxiYWNrOiAodmFsdWU6IFYsIGtleTogSykgPT4gYm9vbGVhbik6IENvbGxlY3Rpb248SywgVj4ge1xuICAgIGNvbnN0IHJlbGV2YW50ID0gbmV3IENvbGxlY3Rpb248SywgVj4oKVxuICAgIHRoaXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgaWYgKGNhbGxiYWNrKHZhbHVlLCBrZXkpKSByZWxldmFudC5zZXQoa2V5LCB2YWx1ZSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlbGV2YW50XG4gIH1cblxuICAvKiogQ29udmVydHMgdGhlIGNvbGxlY3Rpb24gaW50byBhbiBhcnJheSBieSBydW5uaW5nIGEgY2FsbGJhY2sgb24gYWxsIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uLiAqL1xuICBtYXA8VD4oY2FsbGJhY2s6ICh2YWx1ZTogViwga2V5OiBLKSA9PiBUKTogVFtdIHtcbiAgICBjb25zdCByZXN1bHRzID0gW11cbiAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmtleXMoKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChrZXkpIVxuICAgICAgcmVzdWx0cy5wdXNoKGNhbGxiYWNrKHZhbHVlLCBrZXkpKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0c1xuICB9XG5cbiAgLyoqIENoZWNrIGlmIG9uZSBvZiB0aGUgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gbWF0Y2hlcyB0aGUgcGF0dGVybi4gKi9cbiAgc29tZShjYWxsYmFjazogKHZhbHVlOiBWLCBrZXk6IEspID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmtleXMoKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChrZXkpIVxuICAgICAgaWYgKGNhbGxiYWNrKHZhbHVlLCBrZXkpKSByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqIENoZWNrIGlmIGFsbCBvZiB0aGUgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gbWF0Y2hlcyB0aGUgcGF0dGVybi4gKi9cbiAgZXZlcnkoY2FsbGJhY2s6ICh2YWx1ZTogViwga2V5OiBLKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5rZXlzKCkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoa2V5KSFcbiAgICAgIGlmICghY2FsbGJhY2sodmFsdWUsIGtleSkpIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogUnVucyBhIGNhbGxiYWNrIG9uIGFsbCBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbiwgbWVyZ2luZyB0aGVtIGludG8gYSBzaW5nbGUgdmFsdWUuICovXG4gIHJlZHVjZTxUPihjYWxsYmFjazogKGFjY3VtdWxhdG9yOiBULCB2YWx1ZTogViwga2V5OiBLKSA9PiBULCBpbml0aWFsVmFsdWU/OiBUKTogVCB7XG4gICAgbGV0IGFjY3VtdWxhdG9yOiBUID0gaW5pdGlhbFZhbHVlIVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5rZXlzKCkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoa2V5KSFcbiAgICAgIGFjY3VtdWxhdG9yID0gY2FsbGJhY2soYWNjdW11bGF0b3IsIHZhbHVlLCBrZXkpXG4gICAgfVxuXG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uT3B0aW9uczxLLCBWPiB7XG4gIC8qKiBIYW5kbGVyIHRvIGNsZWFuIG91dCB0aGUgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gZXZlcnkgc28gb2Z0ZW4uICovXG4gIHN3ZWVwZXI/OiBDb2xsZWN0aW9uU3dlZXBlcjxLLCBWPlxuICAvKiogVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGFsbG93ZWQgaW4gdGhlIGNvbGxlY3Rpb24uICovXG4gIG1heFNpemU/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uU3dlZXBlcjxLLCBWPiB7XG4gIC8qKiBUaGUgZmlsdGVyIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGVsZW1lbnQgc2hvdWxkIGJlIGRlbGV0ZWQgb3Igbm90ICovXG4gIGZpbHRlcjogKHZhbHVlOiBWLCBrZXk6IEssIC4uLmFyZ3M6IGFueVtdKSA9PiBib29sZWFuXG4gIC8qKiBUaGUgaW50ZXJ2YWwgaW4gd2hpY2ggdGhlIHN3ZWVwZXIgc2hvdWxkIHJ1biAqL1xuICBpbnRlcnZhbDogbnVtYmVyXG4gIC8qKiBUaGUgYm90IG9iamVjdCBpdHNlbGYgKi9cbiAgYm90PzogUGxhY2VIb2xkZXJCb3Rcbn1cbiJdLCJuYW1lcyI6WyJDb2xsZWN0aW9uIiwiTWFwIiwiY29uc3RydWN0b3IiLCJlbnRyaWVzIiwib3B0aW9ucyIsIm1heFNpemUiLCJzd2VlcGVyIiwic3RhcnRTd2VlcGVyIiwiaW50ZXJ2YWxJZCIsImNsZWFySW50ZXJ2YWwiLCJzZXRJbnRlcnZhbCIsImZvckVhY2giLCJ2YWx1ZSIsImtleSIsImZpbHRlciIsImJvdCIsImRlbGV0ZSIsImludGVydmFsIiwic3RvcFN3ZWVwZXIiLCJjaGFuZ2VTd2VlcGVySW50ZXJ2YWwiLCJuZXdJbnRlcnZhbCIsImNoYW5nZVN3ZWVwZXJGaWx0ZXIiLCJuZXdGaWx0ZXIiLCJzZXQiLCJ1bmRlZmluZWQiLCJzaXplIiwiZm9yY2VTZXQiLCJhcnJheSIsInZhbHVlcyIsImZpcnN0IiwibmV4dCIsImxhc3QiLCJyYW5kb20iLCJNYXRoIiwiZmxvb3IiLCJsZW5ndGgiLCJmaW5kIiwiY2FsbGJhY2siLCJrZXlzIiwiZ2V0IiwicmVsZXZhbnQiLCJtYXAiLCJyZXN1bHRzIiwicHVzaCIsInNvbWUiLCJldmVyeSIsInJlZHVjZSIsImluaXRpYWxWYWx1ZSIsImFjY3VtdWxhdG9yIl0sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLE1BQU1BLG1CQUF5QkMsSUFTcENDLFlBQVlDLENBQTZELENBQUVDLENBQWlDLENBQUUsQ0FLNUcsR0FKQSxLQUFLLENBQUNELEdBQVcsRUFBRSxFQUVuQixJQUFJLENBQUNFLE9BQU8sQ0FBR0QsR0FBU0MsUUFFcEIsQ0FBQ0QsR0FBU0UsUUFBUyxNQUFNLENBRTdCLElBQUksQ0FBQ0MsWUFBWSxDQUFDSCxFQUFRRSxPQUFPLENBQ25DLENBRUFDLGFBQWFILENBQWdDLENBQWdCLENBYTNELE9BWkksSUFBSSxDQUFDRSxPQUFPLEVBQUVFLFlBQVlDLGNBQWMsSUFBSSxDQUFDSCxPQUFPLENBQUNFLFVBQVUsRUFFbkUsSUFBSSxDQUFDRixPQUFPLENBQUdGLEVBQ2YsSUFBSSxDQUFDRSxPQUFPLENBQUNFLFVBQVUsQ0FBR0UsWUFBWSxJQUFNLENBQzFDLElBQUksQ0FBQ0MsT0FBTyxDQUFDLENBQUNDLEVBQU9DLElBQVEsQ0FDM0IsR0FB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
1
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
2
+ export class Collection extends Map {
3
+ constructor(entries, options){
4
+ super(entries ?? []);
5
+ this.maxSize = options?.maxSize;
6
+ if (!options?.sweeper) return;
7
+ this.startSweeper(options.sweeper);
8
+ }
9
+ startSweeper(options) {
10
+ if (this.sweeper?.intervalId) clearInterval(this.sweeper.intervalId);
11
+ this.sweeper = options;
12
+ this.sweeper.intervalId = setInterval(()=>{
13
+ this.forEach((value, key)=>{
14
+ if (!this.sweeper?.filter(value, key, options.bot)) return;
15
+ this.delete(key);
16
+ return key;
17
+ });
18
+ }, options.interval);
19
+ return this.sweeper.intervalId;
20
+ }
21
+ stopSweeper() {
22
+ return clearInterval(this.sweeper?.intervalId);
23
+ }
24
+ changeSweeperInterval(newInterval) {
25
+ if (this.sweeper == null) return;
26
+ this.startSweeper({
27
+ filter: this.sweeper.filter,
28
+ interval: newInterval
29
+ });
30
+ }
31
+ changeSweeperFilter(newFilter) {
32
+ if (this.sweeper == null) return;
33
+ this.startSweeper({
34
+ filter: newFilter,
35
+ interval: this.sweeper.interval
36
+ });
37
+ }
38
+ /** Add an item to the collection. Makes sure not to go above the maxSize. */ set(key, value) {
39
+ // When this collection is maxSized make sure we can add first
40
+ if ((this.maxSize !== undefined || this.maxSize === 0) && this.size >= this.maxSize) {
41
+ return this;
42
+ }
43
+ return super.set(key, value);
44
+ }
45
+ /** Add an item to the collection, no matter what the maxSize is. */ forceSet(key, value) {
46
+ return super.set(key, value);
47
+ }
48
+ /** Convert the collection to an array. */ array() {
49
+ return [
50
+ ...this.values()
51
+ ];
52
+ }
53
+ /** Retrieve the value of the first element in this collection. */ first() {
54
+ return this.values().next().value;
55
+ }
56
+ /** Retrieve the value of the last element in this collection. */ last() {
57
+ return [
58
+ ...this.values()
59
+ ][this.size - 1];
60
+ }
61
+ /** Retrieve the value of a random element in this collection. */ random() {
62
+ const array = [
63
+ ...this.values()
64
+ ];
65
+ return array[Math.floor(Math.random() * array.length)];
66
+ }
67
+ /** Find a specific element in this collection. */ find(callback) {
68
+ for (const key of this.keys()){
69
+ const value = this.get(key);
70
+ if (callback(value, key)) return value;
71
+ }
72
+ // If nothing matched
73
+ }
74
+ /** Find all elements in this collection that match the given pattern. */ filter(callback) {
75
+ const relevant = new Collection();
76
+ this.forEach((value, key)=>{
77
+ if (callback(value, key)) relevant.set(key, value);
78
+ });
79
+ return relevant;
80
+ }
81
+ /** Converts the collection into an array by running a callback on all items in the collection. */ map(callback) {
82
+ const results = [];
83
+ for (const key of this.keys()){
84
+ const value = this.get(key);
85
+ results.push(callback(value, key));
86
+ }
87
+ return results;
88
+ }
89
+ /** Check if one of the items in the collection matches the pattern. */ some(callback) {
90
+ for (const key of this.keys()){
91
+ const value = this.get(key);
92
+ if (callback(value, key)) return true;
93
+ }
94
+ return false;
95
+ }
96
+ /** Check if all of the items in the collection matches the pattern. */ every(callback) {
97
+ for (const key of this.keys()){
98
+ const value = this.get(key);
99
+ if (!callback(value, key)) return false;
100
+ }
101
+ return true;
102
+ }
103
+ /** Runs a callback on all items in the collection, merging them into a single value. */ reduce(callback, initialValue) {
104
+ let accumulator = initialValue;
105
+ for (const key of this.keys()){
106
+ const value = this.get(key);
107
+ accumulator = callback(accumulator, value, key);
108
+ }
109
+ return accumulator;
110
+ }
111
+ }
112
+
113
+ //# sourceMappingURL=Collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Collection.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface PlaceHolderBot {}\n\nexport class Collection<K, V> extends Map<K, V> {\n /**\n * The maximum amount of items allowed in this collection. To disable cache, set it 0, set to undefined to make it infinite.\n * @default undefined\n */\n maxSize: number | undefined\n /** Handler to remove items from the collection every so often. */\n sweeper: (CollectionSweeper<K, V> & { intervalId?: NodeJS.Timer }) | undefined\n\n constructor(entries?: (ReadonlyArray<readonly [K, V]> | null) | Map<K, V>, options?: CollectionOptions<K, V>) {\n super(entries ?? [])\n\n this.maxSize = options?.maxSize\n\n if (!options?.sweeper) return\n\n this.startSweeper(options.sweeper)\n }\n\n startSweeper(options: CollectionSweeper<K, V>): NodeJS.Timer {\n if (this.sweeper?.intervalId) clearInterval(this.sweeper.intervalId)\n\n this.sweeper = options\n this.sweeper.intervalId = setInterval(() => {\n this.forEach((value, key) => {\n if (!this.sweeper?.filter(value, key, options.bot)) return\n\n this.delete(key)\n return key\n })\n }, options.interval)\n\n return this.sweeper.intervalId\n }\n\n stopSweeper(): void {\n return clearInterval(this.sweeper?.intervalId)\n }\n\n changeSweeperInterval(newInterval: number): void {\n if (this.sweeper == null) return\n\n this.startSweeper({ filter: this.sweeper.filter, interval: newInterval })\n }\n\n changeSweeperFilter(newFilter: (value: V, key: K, bot: PlaceHolderBot) => boolean): void {\n if (this.sweeper == null) return\n\n this.startSweeper({ filter: newFilter, interval: this.sweeper.interval })\n }\n\n /** Add an item to the collection. Makes sure not to go above the maxSize. */\n set(key: K, value: V): this {\n // When this collection is maxSized make sure we can add first\n if ((this.maxSize !== undefined || this.maxSize === 0) && this.size >= this.maxSize) {\n return this\n }\n\n return super.set(key, value)\n }\n\n /** Add an item to the collection, no matter what the maxSize is. */\n forceSet(key: K, value: V): this {\n return super.set(key, value)\n }\n\n /** Convert the collection to an array. */\n array(): V[] {\n return [...this.values()]\n }\n\n /** Retrieve the value of the first element in this collection. */\n first(): V | undefined {\n return this.values().next().value\n }\n\n /** Retrieve the value of the last element in this collection. */\n last(): V | undefined {\n return [...this.values()][this.size - 1]\n }\n\n /** Retrieve the value of a random element in this collection. */\n random(): V | undefined {\n const array = [...this.values()]\n return array[Math.floor(Math.random() * array.length)]\n }\n\n /** Find a specific element in this collection. */\n find(callback: (value: V, key: K) => boolean): NonNullable<V> | undefined {\n for (const key of this.keys()) {\n const value = this.get(key)!\n if (callback(value, key)) return value\n }\n // If nothing matched\n }\n\n /** Find all elements in this collection that match the given pattern. */\n filter(callback: (value: V, key: K) => boolean): Collection<K, V> {\n const relevant = new Collection<K, V>()\n this.forEach((value, key) => {\n if (callback(value, key)) relevant.set(key, value)\n })\n\n return relevant\n }\n\n /** Converts the collection into an array by running a callback on all items in the collection. */\n map<T>(callback: (value: V, key: K) => T): T[] {\n const results = []\n for (const key of this.keys()) {\n const value = this.get(key)!\n results.push(callback(value, key))\n }\n return results\n }\n\n /** Check if one of the items in the collection matches the pattern. */\n some(callback: (value: V, key: K) => boolean): boolean {\n for (const key of this.keys()) {\n const value = this.get(key)!\n if (callback(value, key)) return true\n }\n\n return false\n }\n\n /** Check if all of the items in the collection matches the pattern. */\n every(callback: (value: V, key: K) => boolean): boolean {\n for (const key of this.keys()) {\n const value = this.get(key)!\n if (!callback(value, key)) return false\n }\n\n return true\n }\n\n /** Runs a callback on all items in the collection, merging them into a single value. */\n reduce<T>(callback: (accumulator: T, value: V, key: K) => T, initialValue?: T): T {\n let accumulator: T = initialValue!\n\n for (const key of this.keys()) {\n const value = this.get(key)!\n accumulator = callback(accumulator, value, key)\n }\n\n return accumulator\n }\n}\n\nexport interface CollectionOptions<K, V> {\n /** Handler to clean out the items in the collection every so often. */\n sweeper?: CollectionSweeper<K, V>\n /** The maximum number of items allowed in the collection. */\n maxSize?: number\n}\n\nexport interface CollectionSweeper<K, V> {\n /** The filter to determine whether an element should be deleted or not */\n filter: (value: V, key: K, ...args: any[]) => boolean\n /** The interval in which the sweeper should run */\n interval: number\n /** The bot object itself */\n bot?: PlaceHolderBot\n}\n"],"names":["Collection","Map","constructor","entries","options","maxSize","sweeper","startSweeper","intervalId","clearInterval","setInterval","forEach","value","key","filter","bot","delete","interval","stopSweeper","changeSweeperInterval","newInterval","changeSweeperFilter","newFilter","set","undefined","size","forceSet","array","values","first","next","last","random","Math","floor","length","find","callback","keys","get","relevant","map","results","push","some","every","reduce","initialValue","accumulator"],"mappings":"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"}
package/dist/base64.js CHANGED
@@ -1,2 +1,262 @@
1
- export function encode(e){let t;let n="string"==typeof e?new TextEncoder().encode(e):e instanceof Uint8Array?e:new Uint8Array(e),o="",a=n.length;for(t=2;t<a;t+=3)o+=r[n[t-2]>>2]+r[(3&n[t-2])<<4|n[t-1]>>4]+r[(15&n[t-1])<<2|n[t]>>6]+r[63&n[t]];return t===a+1&&(o+=r[n[t-2]>>2]+r[(3&n[t-2])<<4]+"=="),t===a&&(o+=r[n[t-2]>>2]+r[(3&n[t-2])<<4|n[t-1]>>4]+r[(15&n[t-1])<<2]+"="),o}export function decode(r){let t;if(r.length%4!=0)throw Error("Unable to parse base64 string.");let n=r.indexOf("=");if(-1!==n&&n<r.length-2)throw Error("Unable to parse base64 string.");let o=r.endsWith("==")?2:r.endsWith("=")?1:0,a=r.length,i=new Uint8Array(3*(a/4));for(let l=0,s=0;l<a;l+=4,s+=3)t=e(r.charCodeAt(l))<<18|e(r.charCodeAt(l+1))<<12|e(r.charCodeAt(l+2))<<6|e(r.charCodeAt(l+3)),i[s]=t>>16,i[s+1]=t>>8&255,i[s+2]=255&t;return i.subarray(0,i.length-o)}function e(e){if(e>=t.length)throw Error("Unable to parse base64 string.");let r=t[e];if(255===r)throw Error("Unable to parse base64 string.");return r}let r=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"],t=[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,62,255,255,255,63,52,53,54,55,56,57,58,59,60,61,255,255,255,0,255,255,255,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,255,255,255,255,255,255,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51];
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlNjQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDUkVESVQ6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2VuZXBvbW55YXNjaGloLzcyYzQyM2Y3MjdkMzk1ZWVhYTA5Njk3MDU4MjM4NzI3XG4gKiBFbmNvZGVzIGEgZ2l2ZW4gVWludDhBcnJheSwgQXJyYXlCdWZmZXIgb3Igc3RyaW5nIGludG8gUkZDNDY0OCBiYXNlNjQgcmVwcmVzZW50YXRpb25cbiAqIEBwYXJhbSBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGUoZGF0YTogQXJyYXlCdWZmZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB1aW50OCA9IHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkYXRhKSA6IGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gZGF0YSA6IG5ldyBVaW50OEFycmF5KGRhdGEpXG4gIGxldCByZXN1bHQgPSAnJ1xuICBsZXQgaVxuICBjb25zdCBsID0gdWludDgubGVuZ3RoXG4gIGZvciAoaSA9IDI7IGkgPCBsOyBpICs9IDMpIHtcbiAgICByZXN1bHQgKz0gYmFzZTY0YWJjW3VpbnQ4W2kgLSAyXSA+PiAyXVxuICAgIHJlc3VsdCArPSBiYXNlNjRhYmNbKCh1aW50OFtpIC0gMl0gJiAweDAzKSA8PCA0KSB8ICh1aW50OFtpIC0gMV0gPj4gNCldXG4gICAgcmVzdWx0ICs9IGJhc2U2NGFiY1soKHVpbnQ4W2kgLSAxXSAmIDB4MGYpIDw8IDIpIHwgKHVpbnQ4W2ldID4+IDYpXVxuICAgIHJlc3VsdCArPSBiYXNlNjRhYmNbdWludDhbaV0gJiAweDNmXVxuICB9XG4gIGlmIChpID09PSBsICsgMSkge1xuICAgIC8vIDEgb2N0ZXQgeWV0IHRvIHdyaXRlXG4gICAgcmVzdWx0ICs9IGJhc2U2NGFiY1t1aW50OFtpIC0gMl0gPj4gMl1cbiAgICByZXN1bHQgKz0gYmFzZTY0YWJjWyh1aW50OFtpIC0gMl0gJiAweDAzKSA8PCA0XVxuICAgIHJlc3VsdCArPSAnPT0nXG4gIH1cbiAgaWYgKGkgPT09IGwpIHtcbiAgICAvLyAyIG9jdGV0cyB5ZXQgdG8gd3JpdGVcbiAgICByZXN1bHQgKz0gYmFzZTY0YWJjW3VpbnQ4W2kgLSAyXSA+PiAyXVxuICAgIHJlc3VsdCArPSBiYXNlNjRhYmNbKCh1aW50OFtpIC0gMl0gJiAweDAzKSA8PCA0KSB8ICh1aW50OFtpIC0gMV0gPj4gNCldXG4gICAgcmVzdWx0ICs9IGJhc2U2NGFiY1sodWludDhbaSAtIDFdICYgMHgwZikgPDwgMl1cbiAgICByZXN1bHQgKz0gJz0nXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIENSRURJVDogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZW5lcG9tbnlhc2NoaWgvNzJjNDIzZjcyN2QzOTVlZWFhMDk2OTcwNTgyMzg3MjdcbiAqIERlY29kZXMgUkZDNDY0OCBiYXNlNjQgc3RyaW5nIGludG8gYW4gVWludDhBcnJheVxuICogQHBhcmFtIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShkYXRhOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgaWYgKGRhdGEubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIGJhc2U2NCBzdHJpbmcuJylcbiAgfVxuICBjb25zdCBpbmRleCA9IGRhdGEuaW5kZXhPZignPScpXG4gIGlmIChpbmRleCAhPT0gLTEgJiYgaW5kZXggPCBkYXRhLmxlbmd0aCAtIDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBiYXNlNjQgc3RyaW5nLicpXG4gIH1cbiAgY29uc3QgbWlzc2luZ09jdGV0cyA9IGRhdGEuZW5kc1dpdGgoJz09JykgPyAyIDogZGF0YS5lbmRzV2l0aCgnPScpID8gMSA6IDBcbiAgY29uc3QgbiA9IGRhdGEubGVuZ3RoXG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KDMgKiAobiAvIDQpKVxuICBsZXQgYnVmZmVyXG4gIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IG47IGkgKz0gNCwgaiArPSAzKSB7XG4gICAgYnVmZmVyID1cbiAgICAgIChnZXRCYXNlNjRDb2RlKGRhdGEuY2hhckNvZGVBdChpKSkgPDwgMTgpIHxcbiAgICAgIChnZXRCYXNlNjRDb2RlKGRhdGEuY2hhckNvZGVBdChpICsgMSkpIDw8IDEyKSB8XG4gICAgICAoZ2V0QmFzZTY0Q29kZShkYXRhLmNoYXJDb2RlQXQoaSArIDIpKSA8PCA2KSB8XG4gICAgICBnZXRCYXNlNjRDb2RlKGRhdGEuY2hhckNvZGVBdChpICsgMykpXG4gICAgcmVzdWx0W2pdID0gYnVmZmVyID4+IDE2XG4gICAgcmVzdWx0W2ogKyAxXSA9IChidWZmZXIgPj4gOCkgJiAweGZmXG4gICAgcmVzdWx0W2ogKyAyXSA9IGJ1ZmZlciAmIDB4ZmZcbiAgfVxuICByZXR1cm4gcmVzdWx0LnN1YmFycmF5KDAsIHJlc3VsdC5sZW5ndGggLSBtaXNzaW5nT2N0ZXRzKVxufVxuXG4vKipcbiAqIENSRURJVDogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZW5lcG9tbnlhc2NoaWgvNzJjNDIzZjcyN2QzOTVlZWFhMDk2OTcwNTgyMzg3MjdcbiAqIEBwYXJhbSBjaGFyQ29kZVxuICovXG5mdW5jdGlvbiBnZXRCYXNlNjRDb2RlKGNoYXJDb2RlOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoY2hhckNvZGUgPj0gYmFzZTY0Y29kZXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgYmFzZTY0IHN0cmluZy4nKVxuICB9XG4gIGNvbnN0IGNvZGUgPSBiYXNlNjRjb2Rlc1tjaGFyQ29kZV1cbiAgaWYgKGNvZGUgPT09IDI1NSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIGJhc2U2NCBzdHJpbmcuJylcbiAgfVxuICByZXR1cm4gY29kZVxufVxuXG4vLyBDb3B5cmlnaHQgMjAxOC0yMDIxIHRoZSBEZW5vIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE1JVCBsaWNlbnNlLlxuY29uc3QgYmFzZTY0YWJjID0gW1xuICAnQScsXG4gICdCJyxcbiAgJ0MnLFxuICAnRCcsXG4gICdFJyxcbiAgJ0YnLFxuICAnRycsXG4gICdIJyxcbiAgJ0knLFxuICAnSicsXG4gICdLJyxcbiAgJ0wnLFxuICAnTScsXG4gICdOJyxcbiAgJ08nLFxuICAnUCcsXG4gICdRJyxcbiAgJ1InLFxuICAnUycsXG4gICdUJyxcbiAgJ1UnLFxuICAnVicsXG4gICdXJyxcbiAgJ1gnLFxuICAnWScsXG4gICdaJyxcbiAgJ2EnLFxuICAnYicsXG4gICdjJyxcbiAgJ2QnLFxuICAnZScsXG4gICdmJyxcbiAgJ2cnLFxuICAnaCcsXG4gICdpJyxcbiAgJ2onLFxuICAnaycsXG4gICdsJyxcbiAgJ20nLFxuICAnbicsXG4gICdvJyxcbiAgJ3AnLFxuICAncScsXG4gICdyJyxcbiAgJ3MnLFxuICAndCcsXG4gICd1JyxcbiAgJ3YnLFxuICAndycsXG4gICd4JyxcbiAgJ3knLFxuICAneicsXG4gICcwJyxcbiAgJzEnLFxuICAnMicsXG4gICczJyxcbiAgJzQnLFxuICAnNScsXG4gICc2JyxcbiAgJzcnLFxuICAnOCcsXG4gICc5JyxcbiAgJysnLFxuICAnLycsXG5dXG5cbi8vIENSRURJVDogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZW5lcG9tbnlhc2NoaWgvNzJjNDIzZjcyN2QzOTVlZWFhMDk2OTcwNTgyMzg3MjdcbmNvbnN0IGJhc2U2NGNvZGVzID0gW1xuICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSxcbiAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDYyLCAyNTUsIDI1NSwgMjU1LCA2MywgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDI1NSwgMjU1LCAyNTUsXG4gIDAsIDI1NSwgMjU1LCAyNTUsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNixcbiAgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsXG5dXG4iXSwibmFtZXMiOlsiZW5jb2RlIiwiZGF0YSIsImkiLCJ1aW50OCIsIlRleHRFbmNvZGVyIiwiVWludDhBcnJheSIsInJlc3VsdCIsImwiLCJsZW5ndGgiLCJiYXNlNjRhYmMiLCJkZWNvZGUiLCJidWZmZXIiLCJFcnJvciIsImluZGV4IiwiaW5kZXhPZiIsIm1pc3NpbmdPY3RldHMiLCJlbmRzV2l0aCIsIm4iLCJqIiwiZ2V0QmFzZTY0Q29kZSIsImNoYXJDb2RlQXQiLCJzdWJhcnJheSIsImNoYXJDb2RlIiwiYmFzZTY0Y29kZXMiLCJjb2RlIl0sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLFNBQVNBLE9BQU9DLENBQTBCLENBQVUsS0FHckRDLEVBRkosSUFBTUMsRUFBUSxBQUFnQixVQUFoQixPQUFPRixFQUFvQixJQUFJRyxjQUFjSixNQUFNLENBQUNDLEdBQVFBLGFBQWdCSSxXQUFhSixFQUFPLElBQUlJLFdBQVdKLEVBQUssQ0FDOUhLLEVBQVMsR0FFUEMsRUFBSUosRUFBTUssTUFBTSxDQUN0QixJQUFLTixFQUFJLEVBQUdBLEVBQUlLLEVBQUdMLEdBQUssRUFJdEJJLEdBSFVHLENBQVMsQ0FBQ04sQ0FBSyxDQUFDRCxFQUFJLEVBQUUsRUFBSSxFQUFFLENBQzVCTyxDQUFTLENBQUMsQUFBRU4sQ0FBQUEsQUFBZSxFQUFmQSxDQUFLLENBQUNELEVBQUksRUFBRSxBQUFNLEdBQU0sRUFBTUMsQ0FBSyxDQUFDRCxFQUFJLEVBQUUsRUFBSSxFQUFHLENBQzdETyxDQUFTLENBQUMsQUFBRU4sQ0FBQUEsQUFBZSxHQUFmQSxDQUFLLENBQUNELEVBQUksRUFBRSxBQUFNLEdBQU0sRUFBTUMsQ0FBSyxDQUFDRCxFQUFFLEVBQUksRUFBRyxDQUN6RE8sQ0FBUyxDQUFDTixBQUFXLEdBQVhBLENBQUssQ0FBQ0QsRUFBRSxDQUFRLENBZXRDLE9BYklBLElBQU1LLEVBQUksR0FJWkQsQ0FBQUEsR0FGVUcsQ0FBUyxDQUFDTixDQUFLLENBQUNELEVBQUksRUFBRSxFQUFJLEVBQUUsQ0FDNUJPLENBQVMsQ0FBQyxBQUFDTixDQUFBQSxBQUFlLEVBQWZBLENBQUssQ0FBQ0QsRUFBSSxFQUFFLEFBQU0sR0FBTSxFQUFFLENBQ3JDLElBQUcsRUFFWEEsSUFBTUssR0FLUkQsQ0FBQUEsR0FIVUcsQ0FBUyxDQUFDTixDQUFLLENBQUNELEVBQUksRUFBRSxFQUFJLEVBQUUsQ0FDNUJPLENBQVMsQ0FBQyxBQUFFTixDQUFBQSxBQUFlLEVBQWZBLENBQUssQ0FBQ0QsRUFBSSxFQUFFLEFBQU0sR0FBTSxFQUFNQyxDQUFLLENBQUNELEVBQUksRUFBRSxFQUFJLEVBQUcsQ0FDN0RPLENBQVMsQ0FBQyxBQUFDTixDQUFBQSxBQUFlLEdBQWZBLENBQUssQ0FBQ0QsRUFBSSxFQUFFLEFBQU0sR0FBTSxFQUFFLENBQ3JDLEdBQUUsRUFFUEksQ0FDVCxDQUFDLEFBT0QsT0FBTyxTQUFTSSxPQUFPVCxDQUFZLENBQWMsS0FXM0NVLEVBVkosR0FBSVYsRUFBS08sTUFBTSxDQUFHLEdBQU0sRUFDdEIsTUFBTSxBQUFJSSxNQUFNLGlDQUFpQyxBQUNsRCxDQUNELElBQU1DLEVBQVFaLEVBQUthLE9BQU8sQ0FBQyxLQUMzQixHQUFJRCxBQUFVLEtBQVZBLEdBQWdCQSxFQUFRWixFQUFLTyxNQUFNLENBQUcsRUFDeEMsTUFBTSxBQUFJSSxNQUFNLGlDQUFpQyxBQUNsRCxDQUNELElBQU1HLEVBQWdCZCxFQUFLZSxRQUFRLENBQUMsTUFBUSxFQUFJZixFQUFLZSxRQUFRLENBQUMsS0FBTyxFQUFJLENBQUMsQ0FDcEVDLEVBQUloQixFQUFLTyxNQUFNLENBQ2ZGLEVBQVMsSUFBSUQsV0FBVyxFQUFLWSxDQUFBQSxFQUFJLENBQUEsR0FFdkMsSUFBSyxJQUFJZixFQUFJLEVBQUdnQixFQUFJLEVBQUdoQixFQUFJZSxFQUFHZixHQUFLLEVBQUdnQixHQUFLLENBQUMsQ0FDMUNQLEVBQ0UsQUFBQ1EsRUFBY2xCLEVBQUttQixVQUFVLENBQUNsQixLQUFPLEdBQ3JDaUIsRUFBY2xCLEVBQUttQixVQUFVLENBQUNsQixFQUFJLEtBQU8sR0FDekNpQixFQUFjbEIsRUFBS21CLFVBQVUsQ0FBQ2xCLEVBQUksS0FBTyxFQUMxQ2lCLEVBQWNsQixFQUFLbUIsVUFBVSxDQUFDbEIsRUFBSSxJQUNwQ0ksQ0FBTSxDQUFDWSxFQUFFLENBQUdQLEdBQVUsR0FDdEJMLENBQU0sQ0FBQ1ksRUFBSSxFQUFFLENBQUcsQUFBQ1AsR0FBVSxFQUFLLElBQ2hDTCxDQUFNLENBQUNZLEVBQUksRUFBRSxDQUFHUCxBQUFTLElBQVRBLEVBRWxCLE9BQU9MLEVBQU9lLFFBQVEsQ0FBQyxFQUFHZixFQUFPRSxNQUFNLENBQUdPLEVBQzVDLENBQUMsQUFNRCxTQUFTSSxFQUFjRyxDQUFnQixDQUFVLENBQy9DLEdBQUlBLEdBQVlDLEVBQVlmLE1BQU0sQ0FDaEMsTUFBTSxBQUFJSSxNQUFNLGlDQUFpQyxBQUNsRCxDQUNELElBQU1ZLEVBQU9ELENBQVcsQ0FBQ0QsRUFBUyxDQUNsQyxHQUFJRSxBQUFTLE1BQVRBLEVBQ0YsTUFBTSxBQUFJWixNQUFNLGlDQUFpQyxBQUNsRCxDQUNELE9BQU9ZLENBQ1QsQ0FHQSxJQUFNZixFQUFZLENBQ2hCLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0QsQ0FHS2MsRUFBYyxDQUNsQixJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQzVJLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssSUFBSyxHQUFJLElBQUssSUFBSyxJQUFLLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxJQUFLLElBQUssSUFDL0ksRUFBRyxJQUFLLElBQUssSUFBSyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksSUFBSyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssR0FDOUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FDakcifQ==
1
+ /**
2
+ * CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727
3
+ * Encodes a given Uint8Array, ArrayBuffer or string into RFC4648 base64 representation
4
+ * @param data
5
+ */ export function encode(data) {
6
+ const uint8 = typeof data === 'string' ? new TextEncoder().encode(data) : data instanceof Uint8Array ? data : new Uint8Array(data);
7
+ let result = '';
8
+ let i;
9
+ const l = uint8.length;
10
+ for(i = 2; i < l; i += 3){
11
+ result += base64abc[uint8[i - 2] >> 2];
12
+ result += base64abc[(uint8[i - 2] & 0x03) << 4 | uint8[i - 1] >> 4];
13
+ result += base64abc[(uint8[i - 1] & 0x0f) << 2 | uint8[i] >> 6];
14
+ result += base64abc[uint8[i] & 0x3f];
15
+ }
16
+ if (i === l + 1) {
17
+ // 1 octet yet to write
18
+ result += base64abc[uint8[i - 2] >> 2];
19
+ result += base64abc[(uint8[i - 2] & 0x03) << 4];
20
+ result += '==';
21
+ }
22
+ if (i === l) {
23
+ // 2 octets yet to write
24
+ result += base64abc[uint8[i - 2] >> 2];
25
+ result += base64abc[(uint8[i - 2] & 0x03) << 4 | uint8[i - 1] >> 4];
26
+ result += base64abc[(uint8[i - 1] & 0x0f) << 2];
27
+ result += '=';
28
+ }
29
+ return result;
30
+ }
31
+ /**
32
+ * CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727
33
+ * Decodes RFC4648 base64 string into an Uint8Array
34
+ * @param data
35
+ */ export function decode(data) {
36
+ if (data.length % 4 !== 0) {
37
+ throw new Error('Unable to parse base64 string.');
38
+ }
39
+ const index = data.indexOf('=');
40
+ if (index !== -1 && index < data.length - 2) {
41
+ throw new Error('Unable to parse base64 string.');
42
+ }
43
+ const missingOctets = data.endsWith('==') ? 2 : data.endsWith('=') ? 1 : 0;
44
+ const n = data.length;
45
+ const result = new Uint8Array(3 * (n / 4));
46
+ let buffer;
47
+ for(let i = 0, j = 0; i < n; i += 4, j += 3){
48
+ buffer = getBase64Code(data.charCodeAt(i)) << 18 | getBase64Code(data.charCodeAt(i + 1)) << 12 | getBase64Code(data.charCodeAt(i + 2)) << 6 | getBase64Code(data.charCodeAt(i + 3));
49
+ result[j] = buffer >> 16;
50
+ result[j + 1] = buffer >> 8 & 0xff;
51
+ result[j + 2] = buffer & 0xff;
52
+ }
53
+ return result.subarray(0, result.length - missingOctets);
54
+ }
55
+ /**
56
+ * CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727
57
+ * @param charCode
58
+ */ function getBase64Code(charCode) {
59
+ if (charCode >= base64codes.length) {
60
+ throw new Error('Unable to parse base64 string.');
61
+ }
62
+ const code = base64codes[charCode];
63
+ if (code === 255) {
64
+ throw new Error('Unable to parse base64 string.');
65
+ }
66
+ return code;
67
+ }
68
+ // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
69
+ const base64abc = [
70
+ 'A',
71
+ 'B',
72
+ 'C',
73
+ 'D',
74
+ 'E',
75
+ 'F',
76
+ 'G',
77
+ 'H',
78
+ 'I',
79
+ 'J',
80
+ 'K',
81
+ 'L',
82
+ 'M',
83
+ 'N',
84
+ 'O',
85
+ 'P',
86
+ 'Q',
87
+ 'R',
88
+ 'S',
89
+ 'T',
90
+ 'U',
91
+ 'V',
92
+ 'W',
93
+ 'X',
94
+ 'Y',
95
+ 'Z',
96
+ 'a',
97
+ 'b',
98
+ 'c',
99
+ 'd',
100
+ 'e',
101
+ 'f',
102
+ 'g',
103
+ 'h',
104
+ 'i',
105
+ 'j',
106
+ 'k',
107
+ 'l',
108
+ 'm',
109
+ 'n',
110
+ 'o',
111
+ 'p',
112
+ 'q',
113
+ 'r',
114
+ 's',
115
+ 't',
116
+ 'u',
117
+ 'v',
118
+ 'w',
119
+ 'x',
120
+ 'y',
121
+ 'z',
122
+ '0',
123
+ '1',
124
+ '2',
125
+ '3',
126
+ '4',
127
+ '5',
128
+ '6',
129
+ '7',
130
+ '8',
131
+ '9',
132
+ '+',
133
+ '/'
134
+ ];
135
+ // CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727
136
+ const base64codes = [
137
+ 255,
138
+ 255,
139
+ 255,
140
+ 255,
141
+ 255,
142
+ 255,
143
+ 255,
144
+ 255,
145
+ 255,
146
+ 255,
147
+ 255,
148
+ 255,
149
+ 255,
150
+ 255,
151
+ 255,
152
+ 255,
153
+ 255,
154
+ 255,
155
+ 255,
156
+ 255,
157
+ 255,
158
+ 255,
159
+ 255,
160
+ 255,
161
+ 255,
162
+ 255,
163
+ 255,
164
+ 255,
165
+ 255,
166
+ 255,
167
+ 255,
168
+ 255,
169
+ 255,
170
+ 255,
171
+ 255,
172
+ 255,
173
+ 255,
174
+ 255,
175
+ 255,
176
+ 255,
177
+ 255,
178
+ 255,
179
+ 255,
180
+ 62,
181
+ 255,
182
+ 255,
183
+ 255,
184
+ 63,
185
+ 52,
186
+ 53,
187
+ 54,
188
+ 55,
189
+ 56,
190
+ 57,
191
+ 58,
192
+ 59,
193
+ 60,
194
+ 61,
195
+ 255,
196
+ 255,
197
+ 255,
198
+ 0,
199
+ 255,
200
+ 255,
201
+ 255,
202
+ 0,
203
+ 1,
204
+ 2,
205
+ 3,
206
+ 4,
207
+ 5,
208
+ 6,
209
+ 7,
210
+ 8,
211
+ 9,
212
+ 10,
213
+ 11,
214
+ 12,
215
+ 13,
216
+ 14,
217
+ 15,
218
+ 16,
219
+ 17,
220
+ 18,
221
+ 19,
222
+ 20,
223
+ 21,
224
+ 22,
225
+ 23,
226
+ 24,
227
+ 25,
228
+ 255,
229
+ 255,
230
+ 255,
231
+ 255,
232
+ 255,
233
+ 255,
234
+ 26,
235
+ 27,
236
+ 28,
237
+ 29,
238
+ 30,
239
+ 31,
240
+ 32,
241
+ 33,
242
+ 34,
243
+ 35,
244
+ 36,
245
+ 37,
246
+ 38,
247
+ 39,
248
+ 40,
249
+ 41,
250
+ 42,
251
+ 43,
252
+ 44,
253
+ 45,
254
+ 46,
255
+ 47,
256
+ 48,
257
+ 49,
258
+ 50,
259
+ 51
260
+ ];
261
+
262
+ //# sourceMappingURL=base64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/base64.ts"],"sourcesContent":["/**\n * CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727\n * Encodes a given Uint8Array, ArrayBuffer or string into RFC4648 base64 representation\n * @param data\n */\nexport function encode(data: ArrayBuffer | string): string {\n const uint8 = typeof data === 'string' ? new TextEncoder().encode(data) : data instanceof Uint8Array ? data : new Uint8Array(data)\n let result = ''\n let i\n const l = uint8.length\n for (i = 2; i < l; i += 3) {\n result += base64abc[uint8[i - 2] >> 2]\n result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)]\n result += base64abc[((uint8[i - 1] & 0x0f) << 2) | (uint8[i] >> 6)]\n result += base64abc[uint8[i] & 0x3f]\n }\n if (i === l + 1) {\n // 1 octet yet to write\n result += base64abc[uint8[i - 2] >> 2]\n result += base64abc[(uint8[i - 2] & 0x03) << 4]\n result += '=='\n }\n if (i === l) {\n // 2 octets yet to write\n result += base64abc[uint8[i - 2] >> 2]\n result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)]\n result += base64abc[(uint8[i - 1] & 0x0f) << 2]\n result += '='\n }\n return result\n}\n\n/**\n * CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727\n * Decodes RFC4648 base64 string into an Uint8Array\n * @param data\n */\nexport function decode(data: string): Uint8Array {\n if (data.length % 4 !== 0) {\n throw new Error('Unable to parse base64 string.')\n }\n const index = data.indexOf('=')\n if (index !== -1 && index < data.length - 2) {\n throw new Error('Unable to parse base64 string.')\n }\n const missingOctets = data.endsWith('==') ? 2 : data.endsWith('=') ? 1 : 0\n const n = data.length\n const result = new Uint8Array(3 * (n / 4))\n let buffer\n for (let i = 0, j = 0; i < n; i += 4, j += 3) {\n buffer =\n (getBase64Code(data.charCodeAt(i)) << 18) |\n (getBase64Code(data.charCodeAt(i + 1)) << 12) |\n (getBase64Code(data.charCodeAt(i + 2)) << 6) |\n getBase64Code(data.charCodeAt(i + 3))\n result[j] = buffer >> 16\n result[j + 1] = (buffer >> 8) & 0xff\n result[j + 2] = buffer & 0xff\n }\n return result.subarray(0, result.length - missingOctets)\n}\n\n/**\n * CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727\n * @param charCode\n */\nfunction getBase64Code(charCode: number): number {\n if (charCode >= base64codes.length) {\n throw new Error('Unable to parse base64 string.')\n }\n const code = base64codes[charCode]\n if (code === 255) {\n throw new Error('Unable to parse base64 string.')\n }\n return code\n}\n\n// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.\nconst base64abc = [\n 'A',\n 'B',\n 'C',\n 'D',\n 'E',\n 'F',\n 'G',\n 'H',\n 'I',\n 'J',\n 'K',\n 'L',\n 'M',\n 'N',\n 'O',\n 'P',\n 'Q',\n 'R',\n 'S',\n 'T',\n 'U',\n 'V',\n 'W',\n 'X',\n 'Y',\n 'Z',\n 'a',\n 'b',\n 'c',\n 'd',\n 'e',\n 'f',\n 'g',\n 'h',\n 'i',\n 'j',\n 'k',\n 'l',\n 'm',\n 'n',\n 'o',\n 'p',\n 'q',\n 'r',\n 's',\n 't',\n 'u',\n 'v',\n 'w',\n 'x',\n 'y',\n 'z',\n '0',\n '1',\n '2',\n '3',\n '4',\n '5',\n '6',\n '7',\n '8',\n '9',\n '+',\n '/',\n]\n\n// CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727\nconst base64codes = [\n 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255,\n 0, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, 255, 26,\n 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,\n]\n"],"names":["encode","data","uint8","TextEncoder","Uint8Array","result","i","l","length","base64abc","decode","Error","index","indexOf","missingOctets","endsWith","n","buffer","j","getBase64Code","charCodeAt","subarray","charCode","base64codes","code"],"mappings":"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"}
package/dist/bucket.d.ts CHANGED
@@ -1,55 +1,41 @@
1
- import type { PickPartial } from '@discordeno/types';
2
- /** A Leaky Bucket.
3
- * Useful for rate limiting purposes.
4
- * This uses `performance.now()` instead of `Date.now()` for higher accuracy.
5
- *
6
- * NOTE: This bucket is lazy, means it only updates when a related method is called.
7
- */
8
- export interface LeakyBucket {
9
- /** How many tokens this bucket can hold. */
1
+ /// <reference types="node" />
2
+ export declare class LeakyBucket implements LeakyBucketOptions {
10
3
  max: number;
11
- /** Amount of tokens gained per interval.
12
- * If bigger than `max` it will be pressed to `max`.
13
- */
14
- refillAmount: number;
15
- /** Interval at which the bucket gains tokens. */
16
4
  refillInterval: number;
17
- /** Acquire tokens from the bucket.
18
- * Resolves when the tokens are acquired and available.
19
- * @param {boolean} [highPriority=false] Whether this acquire is should be done asap.
20
- */
21
- acquire: (amount: number, highPriority?: boolean) => Promise<void>;
22
- /** Returns the number of milliseconds until the next refill. */
23
- nextRefill: () => number;
24
- /** Current tokens in the bucket. */
25
- tokens: () => number;
26
- /** @private Internal track of when the last refill of tokens was.
27
- * DO NOT TOUCH THIS! Unless you know what you are doing ofc :P
28
- */
29
- lastRefill: number;
30
- /** @private Internal state of whether currently it is allowed to acquire tokens.
31
- * DO NOT TOUCH THIS! Unless you know what you are doing ofc :P
5
+ refillAmount: number;
6
+ /** The amount of requests that have been used up already. */
7
+ used: number;
8
+ /** The queue of requests to acquire an available request. Mapped by <shardId, resolve()> */
9
+ queue: Array<(value: void | PromiseLike<void>) => void>;
10
+ /** Whether or not the queue is already processing. */
11
+ processing: boolean;
12
+ /** The timeout id for the timer to reduce the used amount by the refill amount. */
13
+ timeoutId?: NodeJS.Timeout;
14
+ /** The timestamp in milliseconds when the next refill is scheduled. */
15
+ refillsAt?: number;
16
+ constructor(options?: LeakyBucketOptions);
17
+ /** The amount of requests that still remain. */
18
+ get remaining(): number;
19
+ /** Begin processing the queue. */
20
+ processQueue(): Promise<void>;
21
+ /** Pauses the execution until the request is available to be made. */
22
+ acquire(highPriority?: boolean): Promise<void>;
23
+ }
24
+ export interface LeakyBucketOptions {
25
+ /**
26
+ * Max requests allowed at once.
27
+ * @default 1
32
28
  */
33
- allowAcquire: boolean;
34
- /** @private Internal number of currently available tokens.
35
- * DO NOT TOUCH THIS! Unless you know what you are doing ofc :P
29
+ max?: number;
30
+ /**
31
+ * Interval in milliseconds between refills.
32
+ * @default 5000
36
33
  */
37
- tokensState: number;
38
- /** @private Internal array of promises necessary to guarantee no race conditions.
39
- * DO NOT TOUCH THIS! Unless you know what you are doing ofc :P
34
+ refillInterval?: number;
35
+ /**
36
+ * Amount of requests to refill at each interval.
37
+ * @default 1
40
38
  */
41
- waiting: Array<(_?: unknown) => void>;
39
+ refillAmount?: number;
42
40
  }
43
- export declare function createLeakyBucket({ max, refillInterval, refillAmount, tokens, waiting, ...rest }: Omit<PickPartial<LeakyBucket, 'max' | 'refillInterval' | 'refillAmount'>, 'tokens'> & {
44
- /** Current tokens in the bucket.
45
- * @default max
46
- */
47
- tokens?: number;
48
- }): LeakyBucket;
49
- /** Update the tokens of that bucket.
50
- * @returns {number} The amount of current available tokens.
51
- */
52
- export declare function updateTokens(bucket: LeakyBucket): number;
53
- export declare function nextRefill(bucket: LeakyBucket): number;
54
- export declare function acquire(bucket: LeakyBucket, amount: number, highPriority?: boolean): Promise<void>;
55
41
  //# sourceMappingURL=bucket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bucket.d.ts","sourceRoot":"","sources":["../src/bucket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAGpD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAA;IACX;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;IACpB,iDAAiD;IACjD,cAAc,EAAE,MAAM,CAAA;IAEtB;;;OAGG;IACH,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAElE,gEAAgE;IAChE,UAAU,EAAE,MAAM,MAAM,CAAA;IAExB,oCAAoC;IACpC,MAAM,EAAE,MAAM,MAAM,CAAA;IAEpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB;;OAEG;IACH,YAAY,EAAE,OAAO,CAAA;IAErB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,CAAA;CACtC;AAED,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,cAAc,EACd,YAAY,EACZ,MAAM,EACN,OAAO,EACP,GAAG,IAAI,EACR,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,GAAG,gBAAgB,GAAG,cAAc,CAAC,EAAE,QAAQ,CAAC,GAAG;IACvF;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,GAAG,WAAW,CAyBd;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CASxD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAKtD;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CtG"}
1
+ {"version":3,"file":"bucket.d.ts","sourceRoot":"","sources":["../src/bucket.ts"],"names":[],"mappings":";AAGA,qBAAa,WAAY,YAAW,kBAAkB;IACpD,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IAEpB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAI;IAChB,4FAA4F;IAC5F,KAAK,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAK;IAC5D,sDAAsD;IACtD,UAAU,EAAE,OAAO,CAAQ;IAC3B,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA;IAC1B,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAA;gBAEN,OAAO,CAAC,EAAE,kBAAkB;IAMxC,gDAAgD;IAChD,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,kCAAkC;IAC5B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAgDnC,sEAAsE;IAChE,OAAO,CAAC,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAWrD;AAED,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB"}