@pulumi/pulumi 3.163.0-alpha.xdc88586 → 3.163.0-alpha.xe7c1e4f

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.
Files changed (70) hide show
  1. package/automation/cmd.js +92 -111
  2. package/automation/cmd.js.map +1 -1
  3. package/automation/localWorkspace.js +383 -476
  4. package/automation/localWorkspace.js.map +1 -1
  5. package/automation/remoteWorkspace.js +38 -55
  6. package/automation/remoteWorkspace.js.map +1 -1
  7. package/automation/server.js +6 -16
  8. package/automation/server.js.map +1 -1
  9. package/automation/stack.js +537 -608
  10. package/automation/stack.js.map +1 -1
  11. package/cmd/dynamic-provider/index.js +204 -235
  12. package/cmd/dynamic-provider/index.js.map +1 -1
  13. package/cmd/run/error.js +3 -3
  14. package/cmd/run/error.js.map +1 -1
  15. package/cmd/run/run.js +322 -336
  16. package/cmd/run/run.js.map +1 -1
  17. package/cmd/run/tracing.js +1 -2
  18. package/cmd/run/tracing.js.map +1 -1
  19. package/cmd/run-plugin/run.js +13 -17
  20. package/cmd/run-plugin/run.js.map +1 -1
  21. package/cmd/run-policy-pack/run.js +12 -16
  22. package/cmd/run-policy-pack/run.js.map +1 -1
  23. package/output.js +61 -78
  24. package/output.js.map +1 -1
  25. package/package.json +1 -1
  26. package/provider/experimental/analyzer.js +43 -46
  27. package/provider/experimental/analyzer.js.map +1 -1
  28. package/provider/experimental/provider.js +22 -36
  29. package/provider/experimental/provider.js.map +1 -1
  30. package/provider/server.js +359 -397
  31. package/provider/server.js.map +1 -1
  32. package/resource.js +29 -41
  33. package/resource.js.map +1 -1
  34. package/runtime/asyncIterableUtil.js +6 -17
  35. package/runtime/asyncIterableUtil.js.map +1 -1
  36. package/runtime/callbacks.js +254 -269
  37. package/runtime/callbacks.js.map +1 -1
  38. package/runtime/closure/codePaths.js +117 -135
  39. package/runtime/closure/codePaths.js.map +1 -1
  40. package/runtime/closure/createClosure.js +807 -871
  41. package/runtime/closure/createClosure.js.map +1 -1
  42. package/runtime/closure/parseFunction.js +2 -3
  43. package/runtime/closure/parseFunction.js.map +1 -1
  44. package/runtime/closure/serializeClosure.js +17 -30
  45. package/runtime/closure/serializeClosure.js.map +1 -1
  46. package/runtime/closure/v8.js +166 -190
  47. package/runtime/closure/v8.js.map +1 -1
  48. package/runtime/closure/v8Hooks.js +19 -34
  49. package/runtime/closure/v8Hooks.js.map +1 -1
  50. package/runtime/dependsOn.js +61 -80
  51. package/runtime/dependsOn.js.map +1 -1
  52. package/runtime/invoke.js +155 -170
  53. package/runtime/invoke.js.map +1 -1
  54. package/runtime/mocks.js +77 -96
  55. package/runtime/mocks.js.map +1 -1
  56. package/runtime/resource.js +238 -252
  57. package/runtime/resource.js.map +1 -1
  58. package/runtime/rpc.js +193 -215
  59. package/runtime/rpc.js.map +1 -1
  60. package/runtime/settings.js +70 -87
  61. package/runtime/settings.js.map +1 -1
  62. package/runtime/stack.js +111 -131
  63. package/runtime/stack.js.map +1 -1
  64. package/stackReference.js +39 -58
  65. package/stackReference.js.map +1 -1
  66. package/tsutils.js +1 -2
  67. package/tsutils.js.map +1 -1
  68. package/utils.js +2 -3
  69. package/utils.js.map +1 -1
  70. package/version.js +1 -1
@@ -12,15 +12,6 @@
12
12
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
13
  // See the License for the specific language governing permissions and
14
14
  // limitations under the License.
