link
This commit is contained in:
7
app.js
Normal file
7
app.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// functions/index.js
|
||||||
|
|
||||||
|
const functions = require('firebase-functions');
|
||||||
|
|
||||||
|
exports.helloWorld = functions.https.onRequest((request, response) => {
|
||||||
|
response.send("Hello from Firebase!");
|
||||||
|
});
|
||||||
305
firebase-debug.log
Normal file
305
firebase-debug.log
Normal file
@@ -0,0 +1,305 @@
|
|||||||
|
[debug] [2025-05-14T14:03:13.852Z] ----------------------------------------------------------------------
|
||||||
|
[debug] [2025-05-14T14:03:13.856Z] Command: /Users/girinb/.nvm/versions/node/v22.15.0/bin/node /Users/girinb/.nvm/versions/node/v22.15.0/bin/firebase deploy --only functions --debug
|
||||||
|
[debug] [2025-05-14T14:03:13.857Z] CLI Version: 14.3.1
|
||||||
|
[debug] [2025-05-14T14:03:13.857Z] Platform: darwin
|
||||||
|
[debug] [2025-05-14T14:03:13.857Z] Node Version: v22.15.0
|
||||||
|
[debug] [2025-05-14T14:03:13.857Z] Time: Wed May 14 2025 23:03:13 GMT+0900 (대한민국 표준시)
|
||||||
|
[debug] [2025-05-14T14:03:13.857Z] ----------------------------------------------------------------------
|
||||||
|
[debug]
|
||||||
|
[debug] [2025-05-14T14:03:13.953Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
|
||||||
|
[debug] [2025-05-14T14:03:13.954Z] > authorizing via signed-in user (sisiorune@gmail.com)
|
||||||
|
[debug] [2025-05-14T14:03:13.954Z] [iam] checking project girinb-runrun for permissions ["cloudfunctions.functions.create","cloudfunctions.functions.delete","cloudfunctions.functions.get","cloudfunctions.functions.list","cloudfunctions.functions.update","cloudfunctions.operations.get","firebase.projects.get"]
|
||||||
|
[debug] [2025-05-14T14:03:13.955Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:13.955Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:13.955Z] >>> [apiv2][query] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions [none]
|
||||||
|
[debug] [2025-05-14T14:03:13.956Z] >>> [apiv2][(partial)header] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions x-goog-quota-user=projects/girinb-runrun
|
||||||
|
[debug] [2025-05-14T14:03:13.956Z] >>> [apiv2][body] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions {"permissions":["cloudfunctions.functions.create","cloudfunctions.functions.delete","cloudfunctions.functions.get","cloudfunctions.functions.list","cloudfunctions.functions.update","cloudfunctions.operations.get","firebase.projects.get"]}
|
||||||
|
[debug] [2025-05-14T14:03:14.759Z] <<< [apiv2][status] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions 200
|
||||||
|
[debug] [2025-05-14T14:03:14.759Z] <<< [apiv2][body] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions {"permissions":["cloudfunctions.functions.create","cloudfunctions.functions.delete","cloudfunctions.functions.get","cloudfunctions.functions.list","cloudfunctions.functions.update","cloudfunctions.operations.get","firebase.projects.get"]}
|
||||||
|
[debug] [2025-05-14T14:03:14.759Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:14.759Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:14.759Z] >>> [apiv2][query] POST https://iam.googleapis.com/v1/projects/girinb-runrun/serviceAccounts/girinb-runrun@appspot.gserviceaccount.com:testIamPermissions [none]
|
||||||
|
[debug] [2025-05-14T14:03:14.760Z] >>> [apiv2][body] POST https://iam.googleapis.com/v1/projects/girinb-runrun/serviceAccounts/girinb-runrun@appspot.gserviceaccount.com:testIamPermissions {"permissions":["iam.serviceAccounts.actAs"]}
|
||||||
|
[debug] [2025-05-14T14:03:15.113Z] <<< [apiv2][status] POST https://iam.googleapis.com/v1/projects/girinb-runrun/serviceAccounts/girinb-runrun@appspot.gserviceaccount.com:testIamPermissions 200
|
||||||
|
[debug] [2025-05-14T14:03:15.113Z] <<< [apiv2][body] POST https://iam.googleapis.com/v1/projects/girinb-runrun/serviceAccounts/girinb-runrun@appspot.gserviceaccount.com:testIamPermissions {"permissions":["iam.serviceAccounts.actAs"]}
|
||||||
|
[info]
|
||||||
|
[info] === Deploying to 'girinb-runrun'...
|
||||||
|
[info]
|
||||||
|
[info] i deploying functions
|
||||||
|
[debug] [2025-05-14T14:03:15.116Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:15.116Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:15.116Z] >>> [apiv2][query] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudresourcemanager.googleapis.com [none]
|
||||||
|
[debug] [2025-05-14T14:03:15.116Z] >>> [apiv2][(partial)header] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudresourcemanager.googleapis.com x-goog-quota-user=projects/girinb-runrun
|
||||||
|
[debug] [2025-05-14T14:03:16.263Z] <<< [apiv2][status] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudresourcemanager.googleapis.com 200
|
||||||
|
[debug] [2025-05-14T14:03:16.263Z] <<< [apiv2][body] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudresourcemanager.googleapis.com [omitted]
|
||||||
|
[debug] [2025-05-14T14:03:16.263Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:16.263Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:16.264Z] >>> [apiv2][query] GET https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun [none]
|
||||||
|
[debug] [2025-05-14T14:03:16.476Z] <<< [apiv2][status] GET https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun 200
|
||||||
|
[debug] [2025-05-14T14:03:16.477Z] <<< [apiv2][body] GET https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun {"projectNumber":"476799073767","projectId":"girinb-runrun","lifecycleState":"ACTIVE","name":"girinb-runrun","labels":{"firebase":"enabled"},"createTime":"2024-04-16T10:50:42.745517Z"}
|
||||||
|
[info] i functions: preparing codebase default for deployment
|
||||||
|
[info] i functions: ensuring required API cloudfunctions.googleapis.com is enabled...
|
||||||
|
[debug] [2025-05-14T14:03:16.479Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:16.479Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:16.480Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:16.480Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[info] i functions: ensuring required API cloudbuild.googleapis.com is enabled...
|
||||||
|
[debug] [2025-05-14T14:03:16.480Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:16.480Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[info] i artifactregistry: ensuring required API artifactregistry.googleapis.com is enabled...
|
||||||
|
[debug] [2025-05-14T14:03:16.480Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:16.480Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:16.481Z] >>> [apiv2][query] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudfunctions.googleapis.com [none]
|
||||||
|
[debug] [2025-05-14T14:03:16.481Z] >>> [apiv2][(partial)header] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudfunctions.googleapis.com x-goog-quota-user=projects/girinb-runrun
|
||||||
|
[debug] [2025-05-14T14:03:16.482Z] >>> [apiv2][query] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/runtimeconfig.googleapis.com [none]
|
||||||
|
[debug] [2025-05-14T14:03:16.482Z] >>> [apiv2][(partial)header] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/runtimeconfig.googleapis.com x-goog-quota-user=projects/girinb-runrun
|
||||||
|
[debug] [2025-05-14T14:03:16.484Z] >>> [apiv2][query] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudbuild.googleapis.com [none]
|
||||||
|
[debug] [2025-05-14T14:03:16.484Z] >>> [apiv2][(partial)header] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudbuild.googleapis.com x-goog-quota-user=projects/girinb-runrun
|
||||||
|
[debug] [2025-05-14T14:03:16.486Z] >>> [apiv2][query] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/artifactregistry.googleapis.com [none]
|
||||||
|
[debug] [2025-05-14T14:03:16.486Z] >>> [apiv2][(partial)header] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/artifactregistry.googleapis.com x-goog-quota-user=projects/girinb-runrun
|
||||||
|
[debug] [2025-05-14T14:03:17.123Z] <<< [apiv2][status] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudfunctions.googleapis.com 200
|
||||||
|
[debug] [2025-05-14T14:03:17.123Z] <<< [apiv2][body] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudfunctions.googleapis.com [omitted]
|
||||||
|
[info] ✔ functions: required API cloudfunctions.googleapis.com is enabled
|
||||||
|
[debug] [2025-05-14T14:03:17.553Z] <<< [apiv2][status] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/runtimeconfig.googleapis.com 200
|
||||||
|
[debug] [2025-05-14T14:03:17.554Z] <<< [apiv2][body] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/runtimeconfig.googleapis.com [omitted]
|
||||||
|
[debug] [2025-05-14T14:03:17.566Z] <<< [apiv2][status] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/artifactregistry.googleapis.com 200
|
||||||
|
[debug] [2025-05-14T14:03:17.566Z] <<< [apiv2][body] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/artifactregistry.googleapis.com [omitted]
|
||||||
|
[info] ✔ artifactregistry: required API artifactregistry.googleapis.com is enabled
|
||||||
|
[debug] [2025-05-14T14:03:17.930Z] <<< [apiv2][status] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudbuild.googleapis.com 200
|
||||||
|
[debug] [2025-05-14T14:03:17.930Z] <<< [apiv2][body] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudbuild.googleapis.com [omitted]
|
||||||
|
[info] ✔ functions: required API cloudbuild.googleapis.com is enabled
|
||||||
|
[debug] [2025-05-14T14:03:17.930Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:17.931Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:17.931Z] >>> [apiv2][query] GET https://firebase.googleapis.com/v1beta1/projects/girinb-runrun/adminSdkConfig [none]
|
||||||
|
[debug] [2025-05-14T14:03:19.217Z] <<< [apiv2][status] GET https://firebase.googleapis.com/v1beta1/projects/girinb-runrun/adminSdkConfig 200
|
||||||
|
[debug] [2025-05-14T14:03:19.217Z] <<< [apiv2][body] GET https://firebase.googleapis.com/v1beta1/projects/girinb-runrun/adminSdkConfig {"projectId":"girinb-runrun","databaseURL":"https://girinb-runrun-default-rtdb.firebaseio.com","storageBucket":"girinb-runrun.appspot.com","locationId":"asia-northeast3"}
|
||||||
|
[debug] [2025-05-14T14:03:19.218Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:19.218Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:19.218Z] >>> [apiv2][query] GET https://runtimeconfig.googleapis.com/v1beta1/projects/girinb-runrun/configs [none]
|
||||||
|
[debug] [2025-05-14T14:03:19.701Z] <<< [apiv2][status] GET https://runtimeconfig.googleapis.com/v1beta1/projects/girinb-runrun/configs 200
|
||||||
|
[debug] [2025-05-14T14:03:19.701Z] <<< [apiv2][body] GET https://runtimeconfig.googleapis.com/v1beta1/projects/girinb-runrun/configs {}
|
||||||
|
[debug] [2025-05-14T14:03:19.703Z] Validating nodejs source
|
||||||
|
[warn] ⚠ functions: Runtime Node.js 18 was deprecated on 2025-04-30 and will be decommissioned on 2025-10-31, after which you will not be able to deploy without upgrading. Consider upgrading now to avoid disruption. See https://cloud.google.com/functions/docs/runtime-support for full details on the lifecycle policy
|
||||||
|
[warn] ⚠ functions: package.json indicates an outdated version of firebase-functions. Please upgrade using npm install --save firebase-functions@latest in your functions directory.
|
||||||
|
[warn] ⚠ functions: Please note that there will be breaking changes when you upgrade.
|
||||||
|
[debug] [2025-05-14T14:03:20.200Z] > [functions] package.json contents: {
|
||||||
|
"name": "functions",
|
||||||
|
"description": "Cloud Functions for Firebase",
|
||||||
|
"scripts": {
|
||||||
|
"serve": "firebase emulators:start --only functions",
|
||||||
|
"shell": "firebase functions:shell",
|
||||||
|
"start": "npm run shell",
|
||||||
|
"deploy": "firebase deploy --only functions",
|
||||||
|
"logs": "firebase functions:log"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "18"
|
||||||
|
},
|
||||||
|
"main": "index.js",
|
||||||
|
"dependencies": {
|
||||||
|
"firebase-admin": "^12.1.0",
|
||||||
|
"firebase-functions": "^5.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"firebase-functions-test": "^3.1.0"
|
||||||
|
},
|
||||||
|
"private": true
|
||||||
|
}
|
||||||
|
[debug] [2025-05-14T14:03:20.200Z] Building nodejs source
|
||||||
|
[info] i functions: Loading and analyzing source code for codebase default to determine what to deploy
|
||||||
|
[debug] [2025-05-14T14:03:20.202Z] Could not find functions.yaml. Must use http discovery
|
||||||
|
[debug] [2025-05-14T14:03:20.207Z] Found firebase-functions binary at '/Users/girinb/node_testing/functions/node_modules/.bin/firebase-functions'
|
||||||
|
[info] Serving at port 8397
|
||||||
|
|
||||||
|
[debug] [2025-05-14T14:03:20.684Z] Got response from /__/functions.yaml {"endpoints":{"helloWorld":{"platform":"gcfv1","availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"serviceAccountEmail":null,"vpc":null,"httpsTrigger":{},"entryPoint":"helloWorld"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}}
|
||||||
|
[info] i extensions: ensuring required API firebaseextensions.googleapis.com is enabled...
|
||||||
|
[debug] [2025-05-14T14:03:24.706Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:24.706Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:24.706Z] >>> [apiv2][query] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/firebaseextensions.googleapis.com [none]
|
||||||
|
[debug] [2025-05-14T14:03:24.706Z] >>> [apiv2][(partial)header] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/firebaseextensions.googleapis.com x-goog-quota-user=projects/girinb-runrun
|
||||||
|
[debug] [2025-05-14T14:03:25.804Z] <<< [apiv2][status] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/firebaseextensions.googleapis.com 200
|
||||||
|
[debug] [2025-05-14T14:03:25.805Z] <<< [apiv2][body] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/firebaseextensions.googleapis.com [omitted]
|
||||||
|
[info] ✔ extensions: required API firebaseextensions.googleapis.com is enabled
|
||||||
|
[debug] [2025-05-14T14:03:25.805Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
|
||||||
|
[debug] [2025-05-14T14:03:25.805Z] > authorizing via signed-in user (sisiorune@gmail.com)
|
||||||
|
[debug] [2025-05-14T14:03:25.805Z] [iam] checking project girinb-runrun for permissions ["firebase.projects.get","firebaseextensions.instances.list"]
|
||||||
|
[debug] [2025-05-14T14:03:25.805Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:25.805Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:25.805Z] >>> [apiv2][query] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions [none]
|
||||||
|
[debug] [2025-05-14T14:03:25.805Z] >>> [apiv2][(partial)header] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions x-goog-quota-user=projects/girinb-runrun
|
||||||
|
[debug] [2025-05-14T14:03:25.805Z] >>> [apiv2][body] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions {"permissions":["firebase.projects.get","firebaseextensions.instances.list"]}
|
||||||
|
[debug] [2025-05-14T14:03:26.556Z] <<< [apiv2][status] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions 200
|
||||||
|
[debug] [2025-05-14T14:03:26.557Z] <<< [apiv2][body] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions {"permissions":["firebase.projects.get","firebaseextensions.instances.list"]}
|
||||||
|
[debug] [2025-05-14T14:03:26.557Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:26.557Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:26.558Z] >>> [apiv2][query] GET https://firebaseextensions.googleapis.com/v1beta/projects/girinb-runrun/instances pageSize=100&pageToken=
|
||||||
|
[debug] [2025-05-14T14:03:27.499Z] <<< [apiv2][status] GET https://firebaseextensions.googleapis.com/v1beta/projects/girinb-runrun/instances 200
|
||||||
|
[debug] [2025-05-14T14:03:27.499Z] <<< [apiv2][body] GET https://firebaseextensions.googleapis.com/v1beta/projects/girinb-runrun/instances {}
|
||||||
|
[info] i functions: preparing functions directory for uploading...
|
||||||
|
[info] i functions: packaged /Users/girinb/node_testing/functions (62.16 KB) for uploading
|
||||||
|
[debug] [2025-05-14T14:03:27.523Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:27.523Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:27.524Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/-/functions [none]
|
||||||
|
[debug] [2025-05-14T14:03:28.281Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/-/functions 200
|
||||||
|
[debug] [2025-05-14T14:03:28.281Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/-/functions {}
|
||||||
|
[debug] [2025-05-14T14:03:28.282Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:28.282Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:28.282Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v2/projects/girinb-runrun/locations/-/functions filter=environment%3D%22GEN_2%22
|
||||||
|
[debug] [2025-05-14T14:03:29.629Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v2/projects/girinb-runrun/locations/-/functions 200
|
||||||
|
[debug] [2025-05-14T14:03:29.629Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v2/projects/girinb-runrun/locations/-/functions {}
|
||||||
|
[debug] [2025-05-14T14:03:29.630Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:29.631Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:29.631Z] >>> [apiv2][query] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudresourcemanager.googleapis.com [none]
|
||||||
|
[debug] [2025-05-14T14:03:29.631Z] >>> [apiv2][(partial)header] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudresourcemanager.googleapis.com x-goog-quota-user=projects/girinb-runrun
|
||||||
|
[debug] [2025-05-14T14:03:29.922Z] <<< [apiv2][status] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudresourcemanager.googleapis.com 200
|
||||||
|
[debug] [2025-05-14T14:03:29.922Z] <<< [apiv2][body] GET https://serviceusage.googleapis.com/v1/projects/girinb-runrun/services/cloudresourcemanager.googleapis.com [omitted]
|
||||||
|
[debug] [2025-05-14T14:03:29.922Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:29.922Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:29.922Z] >>> [apiv2][query] GET https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun [none]
|
||||||
|
[debug] [2025-05-14T14:03:30.143Z] <<< [apiv2][status] GET https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun 200
|
||||||
|
[debug] [2025-05-14T14:03:30.144Z] <<< [apiv2][body] GET https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun {"projectNumber":"476799073767","projectId":"girinb-runrun","lifecycleState":"ACTIVE","name":"girinb-runrun","labels":{"firebase":"enabled"},"createTime":"2024-04-16T10:50:42.745517Z"}
|
||||||
|
[debug] [2025-05-14T14:03:30.145Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:30.145Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:30.146Z] >>> [apiv2][query] GET https://cloudbilling.googleapis.com/v1/projects/girinb-runrun/billingInfo [none]
|
||||||
|
[debug] [2025-05-14T14:03:31.355Z] <<< [apiv2][status] GET https://cloudbilling.googleapis.com/v1/projects/girinb-runrun/billingInfo 200
|
||||||
|
[debug] [2025-05-14T14:03:31.356Z] <<< [apiv2][body] GET https://cloudbilling.googleapis.com/v1/projects/girinb-runrun/billingInfo {"name":"projects/girinb-runrun/billingInfo","projectId":"girinb-runrun","billingAccountName":"billingAccounts/01E72B-CF605E-F61383","billingEnabled":true}
|
||||||
|
[debug] [2025-05-14T14:03:31.357Z] [functions] found 1 new HTTP functions, testing setIamPolicy permission...
|
||||||
|
[debug] [2025-05-14T14:03:31.358Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:31.358Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:31.358Z] >>> [apiv2][query] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions [none]
|
||||||
|
[debug] [2025-05-14T14:03:31.358Z] >>> [apiv2][(partial)header] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions x-goog-quota-user=projects/girinb-runrun
|
||||||
|
[debug] [2025-05-14T14:03:31.358Z] >>> [apiv2][body] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions {"permissions":["cloudfunctions.functions.setIamPolicy"]}
|
||||||
|
[debug] [2025-05-14T14:03:31.534Z] <<< [apiv2][status] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions 200
|
||||||
|
[debug] [2025-05-14T14:03:31.535Z] <<< [apiv2][body] POST https://cloudresourcemanager.googleapis.com/v1/projects/girinb-runrun:testIamPermissions {"permissions":["cloudfunctions.functions.setIamPolicy"]}
|
||||||
|
[debug] [2025-05-14T14:03:31.535Z] [functions] found setIamPolicy permission, proceeding with deploy
|
||||||
|
[debug] [2025-05-14T14:03:31.536Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:31.536Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:31.536Z] >>> [apiv2][query] POST https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/functions:generateUploadUrl [none]
|
||||||
|
[debug] [2025-05-14T14:03:31.536Z] >>> [apiv2][body] POST https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/functions:generateUploadUrl {}
|
||||||
|
[debug] [2025-05-14T14:03:42.638Z] <<< [apiv2][status] POST https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/functions:generateUploadUrl 200
|
||||||
|
[debug] [2025-05-14T14:03:42.639Z] <<< [apiv2][body] POST https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/functions:generateUploadUrl {"uploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D"}
|
||||||
|
[debug] [2025-05-14T14:03:42.640Z] >>> [apiv2][query] PUT https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip GoogleAccessId=service-476799073767%40gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D
|
||||||
|
[debug] [2025-05-14T14:03:42.641Z] >>> [apiv2][body] PUT https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip [stream]
|
||||||
|
[debug] [2025-05-14T14:03:43.497Z] <<< [apiv2][status] PUT https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip 200
|
||||||
|
[debug] [2025-05-14T14:03:43.497Z] <<< [apiv2][body] PUT https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip [omitted]
|
||||||
|
[info] ✔ functions: functions folder uploaded successfully
|
||||||
|
[info] i functions: creating Node.js 18 (1st Gen) function helloWorld(us-central1)...
|
||||||
|
[debug] [2025-05-14T14:03:43.503Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:43.503Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:43.504Z] >>> [apiv2][query] POST https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/functions [none]
|
||||||
|
[debug] [2025-05-14T14:03:43.504Z] >>> [apiv2][body] POST https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/functions {"name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","entryPoint":"helloWorld","runtime":"nodejs18","dockerRegistry":"ARTIFACT_REGISTRY","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"minInstances":null,"maxInstances":null,"ingressSettings":null,"environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"serviceAccountEmail":null,"availableMemoryMb":null,"timeout":null,"vpcConnector":null,"vpcConnectorEgressSettings":null,"buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""}}
|
||||||
|
[debug] [2025-05-14T14:03:44.503Z] <<< [apiv2][status] POST https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/functions 200
|
||||||
|
[debug] [2025-05-14T14:03:44.503Z] <<< [apiv2][body] POST https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/functions {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","updateTime":"2025-05-14T14:03:44.325674558Z"}}
|
||||||
|
[debug] [2025-05-14T14:03:44.504Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:44.504Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:44.505Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:03:45.523Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:03:45.523Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:03:44.325674558Z"}}
|
||||||
|
[debug] [2025-05-14T14:03:46.026Z] [create-default-us-central1-helloWorld] Retrying task index 0
|
||||||
|
[debug] [2025-05-14T14:03:46.026Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:46.026Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:46.027Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:03:46.498Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:03:46.499Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:03:44.325674558Z"}}
|
||||||
|
[debug] [2025-05-14T14:03:47.500Z] [create-default-us-central1-helloWorld] Retrying task index 0
|
||||||
|
[debug] [2025-05-14T14:03:47.501Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:47.501Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:47.501Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:03:48.624Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:03:48.624Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:03:44.325674558Z","buildId":"9e04218b-4d6b-4217-a6e6-85d03f15973f","buildName":"projects/476799073767/locations/us-central1/builds/9e04218b-4d6b-4217-a6e6-85d03f15973f"}}
|
||||||
|
[debug] [2025-05-14T14:03:50.626Z] [create-default-us-central1-helloWorld] Retrying task index 0
|
||||||
|
[debug] [2025-05-14T14:03:50.627Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:50.627Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:50.627Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:03:51.121Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:03:51.121Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:03:44.325674558Z","buildId":"9e04218b-4d6b-4217-a6e6-85d03f15973f","buildName":"projects/476799073767/locations/us-central1/builds/9e04218b-4d6b-4217-a6e6-85d03f15973f"}}
|
||||||
|
[debug] [2025-05-14T14:03:55.124Z] [create-default-us-central1-helloWorld] Retrying task index 0
|
||||||
|
[debug] [2025-05-14T14:03:55.124Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:55.124Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:03:55.125Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:03:55.508Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:03:55.509Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:03:44.325674558Z","buildId":"9e04218b-4d6b-4217-a6e6-85d03f15973f","buildName":"projects/476799073767/locations/us-central1/builds/9e04218b-4d6b-4217-a6e6-85d03f15973f"}}
|
||||||
|
[debug] [2025-05-14T14:04:03.511Z] [create-default-us-central1-helloWorld] Retrying task index 0
|
||||||
|
[debug] [2025-05-14T14:04:03.513Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:04:03.513Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:04:03.513Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:04:04.822Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:04:04.822Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:03:44.325674558Z","buildId":"9e04218b-4d6b-4217-a6e6-85d03f15973f","buildName":"projects/476799073767/locations/us-central1/builds/9e04218b-4d6b-4217-a6e6-85d03f15973f"}}
|
||||||
|
[debug] [2025-05-14T14:04:14.825Z] [create-default-us-central1-helloWorld] Retrying task index 0
|
||||||
|
[debug] [2025-05-14T14:04:14.826Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:04:14.826Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:04:14.826Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:04:15.530Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:04:15.531Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:03:44.325674558Z","buildId":"9e04218b-4d6b-4217-a6e6-85d03f15973f","buildName":"projects/476799073767/locations/us-central1/builds/9e04218b-4d6b-4217-a6e6-85d03f15973f"}}
|
||||||
|
[debug] [2025-05-14T14:04:25.533Z] [create-default-us-central1-helloWorld] Retrying task index 0
|
||||||
|
[debug] [2025-05-14T14:04:25.533Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:04:25.534Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:04:25.534Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:04:26.242Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:04:26.242Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:03:44.325674558Z","buildId":"9e04218b-4d6b-4217-a6e6-85d03f15973f","buildName":"projects/476799073767/locations/us-central1/builds/9e04218b-4d6b-4217-a6e6-85d03f15973f"}}
|
||||||
|
[debug] [2025-05-14T14:04:36.243Z] [create-default-us-central1-helloWorld] Retrying task index 0
|
||||||
|
[debug] [2025-05-14T14:04:36.244Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:04:36.245Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:04:36.245Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:04:36.994Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:04:36.995Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:03:44.325674558Z","buildId":"9e04218b-4d6b-4217-a6e6-85d03f15973f","buildName":"projects/476799073767/locations/us-central1/builds/9e04218b-4d6b-4217-a6e6-85d03f15973f"}}
|
||||||
|
[debug] [2025-05-14T14:04:46.998Z] [create-default-us-central1-helloWorld] Retrying task index 0
|
||||||
|
[debug] [2025-05-14T14:04:47.001Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:04:47.001Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:04:47.001Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:04:47.545Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:04:47.546Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:03:44.325674558Z","buildId":"9e04218b-4d6b-4217-a6e6-85d03f15973f","sourceToken":"2d2e5813-b0dd-46a8-95d9-81d21454cae0","buildName":"projects/476799073767/locations/us-central1/builds/9e04218b-4d6b-4217-a6e6-85d03f15973f"}}
|
||||||
|
[debug] [2025-05-14T14:04:47.547Z] Got source token 2d2e5813-b0dd-46a8-95d9-81d21454cae0 for region us-central1
|
||||||
|
[debug] [2025-05-14T14:04:57.550Z] [create-default-us-central1-helloWorld] Retrying task index 0
|
||||||
|
[debug] [2025-05-14T14:04:57.553Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:04:57.553Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:04:57.553Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:04:58.153Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:04:58.155Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:03:44.325674558Z","buildId":"9e04218b-4d6b-4217-a6e6-85d03f15973f","sourceToken":"2d2e5813-b0dd-46a8-95d9-81d21454cae0","buildName":"projects/476799073767/locations/us-central1/builds/9e04218b-4d6b-4217-a6e6-85d03f15973f"}}
|
||||||
|
[debug] [2025-05-14T14:04:58.159Z] Got source token 2d2e5813-b0dd-46a8-95d9-81d21454cae0 for region us-central1
|
||||||
|
[debug] [2025-05-14T14:05:08.161Z] [create-default-us-central1-helloWorld] Retrying task index 0
|
||||||
|
[debug] [2025-05-14T14:05:08.161Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:05:08.161Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:05:08.161Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:05:08.762Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:05:08.762Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:03:44.325674558Z","buildId":"9e04218b-4d6b-4217-a6e6-85d03f15973f","sourceToken":"2d2e5813-b0dd-46a8-95d9-81d21454cae0","buildName":"projects/476799073767/locations/us-central1/builds/9e04218b-4d6b-4217-a6e6-85d03f15973f"}}
|
||||||
|
[debug] [2025-05-14T14:05:08.763Z] Got source token 2d2e5813-b0dd-46a8-95d9-81d21454cae0 for region us-central1
|
||||||
|
[debug] [2025-05-14T14:05:18.763Z] [create-default-us-central1-helloWorld] Retrying task index 0
|
||||||
|
[debug] [2025-05-14T14:05:18.764Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:05:18.764Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:05:18.765Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx [none]
|
||||||
|
[debug] [2025-05-14T14:05:19.997Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx 200
|
||||||
|
[debug] [2025-05-14T14:05:19.998Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx {"name":"operations/cHJvamVjdHMvZ2lyaW5iLXJ1bnJ1bi9sb2NhdGlvbnMvdXMtY2VudHJhbDEvb3BlcmF0aW9ucy9vcGVyYXRpb24tMTc0NzIzMTQyMzg3OS02MzUxOTA0NWM1OWY4LTRlZGFkYzRiLWEyNzcxNGMx","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","type":"CREATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"securityLevel":"SECURE_ALWAYS"},"entryPoint":"helloWorld","updateTime":"1970-01-01T00:00:00Z","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip?GoogleAccessId=service-476799073767@gcf-admin-robot.iam.gserviceaccount.com&Expires=1747233222&Signature=u46DPN24DL5Z38WOuOG7eQWm2TtNRx1PzQZ207bQrZMKWwgr66lLnUo6DrEap1kO9d6kwNZCnwYrkEOfmCd8QDWkiVbsr58MZO%2FLviu81pJBQIWzw%2Bt%2BZqYRrEdFSIq5zYWtZvxbw%2Fglj4bIKE%2FsgGB2RWFAQq0c5WFxb24us8QFxa1baE6p7T%2BtaGxG8XWcj%2BbopFW2RtGfb%2FgorJF90Zx8OER2yPt5MgKa3Q4KCi8unqzLxiod0cHZeB9Rwtd8RS1qhsJ7nWVbWKDLUyYRMlu9CakRfh2777hNyji6VHqibC8zvhsLk9xKbIbehlfQMFAl3QZ3aBhi3uNE39EibA%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"dockerRegistry":"ARTIFACT_REGISTRY"},"versionId":"1","updateTime":"2025-05-14T14:05:09.538996132Z","buildId":"9e04218b-4d6b-4217-a6e6-85d03f15973f","sourceToken":"2d2e5813-b0dd-46a8-95d9-81d21454cae0","buildName":"projects/476799073767/locations/us-central1/builds/9e04218b-4d6b-4217-a6e6-85d03f15973f"},"done":true,"response":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/girinb-runrun/locations/us-central1/functions/helloWorld","httpsTrigger":{"url":"https://us-central1-girinb-runrun.cloudfunctions.net/helloWorld","securityLevel":"SECURE_ALWAYS"},"status":"ACTIVE","entryPoint":"helloWorld","timeout":"60s","availableMemoryMb":256,"serviceAccountEmail":"girinb-runrun@appspot.gserviceaccount.com","updateTime":"2025-05-14T14:03:44.320090052Z","versionId":"1","labels":{"deployment-tool":"cli-firebase","firebase-functions-hash":"14482821a43ce6b9a6304c926ea2098b230b8ab8"},"sourceUploadUrl":"https://storage.googleapis.com/uploads-352832638533.us-central1.cloudfunctions.appspot.com/ec347c6d-8533-472b-a13f-319ce9e6689e.zip","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"girinb-runrun\",\"databaseURL\":\"https://girinb-runrun-default-rtdb.firebaseio.com\",\"storageBucket\":\"girinb-runrun.appspot.com\",\"locationId\":\"asia-northeast3\"}","GCLOUD_PROJECT":"girinb-runrun","EVENTARC_CLOUD_EVENT_SOURCE":"projects/girinb-runrun/locations/us-central1/functions/helloWorld"},"runtime":"nodejs18","ingressSettings":"ALLOW_ALL","buildId":"9e04218b-4d6b-4217-a6e6-85d03f15973f","buildEnvironmentVariables":{"GOOGLE_NODE_RUN_SCRIPTS":""},"buildName":"projects/476799073767/locations/us-central1/builds/9e04218b-4d6b-4217-a6e6-85d03f15973f","dockerRegistry":"ARTIFACT_REGISTRY","automaticUpdatePolicy":{},"satisfiesPzi":true}}
|
||||||
|
[debug] [2025-05-14T14:05:19.998Z] Got source token 2d2e5813-b0dd-46a8-95d9-81d21454cae0 for region us-central1
|
||||||
|
[debug] [2025-05-14T14:05:20.000Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:05:20.000Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:05:20.000Z] >>> [apiv2][query] POST https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/functions/helloWorld:setIamPolicy [none]
|
||||||
|
[debug] [2025-05-14T14:05:20.000Z] >>> [apiv2][body] POST https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/functions/helloWorld:setIamPolicy {"policy":{"bindings":[{"role":"roles/cloudfunctions.invoker","members":["allUsers"]}],"etag":"","version":3},"updateMask":"bindings,etag,version"}
|
||||||
|
[debug] [2025-05-14T14:05:20.753Z] <<< [apiv2][status] POST https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/functions/helloWorld:setIamPolicy 200
|
||||||
|
[debug] [2025-05-14T14:05:20.753Z] <<< [apiv2][body] POST https://cloudfunctions.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/functions/helloWorld:setIamPolicy {"version":1,"etag":"BwY1GQofzPU=","bindings":[{"role":"roles/cloudfunctions.invoker","members":["allUsers"]}]}
|
||||||
|
[info] ✔ functions[helloWorld(us-central1)] Successful create operation.
|
||||||
|
[debug] [2025-05-14T14:05:20.762Z] Total Function Deployment time: 97252
|
||||||
|
[debug] [2025-05-14T14:05:20.762Z] 1 Functions Deployed
|
||||||
|
[debug] [2025-05-14T14:05:20.762Z] 0 Functions Errored
|
||||||
|
[debug] [2025-05-14T14:05:20.762Z] 0 Function Deployments Aborted
|
||||||
|
[debug] [2025-05-14T14:05:20.762Z] Average Function Deployment time: 97251
|
||||||
|
[info] Function URL (helloWorld(us-central1)): https://us-central1-girinb-runrun.cloudfunctions.net/helloWorld
|
||||||
|
[debug] [2025-05-14T14:05:20.978Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:05:20.978Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:05:20.978Z] >>> [apiv2][query] GET https://artifactregistry.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/repositories/gcf-artifacts [none]
|
||||||
|
[debug] [2025-05-14T14:05:22.888Z] <<< [apiv2][status] GET https://artifactregistry.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/repositories/gcf-artifacts 200
|
||||||
|
[debug] [2025-05-14T14:05:22.888Z] <<< [apiv2][body] GET https://artifactregistry.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/repositories/gcf-artifacts {"name":"projects/girinb-runrun/locations/us-central1/repositories/gcf-artifacts","format":"DOCKER","description":"This repository is created and used by Cloud Functions for storing function docker images.","labels":{"goog-managed-by":"cloudfunctions"},"createTime":"2024-05-03T17:21:07.731240Z","updateTime":"2025-05-14T14:04:35.363398Z","mode":"STANDARD_REPOSITORY","sizeBytes":"553470065","vulnerabilityScanningConfig":{"lastEnableTime":"2024-05-03T17:20:57.348145149Z","enablementState":"SCANNING_DISABLED","enablementStateReason":"API containerscanning.googleapis.com is not enabled."},"satisfiesPzi":true,"registryUri":"us-central1-docker.pkg.dev/girinb-runrun/gcf-artifacts"}
|
||||||
|
[warn] ⚠ functions: No cleanup policy detected for repositories in us-central1. This may result in a small monthly bill as container images accumulate over time.
|
||||||
|
[info] i functions: Configuring cleanup policy for repository in us-central1. Images older than 1 days will be automatically deleted.
|
||||||
|
[debug] [2025-05-14T14:05:28.547Z] Setting up artifact cleanup policy for region us-central1
|
||||||
|
[debug] [2025-05-14T14:05:28.547Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:05:28.547Z] Checked if tokens are valid: true, expires at: 1747233089478
|
||||||
|
[debug] [2025-05-14T14:05:28.548Z] >>> [apiv2][query] PATCH https://artifactregistry.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/repositories/gcf-artifacts updateMask=name%2CcleanupPolicies%2CcleanupPolicyDryRun%2Clabels
|
||||||
|
[debug] [2025-05-14T14:05:28.548Z] >>> [apiv2][body] PATCH https://artifactregistry.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/repositories/gcf-artifacts {"name":"projects/girinb-runrun/locations/us-central1/repositories/gcf-artifacts","cleanupPolicies":{"firebase-functions-cleanup":{"id":"firebase-functions-cleanup","condition":{"tagState":"ANY","olderThan":"86400s"},"action":"DELETE"}},"cleanupPolicyDryRun":false,"labels":{"goog-managed-by":"cloudfunctions"}}
|
||||||
|
[debug] [2025-05-14T14:05:29.749Z] <<< [apiv2][status] PATCH https://artifactregistry.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/repositories/gcf-artifacts 200
|
||||||
|
[debug] [2025-05-14T14:05:29.749Z] <<< [apiv2][body] PATCH https://artifactregistry.googleapis.com/v1/projects/girinb-runrun/locations/us-central1/repositories/gcf-artifacts {"name":"projects/girinb-runrun/locations/us-central1/repositories/gcf-artifacts","format":"DOCKER","description":"This repository is created and used by Cloud Functions for storing function docker images.","labels":{"goog-managed-by":"cloudfunctions"},"createTime":"2024-05-03T17:21:07.731240Z","updateTime":"2025-05-14T14:05:29.585787Z","mode":"STANDARD_REPOSITORY","cleanupPolicies":{"firebase-functions-cleanup":{"id":"firebase-functions-cleanup","action":"DELETE","condition":{"tagState":"ANY","olderThan":"86400s"}}},"vulnerabilityScanningConfig":{"lastEnableTime":"2024-05-03T17:20:57.348145149Z","enablementState":"SCANNING_DISABLED","enablementStateReason":"API containerscanning.googleapis.com is not enabled."},"satisfiesPzi":true}
|
||||||
|
[info] i functions: Configured cleanup policy for repository in us-central1.
|
||||||
|
[info]
|
||||||
|
[info] ✔ Deploy complete!
|
||||||
|
[info]
|
||||||
|
[info] Project Console: https://console.firebase.google.com/project/girinb-runrun/overview
|
||||||
15
firebase.json
Normal file
15
firebase.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"functions": [
|
||||||
|
{
|
||||||
|
"source": "functions",
|
||||||
|
"codebase": "default",
|
||||||
|
"ignore": [
|
||||||
|
"node_modules",
|
||||||
|
".git",
|
||||||
|
"firebase-debug.log",
|
||||||
|
"firebase-debug.*.log",
|
||||||
|
"*.local"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
2
functions/.gitignore
vendored
Normal file
2
functions/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
node_modules/
|
||||||
|
*.local
|
||||||
7
functions/index.js
Normal file
7
functions/index.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// functions/index.js
|
||||||
|
|
||||||
|
const functions = require('firebase-functions');
|
||||||
|
|
||||||
|
exports.helloWorld = functions.https.onRequest((request, response) => {
|
||||||
|
response.send("Hello from Firebase!");
|
||||||
|
});
|
||||||
6399
functions/package-lock.json
generated
Normal file
6399
functions/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
23
functions/package.json
Normal file
23
functions/package.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "functions",
|
||||||
|
"description": "Cloud Functions for Firebase",
|
||||||
|
"scripts": {
|
||||||
|
"serve": "firebase emulators:start --only functions",
|
||||||
|
"shell": "firebase functions:shell",
|
||||||
|
"start": "npm run shell",
|
||||||
|
"deploy": "firebase deploy --only functions",
|
||||||
|
"logs": "firebase functions:log"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "18"
|
||||||
|
},
|
||||||
|
"main": "index.js",
|
||||||
|
"dependencies": {
|
||||||
|
"firebase-admin": "^12.1.0",
|
||||||
|
"firebase-functions": "^5.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"firebase-functions-test": "^3.1.0"
|
||||||
|
},
|
||||||
|
"private": true
|
||||||
|
}
|
||||||
1
node_modules/.bin/firebase-functions
generated
vendored
Symbolic link
1
node_modules/.bin/firebase-functions
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../firebase-functions/lib/bin/firebase-functions.js
|
||||||
1
node_modules/.bin/fxparser
generated
vendored
Symbolic link
1
node_modules/.bin/fxparser
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../fast-xml-parser/src/cli/cli.js
|
||||||
1
node_modules/.bin/mime
generated
vendored
Symbolic link
1
node_modules/.bin/mime
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../mime/cli.js
|
||||||
1
node_modules/.bin/proto-loader-gen-types
generated
vendored
Symbolic link
1
node_modules/.bin/proto-loader-gen-types
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../@grpc/proto-loader/build/bin/proto-loader-gen-types.js
|
||||||
1
node_modules/.bin/semver
generated
vendored
Symbolic link
1
node_modules/.bin/semver
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../semver/bin/semver.js
|
||||||
1
node_modules/.bin/uuid
generated
vendored
Symbolic link
1
node_modules/.bin/uuid
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../uuid/dist/esm/bin/uuid
|
||||||
2926
node_modules/.package-lock.json
generated
vendored
Normal file
2926
node_modules/.package-lock.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
19
node_modules/@fastify/busboy/LICENSE
generated
vendored
Normal file
19
node_modules/@fastify/busboy/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
Copyright Brian White. All rights reserved.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to
|
||||||
|
deal in the Software without restriction, including without limitation the
|
||||||
|
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
IN THE SOFTWARE.
|
||||||
270
node_modules/@fastify/busboy/README.md
generated
vendored
Normal file
270
node_modules/@fastify/busboy/README.md
generated
vendored
Normal file
@@ -0,0 +1,270 @@
|
|||||||
|
# busboy
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
[](https://github.com/fastify/busboy/actions)
|
||||||
|
[](https://standardjs.com/)
|
||||||
|
[](https://github.com/fastify/.github/blob/main/SECURITY.md)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
[](https://www.npmjs.com/package/@fastify/busboy)
|
||||||
|
[](https://www.npmjs.com/package/@fastify/busboy)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
A Node.js module for parsing incoming HTML form data.
|
||||||
|
|
||||||
|
This is an officially supported fork by [fastify](https://github.com/fastify/) organization of the amazing library [originally created](https://github.com/mscdex/busboy) by Brian White,
|
||||||
|
aimed at addressing long-standing issues with it.
|
||||||
|
|
||||||
|
Benchmark (Mean time for 500 Kb payload, 2000 cycles, 1000 cycle warmup):
|
||||||
|
|
||||||
|
| Library | Version | Mean time in nanoseconds (less is better) |
|
||||||
|
|-----------------------|---------|-------------------------------------------|
|
||||||
|
| busboy | 0.3.1 | `340114` |
|
||||||
|
| @fastify/busboy | 1.0.0 | `270984` |
|
||||||
|
|
||||||
|
[Changelog](https://github.com/fastify/busboy/blob/master/CHANGELOG.md) since busboy 0.31.
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
============
|
||||||
|
|
||||||
|
* [Node.js](http://nodejs.org/) 10+
|
||||||
|
|
||||||
|
|
||||||
|
Install
|
||||||
|
=======
|
||||||
|
|
||||||
|
npm i @fastify/busboy
|
||||||
|
|
||||||
|
|
||||||
|
Examples
|
||||||
|
========
|
||||||
|
|
||||||
|
* Parsing (multipart) with default options:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const http = require('node:http');
|
||||||
|
const { inspect } = require('node:util');
|
||||||
|
const Busboy = require('@fastify/busboy');
|
||||||
|
|
||||||
|
http.createServer((req, res) => {
|
||||||
|
if (req.method === 'POST') {
|
||||||
|
const busboy = new Busboy({ headers: req.headers });
|
||||||
|
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
|
||||||
|
console.log(`File [${fieldname}]: filename: ${filename}, encoding: ${encoding}, mimetype: ${mimetype}`);
|
||||||
|
file.on('data', data => {
|
||||||
|
console.log(`File [${fieldname}] got ${data.length} bytes`);
|
||||||
|
});
|
||||||
|
file.on('end', () => {
|
||||||
|
console.log(`File [${fieldname}] Finished`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
busboy.on('field', (fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) => {
|
||||||
|
console.log(`Field [${fieldname}]: value: ${inspect(val)}`);
|
||||||
|
});
|
||||||
|
busboy.on('finish', () => {
|
||||||
|
console.log('Done parsing form!');
|
||||||
|
res.writeHead(303, { Connection: 'close', Location: '/' });
|
||||||
|
res.end();
|
||||||
|
});
|
||||||
|
req.pipe(busboy);
|
||||||
|
} else if (req.method === 'GET') {
|
||||||
|
res.writeHead(200, { Connection: 'close' });
|
||||||
|
res.end(`<html><head></head><body>
|
||||||
|
<form method="POST" enctype="multipart/form-data">
|
||||||
|
<input type="text" name="textfield"><br>
|
||||||
|
<input type="file" name="filefield"><br>
|
||||||
|
<input type="submit">
|
||||||
|
</form>
|
||||||
|
</body></html>`);
|
||||||
|
}
|
||||||
|
}).listen(8000, () => {
|
||||||
|
console.log('Listening for requests');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Example output, using http://nodejs.org/images/ryan-speaker.jpg as the file:
|
||||||
|
//
|
||||||
|
// Listening for requests
|
||||||
|
// File [filefield]: filename: ryan-speaker.jpg, encoding: binary
|
||||||
|
// File [filefield] got 11971 bytes
|
||||||
|
// Field [textfield]: value: 'testing! :-)'
|
||||||
|
// File [filefield] Finished
|
||||||
|
// Done parsing form!
|
||||||
|
```
|
||||||
|
|
||||||
|
* Save all incoming files to disk:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const http = require('node:http');
|
||||||
|
const path = require('node:path');
|
||||||
|
const os = require('node:os');
|
||||||
|
const fs = require('node:fs');
|
||||||
|
|
||||||
|
const Busboy = require('@fastify/busboy');
|
||||||
|
|
||||||
|
http.createServer(function(req, res) {
|
||||||
|
if (req.method === 'POST') {
|
||||||
|
const busboy = new Busboy({ headers: req.headers });
|
||||||
|
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
|
||||||
|
var saveTo = path.join(os.tmpdir(), path.basename(fieldname));
|
||||||
|
file.pipe(fs.createWriteStream(saveTo));
|
||||||
|
});
|
||||||
|
busboy.on('finish', function() {
|
||||||
|
res.writeHead(200, { 'Connection': 'close' });
|
||||||
|
res.end("That's all folks!");
|
||||||
|
});
|
||||||
|
return req.pipe(busboy);
|
||||||
|
}
|
||||||
|
res.writeHead(404);
|
||||||
|
res.end();
|
||||||
|
}).listen(8000, function() {
|
||||||
|
console.log('Listening for requests');
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
* Parsing (urlencoded) with default options:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const http = require('node:http');
|
||||||
|
const { inspect } = require('node:util');
|
||||||
|
|
||||||
|
const Busboy = require('@fastify/busboy');
|
||||||
|
|
||||||
|
http.createServer(function(req, res) {
|
||||||
|
if (req.method === 'POST') {
|
||||||
|
const busboy = new Busboy({ headers: req.headers });
|
||||||
|
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
|
||||||
|
console.log('File [' + fieldname + ']: filename: ' + filename);
|
||||||
|
file.on('data', function(data) {
|
||||||
|
console.log('File [' + fieldname + '] got ' + data.length + ' bytes');
|
||||||
|
});
|
||||||
|
file.on('end', function() {
|
||||||
|
console.log('File [' + fieldname + '] Finished');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated) {
|
||||||
|
console.log('Field [' + fieldname + ']: value: ' + inspect(val));
|
||||||
|
});
|
||||||
|
busboy.on('finish', function() {
|
||||||
|
console.log('Done parsing form!');
|
||||||
|
res.writeHead(303, { Connection: 'close', Location: '/' });
|
||||||
|
res.end();
|
||||||
|
});
|
||||||
|
req.pipe(busboy);
|
||||||
|
} else if (req.method === 'GET') {
|
||||||
|
res.writeHead(200, { Connection: 'close' });
|
||||||
|
res.end('<html><head></head><body>\
|
||||||
|
<form method="POST">\
|
||||||
|
<input type="text" name="textfield"><br />\
|
||||||
|
<select name="selectfield">\
|
||||||
|
<option value="1">1</option>\
|
||||||
|
<option value="10">10</option>\
|
||||||
|
<option value="100">100</option>\
|
||||||
|
<option value="9001">9001</option>\
|
||||||
|
</select><br />\
|
||||||
|
<input type="checkbox" name="checkfield">Node.js rules!<br />\
|
||||||
|
<input type="submit">\
|
||||||
|
</form>\
|
||||||
|
</body></html>');
|
||||||
|
}
|
||||||
|
}).listen(8000, function() {
|
||||||
|
console.log('Listening for requests');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Example output:
|
||||||
|
//
|
||||||
|
// Listening for requests
|
||||||
|
// Field [textfield]: value: 'testing! :-)'
|
||||||
|
// Field [selectfield]: value: '9001'
|
||||||
|
// Field [checkfield]: value: 'on'
|
||||||
|
// Done parsing form!
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
API
|
||||||
|
===
|
||||||
|
|
||||||
|
_Busboy_ is a _Writable_ stream
|
||||||
|
|
||||||
|
Busboy (special) events
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
* **file**(< _string_ >fieldname, < _ReadableStream_ >stream, < _string_ >filename, < _string_ >transferEncoding, < _string_ >mimeType) - Emitted for each new file form field found. `transferEncoding` contains the 'Content-Transfer-Encoding' value for the file stream. `mimeType` contains the 'Content-Type' value for the file stream.
|
||||||
|
* Note: if you listen for this event, you should always handle the `stream` no matter if you care about the file contents or not (e.g. you can simply just do `stream.resume();` if you want to discard the contents), otherwise the 'finish' event will never fire on the Busboy instance. However, if you don't care about **any** incoming files, you can simply not listen for the 'file' event at all and any/all files will be automatically and safely discarded (these discarded files do still count towards `files` and `parts` limits).
|
||||||
|
* If a configured file size limit was reached, `stream` will both have a boolean property `truncated` (best checked at the end of the stream) and emit a 'limit' event to notify you when this happens.
|
||||||
|
* The property `bytesRead` informs about the number of bytes that have been read so far.
|
||||||
|
|
||||||
|
* **field**(< _string_ >fieldname, < _string_ >value, < _boolean_ >fieldnameTruncated, < _boolean_ >valueTruncated, < _string_ >transferEncoding, < _string_ >mimeType) - Emitted for each new non-file field found.
|
||||||
|
|
||||||
|
* **partsLimit**() - Emitted when specified `parts` limit has been reached. No more 'file' or 'field' events will be emitted.
|
||||||
|
|
||||||
|
* **filesLimit**() - Emitted when specified `files` limit has been reached. No more 'file' events will be emitted.
|
||||||
|
|
||||||
|
* **fieldsLimit**() - Emitted when specified `fields` limit has been reached. No more 'field' events will be emitted.
|
||||||
|
|
||||||
|
|
||||||
|
Busboy methods
|
||||||
|
--------------
|
||||||
|
|
||||||
|
* **(constructor)**(< _object_ >config) - Creates and returns a new Busboy instance.
|
||||||
|
|
||||||
|
* The constructor takes the following valid `config` settings:
|
||||||
|
|
||||||
|
* **headers** - _object_ - These are the HTTP headers of the incoming request, which are used by individual parsers.
|
||||||
|
|
||||||
|
* **autoDestroy** - _boolean_ - Whether this stream should automatically call .destroy() on itself after ending. (Default: false).
|
||||||
|
|
||||||
|
* **highWaterMark** - _integer_ - highWaterMark to use for this Busboy instance (Default: WritableStream default).
|
||||||
|
|
||||||
|
* **fileHwm** - _integer_ - highWaterMark to use for file streams (Default: ReadableStream default).
|
||||||
|
|
||||||
|
* **defCharset** - _string_ - Default character set to use when one isn't defined (Default: 'utf8').
|
||||||
|
|
||||||
|
* **preservePath** - _boolean_ - If paths in the multipart 'filename' field shall be preserved. (Default: false).
|
||||||
|
|
||||||
|
* **isPartAFile** - __function__ - Use this function to override the default file detection functionality. It has following parameters:
|
||||||
|
|
||||||
|
* fieldName - __string__ The name of the field.
|
||||||
|
|
||||||
|
* contentType - __string__ The content-type of the part, e.g. `text/plain`, `image/jpeg`, `application/octet-stream`
|
||||||
|
|
||||||
|
* fileName - __string__ The name of a file supplied by the part.
|
||||||
|
|
||||||
|
(Default: `(fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined)`)
|
||||||
|
|
||||||
|
* **limits** - _object_ - Various limits on incoming data. Valid properties are:
|
||||||
|
|
||||||
|
* **fieldNameSize** - _integer_ - Max field name size (in bytes) (Default: 100 bytes).
|
||||||
|
|
||||||
|
* **fieldSize** - _integer_ - Max field value size (in bytes) (Default: 1 MiB, which is 1024 x 1024 bytes).
|
||||||
|
|
||||||
|
* **fields** - _integer_ - Max number of non-file fields (Default: Infinity).
|
||||||
|
|
||||||
|
* **fileSize** - _integer_ - For multipart forms, the max file size (in bytes) (Default: Infinity).
|
||||||
|
|
||||||
|
* **files** - _integer_ - For multipart forms, the max number of file fields (Default: Infinity).
|
||||||
|
|
||||||
|
* **parts** - _integer_ - For multipart forms, the max number of parts (fields + files) (Default: Infinity).
|
||||||
|
|
||||||
|
* **headerPairs** - _integer_ - For multipart forms, the max number of header key=>value pairs to parse **Default:** 2000
|
||||||
|
|
||||||
|
* **headerSize** - _integer_ - For multipart forms, the max size of a multipart header **Default:** 81920.
|
||||||
|
|
||||||
|
* The constructor can throw errors:
|
||||||
|
|
||||||
|
* **Busboy expected an options-Object.** - Busboy expected an Object as first parameters.
|
||||||
|
|
||||||
|
* **Busboy expected an options-Object with headers-attribute.** - The first parameter is lacking of a headers-attribute.
|
||||||
|
|
||||||
|
* **Limit $limit is not a valid number** - Busboy expected the desired limit to be of type number. Busboy throws this Error to prevent a potential security issue by falling silently back to the Busboy-defaults. Potential source for this Error can be the direct use of environment variables without transforming them to the type number.
|
||||||
|
|
||||||
|
* **Unsupported Content-Type.** - The `Content-Type` isn't one Busboy can parse.
|
||||||
|
|
||||||
|
* **Missing Content-Type-header.** - The provided headers don't include `Content-Type` at all.
|
||||||
19
node_modules/@fastify/busboy/deps/dicer/LICENSE
generated
vendored
Normal file
19
node_modules/@fastify/busboy/deps/dicer/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
Copyright Brian White. All rights reserved.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to
|
||||||
|
deal in the Software without restriction, including without limitation the
|
||||||
|
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
IN THE SOFTWARE.
|
||||||
213
node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js
generated
vendored
Normal file
213
node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js
generated
vendored
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const WritableStream = require('node:stream').Writable
|
||||||
|
const inherits = require('node:util').inherits
|
||||||
|
|
||||||
|
const StreamSearch = require('../../streamsearch/sbmh')
|
||||||
|
|
||||||
|
const PartStream = require('./PartStream')
|
||||||
|
const HeaderParser = require('./HeaderParser')
|
||||||
|
|
||||||
|
const DASH = 45
|
||||||
|
const B_ONEDASH = Buffer.from('-')
|
||||||
|
const B_CRLF = Buffer.from('\r\n')
|
||||||
|
const EMPTY_FN = function () {}
|
||||||
|
|
||||||
|
function Dicer (cfg) {
|
||||||
|
if (!(this instanceof Dicer)) { return new Dicer(cfg) }
|
||||||
|
WritableStream.call(this, cfg)
|
||||||
|
|
||||||
|
if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') }
|
||||||
|
|
||||||
|
if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined }
|
||||||
|
|
||||||
|
this._headerFirst = cfg.headerFirst
|
||||||
|
|
||||||
|
this._dashes = 0
|
||||||
|
this._parts = 0
|
||||||
|
this._finished = false
|
||||||
|
this._realFinish = false
|
||||||
|
this._isPreamble = true
|
||||||
|
this._justMatched = false
|
||||||
|
this._firstWrite = true
|
||||||
|
this._inHeader = true
|
||||||
|
this._part = undefined
|
||||||
|
this._cb = undefined
|
||||||
|
this._ignoreData = false
|
||||||
|
this._partOpts = { highWaterMark: cfg.partHwm }
|
||||||
|
this._pause = false
|
||||||
|
|
||||||
|
const self = this
|
||||||
|
this._hparser = new HeaderParser(cfg)
|
||||||
|
this._hparser.on('header', function (header) {
|
||||||
|
self._inHeader = false
|
||||||
|
self._part.emit('header', header)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
inherits(Dicer, WritableStream)
|
||||||
|
|
||||||
|
Dicer.prototype.emit = function (ev) {
|
||||||
|
if (ev === 'finish' && !this._realFinish) {
|
||||||
|
if (!this._finished) {
|
||||||
|
const self = this
|
||||||
|
process.nextTick(function () {
|
||||||
|
self.emit('error', new Error('Unexpected end of multipart data'))
|
||||||
|
if (self._part && !self._ignoreData) {
|
||||||
|
const type = (self._isPreamble ? 'Preamble' : 'Part')
|
||||||
|
self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data'))
|
||||||
|
self._part.push(null)
|
||||||
|
process.nextTick(function () {
|
||||||
|
self._realFinish = true
|
||||||
|
self.emit('finish')
|
||||||
|
self._realFinish = false
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self._realFinish = true
|
||||||
|
self.emit('finish')
|
||||||
|
self._realFinish = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else { WritableStream.prototype.emit.apply(this, arguments) }
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype._write = function (data, encoding, cb) {
|
||||||
|
// ignore unexpected data (e.g. extra trailer data after finished)
|
||||||
|
if (!this._hparser && !this._bparser) { return cb() }
|
||||||
|
|
||||||
|
if (this._headerFirst && this._isPreamble) {
|
||||||
|
if (!this._part) {
|
||||||
|
this._part = new PartStream(this._partOpts)
|
||||||
|
if (this.listenerCount('preamble') !== 0) { this.emit('preamble', this._part) } else { this._ignore() }
|
||||||
|
}
|
||||||
|
const r = this._hparser.push(data)
|
||||||
|
if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() }
|
||||||
|
}
|
||||||
|
|
||||||
|
// allows for "easier" testing
|
||||||
|
if (this._firstWrite) {
|
||||||
|
this._bparser.push(B_CRLF)
|
||||||
|
this._firstWrite = false
|
||||||
|
}
|
||||||
|
|
||||||
|
this._bparser.push(data)
|
||||||
|
|
||||||
|
if (this._pause) { this._cb = cb } else { cb() }
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype.reset = function () {
|
||||||
|
this._part = undefined
|
||||||
|
this._bparser = undefined
|
||||||
|
this._hparser = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype.setBoundary = function (boundary) {
|
||||||
|
const self = this
|
||||||
|
this._bparser = new StreamSearch('\r\n--' + boundary)
|
||||||
|
this._bparser.on('info', function (isMatch, data, start, end) {
|
||||||
|
self._oninfo(isMatch, data, start, end)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype._ignore = function () {
|
||||||
|
if (this._part && !this._ignoreData) {
|
||||||
|
this._ignoreData = true
|
||||||
|
this._part.on('error', EMPTY_FN)
|
||||||
|
// we must perform some kind of read on the stream even though we are
|
||||||
|
// ignoring the data, otherwise node's Readable stream will not emit 'end'
|
||||||
|
// after pushing null to the stream
|
||||||
|
this._part.resume()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype._oninfo = function (isMatch, data, start, end) {
|
||||||
|
let buf; const self = this; let i = 0; let r; let shouldWriteMore = true
|
||||||
|
|
||||||
|
if (!this._part && this._justMatched && data) {
|
||||||
|
while (this._dashes < 2 && (start + i) < end) {
|
||||||
|
if (data[start + i] === DASH) {
|
||||||
|
++i
|
||||||
|
++this._dashes
|
||||||
|
} else {
|
||||||
|
if (this._dashes) { buf = B_ONEDASH }
|
||||||
|
this._dashes = 0
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this._dashes === 2) {
|
||||||
|
if ((start + i) < end && this.listenerCount('trailer') !== 0) { this.emit('trailer', data.slice(start + i, end)) }
|
||||||
|
this.reset()
|
||||||
|
this._finished = true
|
||||||
|
// no more parts will be added
|
||||||
|
if (self._parts === 0) {
|
||||||
|
self._realFinish = true
|
||||||
|
self.emit('finish')
|
||||||
|
self._realFinish = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this._dashes) { return }
|
||||||
|
}
|
||||||
|
if (this._justMatched) { this._justMatched = false }
|
||||||
|
if (!this._part) {
|
||||||
|
this._part = new PartStream(this._partOpts)
|
||||||
|
this._part._read = function (n) {
|
||||||
|
self._unpause()
|
||||||
|
}
|
||||||
|
if (this._isPreamble && this.listenerCount('preamble') !== 0) {
|
||||||
|
this.emit('preamble', this._part)
|
||||||
|
} else if (this._isPreamble !== true && this.listenerCount('part') !== 0) {
|
||||||
|
this.emit('part', this._part)
|
||||||
|
} else {
|
||||||
|
this._ignore()
|
||||||
|
}
|
||||||
|
if (!this._isPreamble) { this._inHeader = true }
|
||||||
|
}
|
||||||
|
if (data && start < end && !this._ignoreData) {
|
||||||
|
if (this._isPreamble || !this._inHeader) {
|
||||||
|
if (buf) { shouldWriteMore = this._part.push(buf) }
|
||||||
|
shouldWriteMore = this._part.push(data.slice(start, end))
|
||||||
|
if (!shouldWriteMore) { this._pause = true }
|
||||||
|
} else if (!this._isPreamble && this._inHeader) {
|
||||||
|
if (buf) { this._hparser.push(buf) }
|
||||||
|
r = this._hparser.push(data.slice(start, end))
|
||||||
|
if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isMatch) {
|
||||||
|
this._hparser.reset()
|
||||||
|
if (this._isPreamble) { this._isPreamble = false } else {
|
||||||
|
if (start !== end) {
|
||||||
|
++this._parts
|
||||||
|
this._part.on('end', function () {
|
||||||
|
if (--self._parts === 0) {
|
||||||
|
if (self._finished) {
|
||||||
|
self._realFinish = true
|
||||||
|
self.emit('finish')
|
||||||
|
self._realFinish = false
|
||||||
|
} else {
|
||||||
|
self._unpause()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this._part.push(null)
|
||||||
|
this._part = undefined
|
||||||
|
this._ignoreData = false
|
||||||
|
this._justMatched = true
|
||||||
|
this._dashes = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Dicer.prototype._unpause = function () {
|
||||||
|
if (!this._pause) { return }
|
||||||
|
|
||||||
|
this._pause = false
|
||||||
|
if (this._cb) {
|
||||||
|
const cb = this._cb
|
||||||
|
this._cb = undefined
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Dicer
|
||||||
100
node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js
generated
vendored
Normal file
100
node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js
generated
vendored
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const EventEmitter = require('node:events').EventEmitter
|
||||||
|
const inherits = require('node:util').inherits
|
||||||
|
const getLimit = require('../../../lib/utils/getLimit')
|
||||||
|
|
||||||
|
const StreamSearch = require('../../streamsearch/sbmh')
|
||||||
|
|
||||||
|
const B_DCRLF = Buffer.from('\r\n\r\n')
|
||||||
|
const RE_CRLF = /\r\n/g
|
||||||
|
const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/ // eslint-disable-line no-control-regex
|
||||||
|
|
||||||
|
function HeaderParser (cfg) {
|
||||||
|
EventEmitter.call(this)
|
||||||
|
|
||||||
|
cfg = cfg || {}
|
||||||
|
const self = this
|
||||||
|
this.nread = 0
|
||||||
|
this.maxed = false
|
||||||
|
this.npairs = 0
|
||||||
|
this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000)
|
||||||
|
this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024)
|
||||||
|
this.buffer = ''
|
||||||
|
this.header = {}
|
||||||
|
this.finished = false
|
||||||
|
this.ss = new StreamSearch(B_DCRLF)
|
||||||
|
this.ss.on('info', function (isMatch, data, start, end) {
|
||||||
|
if (data && !self.maxed) {
|
||||||
|
if (self.nread + end - start >= self.maxHeaderSize) {
|
||||||
|
end = self.maxHeaderSize - self.nread + start
|
||||||
|
self.nread = self.maxHeaderSize
|
||||||
|
self.maxed = true
|
||||||
|
} else { self.nread += (end - start) }
|
||||||
|
|
||||||
|
self.buffer += data.toString('binary', start, end)
|
||||||
|
}
|
||||||
|
if (isMatch) { self._finish() }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
inherits(HeaderParser, EventEmitter)
|
||||||
|
|
||||||
|
HeaderParser.prototype.push = function (data) {
|
||||||
|
const r = this.ss.push(data)
|
||||||
|
if (this.finished) { return r }
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderParser.prototype.reset = function () {
|
||||||
|
this.finished = false
|
||||||
|
this.buffer = ''
|
||||||
|
this.header = {}
|
||||||
|
this.ss.reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderParser.prototype._finish = function () {
|
||||||
|
if (this.buffer) { this._parseHeader() }
|
||||||
|
this.ss.matches = this.ss.maxMatches
|
||||||
|
const header = this.header
|
||||||
|
this.header = {}
|
||||||
|
this.buffer = ''
|
||||||
|
this.finished = true
|
||||||
|
this.nread = this.npairs = 0
|
||||||
|
this.maxed = false
|
||||||
|
this.emit('header', header)
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderParser.prototype._parseHeader = function () {
|
||||||
|
if (this.npairs === this.maxHeaderPairs) { return }
|
||||||
|
|
||||||
|
const lines = this.buffer.split(RE_CRLF)
|
||||||
|
const len = lines.length
|
||||||
|
let m, h
|
||||||
|
|
||||||
|
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
||||||
|
if (lines[i].length === 0) { continue }
|
||||||
|
if (lines[i][0] === '\t' || lines[i][0] === ' ') {
|
||||||
|
// folded header content
|
||||||
|
// RFC2822 says to just remove the CRLF and not the whitespace following
|
||||||
|
// it, so we follow the RFC and include the leading whitespace ...
|
||||||
|
if (h) {
|
||||||
|
this.header[h][this.header[h].length - 1] += lines[i]
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const posColon = lines[i].indexOf(':')
|
||||||
|
if (
|
||||||
|
posColon === -1 ||
|
||||||
|
posColon === 0
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
m = RE_HDR.exec(lines[i])
|
||||||
|
h = m[1].toLowerCase()
|
||||||
|
this.header[h] = this.header[h] || []
|
||||||
|
this.header[h].push((m[2] || ''))
|
||||||
|
if (++this.npairs === this.maxHeaderPairs) { break }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = HeaderParser
|
||||||
13
node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js
generated
vendored
Normal file
13
node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const inherits = require('node:util').inherits
|
||||||
|
const ReadableStream = require('node:stream').Readable
|
||||||
|
|
||||||
|
function PartStream (opts) {
|
||||||
|
ReadableStream.call(this, opts)
|
||||||
|
}
|
||||||
|
inherits(PartStream, ReadableStream)
|
||||||
|
|
||||||
|
PartStream.prototype._read = function (n) {}
|
||||||
|
|
||||||
|
module.exports = PartStream
|
||||||
164
node_modules/@fastify/busboy/deps/dicer/lib/dicer.d.ts
generated
vendored
Normal file
164
node_modules/@fastify/busboy/deps/dicer/lib/dicer.d.ts
generated
vendored
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
// Type definitions for dicer 0.2
|
||||||
|
// Project: https://github.com/mscdex/dicer
|
||||||
|
// Definitions by: BendingBender <https://github.com/BendingBender>
|
||||||
|
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
|
||||||
|
// TypeScript Version: 2.2
|
||||||
|
/// <reference types="node" />
|
||||||
|
|
||||||
|
import stream = require("stream");
|
||||||
|
|
||||||
|
// tslint:disable:unified-signatures
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A very fast streaming multipart parser for node.js.
|
||||||
|
* Dicer is a WritableStream
|
||||||
|
*
|
||||||
|
* Dicer (special) events:
|
||||||
|
* - on('finish', ()) - Emitted when all parts have been parsed and the Dicer instance has been ended.
|
||||||
|
* - on('part', (stream: PartStream)) - Emitted when a new part has been found.
|
||||||
|
* - on('preamble', (stream: PartStream)) - Emitted for preamble if you should happen to need it (can usually be ignored).
|
||||||
|
* - on('trailer', (data: Buffer)) - Emitted when trailing data was found after the terminating boundary (as with the preamble, this can usually be ignored too).
|
||||||
|
*/
|
||||||
|
export class Dicer extends stream.Writable {
|
||||||
|
/**
|
||||||
|
* Creates and returns a new Dicer instance with the following valid config settings:
|
||||||
|
*
|
||||||
|
* @param config The configuration to use
|
||||||
|
*/
|
||||||
|
constructor(config: Dicer.Config);
|
||||||
|
/**
|
||||||
|
* Sets the boundary to use for parsing and performs some initialization needed for parsing.
|
||||||
|
* You should only need to use this if you set headerFirst to true in the constructor and are parsing the boundary from the preamble header.
|
||||||
|
*
|
||||||
|
* @param boundary The boundary to use
|
||||||
|
*/
|
||||||
|
setBoundary(boundary: string): void;
|
||||||
|
addListener(event: "finish", listener: () => void): this;
|
||||||
|
addListener(event: "part", listener: (stream: Dicer.PartStream) => void): this;
|
||||||
|
addListener(event: "preamble", listener: (stream: Dicer.PartStream) => void): this;
|
||||||
|
addListener(event: "trailer", listener: (data: Buffer) => void): this;
|
||||||
|
addListener(event: "close", listener: () => void): this;
|
||||||
|
addListener(event: "drain", listener: () => void): this;
|
||||||
|
addListener(event: "error", listener: (err: Error) => void): this;
|
||||||
|
addListener(event: "pipe", listener: (src: stream.Readable) => void): this;
|
||||||
|
addListener(event: "unpipe", listener: (src: stream.Readable) => void): this;
|
||||||
|
addListener(event: string, listener: (...args: any[]) => void): this;
|
||||||
|
on(event: "finish", listener: () => void): this;
|
||||||
|
on(event: "part", listener: (stream: Dicer.PartStream) => void): this;
|
||||||
|
on(event: "preamble", listener: (stream: Dicer.PartStream) => void): this;
|
||||||
|
on(event: "trailer", listener: (data: Buffer) => void): this;
|
||||||
|
on(event: "close", listener: () => void): this;
|
||||||
|
on(event: "drain", listener: () => void): this;
|
||||||
|
on(event: "error", listener: (err: Error) => void): this;
|
||||||
|
on(event: "pipe", listener: (src: stream.Readable) => void): this;
|
||||||
|
on(event: "unpipe", listener: (src: stream.Readable) => void): this;
|
||||||
|
on(event: string, listener: (...args: any[]) => void): this;
|
||||||
|
once(event: "finish", listener: () => void): this;
|
||||||
|
once(event: "part", listener: (stream: Dicer.PartStream) => void): this;
|
||||||
|
once(event: "preamble", listener: (stream: Dicer.PartStream) => void): this;
|
||||||
|
once(event: "trailer", listener: (data: Buffer) => void): this;
|
||||||
|
once(event: "close", listener: () => void): this;
|
||||||
|
once(event: "drain", listener: () => void): this;
|
||||||
|
once(event: "error", listener: (err: Error) => void): this;
|
||||||
|
once(event: "pipe", listener: (src: stream.Readable) => void): this;
|
||||||
|
once(event: "unpipe", listener: (src: stream.Readable) => void): this;
|
||||||
|
once(event: string, listener: (...args: any[]) => void): this;
|
||||||
|
prependListener(event: "finish", listener: () => void): this;
|
||||||
|
prependListener(event: "part", listener: (stream: Dicer.PartStream) => void): this;
|
||||||
|
prependListener(event: "preamble", listener: (stream: Dicer.PartStream) => void): this;
|
||||||
|
prependListener(event: "trailer", listener: (data: Buffer) => void): this;
|
||||||
|
prependListener(event: "close", listener: () => void): this;
|
||||||
|
prependListener(event: "drain", listener: () => void): this;
|
||||||
|
prependListener(event: "error", listener: (err: Error) => void): this;
|
||||||
|
prependListener(event: "pipe", listener: (src: stream.Readable) => void): this;
|
||||||
|
prependListener(event: "unpipe", listener: (src: stream.Readable) => void): this;
|
||||||
|
prependListener(event: string, listener: (...args: any[]) => void): this;
|
||||||
|
prependOnceListener(event: "finish", listener: () => void): this;
|
||||||
|
prependOnceListener(event: "part", listener: (stream: Dicer.PartStream) => void): this;
|
||||||
|
prependOnceListener(event: "preamble", listener: (stream: Dicer.PartStream) => void): this;
|
||||||
|
prependOnceListener(event: "trailer", listener: (data: Buffer) => void): this;
|
||||||
|
prependOnceListener(event: "close", listener: () => void): this;
|
||||||
|
prependOnceListener(event: "drain", listener: () => void): this;
|
||||||
|
prependOnceListener(event: "error", listener: (err: Error) => void): this;
|
||||||
|
prependOnceListener(event: "pipe", listener: (src: stream.Readable) => void): this;
|
||||||
|
prependOnceListener(event: "unpipe", listener: (src: stream.Readable) => void): this;
|
||||||
|
prependOnceListener(event: string, listener: (...args: any[]) => void): this;
|
||||||
|
removeListener(event: "finish", listener: () => void): this;
|
||||||
|
removeListener(event: "part", listener: (stream: Dicer.PartStream) => void): this;
|
||||||
|
removeListener(event: "preamble", listener: (stream: Dicer.PartStream) => void): this;
|
||||||
|
removeListener(event: "trailer", listener: (data: Buffer) => void): this;
|
||||||
|
removeListener(event: "close", listener: () => void): this;
|
||||||
|
removeListener(event: "drain", listener: () => void): this;
|
||||||
|
removeListener(event: "error", listener: (err: Error) => void): this;
|
||||||
|
removeListener(event: "pipe", listener: (src: stream.Readable) => void): this;
|
||||||
|
removeListener(event: "unpipe", listener: (src: stream.Readable) => void): this;
|
||||||
|
removeListener(event: string, listener: (...args: any[]) => void): this;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare namespace Dicer {
|
||||||
|
interface Config {
|
||||||
|
/**
|
||||||
|
* This is the boundary used to detect the beginning of a new part.
|
||||||
|
*/
|
||||||
|
boundary?: string | undefined;
|
||||||
|
/**
|
||||||
|
* If true, preamble header parsing will be performed first.
|
||||||
|
*/
|
||||||
|
headerFirst?: boolean | undefined;
|
||||||
|
/**
|
||||||
|
* The maximum number of header key=>value pairs to parse Default: 2000 (same as node's http).
|
||||||
|
*/
|
||||||
|
maxHeaderPairs?: number | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PartStream is a _ReadableStream_
|
||||||
|
*
|
||||||
|
* PartStream (special) events:
|
||||||
|
* - on('header', (header: object)) - An object containing the header for this particular part. Each property value is an array of one or more string values.
|
||||||
|
*/
|
||||||
|
interface PartStream extends stream.Readable {
|
||||||
|
addListener(event: "header", listener: (header: object) => void): this;
|
||||||
|
addListener(event: "close", listener: () => void): this;
|
||||||
|
addListener(event: "data", listener: (chunk: Buffer | string) => void): this;
|
||||||
|
addListener(event: "end", listener: () => void): this;
|
||||||
|
addListener(event: "readable", listener: () => void): this;
|
||||||
|
addListener(event: "error", listener: (err: Error) => void): this;
|
||||||
|
addListener(event: string, listener: (...args: any[]) => void): this;
|
||||||
|
on(event: "header", listener: (header: object) => void): this;
|
||||||
|
on(event: "close", listener: () => void): this;
|
||||||
|
on(event: "data", listener: (chunk: Buffer | string) => void): this;
|
||||||
|
on(event: "end", listener: () => void): this;
|
||||||
|
on(event: "readable", listener: () => void): this;
|
||||||
|
on(event: "error", listener: (err: Error) => void): this;
|
||||||
|
on(event: string, listener: (...args: any[]) => void): this;
|
||||||
|
once(event: "header", listener: (header: object) => void): this;
|
||||||
|
once(event: "close", listener: () => void): this;
|
||||||
|
once(event: "data", listener: (chunk: Buffer | string) => void): this;
|
||||||
|
once(event: "end", listener: () => void): this;
|
||||||
|
once(event: "readable", listener: () => void): this;
|
||||||
|
once(event: "error", listener: (err: Error) => void): this;
|
||||||
|
once(event: string, listener: (...args: any[]) => void): this;
|
||||||
|
prependListener(event: "header", listener: (header: object) => void): this;
|
||||||
|
prependListener(event: "close", listener: () => void): this;
|
||||||
|
prependListener(event: "data", listener: (chunk: Buffer | string) => void): this;
|
||||||
|
prependListener(event: "end", listener: () => void): this;
|
||||||
|
prependListener(event: "readable", listener: () => void): this;
|
||||||
|
prependListener(event: "error", listener: (err: Error) => void): this;
|
||||||
|
prependListener(event: string, listener: (...args: any[]) => void): this;
|
||||||
|
prependOnceListener(event: "header", listener: (header: object) => void): this;
|
||||||
|
prependOnceListener(event: "close", listener: () => void): this;
|
||||||
|
prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this;
|
||||||
|
prependOnceListener(event: "end", listener: () => void): this;
|
||||||
|
prependOnceListener(event: "readable", listener: () => void): this;
|
||||||
|
prependOnceListener(event: "error", listener: (err: Error) => void): this;
|
||||||
|
prependOnceListener(event: string, listener: (...args: any[]) => void): this;
|
||||||
|
removeListener(event: "header", listener: (header: object) => void): this;
|
||||||
|
removeListener(event: "close", listener: () => void): this;
|
||||||
|
removeListener(event: "data", listener: (chunk: Buffer | string) => void): this;
|
||||||
|
removeListener(event: "end", listener: () => void): this;
|
||||||
|
removeListener(event: "readable", listener: () => void): this;
|
||||||
|
removeListener(event: "error", listener: (err: Error) => void): this;
|
||||||
|
removeListener(event: string, listener: (...args: any[]) => void): this;
|
||||||
|
}
|
||||||
|
}
|
||||||
230
node_modules/@fastify/busboy/deps/streamsearch/sbmh.js
generated
vendored
Normal file
230
node_modules/@fastify/busboy/deps/streamsearch/sbmh.js
generated
vendored
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright Brian White. All rights reserved.
|
||||||
|
*
|
||||||
|
* @see https://github.com/mscdex/streamsearch
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to
|
||||||
|
* deal in the Software without restriction, including without limitation the
|
||||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation
|
||||||
|
* by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool
|
||||||
|
*/
|
||||||
|
|
||||||
|
const { EventEmitter } = require('node:events')
|
||||||
|
const { inherits } = require('node:util')
|
||||||
|
|
||||||
|
function SBMH (needle) {
|
||||||
|
if (typeof needle === 'string') {
|
||||||
|
needle = Buffer.from(needle)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Buffer.isBuffer(needle)) {
|
||||||
|
throw new TypeError('The needle has to be a String or a Buffer.')
|
||||||
|
}
|
||||||
|
|
||||||
|
const needleLength = needle.length
|
||||||
|
const needleLastCharIndex = needleLength - 1
|
||||||
|
|
||||||
|
if (needleLength === 0) {
|
||||||
|
throw new Error('The needle cannot be an empty String/Buffer.')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needleLength > 256) {
|
||||||
|
throw new Error('The needle cannot have a length bigger than 256.')
|
||||||
|
}
|
||||||
|
|
||||||
|
this.maxMatches = Infinity
|
||||||
|
this.matches = 0
|
||||||
|
|
||||||
|
this._occ = new Uint8Array(256)
|
||||||
|
.fill(needleLength) // Initialize occurrence table.
|
||||||
|
this._lookbehind_size = 0
|
||||||
|
this._needle = needle
|
||||||
|
this._bufpos = 0
|
||||||
|
|
||||||
|
this._lookbehind = Buffer.alloc(needleLastCharIndex)
|
||||||
|
|
||||||
|
// Populate occurrence table with analysis of the needle,
|
||||||
|
// ignoring last letter.
|
||||||
|
for (var i = 0; i < needleLastCharIndex; ++i) { // eslint-disable-line no-var
|
||||||
|
this._occ[needle[i]] = needleLastCharIndex - i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inherits(SBMH, EventEmitter)
|
||||||
|
|
||||||
|
SBMH.prototype.reset = function () {
|
||||||
|
this._lookbehind_size = 0
|
||||||
|
this.matches = 0
|
||||||
|
this._bufpos = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
SBMH.prototype.push = function (chunk, pos) {
|
||||||
|
if (!Buffer.isBuffer(chunk)) {
|
||||||
|
chunk = Buffer.from(chunk, 'binary')
|
||||||
|
}
|
||||||
|
const chlen = chunk.length
|
||||||
|
this._bufpos = pos || 0
|
||||||
|
let r
|
||||||
|
while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) }
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
SBMH.prototype._sbmh_feed = function (data) {
|
||||||
|
const len = data.length
|
||||||
|
const needle = this._needle
|
||||||
|
const needleLength = needle.length
|
||||||
|
const needleLastCharIndex = needleLength - 1
|
||||||
|
const needleLastChar = needle[needleLastCharIndex]
|
||||||
|
|
||||||
|
// Positive: points to a position in `data`
|
||||||
|
// pos == 3 points to data[3]
|
||||||
|
// Negative: points to a position in the lookbehind buffer
|
||||||
|
// pos == -2 points to lookbehind[lookbehind_size - 2]
|
||||||
|
let pos = -this._lookbehind_size
|
||||||
|
let ch
|
||||||
|
|
||||||
|
if (pos < 0) {
|
||||||
|
// Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool
|
||||||
|
// search with character lookup code that considers both the
|
||||||
|
// lookbehind buffer and the current round's haystack data.
|
||||||
|
//
|
||||||
|
// Loop until
|
||||||
|
// there is a match.
|
||||||
|
// or until
|
||||||
|
// we've moved past the position that requires the
|
||||||
|
// lookbehind buffer. In this case we switch to the
|
||||||
|
// optimized loop.
|
||||||
|
// or until
|
||||||
|
// the character to look at lies outside the haystack.
|
||||||
|
while (pos < 0 && pos <= len - needleLength) {
|
||||||
|
ch = data[pos + needleLastCharIndex]
|
||||||
|
|
||||||
|
if (
|
||||||
|
ch === needleLastChar &&
|
||||||
|
this._sbmh_memcmp(data, pos, needleLastCharIndex)
|
||||||
|
) {
|
||||||
|
this._lookbehind_size = 0
|
||||||
|
++this.matches
|
||||||
|
this.emit('info', true)
|
||||||
|
return (this._bufpos = pos + needleLength)
|
||||||
|
}
|
||||||
|
|
||||||
|
pos += this._occ[ch]
|
||||||
|
}
|
||||||
|
|
||||||
|
// No match.
|
||||||
|
|
||||||
|
while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) {
|
||||||
|
// There's too few data for Boyer-Moore-Horspool to run,
|
||||||
|
// so let's use a different algorithm to skip as much as
|
||||||
|
// we can.
|
||||||
|
// Forward pos until
|
||||||
|
// the trailing part of lookbehind + data
|
||||||
|
// looks like the beginning of the needle
|
||||||
|
// or until
|
||||||
|
// pos == 0
|
||||||
|
++pos
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pos >= 0) {
|
||||||
|
// Discard lookbehind buffer.
|
||||||
|
this.emit('info', false, this._lookbehind, 0, this._lookbehind_size)
|
||||||
|
this._lookbehind_size = 0
|
||||||
|
} else {
|
||||||
|
// Cut off part of the lookbehind buffer that has
|
||||||
|
// been processed and append the entire haystack
|
||||||
|
// into it.
|
||||||
|
const bytesToCutOff = this._lookbehind_size + pos
|
||||||
|
if (bytesToCutOff > 0) {
|
||||||
|
// The cut off data is guaranteed not to contain the needle.
|
||||||
|
this.emit('info', false, this._lookbehind, 0, bytesToCutOff)
|
||||||
|
}
|
||||||
|
|
||||||
|
this._lookbehind_size -= bytesToCutOff
|
||||||
|
this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff, this._lookbehind_size)
|
||||||
|
|
||||||
|
data.copy(this._lookbehind, this._lookbehind_size)
|
||||||
|
this._lookbehind_size += len
|
||||||
|
|
||||||
|
this._bufpos = len
|
||||||
|
return len
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lookbehind buffer is now empty. We only need to check if the
|
||||||
|
// needle is in the haystack.
|
||||||
|
pos = data.indexOf(needle, pos + this._bufpos)
|
||||||
|
|
||||||
|
if (pos !== -1) {
|
||||||
|
++this.matches
|
||||||
|
if (pos === 0) { this.emit('info', true) } else { this.emit('info', true, data, this._bufpos, pos) }
|
||||||
|
return (this._bufpos = pos + needleLength)
|
||||||
|
}
|
||||||
|
|
||||||
|
pos = len - needleLastCharIndex
|
||||||
|
if (pos < 0) {
|
||||||
|
pos = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// There was no match. If there's trailing haystack data that we cannot
|
||||||
|
// match yet using the Boyer-Moore-Horspool algorithm (because the trailing
|
||||||
|
// data is less than the needle size) then match using a modified
|
||||||
|
// algorithm that starts matching from the beginning instead of the end.
|
||||||
|
// Whatever trailing data is left after running this algorithm is added to
|
||||||
|
// the lookbehind buffer.
|
||||||
|
while (
|
||||||
|
pos !== len &&
|
||||||
|
(
|
||||||
|
data[pos] !== needle[0] ||
|
||||||
|
Buffer.compare(
|
||||||
|
data.subarray(pos + 1, len),
|
||||||
|
needle.subarray(1, len - pos)
|
||||||
|
) !== 0
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
++pos
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pos !== len) {
|
||||||
|
data.copy(this._lookbehind, 0, pos, len)
|
||||||
|
this._lookbehind_size = len - pos
|
||||||
|
}
|
||||||
|
|
||||||
|
// Everything until pos is guaranteed not to contain needle data.
|
||||||
|
if (pos !== 0) { this.emit('info', false, data, this._bufpos, pos) }
|
||||||
|
|
||||||
|
this._bufpos = len
|
||||||
|
return len
|
||||||
|
}
|
||||||
|
|
||||||
|
SBMH.prototype._sbmh_lookup_char = function (data, pos) {
|
||||||
|
return pos < 0
|
||||||
|
? this._lookbehind[this._lookbehind_size + pos]
|
||||||
|
: data[pos]
|
||||||
|
}
|
||||||
|
|
||||||
|
SBMH.prototype._sbmh_memcmp = function (data, pos, len) {
|
||||||
|
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
||||||
|
if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false }
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = SBMH
|
||||||
196
node_modules/@fastify/busboy/lib/main.d.ts
generated
vendored
Normal file
196
node_modules/@fastify/busboy/lib/main.d.ts
generated
vendored
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
// Definitions by: Jacob Baskin <https://github.com/jacobbaskin>
|
||||||
|
// BendingBender <https://github.com/BendingBender>
|
||||||
|
// Igor Savin <https://github.com/kibertoad>
|
||||||
|
|
||||||
|
/// <reference types="node" />
|
||||||
|
|
||||||
|
import * as http from 'http';
|
||||||
|
import { Readable, Writable } from 'stream';
|
||||||
|
export { Dicer } from "../deps/dicer/lib/dicer";
|
||||||
|
|
||||||
|
export const Busboy: BusboyConstructor;
|
||||||
|
export default Busboy;
|
||||||
|
|
||||||
|
export interface BusboyConfig {
|
||||||
|
/**
|
||||||
|
* These are the HTTP headers of the incoming request, which are used by individual parsers.
|
||||||
|
*/
|
||||||
|
headers: BusboyHeaders;
|
||||||
|
/**
|
||||||
|
* `highWaterMark` to use for this Busboy instance.
|
||||||
|
* @default WritableStream default.
|
||||||
|
*/
|
||||||
|
highWaterMark?: number | undefined;
|
||||||
|
/**
|
||||||
|
* highWaterMark to use for file streams.
|
||||||
|
* @default ReadableStream default.
|
||||||
|
*/
|
||||||
|
fileHwm?: number | undefined;
|
||||||
|
/**
|
||||||
|
* Default character set to use when one isn't defined.
|
||||||
|
* @default 'utf8'
|
||||||
|
*/
|
||||||
|
defCharset?: string | undefined;
|
||||||
|
/**
|
||||||
|
* Detect if a Part is a file.
|
||||||
|
*
|
||||||
|
* By default a file is detected if contentType
|
||||||
|
* is application/octet-stream or fileName is not
|
||||||
|
* undefined.
|
||||||
|
*
|
||||||
|
* Modify this to handle e.g. Blobs.
|
||||||
|
*/
|
||||||
|
isPartAFile?: (fieldName: string | undefined, contentType: string | undefined, fileName: string | undefined) => boolean;
|
||||||
|
/**
|
||||||
|
* If paths in the multipart 'filename' field shall be preserved.
|
||||||
|
* @default false
|
||||||
|
*/
|
||||||
|
preservePath?: boolean | undefined;
|
||||||
|
/**
|
||||||
|
* Various limits on incoming data.
|
||||||
|
*/
|
||||||
|
limits?:
|
||||||
|
| {
|
||||||
|
/**
|
||||||
|
* Max field name size (in bytes)
|
||||||
|
* @default 100 bytes
|
||||||
|
*/
|
||||||
|
fieldNameSize?: number | undefined;
|
||||||
|
/**
|
||||||
|
* Max field value size (in bytes)
|
||||||
|
* @default 1MB
|
||||||
|
*/
|
||||||
|
fieldSize?: number | undefined;
|
||||||
|
/**
|
||||||
|
* Max number of non-file fields
|
||||||
|
* @default Infinity
|
||||||
|
*/
|
||||||
|
fields?: number | undefined;
|
||||||
|
/**
|
||||||
|
* For multipart forms, the max file size (in bytes)
|
||||||
|
* @default Infinity
|
||||||
|
*/
|
||||||
|
fileSize?: number | undefined;
|
||||||
|
/**
|
||||||
|
* For multipart forms, the max number of file fields
|
||||||
|
* @default Infinity
|
||||||
|
*/
|
||||||
|
files?: number | undefined;
|
||||||
|
/**
|
||||||
|
* For multipart forms, the max number of parts (fields + files)
|
||||||
|
* @default Infinity
|
||||||
|
*/
|
||||||
|
parts?: number | undefined;
|
||||||
|
/**
|
||||||
|
* For multipart forms, the max number of header key=>value pairs to parse
|
||||||
|
* @default 2000
|
||||||
|
*/
|
||||||
|
headerPairs?: number | undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For multipart forms, the max size of a header part
|
||||||
|
* @default 81920
|
||||||
|
*/
|
||||||
|
headerSize?: number | undefined;
|
||||||
|
}
|
||||||
|
| undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type BusboyHeaders = { 'content-type': string } & http.IncomingHttpHeaders;
|
||||||
|
|
||||||
|
export interface BusboyFileStream extends
|
||||||
|
Readable {
|
||||||
|
|
||||||
|
truncated: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of bytes that have been read so far.
|
||||||
|
*/
|
||||||
|
bytesRead: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Busboy extends Writable {
|
||||||
|
addListener<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||||||
|
|
||||||
|
addListener(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||||
|
|
||||||
|
on<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||||||
|
|
||||||
|
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||||
|
|
||||||
|
once<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||||||
|
|
||||||
|
once(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||||
|
|
||||||
|
removeListener<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||||||
|
|
||||||
|
removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||||
|
|
||||||
|
off<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||||||
|
|
||||||
|
off(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||||
|
|
||||||
|
prependListener<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||||||
|
|
||||||
|
prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||||
|
|
||||||
|
prependOnceListener<Event extends keyof BusboyEvents>(event: Event, listener: BusboyEvents[Event]): this;
|
||||||
|
|
||||||
|
prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BusboyEvents {
|
||||||
|
/**
|
||||||
|
* Emitted for each new file form field found.
|
||||||
|
*
|
||||||
|
* * Note: if you listen for this event, you should always handle the `stream` no matter if you care about the
|
||||||
|
* file contents or not (e.g. you can simply just do `stream.resume();` if you want to discard the contents),
|
||||||
|
* otherwise the 'finish' event will never fire on the Busboy instance. However, if you don't care about **any**
|
||||||
|
* incoming files, you can simply not listen for the 'file' event at all and any/all files will be automatically
|
||||||
|
* and safely discarded (these discarded files do still count towards `files` and `parts` limits).
|
||||||
|
* * If a configured file size limit was reached, `stream` will both have a boolean property `truncated`
|
||||||
|
* (best checked at the end of the stream) and emit a 'limit' event to notify you when this happens.
|
||||||
|
*
|
||||||
|
* @param listener.transferEncoding Contains the 'Content-Transfer-Encoding' value for the file stream.
|
||||||
|
* @param listener.mimeType Contains the 'Content-Type' value for the file stream.
|
||||||
|
*/
|
||||||
|
file: (
|
||||||
|
fieldname: string,
|
||||||
|
stream: BusboyFileStream,
|
||||||
|
filename: string,
|
||||||
|
transferEncoding: string,
|
||||||
|
mimeType: string,
|
||||||
|
) => void;
|
||||||
|
/**
|
||||||
|
* Emitted for each new non-file field found.
|
||||||
|
*/
|
||||||
|
field: (
|
||||||
|
fieldname: string,
|
||||||
|
value: string,
|
||||||
|
fieldnameTruncated: boolean,
|
||||||
|
valueTruncated: boolean,
|
||||||
|
transferEncoding: string,
|
||||||
|
mimeType: string,
|
||||||
|
) => void;
|
||||||
|
finish: () => void;
|
||||||
|
/**
|
||||||
|
* Emitted when specified `parts` limit has been reached. No more 'file' or 'field' events will be emitted.
|
||||||
|
*/
|
||||||
|
partsLimit: () => void;
|
||||||
|
/**
|
||||||
|
* Emitted when specified `files` limit has been reached. No more 'file' events will be emitted.
|
||||||
|
*/
|
||||||
|
filesLimit: () => void;
|
||||||
|
/**
|
||||||
|
* Emitted when specified `fields` limit has been reached. No more 'field' events will be emitted.
|
||||||
|
*/
|
||||||
|
fieldsLimit: () => void;
|
||||||
|
error: (error: unknown) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BusboyConstructor {
|
||||||
|
(options: BusboyConfig): Busboy;
|
||||||
|
|
||||||
|
new(options: BusboyConfig): Busboy;
|
||||||
|
}
|
||||||
|
|
||||||
85
node_modules/@fastify/busboy/lib/main.js
generated
vendored
Normal file
85
node_modules/@fastify/busboy/lib/main.js
generated
vendored
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const WritableStream = require('node:stream').Writable
|
||||||
|
const { inherits } = require('node:util')
|
||||||
|
const Dicer = require('../deps/dicer/lib/Dicer')
|
||||||
|
|
||||||
|
const MultipartParser = require('./types/multipart')
|
||||||
|
const UrlencodedParser = require('./types/urlencoded')
|
||||||
|
const parseParams = require('./utils/parseParams')
|
||||||
|
|
||||||
|
function Busboy (opts) {
|
||||||
|
if (!(this instanceof Busboy)) { return new Busboy(opts) }
|
||||||
|
|
||||||
|
if (typeof opts !== 'object') {
|
||||||
|
throw new TypeError('Busboy expected an options-Object.')
|
||||||
|
}
|
||||||
|
if (typeof opts.headers !== 'object') {
|
||||||
|
throw new TypeError('Busboy expected an options-Object with headers-attribute.')
|
||||||
|
}
|
||||||
|
if (typeof opts.headers['content-type'] !== 'string') {
|
||||||
|
throw new TypeError('Missing Content-Type-header.')
|
||||||
|
}
|
||||||
|
|
||||||
|
const {
|
||||||
|
headers,
|
||||||
|
...streamOptions
|
||||||
|
} = opts
|
||||||
|
|
||||||
|
this.opts = {
|
||||||
|
autoDestroy: false,
|
||||||
|
...streamOptions
|
||||||
|
}
|
||||||
|
WritableStream.call(this, this.opts)
|
||||||
|
|
||||||
|
this._done = false
|
||||||
|
this._parser = this.getParserByHeaders(headers)
|
||||||
|
this._finished = false
|
||||||
|
}
|
||||||
|
inherits(Busboy, WritableStream)
|
||||||
|
|
||||||
|
Busboy.prototype.emit = function (ev) {
|
||||||
|
if (ev === 'finish') {
|
||||||
|
if (!this._done) {
|
||||||
|
this._parser?.end()
|
||||||
|
return
|
||||||
|
} else if (this._finished) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this._finished = true
|
||||||
|
}
|
||||||
|
WritableStream.prototype.emit.apply(this, arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
Busboy.prototype.getParserByHeaders = function (headers) {
|
||||||
|
const parsed = parseParams(headers['content-type'])
|
||||||
|
|
||||||
|
const cfg = {
|
||||||
|
defCharset: this.opts.defCharset,
|
||||||
|
fileHwm: this.opts.fileHwm,
|
||||||
|
headers,
|
||||||
|
highWaterMark: this.opts.highWaterMark,
|
||||||
|
isPartAFile: this.opts.isPartAFile,
|
||||||
|
limits: this.opts.limits,
|
||||||
|
parsedConType: parsed,
|
||||||
|
preservePath: this.opts.preservePath
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MultipartParser.detect.test(parsed[0])) {
|
||||||
|
return new MultipartParser(this, cfg)
|
||||||
|
}
|
||||||
|
if (UrlencodedParser.detect.test(parsed[0])) {
|
||||||
|
return new UrlencodedParser(this, cfg)
|
||||||
|
}
|
||||||
|
throw new Error('Unsupported Content-Type.')
|
||||||
|
}
|
||||||
|
|
||||||
|
Busboy.prototype._write = function (chunk, encoding, cb) {
|
||||||
|
this._parser.write(chunk, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Busboy
|
||||||
|
module.exports.default = Busboy
|
||||||
|
module.exports.Busboy = Busboy
|
||||||
|
|
||||||
|
module.exports.Dicer = Dicer
|
||||||
306
node_modules/@fastify/busboy/lib/types/multipart.js
generated
vendored
Normal file
306
node_modules/@fastify/busboy/lib/types/multipart.js
generated
vendored
Normal file
@@ -0,0 +1,306 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// * support 1 nested multipart level
|
||||||
|
// (see second multipart example here:
|
||||||
|
// http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data)
|
||||||
|
// * support limits.fieldNameSize
|
||||||
|
// -- this will require modifications to utils.parseParams
|
||||||
|
|
||||||
|
const { Readable } = require('node:stream')
|
||||||
|
const { inherits } = require('node:util')
|
||||||
|
|
||||||
|
const Dicer = require('../../deps/dicer/lib/Dicer')
|
||||||
|
|
||||||
|
const parseParams = require('../utils/parseParams')
|
||||||
|
const decodeText = require('../utils/decodeText')
|
||||||
|
const basename = require('../utils/basename')
|
||||||
|
const getLimit = require('../utils/getLimit')
|
||||||
|
|
||||||
|
const RE_BOUNDARY = /^boundary$/i
|
||||||
|
const RE_FIELD = /^form-data$/i
|
||||||
|
const RE_CHARSET = /^charset$/i
|
||||||
|
const RE_FILENAME = /^filename$/i
|
||||||
|
const RE_NAME = /^name$/i
|
||||||
|
|
||||||
|
Multipart.detect = /^multipart\/form-data/i
|
||||||
|
function Multipart (boy, cfg) {
|
||||||
|
let i
|
||||||
|
let len
|
||||||
|
const self = this
|
||||||
|
let boundary
|
||||||
|
const limits = cfg.limits
|
||||||
|
const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined))
|
||||||
|
const parsedConType = cfg.parsedConType || []
|
||||||
|
const defCharset = cfg.defCharset || 'utf8'
|
||||||
|
const preservePath = cfg.preservePath
|
||||||
|
const fileOpts = { highWaterMark: cfg.fileHwm }
|
||||||
|
|
||||||
|
for (i = 0, len = parsedConType.length; i < len; ++i) {
|
||||||
|
if (Array.isArray(parsedConType[i]) &&
|
||||||
|
RE_BOUNDARY.test(parsedConType[i][0])) {
|
||||||
|
boundary = parsedConType[i][1]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkFinished () {
|
||||||
|
if (nends === 0 && finished && !boy._done) {
|
||||||
|
finished = false
|
||||||
|
self.end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') }
|
||||||
|
|
||||||
|
const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)
|
||||||
|
const fileSizeLimit = getLimit(limits, 'fileSize', Infinity)
|
||||||
|
const filesLimit = getLimit(limits, 'files', Infinity)
|
||||||
|
const fieldsLimit = getLimit(limits, 'fields', Infinity)
|
||||||
|
const partsLimit = getLimit(limits, 'parts', Infinity)
|
||||||
|
const headerPairsLimit = getLimit(limits, 'headerPairs', 2000)
|
||||||
|
const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024)
|
||||||
|
|
||||||
|
let nfiles = 0
|
||||||
|
let nfields = 0
|
||||||
|
let nends = 0
|
||||||
|
let curFile
|
||||||
|
let curField
|
||||||
|
let finished = false
|
||||||
|
|
||||||
|
this._needDrain = false
|
||||||
|
this._pause = false
|
||||||
|
this._cb = undefined
|
||||||
|
this._nparts = 0
|
||||||
|
this._boy = boy
|
||||||
|
|
||||||
|
const parserCfg = {
|
||||||
|
boundary,
|
||||||
|
maxHeaderPairs: headerPairsLimit,
|
||||||
|
maxHeaderSize: headerSizeLimit,
|
||||||
|
partHwm: fileOpts.highWaterMark,
|
||||||
|
highWaterMark: cfg.highWaterMark
|
||||||
|
}
|
||||||
|
|
||||||
|
this.parser = new Dicer(parserCfg)
|
||||||
|
this.parser.on('drain', function () {
|
||||||
|
self._needDrain = false
|
||||||
|
if (self._cb && !self._pause) {
|
||||||
|
const cb = self._cb
|
||||||
|
self._cb = undefined
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
}).on('part', function onPart (part) {
|
||||||
|
if (++self._nparts > partsLimit) {
|
||||||
|
self.parser.removeListener('part', onPart)
|
||||||
|
self.parser.on('part', skipPart)
|
||||||
|
boy.hitPartsLimit = true
|
||||||
|
boy.emit('partsLimit')
|
||||||
|
return skipPart(part)
|
||||||
|
}
|
||||||
|
|
||||||
|
// hack because streams2 _always_ doesn't emit 'end' until nextTick, so let
|
||||||
|
// us emit 'end' early since we know the part has ended if we are already
|
||||||
|
// seeing the next part
|
||||||
|
if (curField) {
|
||||||
|
const field = curField
|
||||||
|
field.emit('end')
|
||||||
|
field.removeAllListeners('end')
|
||||||
|
}
|
||||||
|
|
||||||
|
part.on('header', function (header) {
|
||||||
|
let contype
|
||||||
|
let fieldname
|
||||||
|
let parsed
|
||||||
|
let charset
|
||||||
|
let encoding
|
||||||
|
let filename
|
||||||
|
let nsize = 0
|
||||||
|
|
||||||
|
if (header['content-type']) {
|
||||||
|
parsed = parseParams(header['content-type'][0])
|
||||||
|
if (parsed[0]) {
|
||||||
|
contype = parsed[0].toLowerCase()
|
||||||
|
for (i = 0, len = parsed.length; i < len; ++i) {
|
||||||
|
if (RE_CHARSET.test(parsed[i][0])) {
|
||||||
|
charset = parsed[i][1].toLowerCase()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (contype === undefined) { contype = 'text/plain' }
|
||||||
|
if (charset === undefined) { charset = defCharset }
|
||||||
|
|
||||||
|
if (header['content-disposition']) {
|
||||||
|
parsed = parseParams(header['content-disposition'][0])
|
||||||
|
if (!RE_FIELD.test(parsed[0])) { return skipPart(part) }
|
||||||
|
for (i = 0, len = parsed.length; i < len; ++i) {
|
||||||
|
if (RE_NAME.test(parsed[i][0])) {
|
||||||
|
fieldname = parsed[i][1]
|
||||||
|
} else if (RE_FILENAME.test(parsed[i][0])) {
|
||||||
|
filename = parsed[i][1]
|
||||||
|
if (!preservePath) { filename = basename(filename) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { return skipPart(part) }
|
||||||
|
|
||||||
|
if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' }
|
||||||
|
|
||||||
|
let onData,
|
||||||
|
onEnd
|
||||||
|
|
||||||
|
if (isPartAFile(fieldname, contype, filename)) {
|
||||||
|
// file/binary field
|
||||||
|
if (nfiles === filesLimit) {
|
||||||
|
if (!boy.hitFilesLimit) {
|
||||||
|
boy.hitFilesLimit = true
|
||||||
|
boy.emit('filesLimit')
|
||||||
|
}
|
||||||
|
return skipPart(part)
|
||||||
|
}
|
||||||
|
|
||||||
|
++nfiles
|
||||||
|
|
||||||
|
if (boy.listenerCount('file') === 0) {
|
||||||
|
self.parser._ignore()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
++nends
|
||||||
|
const file = new FileStream(fileOpts)
|
||||||
|
curFile = file
|
||||||
|
file.on('end', function () {
|
||||||
|
--nends
|
||||||
|
self._pause = false
|
||||||
|
checkFinished()
|
||||||
|
if (self._cb && !self._needDrain) {
|
||||||
|
const cb = self._cb
|
||||||
|
self._cb = undefined
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
file._read = function (n) {
|
||||||
|
if (!self._pause) { return }
|
||||||
|
self._pause = false
|
||||||
|
if (self._cb && !self._needDrain) {
|
||||||
|
const cb = self._cb
|
||||||
|
self._cb = undefined
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boy.emit('file', fieldname, file, filename, encoding, contype)
|
||||||
|
|
||||||
|
onData = function (data) {
|
||||||
|
if ((nsize += data.length) > fileSizeLimit) {
|
||||||
|
const extralen = fileSizeLimit - nsize + data.length
|
||||||
|
if (extralen > 0) { file.push(data.slice(0, extralen)) }
|
||||||
|
file.truncated = true
|
||||||
|
file.bytesRead = fileSizeLimit
|
||||||
|
part.removeAllListeners('data')
|
||||||
|
file.emit('limit')
|
||||||
|
return
|
||||||
|
} else if (!file.push(data)) { self._pause = true }
|
||||||
|
|
||||||
|
file.bytesRead = nsize
|
||||||
|
}
|
||||||
|
|
||||||
|
onEnd = function () {
|
||||||
|
curFile = undefined
|
||||||
|
file.push(null)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// non-file field
|
||||||
|
if (nfields === fieldsLimit) {
|
||||||
|
if (!boy.hitFieldsLimit) {
|
||||||
|
boy.hitFieldsLimit = true
|
||||||
|
boy.emit('fieldsLimit')
|
||||||
|
}
|
||||||
|
return skipPart(part)
|
||||||
|
}
|
||||||
|
|
||||||
|
++nfields
|
||||||
|
++nends
|
||||||
|
let buffer = ''
|
||||||
|
let truncated = false
|
||||||
|
curField = part
|
||||||
|
|
||||||
|
onData = function (data) {
|
||||||
|
if ((nsize += data.length) > fieldSizeLimit) {
|
||||||
|
const extralen = (fieldSizeLimit - (nsize - data.length))
|
||||||
|
buffer += data.toString('binary', 0, extralen)
|
||||||
|
truncated = true
|
||||||
|
part.removeAllListeners('data')
|
||||||
|
} else { buffer += data.toString('binary') }
|
||||||
|
}
|
||||||
|
|
||||||
|
onEnd = function () {
|
||||||
|
curField = undefined
|
||||||
|
if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) }
|
||||||
|
boy.emit('field', fieldname, buffer, false, truncated, encoding, contype)
|
||||||
|
--nends
|
||||||
|
checkFinished()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become
|
||||||
|
broken. Streams2/streams3 is a huge black box of confusion, but
|
||||||
|
somehow overriding the sync state seems to fix things again (and still
|
||||||
|
seems to work for previous node versions).
|
||||||
|
*/
|
||||||
|
part._readableState.sync = false
|
||||||
|
|
||||||
|
part.on('data', onData)
|
||||||
|
part.on('end', onEnd)
|
||||||
|
}).on('error', function (err) {
|
||||||
|
if (curFile) { curFile.emit('error', err) }
|
||||||
|
})
|
||||||
|
}).on('error', function (err) {
|
||||||
|
boy.emit('error', err)
|
||||||
|
}).on('finish', function () {
|
||||||
|
finished = true
|
||||||
|
checkFinished()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Multipart.prototype.write = function (chunk, cb) {
|
||||||
|
const r = this.parser.write(chunk)
|
||||||
|
if (r && !this._pause) {
|
||||||
|
cb()
|
||||||
|
} else {
|
||||||
|
this._needDrain = !r
|
||||||
|
this._cb = cb
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Multipart.prototype.end = function () {
|
||||||
|
const self = this
|
||||||
|
|
||||||
|
if (self.parser.writable) {
|
||||||
|
self.parser.end()
|
||||||
|
} else if (!self._boy._done) {
|
||||||
|
process.nextTick(function () {
|
||||||
|
self._boy._done = true
|
||||||
|
self._boy.emit('finish')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function skipPart (part) {
|
||||||
|
part.resume()
|
||||||
|
}
|
||||||
|
|
||||||
|
function FileStream (opts) {
|
||||||
|
Readable.call(this, opts)
|
||||||
|
|
||||||
|
this.bytesRead = 0
|
||||||
|
|
||||||
|
this.truncated = false
|
||||||
|
}
|
||||||
|
|
||||||
|
inherits(FileStream, Readable)
|
||||||
|
|
||||||
|
FileStream.prototype._read = function (n) {}
|
||||||
|
|
||||||
|
module.exports = Multipart
|
||||||
190
node_modules/@fastify/busboy/lib/types/urlencoded.js
generated
vendored
Normal file
190
node_modules/@fastify/busboy/lib/types/urlencoded.js
generated
vendored
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const Decoder = require('../utils/Decoder')
|
||||||
|
const decodeText = require('../utils/decodeText')
|
||||||
|
const getLimit = require('../utils/getLimit')
|
||||||
|
|
||||||
|
const RE_CHARSET = /^charset$/i
|
||||||
|
|
||||||
|
UrlEncoded.detect = /^application\/x-www-form-urlencoded/i
|
||||||
|
function UrlEncoded (boy, cfg) {
|
||||||
|
const limits = cfg.limits
|
||||||
|
const parsedConType = cfg.parsedConType
|
||||||
|
this.boy = boy
|
||||||
|
|
||||||
|
this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)
|
||||||
|
this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100)
|
||||||
|
this.fieldsLimit = getLimit(limits, 'fields', Infinity)
|
||||||
|
|
||||||
|
let charset
|
||||||
|
for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var
|
||||||
|
if (Array.isArray(parsedConType[i]) &&
|
||||||
|
RE_CHARSET.test(parsedConType[i][0])) {
|
||||||
|
charset = parsedConType[i][1].toLowerCase()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (charset === undefined) { charset = cfg.defCharset || 'utf8' }
|
||||||
|
|
||||||
|
this.decoder = new Decoder()
|
||||||
|
this.charset = charset
|
||||||
|
this._fields = 0
|
||||||
|
this._state = 'key'
|
||||||
|
this._checkingBytes = true
|
||||||
|
this._bytesKey = 0
|
||||||
|
this._bytesVal = 0
|
||||||
|
this._key = ''
|
||||||
|
this._val = ''
|
||||||
|
this._keyTrunc = false
|
||||||
|
this._valTrunc = false
|
||||||
|
this._hitLimit = false
|
||||||
|
}
|
||||||
|
|
||||||
|
UrlEncoded.prototype.write = function (data, cb) {
|
||||||
|
if (this._fields === this.fieldsLimit) {
|
||||||
|
if (!this.boy.hitFieldsLimit) {
|
||||||
|
this.boy.hitFieldsLimit = true
|
||||||
|
this.boy.emit('fieldsLimit')
|
||||||
|
}
|
||||||
|
return cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
let idxeq; let idxamp; let i; let p = 0; const len = data.length
|
||||||
|
|
||||||
|
while (p < len) {
|
||||||
|
if (this._state === 'key') {
|
||||||
|
idxeq = idxamp = undefined
|
||||||
|
for (i = p; i < len; ++i) {
|
||||||
|
if (!this._checkingBytes) { ++p }
|
||||||
|
if (data[i] === 0x3D/* = */) {
|
||||||
|
idxeq = i
|
||||||
|
break
|
||||||
|
} else if (data[i] === 0x26/* & */) {
|
||||||
|
idxamp = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) {
|
||||||
|
this._hitLimit = true
|
||||||
|
break
|
||||||
|
} else if (this._checkingBytes) { ++this._bytesKey }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idxeq !== undefined) {
|
||||||
|
// key with assignment
|
||||||
|
if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) }
|
||||||
|
this._state = 'val'
|
||||||
|
|
||||||
|
this._hitLimit = false
|
||||||
|
this._checkingBytes = true
|
||||||
|
this._val = ''
|
||||||
|
this._bytesVal = 0
|
||||||
|
this._valTrunc = false
|
||||||
|
this.decoder.reset()
|
||||||
|
|
||||||
|
p = idxeq + 1
|
||||||
|
} else if (idxamp !== undefined) {
|
||||||
|
// key with no assignment
|
||||||
|
++this._fields
|
||||||
|
let key; const keyTrunc = this._keyTrunc
|
||||||
|
if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key }
|
||||||
|
|
||||||
|
this._hitLimit = false
|
||||||
|
this._checkingBytes = true
|
||||||
|
this._key = ''
|
||||||
|
this._bytesKey = 0
|
||||||
|
this._keyTrunc = false
|
||||||
|
this.decoder.reset()
|
||||||
|
|
||||||
|
if (key.length) {
|
||||||
|
this.boy.emit('field', decodeText(key, 'binary', this.charset),
|
||||||
|
'',
|
||||||
|
keyTrunc,
|
||||||
|
false)
|
||||||
|
}
|
||||||
|
|
||||||
|
p = idxamp + 1
|
||||||
|
if (this._fields === this.fieldsLimit) { return cb() }
|
||||||
|
} else if (this._hitLimit) {
|
||||||
|
// we may not have hit the actual limit if there are encoded bytes...
|
||||||
|
if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) }
|
||||||
|
p = i
|
||||||
|
if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) {
|
||||||
|
// yep, we actually did hit the limit
|
||||||
|
this._checkingBytes = false
|
||||||
|
this._keyTrunc = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) }
|
||||||
|
p = len
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
idxamp = undefined
|
||||||
|
for (i = p; i < len; ++i) {
|
||||||
|
if (!this._checkingBytes) { ++p }
|
||||||
|
if (data[i] === 0x26/* & */) {
|
||||||
|
idxamp = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) {
|
||||||
|
this._hitLimit = true
|
||||||
|
break
|
||||||
|
} else if (this._checkingBytes) { ++this._bytesVal }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idxamp !== undefined) {
|
||||||
|
++this._fields
|
||||||
|
if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) }
|
||||||
|
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
||||||
|
decodeText(this._val, 'binary', this.charset),
|
||||||
|
this._keyTrunc,
|
||||||
|
this._valTrunc)
|
||||||
|
this._state = 'key'
|
||||||
|
|
||||||
|
this._hitLimit = false
|
||||||
|
this._checkingBytes = true
|
||||||
|
this._key = ''
|
||||||
|
this._bytesKey = 0
|
||||||
|
this._keyTrunc = false
|
||||||
|
this.decoder.reset()
|
||||||
|
|
||||||
|
p = idxamp + 1
|
||||||
|
if (this._fields === this.fieldsLimit) { return cb() }
|
||||||
|
} else if (this._hitLimit) {
|
||||||
|
// we may not have hit the actual limit if there are encoded bytes...
|
||||||
|
if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) }
|
||||||
|
p = i
|
||||||
|
if ((this._val === '' && this.fieldSizeLimit === 0) ||
|
||||||
|
(this._bytesVal = this._val.length) === this.fieldSizeLimit) {
|
||||||
|
// yep, we actually did hit the limit
|
||||||
|
this._checkingBytes = false
|
||||||
|
this._valTrunc = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) }
|
||||||
|
p = len
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
UrlEncoded.prototype.end = function () {
|
||||||
|
if (this.boy._done) { return }
|
||||||
|
|
||||||
|
if (this._state === 'key' && this._key.length > 0) {
|
||||||
|
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
||||||
|
'',
|
||||||
|
this._keyTrunc,
|
||||||
|
false)
|
||||||
|
} else if (this._state === 'val') {
|
||||||
|
this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
|
||||||
|
decodeText(this._val, 'binary', this.charset),
|
||||||
|
this._keyTrunc,
|
||||||
|
this._valTrunc)
|
||||||
|
}
|
||||||
|
this.boy._done = true
|
||||||
|
this.boy.emit('finish')
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = UrlEncoded
|
||||||
54
node_modules/@fastify/busboy/lib/utils/Decoder.js
generated
vendored
Normal file
54
node_modules/@fastify/busboy/lib/utils/Decoder.js
generated
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const RE_PLUS = /\+/g
|
||||||
|
|
||||||
|
const HEX = [
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
]
|
||||||
|
|
||||||
|
function Decoder () {
|
||||||
|
this.buffer = undefined
|
||||||
|
}
|
||||||
|
Decoder.prototype.write = function (str) {
|
||||||
|
// Replace '+' with ' ' before decoding
|
||||||
|
str = str.replace(RE_PLUS, ' ')
|
||||||
|
let res = ''
|
||||||
|
let i = 0; let p = 0; const len = str.length
|
||||||
|
for (; i < len; ++i) {
|
||||||
|
if (this.buffer !== undefined) {
|
||||||
|
if (!HEX[str.charCodeAt(i)]) {
|
||||||
|
res += '%' + this.buffer
|
||||||
|
this.buffer = undefined
|
||||||
|
--i // retry character
|
||||||
|
} else {
|
||||||
|
this.buffer += str[i]
|
||||||
|
++p
|
||||||
|
if (this.buffer.length === 2) {
|
||||||
|
res += String.fromCharCode(parseInt(this.buffer, 16))
|
||||||
|
this.buffer = undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (str[i] === '%') {
|
||||||
|
if (i > p) {
|
||||||
|
res += str.substring(p, i)
|
||||||
|
p = i
|
||||||
|
}
|
||||||
|
this.buffer = ''
|
||||||
|
++p
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p < len && this.buffer === undefined) { res += str.substring(p) }
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
Decoder.prototype.reset = function () {
|
||||||
|
this.buffer = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Decoder
|
||||||
14
node_modules/@fastify/busboy/lib/utils/basename.js
generated
vendored
Normal file
14
node_modules/@fastify/busboy/lib/utils/basename.js
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
module.exports = function basename (path) {
|
||||||
|
if (typeof path !== 'string') { return '' }
|
||||||
|
for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var
|
||||||
|
switch (path.charCodeAt(i)) {
|
||||||
|
case 0x2F: // '/'
|
||||||
|
case 0x5C: // '\'
|
||||||
|
path = path.slice(i + 1)
|
||||||
|
return (path === '..' || path === '.' ? '' : path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (path === '..' || path === '.' ? '' : path)
|
||||||
|
}
|
||||||
114
node_modules/@fastify/busboy/lib/utils/decodeText.js
generated
vendored
Normal file
114
node_modules/@fastify/busboy/lib/utils/decodeText.js
generated
vendored
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Node has always utf-8
|
||||||
|
const utf8Decoder = new TextDecoder('utf-8')
|
||||||
|
const textDecoders = new Map([
|
||||||
|
['utf-8', utf8Decoder],
|
||||||
|
['utf8', utf8Decoder]
|
||||||
|
])
|
||||||
|
|
||||||
|
function getDecoder (charset) {
|
||||||
|
let lc
|
||||||
|
while (true) {
|
||||||
|
switch (charset) {
|
||||||
|
case 'utf-8':
|
||||||
|
case 'utf8':
|
||||||
|
return decoders.utf8
|
||||||
|
case 'latin1':
|
||||||
|
case 'ascii': // TODO: Make these a separate, strict decoder?
|
||||||
|
case 'us-ascii':
|
||||||
|
case 'iso-8859-1':
|
||||||
|
case 'iso8859-1':
|
||||||
|
case 'iso88591':
|
||||||
|
case 'iso_8859-1':
|
||||||
|
case 'windows-1252':
|
||||||
|
case 'iso_8859-1:1987':
|
||||||
|
case 'cp1252':
|
||||||
|
case 'x-cp1252':
|
||||||
|
return decoders.latin1
|
||||||
|
case 'utf16le':
|
||||||
|
case 'utf-16le':
|
||||||
|
case 'ucs2':
|
||||||
|
case 'ucs-2':
|
||||||
|
return decoders.utf16le
|
||||||
|
case 'base64':
|
||||||
|
return decoders.base64
|
||||||
|
default:
|
||||||
|
if (lc === undefined) {
|
||||||
|
lc = true
|
||||||
|
charset = charset.toLowerCase()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return decoders.other.bind(charset)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const decoders = {
|
||||||
|
utf8: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = Buffer.from(data, sourceEncoding)
|
||||||
|
}
|
||||||
|
return data.utf8Slice(0, data.length)
|
||||||
|
},
|
||||||
|
|
||||||
|
latin1: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
return data.latin1Slice(0, data.length)
|
||||||
|
},
|
||||||
|
|
||||||
|
utf16le: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = Buffer.from(data, sourceEncoding)
|
||||||
|
}
|
||||||
|
return data.ucs2Slice(0, data.length)
|
||||||
|
},
|
||||||
|
|
||||||
|
base64: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = Buffer.from(data, sourceEncoding)
|
||||||
|
}
|
||||||
|
return data.base64Slice(0, data.length)
|
||||||
|
},
|
||||||
|
|
||||||
|
other: (data, sourceEncoding) => {
|
||||||
|
if (data.length === 0) {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = Buffer.from(data, sourceEncoding)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (textDecoders.has(this.toString())) {
|
||||||
|
try {
|
||||||
|
return textDecoders.get(this).decode(data)
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
return typeof data === 'string'
|
||||||
|
? data
|
||||||
|
: data.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function decodeText (text, sourceEncoding, destEncoding) {
|
||||||
|
if (text) {
|
||||||
|
return getDecoder(destEncoding)(text, sourceEncoding)
|
||||||
|
}
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = decodeText
|
||||||
16
node_modules/@fastify/busboy/lib/utils/getLimit.js
generated
vendored
Normal file
16
node_modules/@fastify/busboy/lib/utils/getLimit.js
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
module.exports = function getLimit (limits, name, defaultLimit) {
|
||||||
|
if (
|
||||||
|
!limits ||
|
||||||
|
limits[name] === undefined ||
|
||||||
|
limits[name] === null
|
||||||
|
) { return defaultLimit }
|
||||||
|
|
||||||
|
if (
|
||||||
|
typeof limits[name] !== 'number' ||
|
||||||
|
isNaN(limits[name])
|
||||||
|
) { throw new TypeError('Limit ' + name + ' is not a valid number') }
|
||||||
|
|
||||||
|
return limits[name]
|
||||||
|
}
|
||||||
196
node_modules/@fastify/busboy/lib/utils/parseParams.js
generated
vendored
Normal file
196
node_modules/@fastify/busboy/lib/utils/parseParams.js
generated
vendored
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
/* eslint-disable object-property-newline */
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const decodeText = require('./decodeText')
|
||||||
|
|
||||||
|
const RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g
|
||||||
|
|
||||||
|
const EncodedLookup = {
|
||||||
|
'%00': '\x00', '%01': '\x01', '%02': '\x02', '%03': '\x03', '%04': '\x04',
|
||||||
|
'%05': '\x05', '%06': '\x06', '%07': '\x07', '%08': '\x08', '%09': '\x09',
|
||||||
|
'%0a': '\x0a', '%0A': '\x0a', '%0b': '\x0b', '%0B': '\x0b', '%0c': '\x0c',
|
||||||
|
'%0C': '\x0c', '%0d': '\x0d', '%0D': '\x0d', '%0e': '\x0e', '%0E': '\x0e',
|
||||||
|
'%0f': '\x0f', '%0F': '\x0f', '%10': '\x10', '%11': '\x11', '%12': '\x12',
|
||||||
|
'%13': '\x13', '%14': '\x14', '%15': '\x15', '%16': '\x16', '%17': '\x17',
|
||||||
|
'%18': '\x18', '%19': '\x19', '%1a': '\x1a', '%1A': '\x1a', '%1b': '\x1b',
|
||||||
|
'%1B': '\x1b', '%1c': '\x1c', '%1C': '\x1c', '%1d': '\x1d', '%1D': '\x1d',
|
||||||
|
'%1e': '\x1e', '%1E': '\x1e', '%1f': '\x1f', '%1F': '\x1f', '%20': '\x20',
|
||||||
|
'%21': '\x21', '%22': '\x22', '%23': '\x23', '%24': '\x24', '%25': '\x25',
|
||||||
|
'%26': '\x26', '%27': '\x27', '%28': '\x28', '%29': '\x29', '%2a': '\x2a',
|
||||||
|
'%2A': '\x2a', '%2b': '\x2b', '%2B': '\x2b', '%2c': '\x2c', '%2C': '\x2c',
|
||||||
|
'%2d': '\x2d', '%2D': '\x2d', '%2e': '\x2e', '%2E': '\x2e', '%2f': '\x2f',
|
||||||
|
'%2F': '\x2f', '%30': '\x30', '%31': '\x31', '%32': '\x32', '%33': '\x33',
|
||||||
|
'%34': '\x34', '%35': '\x35', '%36': '\x36', '%37': '\x37', '%38': '\x38',
|
||||||
|
'%39': '\x39', '%3a': '\x3a', '%3A': '\x3a', '%3b': '\x3b', '%3B': '\x3b',
|
||||||
|
'%3c': '\x3c', '%3C': '\x3c', '%3d': '\x3d', '%3D': '\x3d', '%3e': '\x3e',
|
||||||
|
'%3E': '\x3e', '%3f': '\x3f', '%3F': '\x3f', '%40': '\x40', '%41': '\x41',
|
||||||
|
'%42': '\x42', '%43': '\x43', '%44': '\x44', '%45': '\x45', '%46': '\x46',
|
||||||
|
'%47': '\x47', '%48': '\x48', '%49': '\x49', '%4a': '\x4a', '%4A': '\x4a',
|
||||||
|
'%4b': '\x4b', '%4B': '\x4b', '%4c': '\x4c', '%4C': '\x4c', '%4d': '\x4d',
|
||||||
|
'%4D': '\x4d', '%4e': '\x4e', '%4E': '\x4e', '%4f': '\x4f', '%4F': '\x4f',
|
||||||
|
'%50': '\x50', '%51': '\x51', '%52': '\x52', '%53': '\x53', '%54': '\x54',
|
||||||
|
'%55': '\x55', '%56': '\x56', '%57': '\x57', '%58': '\x58', '%59': '\x59',
|
||||||
|
'%5a': '\x5a', '%5A': '\x5a', '%5b': '\x5b', '%5B': '\x5b', '%5c': '\x5c',
|
||||||
|
'%5C': '\x5c', '%5d': '\x5d', '%5D': '\x5d', '%5e': '\x5e', '%5E': '\x5e',
|
||||||
|
'%5f': '\x5f', '%5F': '\x5f', '%60': '\x60', '%61': '\x61', '%62': '\x62',
|
||||||
|
'%63': '\x63', '%64': '\x64', '%65': '\x65', '%66': '\x66', '%67': '\x67',
|
||||||
|
'%68': '\x68', '%69': '\x69', '%6a': '\x6a', '%6A': '\x6a', '%6b': '\x6b',
|
||||||
|
'%6B': '\x6b', '%6c': '\x6c', '%6C': '\x6c', '%6d': '\x6d', '%6D': '\x6d',
|
||||||
|
'%6e': '\x6e', '%6E': '\x6e', '%6f': '\x6f', '%6F': '\x6f', '%70': '\x70',
|
||||||
|
'%71': '\x71', '%72': '\x72', '%73': '\x73', '%74': '\x74', '%75': '\x75',
|
||||||
|
'%76': '\x76', '%77': '\x77', '%78': '\x78', '%79': '\x79', '%7a': '\x7a',
|
||||||
|
'%7A': '\x7a', '%7b': '\x7b', '%7B': '\x7b', '%7c': '\x7c', '%7C': '\x7c',
|
||||||
|
'%7d': '\x7d', '%7D': '\x7d', '%7e': '\x7e', '%7E': '\x7e', '%7f': '\x7f',
|
||||||
|
'%7F': '\x7f', '%80': '\x80', '%81': '\x81', '%82': '\x82', '%83': '\x83',
|
||||||
|
'%84': '\x84', '%85': '\x85', '%86': '\x86', '%87': '\x87', '%88': '\x88',
|
||||||
|
'%89': '\x89', '%8a': '\x8a', '%8A': '\x8a', '%8b': '\x8b', '%8B': '\x8b',
|
||||||
|
'%8c': '\x8c', '%8C': '\x8c', '%8d': '\x8d', '%8D': '\x8d', '%8e': '\x8e',
|
||||||
|
'%8E': '\x8e', '%8f': '\x8f', '%8F': '\x8f', '%90': '\x90', '%91': '\x91',
|
||||||
|
'%92': '\x92', '%93': '\x93', '%94': '\x94', '%95': '\x95', '%96': '\x96',
|
||||||
|
'%97': '\x97', '%98': '\x98', '%99': '\x99', '%9a': '\x9a', '%9A': '\x9a',
|
||||||
|
'%9b': '\x9b', '%9B': '\x9b', '%9c': '\x9c', '%9C': '\x9c', '%9d': '\x9d',
|
||||||
|
'%9D': '\x9d', '%9e': '\x9e', '%9E': '\x9e', '%9f': '\x9f', '%9F': '\x9f',
|
||||||
|
'%a0': '\xa0', '%A0': '\xa0', '%a1': '\xa1', '%A1': '\xa1', '%a2': '\xa2',
|
||||||
|
'%A2': '\xa2', '%a3': '\xa3', '%A3': '\xa3', '%a4': '\xa4', '%A4': '\xa4',
|
||||||
|
'%a5': '\xa5', '%A5': '\xa5', '%a6': '\xa6', '%A6': '\xa6', '%a7': '\xa7',
|
||||||
|
'%A7': '\xa7', '%a8': '\xa8', '%A8': '\xa8', '%a9': '\xa9', '%A9': '\xa9',
|
||||||
|
'%aa': '\xaa', '%Aa': '\xaa', '%aA': '\xaa', '%AA': '\xaa', '%ab': '\xab',
|
||||||
|
'%Ab': '\xab', '%aB': '\xab', '%AB': '\xab', '%ac': '\xac', '%Ac': '\xac',
|
||||||
|
'%aC': '\xac', '%AC': '\xac', '%ad': '\xad', '%Ad': '\xad', '%aD': '\xad',
|
||||||
|
'%AD': '\xad', '%ae': '\xae', '%Ae': '\xae', '%aE': '\xae', '%AE': '\xae',
|
||||||
|
'%af': '\xaf', '%Af': '\xaf', '%aF': '\xaf', '%AF': '\xaf', '%b0': '\xb0',
|
||||||
|
'%B0': '\xb0', '%b1': '\xb1', '%B1': '\xb1', '%b2': '\xb2', '%B2': '\xb2',
|
||||||
|
'%b3': '\xb3', '%B3': '\xb3', '%b4': '\xb4', '%B4': '\xb4', '%b5': '\xb5',
|
||||||
|
'%B5': '\xb5', '%b6': '\xb6', '%B6': '\xb6', '%b7': '\xb7', '%B7': '\xb7',
|
||||||
|
'%b8': '\xb8', '%B8': '\xb8', '%b9': '\xb9', '%B9': '\xb9', '%ba': '\xba',
|
||||||
|
'%Ba': '\xba', '%bA': '\xba', '%BA': '\xba', '%bb': '\xbb', '%Bb': '\xbb',
|
||||||
|
'%bB': '\xbb', '%BB': '\xbb', '%bc': '\xbc', '%Bc': '\xbc', '%bC': '\xbc',
|
||||||
|
'%BC': '\xbc', '%bd': '\xbd', '%Bd': '\xbd', '%bD': '\xbd', '%BD': '\xbd',
|
||||||
|
'%be': '\xbe', '%Be': '\xbe', '%bE': '\xbe', '%BE': '\xbe', '%bf': '\xbf',
|
||||||
|
'%Bf': '\xbf', '%bF': '\xbf', '%BF': '\xbf', '%c0': '\xc0', '%C0': '\xc0',
|
||||||
|
'%c1': '\xc1', '%C1': '\xc1', '%c2': '\xc2', '%C2': '\xc2', '%c3': '\xc3',
|
||||||
|
'%C3': '\xc3', '%c4': '\xc4', '%C4': '\xc4', '%c5': '\xc5', '%C5': '\xc5',
|
||||||
|
'%c6': '\xc6', '%C6': '\xc6', '%c7': '\xc7', '%C7': '\xc7', '%c8': '\xc8',
|
||||||
|
'%C8': '\xc8', '%c9': '\xc9', '%C9': '\xc9', '%ca': '\xca', '%Ca': '\xca',
|
||||||
|
'%cA': '\xca', '%CA': '\xca', '%cb': '\xcb', '%Cb': '\xcb', '%cB': '\xcb',
|
||||||
|
'%CB': '\xcb', '%cc': '\xcc', '%Cc': '\xcc', '%cC': '\xcc', '%CC': '\xcc',
|
||||||
|
'%cd': '\xcd', '%Cd': '\xcd', '%cD': '\xcd', '%CD': '\xcd', '%ce': '\xce',
|
||||||
|
'%Ce': '\xce', '%cE': '\xce', '%CE': '\xce', '%cf': '\xcf', '%Cf': '\xcf',
|
||||||
|
'%cF': '\xcf', '%CF': '\xcf', '%d0': '\xd0', '%D0': '\xd0', '%d1': '\xd1',
|
||||||
|
'%D1': '\xd1', '%d2': '\xd2', '%D2': '\xd2', '%d3': '\xd3', '%D3': '\xd3',
|
||||||
|
'%d4': '\xd4', '%D4': '\xd4', '%d5': '\xd5', '%D5': '\xd5', '%d6': '\xd6',
|
||||||
|
'%D6': '\xd6', '%d7': '\xd7', '%D7': '\xd7', '%d8': '\xd8', '%D8': '\xd8',
|
||||||
|
'%d9': '\xd9', '%D9': '\xd9', '%da': '\xda', '%Da': '\xda', '%dA': '\xda',
|
||||||
|
'%DA': '\xda', '%db': '\xdb', '%Db': '\xdb', '%dB': '\xdb', '%DB': '\xdb',
|
||||||
|
'%dc': '\xdc', '%Dc': '\xdc', '%dC': '\xdc', '%DC': '\xdc', '%dd': '\xdd',
|
||||||
|
'%Dd': '\xdd', '%dD': '\xdd', '%DD': '\xdd', '%de': '\xde', '%De': '\xde',
|
||||||
|
'%dE': '\xde', '%DE': '\xde', '%df': '\xdf', '%Df': '\xdf', '%dF': '\xdf',
|
||||||
|
'%DF': '\xdf', '%e0': '\xe0', '%E0': '\xe0', '%e1': '\xe1', '%E1': '\xe1',
|
||||||
|
'%e2': '\xe2', '%E2': '\xe2', '%e3': '\xe3', '%E3': '\xe3', '%e4': '\xe4',
|
||||||
|
'%E4': '\xe4', '%e5': '\xe5', '%E5': '\xe5', '%e6': '\xe6', '%E6': '\xe6',
|
||||||
|
'%e7': '\xe7', '%E7': '\xe7', '%e8': '\xe8', '%E8': '\xe8', '%e9': '\xe9',
|
||||||
|
'%E9': '\xe9', '%ea': '\xea', '%Ea': '\xea', '%eA': '\xea', '%EA': '\xea',
|
||||||
|
'%eb': '\xeb', '%Eb': '\xeb', '%eB': '\xeb', '%EB': '\xeb', '%ec': '\xec',
|
||||||
|
'%Ec': '\xec', '%eC': '\xec', '%EC': '\xec', '%ed': '\xed', '%Ed': '\xed',
|
||||||
|
'%eD': '\xed', '%ED': '\xed', '%ee': '\xee', '%Ee': '\xee', '%eE': '\xee',
|
||||||
|
'%EE': '\xee', '%ef': '\xef', '%Ef': '\xef', '%eF': '\xef', '%EF': '\xef',
|
||||||
|
'%f0': '\xf0', '%F0': '\xf0', '%f1': '\xf1', '%F1': '\xf1', '%f2': '\xf2',
|
||||||
|
'%F2': '\xf2', '%f3': '\xf3', '%F3': '\xf3', '%f4': '\xf4', '%F4': '\xf4',
|
||||||
|
'%f5': '\xf5', '%F5': '\xf5', '%f6': '\xf6', '%F6': '\xf6', '%f7': '\xf7',
|
||||||
|
'%F7': '\xf7', '%f8': '\xf8', '%F8': '\xf8', '%f9': '\xf9', '%F9': '\xf9',
|
||||||
|
'%fa': '\xfa', '%Fa': '\xfa', '%fA': '\xfa', '%FA': '\xfa', '%fb': '\xfb',
|
||||||
|
'%Fb': '\xfb', '%fB': '\xfb', '%FB': '\xfb', '%fc': '\xfc', '%Fc': '\xfc',
|
||||||
|
'%fC': '\xfc', '%FC': '\xfc', '%fd': '\xfd', '%Fd': '\xfd', '%fD': '\xfd',
|
||||||
|
'%FD': '\xfd', '%fe': '\xfe', '%Fe': '\xfe', '%fE': '\xfe', '%FE': '\xfe',
|
||||||
|
'%ff': '\xff', '%Ff': '\xff', '%fF': '\xff', '%FF': '\xff'
|
||||||
|
}
|
||||||
|
|
||||||
|
function encodedReplacer (match) {
|
||||||
|
return EncodedLookup[match]
|
||||||
|
}
|
||||||
|
|
||||||
|
const STATE_KEY = 0
|
||||||
|
const STATE_VALUE = 1
|
||||||
|
const STATE_CHARSET = 2
|
||||||
|
const STATE_LANG = 3
|
||||||
|
|
||||||
|
function parseParams (str) {
|
||||||
|
const res = []
|
||||||
|
let state = STATE_KEY
|
||||||
|
let charset = ''
|
||||||
|
let inquote = false
|
||||||
|
let escaping = false
|
||||||
|
let p = 0
|
||||||
|
let tmp = ''
|
||||||
|
const len = str.length
|
||||||
|
|
||||||
|
for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
|
||||||
|
const char = str[i]
|
||||||
|
if (char === '\\' && inquote) {
|
||||||
|
if (escaping) { escaping = false } else {
|
||||||
|
escaping = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} else if (char === '"') {
|
||||||
|
if (!escaping) {
|
||||||
|
if (inquote) {
|
||||||
|
inquote = false
|
||||||
|
state = STATE_KEY
|
||||||
|
} else { inquote = true }
|
||||||
|
continue
|
||||||
|
} else { escaping = false }
|
||||||
|
} else {
|
||||||
|
if (escaping && inquote) { tmp += '\\' }
|
||||||
|
escaping = false
|
||||||
|
if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") {
|
||||||
|
if (state === STATE_CHARSET) {
|
||||||
|
state = STATE_LANG
|
||||||
|
charset = tmp.substring(1)
|
||||||
|
} else { state = STATE_VALUE }
|
||||||
|
tmp = ''
|
||||||
|
continue
|
||||||
|
} else if (state === STATE_KEY &&
|
||||||
|
(char === '*' || char === '=') &&
|
||||||
|
res.length) {
|
||||||
|
state = char === '*'
|
||||||
|
? STATE_CHARSET
|
||||||
|
: STATE_VALUE
|
||||||
|
res[p] = [tmp, undefined]
|
||||||
|
tmp = ''
|
||||||
|
continue
|
||||||
|
} else if (!inquote && char === ';') {
|
||||||
|
state = STATE_KEY
|
||||||
|
if (charset) {
|
||||||
|
if (tmp.length) {
|
||||||
|
tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
|
||||||
|
'binary',
|
||||||
|
charset)
|
||||||
|
}
|
||||||
|
charset = ''
|
||||||
|
} else if (tmp.length) {
|
||||||
|
tmp = decodeText(tmp, 'binary', 'utf8')
|
||||||
|
}
|
||||||
|
if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp }
|
||||||
|
tmp = ''
|
||||||
|
++p
|
||||||
|
continue
|
||||||
|
} else if (!inquote && (char === ' ' || char === '\t')) { continue }
|
||||||
|
}
|
||||||
|
tmp += char
|
||||||
|
}
|
||||||
|
if (charset && tmp.length) {
|
||||||
|
tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
|
||||||
|
'binary',
|
||||||
|
charset)
|
||||||
|
} else if (tmp) {
|
||||||
|
tmp = decodeText(tmp, 'binary', 'utf8')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res[p] === undefined) {
|
||||||
|
if (tmp) { res[p] = tmp }
|
||||||
|
} else { res[p][1] = tmp }
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = parseParams
|
||||||
85
node_modules/@fastify/busboy/package.json
generated
vendored
Normal file
85
node_modules/@fastify/busboy/package.json
generated
vendored
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
{
|
||||||
|
"name": "@fastify/busboy",
|
||||||
|
"version": "3.1.1",
|
||||||
|
"private": false,
|
||||||
|
"author": "Brian White <mscdex@mscdex.net>",
|
||||||
|
"contributors": [
|
||||||
|
{
|
||||||
|
"name": "Igor Savin",
|
||||||
|
"email": "kibertoad@gmail.com",
|
||||||
|
"url": "https://github.com/kibertoad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Aras Abbasi",
|
||||||
|
"email": "aras.abbasi@gmail.com",
|
||||||
|
"url": "https://github.com/uzlopak"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A streaming parser for HTML form data for node.js",
|
||||||
|
"main": "lib/main",
|
||||||
|
"type": "commonjs",
|
||||||
|
"types": "lib/main.d.ts",
|
||||||
|
"scripts": {
|
||||||
|
"bench:busboy": "cd benchmarks && npm install && npm run benchmark-fastify",
|
||||||
|
"bench:dicer": "node bench/dicer/dicer-bench-multipart-parser.js",
|
||||||
|
"coveralls": "nyc report --reporter=lcov",
|
||||||
|
"lint": "npm run lint:standard",
|
||||||
|
"lint:fix": "standard --fix",
|
||||||
|
"lint:standard": "standard --verbose | snazzy",
|
||||||
|
"test:unit": "c8 --statements 98 --branches 97 --functions 96 --lines 98 node --test",
|
||||||
|
"test:types": "tsd",
|
||||||
|
"test": "npm run test:unit && npm run test:types"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^22.0.0",
|
||||||
|
"busboy": "^1.6.0",
|
||||||
|
"c8": "^10.1.2",
|
||||||
|
"photofinish": "^1.8.0",
|
||||||
|
"snazzy": "^9.0.0",
|
||||||
|
"standard": "^17.1.0",
|
||||||
|
"tinybench": "^3.0.0",
|
||||||
|
"tsd": "^0.31.0",
|
||||||
|
"typescript": "~5.7.2"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"uploads",
|
||||||
|
"forms",
|
||||||
|
"multipart",
|
||||||
|
"form-data"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/fastify/busboy.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/fastify/busboy/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/fastify/busboy#readme",
|
||||||
|
"tsd": {
|
||||||
|
"directory": "test/types",
|
||||||
|
"compilerOptions": {
|
||||||
|
"esModuleInterop": false,
|
||||||
|
"module": "commonjs",
|
||||||
|
"target": "ES2017"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"standard": {
|
||||||
|
"globals": [
|
||||||
|
"describe",
|
||||||
|
"it"
|
||||||
|
],
|
||||||
|
"ignore": [
|
||||||
|
"bench"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"README.md",
|
||||||
|
"LICENSE",
|
||||||
|
"lib/*",
|
||||||
|
"deps/encoding/*",
|
||||||
|
"deps/dicer/lib",
|
||||||
|
"deps/streamsearch/",
|
||||||
|
"deps/dicer/LICENSE"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
node_modules/@firebase/app-check-interop-types/README.md
generated
vendored
Normal file
3
node_modules/@firebase/app-check-interop-types/README.md
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# @firebase/app-check-interop-types
|
||||||
|
|
||||||
|
**This package is not intended for direct usage, and should only be used via the officially supported [firebase](https://www.npmjs.com/package/firebase) package.**
|
||||||
51
node_modules/@firebase/app-check-interop-types/index.d.ts
generated
vendored
Normal file
51
node_modules/@firebase/app-check-interop-types/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2020 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export interface FirebaseAppCheckInternal {
|
||||||
|
// Get the current AttestationToken. Attaches to the most recent in-flight request if one
|
||||||
|
// is present. Returns null if no token is present and no token requests are in-flight.
|
||||||
|
getToken(forceRefresh?: boolean): Promise<AppCheckTokenResult>;
|
||||||
|
|
||||||
|
// Always returns a fresh limited-use token suitable for Replay Protection.
|
||||||
|
// The returned token must be used and consumed as soon as possible.
|
||||||
|
getLimitedUseToken(): Promise<AppCheckTokenResult>;
|
||||||
|
|
||||||
|
// Registers a listener to changes in the token state. There can be more than one listener
|
||||||
|
// registered at the same time for one or more FirebaseAppAttestation instances. The
|
||||||
|
// listeners call back on the UI thread whenever the current token associated with this
|
||||||
|
// FirebaseAppAttestation changes.
|
||||||
|
addTokenListener(listener: AppCheckTokenListener): void;
|
||||||
|
|
||||||
|
// Unregisters a listener to changes in the token state.
|
||||||
|
removeTokenListener(listener: AppCheckTokenListener): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
type AppCheckTokenListener = (token: AppCheckTokenResult) => void;
|
||||||
|
|
||||||
|
// If the error field is defined, the token field will be populated with a dummy token
|
||||||
|
interface AppCheckTokenResult {
|
||||||
|
readonly token: string;
|
||||||
|
readonly error?: Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type AppCheckInternalComponentName = 'app-check-internal';
|
||||||
|
|
||||||
|
declare module '@firebase/component' {
|
||||||
|
interface NameServiceMapping {
|
||||||
|
'app-check-internal': FirebaseAppCheckInternal;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
node_modules/@firebase/app-check-interop-types/package.json
generated
vendored
Normal file
25
node_modules/@firebase/app-check-interop-types/package.json
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "@firebase/app-check-interop-types",
|
||||||
|
"version": "0.3.3",
|
||||||
|
"description": "@firebase/app-check-interop-types Types",
|
||||||
|
"author": "Firebase <firebase-support@google.com> (https://firebase.google.com/)",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"scripts": {
|
||||||
|
"test": "tsc",
|
||||||
|
"test:ci": "node ../../scripts/run_tests_in_ci.js"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"index.d.ts"
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"directory": "packages/app-check-interop-types",
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/firebase/firebase-js-sdk.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/firebase/firebase-js-sdk/issues"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"typescript": "5.5.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
3
node_modules/@firebase/app-types/README.md
generated
vendored
Normal file
3
node_modules/@firebase/app-types/README.md
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# @firebase/app-types
|
||||||
|
|
||||||
|
**This package is not intended for direct usage, and should only be used via the officially supported [firebase](https://www.npmjs.com/package/firebase) package.**
|
||||||
129
node_modules/@firebase/app-types/index.d.ts
generated
vendored
Normal file
129
node_modules/@firebase/app-types/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { LogCallback, LogLevelString, LogOptions } from '@firebase/logger';
|
||||||
|
|
||||||
|
export type FirebaseOptions = {
|
||||||
|
apiKey?: string;
|
||||||
|
authDomain?: string;
|
||||||
|
databaseURL?: string;
|
||||||
|
projectId?: string;
|
||||||
|
storageBucket?: string;
|
||||||
|
messagingSenderId?: string;
|
||||||
|
appId?: string;
|
||||||
|
measurementId?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export interface FirebaseAppConfig {
|
||||||
|
name?: string;
|
||||||
|
automaticDataCollectionEnabled?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class FirebaseApp {
|
||||||
|
/**
|
||||||
|
* The (read-only) name (identifier) for this App. '[DEFAULT]' is the default
|
||||||
|
* App.
|
||||||
|
*/
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The (read-only) configuration options from the app initialization.
|
||||||
|
*/
|
||||||
|
options: FirebaseOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The settable config flag for GDPR opt-in/opt-out
|
||||||
|
*/
|
||||||
|
automaticDataCollectionEnabled: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make the given App unusable and free resources.
|
||||||
|
*/
|
||||||
|
delete(): Promise<void>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FirebaseNamespace {
|
||||||
|
/**
|
||||||
|
* Create (and initialize) a FirebaseApp.
|
||||||
|
*
|
||||||
|
* @param options Options to configure the services used in the App.
|
||||||
|
* @param config The optional config for your firebase app
|
||||||
|
*/
|
||||||
|
initializeApp(
|
||||||
|
options: FirebaseOptions,
|
||||||
|
config?: FirebaseAppConfig
|
||||||
|
): FirebaseApp;
|
||||||
|
/**
|
||||||
|
* Create (and initialize) a FirebaseApp.
|
||||||
|
*
|
||||||
|
* @param options Options to configure the services used in the App.
|
||||||
|
* @param name The optional name of the app to initialize ('[DEFAULT]' if
|
||||||
|
* omitted)
|
||||||
|
*/
|
||||||
|
initializeApp(options: FirebaseOptions, name?: string): FirebaseApp;
|
||||||
|
|
||||||
|
app: {
|
||||||
|
/**
|
||||||
|
* Retrieve an instance of a FirebaseApp.
|
||||||
|
*
|
||||||
|
* Usage: firebase.app()
|
||||||
|
*
|
||||||
|
* @param name The optional name of the app to return ('[DEFAULT]' if omitted)
|
||||||
|
*/
|
||||||
|
(name?: string): FirebaseApp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For testing FirebaseApp instances:
|
||||||
|
* app() instanceof firebase.app.App
|
||||||
|
*
|
||||||
|
* DO NOT call this constuctor directly (use firebase.app() instead).
|
||||||
|
*/
|
||||||
|
App: typeof FirebaseApp;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A (read-only) array of all the initialized Apps.
|
||||||
|
*/
|
||||||
|
apps: FirebaseApp[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a library's name and version for platform logging purposes.
|
||||||
|
* @param library Name of 1p or 3p library (e.g. firestore, angularfire)
|
||||||
|
* @param version Current version of that library.
|
||||||
|
*/
|
||||||
|
registerVersion(library: string, version: string, variant?: string): void;
|
||||||
|
|
||||||
|
// Sets log level for all Firebase components.
|
||||||
|
setLogLevel(logLevel: LogLevelString): void;
|
||||||
|
|
||||||
|
// Sets log handler for all Firebase components.
|
||||||
|
onLog(logCallback: LogCallback, options?: LogOptions): void;
|
||||||
|
|
||||||
|
// The current SDK version.
|
||||||
|
SDK_VERSION: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface VersionService {
|
||||||
|
library: string;
|
||||||
|
version: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module '@firebase/component' {
|
||||||
|
interface NameServiceMapping {
|
||||||
|
'app-version': VersionService;
|
||||||
|
'platform-identifier': VersionService;
|
||||||
|
}
|
||||||
|
}
|
||||||
29
node_modules/@firebase/app-types/package.json
generated
vendored
Normal file
29
node_modules/@firebase/app-types/package.json
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"name": "@firebase/app-types",
|
||||||
|
"version": "0.9.3",
|
||||||
|
"description": "@firebase/app Types",
|
||||||
|
"author": "Firebase <firebase-support@google.com> (https://firebase.google.com/)",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"scripts": {
|
||||||
|
"test": "tsc",
|
||||||
|
"test:ci": "node ../../scripts/run_tests_in_ci.js"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"index.d.ts",
|
||||||
|
"private.d.ts"
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"directory": "packages/app-types",
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/firebase/firebase-js-sdk.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/firebase/firebase-js-sdk/issues"
|
||||||
|
},
|
||||||
|
"dependency": {
|
||||||
|
"@firebase/logger": "0.2.6"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"typescript": "5.5.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
165
node_modules/@firebase/app-types/private.d.ts
generated
vendored
Normal file
165
node_modules/@firebase/app-types/private.d.ts
generated
vendored
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* THIS FILE IS FOR INTERNAL USAGE ONLY, IF YOU ARE NOT DEVELOPING THE FIREBASE
|
||||||
|
* SDKs, PLEASE DO NOT REFERENCE THIS FILE AS IT MAY CHANGE WITHOUT WARNING
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { FirebaseApp, FirebaseNamespace } from '@firebase/app-types';
|
||||||
|
import { Observer, Subscribe } from '@firebase/util';
|
||||||
|
import { FirebaseError, ErrorFactory } from '@firebase/util';
|
||||||
|
import { Component, ComponentContainer, Name } from '@firebase/component';
|
||||||
|
|
||||||
|
export interface FirebaseServiceInternals {
|
||||||
|
/**
|
||||||
|
* Delete the service and free it's resources - called from
|
||||||
|
* app.delete().
|
||||||
|
*/
|
||||||
|
delete(): Promise<void>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Services are exposed through instances - each of which is associated with a
|
||||||
|
// FirebaseApp.
|
||||||
|
export interface FirebaseService {
|
||||||
|
app: FirebaseApp;
|
||||||
|
INTERNAL?: FirebaseServiceInternals;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type AppHook = (event: string, app: FirebaseApp) => void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Firebase Services create instances given a Firebase App instance and can
|
||||||
|
* optionally add properties and methods to each FirebaseApp via the extendApp()
|
||||||
|
* function.
|
||||||
|
*/
|
||||||
|
export interface FirebaseServiceFactory {
|
||||||
|
(
|
||||||
|
app: FirebaseApp,
|
||||||
|
extendApp?: (props: { [prop: string]: any }) => void,
|
||||||
|
instanceString?: string
|
||||||
|
): FirebaseService;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PlatformLoggerService {
|
||||||
|
getPlatformInfoString(): string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All ServiceNamespaces extend from FirebaseServiceNamespace
|
||||||
|
*/
|
||||||
|
export interface FirebaseServiceNamespace<T extends FirebaseService> {
|
||||||
|
(app?: FirebaseApp): T;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FirebaseAuthTokenData {
|
||||||
|
accessToken: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FirebaseAppInternals {
|
||||||
|
getToken(refreshToken?: boolean): Promise<FirebaseAuthTokenData | null>;
|
||||||
|
getUid(): string | null;
|
||||||
|
addAuthTokenListener(fn: (token: string | null) => void): void;
|
||||||
|
removeAuthTokenListener(fn: (token: string | null) => void): void;
|
||||||
|
analytics: {
|
||||||
|
logEvent: (
|
||||||
|
eventName: string,
|
||||||
|
eventParams: { [key: string]: any },
|
||||||
|
options?: { global: boolean }
|
||||||
|
) => void;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface _FirebaseApp extends FirebaseApp {
|
||||||
|
container: ComponentContainer;
|
||||||
|
_addComponent<T extends Name>(component: Component<T>): void;
|
||||||
|
_addOrOverwriteComponent<T extends Name>(component: Component<T>): void;
|
||||||
|
_removeServiceInstance(name: string, instanceIdentifier?: string): void;
|
||||||
|
}
|
||||||
|
export interface _FirebaseNamespace extends FirebaseNamespace {
|
||||||
|
INTERNAL: {
|
||||||
|
/**
|
||||||
|
* Internal API to register a Firebase Service into the firebase namespace.
|
||||||
|
*
|
||||||
|
* Each service will create a child namespace (firebase.<name>) which acts as
|
||||||
|
* both a namespace for service specific properties, and also as a service
|
||||||
|
* accessor function (firebase.<name>() or firebase.<name>(app)).
|
||||||
|
*
|
||||||
|
* @param name The Firebase Service being registered.
|
||||||
|
* @param createService Factory function to create a service instance.
|
||||||
|
* @param serviceProperties Properties to copy to the service's namespace.
|
||||||
|
* @param appHook All appHooks called before initializeApp returns to caller.
|
||||||
|
* @param allowMultipleInstances Whether the registered service supports
|
||||||
|
* multiple instances per app. If not specified, the default is false.
|
||||||
|
*/
|
||||||
|
registerComponent<T extends Name>(
|
||||||
|
component: Component<T>
|
||||||
|
): FirebaseServiceNamespace<FirebaseService> | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just used for testing to start from a fresh namespace.
|
||||||
|
*/
|
||||||
|
createFirebaseNamespace(): FirebaseNamespace;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal API to install properties on the top-level firebase namespace.
|
||||||
|
* @prop props The top level properties of this object are copied to the
|
||||||
|
* namespace.
|
||||||
|
*/
|
||||||
|
extendNamespace(props: { [prop: string]: any }): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a Subscribe function. A proxy Observer is created so that
|
||||||
|
* events can be sent to single Observer to be fanned out automatically.
|
||||||
|
*/
|
||||||
|
createSubscribe<T>(
|
||||||
|
executor: (observer: Observer<T>) => void,
|
||||||
|
onNoObservers?: (observer: Observer<T>) => void
|
||||||
|
): Subscribe<T>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility exposed for internal testing.
|
||||||
|
*/
|
||||||
|
deepExtend(target: any, source: any): any;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal API to remove an app from the list of registered apps.
|
||||||
|
*/
|
||||||
|
removeApp(name: string): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* registered components.
|
||||||
|
*/
|
||||||
|
components: Map<string, Component>;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert service name to factory name to use.
|
||||||
|
*/
|
||||||
|
useAsService(app: FirebaseApp, serviceName: string): string | null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use to construct all thrown FirebaseError's.
|
||||||
|
*/
|
||||||
|
ErrorFactory: typeof ErrorFactory;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module '@firebase/component' {
|
||||||
|
interface NameServiceMapping {
|
||||||
|
'platform-logger': PlatformLoggerService;
|
||||||
|
}
|
||||||
|
}
|
||||||
3
node_modules/@firebase/auth-interop-types/README.md
generated
vendored
Normal file
3
node_modules/@firebase/auth-interop-types/README.md
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# @firebase/auth-interop-types
|
||||||
|
|
||||||
|
**This package is not intended for direct usage, and should only be used via the officially supported [firebase](https://www.npmjs.com/package/firebase) package.**
|
||||||
35
node_modules/@firebase/auth-interop-types/index.d.ts
generated
vendored
Normal file
35
node_modules/@firebase/auth-interop-types/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export interface FirebaseAuthTokenData {
|
||||||
|
accessToken: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FirebaseAuthInternal {
|
||||||
|
getToken(refreshToken?: boolean): Promise<FirebaseAuthTokenData | null>;
|
||||||
|
getUid(): string | null;
|
||||||
|
addAuthTokenListener(fn: (token: string | null) => void): void;
|
||||||
|
removeAuthTokenListener(fn: (token: string | null) => void): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type FirebaseAuthInternalName = 'auth-internal';
|
||||||
|
|
||||||
|
declare module '@firebase/component' {
|
||||||
|
interface NameServiceMapping {
|
||||||
|
'auth-internal': FirebaseAuthInternal;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
node_modules/@firebase/auth-interop-types/package.json
generated
vendored
Normal file
25
node_modules/@firebase/auth-interop-types/package.json
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "@firebase/auth-interop-types",
|
||||||
|
"version": "0.2.4",
|
||||||
|
"description": "@firebase/auth interop Types",
|
||||||
|
"author": "Firebase <firebase-support@google.com> (https://firebase.google.com/)",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"scripts": {
|
||||||
|
"test": "tsc",
|
||||||
|
"test:ci": "node ../../scripts/run_tests_in_ci.js"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"index.d.ts"
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"directory": "packages/auth-types",
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/firebase/firebase-js-sdk.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/firebase/firebase-js-sdk/issues"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"typescript": "5.5.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
12
node_modules/@firebase/component/README.md
generated
vendored
Normal file
12
node_modules/@firebase/component/README.md
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# @firebase/component
|
||||||
|
|
||||||
|
_NOTE: This is specifically tailored for Firebase JS SDK usage, if you are not a
|
||||||
|
member of the Firebase team, please avoid using this package_
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
**ES Modules**
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { Component } from '@firebase/component';
|
||||||
|
```
|
||||||
20
node_modules/@firebase/component/dist/esm/index.d.ts
generated
vendored
Normal file
20
node_modules/@firebase/component/dist/esm/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export { Component } from './src/component';
|
||||||
|
export { ComponentContainer } from './src/component_container';
|
||||||
|
export { Provider } from './src/provider';
|
||||||
|
export { ComponentType, InstanceFactory, InstantiationMode, NameServiceMapping, Name, InstanceFactoryOptions } from './src/types';
|
||||||
409
node_modules/@firebase/component/dist/esm/index.esm2017.js
generated
vendored
Normal file
409
node_modules/@firebase/component/dist/esm/index.esm2017.js
generated
vendored
Normal file
@@ -0,0 +1,409 @@
|
|||||||
|
import { Deferred } from '@firebase/util';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component for service name T, e.g. `auth`, `auth-internal`
|
||||||
|
*/
|
||||||
|
class Component {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name The public service name, e.g. app, auth, firestore, database
|
||||||
|
* @param instanceFactory Service factory responsible for creating the public interface
|
||||||
|
* @param type whether the service provided by the component is public or private
|
||||||
|
*/
|
||||||
|
constructor(name, instanceFactory, type) {
|
||||||
|
this.name = name;
|
||||||
|
this.instanceFactory = instanceFactory;
|
||||||
|
this.type = type;
|
||||||
|
this.multipleInstances = false;
|
||||||
|
/**
|
||||||
|
* Properties to be added to the service namespace
|
||||||
|
*/
|
||||||
|
this.serviceProps = {};
|
||||||
|
this.instantiationMode = "LAZY" /* InstantiationMode.LAZY */;
|
||||||
|
this.onInstanceCreated = null;
|
||||||
|
}
|
||||||
|
setInstantiationMode(mode) {
|
||||||
|
this.instantiationMode = mode;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
setMultipleInstances(multipleInstances) {
|
||||||
|
this.multipleInstances = multipleInstances;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
setServiceProps(props) {
|
||||||
|
this.serviceProps = props;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
setInstanceCreatedCallback(callback) {
|
||||||
|
this.onInstanceCreated = callback;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
const DEFAULT_ENTRY_NAME = '[DEFAULT]';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Provider for instance for service name T, e.g. 'auth', 'auth-internal'
|
||||||
|
* NameServiceMapping[T] is an alias for the type of the instance
|
||||||
|
*/
|
||||||
|
class Provider {
|
||||||
|
constructor(name, container) {
|
||||||
|
this.name = name;
|
||||||
|
this.container = container;
|
||||||
|
this.component = null;
|
||||||
|
this.instances = new Map();
|
||||||
|
this.instancesDeferred = new Map();
|
||||||
|
this.instancesOptions = new Map();
|
||||||
|
this.onInitCallbacks = new Map();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param identifier A provider can provide multiple instances of a service
|
||||||
|
* if this.component.multipleInstances is true.
|
||||||
|
*/
|
||||||
|
get(identifier) {
|
||||||
|
// if multipleInstances is not supported, use the default name
|
||||||
|
const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);
|
||||||
|
if (!this.instancesDeferred.has(normalizedIdentifier)) {
|
||||||
|
const deferred = new Deferred();
|
||||||
|
this.instancesDeferred.set(normalizedIdentifier, deferred);
|
||||||
|
if (this.isInitialized(normalizedIdentifier) ||
|
||||||
|
this.shouldAutoInitialize()) {
|
||||||
|
// initialize the service if it can be auto-initialized
|
||||||
|
try {
|
||||||
|
const instance = this.getOrInitializeService({
|
||||||
|
instanceIdentifier: normalizedIdentifier
|
||||||
|
});
|
||||||
|
if (instance) {
|
||||||
|
deferred.resolve(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
// when the instance factory throws an exception during get(), it should not cause
|
||||||
|
// a fatal error. We just return the unresolved promise in this case.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.instancesDeferred.get(normalizedIdentifier).promise;
|
||||||
|
}
|
||||||
|
getImmediate(options) {
|
||||||
|
var _a;
|
||||||
|
// if multipleInstances is not supported, use the default name
|
||||||
|
const normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier);
|
||||||
|
const optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false;
|
||||||
|
if (this.isInitialized(normalizedIdentifier) ||
|
||||||
|
this.shouldAutoInitialize()) {
|
||||||
|
try {
|
||||||
|
return this.getOrInitializeService({
|
||||||
|
instanceIdentifier: normalizedIdentifier
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
if (optional) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// In case a component is not initialized and should/cannot be auto-initialized at the moment, return null if the optional flag is set, or throw
|
||||||
|
if (optional) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw Error(`Service ${this.name} is not available`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getComponent() {
|
||||||
|
return this.component;
|
||||||
|
}
|
||||||
|
setComponent(component) {
|
||||||
|
if (component.name !== this.name) {
|
||||||
|
throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`);
|
||||||
|
}
|
||||||
|
if (this.component) {
|
||||||
|
throw Error(`Component for ${this.name} has already been provided`);
|
||||||
|
}
|
||||||
|
this.component = component;
|
||||||
|
// return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)
|
||||||
|
if (!this.shouldAutoInitialize()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// if the service is eager, initialize the default instance
|
||||||
|
if (isComponentEager(component)) {
|
||||||
|
try {
|
||||||
|
this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
// when the instance factory for an eager Component throws an exception during the eager
|
||||||
|
// initialization, it should not cause a fatal error.
|
||||||
|
// TODO: Investigate if we need to make it configurable, because some component may want to cause
|
||||||
|
// a fatal error in this case?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Create service instances for the pending promises and resolve them
|
||||||
|
// NOTE: if this.multipleInstances is false, only the default instance will be created
|
||||||
|
// and all promises with resolve with it regardless of the identifier.
|
||||||
|
for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {
|
||||||
|
const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);
|
||||||
|
try {
|
||||||
|
// `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.
|
||||||
|
const instance = this.getOrInitializeService({
|
||||||
|
instanceIdentifier: normalizedIdentifier
|
||||||
|
});
|
||||||
|
instanceDeferred.resolve(instance);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
// when the instance factory throws an exception, it should not cause
|
||||||
|
// a fatal error. We just leave the promise unresolved.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clearInstance(identifier = DEFAULT_ENTRY_NAME) {
|
||||||
|
this.instancesDeferred.delete(identifier);
|
||||||
|
this.instancesOptions.delete(identifier);
|
||||||
|
this.instances.delete(identifier);
|
||||||
|
}
|
||||||
|
// app.delete() will call this method on every provider to delete the services
|
||||||
|
// TODO: should we mark the provider as deleted?
|
||||||
|
async delete() {
|
||||||
|
const services = Array.from(this.instances.values());
|
||||||
|
await Promise.all([
|
||||||
|
...services
|
||||||
|
.filter(service => 'INTERNAL' in service) // legacy services
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
.map(service => service.INTERNAL.delete()),
|
||||||
|
...services
|
||||||
|
.filter(service => '_delete' in service) // modularized services
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
.map(service => service._delete())
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
isComponentSet() {
|
||||||
|
return this.component != null;
|
||||||
|
}
|
||||||
|
isInitialized(identifier = DEFAULT_ENTRY_NAME) {
|
||||||
|
return this.instances.has(identifier);
|
||||||
|
}
|
||||||
|
getOptions(identifier = DEFAULT_ENTRY_NAME) {
|
||||||
|
return this.instancesOptions.get(identifier) || {};
|
||||||
|
}
|
||||||
|
initialize(opts = {}) {
|
||||||
|
const { options = {} } = opts;
|
||||||
|
const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);
|
||||||
|
if (this.isInitialized(normalizedIdentifier)) {
|
||||||
|
throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`);
|
||||||
|
}
|
||||||
|
if (!this.isComponentSet()) {
|
||||||
|
throw Error(`Component ${this.name} has not been registered yet`);
|
||||||
|
}
|
||||||
|
const instance = this.getOrInitializeService({
|
||||||
|
instanceIdentifier: normalizedIdentifier,
|
||||||
|
options
|
||||||
|
});
|
||||||
|
// resolve any pending promise waiting for the service instance
|
||||||
|
for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {
|
||||||
|
const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);
|
||||||
|
if (normalizedIdentifier === normalizedDeferredIdentifier) {
|
||||||
|
instanceDeferred.resolve(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().
|
||||||
|
* The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.
|
||||||
|
*
|
||||||
|
* @param identifier An optional instance identifier
|
||||||
|
* @returns a function to unregister the callback
|
||||||
|
*/
|
||||||
|
onInit(callback, identifier) {
|
||||||
|
var _a;
|
||||||
|
const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);
|
||||||
|
const existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set();
|
||||||
|
existingCallbacks.add(callback);
|
||||||
|
this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);
|
||||||
|
const existingInstance = this.instances.get(normalizedIdentifier);
|
||||||
|
if (existingInstance) {
|
||||||
|
callback(existingInstance, normalizedIdentifier);
|
||||||
|
}
|
||||||
|
return () => {
|
||||||
|
existingCallbacks.delete(callback);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Invoke onInit callbacks synchronously
|
||||||
|
* @param instance the service instance`
|
||||||
|
*/
|
||||||
|
invokeOnInitCallbacks(instance, identifier) {
|
||||||
|
const callbacks = this.onInitCallbacks.get(identifier);
|
||||||
|
if (!callbacks) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (const callback of callbacks) {
|
||||||
|
try {
|
||||||
|
callback(instance, identifier);
|
||||||
|
}
|
||||||
|
catch (_a) {
|
||||||
|
// ignore errors in the onInit callback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getOrInitializeService({ instanceIdentifier, options = {} }) {
|
||||||
|
let instance = this.instances.get(instanceIdentifier);
|
||||||
|
if (!instance && this.component) {
|
||||||
|
instance = this.component.instanceFactory(this.container, {
|
||||||
|
instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),
|
||||||
|
options
|
||||||
|
});
|
||||||
|
this.instances.set(instanceIdentifier, instance);
|
||||||
|
this.instancesOptions.set(instanceIdentifier, options);
|
||||||
|
/**
|
||||||
|
* Invoke onInit listeners.
|
||||||
|
* Note this.component.onInstanceCreated is different, which is used by the component creator,
|
||||||
|
* while onInit listeners are registered by consumers of the provider.
|
||||||
|
*/
|
||||||
|
this.invokeOnInitCallbacks(instance, instanceIdentifier);
|
||||||
|
/**
|
||||||
|
* Order is important
|
||||||
|
* onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which
|
||||||
|
* makes `isInitialized()` return true.
|
||||||
|
*/
|
||||||
|
if (this.component.onInstanceCreated) {
|
||||||
|
try {
|
||||||
|
this.component.onInstanceCreated(this.container, instanceIdentifier, instance);
|
||||||
|
}
|
||||||
|
catch (_a) {
|
||||||
|
// ignore errors in the onInstanceCreatedCallback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return instance || null;
|
||||||
|
}
|
||||||
|
normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) {
|
||||||
|
if (this.component) {
|
||||||
|
return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return identifier; // assume multiple instances are supported before the component is provided.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
shouldAutoInitialize() {
|
||||||
|
return (!!this.component &&
|
||||||
|
this.component.instantiationMode !== "EXPLICIT" /* InstantiationMode.EXPLICIT */);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// undefined should be passed to the service factory for the default instance
|
||||||
|
function normalizeIdentifierForFactory(identifier) {
|
||||||
|
return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;
|
||||||
|
}
|
||||||
|
function isComponentEager(component) {
|
||||||
|
return component.instantiationMode === "EAGER" /* InstantiationMode.EAGER */;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`
|
||||||
|
*/
|
||||||
|
class ComponentContainer {
|
||||||
|
constructor(name) {
|
||||||
|
this.name = name;
|
||||||
|
this.providers = new Map();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param component Component being added
|
||||||
|
* @param overwrite When a component with the same name has already been registered,
|
||||||
|
* if overwrite is true: overwrite the existing component with the new component and create a new
|
||||||
|
* provider with the new component. It can be useful in tests where you want to use different mocks
|
||||||
|
* for different tests.
|
||||||
|
* if overwrite is false: throw an exception
|
||||||
|
*/
|
||||||
|
addComponent(component) {
|
||||||
|
const provider = this.getProvider(component.name);
|
||||||
|
if (provider.isComponentSet()) {
|
||||||
|
throw new Error(`Component ${component.name} has already been registered with ${this.name}`);
|
||||||
|
}
|
||||||
|
provider.setComponent(component);
|
||||||
|
}
|
||||||
|
addOrOverwriteComponent(component) {
|
||||||
|
const provider = this.getProvider(component.name);
|
||||||
|
if (provider.isComponentSet()) {
|
||||||
|
// delete the existing provider from the container, so we can register the new component
|
||||||
|
this.providers.delete(component.name);
|
||||||
|
}
|
||||||
|
this.addComponent(component);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* getProvider provides a type safe interface where it can only be called with a field name
|
||||||
|
* present in NameServiceMapping interface.
|
||||||
|
*
|
||||||
|
* Firebase SDKs providing services should extend NameServiceMapping interface to register
|
||||||
|
* themselves.
|
||||||
|
*/
|
||||||
|
getProvider(name) {
|
||||||
|
if (this.providers.has(name)) {
|
||||||
|
return this.providers.get(name);
|
||||||
|
}
|
||||||
|
// create a Provider for a service that hasn't registered with Firebase
|
||||||
|
const provider = new Provider(name, this);
|
||||||
|
this.providers.set(name, provider);
|
||||||
|
return provider;
|
||||||
|
}
|
||||||
|
getProviders() {
|
||||||
|
return Array.from(this.providers.values());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { Component, ComponentContainer, Provider };
|
||||||
|
//# sourceMappingURL=index.esm2017.js.map
|
||||||
1
node_modules/@firebase/component/dist/esm/index.esm2017.js.map
generated
vendored
Normal file
1
node_modules/@firebase/component/dist/esm/index.esm2017.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
node_modules/@firebase/component/dist/esm/package.json
generated
vendored
Normal file
1
node_modules/@firebase/component/dist/esm/package.json
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"type":"module"}
|
||||||
43
node_modules/@firebase/component/dist/esm/src/component.d.ts
generated
vendored
Normal file
43
node_modules/@firebase/component/dist/esm/src/component.d.ts
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { InstantiationMode, InstanceFactory, ComponentType, Dictionary, Name, onInstanceCreatedCallback } from './types';
|
||||||
|
/**
|
||||||
|
* Component for service name T, e.g. `auth`, `auth-internal`
|
||||||
|
*/
|
||||||
|
export declare class Component<T extends Name = Name> {
|
||||||
|
readonly name: T;
|
||||||
|
readonly instanceFactory: InstanceFactory<T>;
|
||||||
|
readonly type: ComponentType;
|
||||||
|
multipleInstances: boolean;
|
||||||
|
/**
|
||||||
|
* Properties to be added to the service namespace
|
||||||
|
*/
|
||||||
|
serviceProps: Dictionary;
|
||||||
|
instantiationMode: InstantiationMode;
|
||||||
|
onInstanceCreated: onInstanceCreatedCallback<T> | null;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name The public service name, e.g. app, auth, firestore, database
|
||||||
|
* @param instanceFactory Service factory responsible for creating the public interface
|
||||||
|
* @param type whether the service provided by the component is public or private
|
||||||
|
*/
|
||||||
|
constructor(name: T, instanceFactory: InstanceFactory<T>, type: ComponentType);
|
||||||
|
setInstantiationMode(mode: InstantiationMode): this;
|
||||||
|
setMultipleInstances(multipleInstances: boolean): this;
|
||||||
|
setServiceProps(props: Dictionary): this;
|
||||||
|
setInstanceCreatedCallback(callback: onInstanceCreatedCallback<T>): this;
|
||||||
|
}
|
||||||
47
node_modules/@firebase/component/dist/esm/src/component_container.d.ts
generated
vendored
Normal file
47
node_modules/@firebase/component/dist/esm/src/component_container.d.ts
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { Provider } from './provider';
|
||||||
|
import { Component } from './component';
|
||||||
|
import { Name } from './types';
|
||||||
|
/**
|
||||||
|
* ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`
|
||||||
|
*/
|
||||||
|
export declare class ComponentContainer {
|
||||||
|
private readonly name;
|
||||||
|
private readonly providers;
|
||||||
|
constructor(name: string);
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param component Component being added
|
||||||
|
* @param overwrite When a component with the same name has already been registered,
|
||||||
|
* if overwrite is true: overwrite the existing component with the new component and create a new
|
||||||
|
* provider with the new component. It can be useful in tests where you want to use different mocks
|
||||||
|
* for different tests.
|
||||||
|
* if overwrite is false: throw an exception
|
||||||
|
*/
|
||||||
|
addComponent<T extends Name>(component: Component<T>): void;
|
||||||
|
addOrOverwriteComponent<T extends Name>(component: Component<T>): void;
|
||||||
|
/**
|
||||||
|
* getProvider provides a type safe interface where it can only be called with a field name
|
||||||
|
* present in NameServiceMapping interface.
|
||||||
|
*
|
||||||
|
* Firebase SDKs providing services should extend NameServiceMapping interface to register
|
||||||
|
* themselves.
|
||||||
|
*/
|
||||||
|
getProvider<T extends Name>(name: T): Provider<T>;
|
||||||
|
getProviders(): Array<Provider<Name>>;
|
||||||
|
}
|
||||||
17
node_modules/@firebase/component/dist/esm/src/constants.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/component/dist/esm/src/constants.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export declare const DEFAULT_ENTRY_NAME = "[DEFAULT]";
|
||||||
79
node_modules/@firebase/component/dist/esm/src/provider.d.ts
generated
vendored
Normal file
79
node_modules/@firebase/component/dist/esm/src/provider.d.ts
generated
vendored
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { ComponentContainer } from './component_container';
|
||||||
|
import { InitializeOptions, Name, NameServiceMapping, OnInitCallBack } from './types';
|
||||||
|
import { Component } from './component';
|
||||||
|
/**
|
||||||
|
* Provider for instance for service name T, e.g. 'auth', 'auth-internal'
|
||||||
|
* NameServiceMapping[T] is an alias for the type of the instance
|
||||||
|
*/
|
||||||
|
export declare class Provider<T extends Name> {
|
||||||
|
private readonly name;
|
||||||
|
private readonly container;
|
||||||
|
private component;
|
||||||
|
private readonly instances;
|
||||||
|
private readonly instancesDeferred;
|
||||||
|
private readonly instancesOptions;
|
||||||
|
private onInitCallbacks;
|
||||||
|
constructor(name: T, container: ComponentContainer);
|
||||||
|
/**
|
||||||
|
* @param identifier A provider can provide multiple instances of a service
|
||||||
|
* if this.component.multipleInstances is true.
|
||||||
|
*/
|
||||||
|
get(identifier?: string): Promise<NameServiceMapping[T]>;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param options.identifier A provider can provide multiple instances of a service
|
||||||
|
* if this.component.multipleInstances is true.
|
||||||
|
* @param options.optional If optional is false or not provided, the method throws an error when
|
||||||
|
* the service is not immediately available.
|
||||||
|
* If optional is true, the method returns null if the service is not immediately available.
|
||||||
|
*/
|
||||||
|
getImmediate(options: {
|
||||||
|
identifier?: string;
|
||||||
|
optional: true;
|
||||||
|
}): NameServiceMapping[T] | null;
|
||||||
|
getImmediate(options?: {
|
||||||
|
identifier?: string;
|
||||||
|
optional?: false;
|
||||||
|
}): NameServiceMapping[T];
|
||||||
|
getComponent(): Component<T> | null;
|
||||||
|
setComponent(component: Component<T>): void;
|
||||||
|
clearInstance(identifier?: string): void;
|
||||||
|
delete(): Promise<void>;
|
||||||
|
isComponentSet(): boolean;
|
||||||
|
isInitialized(identifier?: string): boolean;
|
||||||
|
getOptions(identifier?: string): Record<string, unknown>;
|
||||||
|
initialize(opts?: InitializeOptions): NameServiceMapping[T];
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().
|
||||||
|
* The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.
|
||||||
|
*
|
||||||
|
* @param identifier An optional instance identifier
|
||||||
|
* @returns a function to unregister the callback
|
||||||
|
*/
|
||||||
|
onInit(callback: OnInitCallBack<T>, identifier?: string): () => void;
|
||||||
|
/**
|
||||||
|
* Invoke onInit callbacks synchronously
|
||||||
|
* @param instance the service instance`
|
||||||
|
*/
|
||||||
|
private invokeOnInitCallbacks;
|
||||||
|
private getOrInitializeService;
|
||||||
|
private normalizeInstanceIdentifier;
|
||||||
|
private shouldAutoInitialize;
|
||||||
|
}
|
||||||
62
node_modules/@firebase/component/dist/esm/src/types.d.ts
generated
vendored
Normal file
62
node_modules/@firebase/component/dist/esm/src/types.d.ts
generated
vendored
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { ComponentContainer } from './component_container';
|
||||||
|
export declare const enum InstantiationMode {
|
||||||
|
LAZY = "LAZY",// Currently most components are LAZY in JS SDK
|
||||||
|
EAGER = "EAGER",// EAGER components are initialized immediately upon registration
|
||||||
|
EXPLICIT = "EXPLICIT"
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* PUBLIC: A public component provides a set of public APIs to customers. A service namespace will be patched
|
||||||
|
* onto `firebase` namespace. Assume the component name is `test`, customers will be able
|
||||||
|
* to get the service by calling `firebase.test()` or `app.test()` where `app` is a `FirebaseApp` instance.
|
||||||
|
*
|
||||||
|
* PRIVATE: A private component provides a set of private APIs that are used internally by other
|
||||||
|
* Firebase SDKs. No service namespace is created in `firebase` namespace and customers have no way to get them.
|
||||||
|
*/
|
||||||
|
export declare const enum ComponentType {
|
||||||
|
PUBLIC = "PUBLIC",
|
||||||
|
PRIVATE = "PRIVATE",
|
||||||
|
VERSION = "VERSION"
|
||||||
|
}
|
||||||
|
export interface InstanceFactoryOptions {
|
||||||
|
instanceIdentifier?: string;
|
||||||
|
options?: {};
|
||||||
|
}
|
||||||
|
export type InitializeOptions = InstanceFactoryOptions;
|
||||||
|
/**
|
||||||
|
* Factory to create an instance of type T, given a ComponentContainer.
|
||||||
|
* ComponentContainer is the IOC container that provides {@link Provider}
|
||||||
|
* for dependencies.
|
||||||
|
*
|
||||||
|
* NOTE: The container only provides {@link Provider} rather than the actual instances of dependencies.
|
||||||
|
* It is useful for lazily loaded dependencies and optional dependencies.
|
||||||
|
*/
|
||||||
|
export type InstanceFactory<T extends Name> = (container: ComponentContainer, options: InstanceFactoryOptions) => NameServiceMapping[T];
|
||||||
|
export type onInstanceCreatedCallback<T extends Name> = (container: ComponentContainer, instanceIdentifier: string, instance: NameServiceMapping[T]) => void;
|
||||||
|
export interface Dictionary {
|
||||||
|
[key: string]: unknown;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This interface will be extended by Firebase SDKs to provide service name and service type mapping.
|
||||||
|
* It is used as a generic constraint to ensure type safety.
|
||||||
|
*/
|
||||||
|
export interface NameServiceMapping {
|
||||||
|
}
|
||||||
|
export type Name = keyof NameServiceMapping;
|
||||||
|
export type Service = NameServiceMapping[Name];
|
||||||
|
export type OnInitCallBack<T extends Name> = (instance: NameServiceMapping[T], identifier: string) => void;
|
||||||
17
node_modules/@firebase/component/dist/esm/test/setup.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/component/dist/esm/test/setup.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export {};
|
||||||
5
node_modules/@firebase/component/dist/esm/test/util.d.ts
generated
vendored
Normal file
5
node_modules/@firebase/component/dist/esm/test/util.d.ts
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import { FirebaseApp } from '@firebase/app-types';
|
||||||
|
import { InstanceFactory, InstantiationMode, Name } from '../src/types';
|
||||||
|
import { Component } from '../src/component';
|
||||||
|
export declare function getFakeApp(appName?: string): FirebaseApp;
|
||||||
|
export declare function getFakeComponent<T extends Name>(name: T, factory: InstanceFactory<T>, multipleInstance?: boolean, instantiationMode?: InstantiationMode): Component<T>;
|
||||||
415
node_modules/@firebase/component/dist/index.cjs.js
generated
vendored
Normal file
415
node_modules/@firebase/component/dist/index.cjs.js
generated
vendored
Normal file
@@ -0,0 +1,415 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
|
||||||
|
var util = require('@firebase/util');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component for service name T, e.g. `auth`, `auth-internal`
|
||||||
|
*/
|
||||||
|
class Component {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name The public service name, e.g. app, auth, firestore, database
|
||||||
|
* @param instanceFactory Service factory responsible for creating the public interface
|
||||||
|
* @param type whether the service provided by the component is public or private
|
||||||
|
*/
|
||||||
|
constructor(name, instanceFactory, type) {
|
||||||
|
this.name = name;
|
||||||
|
this.instanceFactory = instanceFactory;
|
||||||
|
this.type = type;
|
||||||
|
this.multipleInstances = false;
|
||||||
|
/**
|
||||||
|
* Properties to be added to the service namespace
|
||||||
|
*/
|
||||||
|
this.serviceProps = {};
|
||||||
|
this.instantiationMode = "LAZY" /* InstantiationMode.LAZY */;
|
||||||
|
this.onInstanceCreated = null;
|
||||||
|
}
|
||||||
|
setInstantiationMode(mode) {
|
||||||
|
this.instantiationMode = mode;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
setMultipleInstances(multipleInstances) {
|
||||||
|
this.multipleInstances = multipleInstances;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
setServiceProps(props) {
|
||||||
|
this.serviceProps = props;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
setInstanceCreatedCallback(callback) {
|
||||||
|
this.onInstanceCreated = callback;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
const DEFAULT_ENTRY_NAME = '[DEFAULT]';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Provider for instance for service name T, e.g. 'auth', 'auth-internal'
|
||||||
|
* NameServiceMapping[T] is an alias for the type of the instance
|
||||||
|
*/
|
||||||
|
class Provider {
|
||||||
|
constructor(name, container) {
|
||||||
|
this.name = name;
|
||||||
|
this.container = container;
|
||||||
|
this.component = null;
|
||||||
|
this.instances = new Map();
|
||||||
|
this.instancesDeferred = new Map();
|
||||||
|
this.instancesOptions = new Map();
|
||||||
|
this.onInitCallbacks = new Map();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param identifier A provider can provide multiple instances of a service
|
||||||
|
* if this.component.multipleInstances is true.
|
||||||
|
*/
|
||||||
|
get(identifier) {
|
||||||
|
// if multipleInstances is not supported, use the default name
|
||||||
|
const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);
|
||||||
|
if (!this.instancesDeferred.has(normalizedIdentifier)) {
|
||||||
|
const deferred = new util.Deferred();
|
||||||
|
this.instancesDeferred.set(normalizedIdentifier, deferred);
|
||||||
|
if (this.isInitialized(normalizedIdentifier) ||
|
||||||
|
this.shouldAutoInitialize()) {
|
||||||
|
// initialize the service if it can be auto-initialized
|
||||||
|
try {
|
||||||
|
const instance = this.getOrInitializeService({
|
||||||
|
instanceIdentifier: normalizedIdentifier
|
||||||
|
});
|
||||||
|
if (instance) {
|
||||||
|
deferred.resolve(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
// when the instance factory throws an exception during get(), it should not cause
|
||||||
|
// a fatal error. We just return the unresolved promise in this case.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.instancesDeferred.get(normalizedIdentifier).promise;
|
||||||
|
}
|
||||||
|
getImmediate(options) {
|
||||||
|
var _a;
|
||||||
|
// if multipleInstances is not supported, use the default name
|
||||||
|
const normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier);
|
||||||
|
const optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false;
|
||||||
|
if (this.isInitialized(normalizedIdentifier) ||
|
||||||
|
this.shouldAutoInitialize()) {
|
||||||
|
try {
|
||||||
|
return this.getOrInitializeService({
|
||||||
|
instanceIdentifier: normalizedIdentifier
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
if (optional) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// In case a component is not initialized and should/cannot be auto-initialized at the moment, return null if the optional flag is set, or throw
|
||||||
|
if (optional) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw Error(`Service ${this.name} is not available`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getComponent() {
|
||||||
|
return this.component;
|
||||||
|
}
|
||||||
|
setComponent(component) {
|
||||||
|
if (component.name !== this.name) {
|
||||||
|
throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`);
|
||||||
|
}
|
||||||
|
if (this.component) {
|
||||||
|
throw Error(`Component for ${this.name} has already been provided`);
|
||||||
|
}
|
||||||
|
this.component = component;
|
||||||
|
// return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)
|
||||||
|
if (!this.shouldAutoInitialize()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// if the service is eager, initialize the default instance
|
||||||
|
if (isComponentEager(component)) {
|
||||||
|
try {
|
||||||
|
this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
// when the instance factory for an eager Component throws an exception during the eager
|
||||||
|
// initialization, it should not cause a fatal error.
|
||||||
|
// TODO: Investigate if we need to make it configurable, because some component may want to cause
|
||||||
|
// a fatal error in this case?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Create service instances for the pending promises and resolve them
|
||||||
|
// NOTE: if this.multipleInstances is false, only the default instance will be created
|
||||||
|
// and all promises with resolve with it regardless of the identifier.
|
||||||
|
for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {
|
||||||
|
const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);
|
||||||
|
try {
|
||||||
|
// `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.
|
||||||
|
const instance = this.getOrInitializeService({
|
||||||
|
instanceIdentifier: normalizedIdentifier
|
||||||
|
});
|
||||||
|
instanceDeferred.resolve(instance);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
// when the instance factory throws an exception, it should not cause
|
||||||
|
// a fatal error. We just leave the promise unresolved.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clearInstance(identifier = DEFAULT_ENTRY_NAME) {
|
||||||
|
this.instancesDeferred.delete(identifier);
|
||||||
|
this.instancesOptions.delete(identifier);
|
||||||
|
this.instances.delete(identifier);
|
||||||
|
}
|
||||||
|
// app.delete() will call this method on every provider to delete the services
|
||||||
|
// TODO: should we mark the provider as deleted?
|
||||||
|
async delete() {
|
||||||
|
const services = Array.from(this.instances.values());
|
||||||
|
await Promise.all([
|
||||||
|
...services
|
||||||
|
.filter(service => 'INTERNAL' in service) // legacy services
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
.map(service => service.INTERNAL.delete()),
|
||||||
|
...services
|
||||||
|
.filter(service => '_delete' in service) // modularized services
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
.map(service => service._delete())
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
isComponentSet() {
|
||||||
|
return this.component != null;
|
||||||
|
}
|
||||||
|
isInitialized(identifier = DEFAULT_ENTRY_NAME) {
|
||||||
|
return this.instances.has(identifier);
|
||||||
|
}
|
||||||
|
getOptions(identifier = DEFAULT_ENTRY_NAME) {
|
||||||
|
return this.instancesOptions.get(identifier) || {};
|
||||||
|
}
|
||||||
|
initialize(opts = {}) {
|
||||||
|
const { options = {} } = opts;
|
||||||
|
const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);
|
||||||
|
if (this.isInitialized(normalizedIdentifier)) {
|
||||||
|
throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`);
|
||||||
|
}
|
||||||
|
if (!this.isComponentSet()) {
|
||||||
|
throw Error(`Component ${this.name} has not been registered yet`);
|
||||||
|
}
|
||||||
|
const instance = this.getOrInitializeService({
|
||||||
|
instanceIdentifier: normalizedIdentifier,
|
||||||
|
options
|
||||||
|
});
|
||||||
|
// resolve any pending promise waiting for the service instance
|
||||||
|
for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {
|
||||||
|
const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);
|
||||||
|
if (normalizedIdentifier === normalizedDeferredIdentifier) {
|
||||||
|
instanceDeferred.resolve(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().
|
||||||
|
* The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.
|
||||||
|
*
|
||||||
|
* @param identifier An optional instance identifier
|
||||||
|
* @returns a function to unregister the callback
|
||||||
|
*/
|
||||||
|
onInit(callback, identifier) {
|
||||||
|
var _a;
|
||||||
|
const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);
|
||||||
|
const existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set();
|
||||||
|
existingCallbacks.add(callback);
|
||||||
|
this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);
|
||||||
|
const existingInstance = this.instances.get(normalizedIdentifier);
|
||||||
|
if (existingInstance) {
|
||||||
|
callback(existingInstance, normalizedIdentifier);
|
||||||
|
}
|
||||||
|
return () => {
|
||||||
|
existingCallbacks.delete(callback);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Invoke onInit callbacks synchronously
|
||||||
|
* @param instance the service instance`
|
||||||
|
*/
|
||||||
|
invokeOnInitCallbacks(instance, identifier) {
|
||||||
|
const callbacks = this.onInitCallbacks.get(identifier);
|
||||||
|
if (!callbacks) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (const callback of callbacks) {
|
||||||
|
try {
|
||||||
|
callback(instance, identifier);
|
||||||
|
}
|
||||||
|
catch (_a) {
|
||||||
|
// ignore errors in the onInit callback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getOrInitializeService({ instanceIdentifier, options = {} }) {
|
||||||
|
let instance = this.instances.get(instanceIdentifier);
|
||||||
|
if (!instance && this.component) {
|
||||||
|
instance = this.component.instanceFactory(this.container, {
|
||||||
|
instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),
|
||||||
|
options
|
||||||
|
});
|
||||||
|
this.instances.set(instanceIdentifier, instance);
|
||||||
|
this.instancesOptions.set(instanceIdentifier, options);
|
||||||
|
/**
|
||||||
|
* Invoke onInit listeners.
|
||||||
|
* Note this.component.onInstanceCreated is different, which is used by the component creator,
|
||||||
|
* while onInit listeners are registered by consumers of the provider.
|
||||||
|
*/
|
||||||
|
this.invokeOnInitCallbacks(instance, instanceIdentifier);
|
||||||
|
/**
|
||||||
|
* Order is important
|
||||||
|
* onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which
|
||||||
|
* makes `isInitialized()` return true.
|
||||||
|
*/
|
||||||
|
if (this.component.onInstanceCreated) {
|
||||||
|
try {
|
||||||
|
this.component.onInstanceCreated(this.container, instanceIdentifier, instance);
|
||||||
|
}
|
||||||
|
catch (_a) {
|
||||||
|
// ignore errors in the onInstanceCreatedCallback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return instance || null;
|
||||||
|
}
|
||||||
|
normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) {
|
||||||
|
if (this.component) {
|
||||||
|
return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return identifier; // assume multiple instances are supported before the component is provided.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
shouldAutoInitialize() {
|
||||||
|
return (!!this.component &&
|
||||||
|
this.component.instantiationMode !== "EXPLICIT" /* InstantiationMode.EXPLICIT */);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// undefined should be passed to the service factory for the default instance
|
||||||
|
function normalizeIdentifierForFactory(identifier) {
|
||||||
|
return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;
|
||||||
|
}
|
||||||
|
function isComponentEager(component) {
|
||||||
|
return component.instantiationMode === "EAGER" /* InstantiationMode.EAGER */;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`
|
||||||
|
*/
|
||||||
|
class ComponentContainer {
|
||||||
|
constructor(name) {
|
||||||
|
this.name = name;
|
||||||
|
this.providers = new Map();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param component Component being added
|
||||||
|
* @param overwrite When a component with the same name has already been registered,
|
||||||
|
* if overwrite is true: overwrite the existing component with the new component and create a new
|
||||||
|
* provider with the new component. It can be useful in tests where you want to use different mocks
|
||||||
|
* for different tests.
|
||||||
|
* if overwrite is false: throw an exception
|
||||||
|
*/
|
||||||
|
addComponent(component) {
|
||||||
|
const provider = this.getProvider(component.name);
|
||||||
|
if (provider.isComponentSet()) {
|
||||||
|
throw new Error(`Component ${component.name} has already been registered with ${this.name}`);
|
||||||
|
}
|
||||||
|
provider.setComponent(component);
|
||||||
|
}
|
||||||
|
addOrOverwriteComponent(component) {
|
||||||
|
const provider = this.getProvider(component.name);
|
||||||
|
if (provider.isComponentSet()) {
|
||||||
|
// delete the existing provider from the container, so we can register the new component
|
||||||
|
this.providers.delete(component.name);
|
||||||
|
}
|
||||||
|
this.addComponent(component);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* getProvider provides a type safe interface where it can only be called with a field name
|
||||||
|
* present in NameServiceMapping interface.
|
||||||
|
*
|
||||||
|
* Firebase SDKs providing services should extend NameServiceMapping interface to register
|
||||||
|
* themselves.
|
||||||
|
*/
|
||||||
|
getProvider(name) {
|
||||||
|
if (this.providers.has(name)) {
|
||||||
|
return this.providers.get(name);
|
||||||
|
}
|
||||||
|
// create a Provider for a service that hasn't registered with Firebase
|
||||||
|
const provider = new Provider(name, this);
|
||||||
|
this.providers.set(name, provider);
|
||||||
|
return provider;
|
||||||
|
}
|
||||||
|
getProviders() {
|
||||||
|
return Array.from(this.providers.values());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.Component = Component;
|
||||||
|
exports.ComponentContainer = ComponentContainer;
|
||||||
|
exports.Provider = Provider;
|
||||||
|
//# sourceMappingURL=index.cjs.js.map
|
||||||
1
node_modules/@firebase/component/dist/index.cjs.js.map
generated
vendored
Normal file
1
node_modules/@firebase/component/dist/index.cjs.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
20
node_modules/@firebase/component/dist/index.d.ts
generated
vendored
Normal file
20
node_modules/@firebase/component/dist/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export { Component } from './src/component';
|
||||||
|
export { ComponentContainer } from './src/component_container';
|
||||||
|
export { Provider } from './src/provider';
|
||||||
|
export { ComponentType, InstanceFactory, InstantiationMode, NameServiceMapping, Name, InstanceFactoryOptions } from './src/types';
|
||||||
43
node_modules/@firebase/component/dist/src/component.d.ts
generated
vendored
Normal file
43
node_modules/@firebase/component/dist/src/component.d.ts
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { InstantiationMode, InstanceFactory, ComponentType, Dictionary, Name, onInstanceCreatedCallback } from './types';
|
||||||
|
/**
|
||||||
|
* Component for service name T, e.g. `auth`, `auth-internal`
|
||||||
|
*/
|
||||||
|
export declare class Component<T extends Name = Name> {
|
||||||
|
readonly name: T;
|
||||||
|
readonly instanceFactory: InstanceFactory<T>;
|
||||||
|
readonly type: ComponentType;
|
||||||
|
multipleInstances: boolean;
|
||||||
|
/**
|
||||||
|
* Properties to be added to the service namespace
|
||||||
|
*/
|
||||||
|
serviceProps: Dictionary;
|
||||||
|
instantiationMode: InstantiationMode;
|
||||||
|
onInstanceCreated: onInstanceCreatedCallback<T> | null;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param name The public service name, e.g. app, auth, firestore, database
|
||||||
|
* @param instanceFactory Service factory responsible for creating the public interface
|
||||||
|
* @param type whether the service provided by the component is public or private
|
||||||
|
*/
|
||||||
|
constructor(name: T, instanceFactory: InstanceFactory<T>, type: ComponentType);
|
||||||
|
setInstantiationMode(mode: InstantiationMode): this;
|
||||||
|
setMultipleInstances(multipleInstances: boolean): this;
|
||||||
|
setServiceProps(props: Dictionary): this;
|
||||||
|
setInstanceCreatedCallback(callback: onInstanceCreatedCallback<T>): this;
|
||||||
|
}
|
||||||
47
node_modules/@firebase/component/dist/src/component_container.d.ts
generated
vendored
Normal file
47
node_modules/@firebase/component/dist/src/component_container.d.ts
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { Provider } from './provider';
|
||||||
|
import { Component } from './component';
|
||||||
|
import { Name } from './types';
|
||||||
|
/**
|
||||||
|
* ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`
|
||||||
|
*/
|
||||||
|
export declare class ComponentContainer {
|
||||||
|
private readonly name;
|
||||||
|
private readonly providers;
|
||||||
|
constructor(name: string);
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param component Component being added
|
||||||
|
* @param overwrite When a component with the same name has already been registered,
|
||||||
|
* if overwrite is true: overwrite the existing component with the new component and create a new
|
||||||
|
* provider with the new component. It can be useful in tests where you want to use different mocks
|
||||||
|
* for different tests.
|
||||||
|
* if overwrite is false: throw an exception
|
||||||
|
*/
|
||||||
|
addComponent<T extends Name>(component: Component<T>): void;
|
||||||
|
addOrOverwriteComponent<T extends Name>(component: Component<T>): void;
|
||||||
|
/**
|
||||||
|
* getProvider provides a type safe interface where it can only be called with a field name
|
||||||
|
* present in NameServiceMapping interface.
|
||||||
|
*
|
||||||
|
* Firebase SDKs providing services should extend NameServiceMapping interface to register
|
||||||
|
* themselves.
|
||||||
|
*/
|
||||||
|
getProvider<T extends Name>(name: T): Provider<T>;
|
||||||
|
getProviders(): Array<Provider<Name>>;
|
||||||
|
}
|
||||||
17
node_modules/@firebase/component/dist/src/constants.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/component/dist/src/constants.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export declare const DEFAULT_ENTRY_NAME = "[DEFAULT]";
|
||||||
79
node_modules/@firebase/component/dist/src/provider.d.ts
generated
vendored
Normal file
79
node_modules/@firebase/component/dist/src/provider.d.ts
generated
vendored
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { ComponentContainer } from './component_container';
|
||||||
|
import { InitializeOptions, Name, NameServiceMapping, OnInitCallBack } from './types';
|
||||||
|
import { Component } from './component';
|
||||||
|
/**
|
||||||
|
* Provider for instance for service name T, e.g. 'auth', 'auth-internal'
|
||||||
|
* NameServiceMapping[T] is an alias for the type of the instance
|
||||||
|
*/
|
||||||
|
export declare class Provider<T extends Name> {
|
||||||
|
private readonly name;
|
||||||
|
private readonly container;
|
||||||
|
private component;
|
||||||
|
private readonly instances;
|
||||||
|
private readonly instancesDeferred;
|
||||||
|
private readonly instancesOptions;
|
||||||
|
private onInitCallbacks;
|
||||||
|
constructor(name: T, container: ComponentContainer);
|
||||||
|
/**
|
||||||
|
* @param identifier A provider can provide multiple instances of a service
|
||||||
|
* if this.component.multipleInstances is true.
|
||||||
|
*/
|
||||||
|
get(identifier?: string): Promise<NameServiceMapping[T]>;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param options.identifier A provider can provide multiple instances of a service
|
||||||
|
* if this.component.multipleInstances is true.
|
||||||
|
* @param options.optional If optional is false or not provided, the method throws an error when
|
||||||
|
* the service is not immediately available.
|
||||||
|
* If optional is true, the method returns null if the service is not immediately available.
|
||||||
|
*/
|
||||||
|
getImmediate(options: {
|
||||||
|
identifier?: string;
|
||||||
|
optional: true;
|
||||||
|
}): NameServiceMapping[T] | null;
|
||||||
|
getImmediate(options?: {
|
||||||
|
identifier?: string;
|
||||||
|
optional?: false;
|
||||||
|
}): NameServiceMapping[T];
|
||||||
|
getComponent(): Component<T> | null;
|
||||||
|
setComponent(component: Component<T>): void;
|
||||||
|
clearInstance(identifier?: string): void;
|
||||||
|
delete(): Promise<void>;
|
||||||
|
isComponentSet(): boolean;
|
||||||
|
isInitialized(identifier?: string): boolean;
|
||||||
|
getOptions(identifier?: string): Record<string, unknown>;
|
||||||
|
initialize(opts?: InitializeOptions): NameServiceMapping[T];
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().
|
||||||
|
* The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.
|
||||||
|
*
|
||||||
|
* @param identifier An optional instance identifier
|
||||||
|
* @returns a function to unregister the callback
|
||||||
|
*/
|
||||||
|
onInit(callback: OnInitCallBack<T>, identifier?: string): () => void;
|
||||||
|
/**
|
||||||
|
* Invoke onInit callbacks synchronously
|
||||||
|
* @param instance the service instance`
|
||||||
|
*/
|
||||||
|
private invokeOnInitCallbacks;
|
||||||
|
private getOrInitializeService;
|
||||||
|
private normalizeInstanceIdentifier;
|
||||||
|
private shouldAutoInitialize;
|
||||||
|
}
|
||||||
62
node_modules/@firebase/component/dist/src/types.d.ts
generated
vendored
Normal file
62
node_modules/@firebase/component/dist/src/types.d.ts
generated
vendored
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { ComponentContainer } from './component_container';
|
||||||
|
export declare const enum InstantiationMode {
|
||||||
|
LAZY = "LAZY",// Currently most components are LAZY in JS SDK
|
||||||
|
EAGER = "EAGER",// EAGER components are initialized immediately upon registration
|
||||||
|
EXPLICIT = "EXPLICIT"
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* PUBLIC: A public component provides a set of public APIs to customers. A service namespace will be patched
|
||||||
|
* onto `firebase` namespace. Assume the component name is `test`, customers will be able
|
||||||
|
* to get the service by calling `firebase.test()` or `app.test()` where `app` is a `FirebaseApp` instance.
|
||||||
|
*
|
||||||
|
* PRIVATE: A private component provides a set of private APIs that are used internally by other
|
||||||
|
* Firebase SDKs. No service namespace is created in `firebase` namespace and customers have no way to get them.
|
||||||
|
*/
|
||||||
|
export declare const enum ComponentType {
|
||||||
|
PUBLIC = "PUBLIC",
|
||||||
|
PRIVATE = "PRIVATE",
|
||||||
|
VERSION = "VERSION"
|
||||||
|
}
|
||||||
|
export interface InstanceFactoryOptions {
|
||||||
|
instanceIdentifier?: string;
|
||||||
|
options?: {};
|
||||||
|
}
|
||||||
|
export type InitializeOptions = InstanceFactoryOptions;
|
||||||
|
/**
|
||||||
|
* Factory to create an instance of type T, given a ComponentContainer.
|
||||||
|
* ComponentContainer is the IOC container that provides {@link Provider}
|
||||||
|
* for dependencies.
|
||||||
|
*
|
||||||
|
* NOTE: The container only provides {@link Provider} rather than the actual instances of dependencies.
|
||||||
|
* It is useful for lazily loaded dependencies and optional dependencies.
|
||||||
|
*/
|
||||||
|
export type InstanceFactory<T extends Name> = (container: ComponentContainer, options: InstanceFactoryOptions) => NameServiceMapping[T];
|
||||||
|
export type onInstanceCreatedCallback<T extends Name> = (container: ComponentContainer, instanceIdentifier: string, instance: NameServiceMapping[T]) => void;
|
||||||
|
export interface Dictionary {
|
||||||
|
[key: string]: unknown;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This interface will be extended by Firebase SDKs to provide service name and service type mapping.
|
||||||
|
* It is used as a generic constraint to ensure type safety.
|
||||||
|
*/
|
||||||
|
export interface NameServiceMapping {
|
||||||
|
}
|
||||||
|
export type Name = keyof NameServiceMapping;
|
||||||
|
export type Service = NameServiceMapping[Name];
|
||||||
|
export type OnInitCallBack<T extends Name> = (instance: NameServiceMapping[T], identifier: string) => void;
|
||||||
17
node_modules/@firebase/component/dist/test/setup.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/component/dist/test/setup.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export {};
|
||||||
5
node_modules/@firebase/component/dist/test/util.d.ts
generated
vendored
Normal file
5
node_modules/@firebase/component/dist/test/util.d.ts
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import { FirebaseApp } from '@firebase/app-types';
|
||||||
|
import { InstanceFactory, InstantiationMode, Name } from '../src/types';
|
||||||
|
import { Component } from '../src/component';
|
||||||
|
export declare function getFakeApp(appName?: string): FirebaseApp;
|
||||||
|
export declare function getFakeComponent<T extends Name>(name: T, factory: InstanceFactory<T>, multipleInstance?: boolean, instantiationMode?: InstantiationMode): Component<T>;
|
||||||
61
node_modules/@firebase/component/package.json
generated
vendored
Normal file
61
node_modules/@firebase/component/package.json
generated
vendored
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"name": "@firebase/component",
|
||||||
|
"version": "0.6.14",
|
||||||
|
"description": "Firebase Component Platform",
|
||||||
|
"author": "Firebase <firebase-support@google.com> (https://firebase.google.com/)",
|
||||||
|
"main": "dist/index.cjs.js",
|
||||||
|
"browser": "dist/esm/index.esm2017.js",
|
||||||
|
"module": "dist/esm/index.esm2017.js",
|
||||||
|
"exports": {
|
||||||
|
".": {
|
||||||
|
"types": "./dist/index.d.ts",
|
||||||
|
"require": "./dist/index.cjs.js",
|
||||||
|
"default": "./dist/esm/index.esm2017.js"
|
||||||
|
},
|
||||||
|
"./package.json": "./package.json"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"dist"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"lint": "eslint -c .eslintrc.js '**/*.ts' --ignore-path '../../.gitignore'",
|
||||||
|
"lint:fix": "eslint --fix -c .eslintrc.js '**/*.ts' --ignore-path '../../.gitignore'",
|
||||||
|
"build": "rollup -c",
|
||||||
|
"build:deps": "lerna run --scope @firebase/component --include-dependencies build",
|
||||||
|
"dev": "rollup -c -w",
|
||||||
|
"test": "run-p --npm-path npm lint test:all",
|
||||||
|
"test:all": "run-p --npm-path npm test:browser test:node",
|
||||||
|
"test:ci": "node ../../scripts/run_tests_in_ci.js -s test:all",
|
||||||
|
"test:browser": "karma start",
|
||||||
|
"test:node": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' nyc --reporter lcovonly -- mocha src/**/*.test.ts --config ../../config/mocharc.node.js",
|
||||||
|
"trusted-type-check": "tsec -p tsconfig.json --noEmit"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@firebase/util": "1.11.1",
|
||||||
|
"tslib": "^2.1.0"
|
||||||
|
},
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"devDependencies": {
|
||||||
|
"rollup": "2.79.2",
|
||||||
|
"rollup-plugin-typescript2": "0.36.0",
|
||||||
|
"typescript": "5.5.4"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"directory": "packages/component",
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/firebase/firebase-js-sdk.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/firebase/firebase-js-sdk/issues"
|
||||||
|
},
|
||||||
|
"typings": "dist/index.d.ts",
|
||||||
|
"nyc": {
|
||||||
|
"extension": [
|
||||||
|
".ts"
|
||||||
|
],
|
||||||
|
"reportDir": "./coverage/node"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
5
node_modules/@firebase/database-compat/README.md
generated
vendored
Normal file
5
node_modules/@firebase/database-compat/README.md
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# @firebase/database-compat
|
||||||
|
|
||||||
|
This is the compatibility layer for the Firebase Realtime Database component of the Firebase JS SDK.
|
||||||
|
|
||||||
|
**This package is not intended for direct usage, and should only be used via the officially supported [firebase](https://www.npmjs.com/package/firebase) package.**
|
||||||
74
node_modules/@firebase/database-compat/dist/database-compat/src/api/Database.d.ts
generated
vendored
Normal file
74
node_modules/@firebase/database-compat/dist/database-compat/src/api/Database.d.ts
generated
vendored
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { FirebaseApp } from '@firebase/app-types';
|
||||||
|
import { FirebaseService } from '@firebase/app-types/private';
|
||||||
|
import { forceLongPolling, forceWebSockets, Database as ModularDatabase } from '@firebase/database';
|
||||||
|
import { Compat, EmulatorMockTokenOptions } from '@firebase/util';
|
||||||
|
import { Reference } from './Reference';
|
||||||
|
/**
|
||||||
|
* Class representing a firebase database.
|
||||||
|
*/
|
||||||
|
export declare class Database implements FirebaseService, Compat<ModularDatabase> {
|
||||||
|
readonly _delegate: ModularDatabase;
|
||||||
|
readonly app: FirebaseApp;
|
||||||
|
static readonly ServerValue: {
|
||||||
|
TIMESTAMP: object;
|
||||||
|
increment: (delta: number) => object;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* The constructor should not be called by users of our public API.
|
||||||
|
*/
|
||||||
|
constructor(_delegate: ModularDatabase, app: FirebaseApp);
|
||||||
|
INTERNAL: {
|
||||||
|
delete: () => Promise<void>;
|
||||||
|
forceWebSockets: typeof forceWebSockets;
|
||||||
|
forceLongPolling: typeof forceLongPolling;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* Modify this instance to communicate with the Realtime Database emulator.
|
||||||
|
*
|
||||||
|
* <p>Note: This method must be called before performing any other operation.
|
||||||
|
*
|
||||||
|
* @param host - the emulator host (ex: localhost)
|
||||||
|
* @param port - the emulator port (ex: 8080)
|
||||||
|
* @param options.mockUserToken - the mock auth token to use for unit testing Security Rules
|
||||||
|
*/
|
||||||
|
useEmulator(host: string, port: number, options?: {
|
||||||
|
mockUserToken?: EmulatorMockTokenOptions;
|
||||||
|
}): void;
|
||||||
|
/**
|
||||||
|
* Returns a reference to the root or to the path specified in the provided
|
||||||
|
* argument.
|
||||||
|
*
|
||||||
|
* @param path - The relative string path or an existing Reference to a database
|
||||||
|
* location.
|
||||||
|
* @throws If a Reference is provided, throws if it does not belong to the
|
||||||
|
* same project.
|
||||||
|
* @returns Firebase reference.
|
||||||
|
*/
|
||||||
|
ref(path?: string): Reference;
|
||||||
|
ref(path?: Reference): Reference;
|
||||||
|
/**
|
||||||
|
* Returns a reference to the root or the path specified in url.
|
||||||
|
* We throw a exception if the url is not in the same domain as the
|
||||||
|
* current repo.
|
||||||
|
* @returns Firebase reference.
|
||||||
|
*/
|
||||||
|
refFromURL(url: string): Reference;
|
||||||
|
goOffline(): void;
|
||||||
|
goOnline(): void;
|
||||||
|
}
|
||||||
207
node_modules/@firebase/database-compat/dist/database-compat/src/api/Reference.d.ts
generated
vendored
Normal file
207
node_modules/@firebase/database-compat/dist/database-compat/src/api/Reference.d.ts
generated
vendored
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { DataSnapshot as ModularDataSnapshot, Query as ExpQuery, DatabaseReference as ModularReference } from '@firebase/database';
|
||||||
|
import { Compat } from '@firebase/util';
|
||||||
|
import { Database } from './Database';
|
||||||
|
import { OnDisconnect } from './onDisconnect';
|
||||||
|
import { TransactionResult } from './TransactionResult';
|
||||||
|
/**
|
||||||
|
* Class representing a firebase data snapshot. It wraps a SnapshotNode and
|
||||||
|
* surfaces the public methods (val, forEach, etc.) we want to expose.
|
||||||
|
*/
|
||||||
|
export declare class DataSnapshot implements Compat<ModularDataSnapshot> {
|
||||||
|
readonly _database: Database;
|
||||||
|
readonly _delegate: ModularDataSnapshot;
|
||||||
|
constructor(_database: Database, _delegate: ModularDataSnapshot);
|
||||||
|
/**
|
||||||
|
* Retrieves the snapshot contents as JSON. Returns null if the snapshot is
|
||||||
|
* empty.
|
||||||
|
*
|
||||||
|
* @returns JSON representation of the DataSnapshot contents, or null if empty.
|
||||||
|
*/
|
||||||
|
val(): unknown;
|
||||||
|
/**
|
||||||
|
* Returns the snapshot contents as JSON, including priorities of node. Suitable for exporting
|
||||||
|
* the entire node contents.
|
||||||
|
* @returns JSON representation of the DataSnapshot contents, or null if empty.
|
||||||
|
*/
|
||||||
|
exportVal(): unknown;
|
||||||
|
toJSON(): unknown;
|
||||||
|
/**
|
||||||
|
* Returns whether the snapshot contains a non-null value.
|
||||||
|
*
|
||||||
|
* @returns Whether the snapshot contains a non-null value, or is empty.
|
||||||
|
*/
|
||||||
|
exists(): boolean;
|
||||||
|
/**
|
||||||
|
* Returns a DataSnapshot of the specified child node's contents.
|
||||||
|
*
|
||||||
|
* @param path - Path to a child.
|
||||||
|
* @returns DataSnapshot for child node.
|
||||||
|
*/
|
||||||
|
child(path: string): DataSnapshot;
|
||||||
|
/**
|
||||||
|
* Returns whether the snapshot contains a child at the specified path.
|
||||||
|
*
|
||||||
|
* @param path - Path to a child.
|
||||||
|
* @returns Whether the child exists.
|
||||||
|
*/
|
||||||
|
hasChild(path: string): boolean;
|
||||||
|
/**
|
||||||
|
* Returns the priority of the object, or null if no priority was set.
|
||||||
|
*
|
||||||
|
* @returns The priority.
|
||||||
|
*/
|
||||||
|
getPriority(): string | number | null;
|
||||||
|
/**
|
||||||
|
* Iterates through child nodes and calls the specified action for each one.
|
||||||
|
*
|
||||||
|
* @param action - Callback function to be called
|
||||||
|
* for each child.
|
||||||
|
* @returns True if forEach was canceled by action returning true for
|
||||||
|
* one of the child nodes.
|
||||||
|
*/
|
||||||
|
forEach(action: (snapshot: IteratedDataSnapshot) => boolean | void): boolean;
|
||||||
|
/**
|
||||||
|
* Returns whether this DataSnapshot has children.
|
||||||
|
* @returns True if the DataSnapshot contains 1 or more child nodes.
|
||||||
|
*/
|
||||||
|
hasChildren(): boolean;
|
||||||
|
get key(): string;
|
||||||
|
/**
|
||||||
|
* Returns the number of children for this DataSnapshot.
|
||||||
|
* @returns The number of children that this DataSnapshot contains.
|
||||||
|
*/
|
||||||
|
numChildren(): number;
|
||||||
|
/**
|
||||||
|
* @returns The Firebase reference for the location this snapshot's data came
|
||||||
|
* from.
|
||||||
|
*/
|
||||||
|
getRef(): Reference;
|
||||||
|
get ref(): Reference;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Represents a child snapshot of a `Reference` that is being iterated over. The key will never be undefined.
|
||||||
|
*/
|
||||||
|
export interface IteratedDataSnapshot extends DataSnapshot {
|
||||||
|
key: string;
|
||||||
|
}
|
||||||
|
export interface SnapshotCallback {
|
||||||
|
(dataSnapshot: DataSnapshot, previousChildName?: string | null): unknown;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* A Query represents a filter to be applied to a firebase location. This object purely represents the
|
||||||
|
* query expression (and exposes our public API to build the query). The actual query logic is in ViewBase.js.
|
||||||
|
*
|
||||||
|
* Since every Firebase reference is a query, Firebase inherits from this object.
|
||||||
|
*/
|
||||||
|
export declare class Query implements Compat<ExpQuery> {
|
||||||
|
readonly database: Database;
|
||||||
|
readonly _delegate: ExpQuery;
|
||||||
|
constructor(database: Database, _delegate: ExpQuery);
|
||||||
|
on(eventType: string, callback: SnapshotCallback, cancelCallbackOrContext?: ((a: Error) => unknown) | object | null, context?: object | null): SnapshotCallback;
|
||||||
|
off(eventType?: string, callback?: SnapshotCallback, context?: object | null): void;
|
||||||
|
/**
|
||||||
|
* Get the server-value for this query, or return a cached value if not connected.
|
||||||
|
*/
|
||||||
|
get(): Promise<DataSnapshot>;
|
||||||
|
/**
|
||||||
|
* Attaches a listener, waits for the first event, and then removes the listener
|
||||||
|
*/
|
||||||
|
once(eventType: string, callback?: SnapshotCallback, failureCallbackOrContext?: ((a: Error) => void) | object | null, context?: object | null): Promise<DataSnapshot>;
|
||||||
|
/**
|
||||||
|
* Set a limit and anchor it to the start of the window.
|
||||||
|
*/
|
||||||
|
limitToFirst(limit: number): Query;
|
||||||
|
/**
|
||||||
|
* Set a limit and anchor it to the end of the window.
|
||||||
|
*/
|
||||||
|
limitToLast(limit: number): Query;
|
||||||
|
/**
|
||||||
|
* Given a child path, return a new query ordered by the specified grandchild path.
|
||||||
|
*/
|
||||||
|
orderByChild(path: string): Query;
|
||||||
|
/**
|
||||||
|
* Return a new query ordered by the KeyIndex
|
||||||
|
*/
|
||||||
|
orderByKey(): Query;
|
||||||
|
/**
|
||||||
|
* Return a new query ordered by the PriorityIndex
|
||||||
|
*/
|
||||||
|
orderByPriority(): Query;
|
||||||
|
/**
|
||||||
|
* Return a new query ordered by the ValueIndex
|
||||||
|
*/
|
||||||
|
orderByValue(): Query;
|
||||||
|
startAt(value?: number | string | boolean | null, name?: string | null): Query;
|
||||||
|
startAfter(value?: number | string | boolean | null, name?: string | null): Query;
|
||||||
|
endAt(value?: number | string | boolean | null, name?: string | null): Query;
|
||||||
|
endBefore(value?: number | string | boolean | null, name?: string | null): Query;
|
||||||
|
/**
|
||||||
|
* Load the selection of children with exactly the specified value, and, optionally,
|
||||||
|
* the specified name.
|
||||||
|
*/
|
||||||
|
equalTo(value: number | string | boolean | null, name?: string): Query;
|
||||||
|
/**
|
||||||
|
* @returns URL for this location.
|
||||||
|
*/
|
||||||
|
toString(): string;
|
||||||
|
toJSON(): string;
|
||||||
|
/**
|
||||||
|
* Return true if this query and the provided query are equivalent; otherwise, return false.
|
||||||
|
*/
|
||||||
|
isEqual(other: Query): boolean;
|
||||||
|
/**
|
||||||
|
* Helper used by .on and .once to extract the context and or cancel arguments.
|
||||||
|
* @param fnName - The function name (on or once)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static getCancelAndContextArgs_;
|
||||||
|
get ref(): Reference;
|
||||||
|
}
|
||||||
|
export declare class Reference extends Query implements Compat<ModularReference> {
|
||||||
|
readonly database: Database;
|
||||||
|
readonly _delegate: ModularReference;
|
||||||
|
then: Promise<Reference>['then'];
|
||||||
|
catch: Promise<Reference>['catch'];
|
||||||
|
/**
|
||||||
|
* Call options:
|
||||||
|
* new Reference(Repo, Path) or
|
||||||
|
* new Reference(url: string, string|RepoManager)
|
||||||
|
*
|
||||||
|
* Externally - this is the firebase.database.Reference type.
|
||||||
|
*/
|
||||||
|
constructor(database: Database, _delegate: ModularReference);
|
||||||
|
/** @returns {?string} */
|
||||||
|
getKey(): string | null;
|
||||||
|
child(pathString: string): Reference;
|
||||||
|
/** @returns {?Reference} */
|
||||||
|
getParent(): Reference | null;
|
||||||
|
/** @returns {!Reference} */
|
||||||
|
getRoot(): Reference;
|
||||||
|
set(newVal: unknown, onComplete?: (error: Error | null) => void): Promise<void>;
|
||||||
|
update(values: object, onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
setWithPriority(newVal: unknown, newPriority: string | number | null, onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
remove(onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
transaction(transactionUpdate: (currentData: unknown) => unknown, onComplete?: (error: Error | null, committed: boolean, dataSnapshot: DataSnapshot | null) => void, applyLocally?: boolean): Promise<TransactionResult>;
|
||||||
|
setPriority(priority: string | number | null, onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
push(value?: unknown, onComplete?: (a: Error | null) => void): Reference;
|
||||||
|
onDisconnect(): OnDisconnect;
|
||||||
|
get key(): string | null;
|
||||||
|
get parent(): Reference | null;
|
||||||
|
get root(): Reference;
|
||||||
|
}
|
||||||
26
node_modules/@firebase/database-compat/dist/database-compat/src/api/TransactionResult.d.ts
generated
vendored
Normal file
26
node_modules/@firebase/database-compat/dist/database-compat/src/api/TransactionResult.d.ts
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { DataSnapshot } from './Reference';
|
||||||
|
export declare class TransactionResult {
|
||||||
|
committed: boolean;
|
||||||
|
snapshot: DataSnapshot;
|
||||||
|
/**
|
||||||
|
* A type for the resolve value of Firebase.transaction.
|
||||||
|
*/
|
||||||
|
constructor(committed: boolean, snapshot: DataSnapshot);
|
||||||
|
toJSON(): object;
|
||||||
|
}
|
||||||
41
node_modules/@firebase/database-compat/dist/database-compat/src/api/internal.d.ts
generated
vendored
Normal file
41
node_modules/@firebase/database-compat/dist/database-compat/src/api/internal.d.ts
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { FirebaseAppCheckInternal } from '@firebase/app-check-interop-types';
|
||||||
|
import { FirebaseApp } from '@firebase/app-types';
|
||||||
|
import { FirebaseAuthInternal } from '@firebase/auth-interop-types';
|
||||||
|
import * as types from '@firebase/database-types';
|
||||||
|
/**
|
||||||
|
* Used by console to create a database based on the app,
|
||||||
|
* passed database URL and a custom auth implementation.
|
||||||
|
*
|
||||||
|
* @param app - A valid FirebaseApp-like object
|
||||||
|
* @param url - A valid Firebase databaseURL
|
||||||
|
* @param version - custom version e.g. firebase-admin version
|
||||||
|
* @param customAuthImpl - custom auth implementation
|
||||||
|
*/
|
||||||
|
export declare function initStandalone<T>({ app, url, version, customAuthImpl, customAppCheckImpl, namespace, nodeAdmin }: {
|
||||||
|
app: FirebaseApp;
|
||||||
|
url: string;
|
||||||
|
version: string;
|
||||||
|
customAuthImpl: FirebaseAuthInternal;
|
||||||
|
customAppCheckImpl?: FirebaseAppCheckInternal;
|
||||||
|
namespace: T;
|
||||||
|
nodeAdmin?: boolean;
|
||||||
|
}): {
|
||||||
|
instance: types.Database;
|
||||||
|
namespace: T;
|
||||||
|
};
|
||||||
27
node_modules/@firebase/database-compat/dist/database-compat/src/api/onDisconnect.d.ts
generated
vendored
Normal file
27
node_modules/@firebase/database-compat/dist/database-compat/src/api/onDisconnect.d.ts
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { OnDisconnect as ModularOnDisconnect } from '@firebase/database';
|
||||||
|
import { Compat } from '@firebase/util';
|
||||||
|
export declare class OnDisconnect implements Compat<ModularOnDisconnect> {
|
||||||
|
readonly _delegate: ModularOnDisconnect;
|
||||||
|
constructor(_delegate: ModularOnDisconnect);
|
||||||
|
cancel(onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
remove(onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
set(value: unknown, onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
setWithPriority(value: unknown, priority: number | string | null, onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
update(objectToMerge: Record<string, unknown>, onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
}
|
||||||
72
node_modules/@firebase/database-compat/dist/database-compat/src/index.d.ts
generated
vendored
Normal file
72
node_modules/@firebase/database-compat/dist/database-compat/src/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { FirebaseNamespace } from '@firebase/app-compat';
|
||||||
|
import * as types from '@firebase/database-types';
|
||||||
|
export declare function registerDatabase(instance: FirebaseNamespace): void;
|
||||||
|
declare module '@firebase/app-compat' {
|
||||||
|
interface FirebaseNamespace {
|
||||||
|
database?: {
|
||||||
|
(app?: FirebaseApp): types.FirebaseDatabase;
|
||||||
|
enableLogging: typeof types.enableLogging;
|
||||||
|
ServerValue: types.ServerValue;
|
||||||
|
Database: typeof types.FirebaseDatabase;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
interface FirebaseApp {
|
||||||
|
database?(databaseURL?: string): types.FirebaseDatabase;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
import { FirebaseApp as FirebaseAppCompat } from "@firebase/app-compat";
|
||||||
|
import { type DatabaseReference, type EmulatorMockTokenOptions, type DataSnapshot, type Database, type EventType, type Unsubscribe, type ListenOptions, type OnDisconnect, type ThenableReference, type QueryConstraint, type Query, type TransactionOptions, type TransactionResult } from "@firebase/database";
|
||||||
|
declare module "@firebase/database" {
|
||||||
|
function child(parent: types.Reference, path: string): DatabaseReference;
|
||||||
|
function connectDatabaseEmulator(db: types.FirebaseDatabase, host: string, port: number, options?: {
|
||||||
|
mockUserToken?: EmulatorMockTokenOptions | string;
|
||||||
|
}): void;
|
||||||
|
function get(query: types.Query): Promise<DataSnapshot>;
|
||||||
|
function getDatabase(app?: FirebaseAppCompat, url?: string): Database;
|
||||||
|
function goOffline(db: types.FirebaseDatabase): void;
|
||||||
|
function goOnline(db: types.FirebaseDatabase): void;
|
||||||
|
function off(query: types.Query, eventType?: EventType, callback?: (snapshot: DataSnapshot, previousChildName?: string | null) => unknown): void;
|
||||||
|
function onChildAdded(query: types.Query, callback: (snapshot: DataSnapshot, previousChildName?: string | null) => unknown, cancelCallback?: (error: Error) => unknown): Unsubscribe;
|
||||||
|
function onChildAdded(query: types.Query, callback: (snapshot: DataSnapshot, previousChildName: string | null) => unknown, options: ListenOptions): Unsubscribe;
|
||||||
|
function onChildAdded(query: types.Query, callback: (snapshot: DataSnapshot, previousChildName: string | null) => unknown, cancelCallback: (error: Error) => unknown, options: ListenOptions): Unsubscribe;
|
||||||
|
function onChildChanged(query: types.Query, callback: (snapshot: DataSnapshot, previousChildName: string | null) => unknown, cancelCallback?: (error: Error) => unknown): Unsubscribe;
|
||||||
|
function onChildChanged(query: types.Query, callback: (snapshot: DataSnapshot, previousChildName: string | null) => unknown, options: ListenOptions): Unsubscribe;
|
||||||
|
function onChildChanged(query: types.Query, callback: (snapshot: DataSnapshot, previousChildName: string | null) => unknown, cancelCallback: (error: Error) => unknown, options: ListenOptions): Unsubscribe;
|
||||||
|
function onChildMoved(query: types.Query, callback: (snapshot: DataSnapshot, previousChildName: string | null) => unknown, cancelCallback?: (error: Error) => unknown): Unsubscribe;
|
||||||
|
function onChildMoved(query: types.Query, callback: (snapshot: DataSnapshot, previousChildName: string | null) => unknown, options: ListenOptions): Unsubscribe;
|
||||||
|
function onChildMoved(query: types.Query, callback: (snapshot: DataSnapshot, previousChildName: string | null) => unknown, cancelCallback: (error: Error) => unknown, options: ListenOptions): Unsubscribe;
|
||||||
|
function onChildRemoved(query: types.Query, callback: (snapshot: DataSnapshot) => unknown, cancelCallback?: (error: Error) => unknown): Unsubscribe;
|
||||||
|
function onChildRemoved(query: types.Query, callback: (snapshot: DataSnapshot) => unknown, options: ListenOptions): Unsubscribe;
|
||||||
|
function onChildRemoved(query: types.Query, callback: (snapshot: DataSnapshot) => unknown, cancelCallback: (error: Error) => unknown, options: ListenOptions): Unsubscribe;
|
||||||
|
function onDisconnect(ref: types.Reference): OnDisconnect;
|
||||||
|
function onValue(query: types.Query, callback: (snapshot: DataSnapshot) => unknown, cancelCallback?: (error: Error) => unknown): Unsubscribe;
|
||||||
|
function onValue(query: types.Query, callback: (snapshot: DataSnapshot) => unknown, options: ListenOptions): Unsubscribe;
|
||||||
|
function onValue(query: types.Query, callback: (snapshot: DataSnapshot) => unknown, cancelCallback: (error: Error) => unknown, options: ListenOptions): Unsubscribe;
|
||||||
|
function push(parent: types.Reference, value?: unknown): ThenableReference;
|
||||||
|
function query(query: types.Query, ...queryConstraints: QueryConstraint[]): Query;
|
||||||
|
function ref(db: types.FirebaseDatabase, path?: string): DatabaseReference;
|
||||||
|
function refFromURL(db: types.FirebaseDatabase, url: string): DatabaseReference;
|
||||||
|
function remove(ref: types.Reference): Promise<void>;
|
||||||
|
function runTransaction(ref: types.Reference, transactionUpdate: (currentData: any) => unknown, options?: TransactionOptions): Promise<TransactionResult>;
|
||||||
|
function set(ref: types.Reference, value: unknown): Promise<void>;
|
||||||
|
function setPriority(ref: types.Reference, priority: string | number | null): Promise<void>;
|
||||||
|
function setWithPriority(ref: types.Reference, value: unknown, priority: string | number | null): Promise<void>;
|
||||||
|
function update(ref: types.Reference, values: object): Promise<void>;
|
||||||
|
}
|
||||||
30
node_modules/@firebase/database-compat/dist/database-compat/src/index.node.d.ts
generated
vendored
Normal file
30
node_modules/@firebase/database-compat/dist/database-compat/src/index.node.d.ts
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import * as types from '@firebase/database-types';
|
||||||
|
declare module '@firebase/app-compat' {
|
||||||
|
interface FirebaseNamespace {
|
||||||
|
database?: {
|
||||||
|
(app?: FirebaseApp): types.FirebaseDatabase;
|
||||||
|
enableLogging: typeof types.enableLogging;
|
||||||
|
ServerValue: types.ServerValue;
|
||||||
|
Database: typeof types.FirebaseDatabase;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
interface FirebaseApp {
|
||||||
|
database?(): types.FirebaseDatabase;
|
||||||
|
}
|
||||||
|
}
|
||||||
52
node_modules/@firebase/database-compat/dist/database-compat/src/index.standalone.d.ts
generated
vendored
Normal file
52
node_modules/@firebase/database-compat/dist/database-compat/src/index.standalone.d.ts
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { FirebaseApp } from '@firebase/app-types';
|
||||||
|
import { enableLogging } from '@firebase/database';
|
||||||
|
import { Database } from './api/Database';
|
||||||
|
import * as INTERNAL from './api/internal';
|
||||||
|
import { DataSnapshot, Query, Reference } from './api/Reference';
|
||||||
|
declare const ServerValue: {
|
||||||
|
TIMESTAMP: object;
|
||||||
|
increment: (delta: number) => object;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* A one off register function which returns a database based on the app and
|
||||||
|
* passed database URL. (Used by the Admin SDK)
|
||||||
|
*
|
||||||
|
* @param app - A valid FirebaseApp-like object
|
||||||
|
* @param url - A valid Firebase databaseURL
|
||||||
|
* @param version - custom version e.g. firebase-admin version
|
||||||
|
* @param nodeAdmin - true if the SDK is being initialized from Firebase Admin.
|
||||||
|
*/
|
||||||
|
export declare function initStandalone(app: FirebaseApp, url: string, version: string, nodeAdmin?: boolean): {
|
||||||
|
instance: import("@firebase/database-types").Database;
|
||||||
|
namespace: {
|
||||||
|
Reference: typeof Reference;
|
||||||
|
Query: typeof Query;
|
||||||
|
Database: typeof Database;
|
||||||
|
DataSnapshot: typeof DataSnapshot;
|
||||||
|
enableLogging: typeof enableLogging;
|
||||||
|
INTERNAL: typeof INTERNAL;
|
||||||
|
ServerValue: {
|
||||||
|
TIMESTAMP: object;
|
||||||
|
increment: (delta: number) => object;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
export { Database, Query, Reference, enableLogging, ServerValue };
|
||||||
|
export { OnDisconnect } from '@firebase/database';
|
||||||
|
export { DataSnapshot } from './api/Reference';
|
||||||
17
node_modules/@firebase/database-compat/dist/database-compat/src/util/util.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/database-compat/dist/database-compat/src/util/util.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export declare const warn: (msg: string) => void;
|
||||||
18
node_modules/@firebase/database-compat/dist/database-compat/src/util/validation.d.ts
generated
vendored
Normal file
18
node_modules/@firebase/database-compat/dist/database-compat/src/util/validation.d.ts
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export declare const validateBoolean: (fnName: string, argumentName: string, bool: unknown, optional: boolean) => void;
|
||||||
|
export declare const validateEventType: (fnName: string, eventType: string, optional: boolean) => void;
|
||||||
17
node_modules/@firebase/database-compat/dist/database-compat/test/browser/crawler_support.test.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/database-compat/dist/database-compat/test/browser/crawler_support.test.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export {};
|
||||||
17
node_modules/@firebase/database-compat/dist/database-compat/test/database.test.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/database-compat/dist/database-compat/test/database.test.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import '../src/index';
|
||||||
17
node_modules/@firebase/database-compat/dist/database-compat/test/datasnapshot.test.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/database-compat/dist/database-compat/test/datasnapshot.test.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export {};
|
||||||
34
node_modules/@firebase/database-compat/dist/database-compat/test/helpers/events.d.ts
generated
vendored
Normal file
34
node_modules/@firebase/database-compat/dist/database-compat/test/helpers/events.d.ts
generated
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* A set of functions to clean up event handlers.
|
||||||
|
*/
|
||||||
|
export declare let eventCleanupHandlers: any[];
|
||||||
|
/** Clean up outstanding event handlers */
|
||||||
|
export declare function eventCleanup(): void;
|
||||||
|
/**
|
||||||
|
* Creates a struct which waits for many events.
|
||||||
|
* @param pathAndEvents - an array of tuples of [Firebase, [event type strings]]
|
||||||
|
*/
|
||||||
|
export declare function eventTestHelper(pathAndEvents: any, helperName?: any): {
|
||||||
|
promise: Promise<unknown>;
|
||||||
|
initPromise: Promise<unknown>;
|
||||||
|
waiter: () => boolean;
|
||||||
|
watchesInitializedWaiter: () => boolean;
|
||||||
|
unregister: () => void;
|
||||||
|
addExpectedEvents(moreEvents: any): void;
|
||||||
|
};
|
||||||
42
node_modules/@firebase/database-compat/dist/database-compat/test/helpers/util.d.ts
generated
vendored
Normal file
42
node_modules/@firebase/database-compat/dist/database-compat/test/helpers/util.d.ts
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import '../../src/index';
|
||||||
|
import { Path } from '../../../database/src/core/util/Path';
|
||||||
|
import { Query, Reference } from '../../src/api/Reference';
|
||||||
|
export declare const TEST_PROJECT: any;
|
||||||
|
export declare const DATABASE_ADDRESS: any;
|
||||||
|
export declare const DATABASE_URL: any;
|
||||||
|
export declare function createTestApp(): import("@firebase/app-compat").FirebaseApp;
|
||||||
|
/**
|
||||||
|
* Gets or creates a root node to the test namespace. All calls sharing the
|
||||||
|
* value of opt_i will share an app context.
|
||||||
|
*/
|
||||||
|
export declare function getRootNode(i?: number, ref?: string): any;
|
||||||
|
/**
|
||||||
|
* Create multiple refs to the same top level
|
||||||
|
* push key - each on its own Firebase.Context.
|
||||||
|
*/
|
||||||
|
export declare function getRandomNode(numNodes?: any): Reference | Reference[];
|
||||||
|
export declare function getQueryValue(query: Query): Promise<unknown>;
|
||||||
|
export declare function pause(milliseconds: number): Promise<void>;
|
||||||
|
export declare function getPath(query: Query): string;
|
||||||
|
export declare function shuffle(arr: any, randFn?: () => number): void;
|
||||||
|
export declare function getFreshRepo(path: Path): any;
|
||||||
|
export declare function getFreshRepoFromReference(ref: any): any;
|
||||||
|
export declare function getSnap(path: any): any;
|
||||||
|
export declare function getVal(path: any): any;
|
||||||
|
export declare function canCreateExtraConnections(): boolean;
|
||||||
17
node_modules/@firebase/database-compat/dist/database-compat/test/info.test.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/database-compat/dist/database-compat/test/info.test.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export {};
|
||||||
17
node_modules/@firebase/database-compat/dist/database-compat/test/order.test.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/database-compat/dist/database-compat/test/order.test.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export {};
|
||||||
17
node_modules/@firebase/database-compat/dist/database-compat/test/order_by.test.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/database-compat/dist/database-compat/test/order_by.test.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export {};
|
||||||
17
node_modules/@firebase/database-compat/dist/database-compat/test/promise.test.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/database-compat/dist/database-compat/test/promise.test.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export {};
|
||||||
17
node_modules/@firebase/database-compat/dist/database-compat/test/query.test.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/database-compat/dist/database-compat/test/query.test.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export {};
|
||||||
17
node_modules/@firebase/database-compat/dist/database-compat/test/servervalues.test.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/database-compat/dist/database-compat/test/servervalues.test.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export {};
|
||||||
17
node_modules/@firebase/database-compat/dist/database-compat/test/transaction.test.d.ts
generated
vendored
Normal file
17
node_modules/@firebase/database-compat/dist/database-compat/test/transaction.test.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import '../src/index';
|
||||||
861
node_modules/@firebase/database-compat/dist/index.esm2017.js
generated
vendored
Normal file
861
node_modules/@firebase/database-compat/dist/index.esm2017.js
generated
vendored
Normal file
@@ -0,0 +1,861 @@
|
|||||||
|
import firebase from '@firebase/app-compat';
|
||||||
|
import { ComponentContainer, Provider, Component } from '@firebase/component';
|
||||||
|
import { _validatePathString, onChildMoved, onChildChanged, onChildRemoved, onChildAdded, onValue, off, get, query, limitToFirst, limitToLast, orderByChild, orderByKey, orderByPriority, orderByValue, startAt, startAfter, endAt, endBefore, equalTo, _ReferenceImpl, _QueryImpl, _QueryParams, child, set, _validateWritablePath, update, setWithPriority, remove, runTransaction, setPriority, push, OnDisconnect as OnDisconnect$1, forceWebSockets, forceLongPolling, connectDatabaseEmulator, refFromURL, ref, goOffline, goOnline, serverTimestamp, increment, _setSDKVersion, _repoManagerDatabaseFromApp, enableLogging } from '@firebase/database';
|
||||||
|
import { errorPrefix, validateArgCount, validateCallback, validateContextObject, Deferred } from '@firebase/util';
|
||||||
|
import { Logger } from '@firebase/logger';
|
||||||
|
|
||||||
|
const name = "@firebase/database-compat";
|
||||||
|
const version = "2.0.6";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
const logClient = new Logger('@firebase/database-compat');
|
||||||
|
const warn = function (msg) {
|
||||||
|
const message = 'FIREBASE WARNING: ' + msg;
|
||||||
|
logClient.warn(message);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
const validateBoolean = function (fnName, argumentName, bool, optional) {
|
||||||
|
if (optional && bool === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (typeof bool !== 'boolean') {
|
||||||
|
throw new Error(errorPrefix(fnName, argumentName) + 'must be a boolean.');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const validateEventType = function (fnName, eventType, optional) {
|
||||||
|
if (optional && eventType === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (eventType) {
|
||||||
|
case 'value':
|
||||||
|
case 'child_added':
|
||||||
|
case 'child_removed':
|
||||||
|
case 'child_changed':
|
||||||
|
case 'child_moved':
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(errorPrefix(fnName, 'eventType') +
|
||||||
|
'must be a valid event type = "value", "child_added", "child_removed", ' +
|
||||||
|
'"child_changed", or "child_moved".');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
class OnDisconnect {
|
||||||
|
constructor(_delegate) {
|
||||||
|
this._delegate = _delegate;
|
||||||
|
}
|
||||||
|
cancel(onComplete) {
|
||||||
|
validateArgCount('OnDisconnect.cancel', 0, 1, arguments.length);
|
||||||
|
validateCallback('OnDisconnect.cancel', 'onComplete', onComplete, true);
|
||||||
|
const result = this._delegate.cancel();
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
remove(onComplete) {
|
||||||
|
validateArgCount('OnDisconnect.remove', 0, 1, arguments.length);
|
||||||
|
validateCallback('OnDisconnect.remove', 'onComplete', onComplete, true);
|
||||||
|
const result = this._delegate.remove();
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
set(value, onComplete) {
|
||||||
|
validateArgCount('OnDisconnect.set', 1, 2, arguments.length);
|
||||||
|
validateCallback('OnDisconnect.set', 'onComplete', onComplete, true);
|
||||||
|
const result = this._delegate.set(value);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
setWithPriority(value, priority, onComplete) {
|
||||||
|
validateArgCount('OnDisconnect.setWithPriority', 2, 3, arguments.length);
|
||||||
|
validateCallback('OnDisconnect.setWithPriority', 'onComplete', onComplete, true);
|
||||||
|
const result = this._delegate.setWithPriority(value, priority);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
update(objectToMerge, onComplete) {
|
||||||
|
validateArgCount('OnDisconnect.update', 1, 2, arguments.length);
|
||||||
|
if (Array.isArray(objectToMerge)) {
|
||||||
|
const newObjectToMerge = {};
|
||||||
|
for (let i = 0; i < objectToMerge.length; ++i) {
|
||||||
|
newObjectToMerge['' + i] = objectToMerge[i];
|
||||||
|
}
|
||||||
|
objectToMerge = newObjectToMerge;
|
||||||
|
warn('Passing an Array to firebase.database.onDisconnect().update() is deprecated. Use set() if you want to overwrite the ' +
|
||||||
|
'existing data, or an Object with integer keys if you really do want to only update some of the children.');
|
||||||
|
}
|
||||||
|
validateCallback('OnDisconnect.update', 'onComplete', onComplete, true);
|
||||||
|
const result = this._delegate.update(objectToMerge);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
class TransactionResult {
|
||||||
|
/**
|
||||||
|
* A type for the resolve value of Firebase.transaction.
|
||||||
|
*/
|
||||||
|
constructor(committed, snapshot) {
|
||||||
|
this.committed = committed;
|
||||||
|
this.snapshot = snapshot;
|
||||||
|
}
|
||||||
|
// Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary
|
||||||
|
// for end-users
|
||||||
|
toJSON() {
|
||||||
|
validateArgCount('TransactionResult.toJSON', 0, 1, arguments.length);
|
||||||
|
return { committed: this.committed, snapshot: this.snapshot.toJSON() };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Class representing a firebase data snapshot. It wraps a SnapshotNode and
|
||||||
|
* surfaces the public methods (val, forEach, etc.) we want to expose.
|
||||||
|
*/
|
||||||
|
class DataSnapshot {
|
||||||
|
constructor(_database, _delegate) {
|
||||||
|
this._database = _database;
|
||||||
|
this._delegate = _delegate;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Retrieves the snapshot contents as JSON. Returns null if the snapshot is
|
||||||
|
* empty.
|
||||||
|
*
|
||||||
|
* @returns JSON representation of the DataSnapshot contents, or null if empty.
|
||||||
|
*/
|
||||||
|
val() {
|
||||||
|
validateArgCount('DataSnapshot.val', 0, 0, arguments.length);
|
||||||
|
return this._delegate.val();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the snapshot contents as JSON, including priorities of node. Suitable for exporting
|
||||||
|
* the entire node contents.
|
||||||
|
* @returns JSON representation of the DataSnapshot contents, or null if empty.
|
||||||
|
*/
|
||||||
|
exportVal() {
|
||||||
|
validateArgCount('DataSnapshot.exportVal', 0, 0, arguments.length);
|
||||||
|
return this._delegate.exportVal();
|
||||||
|
}
|
||||||
|
// Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary
|
||||||
|
// for end-users
|
||||||
|
toJSON() {
|
||||||
|
// Optional spacer argument is unnecessary because we're depending on recursion rather than stringifying the content
|
||||||
|
validateArgCount('DataSnapshot.toJSON', 0, 1, arguments.length);
|
||||||
|
return this._delegate.toJSON();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns whether the snapshot contains a non-null value.
|
||||||
|
*
|
||||||
|
* @returns Whether the snapshot contains a non-null value, or is empty.
|
||||||
|
*/
|
||||||
|
exists() {
|
||||||
|
validateArgCount('DataSnapshot.exists', 0, 0, arguments.length);
|
||||||
|
return this._delegate.exists();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns a DataSnapshot of the specified child node's contents.
|
||||||
|
*
|
||||||
|
* @param path - Path to a child.
|
||||||
|
* @returns DataSnapshot for child node.
|
||||||
|
*/
|
||||||
|
child(path) {
|
||||||
|
validateArgCount('DataSnapshot.child', 0, 1, arguments.length);
|
||||||
|
// Ensure the childPath is a string (can be a number)
|
||||||
|
path = String(path);
|
||||||
|
_validatePathString('DataSnapshot.child', 'path', path, false);
|
||||||
|
return new DataSnapshot(this._database, this._delegate.child(path));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns whether the snapshot contains a child at the specified path.
|
||||||
|
*
|
||||||
|
* @param path - Path to a child.
|
||||||
|
* @returns Whether the child exists.
|
||||||
|
*/
|
||||||
|
hasChild(path) {
|
||||||
|
validateArgCount('DataSnapshot.hasChild', 1, 1, arguments.length);
|
||||||
|
_validatePathString('DataSnapshot.hasChild', 'path', path, false);
|
||||||
|
return this._delegate.hasChild(path);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the priority of the object, or null if no priority was set.
|
||||||
|
*
|
||||||
|
* @returns The priority.
|
||||||
|
*/
|
||||||
|
getPriority() {
|
||||||
|
validateArgCount('DataSnapshot.getPriority', 0, 0, arguments.length);
|
||||||
|
return this._delegate.priority;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Iterates through child nodes and calls the specified action for each one.
|
||||||
|
*
|
||||||
|
* @param action - Callback function to be called
|
||||||
|
* for each child.
|
||||||
|
* @returns True if forEach was canceled by action returning true for
|
||||||
|
* one of the child nodes.
|
||||||
|
*/
|
||||||
|
forEach(action) {
|
||||||
|
validateArgCount('DataSnapshot.forEach', 1, 1, arguments.length);
|
||||||
|
validateCallback('DataSnapshot.forEach', 'action', action, false);
|
||||||
|
return this._delegate.forEach(expDataSnapshot => action(new DataSnapshot(this._database, expDataSnapshot)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns whether this DataSnapshot has children.
|
||||||
|
* @returns True if the DataSnapshot contains 1 or more child nodes.
|
||||||
|
*/
|
||||||
|
hasChildren() {
|
||||||
|
validateArgCount('DataSnapshot.hasChildren', 0, 0, arguments.length);
|
||||||
|
return this._delegate.hasChildren();
|
||||||
|
}
|
||||||
|
get key() {
|
||||||
|
return this._delegate.key;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the number of children for this DataSnapshot.
|
||||||
|
* @returns The number of children that this DataSnapshot contains.
|
||||||
|
*/
|
||||||
|
numChildren() {
|
||||||
|
validateArgCount('DataSnapshot.numChildren', 0, 0, arguments.length);
|
||||||
|
return this._delegate.size;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @returns The Firebase reference for the location this snapshot's data came
|
||||||
|
* from.
|
||||||
|
*/
|
||||||
|
getRef() {
|
||||||
|
validateArgCount('DataSnapshot.ref', 0, 0, arguments.length);
|
||||||
|
return new Reference(this._database, this._delegate.ref);
|
||||||
|
}
|
||||||
|
get ref() {
|
||||||
|
return this.getRef();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* A Query represents a filter to be applied to a firebase location. This object purely represents the
|
||||||
|
* query expression (and exposes our public API to build the query). The actual query logic is in ViewBase.js.
|
||||||
|
*
|
||||||
|
* Since every Firebase reference is a query, Firebase inherits from this object.
|
||||||
|
*/
|
||||||
|
class Query {
|
||||||
|
constructor(database, _delegate) {
|
||||||
|
this.database = database;
|
||||||
|
this._delegate = _delegate;
|
||||||
|
}
|
||||||
|
on(eventType, callback, cancelCallbackOrContext, context) {
|
||||||
|
var _a;
|
||||||
|
validateArgCount('Query.on', 2, 4, arguments.length);
|
||||||
|
validateCallback('Query.on', 'callback', callback, false);
|
||||||
|
const ret = Query.getCancelAndContextArgs_('Query.on', cancelCallbackOrContext, context);
|
||||||
|
const valueCallback = (expSnapshot, previousChildName) => {
|
||||||
|
callback.call(ret.context, new DataSnapshot(this.database, expSnapshot), previousChildName);
|
||||||
|
};
|
||||||
|
valueCallback.userCallback = callback;
|
||||||
|
valueCallback.context = ret.context;
|
||||||
|
const cancelCallback = (_a = ret.cancel) === null || _a === void 0 ? void 0 : _a.bind(ret.context);
|
||||||
|
switch (eventType) {
|
||||||
|
case 'value':
|
||||||
|
onValue(this._delegate, valueCallback, cancelCallback);
|
||||||
|
return callback;
|
||||||
|
case 'child_added':
|
||||||
|
onChildAdded(this._delegate, valueCallback, cancelCallback);
|
||||||
|
return callback;
|
||||||
|
case 'child_removed':
|
||||||
|
onChildRemoved(this._delegate, valueCallback, cancelCallback);
|
||||||
|
return callback;
|
||||||
|
case 'child_changed':
|
||||||
|
onChildChanged(this._delegate, valueCallback, cancelCallback);
|
||||||
|
return callback;
|
||||||
|
case 'child_moved':
|
||||||
|
onChildMoved(this._delegate, valueCallback, cancelCallback);
|
||||||
|
return callback;
|
||||||
|
default:
|
||||||
|
throw new Error(errorPrefix('Query.on', 'eventType') +
|
||||||
|
'must be a valid event type = "value", "child_added", "child_removed", ' +
|
||||||
|
'"child_changed", or "child_moved".');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
off(eventType, callback, context) {
|
||||||
|
validateArgCount('Query.off', 0, 3, arguments.length);
|
||||||
|
validateEventType('Query.off', eventType, true);
|
||||||
|
validateCallback('Query.off', 'callback', callback, true);
|
||||||
|
validateContextObject('Query.off', 'context', context, true);
|
||||||
|
if (callback) {
|
||||||
|
const valueCallback = () => { };
|
||||||
|
valueCallback.userCallback = callback;
|
||||||
|
valueCallback.context = context;
|
||||||
|
off(this._delegate, eventType, valueCallback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
off(this._delegate, eventType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get the server-value for this query, or return a cached value if not connected.
|
||||||
|
*/
|
||||||
|
get() {
|
||||||
|
return get(this._delegate).then(expSnapshot => {
|
||||||
|
return new DataSnapshot(this.database, expSnapshot);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Attaches a listener, waits for the first event, and then removes the listener
|
||||||
|
*/
|
||||||
|
once(eventType, callback, failureCallbackOrContext, context) {
|
||||||
|
validateArgCount('Query.once', 1, 4, arguments.length);
|
||||||
|
validateCallback('Query.once', 'callback', callback, true);
|
||||||
|
const ret = Query.getCancelAndContextArgs_('Query.once', failureCallbackOrContext, context);
|
||||||
|
const deferred = new Deferred();
|
||||||
|
const valueCallback = (expSnapshot, previousChildName) => {
|
||||||
|
const result = new DataSnapshot(this.database, expSnapshot);
|
||||||
|
if (callback) {
|
||||||
|
callback.call(ret.context, result, previousChildName);
|
||||||
|
}
|
||||||
|
deferred.resolve(result);
|
||||||
|
};
|
||||||
|
valueCallback.userCallback = callback;
|
||||||
|
valueCallback.context = ret.context;
|
||||||
|
const cancelCallback = (error) => {
|
||||||
|
if (ret.cancel) {
|
||||||
|
ret.cancel.call(ret.context, error);
|
||||||
|
}
|
||||||
|
deferred.reject(error);
|
||||||
|
};
|
||||||
|
switch (eventType) {
|
||||||
|
case 'value':
|
||||||
|
onValue(this._delegate, valueCallback, cancelCallback, {
|
||||||
|
onlyOnce: true
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'child_added':
|
||||||
|
onChildAdded(this._delegate, valueCallback, cancelCallback, {
|
||||||
|
onlyOnce: true
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'child_removed':
|
||||||
|
onChildRemoved(this._delegate, valueCallback, cancelCallback, {
|
||||||
|
onlyOnce: true
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'child_changed':
|
||||||
|
onChildChanged(this._delegate, valueCallback, cancelCallback, {
|
||||||
|
onlyOnce: true
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'child_moved':
|
||||||
|
onChildMoved(this._delegate, valueCallback, cancelCallback, {
|
||||||
|
onlyOnce: true
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(errorPrefix('Query.once', 'eventType') +
|
||||||
|
'must be a valid event type = "value", "child_added", "child_removed", ' +
|
||||||
|
'"child_changed", or "child_moved".');
|
||||||
|
}
|
||||||
|
return deferred.promise;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set a limit and anchor it to the start of the window.
|
||||||
|
*/
|
||||||
|
limitToFirst(limit) {
|
||||||
|
validateArgCount('Query.limitToFirst', 1, 1, arguments.length);
|
||||||
|
return new Query(this.database, query(this._delegate, limitToFirst(limit)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set a limit and anchor it to the end of the window.
|
||||||
|
*/
|
||||||
|
limitToLast(limit) {
|
||||||
|
validateArgCount('Query.limitToLast', 1, 1, arguments.length);
|
||||||
|
return new Query(this.database, query(this._delegate, limitToLast(limit)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Given a child path, return a new query ordered by the specified grandchild path.
|
||||||
|
*/
|
||||||
|
orderByChild(path) {
|
||||||
|
validateArgCount('Query.orderByChild', 1, 1, arguments.length);
|
||||||
|
return new Query(this.database, query(this._delegate, orderByChild(path)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return a new query ordered by the KeyIndex
|
||||||
|
*/
|
||||||
|
orderByKey() {
|
||||||
|
validateArgCount('Query.orderByKey', 0, 0, arguments.length);
|
||||||
|
return new Query(this.database, query(this._delegate, orderByKey()));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return a new query ordered by the PriorityIndex
|
||||||
|
*/
|
||||||
|
orderByPriority() {
|
||||||
|
validateArgCount('Query.orderByPriority', 0, 0, arguments.length);
|
||||||
|
return new Query(this.database, query(this._delegate, orderByPriority()));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return a new query ordered by the ValueIndex
|
||||||
|
*/
|
||||||
|
orderByValue() {
|
||||||
|
validateArgCount('Query.orderByValue', 0, 0, arguments.length);
|
||||||
|
return new Query(this.database, query(this._delegate, orderByValue()));
|
||||||
|
}
|
||||||
|
startAt(value = null, name) {
|
||||||
|
validateArgCount('Query.startAt', 0, 2, arguments.length);
|
||||||
|
return new Query(this.database, query(this._delegate, startAt(value, name)));
|
||||||
|
}
|
||||||
|
startAfter(value = null, name) {
|
||||||
|
validateArgCount('Query.startAfter', 0, 2, arguments.length);
|
||||||
|
return new Query(this.database, query(this._delegate, startAfter(value, name)));
|
||||||
|
}
|
||||||
|
endAt(value = null, name) {
|
||||||
|
validateArgCount('Query.endAt', 0, 2, arguments.length);
|
||||||
|
return new Query(this.database, query(this._delegate, endAt(value, name)));
|
||||||
|
}
|
||||||
|
endBefore(value = null, name) {
|
||||||
|
validateArgCount('Query.endBefore', 0, 2, arguments.length);
|
||||||
|
return new Query(this.database, query(this._delegate, endBefore(value, name)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Load the selection of children with exactly the specified value, and, optionally,
|
||||||
|
* the specified name.
|
||||||
|
*/
|
||||||
|
equalTo(value, name) {
|
||||||
|
validateArgCount('Query.equalTo', 1, 2, arguments.length);
|
||||||
|
return new Query(this.database, query(this._delegate, equalTo(value, name)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @returns URL for this location.
|
||||||
|
*/
|
||||||
|
toString() {
|
||||||
|
validateArgCount('Query.toString', 0, 0, arguments.length);
|
||||||
|
return this._delegate.toString();
|
||||||
|
}
|
||||||
|
// Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary
|
||||||
|
// for end-users.
|
||||||
|
toJSON() {
|
||||||
|
// An optional spacer argument is unnecessary for a string.
|
||||||
|
validateArgCount('Query.toJSON', 0, 1, arguments.length);
|
||||||
|
return this._delegate.toJSON();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return true if this query and the provided query are equivalent; otherwise, return false.
|
||||||
|
*/
|
||||||
|
isEqual(other) {
|
||||||
|
validateArgCount('Query.isEqual', 1, 1, arguments.length);
|
||||||
|
if (!(other instanceof Query)) {
|
||||||
|
const error = 'Query.isEqual failed: First argument must be an instance of firebase.database.Query.';
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
|
return this._delegate.isEqual(other._delegate);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Helper used by .on and .once to extract the context and or cancel arguments.
|
||||||
|
* @param fnName - The function name (on or once)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static getCancelAndContextArgs_(fnName, cancelOrContext, context) {
|
||||||
|
const ret = { cancel: undefined, context: undefined };
|
||||||
|
if (cancelOrContext && context) {
|
||||||
|
ret.cancel = cancelOrContext;
|
||||||
|
validateCallback(fnName, 'cancel', ret.cancel, true);
|
||||||
|
ret.context = context;
|
||||||
|
validateContextObject(fnName, 'context', ret.context, true);
|
||||||
|
}
|
||||||
|
else if (cancelOrContext) {
|
||||||
|
// we have either a cancel callback or a context.
|
||||||
|
if (typeof cancelOrContext === 'object' && cancelOrContext !== null) {
|
||||||
|
// it's a context!
|
||||||
|
ret.context = cancelOrContext;
|
||||||
|
}
|
||||||
|
else if (typeof cancelOrContext === 'function') {
|
||||||
|
ret.cancel = cancelOrContext;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new Error(errorPrefix(fnName, 'cancelOrContext') +
|
||||||
|
' must either be a cancel callback or a context object.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
get ref() {
|
||||||
|
return new Reference(this.database, new _ReferenceImpl(this._delegate._repo, this._delegate._path));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class Reference extends Query {
|
||||||
|
/**
|
||||||
|
* Call options:
|
||||||
|
* new Reference(Repo, Path) or
|
||||||
|
* new Reference(url: string, string|RepoManager)
|
||||||
|
*
|
||||||
|
* Externally - this is the firebase.database.Reference type.
|
||||||
|
*/
|
||||||
|
constructor(database, _delegate) {
|
||||||
|
super(database, new _QueryImpl(_delegate._repo, _delegate._path, new _QueryParams(), false));
|
||||||
|
this.database = database;
|
||||||
|
this._delegate = _delegate;
|
||||||
|
}
|
||||||
|
/** @returns {?string} */
|
||||||
|
getKey() {
|
||||||
|
validateArgCount('Reference.key', 0, 0, arguments.length);
|
||||||
|
return this._delegate.key;
|
||||||
|
}
|
||||||
|
child(pathString) {
|
||||||
|
validateArgCount('Reference.child', 1, 1, arguments.length);
|
||||||
|
if (typeof pathString === 'number') {
|
||||||
|
pathString = String(pathString);
|
||||||
|
}
|
||||||
|
return new Reference(this.database, child(this._delegate, pathString));
|
||||||
|
}
|
||||||
|
/** @returns {?Reference} */
|
||||||
|
getParent() {
|
||||||
|
validateArgCount('Reference.parent', 0, 0, arguments.length);
|
||||||
|
const parent = this._delegate.parent;
|
||||||
|
return parent ? new Reference(this.database, parent) : null;
|
||||||
|
}
|
||||||
|
/** @returns {!Reference} */
|
||||||
|
getRoot() {
|
||||||
|
validateArgCount('Reference.root', 0, 0, arguments.length);
|
||||||
|
return new Reference(this.database, this._delegate.root);
|
||||||
|
}
|
||||||
|
set(newVal, onComplete) {
|
||||||
|
validateArgCount('Reference.set', 1, 2, arguments.length);
|
||||||
|
validateCallback('Reference.set', 'onComplete', onComplete, true);
|
||||||
|
const result = set(this._delegate, newVal);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
update(values, onComplete) {
|
||||||
|
validateArgCount('Reference.update', 1, 2, arguments.length);
|
||||||
|
if (Array.isArray(values)) {
|
||||||
|
const newObjectToMerge = {};
|
||||||
|
for (let i = 0; i < values.length; ++i) {
|
||||||
|
newObjectToMerge['' + i] = values[i];
|
||||||
|
}
|
||||||
|
values = newObjectToMerge;
|
||||||
|
warn('Passing an Array to Firebase.update() is deprecated. ' +
|
||||||
|
'Use set() if you want to overwrite the existing data, or ' +
|
||||||
|
'an Object with integer keys if you really do want to ' +
|
||||||
|
'only update some of the children.');
|
||||||
|
}
|
||||||
|
_validateWritablePath('Reference.update', this._delegate._path);
|
||||||
|
validateCallback('Reference.update', 'onComplete', onComplete, true);
|
||||||
|
const result = update(this._delegate, values);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
setWithPriority(newVal, newPriority, onComplete) {
|
||||||
|
validateArgCount('Reference.setWithPriority', 2, 3, arguments.length);
|
||||||
|
validateCallback('Reference.setWithPriority', 'onComplete', onComplete, true);
|
||||||
|
const result = setWithPriority(this._delegate, newVal, newPriority);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
remove(onComplete) {
|
||||||
|
validateArgCount('Reference.remove', 0, 1, arguments.length);
|
||||||
|
validateCallback('Reference.remove', 'onComplete', onComplete, true);
|
||||||
|
const result = remove(this._delegate);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
transaction(transactionUpdate, onComplete, applyLocally) {
|
||||||
|
validateArgCount('Reference.transaction', 1, 3, arguments.length);
|
||||||
|
validateCallback('Reference.transaction', 'transactionUpdate', transactionUpdate, false);
|
||||||
|
validateCallback('Reference.transaction', 'onComplete', onComplete, true);
|
||||||
|
validateBoolean('Reference.transaction', 'applyLocally', applyLocally, true);
|
||||||
|
const result = runTransaction(this._delegate, transactionUpdate, {
|
||||||
|
applyLocally
|
||||||
|
}).then(transactionResult => new TransactionResult(transactionResult.committed, new DataSnapshot(this.database, transactionResult.snapshot)));
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(transactionResult => onComplete(null, transactionResult.committed, transactionResult.snapshot), error => onComplete(error, false, null));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
setPriority(priority, onComplete) {
|
||||||
|
validateArgCount('Reference.setPriority', 1, 2, arguments.length);
|
||||||
|
validateCallback('Reference.setPriority', 'onComplete', onComplete, true);
|
||||||
|
const result = setPriority(this._delegate, priority);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
push(value, onComplete) {
|
||||||
|
validateArgCount('Reference.push', 0, 2, arguments.length);
|
||||||
|
validateCallback('Reference.push', 'onComplete', onComplete, true);
|
||||||
|
const expPromise = push(this._delegate, value);
|
||||||
|
const promise = expPromise.then(expRef => new Reference(this.database, expRef));
|
||||||
|
if (onComplete) {
|
||||||
|
promise.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
const result = new Reference(this.database, expPromise);
|
||||||
|
result.then = promise.then.bind(promise);
|
||||||
|
result.catch = promise.catch.bind(promise, undefined);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
onDisconnect() {
|
||||||
|
_validateWritablePath('Reference.onDisconnect', this._delegate._path);
|
||||||
|
return new OnDisconnect(new OnDisconnect$1(this._delegate._repo, this._delegate._path));
|
||||||
|
}
|
||||||
|
get key() {
|
||||||
|
return this.getKey();
|
||||||
|
}
|
||||||
|
get parent() {
|
||||||
|
return this.getParent();
|
||||||
|
}
|
||||||
|
get root() {
|
||||||
|
return this.getRoot();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Class representing a firebase database.
|
||||||
|
*/
|
||||||
|
class Database {
|
||||||
|
/**
|
||||||
|
* The constructor should not be called by users of our public API.
|
||||||
|
*/
|
||||||
|
constructor(_delegate, app) {
|
||||||
|
this._delegate = _delegate;
|
||||||
|
this.app = app;
|
||||||
|
this.INTERNAL = {
|
||||||
|
delete: () => this._delegate._delete(),
|
||||||
|
forceWebSockets,
|
||||||
|
forceLongPolling
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Modify this instance to communicate with the Realtime Database emulator.
|
||||||
|
*
|
||||||
|
* <p>Note: This method must be called before performing any other operation.
|
||||||
|
*
|
||||||
|
* @param host - the emulator host (ex: localhost)
|
||||||
|
* @param port - the emulator port (ex: 8080)
|
||||||
|
* @param options.mockUserToken - the mock auth token to use for unit testing Security Rules
|
||||||
|
*/
|
||||||
|
useEmulator(host, port, options = {}) {
|
||||||
|
connectDatabaseEmulator(this._delegate, host, port, options);
|
||||||
|
}
|
||||||
|
ref(path) {
|
||||||
|
validateArgCount('database.ref', 0, 1, arguments.length);
|
||||||
|
if (path instanceof Reference) {
|
||||||
|
const childRef = refFromURL(this._delegate, path.toString());
|
||||||
|
return new Reference(this, childRef);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const childRef = ref(this._delegate, path);
|
||||||
|
return new Reference(this, childRef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns a reference to the root or the path specified in url.
|
||||||
|
* We throw a exception if the url is not in the same domain as the
|
||||||
|
* current repo.
|
||||||
|
* @returns Firebase reference.
|
||||||
|
*/
|
||||||
|
refFromURL(url) {
|
||||||
|
const apiName = 'database.refFromURL';
|
||||||
|
validateArgCount(apiName, 1, 1, arguments.length);
|
||||||
|
const childRef = refFromURL(this._delegate, url);
|
||||||
|
return new Reference(this, childRef);
|
||||||
|
}
|
||||||
|
// Make individual repo go offline.
|
||||||
|
goOffline() {
|
||||||
|
validateArgCount('database.goOffline', 0, 0, arguments.length);
|
||||||
|
return goOffline(this._delegate);
|
||||||
|
}
|
||||||
|
goOnline() {
|
||||||
|
validateArgCount('database.goOnline', 0, 0, arguments.length);
|
||||||
|
return goOnline(this._delegate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Database.ServerValue = {
|
||||||
|
TIMESTAMP: serverTimestamp(),
|
||||||
|
increment: (delta) => increment(delta)
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used by console to create a database based on the app,
|
||||||
|
* passed database URL and a custom auth implementation.
|
||||||
|
*
|
||||||
|
* @param app - A valid FirebaseApp-like object
|
||||||
|
* @param url - A valid Firebase databaseURL
|
||||||
|
* @param version - custom version e.g. firebase-admin version
|
||||||
|
* @param customAuthImpl - custom auth implementation
|
||||||
|
*/
|
||||||
|
function initStandalone({ app, url, version, customAuthImpl, customAppCheckImpl, namespace, nodeAdmin = false }) {
|
||||||
|
_setSDKVersion(version);
|
||||||
|
const container = new ComponentContainer('database-standalone');
|
||||||
|
/**
|
||||||
|
* ComponentContainer('database-standalone') is just a placeholder that doesn't perform
|
||||||
|
* any actual function.
|
||||||
|
*/
|
||||||
|
const authProvider = new Provider('auth-internal', container);
|
||||||
|
authProvider.setComponent(new Component('auth-internal', () => customAuthImpl, "PRIVATE" /* ComponentType.PRIVATE */));
|
||||||
|
let appCheckProvider = undefined;
|
||||||
|
if (customAppCheckImpl) {
|
||||||
|
appCheckProvider = new Provider('app-check-internal', container);
|
||||||
|
appCheckProvider.setComponent(new Component('app-check-internal', () => customAppCheckImpl, "PRIVATE" /* ComponentType.PRIVATE */));
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
instance: new Database(_repoManagerDatabaseFromApp(app, authProvider, appCheckProvider, url, nodeAdmin), app),
|
||||||
|
namespace
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var INTERNAL = /*#__PURE__*/Object.freeze({
|
||||||
|
__proto__: null,
|
||||||
|
initStandalone: initStandalone
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
const ServerValue = Database.ServerValue;
|
||||||
|
function registerDatabase(instance) {
|
||||||
|
// Register the Database Service with the 'firebase' namespace.
|
||||||
|
instance.INTERNAL.registerComponent(new Component('database-compat', (container, { instanceIdentifier: url }) => {
|
||||||
|
/* Dependencies */
|
||||||
|
// getImmediate for FirebaseApp will always succeed
|
||||||
|
const app = container.getProvider('app-compat').getImmediate();
|
||||||
|
const databaseExp = container
|
||||||
|
.getProvider('database')
|
||||||
|
.getImmediate({ identifier: url });
|
||||||
|
return new Database(databaseExp, app);
|
||||||
|
}, "PUBLIC" /* ComponentType.PUBLIC */)
|
||||||
|
.setServiceProps(
|
||||||
|
// firebase.database namespace properties
|
||||||
|
{
|
||||||
|
Reference,
|
||||||
|
Query,
|
||||||
|
Database,
|
||||||
|
DataSnapshot,
|
||||||
|
enableLogging,
|
||||||
|
INTERNAL,
|
||||||
|
ServerValue
|
||||||
|
})
|
||||||
|
.setMultipleInstances(true));
|
||||||
|
instance.registerVersion(name, version);
|
||||||
|
}
|
||||||
|
registerDatabase(firebase);
|
||||||
|
|
||||||
|
export { registerDatabase };
|
||||||
|
//# sourceMappingURL=index.esm2017.js.map
|
||||||
1
node_modules/@firebase/database-compat/dist/index.esm2017.js.map
generated
vendored
Normal file
1
node_modules/@firebase/database-compat/dist/index.esm2017.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
865
node_modules/@firebase/database-compat/dist/index.js
generated
vendored
Normal file
865
node_modules/@firebase/database-compat/dist/index.js
generated
vendored
Normal file
@@ -0,0 +1,865 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var firebase = require('@firebase/app-compat');
|
||||||
|
var component = require('@firebase/component');
|
||||||
|
var database = require('@firebase/database');
|
||||||
|
var util = require('@firebase/util');
|
||||||
|
var logger = require('@firebase/logger');
|
||||||
|
|
||||||
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
||||||
|
|
||||||
|
var firebase__default = /*#__PURE__*/_interopDefaultLegacy(firebase);
|
||||||
|
|
||||||
|
const name = "@firebase/database-compat";
|
||||||
|
const version = "2.0.6";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
const logClient = new logger.Logger('@firebase/database-compat');
|
||||||
|
const warn = function (msg) {
|
||||||
|
const message = 'FIREBASE WARNING: ' + msg;
|
||||||
|
logClient.warn(message);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
const validateBoolean = function (fnName, argumentName, bool, optional) {
|
||||||
|
if (optional && bool === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (typeof bool !== 'boolean') {
|
||||||
|
throw new Error(util.errorPrefix(fnName, argumentName) + 'must be a boolean.');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const validateEventType = function (fnName, eventType, optional) {
|
||||||
|
if (optional && eventType === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (eventType) {
|
||||||
|
case 'value':
|
||||||
|
case 'child_added':
|
||||||
|
case 'child_removed':
|
||||||
|
case 'child_changed':
|
||||||
|
case 'child_moved':
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(util.errorPrefix(fnName, 'eventType') +
|
||||||
|
'must be a valid event type = "value", "child_added", "child_removed", ' +
|
||||||
|
'"child_changed", or "child_moved".');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
class OnDisconnect {
|
||||||
|
constructor(_delegate) {
|
||||||
|
this._delegate = _delegate;
|
||||||
|
}
|
||||||
|
cancel(onComplete) {
|
||||||
|
util.validateArgCount('OnDisconnect.cancel', 0, 1, arguments.length);
|
||||||
|
util.validateCallback('OnDisconnect.cancel', 'onComplete', onComplete, true);
|
||||||
|
const result = this._delegate.cancel();
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
remove(onComplete) {
|
||||||
|
util.validateArgCount('OnDisconnect.remove', 0, 1, arguments.length);
|
||||||
|
util.validateCallback('OnDisconnect.remove', 'onComplete', onComplete, true);
|
||||||
|
const result = this._delegate.remove();
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
set(value, onComplete) {
|
||||||
|
util.validateArgCount('OnDisconnect.set', 1, 2, arguments.length);
|
||||||
|
util.validateCallback('OnDisconnect.set', 'onComplete', onComplete, true);
|
||||||
|
const result = this._delegate.set(value);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
setWithPriority(value, priority, onComplete) {
|
||||||
|
util.validateArgCount('OnDisconnect.setWithPriority', 2, 3, arguments.length);
|
||||||
|
util.validateCallback('OnDisconnect.setWithPriority', 'onComplete', onComplete, true);
|
||||||
|
const result = this._delegate.setWithPriority(value, priority);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
update(objectToMerge, onComplete) {
|
||||||
|
util.validateArgCount('OnDisconnect.update', 1, 2, arguments.length);
|
||||||
|
if (Array.isArray(objectToMerge)) {
|
||||||
|
const newObjectToMerge = {};
|
||||||
|
for (let i = 0; i < objectToMerge.length; ++i) {
|
||||||
|
newObjectToMerge['' + i] = objectToMerge[i];
|
||||||
|
}
|
||||||
|
objectToMerge = newObjectToMerge;
|
||||||
|
warn('Passing an Array to firebase.database.onDisconnect().update() is deprecated. Use set() if you want to overwrite the ' +
|
||||||
|
'existing data, or an Object with integer keys if you really do want to only update some of the children.');
|
||||||
|
}
|
||||||
|
util.validateCallback('OnDisconnect.update', 'onComplete', onComplete, true);
|
||||||
|
const result = this._delegate.update(objectToMerge);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
class TransactionResult {
|
||||||
|
/**
|
||||||
|
* A type for the resolve value of Firebase.transaction.
|
||||||
|
*/
|
||||||
|
constructor(committed, snapshot) {
|
||||||
|
this.committed = committed;
|
||||||
|
this.snapshot = snapshot;
|
||||||
|
}
|
||||||
|
// Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary
|
||||||
|
// for end-users
|
||||||
|
toJSON() {
|
||||||
|
util.validateArgCount('TransactionResult.toJSON', 0, 1, arguments.length);
|
||||||
|
return { committed: this.committed, snapshot: this.snapshot.toJSON() };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Class representing a firebase data snapshot. It wraps a SnapshotNode and
|
||||||
|
* surfaces the public methods (val, forEach, etc.) we want to expose.
|
||||||
|
*/
|
||||||
|
class DataSnapshot {
|
||||||
|
constructor(_database, _delegate) {
|
||||||
|
this._database = _database;
|
||||||
|
this._delegate = _delegate;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Retrieves the snapshot contents as JSON. Returns null if the snapshot is
|
||||||
|
* empty.
|
||||||
|
*
|
||||||
|
* @returns JSON representation of the DataSnapshot contents, or null if empty.
|
||||||
|
*/
|
||||||
|
val() {
|
||||||
|
util.validateArgCount('DataSnapshot.val', 0, 0, arguments.length);
|
||||||
|
return this._delegate.val();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the snapshot contents as JSON, including priorities of node. Suitable for exporting
|
||||||
|
* the entire node contents.
|
||||||
|
* @returns JSON representation of the DataSnapshot contents, or null if empty.
|
||||||
|
*/
|
||||||
|
exportVal() {
|
||||||
|
util.validateArgCount('DataSnapshot.exportVal', 0, 0, arguments.length);
|
||||||
|
return this._delegate.exportVal();
|
||||||
|
}
|
||||||
|
// Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary
|
||||||
|
// for end-users
|
||||||
|
toJSON() {
|
||||||
|
// Optional spacer argument is unnecessary because we're depending on recursion rather than stringifying the content
|
||||||
|
util.validateArgCount('DataSnapshot.toJSON', 0, 1, arguments.length);
|
||||||
|
return this._delegate.toJSON();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns whether the snapshot contains a non-null value.
|
||||||
|
*
|
||||||
|
* @returns Whether the snapshot contains a non-null value, or is empty.
|
||||||
|
*/
|
||||||
|
exists() {
|
||||||
|
util.validateArgCount('DataSnapshot.exists', 0, 0, arguments.length);
|
||||||
|
return this._delegate.exists();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns a DataSnapshot of the specified child node's contents.
|
||||||
|
*
|
||||||
|
* @param path - Path to a child.
|
||||||
|
* @returns DataSnapshot for child node.
|
||||||
|
*/
|
||||||
|
child(path) {
|
||||||
|
util.validateArgCount('DataSnapshot.child', 0, 1, arguments.length);
|
||||||
|
// Ensure the childPath is a string (can be a number)
|
||||||
|
path = String(path);
|
||||||
|
database._validatePathString('DataSnapshot.child', 'path', path, false);
|
||||||
|
return new DataSnapshot(this._database, this._delegate.child(path));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns whether the snapshot contains a child at the specified path.
|
||||||
|
*
|
||||||
|
* @param path - Path to a child.
|
||||||
|
* @returns Whether the child exists.
|
||||||
|
*/
|
||||||
|
hasChild(path) {
|
||||||
|
util.validateArgCount('DataSnapshot.hasChild', 1, 1, arguments.length);
|
||||||
|
database._validatePathString('DataSnapshot.hasChild', 'path', path, false);
|
||||||
|
return this._delegate.hasChild(path);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the priority of the object, or null if no priority was set.
|
||||||
|
*
|
||||||
|
* @returns The priority.
|
||||||
|
*/
|
||||||
|
getPriority() {
|
||||||
|
util.validateArgCount('DataSnapshot.getPriority', 0, 0, arguments.length);
|
||||||
|
return this._delegate.priority;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Iterates through child nodes and calls the specified action for each one.
|
||||||
|
*
|
||||||
|
* @param action - Callback function to be called
|
||||||
|
* for each child.
|
||||||
|
* @returns True if forEach was canceled by action returning true for
|
||||||
|
* one of the child nodes.
|
||||||
|
*/
|
||||||
|
forEach(action) {
|
||||||
|
util.validateArgCount('DataSnapshot.forEach', 1, 1, arguments.length);
|
||||||
|
util.validateCallback('DataSnapshot.forEach', 'action', action, false);
|
||||||
|
return this._delegate.forEach(expDataSnapshot => action(new DataSnapshot(this._database, expDataSnapshot)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns whether this DataSnapshot has children.
|
||||||
|
* @returns True if the DataSnapshot contains 1 or more child nodes.
|
||||||
|
*/
|
||||||
|
hasChildren() {
|
||||||
|
util.validateArgCount('DataSnapshot.hasChildren', 0, 0, arguments.length);
|
||||||
|
return this._delegate.hasChildren();
|
||||||
|
}
|
||||||
|
get key() {
|
||||||
|
return this._delegate.key;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the number of children for this DataSnapshot.
|
||||||
|
* @returns The number of children that this DataSnapshot contains.
|
||||||
|
*/
|
||||||
|
numChildren() {
|
||||||
|
util.validateArgCount('DataSnapshot.numChildren', 0, 0, arguments.length);
|
||||||
|
return this._delegate.size;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @returns The Firebase reference for the location this snapshot's data came
|
||||||
|
* from.
|
||||||
|
*/
|
||||||
|
getRef() {
|
||||||
|
util.validateArgCount('DataSnapshot.ref', 0, 0, arguments.length);
|
||||||
|
return new Reference(this._database, this._delegate.ref);
|
||||||
|
}
|
||||||
|
get ref() {
|
||||||
|
return this.getRef();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* A Query represents a filter to be applied to a firebase location. This object purely represents the
|
||||||
|
* query expression (and exposes our public API to build the query). The actual query logic is in ViewBase.js.
|
||||||
|
*
|
||||||
|
* Since every Firebase reference is a query, Firebase inherits from this object.
|
||||||
|
*/
|
||||||
|
class Query {
|
||||||
|
constructor(database, _delegate) {
|
||||||
|
this.database = database;
|
||||||
|
this._delegate = _delegate;
|
||||||
|
}
|
||||||
|
on(eventType, callback, cancelCallbackOrContext, context) {
|
||||||
|
var _a;
|
||||||
|
util.validateArgCount('Query.on', 2, 4, arguments.length);
|
||||||
|
util.validateCallback('Query.on', 'callback', callback, false);
|
||||||
|
const ret = Query.getCancelAndContextArgs_('Query.on', cancelCallbackOrContext, context);
|
||||||
|
const valueCallback = (expSnapshot, previousChildName) => {
|
||||||
|
callback.call(ret.context, new DataSnapshot(this.database, expSnapshot), previousChildName);
|
||||||
|
};
|
||||||
|
valueCallback.userCallback = callback;
|
||||||
|
valueCallback.context = ret.context;
|
||||||
|
const cancelCallback = (_a = ret.cancel) === null || _a === void 0 ? void 0 : _a.bind(ret.context);
|
||||||
|
switch (eventType) {
|
||||||
|
case 'value':
|
||||||
|
database.onValue(this._delegate, valueCallback, cancelCallback);
|
||||||
|
return callback;
|
||||||
|
case 'child_added':
|
||||||
|
database.onChildAdded(this._delegate, valueCallback, cancelCallback);
|
||||||
|
return callback;
|
||||||
|
case 'child_removed':
|
||||||
|
database.onChildRemoved(this._delegate, valueCallback, cancelCallback);
|
||||||
|
return callback;
|
||||||
|
case 'child_changed':
|
||||||
|
database.onChildChanged(this._delegate, valueCallback, cancelCallback);
|
||||||
|
return callback;
|
||||||
|
case 'child_moved':
|
||||||
|
database.onChildMoved(this._delegate, valueCallback, cancelCallback);
|
||||||
|
return callback;
|
||||||
|
default:
|
||||||
|
throw new Error(util.errorPrefix('Query.on', 'eventType') +
|
||||||
|
'must be a valid event type = "value", "child_added", "child_removed", ' +
|
||||||
|
'"child_changed", or "child_moved".');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
off(eventType, callback, context) {
|
||||||
|
util.validateArgCount('Query.off', 0, 3, arguments.length);
|
||||||
|
validateEventType('Query.off', eventType, true);
|
||||||
|
util.validateCallback('Query.off', 'callback', callback, true);
|
||||||
|
util.validateContextObject('Query.off', 'context', context, true);
|
||||||
|
if (callback) {
|
||||||
|
const valueCallback = () => { };
|
||||||
|
valueCallback.userCallback = callback;
|
||||||
|
valueCallback.context = context;
|
||||||
|
database.off(this._delegate, eventType, valueCallback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
database.off(this._delegate, eventType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get the server-value for this query, or return a cached value if not connected.
|
||||||
|
*/
|
||||||
|
get() {
|
||||||
|
return database.get(this._delegate).then(expSnapshot => {
|
||||||
|
return new DataSnapshot(this.database, expSnapshot);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Attaches a listener, waits for the first event, and then removes the listener
|
||||||
|
*/
|
||||||
|
once(eventType, callback, failureCallbackOrContext, context) {
|
||||||
|
util.validateArgCount('Query.once', 1, 4, arguments.length);
|
||||||
|
util.validateCallback('Query.once', 'callback', callback, true);
|
||||||
|
const ret = Query.getCancelAndContextArgs_('Query.once', failureCallbackOrContext, context);
|
||||||
|
const deferred = new util.Deferred();
|
||||||
|
const valueCallback = (expSnapshot, previousChildName) => {
|
||||||
|
const result = new DataSnapshot(this.database, expSnapshot);
|
||||||
|
if (callback) {
|
||||||
|
callback.call(ret.context, result, previousChildName);
|
||||||
|
}
|
||||||
|
deferred.resolve(result);
|
||||||
|
};
|
||||||
|
valueCallback.userCallback = callback;
|
||||||
|
valueCallback.context = ret.context;
|
||||||
|
const cancelCallback = (error) => {
|
||||||
|
if (ret.cancel) {
|
||||||
|
ret.cancel.call(ret.context, error);
|
||||||
|
}
|
||||||
|
deferred.reject(error);
|
||||||
|
};
|
||||||
|
switch (eventType) {
|
||||||
|
case 'value':
|
||||||
|
database.onValue(this._delegate, valueCallback, cancelCallback, {
|
||||||
|
onlyOnce: true
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'child_added':
|
||||||
|
database.onChildAdded(this._delegate, valueCallback, cancelCallback, {
|
||||||
|
onlyOnce: true
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'child_removed':
|
||||||
|
database.onChildRemoved(this._delegate, valueCallback, cancelCallback, {
|
||||||
|
onlyOnce: true
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'child_changed':
|
||||||
|
database.onChildChanged(this._delegate, valueCallback, cancelCallback, {
|
||||||
|
onlyOnce: true
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'child_moved':
|
||||||
|
database.onChildMoved(this._delegate, valueCallback, cancelCallback, {
|
||||||
|
onlyOnce: true
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(util.errorPrefix('Query.once', 'eventType') +
|
||||||
|
'must be a valid event type = "value", "child_added", "child_removed", ' +
|
||||||
|
'"child_changed", or "child_moved".');
|
||||||
|
}
|
||||||
|
return deferred.promise;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set a limit and anchor it to the start of the window.
|
||||||
|
*/
|
||||||
|
limitToFirst(limit) {
|
||||||
|
util.validateArgCount('Query.limitToFirst', 1, 1, arguments.length);
|
||||||
|
return new Query(this.database, database.query(this._delegate, database.limitToFirst(limit)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set a limit and anchor it to the end of the window.
|
||||||
|
*/
|
||||||
|
limitToLast(limit) {
|
||||||
|
util.validateArgCount('Query.limitToLast', 1, 1, arguments.length);
|
||||||
|
return new Query(this.database, database.query(this._delegate, database.limitToLast(limit)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Given a child path, return a new query ordered by the specified grandchild path.
|
||||||
|
*/
|
||||||
|
orderByChild(path) {
|
||||||
|
util.validateArgCount('Query.orderByChild', 1, 1, arguments.length);
|
||||||
|
return new Query(this.database, database.query(this._delegate, database.orderByChild(path)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return a new query ordered by the KeyIndex
|
||||||
|
*/
|
||||||
|
orderByKey() {
|
||||||
|
util.validateArgCount('Query.orderByKey', 0, 0, arguments.length);
|
||||||
|
return new Query(this.database, database.query(this._delegate, database.orderByKey()));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return a new query ordered by the PriorityIndex
|
||||||
|
*/
|
||||||
|
orderByPriority() {
|
||||||
|
util.validateArgCount('Query.orderByPriority', 0, 0, arguments.length);
|
||||||
|
return new Query(this.database, database.query(this._delegate, database.orderByPriority()));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return a new query ordered by the ValueIndex
|
||||||
|
*/
|
||||||
|
orderByValue() {
|
||||||
|
util.validateArgCount('Query.orderByValue', 0, 0, arguments.length);
|
||||||
|
return new Query(this.database, database.query(this._delegate, database.orderByValue()));
|
||||||
|
}
|
||||||
|
startAt(value = null, name) {
|
||||||
|
util.validateArgCount('Query.startAt', 0, 2, arguments.length);
|
||||||
|
return new Query(this.database, database.query(this._delegate, database.startAt(value, name)));
|
||||||
|
}
|
||||||
|
startAfter(value = null, name) {
|
||||||
|
util.validateArgCount('Query.startAfter', 0, 2, arguments.length);
|
||||||
|
return new Query(this.database, database.query(this._delegate, database.startAfter(value, name)));
|
||||||
|
}
|
||||||
|
endAt(value = null, name) {
|
||||||
|
util.validateArgCount('Query.endAt', 0, 2, arguments.length);
|
||||||
|
return new Query(this.database, database.query(this._delegate, database.endAt(value, name)));
|
||||||
|
}
|
||||||
|
endBefore(value = null, name) {
|
||||||
|
util.validateArgCount('Query.endBefore', 0, 2, arguments.length);
|
||||||
|
return new Query(this.database, database.query(this._delegate, database.endBefore(value, name)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Load the selection of children with exactly the specified value, and, optionally,
|
||||||
|
* the specified name.
|
||||||
|
*/
|
||||||
|
equalTo(value, name) {
|
||||||
|
util.validateArgCount('Query.equalTo', 1, 2, arguments.length);
|
||||||
|
return new Query(this.database, database.query(this._delegate, database.equalTo(value, name)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @returns URL for this location.
|
||||||
|
*/
|
||||||
|
toString() {
|
||||||
|
util.validateArgCount('Query.toString', 0, 0, arguments.length);
|
||||||
|
return this._delegate.toString();
|
||||||
|
}
|
||||||
|
// Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary
|
||||||
|
// for end-users.
|
||||||
|
toJSON() {
|
||||||
|
// An optional spacer argument is unnecessary for a string.
|
||||||
|
util.validateArgCount('Query.toJSON', 0, 1, arguments.length);
|
||||||
|
return this._delegate.toJSON();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return true if this query and the provided query are equivalent; otherwise, return false.
|
||||||
|
*/
|
||||||
|
isEqual(other) {
|
||||||
|
util.validateArgCount('Query.isEqual', 1, 1, arguments.length);
|
||||||
|
if (!(other instanceof Query)) {
|
||||||
|
const error = 'Query.isEqual failed: First argument must be an instance of firebase.database.Query.';
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
|
return this._delegate.isEqual(other._delegate);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Helper used by .on and .once to extract the context and or cancel arguments.
|
||||||
|
* @param fnName - The function name (on or once)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static getCancelAndContextArgs_(fnName, cancelOrContext, context) {
|
||||||
|
const ret = { cancel: undefined, context: undefined };
|
||||||
|
if (cancelOrContext && context) {
|
||||||
|
ret.cancel = cancelOrContext;
|
||||||
|
util.validateCallback(fnName, 'cancel', ret.cancel, true);
|
||||||
|
ret.context = context;
|
||||||
|
util.validateContextObject(fnName, 'context', ret.context, true);
|
||||||
|
}
|
||||||
|
else if (cancelOrContext) {
|
||||||
|
// we have either a cancel callback or a context.
|
||||||
|
if (typeof cancelOrContext === 'object' && cancelOrContext !== null) {
|
||||||
|
// it's a context!
|
||||||
|
ret.context = cancelOrContext;
|
||||||
|
}
|
||||||
|
else if (typeof cancelOrContext === 'function') {
|
||||||
|
ret.cancel = cancelOrContext;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new Error(util.errorPrefix(fnName, 'cancelOrContext') +
|
||||||
|
' must either be a cancel callback or a context object.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
get ref() {
|
||||||
|
return new Reference(this.database, new database._ReferenceImpl(this._delegate._repo, this._delegate._path));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class Reference extends Query {
|
||||||
|
/**
|
||||||
|
* Call options:
|
||||||
|
* new Reference(Repo, Path) or
|
||||||
|
* new Reference(url: string, string|RepoManager)
|
||||||
|
*
|
||||||
|
* Externally - this is the firebase.database.Reference type.
|
||||||
|
*/
|
||||||
|
constructor(database$1, _delegate) {
|
||||||
|
super(database$1, new database._QueryImpl(_delegate._repo, _delegate._path, new database._QueryParams(), false));
|
||||||
|
this.database = database$1;
|
||||||
|
this._delegate = _delegate;
|
||||||
|
}
|
||||||
|
/** @returns {?string} */
|
||||||
|
getKey() {
|
||||||
|
util.validateArgCount('Reference.key', 0, 0, arguments.length);
|
||||||
|
return this._delegate.key;
|
||||||
|
}
|
||||||
|
child(pathString) {
|
||||||
|
util.validateArgCount('Reference.child', 1, 1, arguments.length);
|
||||||
|
if (typeof pathString === 'number') {
|
||||||
|
pathString = String(pathString);
|
||||||
|
}
|
||||||
|
return new Reference(this.database, database.child(this._delegate, pathString));
|
||||||
|
}
|
||||||
|
/** @returns {?Reference} */
|
||||||
|
getParent() {
|
||||||
|
util.validateArgCount('Reference.parent', 0, 0, arguments.length);
|
||||||
|
const parent = this._delegate.parent;
|
||||||
|
return parent ? new Reference(this.database, parent) : null;
|
||||||
|
}
|
||||||
|
/** @returns {!Reference} */
|
||||||
|
getRoot() {
|
||||||
|
util.validateArgCount('Reference.root', 0, 0, arguments.length);
|
||||||
|
return new Reference(this.database, this._delegate.root);
|
||||||
|
}
|
||||||
|
set(newVal, onComplete) {
|
||||||
|
util.validateArgCount('Reference.set', 1, 2, arguments.length);
|
||||||
|
util.validateCallback('Reference.set', 'onComplete', onComplete, true);
|
||||||
|
const result = database.set(this._delegate, newVal);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
update(values, onComplete) {
|
||||||
|
util.validateArgCount('Reference.update', 1, 2, arguments.length);
|
||||||
|
if (Array.isArray(values)) {
|
||||||
|
const newObjectToMerge = {};
|
||||||
|
for (let i = 0; i < values.length; ++i) {
|
||||||
|
newObjectToMerge['' + i] = values[i];
|
||||||
|
}
|
||||||
|
values = newObjectToMerge;
|
||||||
|
warn('Passing an Array to Firebase.update() is deprecated. ' +
|
||||||
|
'Use set() if you want to overwrite the existing data, or ' +
|
||||||
|
'an Object with integer keys if you really do want to ' +
|
||||||
|
'only update some of the children.');
|
||||||
|
}
|
||||||
|
database._validateWritablePath('Reference.update', this._delegate._path);
|
||||||
|
util.validateCallback('Reference.update', 'onComplete', onComplete, true);
|
||||||
|
const result = database.update(this._delegate, values);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
setWithPriority(newVal, newPriority, onComplete) {
|
||||||
|
util.validateArgCount('Reference.setWithPriority', 2, 3, arguments.length);
|
||||||
|
util.validateCallback('Reference.setWithPriority', 'onComplete', onComplete, true);
|
||||||
|
const result = database.setWithPriority(this._delegate, newVal, newPriority);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
remove(onComplete) {
|
||||||
|
util.validateArgCount('Reference.remove', 0, 1, arguments.length);
|
||||||
|
util.validateCallback('Reference.remove', 'onComplete', onComplete, true);
|
||||||
|
const result = database.remove(this._delegate);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
transaction(transactionUpdate, onComplete, applyLocally) {
|
||||||
|
util.validateArgCount('Reference.transaction', 1, 3, arguments.length);
|
||||||
|
util.validateCallback('Reference.transaction', 'transactionUpdate', transactionUpdate, false);
|
||||||
|
util.validateCallback('Reference.transaction', 'onComplete', onComplete, true);
|
||||||
|
validateBoolean('Reference.transaction', 'applyLocally', applyLocally, true);
|
||||||
|
const result = database.runTransaction(this._delegate, transactionUpdate, {
|
||||||
|
applyLocally
|
||||||
|
}).then(transactionResult => new TransactionResult(transactionResult.committed, new DataSnapshot(this.database, transactionResult.snapshot)));
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(transactionResult => onComplete(null, transactionResult.committed, transactionResult.snapshot), error => onComplete(error, false, null));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
setPriority(priority, onComplete) {
|
||||||
|
util.validateArgCount('Reference.setPriority', 1, 2, arguments.length);
|
||||||
|
util.validateCallback('Reference.setPriority', 'onComplete', onComplete, true);
|
||||||
|
const result = database.setPriority(this._delegate, priority);
|
||||||
|
if (onComplete) {
|
||||||
|
result.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
push(value, onComplete) {
|
||||||
|
util.validateArgCount('Reference.push', 0, 2, arguments.length);
|
||||||
|
util.validateCallback('Reference.push', 'onComplete', onComplete, true);
|
||||||
|
const expPromise = database.push(this._delegate, value);
|
||||||
|
const promise = expPromise.then(expRef => new Reference(this.database, expRef));
|
||||||
|
if (onComplete) {
|
||||||
|
promise.then(() => onComplete(null), error => onComplete(error));
|
||||||
|
}
|
||||||
|
const result = new Reference(this.database, expPromise);
|
||||||
|
result.then = promise.then.bind(promise);
|
||||||
|
result.catch = promise.catch.bind(promise, undefined);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
onDisconnect() {
|
||||||
|
database._validateWritablePath('Reference.onDisconnect', this._delegate._path);
|
||||||
|
return new OnDisconnect(new database.OnDisconnect(this._delegate._repo, this._delegate._path));
|
||||||
|
}
|
||||||
|
get key() {
|
||||||
|
return this.getKey();
|
||||||
|
}
|
||||||
|
get parent() {
|
||||||
|
return this.getParent();
|
||||||
|
}
|
||||||
|
get root() {
|
||||||
|
return this.getRoot();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Class representing a firebase database.
|
||||||
|
*/
|
||||||
|
class Database {
|
||||||
|
/**
|
||||||
|
* The constructor should not be called by users of our public API.
|
||||||
|
*/
|
||||||
|
constructor(_delegate, app) {
|
||||||
|
this._delegate = _delegate;
|
||||||
|
this.app = app;
|
||||||
|
this.INTERNAL = {
|
||||||
|
delete: () => this._delegate._delete(),
|
||||||
|
forceWebSockets: database.forceWebSockets,
|
||||||
|
forceLongPolling: database.forceLongPolling
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Modify this instance to communicate with the Realtime Database emulator.
|
||||||
|
*
|
||||||
|
* <p>Note: This method must be called before performing any other operation.
|
||||||
|
*
|
||||||
|
* @param host - the emulator host (ex: localhost)
|
||||||
|
* @param port - the emulator port (ex: 8080)
|
||||||
|
* @param options.mockUserToken - the mock auth token to use for unit testing Security Rules
|
||||||
|
*/
|
||||||
|
useEmulator(host, port, options = {}) {
|
||||||
|
database.connectDatabaseEmulator(this._delegate, host, port, options);
|
||||||
|
}
|
||||||
|
ref(path) {
|
||||||
|
util.validateArgCount('database.ref', 0, 1, arguments.length);
|
||||||
|
if (path instanceof Reference) {
|
||||||
|
const childRef = database.refFromURL(this._delegate, path.toString());
|
||||||
|
return new Reference(this, childRef);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const childRef = database.ref(this._delegate, path);
|
||||||
|
return new Reference(this, childRef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns a reference to the root or the path specified in url.
|
||||||
|
* We throw a exception if the url is not in the same domain as the
|
||||||
|
* current repo.
|
||||||
|
* @returns Firebase reference.
|
||||||
|
*/
|
||||||
|
refFromURL(url) {
|
||||||
|
const apiName = 'database.refFromURL';
|
||||||
|
util.validateArgCount(apiName, 1, 1, arguments.length);
|
||||||
|
const childRef = database.refFromURL(this._delegate, url);
|
||||||
|
return new Reference(this, childRef);
|
||||||
|
}
|
||||||
|
// Make individual repo go offline.
|
||||||
|
goOffline() {
|
||||||
|
util.validateArgCount('database.goOffline', 0, 0, arguments.length);
|
||||||
|
return database.goOffline(this._delegate);
|
||||||
|
}
|
||||||
|
goOnline() {
|
||||||
|
util.validateArgCount('database.goOnline', 0, 0, arguments.length);
|
||||||
|
return database.goOnline(this._delegate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Database.ServerValue = {
|
||||||
|
TIMESTAMP: database.serverTimestamp(),
|
||||||
|
increment: (delta) => database.increment(delta)
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used by console to create a database based on the app,
|
||||||
|
* passed database URL and a custom auth implementation.
|
||||||
|
*
|
||||||
|
* @param app - A valid FirebaseApp-like object
|
||||||
|
* @param url - A valid Firebase databaseURL
|
||||||
|
* @param version - custom version e.g. firebase-admin version
|
||||||
|
* @param customAuthImpl - custom auth implementation
|
||||||
|
*/
|
||||||
|
function initStandalone({ app, url, version, customAuthImpl, customAppCheckImpl, namespace, nodeAdmin = false }) {
|
||||||
|
database._setSDKVersion(version);
|
||||||
|
const container = new component.ComponentContainer('database-standalone');
|
||||||
|
/**
|
||||||
|
* ComponentContainer('database-standalone') is just a placeholder that doesn't perform
|
||||||
|
* any actual function.
|
||||||
|
*/
|
||||||
|
const authProvider = new component.Provider('auth-internal', container);
|
||||||
|
authProvider.setComponent(new component.Component('auth-internal', () => customAuthImpl, "PRIVATE" /* ComponentType.PRIVATE */));
|
||||||
|
let appCheckProvider = undefined;
|
||||||
|
if (customAppCheckImpl) {
|
||||||
|
appCheckProvider = new component.Provider('app-check-internal', container);
|
||||||
|
appCheckProvider.setComponent(new component.Component('app-check-internal', () => customAppCheckImpl, "PRIVATE" /* ComponentType.PRIVATE */));
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
instance: new Database(database._repoManagerDatabaseFromApp(app, authProvider, appCheckProvider, url, nodeAdmin), app),
|
||||||
|
namespace
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var INTERNAL = /*#__PURE__*/Object.freeze({
|
||||||
|
__proto__: null,
|
||||||
|
initStandalone: initStandalone
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
const ServerValue = Database.ServerValue;
|
||||||
|
function registerDatabase(instance) {
|
||||||
|
// Register the Database Service with the 'firebase' namespace.
|
||||||
|
instance.INTERNAL.registerComponent(new component.Component('database-compat', (container, { instanceIdentifier: url }) => {
|
||||||
|
/* Dependencies */
|
||||||
|
// getImmediate for FirebaseApp will always succeed
|
||||||
|
const app = container.getProvider('app-compat').getImmediate();
|
||||||
|
const databaseExp = container
|
||||||
|
.getProvider('database')
|
||||||
|
.getImmediate({ identifier: url });
|
||||||
|
return new Database(databaseExp, app);
|
||||||
|
}, "PUBLIC" /* ComponentType.PUBLIC */)
|
||||||
|
.setServiceProps(
|
||||||
|
// firebase.database namespace properties
|
||||||
|
{
|
||||||
|
Reference,
|
||||||
|
Query,
|
||||||
|
Database,
|
||||||
|
DataSnapshot,
|
||||||
|
enableLogging: database.enableLogging,
|
||||||
|
INTERNAL,
|
||||||
|
ServerValue
|
||||||
|
})
|
||||||
|
.setMultipleInstances(true));
|
||||||
|
instance.registerVersion(name, version, 'node');
|
||||||
|
}
|
||||||
|
registerDatabase(firebase__default["default"]);
|
||||||
|
//# sourceMappingURL=index.js.map
|
||||||
1
node_modules/@firebase/database-compat/dist/index.js.map
generated
vendored
Normal file
1
node_modules/@firebase/database-compat/dist/index.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
19777
node_modules/@firebase/database-compat/dist/index.standalone.js
generated
vendored
Normal file
19777
node_modules/@firebase/database-compat/dist/index.standalone.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
node_modules/@firebase/database-compat/dist/index.standalone.js.map
generated
vendored
Normal file
1
node_modules/@firebase/database-compat/dist/index.standalone.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
74
node_modules/@firebase/database-compat/dist/node-esm/database-compat/src/api/Database.d.ts
generated
vendored
Normal file
74
node_modules/@firebase/database-compat/dist/node-esm/database-compat/src/api/Database.d.ts
generated
vendored
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { FirebaseApp } from '@firebase/app-types';
|
||||||
|
import { FirebaseService } from '@firebase/app-types/private';
|
||||||
|
import { forceLongPolling, forceWebSockets, Database as ModularDatabase } from '@firebase/database';
|
||||||
|
import { Compat, EmulatorMockTokenOptions } from '@firebase/util';
|
||||||
|
import { Reference } from './Reference';
|
||||||
|
/**
|
||||||
|
* Class representing a firebase database.
|
||||||
|
*/
|
||||||
|
export declare class Database implements FirebaseService, Compat<ModularDatabase> {
|
||||||
|
readonly _delegate: ModularDatabase;
|
||||||
|
readonly app: FirebaseApp;
|
||||||
|
static readonly ServerValue: {
|
||||||
|
TIMESTAMP: object;
|
||||||
|
increment: (delta: number) => object;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* The constructor should not be called by users of our public API.
|
||||||
|
*/
|
||||||
|
constructor(_delegate: ModularDatabase, app: FirebaseApp);
|
||||||
|
INTERNAL: {
|
||||||
|
delete: () => Promise<void>;
|
||||||
|
forceWebSockets: typeof forceWebSockets;
|
||||||
|
forceLongPolling: typeof forceLongPolling;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* Modify this instance to communicate with the Realtime Database emulator.
|
||||||
|
*
|
||||||
|
* <p>Note: This method must be called before performing any other operation.
|
||||||
|
*
|
||||||
|
* @param host - the emulator host (ex: localhost)
|
||||||
|
* @param port - the emulator port (ex: 8080)
|
||||||
|
* @param options.mockUserToken - the mock auth token to use for unit testing Security Rules
|
||||||
|
*/
|
||||||
|
useEmulator(host: string, port: number, options?: {
|
||||||
|
mockUserToken?: EmulatorMockTokenOptions;
|
||||||
|
}): void;
|
||||||
|
/**
|
||||||
|
* Returns a reference to the root or to the path specified in the provided
|
||||||
|
* argument.
|
||||||
|
*
|
||||||
|
* @param path - The relative string path or an existing Reference to a database
|
||||||
|
* location.
|
||||||
|
* @throws If a Reference is provided, throws if it does not belong to the
|
||||||
|
* same project.
|
||||||
|
* @returns Firebase reference.
|
||||||
|
*/
|
||||||
|
ref(path?: string): Reference;
|
||||||
|
ref(path?: Reference): Reference;
|
||||||
|
/**
|
||||||
|
* Returns a reference to the root or the path specified in url.
|
||||||
|
* We throw a exception if the url is not in the same domain as the
|
||||||
|
* current repo.
|
||||||
|
* @returns Firebase reference.
|
||||||
|
*/
|
||||||
|
refFromURL(url: string): Reference;
|
||||||
|
goOffline(): void;
|
||||||
|
goOnline(): void;
|
||||||
|
}
|
||||||
207
node_modules/@firebase/database-compat/dist/node-esm/database-compat/src/api/Reference.d.ts
generated
vendored
Normal file
207
node_modules/@firebase/database-compat/dist/node-esm/database-compat/src/api/Reference.d.ts
generated
vendored
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { DataSnapshot as ModularDataSnapshot, Query as ExpQuery, DatabaseReference as ModularReference } from '@firebase/database';
|
||||||
|
import { Compat } from '@firebase/util';
|
||||||
|
import { Database } from './Database';
|
||||||
|
import { OnDisconnect } from './onDisconnect';
|
||||||
|
import { TransactionResult } from './TransactionResult';
|
||||||
|
/**
|
||||||
|
* Class representing a firebase data snapshot. It wraps a SnapshotNode and
|
||||||
|
* surfaces the public methods (val, forEach, etc.) we want to expose.
|
||||||
|
*/
|
||||||
|
export declare class DataSnapshot implements Compat<ModularDataSnapshot> {
|
||||||
|
readonly _database: Database;
|
||||||
|
readonly _delegate: ModularDataSnapshot;
|
||||||
|
constructor(_database: Database, _delegate: ModularDataSnapshot);
|
||||||
|
/**
|
||||||
|
* Retrieves the snapshot contents as JSON. Returns null if the snapshot is
|
||||||
|
* empty.
|
||||||
|
*
|
||||||
|
* @returns JSON representation of the DataSnapshot contents, or null if empty.
|
||||||
|
*/
|
||||||
|
val(): unknown;
|
||||||
|
/**
|
||||||
|
* Returns the snapshot contents as JSON, including priorities of node. Suitable for exporting
|
||||||
|
* the entire node contents.
|
||||||
|
* @returns JSON representation of the DataSnapshot contents, or null if empty.
|
||||||
|
*/
|
||||||
|
exportVal(): unknown;
|
||||||
|
toJSON(): unknown;
|
||||||
|
/**
|
||||||
|
* Returns whether the snapshot contains a non-null value.
|
||||||
|
*
|
||||||
|
* @returns Whether the snapshot contains a non-null value, or is empty.
|
||||||
|
*/
|
||||||
|
exists(): boolean;
|
||||||
|
/**
|
||||||
|
* Returns a DataSnapshot of the specified child node's contents.
|
||||||
|
*
|
||||||
|
* @param path - Path to a child.
|
||||||
|
* @returns DataSnapshot for child node.
|
||||||
|
*/
|
||||||
|
child(path: string): DataSnapshot;
|
||||||
|
/**
|
||||||
|
* Returns whether the snapshot contains a child at the specified path.
|
||||||
|
*
|
||||||
|
* @param path - Path to a child.
|
||||||
|
* @returns Whether the child exists.
|
||||||
|
*/
|
||||||
|
hasChild(path: string): boolean;
|
||||||
|
/**
|
||||||
|
* Returns the priority of the object, or null if no priority was set.
|
||||||
|
*
|
||||||
|
* @returns The priority.
|
||||||
|
*/
|
||||||
|
getPriority(): string | number | null;
|
||||||
|
/**
|
||||||
|
* Iterates through child nodes and calls the specified action for each one.
|
||||||
|
*
|
||||||
|
* @param action - Callback function to be called
|
||||||
|
* for each child.
|
||||||
|
* @returns True if forEach was canceled by action returning true for
|
||||||
|
* one of the child nodes.
|
||||||
|
*/
|
||||||
|
forEach(action: (snapshot: IteratedDataSnapshot) => boolean | void): boolean;
|
||||||
|
/**
|
||||||
|
* Returns whether this DataSnapshot has children.
|
||||||
|
* @returns True if the DataSnapshot contains 1 or more child nodes.
|
||||||
|
*/
|
||||||
|
hasChildren(): boolean;
|
||||||
|
get key(): string;
|
||||||
|
/**
|
||||||
|
* Returns the number of children for this DataSnapshot.
|
||||||
|
* @returns The number of children that this DataSnapshot contains.
|
||||||
|
*/
|
||||||
|
numChildren(): number;
|
||||||
|
/**
|
||||||
|
* @returns The Firebase reference for the location this snapshot's data came
|
||||||
|
* from.
|
||||||
|
*/
|
||||||
|
getRef(): Reference;
|
||||||
|
get ref(): Reference;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Represents a child snapshot of a `Reference` that is being iterated over. The key will never be undefined.
|
||||||
|
*/
|
||||||
|
export interface IteratedDataSnapshot extends DataSnapshot {
|
||||||
|
key: string;
|
||||||
|
}
|
||||||
|
export interface SnapshotCallback {
|
||||||
|
(dataSnapshot: DataSnapshot, previousChildName?: string | null): unknown;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* A Query represents a filter to be applied to a firebase location. This object purely represents the
|
||||||
|
* query expression (and exposes our public API to build the query). The actual query logic is in ViewBase.js.
|
||||||
|
*
|
||||||
|
* Since every Firebase reference is a query, Firebase inherits from this object.
|
||||||
|
*/
|
||||||
|
export declare class Query implements Compat<ExpQuery> {
|
||||||
|
readonly database: Database;
|
||||||
|
readonly _delegate: ExpQuery;
|
||||||
|
constructor(database: Database, _delegate: ExpQuery);
|
||||||
|
on(eventType: string, callback: SnapshotCallback, cancelCallbackOrContext?: ((a: Error) => unknown) | object | null, context?: object | null): SnapshotCallback;
|
||||||
|
off(eventType?: string, callback?: SnapshotCallback, context?: object | null): void;
|
||||||
|
/**
|
||||||
|
* Get the server-value for this query, or return a cached value if not connected.
|
||||||
|
*/
|
||||||
|
get(): Promise<DataSnapshot>;
|
||||||
|
/**
|
||||||
|
* Attaches a listener, waits for the first event, and then removes the listener
|
||||||
|
*/
|
||||||
|
once(eventType: string, callback?: SnapshotCallback, failureCallbackOrContext?: ((a: Error) => void) | object | null, context?: object | null): Promise<DataSnapshot>;
|
||||||
|
/**
|
||||||
|
* Set a limit and anchor it to the start of the window.
|
||||||
|
*/
|
||||||
|
limitToFirst(limit: number): Query;
|
||||||
|
/**
|
||||||
|
* Set a limit and anchor it to the end of the window.
|
||||||
|
*/
|
||||||
|
limitToLast(limit: number): Query;
|
||||||
|
/**
|
||||||
|
* Given a child path, return a new query ordered by the specified grandchild path.
|
||||||
|
*/
|
||||||
|
orderByChild(path: string): Query;
|
||||||
|
/**
|
||||||
|
* Return a new query ordered by the KeyIndex
|
||||||
|
*/
|
||||||
|
orderByKey(): Query;
|
||||||
|
/**
|
||||||
|
* Return a new query ordered by the PriorityIndex
|
||||||
|
*/
|
||||||
|
orderByPriority(): Query;
|
||||||
|
/**
|
||||||
|
* Return a new query ordered by the ValueIndex
|
||||||
|
*/
|
||||||
|
orderByValue(): Query;
|
||||||
|
startAt(value?: number | string | boolean | null, name?: string | null): Query;
|
||||||
|
startAfter(value?: number | string | boolean | null, name?: string | null): Query;
|
||||||
|
endAt(value?: number | string | boolean | null, name?: string | null): Query;
|
||||||
|
endBefore(value?: number | string | boolean | null, name?: string | null): Query;
|
||||||
|
/**
|
||||||
|
* Load the selection of children with exactly the specified value, and, optionally,
|
||||||
|
* the specified name.
|
||||||
|
*/
|
||||||
|
equalTo(value: number | string | boolean | null, name?: string): Query;
|
||||||
|
/**
|
||||||
|
* @returns URL for this location.
|
||||||
|
*/
|
||||||
|
toString(): string;
|
||||||
|
toJSON(): string;
|
||||||
|
/**
|
||||||
|
* Return true if this query and the provided query are equivalent; otherwise, return false.
|
||||||
|
*/
|
||||||
|
isEqual(other: Query): boolean;
|
||||||
|
/**
|
||||||
|
* Helper used by .on and .once to extract the context and or cancel arguments.
|
||||||
|
* @param fnName - The function name (on or once)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static getCancelAndContextArgs_;
|
||||||
|
get ref(): Reference;
|
||||||
|
}
|
||||||
|
export declare class Reference extends Query implements Compat<ModularReference> {
|
||||||
|
readonly database: Database;
|
||||||
|
readonly _delegate: ModularReference;
|
||||||
|
then: Promise<Reference>['then'];
|
||||||
|
catch: Promise<Reference>['catch'];
|
||||||
|
/**
|
||||||
|
* Call options:
|
||||||
|
* new Reference(Repo, Path) or
|
||||||
|
* new Reference(url: string, string|RepoManager)
|
||||||
|
*
|
||||||
|
* Externally - this is the firebase.database.Reference type.
|
||||||
|
*/
|
||||||
|
constructor(database: Database, _delegate: ModularReference);
|
||||||
|
/** @returns {?string} */
|
||||||
|
getKey(): string | null;
|
||||||
|
child(pathString: string): Reference;
|
||||||
|
/** @returns {?Reference} */
|
||||||
|
getParent(): Reference | null;
|
||||||
|
/** @returns {!Reference} */
|
||||||
|
getRoot(): Reference;
|
||||||
|
set(newVal: unknown, onComplete?: (error: Error | null) => void): Promise<void>;
|
||||||
|
update(values: object, onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
setWithPriority(newVal: unknown, newPriority: string | number | null, onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
remove(onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
transaction(transactionUpdate: (currentData: unknown) => unknown, onComplete?: (error: Error | null, committed: boolean, dataSnapshot: DataSnapshot | null) => void, applyLocally?: boolean): Promise<TransactionResult>;
|
||||||
|
setPriority(priority: string | number | null, onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
push(value?: unknown, onComplete?: (a: Error | null) => void): Reference;
|
||||||
|
onDisconnect(): OnDisconnect;
|
||||||
|
get key(): string | null;
|
||||||
|
get parent(): Reference | null;
|
||||||
|
get root(): Reference;
|
||||||
|
}
|
||||||
26
node_modules/@firebase/database-compat/dist/node-esm/database-compat/src/api/TransactionResult.d.ts
generated
vendored
Normal file
26
node_modules/@firebase/database-compat/dist/node-esm/database-compat/src/api/TransactionResult.d.ts
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { DataSnapshot } from './Reference';
|
||||||
|
export declare class TransactionResult {
|
||||||
|
committed: boolean;
|
||||||
|
snapshot: DataSnapshot;
|
||||||
|
/**
|
||||||
|
* A type for the resolve value of Firebase.transaction.
|
||||||
|
*/
|
||||||
|
constructor(committed: boolean, snapshot: DataSnapshot);
|
||||||
|
toJSON(): object;
|
||||||
|
}
|
||||||
41
node_modules/@firebase/database-compat/dist/node-esm/database-compat/src/api/internal.d.ts
generated
vendored
Normal file
41
node_modules/@firebase/database-compat/dist/node-esm/database-compat/src/api/internal.d.ts
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { FirebaseAppCheckInternal } from '@firebase/app-check-interop-types';
|
||||||
|
import { FirebaseApp } from '@firebase/app-types';
|
||||||
|
import { FirebaseAuthInternal } from '@firebase/auth-interop-types';
|
||||||
|
import * as types from '@firebase/database-types';
|
||||||
|
/**
|
||||||
|
* Used by console to create a database based on the app,
|
||||||
|
* passed database URL and a custom auth implementation.
|
||||||
|
*
|
||||||
|
* @param app - A valid FirebaseApp-like object
|
||||||
|
* @param url - A valid Firebase databaseURL
|
||||||
|
* @param version - custom version e.g. firebase-admin version
|
||||||
|
* @param customAuthImpl - custom auth implementation
|
||||||
|
*/
|
||||||
|
export declare function initStandalone<T>({ app, url, version, customAuthImpl, customAppCheckImpl, namespace, nodeAdmin }: {
|
||||||
|
app: FirebaseApp;
|
||||||
|
url: string;
|
||||||
|
version: string;
|
||||||
|
customAuthImpl: FirebaseAuthInternal;
|
||||||
|
customAppCheckImpl?: FirebaseAppCheckInternal;
|
||||||
|
namespace: T;
|
||||||
|
nodeAdmin?: boolean;
|
||||||
|
}): {
|
||||||
|
instance: types.Database;
|
||||||
|
namespace: T;
|
||||||
|
};
|
||||||
27
node_modules/@firebase/database-compat/dist/node-esm/database-compat/src/api/onDisconnect.d.ts
generated
vendored
Normal file
27
node_modules/@firebase/database-compat/dist/node-esm/database-compat/src/api/onDisconnect.d.ts
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2017 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { OnDisconnect as ModularOnDisconnect } from '@firebase/database';
|
||||||
|
import { Compat } from '@firebase/util';
|
||||||
|
export declare class OnDisconnect implements Compat<ModularOnDisconnect> {
|
||||||
|
readonly _delegate: ModularOnDisconnect;
|
||||||
|
constructor(_delegate: ModularOnDisconnect);
|
||||||
|
cancel(onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
remove(onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
set(value: unknown, onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
setWithPriority(value: unknown, priority: number | string | null, onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
update(objectToMerge: Record<string, unknown>, onComplete?: (a: Error | null) => void): Promise<void>;
|
||||||
|
}
|
||||||
32
node_modules/@firebase/database-compat/dist/node-esm/database-compat/src/index.d.ts
generated
vendored
Normal file
32
node_modules/@firebase/database-compat/dist/node-esm/database-compat/src/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2021 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { FirebaseNamespace } from '@firebase/app-compat';
|
||||||
|
import * as types from '@firebase/database-types';
|
||||||
|
export declare function registerDatabase(instance: FirebaseNamespace): void;
|
||||||
|
declare module '@firebase/app-compat' {
|
||||||
|
interface FirebaseNamespace {
|
||||||
|
database?: {
|
||||||
|
(app?: FirebaseApp): types.FirebaseDatabase;
|
||||||
|
enableLogging: typeof types.enableLogging;
|
||||||
|
ServerValue: types.ServerValue;
|
||||||
|
Database: typeof types.FirebaseDatabase;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
interface FirebaseApp {
|
||||||
|
database?(databaseURL?: string): types.FirebaseDatabase;
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user