Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/vrurg/raku-www-gcloud-api-storage

Google Cloud Storage API for WWW::GCloud
https://github.com/vrurg/raku-www-gcloud-api-storage

Last synced: about 2 months ago
JSON representation

Google Cloud Storage API for WWW::GCloud

Awesome Lists containing this project

README

        

README

hr,
img {
box-sizing: content-box
}
body::after,
body::before,
hr::after,
hr::before {
display: table;
content: ""
}
a,
a:not([href]) {
text-decoration: none
}

hr,
svg:not(:root) {
overflow: hidden
}

img,
table tr {
background-color: #fff
}

pre,
table {
overflow: auto
}

dl,
dl dt,
hr,
pre code,
pre>code,
td,
th {
padding: 0
}

input,
pre code {
overflow: visible
}

pre,
pre code {
word-wrap: normal
}

body {
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
color: #333;
font-family: "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
font-size: 16px;
line-height: 1.5;
word-wrap: break-word;
width: 820px;
margin: 2em auto;
}

a {
background-color: transparent;
-webkit-text-decoration-skip: objects;
color: #4078c0
}

a:active,
a:hover {
outline-width: 0;
text-decoration: underline
}

h1 {
margin: .67em 0
}

img {
border-style: none;
max-width: 100%
}

h1,
h2 {
padding-bottom: .3em;
border-bottom: 1px solid #eee
}

input {
font: inherit;
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit
}

* {
box-sizing: border-box
}

strong {
font-weight: 600
}

body::after,
hr::after {
clear: both
}

table {
border-spacing: 0;
border-collapse: collapse;
display: block;
width: 100%
}

blockquote {
margin: 0;
padding: 0 1em;
color: #777;
border-left: .25em solid #ddd
}

ol ol,
ul ol {
list-style-type: lower-roman
}

ol ol ol,
ol ul ol,
ul ol ol,
ul ul ol {
list-style-type: lower-alpha
}

dd {
margin-left: 0
}

code {
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace
}

pre {
font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace
}

input {
-webkit-font-feature-settings: "liga" 0;
font-feature-settings: "liga" 0
}

body>:first-child {
margin-top: 0!important
}

body>:last-child {
margin-bottom: 0!important
}

a:not([href]) {
color: inherit
}

blockquote,
dl,
ol,
p,
pre,
table,
ul {
margin-top: 0;
margin-bottom: 16px
}

hr {
background: #e7e7e7;
height: .25em;
margin: 24px 0;
border: 0
}

blockquote>:first-child {
margin-top: 0
}

blockquote>:last-child {
margin-bottom: 0
}

h1,
h2,
h3,
h4,
h5,
h6 {
margin-top: 24px;
margin-bottom: 16px;
font-weight: 600;
line-height: 1.25
}

dl dt,
table th {
font-weight: 700
}

h1 code,
h1 tt,
h2 code,
h2 tt,
h3 code,
h3 tt,
h4 code,
h4 tt,
h5 code,
h5 tt,
h6 code,
h6 tt {
font-size: inherit
}

h1 {
font-size: 2em
}

h2 {
font-size: 1.5em
}

h3 {
font-size: 1.25em
}

h4 {
font-size: 1em
}

h5 {
font-size: .875em
}

h6 {
font-size: .85em;
color: #777
}

ol,
ul {
padding-left: 2em
}

ol ol,
ol ul,
ul ol,
ul ul {
margin-top: 0;
margin-bottom: 0
}

li>p {
margin-top: 16px
}

li+li {
margin-top: .25em
}

dl dt {
margin-top: 16px;
font-size: 1em;
font-style: italic
}

dl dd {
padding: 0 16px;
margin-bottom: 16px
}

table td,
table th {
padding: 6px 13px;
border: 1px solid #ddd
}

table tr {
border-top: 1px solid #ccc
}

table tr:nth-child(2n) {
background-color: #f8f8f8
}

code {
padding: .2em 0;
margin: 0;
font-size: 85%;
background-color: rgba(0, 0, 0, .04);
border-radius: 3px
}

