Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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
- Host: GitHub
- URL: https://github.com/vrurg/raku-www-gcloud-api-storage
- Owner: vrurg
- License: artistic-2.0
- Created: 2023-08-16T14:04:28.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-04-11T23:24:52.000Z (9 months ago)
- Last Synced: 2024-10-11T20:56:51.944Z (2 months ago)
- Language: Raku
- Size: 85 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.html
- Changelog: ChangeLog.html
- License: LICENSE
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 APISYNOPSIS
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 aSupply
, when an upload is requested withinsert
method ofobjects
resource an uploader object is given back to the user. The object would be implementingWWW::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'sprogress
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 returningPromise
.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.