AWS-Lambda
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/AWS/Lambda/PSGI.pm view on Meta::CPAN
package AWS::Lambda::PSGI;
use 5.026000;
use utf8;
use strict;
use warnings;
use URI::Escape;
use Plack::Util;
use bytes ();
use MIME::Base64;
use JSON::Types;
use Encode;
use Try::Tiny;
use Plack::Middleware::ReverseProxy;
use AWS::Lambda;
use Scalar::Util qw(reftype);
use JSON::XS qw(encode_json);
sub new {
my $proto = shift;
my $class = ref $proto || $proto;
my $self;
if (@_ == 1 && ref $_[0] eq 'HASH') {
$self = bless {%{$_[0]}}, $class;
} else {
$self = bless {@_}, $class;
}
if (!defined $self->{invoke_mode}) {
my $mode = $ENV{PERL5_LAMBDA_PSGI_INVOKE_MODE}
|| $ENV{AWS_LWA_INVOKE_MODE}; # for compatibility with https://github.com/awslabs/aws-lambda-web-adapter
$self->{invoke_mode} = uc $mode;
}
return $self;
}
sub prepare_app { return }
sub app {
return $_[0]->{app} if scalar(@_) == 1;
return $_[0]->{app} = scalar(@_) == 2 ? $_[1] : [ @_[1..$#_ ]];
}
sub to_app {
my $self = shift;
$self->prepare_app;
return sub { $self->call(@_) };
}
sub wrap {
my($self, $app, @args) = @_;
# Lambda function runs as reverse proxy backend.
# So, we always enable ReverseProxy middleware.
$app = Plack::Middleware::ReverseProxy->wrap($app);
if (ref $self) {
$self->{app} = $app;
} else {
$self = $self->new({ app => $app, @args });
}
return $self->to_app;
}
sub call {
my($self, $env, $ctx) = @_;
# $ctx is added by #26
# fall back to $AWS::Lambda::context because of backward compatibility.
$ctx ||= $AWS::Lambda::context;
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.603 second using v1.00-cache-2.02-grep-82fe00e-cpan-2c419f77a38b )