dl-once 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -28
  3. package/dist/_bytes-builder.d.ts +34 -0
  4. package/dist/_bytes-builder.d.ts.map +1 -0
  5. package/dist/_bytes-builder.js +48 -0
  6. package/dist/cache-storage.d.ts +74 -0
  7. package/dist/cache-storage.d.ts.map +1 -0
  8. package/dist/cache-storage.js +1 -0
  9. package/dist/dl-once.d.ts +242 -0
  10. package/dist/dl-once.d.ts.map +1 -0
  11. package/dist/dl-once.js +245 -0
  12. package/dist/hash-verification-hook.d.ts +46 -0
  13. package/dist/hash-verification-hook.d.ts.map +1 -0
  14. package/dist/hash-verification-hook.js +97 -0
  15. package/dist/index.d.ts +16 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +8 -0
  18. package/dist/indexeddb-cache-storage.d.ts +51 -0
  19. package/dist/indexeddb-cache-storage.d.ts.map +1 -0
  20. package/dist/indexeddb-cache-storage.js +573 -0
  21. package/dist/md5-verification-hook.d.ts +15 -0
  22. package/dist/md5-verification-hook.d.ts.map +1 -0
  23. package/dist/md5-verification-hook.js +17 -0
  24. package/dist/memory-cache-storage.d.ts +41 -0
  25. package/dist/memory-cache-storage.d.ts.map +1 -0
  26. package/dist/memory-cache-storage.js +290 -0
  27. package/dist/node-fs-cache-storage.d.ts +63 -0
  28. package/dist/node-fs-cache-storage.d.ts.map +1 -0
  29. package/dist/node-fs-cache-storage.js +565 -0
  30. package/dist/sha256-verification-hook.d.ts +15 -0
  31. package/dist/sha256-verification-hook.d.ts.map +1 -0
  32. package/dist/sha256-verification-hook.js +17 -0
  33. package/package.json +46 -7
  34. package/src/_bytes-builder.ts +66 -0
  35. package/src/cache-storage.ts +86 -0
  36. package/src/dl-once.ts +554 -0
  37. package/src/hash-verification-hook.ts +98 -0
  38. package/src/index.ts +28 -0
  39. package/src/indexeddb-cache-storage.ts +535 -0
  40. package/src/md5-verification-hook.ts +18 -0
  41. package/src/memory-cache-storage.ts +361 -0
  42. package/src/node-fs-cache-storage.ts +511 -0
  43. package/src/sha256-verification-hook.ts +18 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2026-present, tai-kun
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
package/README.md CHANGED
@@ -1,45 +1,145 @@
1
1
  # dl-once
2
2
 
3
- ## ⚠️ IMPORTANT NOTICE ⚠️
3
+ `dl-once` は、リソースを「一度だけ、確実に」取得するための TypeScript/JavaScript ライブラリです。
4
4
 
5
- **This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
5
+ ネットワークの不安定さへの耐性、多層的なキャッシュ制御、そして詳細なライフサイクルフックを提供し、複雑なダウンロード要件をシンプルに解決します。
6
6
 
7
- This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
7
+ ## 主な特徴
8
8
 
9
- ## Purpose
9
+ * **キャッシュファースト**: ネットワーク取得の前にキャッシュ(IndexedDB、ファイルシステム 等)を確認し、無駄な通信を抑制します。
10
+ * **マルチターゲット・フォールバック**: 複数の URL を指定可能。1つ目の取得に失敗しても、自動的に次のミラーサイトやバックアップ URL を試行します。
11
+ * **ストリーム処理**: メモリ効率を重視。レスポンスをチャンクごとに処理し、読み込みながら同時にキャッシュへの書き出しを行います。
12
+ * **強力なフックシステム**: 開始前、データ受信中、完了、エラーの各フェーズに独自のロジックを注入できます。
13
+ * **中断(Abort)の完全サポート**: `AbortSignal` により、処理を安全かつ即座に停止し、リソースを解放します。
10
14
 
