前回の
Perlでの実装
それでは,
ActivityPubはWeb APIベースのプロトコルですので,
AS2オブジェクトモデルの作成
Actubでは,
個々のオブジェクトを表現するクラスを作成する前に,
package WWW::ActivityPub::Base;
use strict;
use warnings;
use Class::Tiny;
sub TO_JSON {
my %ret;
my $self = shift;
for (keys %$self){
my $key = $_;
my $jsonkey = $key;
if($key eq 'context'){
$jsonkey = '@context';
if(!defined $$self{$_}){next;}
}
$ret{$jsonkey} = $$self{$_};
}
return \%ret;
}
1;
ここではClass::Tiny
モジュールを用いています。これは属性のゲッタとセッタを設定するだけのシンプルなモジュールですが,@context
属性があり,@
はメソッド名に使えないため,@context
ではなくcontext
属性として定義し,context
属性を@context
に変換して出力するためのTO_
関数を定義しています。
この下準備により,Follow
クラスの定義は次のようにシンプルなものになっています。
package WWW::ActivityPub::Follow;
use strict;
use warnings;
use parent qw(WWW::ActivityPub::Base);
use Class::Tiny qw(
context id type object
);
1;
MIME型の登録
GETリクエストに対する返却処理は通常のレスポンスなので実装上特筆することはあまりありませんが,application/
を使う必要があるため,startup
フック内で次のようにしてこのMIME型を登録しておきます。
sub startup {
my $self = shift;
...;
$self->types->type(as =>
'application/ld+json; profile=' .
'"https://www.w3.org/ns/activitystreams"');
}
これにより,
# $outは出力するデータ
$self->render(text => $out,
format => 'as');
送信キューの登録
Actubは送信処理を非同期で行う実装となっているので,Follow
オブジェクトが送信されると,Accept
オブジェクトをジョブキューに追加します。ここでのジョブキューシステムはJonk
モジュールを使っています。これはデータベースをバックエンドに使う軽量なジョブキューシステムで,
# $dbhはデータベースハンドル
my $jonk = Jonk->new($dbh);
...;
my $job_id = $jonk->insert('post', $queuestr);