Beakerは、https://beakerbrowser.com/ にて公開されているHypercoreと呼ばれるピアツーピアのプロトコルを用いたブラウザです。このHypercoreと同様のものとしてIPFS(Interplanetary File System) https://ipfs.io/ があります。
IPFSは、Brave Browserに組み込まれていてHypercoreと比較し知名度が高いと思われます。著者もIPFSの方を先に知っていました。会社勤めを辞めたおり、Hacker NewsにてこのBeakerを知り、IPFSと比較して日本語の記事がまるで検索されなかったので、暇つぶしも兼ねて https://beakerbrowser.com/ にて公開されている記事を和訳してみた次第です。
なお、
-
和訳は、DeepL にて英語から日本語に訳し、日本語文章としておかしな部分が無いように調整した程度のものです。単語の統一性まで確認するほどの厳密な和訳作業はしていません。
APIs
beaker.capabilities
"Capabilities "は、URLを隠しつつハイパードライブにマッピングする不透明なURLです。この名前はCapability-based securityから来ています。
Capability URLの目的は、ハイパードライブへの制限されたアクセスのためのセキュリティプリミティブを提供することです。ハイパードライブのデフォルトのセキュリティモデルは、公開鍵URLがローカルおよびネットワーク上で読み取りアクセスを提供することです。公開鍵は変更できないため、一度取得した公開鍵へのアクセスを取り消すことは不可能です。ケイパビリティURLはランダムなIDからハイパードライブパブキーへのローカルマッピングであり、したがって公開鍵を渡すことなく読み取りアクセスを提供します。
アプリケーションはケイパビリティURLを他のアプリケーションと共有し(たとえば<iframe>
内で)、一時的で制約のあるアクセスを提供することが可能です。
ハイパードライブ Capability URLは、特別な.cap
擬似TLDを使用します。
これは、hyper://{random-base32-id}.cap/
という形式で作成されます。
ケイパビリティURLはローカルで、メモリ内に保存されます。ブラウザが再起動したときに「破棄」されます。ネットワークに接続されていないため、他のユーザーと共有することはできません。キーとドライブバージョンにマッピングすることはできますが、サブフォルダーやファイルにマッピングすることはできません。
API
beaker.capabilities.create(targetUrl)
対象URLへの新規ケイパビリティマッピングを作成します。
- targetUrl文字列。ケーパビリティが表現するURL
- Promise
<String>
を返します。ケイパビリティのURL
var capUrl = await beaker.capabilities.create('hyper://12345..af')
await beaker.hyperdrive.drive(capUrl).readdir('/')
beaker.capabilities.modify(capUrl, targetUrl)
既存のケイパビリティのマッピングを変更します。
- capUrl文字列。変更するケイパビリティのURL。
- targetUrl文字列。ケイパビリティが表現するURL。
- Promise
<Void>
を返します。
await beaker.capabilities.modify(capUrl, 'hyper://fedcb..21')
await beaker.hyperdrive.drive(capUrl).readdir('/')
beaker.capabilities.delete(capUrl)
ケイパビリティを削除する。今後、そのURLに対する操作は失敗します。
- capUrl文字列。変更するケイパビリティのURL。
- Promise
<Void>
を返します。
await beaker.capabilities.delete(capUrl)
beaker.contacts
このAPIは非推奨となりました。現在では、「contact」タグで保存されたドライブへアクセスするためにbeaker.shell APIを呼び出すようになっています。これらのAPIを使って作られたアプリケーションが壊れることはありませんが、beaker.shellの使用に切り替えることが推奨されます。
beaker.contacts.requestProfile()
ユーザーのプロファイルドライブを選択するためのダイアログを作成します。
- Promise
<Object>
を返します。- url文字列。プロファイルドライブのURL。
- title文字列。プロファイルドライブの表示名。
- description文字列。プロファイルドライブのbio。
var profile = await beaker.contacts.requestProfile()
beaker.contacts.requestContact()
ユーザーのアドレス帳に登録されている連絡先を1つ選択するためのダイアログを作成します。
- Promise
<Object>
を返します。- url文字列。プロファイルドライブのURL。
- title文字列。プロファイルドライブの表示名。
- description文字列。プロファイルドライブのbio。
var contact = await beaker.contacts.requestContact()
beaker.contacts.requestContacts()
ユーザーのアドレス帳に登録されている連絡先を複数選択するためのダイアログを作成します。
- Promise
<Array<Object>>
を返します。- url文字列。プロファイルドライブのURL。
- title文字列。プロファイルドライブの表示名。
- description文字列。プロファイルドライブのbio。
var contacts = await beaker.contacts.requestContacts()
beaker.contacts.list()
アドレス帳に登録されている連絡先の全一覧を返します。ユーザーの許可が必要です。
- Promise
<Array<Object>>
を返します。- url文字列。プロファイルドライブのURL。
- title文字列。プロファイルドライブの表示名。
- description文字列。プロファイルドライブのbio。
var contacts = await beaker.contacts.list()
beaker.hyperdrive
ハイパードライブAPIは、ハイパードライブへの読み取りと書き込みのアクセスを提供します。
.drive() を使用してHyperdriveインスタンスをインスタンス化するか、グローバル メソッドを使用すると、APIを使用できます。グローバル メソッドは、パスまたはURLを受け入れることができます。グローバル メソッドにパスを渡すと、現在のドライブがターゲットとして使用されます。たとえば、ドライブhyper://foobar/にいた場合、次の3つは等価です。
await beaker.hyperdrive.readdir('/')
await beaker.hyperdrive.readdir('hyper://foobar/')
await beaker.hyperdrive.drive('hyper://foobar/').readdir('/')
ハイパードライブは、常に自身のファイルの読み取りと書き込みが許可されています。アプリケーションは他のハイパードライブへ書き込む前に許可を得なければなりません。
API
beaker.hyperdrive.drive(url)
ハイパードライブのインスタンスを作成します。このインスタンスは beaker.hyperdrive のほとんどのメソッドを提供しますが、指定されたドライブの URL にスコープされます。スコープされていない beaker.hyperdrive の呼び出しとは異なり、操作に提供できるのはパスのみです。
- url 文字列。アクセスするドライブの URL。
- hyperdriveを返します。
- url 文字列。ハイパードライブのURL。
- version 文字列。インスタンスのチェックアウト済みバージョン。latestを使用する場合は未定義になります。
- checkout(version): ハイパードライブ。与えられたバージョンで Hyperdrive インスタンスを返します。
- watch(path, onChanged): EventTarget。書き込みが発生したときに 'changed' イベントを発行します。親ドライブ内のマウントされたドライブの変更イベントは発行されません。
- ...beaker.hyperdriveのほとんどのメソッド。
var drive = beaker.hyperdrive.drive('hyper://1234..ef')
await drive.readdir('/')
beaker.hyperdrive.createDrive([settings])
ハイパードライブを新規に作成します。
- settings オブジェクトを作成します。
- title 文字列。ハイパードライブのタイトル。
- description 文字列。ハイパードライブの説明。
- tags 文字列。ライブラリでドライブに割り当てるタグのスペースで区切られたリスト。
- prompt 論理値。作成プロンプトを表示するかどうか。false の場合、許可が要求されます。
- Promise
<Hyperdrive>
を返します。
var drive = await beaker.hyperdrive.createDrive({
title: 'My cool website',
description: 'Demonstrating how to create Hyperdrives'
})
beaker.hyperdrive.forkDrive(url[, opts])
フォークまたはコピードライブ」のプロンプトを作成します。ユーザーはこれを使用して、ハイパードライブのファイルおよび設定を新しいドライブにコピーし、オプションでいくつかの設定を上書きします。
- url 文字列。フォークするドライブの URL。
- opts オブジェクト。
- detached 論理値。false の場合、"attached" フォークを作成します。trueの場合、デタッチドコピーが作成されます。デフォルトはfalseです。
- title 文字列。タイトルを上書きする。detachedがtrueのときのみ適用されます。
- description 文字列。説明を上書きします。detachedがtrueの場合のみ適用される。
- tags 文字列。ライブラリ内のドライブに割り当てるタグのスペース区切りのリスト。
- prompt 論理値。trueの場合、"fork "モーダルが表示されます。false の場合、ユーザーに許可を求めるだけです。デフォルトはtrueです。
- 戻り値
Promise<Hyperdrive>
.
var myFork = await beaker.hyperdrive.forkDrive(existingDriveUrl)
var myCopy = await beaker.hyperdrive.forkDrive(existingDriveUrl, {detached: true})
beaker.hyperdrive.getInfo(url[, opts])
ハイパードライブのメタデータとシステム情報を取得します。
- url 文字列。クエリするハイパードライブの URL。(beaker.hyperdrive.drive() によって返されるハイパードライブオブジェクトでは必要ありません)。
- opts オブジェクト。
- timeout 数値(ms)。タイムアウトエラーを投げる前に、操作が完了するのを何分待つのか。デフォルトは60000。
-
Promise<Object>
を返します。- キー文字列。ハイパードライブのキー。
- url 文字列。ハイパードライブの URL。
- writable ブール値。ローカル・ユーザーがハイパードライブを変更できるか?
- バージョン番号。ハイパードライブの最新のリビジョン番号。
- title 文字列。ハイパードライブのタイトル。
- description 文字列。ハイパードライブの説明です。
var info = await beaker.hyperdrive.getInfo('hyper://1234..ef')
beaker.hyperdrive.stat(url[, opts])
ファイルに関するメタデータを取得します。
- url 文字列。ファイルへの url。
- opts オブジェクト。
- lstat ブール値。ファイルがシンボリックリンクの場合、リンク先の代わりにシンボリックリンクに関する情報を与える。
- timeout 数値 (ms)。タイムアウトエラーを投げる前に、操作が完了するのをどれだけ待つか。デフォルトは60000です。
- Promise
<Object>
を返します。- isFile() 関数()。ブール値。エントリーがファイルかどうか?
- isDirectory() 関数()。ブール値。エントリーがディレクトリかどうか?
- size 数値。ファイルのサイズをバイト数で表す。
- blocks 数値。コンテンツハイパースコアのブロック単位でのファイルのサイズ。
- mtime 数値。ファイルの最終更新のタイムスタンプ。
- ctime 数値。ファイル作成のタイムスタンプ。
- mount オブジェクト。エントリーがマウントである場合、ターゲットマウントに関する情報。
- key 文字列。マウントターゲットのキー。
- バージョン番号。指定されている場合、マウントターゲットのバージョン。
- metadata オブジェクト。エントリに添付されたユーザーメタデータ。
- linkname 文字列。シンボリックリンクの場合、ターゲットのパスを指定します。
var stat = await beaker.hyperdrive.stat('hyper://1234..ef/index.json')
beaker.hyperdrive.readFile(url[, opts])
ファイルの内容を読み取る。
- url 文字列。ファイルへの url。
- opts オブジェクト | 文字列。String の場合、'encoding' オプションとして動作します。
- encoding 文字列。希望する出力エンコーディング。binary', 'utf8', 'hex', 'json', あるいは 'base64' のいずれかを指定できます。デフォルトは'utf8'です。
- timeout 数値 (ms)。タイムアウトエラーを投げる前に、操作が完了するのを待つ時間。デフォルトは60000です。
- 戻り値 Promise
<String | Uint8Array>
.
var fileStr = await beaker.hyperdrive.readFile('hyper://1234..ef/foo.txt')
var fileObj = await beaker.hyperdrive.readFile('hyper://1234..ef/foo.json', 'json')
var imgBuf = await beaker.hyperdrive.readFile('hyper://1234..ef/bar.png', 'binary')
var imgBase64 = await beaker.hyperdrive.readFile('hyper://1234..ef/bar.png', 'base64')
beaker.hyperdrive.readdir(url[, opts])
ディレクトリの内容を読み込む。
- url 文字列。ディレクトリへのURL。
- opts オブジェクト。
- includeStats 論理値。出力に各エントリの 'stats' オブジェクトを含めるかどうか。
- recursive Boolean. サブフォルダーに再帰するか。
- 注:子マウントには再帰しません。
- timeout 数値 (ms)。タイムアウトエラーを投げる前に、操作が完了するのを待つ時間。デフォルトは60000です。
- Returns Promise
<Array<String | Object>>
を返します。- オブジェクトの場合、形状は { name, stat } になります。
var files = await beaker.hyperdrive.readdir('hyper://1234..ef/')
var allFiles = await beaker.hyperdrive.readdir('hyper://1234..ef/', {recursive: true})
var filesWithStats = await beaker.hyperdrive.readdir('hyper://1234..ef/', {includeStats: true})
beaker.hyperdrive.query(query)
複数の指定されたパスにまたがるドライブまたはドライブの内容を読み取ります。この関数は、複数のさまざまな属性でフィルタリングしながら、広範囲のファイルを読み取るために使用できます。HyperdriveがSQLデータベースであるならば、これはSELECT関数になります。
- query オブジェクト。
- drive String | Array. クエリーを実行するドライブ (複数可)。
- path String | Array. クエリ対象のパス。複数のファイルを指定する場合は、グロビングパターン ('*') を使用できます。
- type 文字列。このタイプのエントリに結果をフィルタリングします。file'、'directory'、'mount' のいずれかを指定します。
- mount 文字列 (URL)。ここで指定されたドライブを指すマウントに結果をフィルタリングします。
- metadata オブジェクト。ここで指定されたキー値に対するメタデータによって結果をフィルタリングします。
- sort 文字列。結果をどの属性でソートするかを指定します。name'、'ctime'、'mtime'のいずれかを指定します。
- reverse 論理値。trueの場合、結果の順序は逆になる。
- limit 数値。返す結果の最大数を指定します。
- offset 数値。結果内の開始オフセットを指定する。ページネーションに使用する。
- timeout 数値(ms)。タイムアウトエラーを投げる前に、操作が完了するのを待つ時間。Defaults to 60000.
- Promise
<Array<Object>>
を返します。- type 文字列。エントリのタイプ。file', 'directory', または 'mount' でなければなりません。
- path 文字列。照会されたドライブからの相対パス。
- url 文字列。照会されたドライブからの相対的なエントリーの URL。
- stat オブジェクト。stat() を参照ください。
- drive 文字列。照会されたドライブのURL。
- mount 文字列。エントリーがマウントである場合のターゲット・ドライブのURL。
- origin オブジェクト。
- path 文字列。所有するドライブからの相対的なエントリのパス。
- drive 文字列。エントリーの所有するドライブの URL。
- url 文字列。所有するドライブからの相対的なエントリの URL。
var rootFiles = await beaker.hyperdrive.query({
drive: 'hyper://1234..ef',
path: '/*',
type: 'file'
})
var rootImgs = await beaker.hyperdrive.query({
drive: 'hyper://1234..ef',
path: ['/*.png', '/*.jpg', '/*.jpeg']
})
var postFiles = await beaker.hyperdrive.query({
drive: 'hyper://1234..ef',
path: '/microblog/*',
sort: 'ctime'
})
var followMounts = await beaker.hyperdrive.query({
drive: 'hyper://1234..ef',
path: '/follows/*',
type: 'mount'
})
var bobFollow = await beaker.hyperdrive.query({
drive: 'hyper://1234..ef',
path: '/follows/*',
mount: bobsUrl
})
var commentsOnBeaker = await beaker.hyperdrive.query({
drive: 'hyper://1234..ef',
path: '/comments/*',
metadata: {href: 'https://beakerbrowser.com'}
})
beaker.hyperdrive.diff(url, other[, prefix, opts])
ドライブの2つのバージョン間で発生した変更点をリストアップしします。
注:この方法は、ドライブをそれ自身の他のバージョンと比較することのみが可能です。異なる2つのドライブを比較することはできません。
- url 文字列。diffを取得するためのURL。
- other Number|String|Hyperdrive。比較するバージョン ID またはハイパードライブインスタンス。
- opts オブジェクト。
- timeout 数値(ms)。タイムアウトエラーを投げる前に、操作が完了するのを何分待つのか。デフォルトは60000。
- Promise
<Array<Object>>
を返します。- タイプ String. どのような操作が行われたのか。のうちの1つ。put', 'del', 'mount', 'unmount' のいずれか。
- name 文字列。変更したエントリのパス。
- value オブジェクト。変更に関連する情報 (例: put ファイルの 'stat' オブジェクト)。
var changes = await beaker.hyperdrive.diff('hyper://1234..ef', 5) // diff latest against revision 5
beaker.hyperdrive.configure(url, settings[, opts])
ドライブの設定および/またはマニフェスト(index.json)を更新します。
- url 文字列。設定するドライブのURL。
- settings オブジェクト。
- title 文字列。ドライブのタイトル。
- description 文字列。ドライブの説明。
- opts オブジェクト。
- timeout 数値(ms)。タイムアウトエラーを投げる前に、操作が完了するのを何分待つのか。デフォルトは60000。
- Promise
<Void>
を返します。
await beaker.hyperdrive.configure('hyper://1234..ef', {
title: 'The drive title',
description: 'The drive description'
})
beaker.hyperdrive.writeFile(url, data[, opts])
ライブにファイルを書き込む。
- url 文字列。書き込むファイルのURL。
- data String|Uint8Array. 書き込む内容。
- opts String|Object. 文字列の場合、エンコーディングのパラメーターとして機能します。
- encoding 文字列。dataパラメーターのエンコーディング。utf8'、'base64'、'hex'、'json'、'binary'のいずれかである必要があります。デフォルトは、data が文字列の場合は 'utf8' で、data が Uint8Array の場合は 'binary' です。
- metadata オブジェクト。ファイルに書き込むメタデータ。未指定の場合でも
- timeout 数値(ms)。タイムアウトエラーを投げる前に、操作が完了するのを待つ時間。デフォルトは60000。
- 戻り値 Promise
<Void>
.
await beaker.hyperdrive.writeFile('hyper://1234..ef/foo.txt', 'Foo')
await beaker.hyperdrive.writeFile('hyper://1234..ef/foo.json', {hello: 'world'}, 'json')
await beaker.hyperdrive.writeFile('hyper://1234..ef/foo.png', imgPngBase64, 'base64')
await beaker.hyperdrive.writeFile('hyper://1234..ef/foo.jpg', imgJpgUint8Array, {encoding: 'binary'})
await beaker.hyperdrive.writeFile('hyper://1234..ef/foo.md', '# Markdown Doc', {
metadata: {title: 'Markdown Doc'}
})
beaker.hyperdrive.mkdir(url[, opts])
ドライブ上にフォルダーを作成する。
- url 文字列。作成するフォルダーのURL。
- opts オブジェクト。
- timeout 数値(ms)。タイムアウトエラーを投げるまでの操作の完了を待つ時間。デフォルトは 60000 です。
- Promise
<Void>
を返します。
await beaker.hyperdrive.mkdir('hyper://1234..ef/sub')
beaker.hyperdrive.symlink(target, url[, opts])
ドライブにシンボリックリンクを作成します。初回に引数の順番が正しくなるように頑張ってください。
- target 文字列。シンボリックリンクが指し示すべきURL。
- url 文字列。シンボリックリンクを配置する場所。
- opts オブジェクト。
- timeout 数値 (ms)。タイムアウトエラーを発生させる前に、処理が完了するまでの時間。デフォルトは 60000 です。
- Promise
<Void>
を返します。
await beaker.hyperdrive.symlink('hyper://1234..ef/this-file-already-exists.txt', 'hyper://1234..ef/the-symlink.txt')
beaker.hyperdrive.mount(url, mount[, opts])
ドライブ上に他のドライブへのマウントを作成します。(マウントはハイパードライブ間で機能するシンボリックリンクのようなものです。) 注意: 私たちは知っていますが、引数の順序はシンボリックリンクの反対です。
- url 文字列。マウントを配置する場所。
- mount String|Object|Hyperdrive. マウントするドライブ。StringまたはHyperdriveの場合、key属性として機能します。
- key 文字列。マウントするドライブのキー。
- version Number|String。マウントを固定するバージョン。未定義の場合、マウントは最新版を指します。
- opts オブジェクト。
- timeout 数値(ms)。タイムアウトエラーを投げる前に、操作が完了するのを待つ時間。デフォルトは 60000 です。
- Promise
<Void>
を返します。
await beaker.hyperdrive.mount('hyper://1234..ef/mount', 'hyper://fedcb..12')
await beaker.hyperdrive.mount('hyper://1234..ef/mount2', {key: 'fedcb..12', version: 10})
beaker.hyperdrive.copy(src, dst[, opts])
ファイルやフォルダーをコピーします。ハイパードライブ間で動作する。
- src 文字列。ファイルをコピーする場所。
- dst 文字列。ファイルのコピー先。
- opts オブジェクト。
- timeout 数値 (ms)。タイムアウトエラーを投げる前に操作が完了するのを待つ時間。デフォルトは 60000 です。
- 戻り値 Promise
<Void>
.
await beaker.hyperdrive.copy('hyper://1234..ef/foo.txt', 'hyper://1234..ef/bar.txt')
beaker.hyperdrive.rename(src, dst[, opts])
ファイルやフォルダーを移動する。ハイパードライブ間で動作する。
- src文字列。ファイルを移動させる場所。
- dst 文字列。ファイルの移動先。
- opts オブジェクト。
- timeout 数値 (ms)。タイムアウトエラーを投げるまでの操作の完了を待つ時間。デフォルトは 60000 です。
- 戻り値 Promise
<Void>
.
await beaker.hyperdrive.rename('hyper://1234..af/foo.txt', 'hyper://1234..af/bar.txt')
beaker.hyperdrive.updateMetadata(url, metadata[, opts])
ファイルのメタデータを修正します。ファイルの既存のメタデータにマージされます。
- url 文字列。修正するファイルのURL。
- metadata オブジェクト。設定するメタデータの値。
- opts オブジェクト。
- timeout 数値 (ms)。タイムアウトエラーを発生させる操作完了までの時間。デフォルトは 60000 です。
- Promise
<Void>
を返します。
await beaker.hyperdrive.updateMetadata('hyper://1234..ef/foo.txt', {title: 'Foo'})
beaker.hyperdrive.unlink(url[, opts])
ドライブ上のファイルを削除する。
- url 文字列。削除するファイルのURL。
- opts オブジェクト。
- timeout 数値 (ms)。タイムアウトエラーを投げる前に操作が完了するのを待つ時間。デフォルトは 60000 です。
- 戻り値 Promise
<Void>
.
await beaker.hyperdrive.unlink('hyper://1234..ef/foo.txt')
beaker.hyperdrive.rmdir(url[, opts])
ドライブ上のフォルダーを削除します。
- url 文字列。削除するフォルダーのURL。
- opts オブジェクト。
- recursive ブーリアン。フォルダーが空でない場合、その中のファイルを削除します。デフォルトはfalseです。
- timeout 数値(ms)。タイムアウトエラーを投げる前に、操作が完了するのを待つ時間。デフォルトは 60000 です。
- 戻り値 Promise
<Void>
.
await beaker.hyperdrive.rmdir('hyper://1234..ef/sub')
await beaker.hyperdrive.rmdir('hyper://1234..ef/sub2', {recursive: true})
beaker.hyperdrive.unmount(url[, opts])
ドライブ上のマウントを削除します。
- url 文字列。削除するマウントのURL。
- opts オブジェクト。
- timeout 数値 (ms)。タイムアウトエラーを投げる前に、操作が完了するのを待つ時間。デフォルトは 60000 です。
- Promise
<Void>
を返します。
await beaker.hyperdrive.unmount('hyper://1234..ef/mount')
beaker.hyperdrive.deleteMetadata(url, keys[, opts])
ファイルからメタデータのキーを削除する。
- url 文字列。修正するファイルのURL。
- keys String|Array. 削除するキー (複数可)。
- opts オブジェクト。
- timeout数値 (ms)。操作が完了してからタイムアウトエラーが発生するまでの時間。デフォルトは60000です。
- Promise
<Void>
を返します。
await beaker.hyperdrive.deleteMetadata('hyper://1234..ef/foo.txt', 'title')
await beaker.hyperdrive.deleteMetadata('hyper://1234..ef/bar.txt', ['title', 'href'])