11
- This package exists to:
12
- 1. Configure OIDC trusted publishing for the package name `dl-once`
13
- 2. Enable secure, token-less publishing from CI/CD workflows
14
- 3. Establish provenance for packages published under this name
15
+ ## インストール
15
16
 
16
- ## What is OIDC Trusted Publishing?
17
+ ```bash
18
+ npm install dl-once
19
+ ```
17
20
 
18
- OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
21
+ ## 基本的な使い方
19
22
 
20
- ## Setup Instructions
23
+ 最もシンプルな使い方は、URL を渡して `Uint8Array` を受け取る方法です。
21
24
 
22
- To properly configure OIDC trusted publishing for this package:
25
+ ```typescript
26
+ import downloadOnce from "dl-once";
23
27
 
24
- 1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
25
- 2. Configure the trusted publisher (e.g., GitHub Actions)
26
- 3. Specify the repository and workflow that should be allowed to publish
27
- 4. Use the configured workflow to publish your actual package
28
+ const data = await downloadOnce("https://example.com/assets/config.bin");
29
+ console.log(`取得サイズ: ${data.length} bytes`);
30
+ ```
28
31
 
29
- ## DO NOT USE THIS PACKAGE
32
+ ## 高度な設定例(1)
30
33
 
31
- This package is a placeholder for OIDC configuration only. It:
32
- - Contains no executable code
33
- - Provides no functionality
34
- - Should not be installed as a dependency
35
- - Exists only for administrative purposes
34
+ キャッシュ、検証を組み合わせる例です。
36
35
 
