Backblaze-B2
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Backblaze/B2.pm view on Meta::CPAN
=head2 C<< ->new %options >>
my $b2 = Backblaze::B2::v1->new(
api => 'Backblaze::B2::v1::Synchronous', # the default
);
Creates a new instance. Depending on whether you pass in
C<<Backblaze::B2::v1::Synchronous>> or C<<Backblaze::B2::v1::AnyEvent>>,
you will get a synchronous or asynchronous API.
The synchronous API is what is documented here, as this is the
most likely use case.
my @buckets = $b2->buckets();
for( @buckets ) {
...
}
The asynchronous API is identical to the synchronous API in spirit, but
will return L<Promises> . These condvars usually return
two or more parameters upon completion:
my $results = $b2->buckets();
$results->then( sub{
my( @buckets ) = @_;
for( @buckets ) {
...
}
}
The asynchronous API puts the burden of error handling into your code.
=cut
use vars '$API_BASE';
$API_BASE = 'https://api.backblazeb2.com/b2api/v1/';
sub new {
my( $class, %options ) = @_;
# Hrr. We need to get at an asynchronous API here and potentially
# wrap the results to synchronous results in case the user wants them.
# Turtles all the way down, this means we can't reuse calls into ourselves...
$options{ api } ||= 'Backblaze::B2::v1::Synchronous';
if( ! ref $options{ api }) {
eval "require $options{ api }";
my $class = delete $options{ api };
$options{ api } = $class->new(%options);
};
if( $options{ api }->isAsync ) {
$options{ bucket_class } ||= 'Backblaze::B2::v1::Bucket';
$options{ file_class } ||= 'Backblaze::B2::v1::File';
} else {
$options{ bucket_class } ||= 'Backblaze::B2::v1::Bucket::Synchronized';
$options{ file_class } ||= 'Backblaze::B2::v1::File::Synchronized';
};
bless \%options => $class
}
sub read_credentials {
my( $self, @args ) = @_;
$self->api->read_credentials(@args)
}
sub authorize_account {
my( $self, @args ) = @_;
$self->api->authorize_account(@args)
}
sub _new_bucket {
my( $self, %options ) = @_;
$self->{bucket_class}->new(
%options,
api => $self->api,
parent => $self,
file_class => $self->{file_class}
)
}
sub await($) {
my $promise = $_[0];
my @res;
if( $promise->is_unfulfilled ) {
require AnyEvent;
my $await = AnyEvent->condvar;
$promise->then(sub{
$await->send(@_);
}, sub {
warn "@_";
});
@res = $await->recv;
} else {
warn "Have results already";
@res = @{ $promise->result }
}
@res
};
sub payload($) {
my( $ok, $msg, @results ) = await( $_[0] );
if(! $ok) { croak $msg };
return wantarray ? @results : $results[0];
}
=head2 C<< ->buckets >>
my @buckets = $b2->buckets();
Returns a list of L<Backblaze::B2::Bucket> objects associated with
the B2 account.
=cut
sub buckets {
my( $self ) = @_;
my $list = $self->api->asyncApi->list_buckets()->then( sub {
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.873 second using v1.00-cache-2.02-grep-82fe00e-cpan-503542c4f10 )