15
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
16
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
17
- return new (P || (P = Promise))(function (resolve, reject) {
18
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
19
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
20
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
21
- step((generator = generator.apply(thisArg, _arguments || [])).next());
22
- });
23
- };
24
15
  var __importStar = (this && this.__importStar) || function (mod) {
25
16
  if (mod && mod.__esModule) return mod;
26
17
  var result = {};
@@ -127,187 +118,173 @@ class Server {
127
118
  resp.setAcceptoutputs(true);
128
119
  callback(undefined, resp);
129
120
  }
130
- parameterize(call, callback) {
131
- return __awaiter(this, void 0, void 0, function* () {
132
- let res = null;
133
- if (call.request.hasArgs()) {
134
- if (!this.provider.parameterizeArgs) {
135
- callback(new Error("parameterizeArgs not implemented"), undefined);
136
- return;
137
- }
138
- res = yield this.provider.parameterizeArgs(call.request.getArgs().getArgsList());
121
+ async parameterize(call, callback) {
122
+ let res = null;
123
+ if (call.request.hasArgs()) {
124
+ if (!this.provider.parameterizeArgs) {
125
+ callback(new Error("parameterizeArgs not implemented"), undefined);
126
+ return;
139
127
  }
140
- else {
141
- if (!this.provider.parameterizeValue) {
142
- callback(new Error("parameterizeValue not implemented"), undefined);
143
- return;
144
- }
145
- const b64 = call.request.getValue().getValue_asB64();
146
- res = yield this.provider.parameterizeValue(call.request.getValue().getName(), call.request.getValue().getVersion(), Buffer.from(b64, "base64").toString("utf-8"));
128
+ res = await this.provider.parameterizeArgs(call.request.getArgs().getArgsList());
129
+ }
130
+ else {
131
+ if (!this.provider.parameterizeValue) {
132
+ callback(new Error("parameterizeValue not implemented"), undefined);
133
+ return;
147
134
  }
148
- const resp = new provproto.ParameterizeResponse();
149
- resp.setName(res.name);
150
- resp.setVersion(res.version);
151
- callback(undefined, resp);
152
- });
135
+ const b64 = call.request.getValue().getValue_asB64();
136
+ res = await this.provider.parameterizeValue(call.request.getValue().getName(), call.request.getValue().getVersion(), Buffer.from(b64, "base64").toString("utf-8"));
137
+ }
138
+ const resp = new provproto.ParameterizeResponse();
139
+ resp.setName(res.name);
140
+ resp.setVersion(res.version);
141
+ callback(undefined, resp);
153
142
  }
154
143
  // CRUD resource methods
155
- check(call, callback) {
156
- return __awaiter(this, void 0, void 0, function* () {
157
- try {
158
- const req = call.request;
159
- const resp = new provproto.CheckResponse();
160
- const olds = req.getOlds().toJavaScript();
161
- const news = req.getNews().toJavaScript();
162
- let inputs = news;
163
- let failures = [];
164
- if (this.provider.check) {
165
- const result = yield this.provider.check(req.getUrn(), olds, news);
166
- if (result.inputs) {
167
- inputs = result.inputs;
168
- }
169
- if (result.failures) {
170
- failures = result.failures;
171
- }
144
+ async check(call, callback) {
145
+ try {
146
+ const req = call.request;
147
+ const resp = new provproto.CheckResponse();
148
+ const olds = req.getOlds().toJavaScript();
149
+ const news = req.getNews().toJavaScript();
150
+ let inputs = news;
151
+ let failures = [];
152
+ if (this.provider.check) {
153
+ const result = await this.provider.check(req.getUrn(), olds, news);
154
+ if (result.inputs) {
155
+ inputs = result.inputs;
172
156
  }
173
- else {
174
- // If no check method was provided, propagate the new inputs as-is.
175
- inputs = news;
157
+ if (result.failures) {
158
+ failures = result.failures;
176
159
  }
177
- resp.setInputs(structproto.Struct.fromJavaScript(inputs));
178
- if (failures.length !== 0) {
179
- const failureList = [];
180
- for (const f of failures) {
181
- const failure = new provproto.CheckFailure();
182
- failure.setProperty(f.property);
183
- failure.setReason(f.reason);
184
- failureList.push(failure);
185
- }
186
- resp.setFailuresList(failureList);
187
- }
188
- callback(undefined, resp);
189
160
  }
190
- catch (e) {
191
- console.error(`${e}: ${e.stack}`);
192
- callback(e, undefined);
161
+ else {
162
+ // If no check method was provided, propagate the new inputs as-is.
163
+ inputs = news;
193
164
  }
194
- });
195
- }
196
- diff(call, callback) {
197
- return __awaiter(this, void 0, void 0, function* () {
198
- try {
199
- const req = call.request;
200
- const resp = new provproto.DiffResponse();
201
- const olds = req.getOlds().toJavaScript();
202
- const news = req.getNews().toJavaScript();
203
- if (this.provider.diff) {
204
- const result = yield this.provider.diff(req.getId(), req.getUrn(), olds, news);
205
- if (result.changes === true) {
206
- resp.setChanges(provproto.DiffResponse.DiffChanges.DIFF_SOME);
207
- }
208
- else if (result.changes === false) {
209
- resp.setChanges(provproto.DiffResponse.DiffChanges.DIFF_NONE);
210
- }
211
- else {
212
- resp.setChanges(provproto.DiffResponse.DiffChanges.DIFF_UNKNOWN);
213
- }
214
- if (result.replaces && result.replaces.length !== 0) {
215
- resp.setReplacesList(result.replaces);
216
- }
217
- if (result.deleteBeforeReplace) {
218
- resp.setDeletebeforereplace(result.deleteBeforeReplace);
219
- }
165
+ resp.setInputs(structproto.Struct.fromJavaScript(inputs));
166
+ if (failures.length !== 0) {
167
+ const failureList = [];
168
+ for (const f of failures) {
169
+ const failure = new provproto.CheckFailure();
170
+ failure.setProperty(f.property);
171
+ failure.setReason(f.reason);
172
+ failureList.push(failure);
220
173
  }
221
- callback(undefined, resp);
222
- }
223
- catch (e) {
224
- console.error(`${e}: ${e.stack}`);
225
- callback(e, undefined);
174
+ resp.setFailuresList(failureList);
226
175
  }
227
- });
176
+ callback(undefined, resp);
177
+ }
178
+ catch (e) {
179
+ console.error(`${e}: ${e.stack}`);
180
+ callback(e, undefined);
181
+ }
228
182
  }
229
- create(call, callback) {
230
- return __awaiter(this, void 0, void 0, function* () {
231
- try {
232
- const req = call.request;
233
- if (!this.provider.create) {
234
- callback(new Error(`unknown resource type ${req.getUrn()}`), undefined);
235
- return;
183
+ async diff(call, callback) {
184
+ try {
185
+ const req = call.request;
186
+ const resp = new provproto.DiffResponse();
187
+ const olds = req.getOlds().toJavaScript();
188
+ const news = req.getNews().toJavaScript();
189
+ if (this.provider.diff) {
190
+ const result = await this.provider.diff(req.getId(), req.getUrn(), olds, news);
191
+ if (result.changes === true) {
192
+ resp.setChanges(provproto.DiffResponse.DiffChanges.DIFF_SOME);
236
193
  }
237
- const resp = new provproto.CreateResponse();
238
- const props = req.getProperties().toJavaScript();
239
- const result = yield this.provider.create(req.getUrn(), props);
240
- resp.setId(result.id);
241
- resp.setProperties(structproto.Struct.fromJavaScript(result.outs));
242
- callback(undefined, resp);
243
- }
244
- catch (e) {
245
- const response = grpcResponseFromError(e);
246
- return callback(/*err:*/ response, /*value:*/ null, /*metadata:*/ response.metadata);
247
- }
248
- });
249
- }
250
- read(call, callback) {
251
- return __awaiter(this, void 0, void 0, function* () {
252
- try {
253
- const req = call.request;
254
- const resp = new provproto.ReadResponse();
255
- const id = req.getId();
256
- const props = req.getProperties().toJavaScript();
257
- if (this.provider.read) {
258
- const result = yield this.provider.read(id, req.getUrn(), props);
259
- resp.setId(result.id);
260
- resp.setProperties(structproto.Struct.fromJavaScript(result.props));
261
- resp.setInputs(result.inputs === undefined ? undefined : structproto.Struct.fromJavaScript(result.inputs));
194
+ else if (result.changes === false) {
195
+ resp.setChanges(provproto.DiffResponse.DiffChanges.DIFF_NONE);
262
196
  }
263
197
  else {
264
- // In the event of a missing read, simply return back the input state.
265
- resp.setId(id);
266
- resp.setProperties(req.getProperties());
198
+ resp.setChanges(provproto.DiffResponse.DiffChanges.DIFF_UNKNOWN);
199
+ }
200
+ if (result.replaces && result.replaces.length !== 0) {
201
+ resp.setReplacesList(result.replaces);
202
+ }
203
+ if (result.deleteBeforeReplace) {
204
+ resp.setDeletebeforereplace(result.deleteBeforeReplace);
267
205
  }
268
- callback(undefined, resp);
269
206
  }
270
- catch (e) {
271
- console.error(`${e}: ${e.stack}`);
272
- callback(e, undefined);
207
+ callback(undefined, resp);
208
+ }
209
+ catch (e) {
210
+ console.error(`${e}: ${e.stack}`);
211
+ callback(e, undefined);
212
+ }
213
+ }
214
+ async create(call, callback) {
215
+ try {
216
+ const req = call.request;
217
+ if (!this.provider.create) {
218
+ callback(new Error(`unknown resource type ${req.getUrn()}`), undefined);
219
+ return;
273
220
  }
274
- });
221
+ const resp = new provproto.CreateResponse();
222
+ const props = req.getProperties().toJavaScript();
223
+ const result = await this.provider.create(req.getUrn(), props);
224
+ resp.setId(result.id);
225
+ resp.setProperties(structproto.Struct.fromJavaScript(result.outs));
226
+ callback(undefined, resp);
227
+ }
228
+ catch (e) {
229
+ const response = grpcResponseFromError(e);
230
+ return callback(/*err:*/ response, /*value:*/ null, /*metadata:*/ response.metadata);
231
+ }
275
232
  }
276
- update(call, callback) {
277
- return __awaiter(this, void 0, void 0, function* () {
278
- try {
279
- const req = call.request;
280
- const resp = new provproto.UpdateResponse();
281
- const olds = req.getOlds().toJavaScript();
282
- const news = req.getNews().toJavaScript();
283
- let result = {};
284
- if (this.provider.update) {
285
- result = (yield this.provider.update(req.getId(), req.getUrn(), olds, news)) || {};
286
- }
287
- resp.setProperties(structproto.Struct.fromJavaScript(result.outs));
288
- callback(undefined, resp);
233
+ async read(call, callback) {
234
+ try {
235
+ const req = call.request;
236
+ const resp = new provproto.ReadResponse();
237
+ const id = req.getId();
238
+ const props = req.getProperties().toJavaScript();
239
+ if (this.provider.read) {
240
+ const result = await this.provider.read(id, req.getUrn(), props);
241
+ resp.setId(result.id);
242
+ resp.setProperties(structproto.Struct.fromJavaScript(result.props));
243
+ resp.setInputs(result.inputs === undefined ? undefined : structproto.Struct.fromJavaScript(result.inputs));
289
244
  }
290
- catch (e) {
291
- const response = grpcResponseFromError(e);
292
- return callback(/*err:*/ response, /*value:*/ null, /*metadata:*/ response.metadata);
245
+ else {
246
+ // In the event of a missing read, simply return back the input state.
247
+ resp.setId(id);
248
+ resp.setProperties(req.getProperties());
293
249
  }
294
- });
250
+ callback(undefined, resp);
251
+ }
252
+ catch (e) {
253
+ console.error(`${e}: ${e.stack}`);
254
+ callback(e, undefined);
255
+ }
295
256
  }
296
- delete(call, callback) {
297
- return __awaiter(this, void 0, void 0, function* () {
298
- try {
299
- const req = call.request;
300
- const props = req.getProperties().toJavaScript();
301
- if (this.provider.delete) {
302
- yield this.provider.delete(req.getId(), req.getUrn(), props);
303
- }
304
- callback(undefined, new emptyproto.Empty());
257
+ async update(call, callback) {
258
+ try {
259
+ const req = call.request;
260
+ const resp = new provproto.UpdateResponse();
261
+ const olds = req.getOlds().toJavaScript();
262
+ const news = req.getNews().toJavaScript();
263
+ let result = {};
264
+ if (this.provider.update) {
265
+ result = (await this.provider.update(req.getId(), req.getUrn(), olds, news)) || {};
305
266
  }
306
- catch (e) {
307
- console.error(`${e}: ${e.stack}`);
308
- callback(e, undefined);
267
+ resp.setProperties(structproto.Struct.fromJavaScript(result.outs));
268
+ callback(undefined, resp);
269
+ }
270
+ catch (e) {
271
+ const response = grpcResponseFromError(e);
272
+ return callback(/*err:*/ response, /*value:*/ null, /*metadata:*/ response.metadata);
273
+ }
274
+ }
275
+ async delete(call, callback) {
276
+ try {
277
+ const req = call.request;
278
+ const props = req.getProperties().toJavaScript();
279
+ if (this.provider.delete) {
280
+ await this.provider.delete(req.getId(), req.getUrn(), props);
309
281
  }
310
- });
282
+ callback(undefined, new emptyproto.Empty());
283
+ }
284
+ catch (e) {
285
+ console.error(`${e}: ${e.stack}`);
286
+ callback(e, undefined);
287
+ }
311
288
  }
312
289
  buildInvalidPropertiesError(message, errors) {
313
290
  const metadata = new grpc.Metadata();
@@ -336,154 +313,103 @@ class Server {
336
313
  };
337
314
  return error;
338
315
  }
339
- construct(call, callback) {
340
- return __awaiter(this, void 0, void 0, function* () {
341
- // Setup a new async state store for this run
342
- const store = new localState.LocalStore();
343
- return localState.asyncLocalStorage.run(store, () => __awaiter(this, void 0, void 0, function* () {
344
- const callbackId = Symbol("id");
345
- this._callbacks.set(callbackId, callback);
346
- try {
347
- const req = call.request;
348
- const type = req.getType();
349
- const name = req.getName();
350
- if (!this.provider.construct) {
351
- callback(new Error(`unknown resource type ${type}`), undefined);
352
- return;
353
- }
354
- yield configureRuntime(req, this.engineAddr);
355
- const inputs = yield deserializeInputs(req.getInputs(), req.getInputdependenciesMap());
356
- // Rebuild the resource options.
357
- const dependsOn = [];
358
- for (const urn of req.getDependenciesList()) {
359
- dependsOn.push(new resource.DependencyResource(urn));
360
- }
361
- const providers = {};
362
- const rpcProviders = req.getProvidersMap();
363
- if (rpcProviders) {
364
- for (const [pkg, ref] of rpcProviders.entries()) {
365
- providers[pkg] = createProviderResource(ref);
366
- }
367
- }
368
- const opts = {
369
- aliases: req.getAliasesList(),
370
- dependsOn: dependsOn,
371
- protect: req.getProtect(),
372
- providers: providers,
373
- parent: req.getParent() ? new resource.DependencyResource(req.getParent()) : undefined,
374
- };
375
- const result = yield this.provider.construct(name, type, inputs, opts);
376
- const resp = new provproto.ConstructResponse();
377
- resp.setUrn(yield output_1.output(result.urn).promise());
378
- const [state, stateDependencies] = yield rpc.serializeResourceProperties(`construct(${type}, ${name})`, result.state);
379
- const stateDependenciesMap = resp.getStatedependenciesMap();
380
- for (const [key, resources] of stateDependencies) {
381
- const deps = new provproto.ConstructResponse.PropertyDependencies();
382
- deps.setUrnsList(yield Promise.all(Array.from(resources).map((r) => r.urn.promise())));
383
- stateDependenciesMap.set(key, deps);
384
- }
385
- resp.setState(structproto.Struct.fromJavaScript(state));
386
- // Wait for RPC operations to complete.
387
- yield settings.waitForRPCs();
388
- callback(undefined, resp);
389
- }
390
- catch (e) {
391
- if (errors_1.InputPropertiesError.isInstance(e)) {
392
- const error = this.buildInvalidPropertiesError(e.message, e.errors);
393
- callback(error, undefined);
394
- return;
395
- }
396
- else if (errors_1.InputPropertyError.isInstance(e)) {
397
- const error = this.buildInvalidPropertiesError("", [
398
- { propertyPath: e.propertyPath, reason: e.reason },
399
- ]);
400
- callback(error, undefined);
401
- return;
402
- }
403
- callback(e, undefined);
316
+ async construct(call, callback) {
317
+ // Setup a new async state store for this run
318
+ const store = new localState.LocalStore();
319
+ return localState.asyncLocalStorage.run(store, async () => {
320
+ const callbackId = Symbol("id");
321
+ this._callbacks.set(callbackId, callback);
322
+ try {
323
+ const req = call.request;
324
+ const type = req.getType();
325
+ const name = req.getName();
326
+ if (!this.provider.construct) {
327
+ callback(new Error(`unknown resource type ${type}`), undefined);
328
+ return;
404
329
  }
405
- finally {
406
- // remove the gRPC callback context from the map of in-flight callbacks
407
- this._callbacks.delete(callbackId);
330
+ await configureRuntime(req, this.engineAddr);
331
+ const inputs = await deserializeInputs(req.getInputs(), req.getInputdependenciesMap());
332
+ // Rebuild the resource options.
333
+ const dependsOn = [];
334
+ for (const urn of req.getDependenciesList()) {
335
+ dependsOn.push(new resource.DependencyResource(urn));
408
336
  }
409
- }));
410
- });
411
- }
412
- call(call, callback) {
413
- return __awaiter(this, void 0, void 0, function* () {
414
- // Setup a new async state store for this run
415
- const store = new localState.LocalStore();
416
- return localState.asyncLocalStorage.run(store, () => __awaiter(this, void 0, void 0, function* () {
417
- const callbackId = Symbol("id");
418
- this._callbacks.set(callbackId, callback);
419
- try {
420
- const req = call.request;
421
- if (!this.provider.call) {
422
- callback(new Error(`unknown function ${req.getTok()}`), undefined);
423
- return;
424
- }
425
- yield configureRuntime(req, this.engineAddr);
426
- const args = yield deserializeInputs(req.getArgs(), req.getArgdependenciesMap());
427
- const result = yield this.provider.call(req.getTok(), args);
428
- const resp = new provproto.CallResponse();
429
- if (result.outputs) {
430
- const [ret, retDependencies] = yield rpc.serializeResourceProperties(`call(${req.getTok()})`, result.outputs);
431
- const returnDependenciesMap = resp.getReturndependenciesMap();
432
- for (const [key, resources] of retDependencies) {
433
- const deps = new provproto.CallResponse.ReturnDependencies();
434
- deps.setUrnsList(yield Promise.all(Array.from(resources).map((r) => r.urn.promise())));
435
- returnDependenciesMap.set(key, deps);
436
- }
437
- resp.setReturn(structproto.Struct.fromJavaScript(ret));
337
+ const providers = {};
338
+ const rpcProviders = req.getProvidersMap();
339
+ if (rpcProviders) {
340
+ for (const [pkg, ref] of rpcProviders.entries()) {
341
+ providers[pkg] = createProviderResource(ref);
438
342
  }
439
- if ((result.failures || []).length !== 0) {
440
- const failureList = [];
441
- for (const f of result.failures) {
442
- const failure = new provproto.CheckFailure();
443
- failure.setProperty(f.property);
444
- failure.setReason(f.reason);
445
- failureList.push(failure);
446
- }
447
- resp.setFailuresList(failureList);
448
- }
449
- // Wait for RPC operations to complete.
450
- yield settings.waitForRPCs();
451
- callback(undefined, resp);
452
343
  }
453
- catch (e) {
454
- if (errors_1.InputPropertiesError.isInstance(e)) {
455
- const error = this.buildInvalidPropertiesError(e.message, e.errors);
456
- callback(error, undefined);
457
- return;
458
- }
459
- else if (errors_1.InputPropertyError.isInstance(e)) {
460
- const error = this.buildInvalidPropertiesError("", [
461
- { propertyPath: e.propertyPath, reason: e.reason },
462
- ]);
463
- callback(error, undefined);
464
- return;
465
- }
466
- callback(e, undefined);
344
+ const opts = {
345
+ aliases: req.getAliasesList(),
346
+ dependsOn: dependsOn,
347
+ protect: req.getProtect(),
348
+ providers: providers,
349
+ parent: req.getParent() ? new resource.DependencyResource(req.getParent()) : undefined,
350
+ };
351
+ const result = await this.provider.construct(name, type, inputs, opts);
352
+ const resp = new provproto.ConstructResponse();
353
+ resp.setUrn(await output_1.output(result.urn).promise());
354
+ const [state, stateDependencies] = await rpc.serializeResourceProperties(`construct(${type}, ${name})`, result.state);
355
+ const stateDependenciesMap = resp.getStatedependenciesMap();
356
+ for (const [key, resources] of stateDependencies) {
357
+ const deps = new provproto.ConstructResponse.PropertyDependencies();
358
+ deps.setUrnsList(await Promise.all(Array.from(resources).map((r) => r.urn.promise())));
359
+ stateDependenciesMap.set(key, deps);
360
+ }
361
+ resp.setState(structproto.Struct.fromJavaScript(state));
362
+ // Wait for RPC operations to complete.
363
+ await settings.waitForRPCs();
364
+ callback(undefined, resp);
365
+ }
366
+ catch (e) {
367
+ if (errors_1.InputPropertiesError.isInstance(e)) {
368
+ const error = this.buildInvalidPropertiesError(e.message, e.errors);
369
+ callback(error, undefined);
370
+ return;
467
371
  }
468
- finally {
469
- // remove the gRPC callback context from the map of in-flight callbacks
470
- this._callbacks.delete(callbackId);
372
+ else if (errors_1.InputPropertyError.isInstance(e)) {
373
+ const error = this.buildInvalidPropertiesError("", [
374
+ { propertyPath: e.propertyPath, reason: e.reason },
375
+ ]);
376
+ callback(error, undefined);
377
+ return;
471
378
  }
472
- }));
379
+ callback(e, undefined);
380
+ }
381
+ finally {
382
+ // remove the gRPC callback context from the map of in-flight callbacks
383
+ this._callbacks.delete(callbackId);
384
+ }
473
385
  });
474
386
  }
475
- invoke(call, callback) {
476
- return __awaiter(this, void 0, void 0, function* () {
387
+ async call(call, callback) {
388
+ // Setup a new async state store for this run
389
+ const store = new localState.LocalStore();
390
+ return localState.asyncLocalStorage.run(store, async () => {
391
+ const callbackId = Symbol("id");
392
+ this._callbacks.set(callbackId, callback);
477
393
  try {
478
394
  const req = call.request;
479
- if (!this.provider.invoke) {
395
+ if (!this.provider.call) {
480
396
  callback(new Error(`unknown function ${req.getTok()}`), undefined);
481
397
  return;
482
398
  }
483
- const args = req.getArgs().toJavaScript();
484
- const result = yield this.provider.invoke(req.getTok(), args);
485
- const resp = new provproto.InvokeResponse();
486
- resp.setReturn(structproto.Struct.fromJavaScript(result.outputs));
399
+ await configureRuntime(req, this.engineAddr);
400
+ const args = await deserializeInputs(req.getArgs(), req.getArgdependenciesMap());
401
+ const result = await this.provider.call(req.getTok(), args);
402
+ const resp = new provproto.CallResponse();
403
+ if (result.outputs) {
404
+ const [ret, retDependencies] = await rpc.serializeResourceProperties(`call(${req.getTok()})`, result.outputs);
405
+ const returnDependenciesMap = resp.getReturndependenciesMap();
406
+ for (const [key, resources] of retDependencies) {
407
+ const deps = new provproto.CallResponse.ReturnDependencies();
408
+ deps.setUrnsList(await Promise.all(Array.from(resources).map((r) => r.urn.promise())));
409
+ returnDependenciesMap.set(key, deps);
410
+ }
411
+ resp.setReturn(structproto.Struct.fromJavaScript(ret));
412
+ }
487
413
  if ((result.failures || []).length !== 0) {
488
414
  const failureList = [];
489
415
  for (const f of result.failures) {
@@ -494,75 +420,113 @@ class Server {
494
420
  }
495
421
  resp.setFailuresList(failureList);
496
422
  }
423
+ // Wait for RPC operations to complete.
424
+ await settings.waitForRPCs();
497
425
  callback(undefined, resp);
498
426
  }
499
427
  catch (e) {
500
- console.error(`${e}: ${e.stack}`);
428
+ if (errors_1.InputPropertiesError.isInstance(e)) {
429
+ const error = this.buildInvalidPropertiesError(e.message, e.errors);
430
+ callback(error, undefined);
431
+ return;
432
+ }
433
+ else if (errors_1.InputPropertyError.isInstance(e)) {
434
+ const error = this.buildInvalidPropertiesError("", [
435
+ { propertyPath: e.propertyPath, reason: e.reason },
436
+ ]);
437
+ callback(error, undefined);
438
+ return;
439
+ }
501
440
  callback(e, undefined);
502
441
  }
442
+ finally {
443
+ // remove the gRPC callback context from the map of in-flight callbacks
444
+ this._callbacks.delete(callbackId);
445
+ }
503
446
  });
504
447
  }
505
- }
506
- function configureRuntime(req, engineAddr) {
507
- return __awaiter(this, void 0, void 0, function* () {
508
- // NOTE: these are globals! We should ensure that all settings are identical between calls, and eventually
509
- // refactor so we can avoid the global state.
510
- if (engineAddr === undefined) {
511
- throw new Error("fatal: Missing <engine> address");
512
- }
513
- settings.resetOptions(req.getProject(), req.getStack(), req.getParallel(), engineAddr, req.getMonitorendpoint(), req.getDryrun(), req.getOrganization());
514
- // resetOptions doesn't reset the saved features
515
- yield settings.awaitFeatureSupport();
516
- const pulumiConfig = {};
517
- const rpcConfig = req.getConfigMap();
518
- if (rpcConfig) {
519
- for (const [k, v] of rpcConfig.entries()) {
520
- pulumiConfig[k] = v;
448
+ async invoke(call, callback) {
449
+ try {
450
+ const req = call.request;
451
+ if (!this.provider.invoke) {
452
+ callback(new Error(`unknown function ${req.getTok()}`), undefined);
453
+ return;
521
454
  }
455
+ const args = req.getArgs().toJavaScript();
456
+ const result = await this.provider.invoke(req.getTok(), args);
457
+ const resp = new provproto.InvokeResponse();
458
+ resp.setReturn(structproto.Struct.fromJavaScript(result.outputs));
459
+ if ((result.failures || []).length !== 0) {
460
+ const failureList = [];
461
+ for (const f of result.failures) {
462
+ const failure = new provproto.CheckFailure();
463
+ failure.setProperty(f.property);
464
+ failure.setReason(f.reason);
465
+ failureList.push(failure);
466
+ }
467
+ resp.setFailuresList(failureList);
468
+ }
469
+ callback(undefined, resp);
522
470
  }
523
- config.setAllConfig(pulumiConfig, req.getConfigsecretkeysList());
524
- });
471
+ catch (e) {
472
+ console.error(`${e}: ${e.stack}`);
473
+ callback(e, undefined);
474
+ }
475
+ }
476
+ }
477
+ async function configureRuntime(req, engineAddr) {
478
+ // NOTE: these are globals! We should ensure that all settings are identical between calls, and eventually
479
+ // refactor so we can avoid the global state.
480
+ if (engineAddr === undefined) {
481
+ throw new Error("fatal: Missing <engine> address");
482
+ }
483
+ settings.resetOptions(req.getProject(), req.getStack(), req.getParallel(), engineAddr, req.getMonitorendpoint(), req.getDryrun(), req.getOrganization());
484
+ // resetOptions doesn't reset the saved features
485
+ await settings.awaitFeatureSupport();
486
+ const pulumiConfig = {};
487
+ const rpcConfig = req.getConfigMap();
488
+ if (rpcConfig) {
489
+ for (const [k, v] of rpcConfig.entries()) {
490
+ pulumiConfig[k] = v;
491
+ }
492
+ }
493
+ config.setAllConfig(pulumiConfig, req.getConfigsecretkeysList());
525
494
  }
526
495
  /**
527
496
  * Deserializes the inputs struct and applies appropriate dependencies.
528
497
  *
529
498
  * @internal
530
499
  */
531
- function deserializeInputs(inputsStruct, inputDependencies) {
532
- var _a, _b;
533
- return __awaiter(this, void 0, void 0, function* () {
534
- const result = {};
535
- const deserializedInputs = rpc.deserializeProperties(inputsStruct);
536
- for (const k of Object.keys(deserializedInputs)) {
537
- const input = deserializedInputs[k];
538
- const isSecret = rpc.isRpcSecret(input);
539
- const depsUrns = (_b = (_a = inputDependencies.get(k)) === null || _a === void 0 ? void 0 : _a.getUrnsList()) !== null && _b !== void 0 ? _b : [];
540
- if (!isSecret &&
541
- (depsUrns.length === 0 || containsOutputs(input) || (yield isResourceReference(input, depsUrns)))) {
542
- // If the input isn't a secret and either doesn't have any dependencies, already contains Outputs (from
543
- // deserialized output values), or is a resource reference, then we can return it directly without
544
- // wrapping it as an output.
545
- result[k] = input;
546
- }
547
- else {
548
- // Otherwise, wrap it in an output so we can handle secrets and/or track dependencies.
549
- // Note: If the value is or contains an unknown value, the Output will mark its value as
550
- // unknown automatically, so we just pass true for isKnown here.
551
- const deps = depsUrns.map((depUrn) => new resource.DependencyResource(depUrn));
552
- result[k] = new output_1.Output(deps, Promise.resolve(rpc.unwrapRpcSecret(input)), Promise.resolve(true), Promise.resolve(isSecret), Promise.resolve([]));
553
- }
500
+ async function deserializeInputs(inputsStruct, inputDependencies) {
501
+ const result = {};
502
+ const deserializedInputs = rpc.deserializeProperties(inputsStruct);
503
+ for (const k of Object.keys(deserializedInputs)) {
504
+ const input = deserializedInputs[k];
505
+ const isSecret = rpc.isRpcSecret(input);
506
+ const depsUrns = inputDependencies.get(k)?.getUrnsList() ?? [];
507
+ if (!isSecret &&
508
+ (depsUrns.length === 0 || containsOutputs(input) || (await isResourceReference(input, depsUrns)))) {
509
+ // If the input isn't a secret and either doesn't have any dependencies, already contains Outputs (from
510
+ // deserialized output values), or is a resource reference, then we can return it directly without
511
+ // wrapping it as an output.
512
+ result[k] = input;
554
513
  }
555
- return result;
556
- });
514
+ else {
515
+ // Otherwise, wrap it in an output so we can handle secrets and/or track dependencies.
516
+ // Note: If the value is or contains an unknown value, the Output will mark its value as
517
+ // unknown automatically, so we just pass true for isKnown here.
518
+ const deps = depsUrns.map((depUrn) => new resource.DependencyResource(depUrn));
519
+ result[k] = new output_1.Output(deps, Promise.resolve(rpc.unwrapRpcSecret(input)), Promise.resolve(true), Promise.resolve(isSecret), Promise.resolve([]));
520
+ }
521
+ }
522
+ return result;
557
523
  }
558
524
  exports.deserializeInputs = deserializeInputs;
559
525
  /**
560
526
  * Returns true if the input is a resource reference.
561
527
  */
562
- function isResourceReference(input, deps) {
563
- return __awaiter(this, void 0, void 0, function* () {
564
- return resource.Resource.isInstance(input) && deps.length === 1 && deps[0] === (yield input.urn.promise());
565
- });
528
+ async function isResourceReference(input, deps) {
529
+ return resource.Resource.isInstance(input) && deps.length === 1 && deps[0] === (await input.urn.promise());
566
530
  }
567
531
  /**
568
532
  * Returns true if the deserialized input contains outputs (deeply), excluding
@@ -636,58 +600,56 @@ function grpcResponseFromError(e) {
636
600
  }
637
601
  // Add a flag to track if main has already been called
638
602
  let isServing = false;
639
- function main(provider, args) {
640
- return __awaiter(this, void 0, void 0, function* () {
641
- if (isServing) {
642
- // If we're already serving, just return and don't start another server.
643
- return Promise.resolve();
603
+ async function main(provider, args) {
604
+ if (isServing) {
605
+ // If we're already serving, just return and don't start another server.
606
+ return Promise.resolve();
607
+ }
608
+ isServing = true;
609
+ require("source-map-support").install();
610
+ // We track all uncaught errors here. If we have any, we will make sure we always have a non-0 exit
611
+ // code.
612
+ const uncaughtErrors = new Set();
613
+ const uncaughtHandler = (err) => {
614
+ if (!uncaughtErrors.has(err)) {
615
+ uncaughtErrors.add(err);
616
+ // Use `pulumi.log.error` here to tell the engine there was a fatal error, which should
617
+ // stop processing subsequent resource operations.
618
+ log.error(err.stack || err.message || "" + err);
644
619
  }
645
- isServing = true;
646
- require("source-map-support").install();
647
- // We track all uncaught errors here. If we have any, we will make sure we always have a non-0 exit
648
- // code.
649
- const uncaughtErrors = new Set();
650
- const uncaughtHandler = (err) => {
651
- if (!uncaughtErrors.has(err)) {
652
- uncaughtErrors.add(err);
653
- // Use `pulumi.log.error` here to tell the engine there was a fatal error, which should
654
- // stop processing subsequent resource operations.
655
- log.error(err.stack || err.message || "" + err);
620
+ };
621
+ process.on("uncaughtException", uncaughtHandler);
622
+ // @ts-ignore 'unhandledRejection' will almost always invoke uncaughtHandler with an Error. so just
623
+ // suppress the TS strictness here.
624
+ process.on("unhandledRejection", uncaughtHandler);
625
+ process.on("exit", (code) => {
626
+ // If there were any uncaught errors at all, we always want to exit with an error code.
627
+ if (code === 0 && uncaughtErrors.size > 0) {
628
+ process.exitCode = 1;
629
+ }
630
+ });
631
+ const parsedArgs = internals_1.parseArgs(args);
632
+ // Finally connect up the gRPC client/server and listen for incoming requests.
633
+ const server = new grpc.Server({
634
+ "grpc.max_receive_message_length": settings.maxRPCMessageSize,
635
+ });
636
+ // The program receives a single optional argument: the address of the RPC endpoint for the engine. It
637
+ // optionally also takes a second argument, a reference back to the engine, but this may be missing.
638
+ const engineAddr = parsedArgs?.engineAddress;
639
+ server.addService(provrpc.ResourceProviderService, new Server(engineAddr, provider, uncaughtErrors));
640
+ const port = await new Promise((resolve, reject) => {
641
+ server.bindAsync(`127.0.0.1:0`, grpc.ServerCredentials.createInsecure(), (err, p) => {
642
+ if (err) {
643
+ reject(err);
656
644
  }
657
- };
658
- process.on("uncaughtException", uncaughtHandler);
659
- // @ts-ignore 'unhandledRejection' will almost always invoke uncaughtHandler with an Error. so just
660
- // suppress the TS strictness here.
661
- process.on("unhandledRejection", uncaughtHandler);
662
- process.on("exit", (code) => {
663
- // If there were any uncaught errors at all, we always want to exit with an error code.
664
- if (code === 0 && uncaughtErrors.size > 0) {
665
- process.exitCode = 1;
645
+ else {
646
+ resolve(p);
666
647
  }
667
648
  });
668
- const parsedArgs = internals_1.parseArgs(args);
669
- // Finally connect up the gRPC client/server and listen for incoming requests.
670
- const server = new grpc.Server({
671
- "grpc.max_receive_message_length": settings.maxRPCMessageSize,
672
- });
673
- // The program receives a single optional argument: the address of the RPC endpoint for the engine. It
674
- // optionally also takes a second argument, a reference back to the engine, but this may be missing.
675
- const engineAddr = parsedArgs === null || parsedArgs === void 0 ? void 0 : parsedArgs.engineAddress;
676
- server.addService(provrpc.ResourceProviderService, new Server(engineAddr, provider, uncaughtErrors));
677
- const port = yield new Promise((resolve, reject) => {
678
- server.bindAsync(`127.0.0.1:0`, grpc.ServerCredentials.createInsecure(), (err, p) => {
679
- if (err) {
680
- reject(err);
681
- }
682
- else {
683
- resolve(p);
684
- }
685
- });
686
- });
687
- // Emit the address so the monitor can read it to connect. The gRPC server will keep the message loop alive.
688
- // We explicitly convert the number to a string so that Node doesn't colorize the output.
689
- console.log(port.toString());
690
649
  });
650
+ // Emit the address so the monitor can read it to connect. The gRPC server will keep the message loop alive.
651
+ // We explicitly convert the number to a string so that Node doesn't colorize the output.
652
+ console.log(port.toString());
691
653
  }
692
654
  exports.main = main;
693
655
  /**