37
- ## More Information
36
+ ```typescript
37
+ import {
38
+ downloadOnce, // メインの関数です。
39
+ IndexedDbCacheStorage, // ブラウザーで IndexedDB にキャッシュするためのストレージクラスです。
40
+ NodeFsCacheStorage, // Node.js でファイルにキャッシュするためのストレージクラスです。
41
+ Sha256VerificationHook, // 期待する SHA-256 ハッシュ値であるか検証するためのフッククラスです。
42
+ } from "dl-once";
38
43
 
39
- For more details about npm's trusted publishing feature, see:
40
- - [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
41
- - [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
44
+ await using cacheStorage = typeof document !== "undefined"
45
+ ? new IndexedDbCacheStorage("dl-once-db-name")
46
+ : new NodeFsCacheStorage("/tmp/dl-once-cache");
47
+ await cacheStorage.open();
42
48
 
43
- ---
49
+ const data = downloadOnce(["https://example.com/data"], {
50
+ // キャッシュの制御
51
+ cacheHandle: cacheStorage.createCacheHandle(),
44
52
 
45
- **Maintained for OIDC setup purposes only**
53
+ // ライフサイクルフック
54
+ hooks: [
55
+ new Sha256VerificationHook("..."),
56
+ ],
57
+
58
+ // 中断制御
59
+ signal: AbortSignal.timeout(30e3) // 30 秒タイムアウト
60
+ });
61
+ ```
62
+
63
+ ## 高度な設定例(2)
64
+
65
+ キャッシュ、カスタムフェッチャー、および進捗確認用のフックを組み合わせる例です。
66
+
67
+ ```typescript
68
+ import downloadOnce from "dl-once";
69
+
70
+ const data = await downloadOnce(
71
+ // 1つ目が失敗したら2つ目を試行
72
+ ["https://primary.example.com/data", "https://backup.example.com/data"],
73
+ {
74
+ // キャッシュの制御
75
+ cacheHandle: myCustomCacheHandle,
76
+ forceDownload: false,
77
+
78
+ // ライフサイクルフック
79
+ hooks: [{
80
+ onBeforeDownload({ request }) {
81
+ console.log(`開始: ${request.url}`);
82
+ },
83
+ onChunkRead({ chunkData }) {
84
+ console.log(`${chunkData.length} bytes を受信`);
85
+ },
86
+ onClose() {
87
+ console.log("ダウンロード完了!");
88
+ },
89
+ onError({ reason }) {
90
+ console.error("エラーが発生しました:", reason);
91
+ }
92
+ }],
93
+
94
+ // 中断制御
95
+ signal: AbortSignal.timeout(30e3) // 30 秒タイムアウト
96
+ }
97
+ );
98
+ ```
99
+
100
+ ## API リファレンス
101
+
102
+ ### `downloadOnce(target, options?)`
103
+
104
+ #### `target`
105
+
106
+ 取得対象を指定します。以下のいずれか、またはその配列を受け取ります。
107
+
108
+ * `string` | `URL` | `Request`: リソースの場所。
109
+ * `() => MaybePromise<PrimitiveTarget>`: 実行時に URL を生成する関数。
110
+ * `Config`: 個別の設定(`target`, `hooks`, `fetcher` 等)を含むオブジェクト。
111
+
112
+ #### `options`
113
+
114
+ 全体的な動作を制御するオプションです。
115
+
116
+ * `cacheHandle`: キャッシュの読み書きを管理するインターフェース。
117
+ * `forceDownload`: `true` の場合、キャッシュを無視してネットワークから取得します。
118
+ * `hooks`: グローバルに適用されるフック関数の配列。
119
+ * `fetcher`: カスタムの HTTP リクエスト実行関数(デフォルトは `fetch`)。
120
+ * `signal`: 処理全体を中断するための `AbortSignal`。
121
+
122
+ ## インターフェースの拡張
123
+
124
+ ### キャッシュの実装 (`ICacheHandle`)
125
+
126
+ 独自のキャッシュ機構(例:ブラウザの Cache Storage や Node.js のファイルシステム)を利用するには、`ICacheHandle` を実装します。
127
+
128
+ ```typescript
129
+ const myCache: ICacheHandle = {
130
+ async getReader({ signal }) {
131
+ // キャッシュがあれば AsyncIterableIterator を返す、なければ null
132
+ },
133
+ async getWriter({ response, request }) {
134
+ // IWriter (write, close, abort) を実装したオブジェクトを返す
135
+ }
136
+ };
137
+ ```
138
+
139
+ ### フックの実装 (`IHook`)
140
+
141
+ ダウンロードの進捗表示やログ記録などに利用できます。特定のフックがエラーを投げても、ライブラリ本体の処理は継続されるよう設計されています(`onClose` を除く)。
142
+
143
+ ## ライセンス
144
+
145
+ MIT
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `Uint8Array` のチャンクを効率的に積み上げ、最終的に一つのバイナリーデータとして結合するためのビルダー形式のクラスです。
3
+ */
4
+ export default class BytesBuilder {
5
+ /**
6
+ * 書き込まれたバイナリーデータのチャンクを保持する配列です。
7
+ * @private
8
+ */
9
+ private chunks;
10
+ /**
11
+ * 現在までに書き込まれた全データの合計バイト長です。
12
+ * @private
13
+ */
14
+ private length;
15
+ /**
16
+ * `BytesBuilder` クラスの新しいインスタンスを初期化します。
17
+ */
18
+ constructor();
19
+ /**
20
+ * 新しいバイナリーデータをチャンクとして追加します。
21
+ *
22
+ * @param data 追加する `Uint8Array` 形式のデータです。
23
+ */
24
+ write(data: Uint8Array<ArrayBuffer>): void;
25
+ /**
26
+ * 現在保持しているすべてのチャンクを結合して、一つの `Uint8Array` として返します。
27
+ *
28
+ * このメソッドを呼び出すと、内部のチャンクと長さの情報はリセットされます。
29
+ *
30
+ * @returns 結合されたすべてのデータを含む `Uint8Array` です。
31
+ */
32
+ bytes(): Uint8Array<ArrayBuffer>;
33
+ }
34
+ //# sourceMappingURL=_bytes-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_bytes-builder.d.ts","sourceRoot":"","sources":["../src/_bytes-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,YAAY;IAC/B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAA4B;IAE1C;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAS;IAEvB;;OAEG;;IAOH;;;;OAIG;IACI,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI;IAMjD;;;;;;OAMG;IACI,KAAK,IAAI,UAAU,CAAC,WAAW,CAAC;CAsBxC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * `Uint8Array` のチャンクを効率的に積み上げ、最終的に一つのバイナリーデータとして結合するためのビルダー形式のクラスです。
3
+ */
4
+ export default class BytesBuilder {
5
+ /**
6
+ * `BytesBuilder` クラスの新しいインスタンスを初期化します。
7
+ */
8
+ constructor() {
9
+ // 内部状態を初期化します。
10
+ this.chunks = [];
11
+ this.length = 0;
12
+ }
13
+ /**
14
+ * 新しいバイナリーデータをチャンクとして追加します。
15
+ *
16
+ * @param data 追加する `Uint8Array` 形式のデータです。
17
+ */
18
+ write(data) {
19
+ // チャンク配列にデータを追加し、全体の長さを更新します。
20
+ this.chunks.push(data);
21
+ this.length += data.length;
22
+ }
23
+ /**
24
+ * 現在保持しているすべてのチャンクを結合して、一つの `Uint8Array` として返します。
25
+ *
26
+ * このメソッドを呼び出すと、内部のチャンクと長さの情報はリセットされます。
27
+ *
28
+ * @returns 結合されたすべてのデータを含む `Uint8Array` です。
29
+ */
30
+ bytes() {
31
+ // 全体の長さに合わせた新しいバッファーを確保します。
32
+ const bytes = new Uint8Array(this.length);
33
+ // 書き込み位置を管理するためのオフセット変数です。
34
+ let offset = 0;
35
+ // 保持している各チャンクを、作成したバッファーの適切な位置にコピーしていきます。
36
+ for (const data of this.chunks) {
37
+ // 指定したオフセットからデータをセットします。
38
+ bytes.set(data, offset);
39
+ // 次のチャンクのためにオフセットを更新します。
40
+ offset += data.length;
41
+ }
42
+ // 次回の書き込みに備えて、内部の状態(チャンク配列と合計長)をリセットします。
43
+ this.chunks = [];
44
+ this.length = 0;
45
+ // 結合済みのバイナリーデータを返します。
46
+ return bytes;
47
+ }
48
+ }
@@ -0,0 +1,74 @@
1
+ import type { ICacheHandle, MaybePromise } from "./dl-once.js";
2
+ /**
3
+ * ストレージを開始する際に渡せるオプションの型定義です。
4
+ */
5
+ export type OpenOptions = {
6
+ /**
7
+ * 中断を監視するためのシグナルです。
8
+ */
9
+ readonly signal?: AbortSignal | undefined;
10
+ };
11
+ /**
12
+ * ストレージを終了する際に渡せるオプションの型定義です。
13
+ */
14
+ export type CloseOptions = {
15
+ /**
16
+ * 中断を監視するためのシグナルです。
17
+ */
18
+ readonly signal?: AbortSignal | undefined;
19
+ };
20
+ /**
21
+ * ストレージをクリアする際に渡せるオプションの型定義です。
22
+ */
23
+ export type ClearOptions = {
24
+ /**
25
+ * キャッシュを一意に識別する文字列です。
26
+ */
27
+ readonly cacheKey?: string | undefined;
28
+ /**
29
+ * 中断を監視するためのシグナルです。
30
+ */
31
+ readonly signal?: AbortSignal | undefined;
32
+ };
33
+ /**
34
+ * データキャッシュを管理するストレージのインターフェースです。
35
+ */
36
+ export interface ICacheStorage {
37
+ /**
38
+ * ストレージが現在開いているかどうかを返します。
39
+ */
40
+ readonly isOpen: boolean;
41
+ /**
42
+ * ストレージを開き、利用可能な状態にします。
43
+ *
44
+ * @param options オプションです。
45
+ */
46
+ open(options?: OpenOptions | undefined): MaybePromise<void>;
47
+ /**
48
+ * ストレージを閉じ、すべてのキャッシュデータを破棄します。
49
+ *
50
+ * @param options オプションです。
51
+ */
52
+ close(options?: CloseOptions | undefined): MaybePromise<void>;
53
+ /**
54
+ * キャッシュをクリアします。引数が指定された場合はそのキーのみ、指定されない場合は全てのキャッシュを削除します。
55
+ *
56
+ * @param cacheKey キャッシュを一意に識別する文字列です。
57
+ * @param options オプションです。
58
+ */
59
+ clear(cacheKey?: string | undefined, options?: Omit<ClearOptions, "cacheKey"> | undefined): MaybePromise<void>;
60
+ /**
61
+ * キャッシュをクリアします。引数が指定された場合はそのキーのみ、指定されない場合は全てのキャッシュを削除します。
62
+ *
63
+ * @param options オプションです。
64
+ */
65
+ clear(options?: ClearOptions | undefined): MaybePromise<void>;
66
+ /**
67
+ * 指定したキーに対応するキャッシュハンドルを取得、または新規作成します。
68
+ *
69
+ * @param key キャッシュを一意に識別する文字列です。
70
+ * @returns ICacheHandle を実装したオブジェクトを返します。
71
+ */
72
+ createCacheHandle(key: string): ICacheHandle;
73
+ }
74
+ //# sourceMappingURL=cache-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-storage.d.ts","sourceRoot":"","sources":["../src/cache-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE/D;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB;;;;OAIG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAE5D;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAE9D;;;;;OAKG;IACH,KAAK,CACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,SAAS,GACnD,YAAY,CAAC,IAAI,CAAC,CAAC;IAEtB;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAE9D;;;;;OAKG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;CAC9C"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,242 @@
1
+ /**
2
+ * 同期的な値、または Promise ライクな値を表す型です。
3
+ *
4
+ * @template T 解決される値の型です。
5
+ */
6
+ export type MaybePromise<T> = T | PromiseLike<T>;
7
+ /**
8
+ * ダウンロード開始前に実行されるハンドラーに渡される引数の型定義です。
9
+ */
10
+ export type BeforeDownloadHandlerArgs = {
11
+ /**
12
+ * 実行されるリクエストオブジェクトです。
13
+ */
14
+ request: Request;
15
+ /**
16
+ * 中断を監視するためのシグナルです。
17
+ */
18
+ signal: AbortSignal;
19
+ };
20
+ /**
21
+ * データのチャンクが読み込まれた際に実行されるハンドラーに渡される引数の型定義です。
22
+ */
23
+ export type ChunkReadHandlerArgs = {
24
+ /**
25
+ * 読み込まれたバイナリーデータです。
26
+ */
27
+ chunkData: Uint8Array<ArrayBuffer>;
28
+ /**
29
+ * サーバーからのレスポンスオブジェクトです。
30
+ */
31
+ response: Response;
32
+ /**
33
+ * 中断を監視するためのシグナルです。
34
+ */
35
+ signal: AbortSignal;
36
+ };
37
+ /**
38
+ * 処理が正常に終了した際に実行されるハンドラーに渡される引数の型定義です。
39
+ */
40
+ export type CloseHandlerArgs = {
41
+ /**
42
+ * 中断を監視するためのシグナルです。
43
+ */
44
+ signal: AbortSignal;
45
+ };
46
+ /**
47
+ * エラーが発生した際に実行されるハンドラーに渡される引数の型定義です。
48
+ */
49
+ export type ErrorHandlerArgs = {
50
+ /**
51
+ * エラーの原因となったオブジェクトです。
52
+ */
53
+ reason: unknown;
54
+ /**
55
+ * 中断を監視するためのシグナルです。
56
+ */
57
+ signal: AbortSignal;
58
+ };
59
+ /**
60
+ * ダウンロードの各フェーズで実行されるフック関数のインターフェースです。
61
+ */
62
+ export interface IHook {
63
+ /**
64
+ * ダウンロード開始前に呼び出されます。
65
+ */
66
+ onBeforeDownload?(args: BeforeDownloadHandlerArgs): MaybePromise<void>;
67
+ /**
68
+ * チャンクデータが読み込まれるたびに呼び出されます。
69
+ */
70
+ onChunkRead?(args: ChunkReadHandlerArgs): MaybePromise<void>;
71
+ /**
72
+ * 正常終了時に呼び出されます。
73
+ */
74
+ onClose?(args: CloseHandlerArgs): MaybePromise<void>;
75
+ /**
76
+ * エラー発生時に呼び出されます。
77
+ */
78
+ onError?(args: ErrorHandlerArgs): MaybePromise<void>;
79
+ }
80
+ /**
81
+ * キャッシュリーダーを取得する際に渡される引数の型定義です。
82
+ */
83
+ export type GetReaderArgs = {
84
+ /**
85
+ * 中断を監視するためのシグナルです。
86
+ */
87
+ signal: AbortSignal;
88
+ };
89
+ /**
90
+ * キャッシュからデータを読み出すためのリーダー型です。
91
+ *
92
+ * 同期または非同期の反復子として定義されます。
93
+ */
94
+ export type IReader = IterableIterator<Uint8Array<ArrayBuffer>> | AsyncIterableIterator<Uint8Array<ArrayBuffer>>;
95
+ /**
96
+ * キャッシュライターを取得する際に渡される引数の型定義です。
97
+ */
98
+ export type GetWriterArgs = {
99
+ /**
100
+ * サーバーからのレスポンスオブジェクトです。
101
+ */
102
+ response: Response;
103
+ /**
104
+ * 実行されたリクエストオブジェクトです。
105
+ */
106
+ request: Request;
107
+ /**
108
+ * 中断を監視するためのシグナルです。
109
+ */
110
+ signal: AbortSignal;
111
+ };
112
+ /**
113
+ * キャッシュへデータを書き込むためのインターフェースです。
114
+ */
115
+ export interface IWriter {
116
+ /**
117
+ * チャンクデータを書き込みます。
118
+ */
119
+ write(chunkData: Uint8Array<ArrayBuffer>): MaybePromise<void>;
120
+ /**
121
+ * 書き込みを完了し、リソースを閉じます。
122
+ */
123
+ close(): MaybePromise<void>;
124
+ /**
125
+ * 書き込みを中断します。
126
+ */
127
+ abort(reason: unknown): MaybePromise<void>;
128
+ }
129
+ /**
130
+ * キャッシュの読み書きを管理するハンドルのインターフェースです。
131
+ */
132
+ export interface ICacheHandle {
133
+ /**
134
+ * 指定された条件でキャッシュリーダーを取得します。存在しない場合は null を返します。
135
+ */
136
+ getReader(args: GetReaderArgs): MaybePromise<IReader | null>;
137
+ /**
138
+ * 書き込み用のライターを取得します。
139
+ */
140
+ getWriter(args: GetWriterArgs): MaybePromise<IWriter>;
141
+ }
142
+ /**
143
+ * フェッチャーに渡される初期化オプションの型定義です。
144
+ */
145
+ export type FetcherRequestInit = {
146
+ /**
147
+ * 中断を監視するためのシグナルです。
148
+ */
149
+ readonly signal: AbortSignal;
150
+ };
151
+ /**
152
+ * カスタムの HTTP リクエスト実行関数の型定義です。
153
+ */
154
+ export interface IFetcher {
155
+ /**
156
+ * HTTP リクエストを実行し、レスポンスを返します。
157
+ *
158
+ * @param request リクエストオブジェクトです。
159
+ * @param init 初期化オプションです。
160
+ * @returns レスポンスまたはそれを解決する Promise です。
161
+ */
162
+ (request: Request, init: FetcherRequestInit | undefined): MaybePromise<Response>;
163
+ }
164
+ /**
165
+ * 単一のリクエストターゲットを表すプリミティブな型です。
166
+ */
167
+ export type PrimitiveTarget = string | URL | Request;
168
+ /**
169
+ * 動的にリクエストターゲットを生成するファクトリー関数の型定義です。
170
+ */
171
+ export interface ITargetFactory {
172
+ (): MaybePromise<PrimitiveTarget>;
173
+ }
174
+ /**
175
+ * 解決可能なターゲットの型定義です。
176
+ */
177
+ export type Target = PrimitiveTarget | ITargetFactory;
178
+ /**
179
+ * JavaScript における Falsy な値の型定義です。
180
+ */
181
+ export type Falsy = 0 | "" | false | null | undefined;
182
+ /**
183
+ * 個別のダウンロード設定を定義する型です。
184
+ */
185
+ export type Config = {
186
+ /**
187
+ * ダウンロード対象のターゲットです。
188
+ */
189
+ readonly target: Target;
190
+ /**
191
+ * 使用するキャッシュハンドルです。
192
+ */
193
+ readonly cacheHandle?: ICacheHandle | undefined;
194
+ /**
195
+ * キャッシュを無視して強制的にダウンロードするかどうかのフラグです。
196
+ */
197
+ readonly forceDownload?: boolean | undefined;
198
+ /**
199
+ * 適用されるフックのリストです。
200
+ */
201
+ readonly hooks?: readonly (IHook | Falsy)[] | undefined;
202
+ /**
203
+ * 使用するカスタムフェッチャーです。
204
+ */
205
+ readonly fetcher?: IFetcher | undefined;
206
+ };
207
+ /**
208
+ * 全体的なダウンロード動作を制御するオプションの型定義です。
209
+ */
210
+ export type Options = {
211
+ /**
212
+ * デフォルトで使用するキャッシュハンドルです。
213
+ */
214
+ readonly cacheHandle?: ICacheHandle | undefined;
215
+ /**
216
+ * デフォルトでキャッシュを無視するかどうかのフラグです。
217
+ */
218
+ readonly forceDownload?: boolean | undefined;
219
+ /**
220
+ * グローバルに適用されるフックのリストです。
221
+ */
222
+ readonly hooks?: readonly (IHook | Falsy)[] | undefined;
223
+ /**
224
+ * デフォルトで使用するフェッチャーです。
225
+ */
226
+ readonly fetcher?: IFetcher | undefined;
227
+ /**
228
+ * 処理全体の中断を管理するシグナルです。
229
+ */
230
+ readonly signal?: AbortSignal | undefined;
231
+ };
232
+ /**
233
+ * 指定されたターゲットからデータを一度だけダウンロードし、バイナリーデータとして返します。
234
+ *
235
+ * キャッシュが利用可能な場合はキャッシュから取得を試み、失敗した場合はネットワーク経由で取得します。
236
+ *
237
+ * @param target ダウンロード対象(単体、設定オブジェクト、またはその配列)です。
238
+ * @param options ダウンロードの動作を制御するオプションです。
239
+ * @returns 取得されたバイナリーデータ(Uint8Array)を解決する Promise です。
240
+ */
241
+ export default function downloadOnce(target: Target | Config | readonly (Target | Config)[], options?: Options | undefined): Promise<Uint8Array<ArrayBuffer>>;
242
+ //# sourceMappingURL=dl-once.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dl-once.d.ts","sourceRoot":"","sources":["../src/dl-once.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC;;OAEG;IACH,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAEnC;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB;;OAEG;IACH,gBAAgB,CAAC,CAAC,IAAI,EAAE,yBAAyB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEvE;;OAEG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,oBAAoB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAE7D;;OAEG;IACH,OAAO,CAAC,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAErD;;OAEG;IACH,OAAO,CAAC,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,OAAO,GACf,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,GACzC,qBAAqB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAE9D;;OAEG;IACH,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAE5B;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAE7D;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;;;OAMG;IACH,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,GAAG,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;CAClF;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,YAAY,CAAC,eAAe,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,eAAe,GAAG,cAAc,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAEhD;;OAEG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAE7C;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC;IAExD;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACzC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAEhD;;OAEG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAE7C;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC;IAExD;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C,CAAC;AAgBF;;;;;;;;GAQG;AACH,wBAA8B,YAAY,CACxC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EACtD,OAAO,GAAE,OAAO,GAAG,SAAc,GAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAuPlC"}