wrangler 0.0.0-e64812e → 0.0.0-e8e684c7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -3
- package/bin/wrangler.js +150 -62
- package/kv-asset-handler.js +1 -0
- package/miniflare-dist/index.mjs +663 -7
- package/package.json +173 -152
- package/src/__tests__/config-cache-without-cache-dir.test.ts +38 -0
- package/src/__tests__/config-cache.test.ts +30 -24
- package/src/__tests__/configuration.test.ts +4015 -3363
- package/src/__tests__/dev.test.tsx +1290 -952
- package/src/__tests__/generate.test.ts +91 -0
- package/src/__tests__/guess-worker-format.test.ts +68 -68
- package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
- package/src/__tests__/helpers/mock-account-id.ts +24 -24
- package/src/__tests__/helpers/mock-bin.ts +20 -20
- package/src/__tests__/helpers/mock-cfetch.ts +179 -94
- package/src/__tests__/helpers/mock-console.ts +49 -39
- package/src/__tests__/helpers/mock-dialogs.ts +94 -71
- package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -0
- package/src/__tests__/helpers/mock-http-server.ts +30 -30
- package/src/__tests__/helpers/mock-istty.ts +65 -18
- package/src/__tests__/helpers/mock-known-routes.ts +7 -0
- package/src/__tests__/helpers/mock-kv.ts +26 -26
- package/src/__tests__/helpers/mock-oauth-flow.ts +223 -228
- package/src/__tests__/helpers/mock-process.ts +39 -0
- package/src/__tests__/helpers/mock-stdin.ts +82 -77
- package/src/__tests__/helpers/mock-web-socket.ts +21 -21
- package/src/__tests__/helpers/run-in-tmp.ts +27 -28
- package/src/__tests__/helpers/run-wrangler.ts +8 -8
- package/src/__tests__/helpers/write-worker-source.ts +16 -16
- package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
- package/src/__tests__/https-options.test.ts +142 -109
- package/src/__tests__/index.test.ts +222 -233
- package/src/__tests__/init.test.ts +2139 -1603
- package/src/__tests__/jest.setup.ts +114 -34
- package/src/__tests__/kv.test.ts +1222 -1032
- package/src/__tests__/logger.test.ts +100 -74
- package/src/__tests__/metrics.test.ts +450 -0
- package/src/__tests__/package-manager.test.ts +303 -303
- package/src/__tests__/pages.test.ts +1173 -652
- package/src/__tests__/parse.test.ts +252 -252
- package/src/__tests__/publish.test.ts +6788 -5301
- package/src/__tests__/pubsub.test.ts +367 -0
- package/src/__tests__/r2.test.ts +328 -225
- package/src/__tests__/route.test.ts +18 -18
- package/src/__tests__/secret.test.ts +470 -459
- package/src/__tests__/tail.test.ts +676 -564
- package/src/__tests__/test-old-node-version.js +31 -0
- package/src/__tests__/user.test.ts +136 -112
- package/src/__tests__/validate-dev-props.test.ts +56 -0
- package/src/__tests__/version.test.ts +35 -0
- package/src/__tests__/whoami.test.tsx +267 -83
- package/src/__tests__/worker-namespace.test.ts +329 -0
- package/src/abort.d.ts +1 -1
- package/src/api/dev.ts +93 -0
- package/src/api/index.ts +1 -0
- package/src/bundle-reporter.tsx +29 -0
- package/src/bundle.ts +430 -157
- package/src/cfetch/index.ts +80 -80
- package/src/cfetch/internal.ts +244 -91
- package/src/cli.ts +21 -7
- package/src/config/config.ts +224 -195
- package/src/config/diagnostics.ts +61 -61
- package/src/config/environment.ts +422 -357
- package/src/config/index.ts +219 -193
- package/src/config/validation-helpers.ts +379 -357
- package/src/config/validation.ts +1690 -1367
- package/src/config-cache.ts +81 -41
- package/src/create-worker-preview.ts +208 -136
- package/src/create-worker-upload-form.ts +275 -238
- package/src/dev/dev-vars.ts +13 -13
- package/src/dev/dev.tsx +477 -351
- package/src/dev/local.tsx +426 -295
- package/src/dev/remote.tsx +406 -211
- package/src/dev/use-esbuild.ts +154 -94
- package/src/dev/validate-dev-props.ts +31 -0
- package/src/dev-registry.tsx +160 -0
- package/src/dev.tsx +696 -0
- package/src/dialogs.tsx +97 -97
- package/src/dispatch-namespace.ts +206 -0
- package/src/durable.ts +87 -87
- package/src/entry.ts +234 -228
- package/src/environment-variables.ts +23 -23
- package/src/errors.ts +6 -6
- package/src/faye-websocket.d.ts +6 -0
- package/src/generate.ts +131 -0
- package/src/git-client.ts +42 -0
- package/src/global-wrangler-config-path.ts +26 -0
- package/src/https-options.ts +84 -80
- package/src/index.tsx +2164 -2768
- package/src/init.ts +622 -0
- package/src/inspect.ts +678 -593
- package/src/intl-polyfill.d.ts +123 -123
- package/src/is-ci.ts +14 -0
- package/src/is-interactive.ts +12 -0
- package/src/kv.ts +299 -277
- package/src/logger.ts +46 -39
- package/src/metrics/index.ts +5 -0
- package/src/metrics/metrics-config.ts +239 -0
- package/src/metrics/metrics-dispatcher.ts +96 -0
- package/src/metrics/metrics-usage-headers.ts +24 -0
- package/src/metrics/send-event.ts +92 -0
- package/src/miniflare-cli/assets.ts +554 -0
- package/src/miniflare-cli/enum-keys.ts +8 -8
- package/src/miniflare-cli/index.ts +198 -32
- package/src/miniflare-cli/request-context.ts +18 -18
- package/src/module-collection.ts +212 -212
- package/src/open-in-browser.ts +4 -6
- package/src/package-manager.ts +173 -128
- package/src/pages/build.tsx +238 -0
- package/src/pages/constants.ts +12 -0
- package/src/pages/deployments.tsx +106 -0
- package/src/pages/dev.tsx +528 -0
- package/src/pages/errors.ts +22 -0
- package/src/pages/functions/buildPlugin.ts +109 -0
- package/src/pages/functions/buildWorker.ts +155 -0
- package/{pages → src/pages}/functions/filepath-routing.test.ts +113 -113
- package/src/pages/functions/filepath-routing.ts +189 -0
- package/src/pages/functions/identifiers.ts +78 -0
- package/src/pages/functions/routes-consolidation.test.ts +250 -0
- package/src/pages/functions/routes-consolidation.ts +73 -0
- package/src/pages/functions/routes-transformation.test.ts +271 -0
- package/src/pages/functions/routes-transformation.ts +122 -0
- package/src/pages/functions/routes.ts +151 -0
- package/src/pages/functions.tsx +96 -0
- package/src/pages/index.tsx +94 -0
- package/src/pages/projects.tsx +169 -0
- package/src/pages/publish.tsx +391 -0
- package/src/pages/types.ts +49 -0
- package/src/pages/upload.tsx +413 -0
- package/src/pages/utils.ts +12 -0
- package/src/parse.ts +209 -125
- package/src/paths.ts +6 -6
- package/src/preview.ts +31 -0
- package/src/proxy.ts +410 -389
- package/src/publish.ts +773 -534
- package/src/pubsub/index.ts +286 -0
- package/src/pubsub/pubsub-commands.tsx +623 -0
- package/src/r2.ts +100 -19
- package/src/selfsigned.d.ts +23 -23
- package/src/sites.tsx +278 -201
- package/src/tail/filters.ts +111 -109
- package/src/tail/index.ts +230 -217
- package/src/tail/printing.ts +86 -46
- package/src/update-check.ts +11 -11
- package/src/user/choose-account.tsx +69 -0
- package/src/user/env-vars.ts +46 -0
- package/src/user/generate-auth-url.ts +33 -0
- package/src/user/generate-random-state.ts +16 -0
- package/src/user/index.ts +3 -0
- package/src/user/user.tsx +1191 -0
- package/src/whoami.tsx +141 -42
- package/src/worker.ts +123 -99
- package/src/zones.ts +167 -0
- package/templates/checked-fetch.js +17 -0
- package/templates/first-party-worker-module-facade.ts +18 -0
- package/templates/format-dev-errors.ts +32 -0
- package/templates/new-worker-scheduled.js +3 -3
- package/templates/new-worker-scheduled.ts +15 -15
- package/templates/new-worker.js +3 -3
- package/templates/new-worker.ts +15 -15
- package/templates/no-op-worker.js +10 -0
- package/templates/pages-shim.ts +9 -0
- package/templates/pages-template-plugin.ts +167 -0
- package/templates/pages-template-worker.ts +172 -0
- package/templates/serve-static-assets.ts +63 -0
- package/templates/service-bindings-module-facade.js +54 -0
- package/templates/service-bindings-sw-facade.js +42 -0
- package/templates/tsconfig.json +95 -95
- package/wrangler-dist/cli.d.ts +338 -0
- package/wrangler-dist/cli.js +95449 -67524
- package/pages/functions/buildPlugin.ts +0 -105
- package/pages/functions/buildWorker.ts +0 -151
- package/pages/functions/filepath-routing.ts +0 -189
- package/pages/functions/identifiers.ts +0 -78
- package/pages/functions/routes.ts +0 -156
- package/pages/functions/template-plugin.ts +0 -147
- package/pages/functions/template-worker.ts +0 -143
- package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
- package/src/pages.tsx +0 -2038
- package/src/user.tsx +0 -1203
- package/templates/static-asset-facade.js +0 -47
- package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
- package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
- package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
- package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
- package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
- package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
- package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
- package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
- package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
- package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
- package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
- package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
- package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
- package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
- package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
- package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
- package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
- package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
- package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
- package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
- package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
- package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
- package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
- package/vendor/wrangler-mime/CHANGELOG.md +0 -289
- package/vendor/wrangler-mime/LICENSE +0 -21
- package/vendor/wrangler-mime/Mime.js +0 -97
- package/vendor/wrangler-mime/README.md +0 -187
- package/vendor/wrangler-mime/cli.js +0 -46
- package/vendor/wrangler-mime/index.js +0 -4
- package/vendor/wrangler-mime/lite.js +0 -4
- package/vendor/wrangler-mime/package.json +0 -52
- package/vendor/wrangler-mime/types/other.js +0 -1
- package/vendor/wrangler-mime/types/standard.js +0 -1
|
@@ -1,41 +1,207 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { fetch } from "@miniflare/core";
|
|
2
|
+
import {
|
|
3
|
+
DurableObjectNamespace,
|
|
4
|
+
DurableObjectStub,
|
|
5
|
+
} from "@miniflare/durable-objects";
|
|
6
|
+
import {
|
|
7
|
+
Log,
|
|
8
|
+
LogLevel,
|
|
9
|
+
Miniflare,
|
|
10
|
+
Response as MiniflareResponse,
|
|
11
|
+
Request as MiniflareRequest,
|
|
12
|
+
} from "miniflare";
|
|
2
13
|
import yargs from "yargs";
|
|
3
14
|
import { hideBin } from "yargs/helpers";
|
|
15
|
+
import { FatalError } from "../errors";
|
|
16
|
+
import generateASSETSBinding from "./assets";
|
|
4
17
|
import { enumKeys } from "./enum-keys";
|
|
5
18
|
import { getRequestContextCheckOptions } from "./request-context";
|
|
19
|
+
import type { Options } from "./assets";
|
|
20
|
+
import type { AddressInfo } from "net";
|
|
21
|
+
|
|
22
|
+
export interface EnablePagesAssetsServiceBindingOptions {
|
|
23
|
+
proxyPort?: number;
|
|
24
|
+
directory?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// miniflare defines this but importing it throws:
|
|
28
|
+
// Dynamic require of "path" is not supported
|
|
29
|
+
class NoOpLog extends Log {
|
|
30
|
+
log(): void {}
|
|
31
|
+
|
|
32
|
+
error(message: Error): void {
|
|
33
|
+
throw message;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
6
36
|
|
|
7
37
|
async function main() {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
const args = await yargs(hideBin(process.argv))
|
|
39
|
+
.help(false)
|
|
40
|
+
.version(false)
|
|
41
|
+
.option("log", {
|
|
42
|
+
choices: enumKeys(LogLevel),
|
|
43
|
+
}).argv;
|
|
44
|
+
|
|
45
|
+
const logLevel = LogLevel[args.log ?? "INFO"];
|
|
46
|
+
const requestContextCheckOptions = await getRequestContextCheckOptions();
|
|
47
|
+
const config = {
|
|
48
|
+
...JSON.parse((args._[0] as string) ?? "{}"),
|
|
49
|
+
...requestContextCheckOptions,
|
|
50
|
+
};
|
|
51
|
+
//miniflare's logLevel 0 still logs routes, so lets override the logger
|
|
52
|
+
config.log = config.disableLogs
|
|
53
|
+
? new NoOpLog()
|
|
54
|
+
: new Log(logLevel, config.logOptions);
|
|
55
|
+
|
|
56
|
+
if (logLevel > LogLevel.INFO) {
|
|
57
|
+
console.log("OPTIONS:\n", JSON.stringify(config, null, 2));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
config.bindings = {
|
|
61
|
+
...config.bindings,
|
|
62
|
+
...Object.fromEntries(
|
|
63
|
+
Object.entries(
|
|
64
|
+
config.externalDurableObjects as Record<
|
|
65
|
+
string,
|
|
66
|
+
{ name: string; host: string; port: number }
|
|
67
|
+
>
|
|
68
|
+
).map(([binding, { name, host, port }]) => {
|
|
69
|
+
const factory = () => {
|
|
70
|
+
throw new FatalError(
|
|
71
|
+
"An external Durable Object instance's state has somehow been attempted to be accessed.",
|
|
72
|
+
1
|
|
73
|
+
);
|
|
74
|
+
};
|
|
75
|
+
const namespace = new DurableObjectNamespace(name as string, factory);
|
|
76
|
+
namespace.get = (id) => {
|
|
77
|
+
const stub = new DurableObjectStub(factory, id);
|
|
78
|
+
stub.fetch = (...reqArgs) => {
|
|
79
|
+
const requestFromArgs = new MiniflareRequest(...reqArgs);
|
|
80
|
+
const url = new URL(requestFromArgs.url);
|
|
81
|
+
url.host = host;
|
|
82
|
+
if (port !== undefined) url.port = port.toString();
|
|
83
|
+
const request = new MiniflareRequest(
|
|
84
|
+
url.toString(),
|
|
85
|
+
requestFromArgs
|
|
86
|
+
);
|
|
87
|
+
request.headers.set("x-miniflare-durable-object-name", name);
|
|
88
|
+
request.headers.set("x-miniflare-durable-object-id", id.toString());
|
|
89
|
+
|
|
90
|
+
return fetch(request);
|
|
91
|
+
};
|
|
92
|
+
return stub;
|
|
93
|
+
};
|
|
94
|
+
return [binding, namespace];
|
|
95
|
+
})
|
|
96
|
+
),
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
let mf: Miniflare | undefined;
|
|
100
|
+
let durableObjectsMf: Miniflare | undefined = undefined;
|
|
101
|
+
let durableObjectsMfPort: number | undefined = undefined;
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
if (args._[1]) {
|
|
105
|
+
const opts: EnablePagesAssetsServiceBindingOptions = JSON.parse(
|
|
106
|
+
args._[1] as string
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
if (isNaN(opts.proxyPort || NaN) && !opts.directory) {
|
|
110
|
+
throw new Error(
|
|
111
|
+
"MiniflareCLIOptions: built in service bindings set to true, but no port or directory provided"
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const options: Options = {
|
|
116
|
+
log: config.log,
|
|
117
|
+
proxyPort: opts.proxyPort,
|
|
118
|
+
directory: opts.directory,
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
config.serviceBindings = {
|
|
122
|
+
...config.serviceBindings,
|
|
123
|
+
ASSETS: await generateASSETSBinding(options),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
mf = new Miniflare(config);
|
|
127
|
+
// Start Miniflare development server
|
|
128
|
+
await mf.startServer();
|
|
129
|
+
await mf.startScheduler();
|
|
130
|
+
|
|
131
|
+
const internalDurableObjectClassNames = Object.values(
|
|
132
|
+
config.durableObjects as Record<string, string>
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
if (internalDurableObjectClassNames.length > 0) {
|
|
136
|
+
durableObjectsMf = new Miniflare({
|
|
137
|
+
host: config.host,
|
|
138
|
+
port: 0,
|
|
139
|
+
script: `
|
|
140
|
+
export default {
|
|
141
|
+
fetch(request, env) {
|
|
142
|
+
return env.DO.fetch(request)
|
|
143
|
+
}
|
|
144
|
+
}`,
|
|
145
|
+
serviceBindings: {
|
|
146
|
+
DO: async (request: MiniflareRequest) => {
|
|
147
|
+
request = new MiniflareRequest(request);
|
|
148
|
+
|
|
149
|
+
const name = request.headers.get("x-miniflare-durable-object-name");
|
|
150
|
+
const idString = request.headers.get(
|
|
151
|
+
"x-miniflare-durable-object-id"
|
|
152
|
+
);
|
|
153
|
+
request.headers.delete("x-miniflare-durable-object-name");
|
|
154
|
+
request.headers.delete("x-miniflare-durable-object-id");
|
|
155
|
+
|
|
156
|
+
if (!name || !idString) {
|
|
157
|
+
return new MiniflareResponse(
|
|
158
|
+
"[durable-object-proxy-err] Missing `x-miniflare-durable-object-name` or `x-miniflare-durable-object-id` headers.",
|
|
159
|
+
{ status: 400 }
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const namespace = await mf?.getDurableObjectNamespace(name);
|
|
164
|
+
const id = namespace?.idFromString(idString);
|
|
165
|
+
|
|
166
|
+
if (!id) {
|
|
167
|
+
return new MiniflareResponse(
|
|
168
|
+
"[durable-object-proxy-err] Could not generate an ID. Possibly due to a mismatched DO name and ID?",
|
|
169
|
+
{ status: 500 }
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const stub = namespace?.get(id);
|
|
174
|
+
|
|
175
|
+
if (!stub) {
|
|
176
|
+
return new MiniflareResponse(
|
|
177
|
+
"[durable-object-proxy-err] Could not generate a stub. Possibly due to a mismatched DO name and ID?",
|
|
178
|
+
{ status: 500 }
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return stub.fetch(request);
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
modules: true,
|
|
186
|
+
});
|
|
187
|
+
const server = await durableObjectsMf.startServer();
|
|
188
|
+
durableObjectsMfPort = (server.address() as AddressInfo).port;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
process.send &&
|
|
192
|
+
process.send(
|
|
193
|
+
JSON.stringify({
|
|
194
|
+
ready: true,
|
|
195
|
+
durableObjectsPort: durableObjectsMfPort,
|
|
196
|
+
})
|
|
197
|
+
);
|
|
198
|
+
} catch (e) {
|
|
199
|
+
mf?.log.error(e as Error);
|
|
200
|
+
process.exitCode = 1;
|
|
201
|
+
// Unmount any mounted workers
|
|
202
|
+
await mf?.dispose();
|
|
203
|
+
await durableObjectsMf?.dispose();
|
|
204
|
+
}
|
|
39
205
|
}
|
|
40
206
|
|
|
41
207
|
await main();
|
|
@@ -16,25 +16,25 @@ import type { MiniflareOptions } from "miniflare";
|
|
|
16
16
|
* that indicate to miniflare whether to run the checks or not.
|
|
17
17
|
*/
|
|
18
18
|
export const getRequestContextCheckOptions = async (): Promise<
|
|
19
|
-
|
|
19
|
+
Pick<MiniflareOptions, "globalAsyncIO" | "globalTimers" | "globalRandom">
|
|
20
20
|
> => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
// check that there's an implementation of AsyncLocalStorage
|
|
22
|
+
let hasAsyncLocalStorage = true;
|
|
23
|
+
try {
|
|
24
|
+
// ripped from the example here https://nodejs.org/api/async_context.html#class-asynclocalstorage
|
|
25
|
+
const { AsyncLocalStorage } = await import("node:async_hooks");
|
|
26
|
+
const storage = new AsyncLocalStorage<string>();
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
hasAsyncLocalStorage = storage.run("some-value", () => {
|
|
29
|
+
return storage.getStore() === "some-value";
|
|
30
|
+
});
|
|
31
|
+
} catch (e) {
|
|
32
|
+
hasAsyncLocalStorage = false;
|
|
33
|
+
}
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
return {
|
|
36
|
+
globalAsyncIO: hasAsyncLocalStorage,
|
|
37
|
+
globalRandom: hasAsyncLocalStorage,
|
|
38
|
+
globalTimers: hasAsyncLocalStorage,
|
|
39
|
+
};
|
|
40
40
|
};
|