code::after,
code::before {
letter-spacing: -.2em;
content: "\00a0"
}

pre>code {
margin: 0;
font-size: 100%;
word-break: normal;
white-space: pre;
background: 0 0;
border: 0
}

pre {
padding: 16px;
font-size: 85%;
line-height: 1.45;
background-color: #f7f7f7;
border-radius: 3px
}

pre code {
display: inline;
max-width: auto;
margin: 0;
line-height: inherit;
background-color: transparent;
border: 0
}

pre code::after,
pre code::before {
content: normal
}

kbd {
display: inline-block;
padding: 3px 5px;
font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
line-height: 10px;
color: #555;
vertical-align: middle;
background-color: #fcfcfc;
border: 1px solid #ccc;
border-bottom-color: #bbb;
border-radius: 3px;
box-shadow: inset 0 -1px 0 #bbb
}

hr {
border-bottom-color: #eee
}


.toc-level-1 .toc-text { padding-left: 1.5em; }
.toc-level-2 .toc-text { padding-left: 2.5em; }
.toc-level-3 .toc-text { padding-left: 3.5em; }
.toc-level-4 .toc-text { padding-left: 4.5em; }
.toc-level-5 .toc-text { padding-left: 5.5em; }
#TOC * { border-width: 0; }
li > p { margin: inherit; }
li > .pod-block-code { margin-top: 16px; }


Table of Contents


1NAME
2SYNOPSIS
3DESCRIPTION
3.1Status
3.2Uploading
4COPYRIGHT
5LICENSE


NAME


WWW::GCloud::API::Storage - WWW::GCloud implementation of Google Storage API


SYNOPSIS


use v6.e.PREVIEW;

use WWW::GCloud;
use WWW::GCloud::API::Storage;
use WWW::GCloud::R::Storage::Object;

my $gcloud = WWW::GCloud.new;
my $st = $gcloud.storage;

await $st.objects.get("bucket-name", "object-name.ext", :media)
.andthen({ .result.send-to("output-file.ext", :!override) });


DESCRIPTION


This module lacks complete documentation due to me not currently able to write it. Please, see some notes for WWW::GCloud framework. And look into exmaples/ where I tried to provide meaningful code to follow.


Status


This module is pre-beta, pre-anything. It is incomplete and likely not well thought out at places. But it already lets you do a lot with your storages.


If there is anything you need but it is missing then, please, consider implementing it and submitting a PR. Any other approach would barely proces any outcome for what I do apologize!


Either way, this module can be used as a reference implementation for a WWW::GGCloud API.


Do not hesitate to get in touch with me would you need any help. I know it could be annoying when a complex module has little to none docs. I'll do my best to fix the situation. But until then feel free to open an issue in the GitHub repository, even if it's just a question.


Uploading


Contrary to a typical convention about API resource methods returning either a Promise or a Supply, when an upload is requested with insert method of objects resource an uploader object is given back to the user. The object would be implementing WWW::GCloud::API::Storage::Upload role.


There are two kinds of uploads are currently implemented: simple and resumable. The former is preferable for smaller files, the latter is better be used for huge ones. Where is the edge between 'small' and 'large' is determined by the bandwidth and quality of one's connection.


Either implementation of the uploader tries to optimize memory usage by reading data in chunks and submitting each chunk to the network immediately. But using :!segemnted flag to create the uploader object turns this behavior off for the simple uploads.


The uploader can feed data directly from a handle without knowing what lays behind the handle. The only requirement is imposed by resumable upload as it has to be able to seek within the stream in case it needs to resend a chunk.


The upload process can be monitored by subscribiting to a Supply provided by uploader's progress method which emits upload events like "buffer read", "retry requested", "done".


Since the actual REST calls are done by the uploader its upload method is the one which complies to the convention of API resource methods returning Promise.


See exmaples/bucket-upload.raku for a reference implementation.


COPYRIGHT


(c) 2023, Vadim Belman <[email protected]>


LICENSE


Artistic License 2.0


See the LICENSE file in this distribution.